This guide defines the release workflow for Soroban CrashLab. Follow it when you need to cut a tagged release, publish release notes, and confirm whether the change set is backward compatible.
- Release from
mainonly. - Tag releases with semantic-version tags in the form
vMAJOR.MINOR.PATCH. - Keep
CHANGELOG.mdcurrent on every release. - Treat
contracts/crashlab-corepublic APIs, persisted JSON schemas, CLI behavior, and documented maintainer workflows as compatibility-sensitive surfaces. - If a change is breaking, document the impact and migration steps in both the changelog and the GitHub release notes before tagging.
A release maintainer should have:
- push permission for the repository
- a clean local checkout of
main - Git configured locally
- Node.js, npm, Rust, and Cargo installed so the standard checks can run
Optional but recommended:
- GitHub CLI (
gh) authenticated for creating the GitHub release in one command
-
Sync your local checkout:
git checkout main git pull upstream main
-
Confirm the working tree is clean:
git status --short
-
Review merged PRs and commits since the last tag so you know what belongs in the release:
git tag --sort=-creatordate | head git log --oneline <last-tag>..main
-
Decide the next version number:
PATCH: fixes, docs-only updates, or internal changes with no intended external behavior changeMINOR: additive user-visible features, new CLI flags, new documented workflows, or new persisted fields that remain backward compatibleMAJOR: breaking changes to public APIs, persisted formats, CLI expectations, or maintainer workflows that require consumers to change behavior
If the repository is still pre-1.0.0, keep the same rule: use a major bump whenever downstream users or maintainers must change how they interact with the project.
Before tagging, inspect the release candidate against these questions:
- Did
contracts/crashlab-coreadd, remove, or rename public types, functions, or exported modules? - Did any JSON or bundle format change schema, required fields, or serialization behavior?
- Did any CLI command change exit codes, arguments, default paths, or output formats that scripts may depend on?
- Did the web dashboard or maintainer workflow change in a way that affects documented operating steps?
Use this decision rule:
- Backward compatible: existing documented workflows, persisted artifacts, and common automation continue to work without modification
- Breaking: an existing consumer, replay bundle, script, or maintainer workflow needs a code or process change to keep working
When a breaking change is required:
- Add a
Breaking changesentry toCHANGELOG.md. - Describe the impact, the affected surface, and the migration path.
- Mention the same migration note in the GitHub release description.
- Bump the release version accordingly.
If you cannot explain the migration in a few concrete steps, the release is not ready to tag.
Edit CHANGELOG.md on main immediately before tagging.
-
Replace the placeholder
Noneentries inUnreleasedwith the actual changes being shipped. -
Group changes under
Added,Changed,Fixed, andBreaking changes. -
Move those entries into a new version heading using the release date:
## v0.4.0 - 2026-03-28 -
Re-create an empty
Unreleasedsection at the top so ongoing work has a place to accumulate notes.
Changelog entries should answer:
- what changed
- who is affected
- whether action is required after upgrading
Run the standard repo checks from the release commit:
cd apps/web
npm ci
npm run lint
npm run build
cd ../../contracts/crashlab-core
cargo test --all-targetsAlso verify the release docs are free of unresolved placeholders:
grep -n "TODO\\|TBD" README.md CONTRIBUTING.md MAINTAINER_WAVE_PLAYBOOK.md docs/RELEASE_PROCESS.md CHANGELOG.md || trueDo not tag a release with failing checks unless you intentionally document an exception in the release notes and a maintainer approves that risk.
Create an annotated tag from the reviewed main commit:
git checkout main
git pull upstream main
git tag -a vX.Y.Z -m "Release vX.Y.Z"
git push upstream vX.Y.ZIf you maintain from a fork, push the tag to the canonical upstream repository, not only your fork.
Use the tag plus the changelog summary to publish release notes.
With GitHub CLI:
gh release create vX.Y.Z --title "vX.Y.Z" --notes-file RELEASE_NOTES.mdOr use the GitHub web UI and paste the same summary manually.
The release notes should include:
- a short summary of the release
- the main Added/Changed/Fixed items
- any breaking changes and migration steps
- the verification commands you ran
After publishing:
- Confirm the tag is visible on GitHub.
- Confirm the release notes match
CHANGELOG.md. - Leave
mainready for future work with a freshUnreleasedsection. - If the release introduced a new schema version or compatibility expectation, update any related docs in
README.mdordocs/REPRODUCIBILITY.mdin the same PR.
Use this condensed checklist if you already know the workflow:
[ ] Checkout clean main and pull latest upstream
[ ] Review commits since the last tag
[ ] Decide the next semantic version
[ ] Run the backward-compatibility review
[ ] Update CHANGELOG.md with release notes and migration guidance
[ ] Run web and Rust validation commands
[ ] Verify docs contain no TODO/TBD placeholders
[ ] Create and push annotated tag
[ ] Publish GitHub release notes
[ ] Restore an empty Unreleased section