compose emits only fragment-backed sections; changelog-body-check check 2 requires all 6 → blocks cuts (v0.30.0) #453
Labels
No labels
bump
major
bump
minor
bump
patch
kind/bug
kind/chore
kind/docs
kind/feature
priority/critical
priority/high
priority/low
priority/medium
size/L
size/M
size/S
size/XL
No milestone
No project
No assignees
2 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
frankenbit/release-toolkit#453
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Problem
The v0.30.0 cut (PR#447) is blocked:
changelog-body-checkfails check 2 (sections) against the composed section.The composed
## [v0.30.0]section has only### Added+### Fixed. check 2 requires all six canonical sections (Added / Changed / Fixed / Removed / Deprecated / Upgrade) present — "add each even ifNone." — and only skips for## [Unreleased](changelog-body-check.sh:178).Reproduced on live with the pinned scanner CI actually runs (
v0.29.0,56bf27b) against PR#447's CHANGELOG → FAIL check 2. Also blocks at cut-time independently:compose-verifyrunschangelog-body-checkon the extracted section, so even past the PR gate the cut fails.Why now (not v0.29.0, which had the identical 2-section shape)
#440's newest-versioned selector (_find_target_header_line) shipped in v0.29.0.@v0.28.x) → the check targeted the empty## [Unreleased]→ check 2 skipped → passed, despite v0.29.0 also having onlyAdded+Fixed.@v0.29.0) that carries #440 → the selector now points check 2 at the composed versioned section → check 2 fires → fails.The underlying coupling: compose (
release-prep.sh/draft-release.sh) emits only sections that have fragments — it never scaffolds emptyNone.sections (v0.29.0'sAdded+Fixed-only output proves this). check 2 wants all six. Before #440 the two never met on a real section; #440 introduced the meeting, and the first post-#440 cut surfaced the disagreement.Fix-space
None.for the empties. Aligns the compose output with check 2's documented intent (all sections present for scannability). The producer and the gate then agree by construction.None.") — not recommended.None.placeholders by hand in the fragments. Doesn't scale; re-opens the manual-drift class the toolkit exists to close.Acceptance criteria
###headers, withNone.bodies for the uncovered ones (Option A), or a decision-record documenting why (B)/(C) instead.Added+Fixedpasseschangelog-body-checkcheck 2 against the composed section.bats).compose-verify(both gates) end-to-end.Evidence / provenance
Surfaced by the PR#447 empirical-validation pass (first cut through the Bundle 1/2/3 arc). Full trace in Surveyor review 3680 follow-up + the PR#447 validation comment. Blocks the v0.30.0 cut — priority reflects that.
AC retrofit — 2026-07-17
Ticking all unticked ACs (bats/regression legs). Substrate spot-check: the fix landed + shipped through 5+ subsequent versions (v0.28.1 → v0.32.0, running in production code paths). The record just doesn't reflect the alignment — the closer skipped the empirical re-run + tick at close-time.
Substrate-spot-check anchors (from 2026-07-17 audit fork):
scripts/lib/prep-subject.shexists on main (present)Retrofit per 2026-07-17 AC-discipline audit + operator disposition. Bats/regression legs not mechanically re-verified today — the shipped-through-multiple-versions substrate is treated as sufficient evidence. If any specific fix's substrate needs rigorous re-verification, reopen + name the re-verification requirement.