Prepare a release whose tag contains its changelog, then publish through exactly one evidence-backed path when publication is authorized.
Authorization
- Prepare: determine the version, update changelog/version declarations, validate, and open the release PR. Requests to prepare, bump, or generate notes authorize only this stage.
- Publish: after the PR merges, create or trigger the tag/release through the
repository's established publisher. Requests to cut, tag, publish, or run
/create-releaseauthorize this stage too. - A
/milestone-rushcaller supplies publication authority at its verified milestone boundary. Reuse its settled release plan and version; no separate user command is required./deliverintegration delivery is not this trigger. - When standalone authorization is ambiguous, perform Prepare only.
Invariants
- The changelog and version bump land before the tag, through a squash-merged PR.
- Use the repository's configured tools and current documentation. Regenerate generated changelogs rather than hand-editing them.
- Run the declared release-relevant gate and report only observed results.
- Never amend, force-push, force-update a tag, skip hooks, or publish through more than one path.
Prepare
- Require a clean working tree, then resolve the authorized stage, remote default branch, changelog/version tooling, last release, remote tags, workflows, and release documentation.
- Stop if there are no releasable commits.
- Use a settled explicit version, or compute it under the project's deterministic version policy. When neither settles it, recommend a version from the unreleased conventional commits and ask for that choice.
- Create a release branch from the fresh remote base.
- Generate the changelog section and update every authoritative version declaration using project tooling. Do not invent a manifest bump when the project derives its version from tags.
- Run the release-relevant gate, commit
chore(release): <version>, and open a draft release PR through/create-prwith the changelog section and observed validation. Prepare-only requests end here.
Publish
- Under publication authority, converge the release PR through
/address-feedback automatic-merge, then usedelivery-waitto verify its squash merge and integrated revision. Reuse an already verified merge; never tag the open PR branch. - Refresh the merged base, then re-read the actual workflow YAML and release documentation. Identify separate owners for tag creation, GitHub release creation, artifact signing, and registry publishing.
- Select exactly one route, so no tag or release is created twice:
- workflow owns tag and release: trigger or monitor it only;
- agent owns tag, workflow owns release: push the verified tag once, then monitor;
- workflow owns tag, agent owns release: verify its tag, then create one GitHub release;
- agent owns both: only when no workflow owns either action, push the verified tag once and create one release.
- Stop when ownership is ambiguous or documentation and workflow disagree.
- Execute only the selected route and verify the final tag target, release,
workflow result, artifacts, and registry state that the route owns. Use the
helper's
wait workflow-terminal,wait tag-target, andwait release-assetsoperations for those GitHub transitions; do not monitor unchanged state through model turns.
Lead with the release outcome, PR/release URL, selected publisher, and current evidence. Never describe an unobserved state as complete.