Skip to content

feat(release): changelog fragments — parallel-safe changelog authoring - #62

Merged
moveeeax merged 1 commit into
masterfrom
feat/changelog-fragments
Aug 23, 2026
Merged

feat(release): changelog fragments — parallel-safe changelog authoring#62
moveeeax merged 1 commit into
masterfrom
feat/changelog-fragments

Conversation

@moveeeax

Copy link
Copy Markdown
Owner

CHANGELOG.md is touched in a third of all integrations — the single most conflict-prone file for parallel work (blast-radius review data). Fragments end that.

  • changelog.d/<topic>.<added|changed|fixed|removed|security>.md — one markdown paragraph per PR, no shared file to conflict on. This PR dogfoods its own fragment.
  • scripts/assemble-changelog.sh folds fragments into [Unreleased] (creates sections in canonical order); --check validates format only and runs as a fast CI step. Direct [Unreleased] edits stay legal (documented as transitional).
  • Release UX got simpler, not heavier: release.sh <ver> now does assemble → retitle [Unreleased] → all version bumps in one command (the manual heading rename was the only human mechanical step left; content still comes from humans — in the fragments). Manual pre-retitle still accepted; empty Unreleased and orphan fragments fail loudly.
  • Selftest 19 → 20 (planted bad-type fragment must be caught and named); found and fixed stale counters in ci.yml/gates-nightly that had lagged at 18.

Live-verified end-to-end: fragment → assemble → release.sh 1.6.0 on a scratch tree bumped everything and passed version-sync. Gates + selftest 20/20 green.

CHANGELOG.md's [Unreleased] section is the most-conflicted file in parallel
development (touched by a third of integrations in the blast-radius review).
A PR now drops changelog.d/<topic>.<type>.md — one markdown paragraph, no
leading '- ' — and two PRs never touch the same line again.

- scripts/assemble-changelog.sh folds fragments into [Unreleased] (creates
  ### sections in Keep-a-Changelog order, deletes consumed fragments);
  --check validates fragment format only and runs in the quick CI gate job
- scripts/release.sh now runs the assemble itself and retitles [Unreleased]
  to '## [<ver>] — date' with a fresh empty [Unreleased] on top: the one
  manual step left in a release is gone (a hand-retitled heading and direct
  [Unreleased] edits stay legal — fragments are preferred, not required)
- gate selftest: run_case learns gate arguments; new case renames the
  tracked changelog.d/README.md into a bad-typed fragment and requires
  --check to name it — 20 planted breakages across nine gate scripts
- docs: CONTRIBUTING Changelog+Release sections, changelog.d/README.md,
  INDEX, CLAUDE.md
@moveeeax
moveeeax merged commit 66ae31e into master Aug 23, 2026
11 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