Use this checklist before every crates.io release of sc-sha, sc-composer, and sc-compose.
- Workspace
Cargo.toml[workspace.package] versionreflects the target release version -
crates/sc-sha/Cargo.tomlinherits or matches workspace version -
crates/sc-composer/Cargo.tomlinherits or matches workspace version -
crates/sc-compose/Cargo.tomlinherits or matches workspace version -
release/publish-artifacts.tomllistssc-sha,sc-composer, andsc-composewith correctcargo_tomlpaths and dependency-aware publish order -
bindings/python/pyproject.tomlandbindings/sc-sha-python/pyproject.tomlmatch the workspace version, and their explicit Cargo path-dependency pins do too - Target release version is strictly higher than the last version published from the
agent-team-mailworkspace for these crate names
-
cargo test --workspacepasses with zero failures on the release tag commit -
cargo clippy --all-targets --all-features -- -D warningspasses -
cargo fmt --all --checkpasses - The full promoted surface for the target release is cleared on the release branch:
- HTML-report functionality and examples remain covered by tests
- Phase A and Phase B reporting commands remain covered by tests:
reports init,reports smoke,reports finalize,reports render-spec,reports index,reports verify, andreports publish-manifest - the checked-in
Justfileproof path remains release-ready:just lint,just test,just smoke,just state-diagrams,just sql-diagrams,just reports, andjust reports-verify - publish-manifest handoff remains verified through
reports/latest/publish-manifest.json observability-healthand the shippedsc-observability 1.2.0queue-admission / shutdown behavior remain covered by tests- failure-mode matrix
ERR_*codes exercised by tests --jsoncommands are verified to keep stdout machine-readablequality-mgrfull QA pass on the release branchteam-leadfinal design review complete
- Verify crate owners for
sc-shaon crates.io:- run
cargo owner --list sc-shaand confirm expected owners
- run
- Verify crate owners for
sc-composeron crates.io:- run
cargo owner --list sc-composerand confirm expected owners
- run
- Verify crate owners for
sc-composeon crates.io:- run
cargo owner --list sc-composeand confirm expected owners
- run
- Confirm that the publish token (CARGO_REGISTRY_TOKEN) is configured in GitHub
Actions secrets for the
releaseenvironment - Confirm the token has permission to publish
sc-sha,sc-composer, andsc-compose - Verify PyPI ownership for
sc-shaandsc-composebefore publishing their wheels - Confirm
HOMEBREW_TAP_TOKENis configured in repo secrets before running the release workflow
- Run
.github/workflows/release-preflight.yml(or trigger it manually viagh workflow run) - Preflight must PASS: version alignment, manifest completeness, workspace consistency
Publish crates in this exact order. Do NOT publish a dependent before its dependency resolves on crates.io, or the dependency graph will be broken.
sc-sha— publish first (publish_order = 1)cargo publish -p sc-sha- Wait at least 30 seconds for crates.io index propagation (
wait_after_publish_seconds = 30)
sc-composer— publish second (publish_order = 2)cargo publish -p sc-composer- Wait at least 30 seconds for crates.io index propagation (
wait_after_publish_seconds = 30)
sc-compose— publish third (publish_order = 3)cargo publish -p sc-compose
The .github/workflows/release.yml workflow enforces this order automatically
for a production workflow_dispatch release.
The root Release workflow creates the protected tag, publishes crates.io
packages, builds the authoritative artifacts, and creates the GitHub Release.
It deliberately does not publish production PyPI packages, update
Homebrew, or submit winget. After verifying the GitHub Release, dispatch all
three recovery-safe channel workflows with the same v<version> tag:
- Run
.github/workflows/pypi-publish.ymlwithtag=v<version>andtarget=production.- It uploads only the six wheels and two source distributions attached to the published GitHub Release; it does not rebuild artifacts or create a tag.
- Run
.github/workflows/homebrew-publish.ymlwithtag=v<version>.- It verifies all three Unix archives, renders the formula from the tagged
source, validates Ruby syntax, and updates
randlee/homebrew-tap.
- It verifies all three Unix archives, renders the formula from the tagged
source, validates Ruby syntax, and updates
- Run
.github/workflows/winget-publish.ymlwithtag=v<version>.- It verifies the published Windows ZIP before submitting the package update
with
WINGET_GITHUB_TOKEN.
- It verifies the published Windows ZIP before submitting the package update
with
Each workflow may be safely re-dispatched for that release if its channel
fails. Do not rerun the root Release workflow to recover an external-channel
failure.
- Verify
sc-shais visible on crates.io at the expected version - Verify
sc-composeris visible on crates.io at the expected version - Verify
sc-composeis visible on crates.io at the expected version - Run
cargo add sc-composer@<version>in a scratch workspace to confirm the crate resolves - Run
cargo install sc-compose@<version>to confirm the binary installs cleanly - Verify the GitHub Release archives include
share/sc-compose/examples/ - Verify the production
Publish PyPIworkflow uploadedsc-composeandsc-shafrom the GitHub Release assets - Verify the Homebrew formula update completed in
randlee/homebrew-tap - Verify the
wingetsubmission/update was dispatched successfully - Update
release/RELEASE-NOTES-TEMPLATE.mdwith the actual release summary - Confirm the release workflow's
gate-and-tagjob createdv<version>— do not tag manually; the tag branch is protected. - Verify the root release workflow created a GitHub Release pointing at the protected tag with the release notes
- The promoted surface for the target release is cleared on the release branch:
- HTML-report line remains release-ready
- Phase A and Phase B reporting runtime remains release-ready
- publish-manifest handoff remains release-ready
sc-observability 1.2.0observability behavior remains release-ready
- standalone boundary verification passes with no forbidden ATM references in source
- downstream cutover notes are published alongside the release notes