Companion to the ### Version bumps rule in template/CLAUDE.md.
The inline section gives the headline; this file is the ordered sequence,
the CHANGELOG filter, and the rationale.
When the user asks for a version bump (bump to vX.Y.Z, tag X.Y.Z,
release X, etc.), follow this exactly. Skipping or reordering produces
broken releases.
Each command must finish clean before the next runs:
pnpm run update # dependency drift
pnpm i # lockfile alignment
pnpm run fix --all # formatting + autofix-able lint
pnpm run check --all # type + lint + path gatesIf any step surfaces failures, fix them before continuing. Don't bump a broken tree.
The new ## [X.Y.Z] block describes what a downstream consumer needs
to know to upgrade.
Include:
- New exports
- Removed exports
- Renamed exports
- Signature changes
- Behavioral changes
- Perf characteristics they will measure
- Migration recipes
Exclude:
- Internal refactors
- File moves
- Test reorg
- Primordials cleanup
- Lint passes
chore(wheelhouse)cascades- Build-script tweaks
Use Keep-a-Changelog sections (Added / Changed / Removed / Renamed / Fixed / Performance / Migration).
Source the raw list with git log <prev-tag>..HEAD --pretty="%s" and
filter to consumer-visible commits only.
If a session has other unrelated work to commit, those land first; the
chore: bump version to X.Y.Z commit (carrying both package.json and
CHANGELOG.md) is the tip of the branch when tagging.
If a version-bump commit already exists earlier in history, rebase it forward so it ends up at the tip.
git tag vX.Y.Z at the bump commit, then push the tag. The
version-bump-order-guard hook enforces this ordering at commit time.
Per the Public-surface hygiene rule (in CLAUDE.md), releases are user-triggered. Stop after the tag push; the user runs the publish workflow manually.
- Bisecting from
mainpast the tag must not land on a temporarily-broken state. If the bump commit is the tip,git bisectbetween any prior commit and the tag passes through only known-good states. git describeis cleaner when the bump is the tip.vX.Y.Zmatchesgit describe --tags --exact-match HEADexactly at release time; downstream tooling that usesgit describefor version detection sees clean output.- The pre-bump prep wave catches drift consumers would hit on first install. Dependency drift, formatting drift, type drift — the fleet check passes on your branch but breaks on a clean clone if these aren't run before tagging.
- The public-facing-only filter is the difference between a
changelog people read and a changelog people skip. A 200-line
block of
chore(wheelhouse)entries trains downstream consumers to ignore CHANGELOG.md entirely.
.claude/hooks/version-bump-order-guard/— enforces the bump-at-tip + tag-after-bump ordering..claude/hooks/release-workflow-guard/— blocksgh workflow rundispatches that aren't dry-run.immutable-releases.md— every GitHub Release that lands as a result of this sequence ships immutable (Sigstore release attestation, asset lock, tag protection). The release workflow MUST use the 3-step draft → upload → publish pattern; single-callgh release create <tag> <files>is forbidden.