feat(register-check): commit-subject → CHANGELOG bypass gate #403

Closed
opened 2026-07-05 16:42:13 +02:00 by quartermaster · 2 comments

Fixed via PR#434 merged. Two-tier defense: (b) opt-in commit-subject scan at PR-review-time via register-check.sh --git-log + reusable-workflow input; (c) belt-and-suspenders scrub at compile-boundary via --stdin mode called from release-prep.sh. Single source of truth on REGISTER_PATTERNS (one array, three surfaces). Post-Surveyor 3661 fold: fail-loud on unresolvable range + documented pattern-list specificity. Follow-up: #435 for adopter-overridable patterns.

**Fixed via PR#434 merged.** Two-tier defense: (b) opt-in commit-subject scan at PR-review-time via `register-check.sh --git-log` + reusable-workflow input; (c) belt-and-suspenders scrub at compile-boundary via `--stdin` mode called from `release-prep.sh`. Single source of truth on REGISTER_PATTERNS (one array, three surfaces). Post-Surveyor 3661 fold: fail-loud on unresolvable range + documented pattern-list specificity. Follow-up: #435 for adopter-overridable patterns.
Owner

Empirical anchor — #403 firing live in PR#406 (v0.27.0 release-prep).

The v0.27.0 cut compiled its CHANGELOG section with the fragment prose (house style) AND a set of conventional-commit summary bullets emitted from cc_list_commits_since — the exact commit-subject -> CHANGELOG bypass this issue predicts. Two of the leaked bullets carried commit-subject attribution residue into adopter-visible release-of-record content:

- **release-decide**: scope orphan-skip to VIRTUAL bootstrap only (56eb depth-review)
- **api-resilience**: pre-review hardening — non-idempotent retry guard + cap fail-loud + EXIT trap (Surveyor 32fb focus)

(56eb depth-review) and (Surveyor 32fb focus) are raw commit-subject parentheticals (short-SHA + chamber-name) — precisely the register-drift the surface-level gates (#372/#374/#384/#390) scrub elsewhere, arriving here through the commit-subject path the register-gate (#392) doesn't cover.

Adjacent finding worth folding into #403 scope: the changelog-body-check (scripts/changelog-body-check.sh) already has a check 5 (style): all sections consistent (all-bullet or all-prose) that WOULD have caught the mixed prose+bullet section — but it skips the just-transitioned version section (it validates [Unreleased] pre-transition; once the section carries a version header it's treated as frozen and not re-checked). So the style-consistency guard exists but has a transition-window blind spot on exactly the compiled section a cut produces.

Manually remediated for this cut in PR#406 (commit 9feb932): dropped all 5 cc-summary bullets, kept fragment prose, normalized issue-refs. A durable #403 fix (commit-subject bypass gate + closing the body-check transition-window gap) lands post-v1.0.0 per the milestone plan.

**Empirical anchor — #403 firing live in PR#406 (v0.27.0 release-prep).** The v0.27.0 cut compiled its CHANGELOG section with the fragment prose (house style) AND a set of conventional-commit summary bullets emitted from `cc_list_commits_since` — the exact commit-subject -> CHANGELOG bypass this issue predicts. Two of the leaked bullets carried commit-subject attribution residue into adopter-visible release-of-record content: ``` - **release-decide**: scope orphan-skip to VIRTUAL bootstrap only (56eb depth-review) - **api-resilience**: pre-review hardening — non-idempotent retry guard + cap fail-loud + EXIT trap (Surveyor 32fb focus) ``` `(56eb depth-review)` and `(Surveyor 32fb focus)` are raw commit-subject parentheticals (short-SHA + chamber-name) — precisely the register-drift the surface-level gates (#372/#374/#384/#390) scrub elsewhere, arriving here through the commit-subject path the register-gate (#392) doesn't cover. **Adjacent finding worth folding into #403 scope:** the changelog-body-check (`scripts/changelog-body-check.sh`) already has a *check 5 (style): all sections consistent (all-bullet or all-prose)* that WOULD have caught the mixed prose+bullet section — but it skips the just-transitioned version section (it validates `[Unreleased]` pre-transition; once the section carries a version header it's treated as frozen and not re-checked). So the style-consistency guard exists but has a transition-window blind spot on exactly the compiled section a cut produces. Manually remediated for this cut in PR#406 (commit 9feb932): dropped all 5 cc-summary bullets, kept fragment prose, normalized issue-refs. A durable #403 fix (commit-subject bypass gate + closing the body-check transition-window gap) lands post-v1.0.0 per the milestone plan.
Author
Owner

#403 closed via PR#434 (merged pending); #435 filed as follow-up for adopter-overridable REGISTER_PATTERNS per Surveyor 3661 should-consider #2. Family-cluster framing on #435 preserves the n=3 anchor (#403/#421/#431) so the register-discipline-adopter-vs-internal axis stays discoverable post-sprint.

**#403 closed via PR#434 (merged pending); #435 filed as follow-up** for adopter-overridable REGISTER_PATTERNS per Surveyor 3661 should-consider #2. Family-cluster framing on #435 preserves the n=3 anchor (#403/#421/#431) so the register-discipline-adopter-vs-internal axis stays discoverable post-sprint.
Sign in to join this conversation.
No milestone
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
frankenbit/release-toolkit#403
No description provided.