Skip to content

ci: let release-please own CHANGELOG.md (end the dual-changelog desync) - #110

Merged
mountainowl merged 1 commit into
mainfrom
chore/release-changelog
Jun 17, 2026
Merged

ci: let release-please own CHANGELOG.md (end the dual-changelog desync)#110
mountainowl merged 1 commit into
mainfrom
chore/release-changelog

Conversation

@mountainowl

Copy link
Copy Markdown
Owner

Why

While auditing the release mechanics I found the versioning is solid (see below) but the changelog had silently desynced 13 releases ago:

  • CHANGELOG.md (hand-curated, shipped in the sdist) was frozen at 0.8.0, with ~240 lines piled into a stale ## [Unreleased] block.
  • release-please's real per-release history was routed to a hidden .release-please-changelog.md "sink" that isn't shipped or linked.
  • Root cause: CONTRIBUTING.md prescribed a manual "rename [Unreleased][X.Y.Z] before merging" step — skipped for every release after 0.8.0.

What

  • Point release-please's changelog-path at CHANGELOG.md → it now owns and regenerates the changelog from Conventional Commits. No manual step, can never desync again.
  • Seed CHANGELOG.md with the full generated history (0.5.0 → 0.21.1); delete the sink file.
  • Update CONTRIBUTING.md, the release-please workflow comment, and the commitizen comment to describe the new (automated) reality.

Versioning audit (no change needed)

The major number not increasing is by design, not a bug: release-please sets bump-minor-pre-major: true and commitizen sets major_version_zero: true — they agree that pre-1.0, breaking changes bump MINOR. Verified breaking changes are detected (7 releases carry ⚠ BREAKING CHANGES) and bumped minor correctly; tag = manifest = pyproject = 0.21.1; commitlint.yml only lints (cz check), so there's no dual-writer conflict.

CHANGELOG.md had drifted 13 releases out of date: the hand-curated file was
frozen at 0.8.0 with ~240 lines piled in a stale `[Unreleased]` block, while
release-please's real per-release history was routed to a hidden
`.release-please-changelog.md` "sink" nobody read. Root cause: a manual
"rename [Unreleased] -> [X.Y.Z] before merging" step that was skipped for
every release after 0.8.0.

Point release-please's `changelog-path` at CHANGELOG.md so it owns and
regenerates the changelog from Conventional Commits — no manual step, can
never desync again. Seed CHANGELOG.md with the full generated history
(0.5.0 -> 0.21.1) and delete the sink. Update CONTRIBUTING.md, the
release-please workflow comment, and the commitizen comment to match.

Versioning itself was already correct and is unchanged: bump-minor-pre-major
(release-please) and major_version_zero (commitizen) agree, so pre-1.0
breaking changes bump MINOR — intended SemVer 0.x behavior.
@mountainowl
mountainowl force-pushed the chore/release-changelog branch from 987afe7 to e183eaf Compare June 17, 2026 01:39
@mountainowl
mountainowl merged commit f038079 into main Jun 17, 2026
5 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant