test-changelog is red at HEAD: 19 pre-existing fragments fail structural validation
Summary
make test-changelog (Makefile:344-347 - "the changelog policy gate (also the CI
test-changelog job)") is red on an unmodified checkout of
feat/v3-resource-runtime-rewrite. scripts/changelog-check.sh exits 1.
Because the gate validates every fragment present, not only changed ones, it
is permanently red: it can no longer distinguish a newly added fragment's
mistake from the standing 19, and any change that adds a fragment inherits the
failure. A gate that is always red provides no information at exactly the moment
it is supposed to prove something - and this one is on the shipping path.
Reproduction
$ bash scripts/changelog-check.sh; echo $?
PASS: CHANGELOG.md policy checks passed.
FAIL: changelog.d/ fragment validation failed:
- changelog.d/2026-08-19-d2bd-runtime.md:1: content before the first '### <Section>' heading
- changelog.d/2026-08-20-device-provider-ownership.md:1: content before the first '### <Section>' heading
- changelog.d/2026-08-21-v3-guest-u3.md:1: content before the first '### <Section>' heading
- changelog.d/2026-08-26-zone-only-u3.md:1: content before the first '### <Section>' heading
- changelog.d/2026-08-26-zone-only-u4.md:1: content before the first '### <Section>' heading
- changelog.d/2026-09-10-u12-credential-driver.md:26: unknown section 'Notes'; expected one of Added, Changed, Deprecated, Removed, Fixed, Security
- changelog.d/adr046-u10-credential-providers.md:20: unknown section 'Follow-up'; expected one of Added, Changed, Deprecated, Removed, Fixed, Security
- changelog.d/adr046-u11-broker-profiles.md:1: content before the first '### <Section>' heading
- changelog.d/adr046-u11-transport-carriage.md:1: content before the first '### <Section>' heading
- changelog.d/credential-async-user-sources.md:1: content before the first '### <Section>' heading
- changelog.d/credential-guest-local-adapters.md:1: content before the first '### <Section>' heading
- changelog.d/desktop-provider-ownership.md:1: content before the first '### <Section>' heading
- changelog.d/feat-v3-resource-runtime-rewrite-u2-spec-store.md:1: content before the first '### <Section>' heading
- changelog.d/guest-vmm-and-closure-convergence.md:1: content before the first '### <Section>' heading
- changelog.d/nix-surface-ownership.md:1: content before the first '### <Section>' heading
- changelog.d/process-runtime-owners.md:1: content before the first '### <Section>' heading
- changelog.d/provider-owned-zone-projections.md:1: content before the first '### <Section>' heading
- changelog.d/realm-compatibility-retirement.md:1: content before the first '### <Section>' heading
- changelog.d/refactor-network-storage-activation-owners.md:1: content before the first '### <Section>' heading
- changelog.d/v3-guest-u9-component-session.md:1: content before the first '### <Section>' heading
See changelog.d/README.md for the fragment format.
1
Two distinct shapes, two different decisions
- 17 fragments predate the heading requirement - they open with prose
before the first ### <Section> heading. Format-only defect; the fix is
placement, not content.
- 2 fragments use unsanctioned sections -
Notes
(2026-09-10-u12-credential-driver.md:26) and Follow-up
(adr046-u10-credential-providers.md:20). This is a policy question, not a
typo: either the content folds into an allowed section, or the allowed set
gains a sanctioned section (with changelog.d/README.md updated). Decide it
once and apply it consistently - do not special-case by filename.
Proposed work
- Fix the 19 as format-only edits: move the leading prose under the correct
### Added|Changed|Deprecated|Removed|Fixed|Security heading. No content,
intent, or attribution changes.
- Decide the
Notes/Follow-up question once, then apply it.
- Keep the policy strict - do not relax validation to tolerate free-form prose.
The strictness is what surfaced this.
- Land as its own unit before the rewrite's ship gate, since
test-changelog is
part of the shipping path.
Acceptance criteria
bash scripts/changelog-check.sh exits 0 on a clean checkout and
make test-changelog passes.
- The 19 fragments' textual content is preserved; only placement/section labels
change.
- A newly added fragment validates with no parking/exclusion mechanism.
Non-goals
- Not relaxing the fragment format.
- Not folding fragments into
CHANGELOG.md - make changelog-fold is a
merge-time operation with its own timing.
test-changelogis red at HEAD: 19 pre-existing fragments fail structural validationSummary
make test-changelog(Makefile:344-347 - "the changelog policy gate (also the CItest-changelog job)") is red on an unmodified checkout of
feat/v3-resource-runtime-rewrite.scripts/changelog-check.shexits 1.Because the gate validates every fragment present, not only changed ones, it
is permanently red: it can no longer distinguish a newly added fragment's
mistake from the standing 19, and any change that adds a fragment inherits the
failure. A gate that is always red provides no information at exactly the moment
it is supposed to prove something - and this one is on the shipping path.
Reproduction
Two distinct shapes, two different decisions
before the first
### <Section>heading. Format-only defect; the fix isplacement, not content.
Notes(
2026-09-10-u12-credential-driver.md:26) andFollow-up(
adr046-u10-credential-providers.md:20). This is a policy question, not atypo: either the content folds into an allowed section, or the allowed set
gains a sanctioned section (with
changelog.d/README.mdupdated). Decide itonce and apply it consistently - do not special-case by filename.
Proposed work
### Added|Changed|Deprecated|Removed|Fixed|Securityheading. No content,intent, or attribution changes.
Notes/Follow-upquestion once, then apply it.The strictness is what surfaced this.
test-changelogispart of the shipping path.
Acceptance criteria
bash scripts/changelog-check.shexits 0 on a clean checkout andmake test-changelogpasses.change.
Non-goals
CHANGELOG.md-make changelog-foldis amerge-time operation with its own timing.