Release Process
CRS should use one release source, then sync the rest of the repo from it.
Source of truth
The release source lives in:
config/release.json
It currently holds:
- version
- stage
- billing status note
- release tag
- next milestone note
Sync command
After editing config/release.json, run:
node scripts/sync-release-version.js
That updates:
config/siteIdentity.jsonfrontend/package.jsonbackend/package.jsondocs-site/package.json
Recommended versioning
Use semantic versioning:
- patch:
2.2.1Small fixes only. - minor:
2.3.0New features that do not break the product structure. - major:
3.0.0Breaking changes, larger architectural shifts, or a major new product phase.
For betas, use Git tags like:
v2.2.0-beta.1v2.2.0-beta.2v2.2.0
Release steps
- Finish the work for a checkpoint.
- Update
config/release.json. - Run
node scripts/sync-release-version.js. - Update
CHANGELOG.md. - Commit the release prep.
- Tag the release in Git.
- Push commits and tags.
- Create a GitHub release from that tag.
- Deploy the tagged version.
Git commands
Example for the current beta flow:
git add .
git commit -m "Prepare v2.2.0-beta.1 release"
git tag v2.2.0-beta.1
git push origin main
git push origin v2.2.0-beta.1
If the beta is stable and you want the full release later:
git tag v2.2.0
git push origin v2.2.0
How often to release
Do not bump the version for every small commit.
A good rhythm is:
- patch release when fixes accumulate into a stable checkpoint
- minor release when a real product capability lands
- beta tag when you want a reviewable public milestone without calling it final
Billing note
Billing is intentionally deferred for the current beta line.
When premium access work starts later, treat it as its own milestone and release it deliberately rather than mixing it into ongoing cleanup work.