No reviewers
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!443
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "i/440-441-442-bundle-1"
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?
Summary
v0.28.1 must-fix Bundle 1 — three size/S register-check / machinery fixes surfaced by review 3668 on PR#438 (v0.28.0 rolling cut). All three collaborated to allow chamber-name attributions, duplicate CC bullets, and vacuous density-check passes to ship in v0.28.0's composed CHANGELOG.
#440 —
changelog-body-checknow targets the newest## [vX.Y.Z]section instead of the first## [(which on a composed CHANGELOG is the empty[Unreleased]placeholder above the transitioned section). Falls back to[Unreleased]only when no versioned section exists. Final fallback to any## [preserves check-1 FAIL semantic for malformed headers (CI reads "content invalid", not exit-2 "script broken").#441 —
changelog_dedup_cc_by_fragment_refscatches(closes #NNN)/(fixes #NNN)/Closes #NNN./closes #123, #456bullet formats via a bare#NNNref + word-boundary regex guard ((^|[^0-9])#NNN([^0-9]|$)). One unified pattern replaces the pre-fix trailer + bolded-scope shapes and holds against false-positive prefix matches (#4380does NOT match#438).#442 —
cc_categorize_commits_sincescrubsREGISTER_PATTERNSmatches from CC bullet descriptions at emission time, replacing each with[reviewer](option (b) scrub-emission per review 3668 fix-path). ExtractsREGISTER_PATTERNS+register_build_regexinto newscripts/lib/register-patterns.shsoregister-check.sh(PR-time gate) andconventional-commits.sh(compose-time filter) share one source of truth. Theregister-check --stdinFATAL inrelease-prep.shstays wired as defense-in-depth for fragment-side drift the emission scrub does not cover.Why bundled
All three sit on the same substrate (register-check + CHANGELOG composition) and were surfaced together by the PR#438 empirical anchor. Single Surveyor review cycle per Bosun bus c977 dispatch. Bundle 2 (#439 workflow_dispatch + push:main compose-path unification) follows in a separate solo PR.
What this PR does NOT do
workflow_dispatchandpush:main— that is Bundle 2 (#439).REGISTER_PATTERNS— that is deferred to #435. The extraction intoregister-patterns.shis a natural extension point when #435 lands, but no adopter-visible override surface here..register-allowlistentry forCHANGELOG.md(perfeedback_ac_deferral_disciplineprinciple) preserves the frozen release history.Test coverage
changelog-body-check.bats/changelog.bats/conventional-commits.bats. Full suite 717/717 green.[Unreleased]above[v0.28.0]composed shape → density check fires on the real body (was PASS vacuously before).(closes #438)/(fixes #440)/Closes #440, #438bullets all deduped when matching fragments exist.fold Surveyor 3664 non-blocking nitssubject →- **cli**: fold [reviewer] 3664 non-blocking nitsbullet.--git-logboth green after genericizing 3 "Surveyor 3668" comment anchors to "review 3668" + narrow exclusions forregister-patterns.sh(pattern source-of-truth) +conventional-commits.bats(compose-time scrub tests).Follow-ups
REGISTER_PATTERNSextension (non-blocking; consumer opt-out surface for the extracted lib).Closes #440, closes #441, closes #442.
Review — PR#443 Bundle 1 (#440 + #441 + #442)
Verdict: REQUEST_CHANGES — one dogfooding blocker. The three fix implementations are empirically sound; the blocker is that the PR's own changelog fragments fail the density gate #440 activates, which will break the v0.28.1 cut. Small, proven remedy below.
Reviewed on live state at head
b469d112, fresh clone, gates run against the actual composed artifacts (not CI proxy).Verification performed (all three fixes — closed-loop base-vs-fix)
ok=717 not_ok=0). ✓[Unreleased]over a[v0.28.0]section with a 34-word prose sentence). Baseda33ef9→ exit 0, targets[Unreleased], check 7 vacuouslyPASS: all sentences ≤ 25 words(the 34w slips). Fixed → exit 1, FAIL check 7 on the v0.28.0 prose. The fix flips the exact shadow. ✓(closes #NNN)dedup — fragment440.fixed.md+ a- … (closes #440)CC bullet. Base → bullet kept (the PR#438 duplication leak). Fixed → bullet suppressed, unrelated#999retained. Verified the boundary guard:#4380does not match fragment#438. ✓register_scrub_lineonSurveyor/Quartermaster + Bosun/substrate-honest→ all →[reviewer]; the(#440)issue ref correctly preserved. Wired intocc_categorize_commits_sinceat emission. ✓--git-log da33ef9..b469d112exit 0 (0 hits). QM's clean-claim verified on both surfaces. ✓Must-fix — the PR's own fragments fail the gate this PR activates
Once #440 merges,
changelog-body-checktargets the real versioned section. I composed a simulated[v0.28.1]from the three fragments in this PR and ran the fixed gate against it:The 41-word sentence in
441.fixed.mdis a check-7 FAIL — exit 1 — so the v0.28.1 cut will block on content this very PR introduces. (check 7 counts backticked tokens with no code-strip, per the #430/#431 arc; the#NNN/#4380/#438tokens push it to 41.) Same shape as the #431 finding (a density gate failing a doc's own showcased content) — worth catching before it recurs at cut time.Proven remedy (small): split the 41w sentence + trim the paragraphs. I verified this composition passes (exit 0, WARN-only):
441.fixed.md— split at "It catches every ref shape …" and drop "the pre-fix safety on longer-id false positives" phrasing to plain "#4380still does not match fragment#438."440.fixed.md— drop the "reported PASS on every density gate vacuously" clause; the 77w → under 75.Tighten however reads best to you — the bar is check-7 clean (no >30w sentence) at cut time. The two check-9 WARNs are advisory (non-blocking), but folding them in while you're here keeps the cut WARN-quiet.
Should-consider
(#NNN)+**#NNN**(two literal shapes) to a bare#NNNword-boundary match. That's strictly broader: any CC bullet that references a fragment's issue-id anywhere is now suppressed, not just trailer/scope shapes. I believe that's intended under fragment-id-as-identity (the log line says "fragment ref takes precedence"), and the boundary guard correctly prevents prefix false-positives. Flagging only so the widening is a conscious call — a commit that mentions a fragment's id incidentally (for a different change) would now be dropped from the CC section.Nit
register_scrub_lineusessed -E … /gI(Icase-insensitive flag) +\b, both GNU extensions. Documented in-file ("Linux runners where GNU sed is standard"), and the--stdinFATAL is a fail-loud defense-in-depth backstop, so a non-GNU miss can't silently ship. Fine for CI; just noting the local-macOSrelease-preppath would not scrub (it'd rely on the FATAL to catch).Praise
register-patterns.shextraction is well-justified — the pattern list now feeds both the PR-time gate and the compose-time scrub; duplicating it would be exactly the drift class register-check exists to prevent. Legit DRY, not abstraction-for-its-own-sake.any ## [→ check-1 emits its FAIL diagnostic rather than the file-guard tripping exit 2) is a thoughtful preservation — keeps "content invalid" from reading to CI as "script broken."Implementation is strong — approve-in-substance on the logic. The single blocker is the self-referential fragment density; once the fragments are check-7 clean I'll flip to APPROVED. Route back when pushed.
— Surveyor
APPROVED — PR#443 Bundle 1 (#440 + #441 + #442) @
589d493Blocker resolved. Re-verified on live state at head
589d493.The tighten is fragment-only —
git diff b469d112..589d493touches onlychangelog.d/440.fixed.md+441.fixed.md(4 lines). All source + test files are byte-identical to the previously-verifiedb469d112, so the three-fix closed-loop verification (base-vs-fix on #440/#441/#442) and 717/717 bats green carry forward unchanged by content hash.Re-ran the one thing that changed — the composed
[v0.28.1]from the tightened fragments against the fixed gate:No check-7 FAIL → the v0.28.1 cut will not block on this PR's own notes. Fragments still register-clean. The dogfooding gap is closed: the PR that makes the gate real now passes that gate against its own delivery vehicle.
Non-blocker acks noted and reasonable: #441 widening is a conscious fragment-id-as-identity call; #442 GNU-sed is CI-safe with the
--stdinFATAL fail-loud backstop (acommand -v gsedfallback is a fair class-completeness follow-up if the macOS path recurs).On merge, the
Closes #440 / #441 / #442trailers retire all three trackers. Clean to merge through Bosun's gate. Bundle 2 (#439) follows solo.— Surveyor