The release is standardized by `deploy/release-manifest.json` and `deploy/release_tool.py`. Do not rely on memory or a manual checklist for deterministic version updates.
| `version` | Release version without `v`, for example `0.5.1`. |
| `title` | Human release title, for example `Winter is Coming`. |
| `previousVersion` | Previous release version without `v`; default this from the latest remote `v*` tag unless the user gives a different base. |
| `baseTag` | Optional override for the commit range base; default is `v<previousVersion>`. |
| `releaseDocSlug` | Stable release notes slug under `asp-doc/docs/<lang>/release/`. Auto-fill from version/title unless the user requests another slug. |
| `releaseDocsBaseUrl` | Public release docs base URL, currently `https://asp.viperrtp.com/release`. |
| `surfaces` | Named release surfaces managed by `deploy/release_tool.py`. |
- This updates CLI version, compose image tags, deployment/upgrade docs generated blocks, release page skeletons, and VitePress changelog nav.
- Do not manually edit generated release blocks except by changing the manifest or tool.
4. **Write release notes**
- Generate candidate highlights from commits between `baseTag`/`v<previousVersion>` and the planned release commit.
- Ask the user once for optional Developer Notes raw material or curated highlights. It is acceptable for the user to provide nothing.
- Write the Chinese release page first:
```text
asp-doc/docs/zh/release/<releaseDocSlug>/index.md
```
- Then write the matching English page:
```text
asp-doc/docs/en/release/<releaseDocSlug>/index.md
```
- Keep Chinese and English pages structurally aligned.
- Do not put the full release narrative in the GitHub Release body; the workflow creates a minimal body that links to the docs page and lists downloads/images.
5. **Validate before commits**
- Run:
```bash
python deploy/release_tool.py check
python deploy/release_tool.py show
```
- Build/check CLI package metadata when practical:
```bash
cd cli
uv build
uvx twine check dist/*
uv run asp --version
cd ..
```
- Run the compose package validation path when practical:
- Before pushing commits or tags, ask for explicit permission.
- Confirm the tag name `v<version>`.
- For the first CLI release in a new environment, confirm PyPI Trusted Publishing is configured for project `asp-cli`, workflow `release.yml`, environment `pypi`.
- `latest` is also pushed for non-`dev` versions by the Docker workflow.
## Generated blocks
The quick-start deployment and upgrade pages contain generated blocks:
```markdown
<!-- release:<name>:start -->
...
<!-- release:<name>:end -->
```
Only `deploy/release_tool.py prepare` should update these blocks. If `check` reports a stale generated block, update the manifest if needed and rerun `prepare`.
## Release notes writing rules
Release notes are generated by the agent, not by `release_tool.py`. The tool only creates missing page skeletons and checks titles/nav/paths.
Developer Notes may include background, motivation, opinions, lessons learned, tradeoffs, and complaints when the user provides them. Preserve the user's intent and tone, but organize fragmented material into readable paragraphs. Do not invent personal feelings or motivations.
- If a pushed tag points to the wrong commit or release inputs are wrong, stop and ask before deleting or recreating the remote tag.
- If GitHub Release creation succeeds but docs are wrong, update docs and let the public docs deploy; update the GitHub Release body only if the minimal link/download/image body is wrong.
- If `publish-cli` fails because PyPI Trusted Publishing is not configured, configure the trusted or pending publisher for project `asp-cli`, workflow `release.yml`, environment `pypi`, then rerun the failed job.
The agent should infer the base from the latest release tag, prepare deterministic files from the manifest, ask once for optional release-note context, and ask again only for publish permission.