Step-by-step release process for sc-sha, sc-composer, sc-compose,
bindings/sc-sha-python, and bindings/python from this repo.
This repo publishes to six channels:
| Channel | Package | Method |
|---|---|---|
| crates.io | sc-sha |
cargo publish |
| crates.io | sc-composer |
cargo publish |
| crates.io | sc-compose |
cargo publish |
| PyPI | sc-sha, sc-compose |
maturin publish |
| Homebrew | sc-compose |
GitHub Actions → randlee/homebrew-tap |
| Winget | sc-compose |
GitHub Actions → microsoft/winget-pkgs |
| Scoop | sc-compose |
GitHub Actions → randlee/scoop-bucket |
| GitHub Releases | sc-compose |
CI workflow attachment |
- Single workspace version for all crates in this repo.
bindings/sc-sha-python/pyproject.tomlandbindings/python/pyproject.tomlmust sync from the workspace version before wheel builds. The release workflow enforces this viaverify-python-version.- Target version must be strictly higher than the last published version on crates.io for these crate names.
- Workspace
Cargo.toml[workspace.package] versionreflects the target version -
crates/sc-sha/Cargo.tomlmatches or inherits workspace version -
crates/sc-composer/Cargo.tomlmatches or inherits workspace version -
crates/sc-compose/Cargo.tomlmatches or inherits workspace version -
release/publish-artifacts.tomllists all publishable crates with correct paths -
bindings/sc-sha-python/pyproject.tomlversion matches workspace version -
bindings/python/pyproject.tomlversion matches workspace version
-
cargo test --workspace— zero failures -
cargo clippy --all-targets --all-features -- -D warnings— clean -
cargo fmt --all --check— clean -
just lint && just test && just smoke— all pass -
just reports && just reports-verify— report pipeline intact -
observability-healthandsc-observabilityshutdown behavior covered by tests -
ERR_*failure-mode matrix exercised by tests -
--jsoncommands verified to keep stdout machine-readable - Standalone boundary verification: no forbidden ATM references in source
-
quality-mgrfull QA pass -
team-leadfinal design review
-
cargo owner --list sc-sha— confirm expected owners -
cargo owner --list sc-composer— confirm expected owners -
cargo owner --list sc-compose— confirm expected owners -
CARGO_REGISTRY_TOKENconfigured in GitHub Actionscrates-ioenvironment - Token has publish permission for
sc-sha,sc-composer, andsc-compose
-
HOMEBREW_TAP_TOKENconfigured in repo secrets -
WINGET_GITHUB_TOKENconfigured in repo secrets with permission to open Winget submissions inmicrosoft/winget-pkgs; every release dispatches the automatedwinget-publish.ymlworkflow -
SCOOP_BUCKET_TOKENconfigured in repo secrets with write access torandlee/scoop-bucket
-
PYPI_API_TOKENandTEST_PYPI_API_TOKENconfigured in GitHub Actions environments - Run one staged TestPyPI or
workflow_dispatchrehearsal before treating the Python release channel as production-closed:- Both packages build wheels on all three platforms
- Exactly one sdist is produced for each package
- PyPI upload paths succeed for both packages
- GitHub Release attachment set includes both packages' wheels + sdists
- Trigger
.github/workflows/release-preflight.yml(manual viagh workflow run release-preflight.yml) - Preflight must PASS: version alignment, manifest completeness, workspace consistency
Publish in this exact order. Deviating will break the dependency graph.
sc-sha— publish firstcargo publish -p sc-sha- Wait ≥30 seconds for crates.io index propagation
sc-composer— publish aftersc-shacargo publish -p sc-composer- Wait ≥30 seconds for crates.io index propagation
sc-compose— publish after its library dependenciescargo publish -p sc-compose
The manually dispatched .github/workflows/release.yml workflow creates the
production tag in its gate-and-tag job, then enforces this order
automatically.
After the root Release workflow has created the immutable GitHub Release,
dispatch the independent, retry-safe channel workflows with the same v<version>
tag:
.github/workflows/pypi-publish.ymluploads the published Python artifacts..github/workflows/homebrew-publish.ymlupdatesrandlee/homebrew-tap..github/workflows/winget-publish.ymlsubmits the Windows installer..github/workflows/scoop-publish.ymlupdates the Scoop bucket manifest inrandlee/scoop-bucket.
If one channel fails, re-dispatch only that channel workflow. Do not recreate the tag or rerun the root release workflow.
- Verify
sc-shavisible on crates.io at expected version - Verify
sc-composervisible on crates.io at expected version - Verify
sc-composevisible on crates.io at expected version -
cargo add sc-sha@<version>in a scratch workspace — resolves cleanly -
cargo add sc-composer@<version>in a scratch workspace — resolves cleanly -
cargo install sc-compose@<version>— binary installs cleanly - Verify GitHub Release archives include
share/sc-compose/examples/ - Verify Homebrew formula update completed in
randlee/homebrew-tap - Verify
wingetsubmission/update dispatched successfully - Verify Scoop manifest update completed in
randlee/scoop-bucketandscoop install sc-composesucceeds - Verify PyPI:
pip install sc-sha==<version> sc-compose==<version>on all three platforms - Confirm the production
gate-and-tagjob createdv<version>atorigin/main - Confirm the release workflow created the GitHub Release for that tag with its generated release notes
- Manifest:
release/publish-artifacts.toml - Preflight:
.github/workflows/release-preflight.yml - Release:
.github/workflows/release.yml - Gate helper:
.github/scripts/release_artifacts.py(invoked by the vendoredplugins/sc-publishrelease workflows)
- Pre-release rehearsals go to TestPyPI:
pip install -i https://test.pypi.org/simple/ sc-sha sc-compose
- Production releases for
sc-shaandsc-composego to PyPI via thepypiprotected environment verify-python-versiongate enforces version sync for both Python packages before wheel builds
- Formula auto-updated in
randlee/homebrew-tapvia release workflow - Bundled examples installed to
$(brew --prefix)/share/sc-compose/examples/
- Add the bucket, then install the package:
scoop bucket add randlee https://github.com/randlee/scoop-bucket scoop install sc-compose
- The retry-safe
.github/workflows/scoop-publish.ymlworkflow updates the manifest from the immutable GitHub Release asset.
- Archives include
bin/sc-composeandshare/sc-compose/examples/... - Platform-specific archives: Linux, macOS, Windows
cargo install ships the binary only — it does NOT install bundled examples.
Users who install with Cargo must set SC_COMPOSE_DATA_DIR to access examples.
Fill out release/RELEASE-NOTES-TEMPLATE.md with the actual release summary
before creating the GitHub release. The template covers:
- Summary of changes
- Included crates and versions
- Compatibility notes and migration guidance
When the ATM workspace needs to switch from in-workspace path dependencies to crates.io dependencies from this repo:
- This repo must publish the target version of
sc-sha - This repo must publish the target version of
sc-composer - This repo must publish the target version of
sc-compose - ATM must replace its in-workspace path dependencies with version pins
- docs/publishing.md — publishing and version ownership
- docs/release-checklist.md — previous checklist format
- docs/release-tag-protection.md — tag protection rules
- README.sc-publish.md — canonical operator guide