Use this process for every Operad release. Replace X.Y.Z with the version
being released and vX.Y.Z with the matching git tag.
- Release from
mainunless a dedicated release branch is intentionally used. - Tag only the exact commit that passed the local release gate.
- Publish only after GitHub Actions has passed for that pushed commit.
- Do not move a tag after the crate has been published. If a published release has a defect, ship a patch release instead.
- Keep showcase regressions in external tests, not in
examples/showcase.rs. - Keep release commits focused on version metadata, changelog/release notes, docs, and intentional release fixes.
Use semantic versioning:
- Major release: breaking public API changes or major behavior changes.
- Minor release: compatible new APIs, features, examples, diagnostics, or non-breaking behavior improvements.
- Patch release: compatible bug fixes, docs, tests, packaging, or CI fixes.
Before starting, make sure the intended version is not already published:
cargo search operad
git tag --list 'v*' --sort=-version:refname | headConfirm the current branch and working tree:
git branch --show-current
git status --shortUpdate release metadata:
Cargo.toml: setversion = "X.Y.Z".Cargo.lock: update it by running Cargo after the version change.CHANGELOG.md: add anX.Y.Zentry.- Major releases: add or update major-version roadmap, migration, stability, or completion docs when relevant.
- README: update any user-facing version or release guidance if it has changed.
The working tree should contain only intentional release changes before the final gate starts. If unrelated files are present, leave them out of the release commit or move them into a separate commit first.
Run the standard full gate:
scripts/test-full.shRun final release checks that may not all be covered by the normal loop:
cargo doc --locked --all-features --no-deps
cargo package --locked
cargo publish --dry-run --lockedIf the release candidate changes a specific public surface late in the process, rerun the focused suite that covers that surface. For showcase, layout, widgets, or performance changes, prefer:
cargo test --locked --all-features --test showcase_layout -- showcase_ --test-threads=1
cargo test --locked --no-default-features --features widgets --test perf_smoke -- --test-threads=1
cargo check --locked --all-features --examplesCreate one release commit after the local gate is green:
git add Cargo.toml Cargo.lock CHANGELOG.md README.md docs src examples tests web .github scripts
git commit -m "Release vX.Y.Z"If not every listed path changed, git add will simply skip unchanged files.
Review the final commit before tagging:
git show --stat --oneline HEADTag the exact verified commit:
git tag -a vX.Y.Z -m "Operad vX.Y.Z"Verify the tag points where expected:
git show --stat vX.Y.ZPush the release commit and tag:
git push origin main
git push origin vX.Y.ZWait for GitHub Actions to pass:
- Rust CI
- Showcase Pages build
- Browser smoke test for
/ - Browser smoke test for
/showcase/ - GitHub Pages deployment
If CI fails before publishing and the tag has not been announced, fix the issue, rerun the local gate, and recreate the tag on the new release commit:
git tag -d vX.Y.Z
git push origin :refs/tags/vX.Y.Z
git tag -a vX.Y.Z -m "Operad vX.Y.Z"
git push origin main
git push origin vX.Y.ZDo not use that recovery flow after cargo publish succeeds. After publish,
leave the tag immutable and release the next patch version for fixes.
Publish only from the same commit that CI validated:
git status --short
git rev-parse HEAD
git rev-list -n 1 vX.Y.Z
cargo publish --lockedThe two commit hashes should match. If they do not, stop and resolve the branch or tag mismatch before publishing.
Confirm crates.io sees the new version:
cargo search operadThen verify:
- docs.rs starts building or has published
X.Y.Z. - The GitHub Pages showcase opens at
/. - The GitHub Pages showcase opens at
/showcase/. - GitHub release notes exist for
vX.Y.Z, usingCHANGELOG.mdas the source of truth.
Patch releases follow the same process. Keep them limited to compatible bug fixes, documentation, tests, packaging, and release infrastructure. Breaking API changes belong in the next major release plan.