Skip to main content

Release flow

Constellation cuts dated releases from develop into main.

Cutting a release​

git fetch origin
git checkout -b release/YYYY-MM-DD origin/develop

# Review first: the forward-looking-claim advisory is only actionable before
# the fragments it names are consumed (INF-540).
npx tsx scripts/render-changelog.ts --dry-run

# Pass NO date. The script derives today's label with a collision check
# (second release of a day -> YYYY-MM-DDb), and an explicit date BYPASSES that
# check — so a bare date here would render a different, duplicate-heading
# version than the dry run above just previewed.
npx tsx scripts/render-changelog.ts --title "Headline summary"
git add CHANGELOG.md .changeset/
git commit -m "release: <derived version> - Headline summary"
git push -u origin release/YYYY-MM-DD
gh pr create --base main --title "Release YYYY-MM-DD: …"

Merge strategy: release PRs use merge commit, not squash, to preserve history and avoid spurious conflicts on subsequent releases.

Migration gate​

The Verify Release Migrations CI job blocks release PRs if either staging (DEV_DATABASE_URL) or production (PROD_DATABASE_URL) is missing a migration that exists on the branch. Apply outstanding migrations to both before opening the release PR.

The gate is read-only — it never applies migrations. It refuses to let the merge through until the schema is caught up.

After merging to main​

Back-merge main into develop immediately so the two branches stay in sync:

git checkout develop
git pull
git merge origin/main
git push

Hotfixes​

For urgent production issues:

git fetch origin
git checkout -b hotfix/description origin/main
# fix + PR to main with merge commit
# then back-merge main into develop