Summary
Three changelog entries for #1873 were committed into the published ## [2026.9.16-2] section of packages/coding-agent/CHANGELOG.md instead of ## [Unreleased]. The changelog gate passed all three PRs.
Two rules were broken at once: AGENTS.md and .github/agent/commands/cl.md both state that released sections are immutable and that new entries always go under [Unreleased].
Evidence
The three docs commits and the line each one inserted at, against the section headings present in the file at that commit:
| commit |
inserted at |
enclosing section at that commit |
79b2238a19 docs(compaction): record the admission verdict |
line 337 |
## [2026.9.16-2] (line 323) |
95fc0c69fb docs(compaction): record the held model switch |
line 346 |
## [2026.9.16-2] (line 332) |
175d4b168b docs(retry-fallback): record the repaired fallback rung |
line 348 |
## [2026.9.16-2] (line 334) |
Every other CHANGELOG-touching commit in v2026.9.19-2..HEAD inserted between lines 6 and 19, which is inside [Unreleased].
This is not a merge-anchor artifact from a stale branch: git merge-base --is-ancestor v2026.9.19-2 79b2238a19 succeeds, so the branch was cut after the last release tag, and the insert point was already inside a published section when the commit was authored.
Impact
scripts/release-changelog.mjs stamps [Unreleased] into the new version section, so entries parked in an older section are published in no release at all. This cycle's release notes would have shipped without the entire deferred-model-switch feature (#1873), while four-day-old published history silently gained three entries it never contained.
Gate gap
scripts/check-pr-changelog.mjs requires that a PR add a CHANGELOG.md entry, and restrictTrackerEntriesToAddedLines restricts tracker credit to lines the diff added. Nothing checks which section a CHANGELOG.md added line lands in, so an entry appended to a released section satisfies the gate exactly as one appended to [Unreleased].
Expected / ideal state
- An added CHANGELOG.md line that lands below the first
## [ version heading fails the gate, naming the file, the line, and the section that swallowed it.
- A PR that modifies or deletes a line inside an already-released section fails the same way, since released sections are immutable.
- The gate keeps passing for entries added under
[Unreleased] and for the release tooling's own stamping commit.
Scope
- Immediate: the three misplaced entries are moved to
[Unreleased] so this release ships correct notes.
- Remaining: the placement check in
check-pr-changelog.mjs plus its regression test. Without it the next agent that writes into a stale offset reproduces this exactly.
Related
Summary
Three changelog entries for #1873 were committed into the published
## [2026.9.16-2]section ofpackages/coding-agent/CHANGELOG.mdinstead of## [Unreleased]. The changelog gate passed all three PRs.Two rules were broken at once:
AGENTS.mdand.github/agent/commands/cl.mdboth state that released sections are immutable and that new entries always go under[Unreleased].Evidence
The three docs commits and the line each one inserted at, against the section headings present in the file at that commit:
79b2238a19docs(compaction): record the admission verdict## [2026.9.16-2](line 323)95fc0c69fbdocs(compaction): record the held model switch## [2026.9.16-2](line 332)175d4b168bdocs(retry-fallback): record the repaired fallback rung## [2026.9.16-2](line 334)Every other CHANGELOG-touching commit in
v2026.9.19-2..HEADinserted between lines 6 and 19, which is inside[Unreleased].This is not a merge-anchor artifact from a stale branch:
git merge-base --is-ancestor v2026.9.19-2 79b2238a19succeeds, so the branch was cut after the last release tag, and the insert point was already inside a published section when the commit was authored.Impact
scripts/release-changelog.mjsstamps[Unreleased]into the new version section, so entries parked in an older section are published in no release at all. This cycle's release notes would have shipped without the entire deferred-model-switch feature (#1873), while four-day-old published history silently gained three entries it never contained.Gate gap
scripts/check-pr-changelog.mjsrequires that a PR add a CHANGELOG.md entry, andrestrictTrackerEntriesToAddedLinesrestricts tracker credit to lines the diff added. Nothing checks which section a CHANGELOG.md added line lands in, so an entry appended to a released section satisfies the gate exactly as one appended to[Unreleased].Expected / ideal state
## [version heading fails the gate, naming the file, the line, and the section that swallowed it.[Unreleased]and for the release tooling's own stamping commit.Scope
[Unreleased]so this release ships correct notes.check-pr-changelog.mjsplus its regression test. Without it the next agent that writes into a stale offset reproduces this exactly.Related
[Unreleased]merge conflicts