Release RC finalizer¶
dpone ops release-rc-finalize is the release-level integration gate before a
minor or major tag. It validates the stacked PR train, version context, and
release evidence that came from route, CDC, docs, package, and quality gates.
This command is credential-free. It does not call the GitHub API, merge pull
requests, create tags, start Docker, or run tests. CI or an operator exports a
merge_train.json file, passes already-produced evidence artifacts, and the
finalizer writes one stable go/no-go receipt.
When to use it¶
Use Release RC finalizer after route-level release evidence exists and before
creating v0.10.0 or another release tag.
For the current route-heavy release, the expected order is:
- Run route evidence gates such as
route-rc-orchestrator,route-release-finalize, andrelease-evidence-pack. - Run Release RC collector to export the stacked
PR train into
merge_train.json. - Run
dpone ops release-rc-finalizeinpre_mergemode. - Merge the train in the recorded order.
- Run
dpone ops release-rc-finalize --mode post_merge. - Tag only while
release_rc_finalizer.jsonisrc_ready.
Merge train JSON¶
merge_train.json is ordered from base to head:
{
"schema_version": "dpone.release_rc_merge_train.v1",
"base_branch": "codex/route-certify-release-automation",
"head_branch": "codex/route-conformance-lab",
"pull_requests": [
{
"number": 75,
"title": "Add generic route bootstrap doctor",
"base_ref": "codex/route-certify-release-automation",
"head_ref": "codex/route-bootstrap-doctor",
"state": "OPEN",
"merge_state": "CLEAN",
"is_draft": false,
"checks": [
{
"name": "Build GitHub Pages documentation",
"status": "COMPLETED",
"conclusion": "SUCCESS",
"details_url": "https://github.com/PaulKov/dpone/actions/runs/..."
}
],
"url": "https://github.com/PaulKov/dpone/pull/75"
}
]
}
The finalizer also accepts GitHub CLI JSON field variants such as
baseRefName, headRefName, mergeStateStatus, isDraft, detailsUrl, and
statusCheckRollup. Prefer dpone ops release-rc-collect when generating this
file from GitHub CLI exports.
CLI¶
uv run dpone ops release-rc-finalize \
--release v0.10.0 \
--previous-release v0.9.0 \
--package-version 0.10.0 \
--merge-train-json test_artifacts/release/v0.10.0/merge_train.json \
--artifact route_release_finalizer=test_artifacts/route_release_finalize/route_release_finalizer.json \
--artifact release_evidence_pack=test_artifacts/release/v0.10.0/release_evidence_pack.json \
--artifact pre_release_checklist=test_artifacts/release/v0.10.0/pre_release_checklist.json \
--require-artifact route_release_finalizer \
--require-artifact release_evidence_pack \
--require-artifact pre_release_checklist \
--output-dir test_artifacts/release/v0.10.0/release-rc-finalizer \
--format json
Use --mode post_merge after merging the train. In post-merge mode every PR in
merge_train.json must have state MERGED.
Output¶
test_artifacts/release/v0.10.0/release-rc-finalizer/
release_rc_finalizer.json
release_rc_finalizer.md
release_rc_finalizer.json has schema dpone.release_rc_finalizer.v1.
It contains:
release,previous_release,package_version, andmode;- the normalized merge train;
- evidence artifact status, checksums, and blockers;
- policy checks for version increment, package version, PR chain, PR state, check rollup, and release artifacts;
- operator next actions.
Runbook¶
Failure: release.version_not_incremented.
- Compare with the latest published release.
- Pick a higher semantic version.
- Rerun the finalizer.
Failure: release.package_version_mismatch.
- Update
pyproject.tomlto the release version, for example0.10.0. - Regenerate package and docs evidence.
- Rerun the finalizer.
Failure: merge_train.chain_broken.
- Regenerate
merge_train.jsonin base-to-head order. - Confirm each PR head is the next PR base.
- Rerun the finalizer.
Failure: pull_request.<number>.not_clean or
pull_request.<number>.check_failed:<name>.
- Open the PR and the named check.
- Fix or rerun the failing check.
- Export a fresh
merge_train.json.
Failure: route_release_finalizer.missing or release_evidence_pack.missing.
- Generate the required upstream evidence.
- Pass it with
--artifact name=/path/to/file. - Keep generated evidence immutable for the release candidate.