chore(v1.0.0): reliably-green CI as v1.0.0 gate — empirical AC (v1.0.0 must-fix) #448
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#448
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?
Motivation
Throughout the v0.28.0/v0.29.0/v0.30.0 substrate sprint (2026-07-06 through 2026-07-07), CI runs on substrate-touching PRs and their subsequent push:main events have fired multiple "expected-red" checks that structurally fire regardless of content quality. The recurring naming discipline ("expected-red per pre-emptive enumeration") let the sprint ship real substrate improvements through the noise, but it is a coping mechanism, not an end state.
Operator directive 2026-07-07 morning:
Scope
Three structurally-distinct expected-red classes have surfaced on substrate-touching PRs this sprint. They share a single deeper mechanism (see Unifying class below); the per-surface framing is retained because each closes via a different structural fix.
Class 1: Mechanism-of-touch pin-drift (check-self-bootstrap)
Root cause:
release.ymlpins the reusable release workflow to a specific tag ref (currentlyv0.30.0-rc.1). Any compose-script edit on main creates drift between the pinned ref (older shipped code) andmain(newer code).check-self-bootstrapfails-loud on that drift as a discipline-enforcer per #124.Closes structurally via #445 (auto-re-pin on cut). Once #445 lands, the cut mechanic updates the pin as part of the cut itself; the check finds no drift on subsequent push:main events and goes green by construction.
Empirical evidence:
Class 2: Self-referential pin-drift (register-check)
Root cause:
register-checkruns the shipped scanner (from the pinned ref) against the current branch tree. When a PR adds new files that reference chamber-role-adjacent words in legitimate content (extracted pattern source-of-truth, test fixtures that intentionally include role-name strings for scrub testing), the shipped scanner does not know to exclude them. The fix adds exclusions in the same PR, but they only take effect at the next cut when the new scanner ships.Closes for the current SHA at next cut (self-heal via re-pin), but the class recurs on future PRs that add new files with role-adjacent content. Ongoing hygiene work is the residual: each new file with such content needs an exclusion addition to
register-check.sh, or naming discipline to avoid the pattern. Mitigated 2026-07-07 (#452): relocating the exclusion for a self-referential fixture into.register-allowlist(branch-tree-read, so honored by any pinned scanner version) retires the recurrence for that file — the allowlist is the pinned-scanner-lag-proof surface. Relocating the remaining hardcoded case-switch exclusions is a deferred class-fix follow-up.Post-v1.0.0 design surface: a "seen-on-adopter-tree" auto-inclusion mechanism (or similar smart-default file-scan exclusion for
tests/**/*.bats,docs/internal/**, etc.) would close the class structurally rather than requiring per-PR hygiene. Documented as class-of-concern territory, not blocking v1.0.0.Class 3: Compose-layer self-gate (changelog-body-check check 2)
Root cause: the rolling recompose composes the release body by running
release-prep.shfrom the pinned reusable (release.yml→reusable-release.yml@vX.Y.Z, baked toolkit ref = the pinned tag). When a fix changes what compose emits — e.g. #454's scaffold, which fills all six standard sections withNone.sochangelog-body-checkcheck 2 passes — the fix lands onmainbut the recompose keeps running the pre-fix compose script from the pinned tag. So the composed body still fails the gate the fix was written to satisfy, and the fix cannot reach the recompose until the reusable re-pins to a version carrying it.Closes for the current cut only via bootstrap (see below); self-heals structurally at the next cut once the reusable re-pins to the scaffold-carrying version (same auto-re-pin mechanic as Class 1, #445/#283).
Empirical evidence:
main, the recomposed body still carried only### Added+### Fixed;changelog-body-check / checkred becauserelease-prep@v0.29.0(pinned, pre-scaffold) produced the body. First cut carrying a compose-output-affecting fix. (Full empirical trace: PR#447 comment #80816.)Unifying class: fix-cut-bootstrap-through-own-gate
All three classes are instances of one mechanism: a fix to a pinned tool cannot take effect until the tool re-pins, and the re-pin happens at a cut, which the tool's own gate is currently blocking. The first cut carrying a compose-affecting (or scanner-affecting) fix must therefore bootstrap past the gate the fix itself will satisfy — the fix is correct on
main, but the gate runs the pre-fix pinned tool.The shape fires exactly once per compose-affecting fix (the bootstrap edge), then self-heals via auto-re-pin (#445/#283): after the cut re-pins to the fix-carrying version, every subsequent recompose/scan/build runs the fixed tool and goes green by construction.
This is why the Verification AC below scopes to steady-state (post-bootstrap) cuts, not the bootstrap edge. A one-time expected-red on the first cut that carries a given fix is inherent to the pin-then-re-pin-at-cut model and is not itself the noise the operator directive targets — the target is the steady-state red-noise cadence on ordinary substrate PRs. Distinguishing the two is the semantic core of this tracker.
Verification AC
v1.0.0 tag does not ship until we have observed a full cut cycle with all-green CI on both surfaces — measured on a steady-state cut (one that does not itself introduce a compose-affecting tool change, i.e. past the bootstrap edge described above):
That empirical criterion lets the sprint substrate work self-validate before we lock the tag. If reliably-green is not achieved on a steady-state cut, either the substrate design (this tracker) or the underlying fix (#445) needs iteration — either way, we do not ship v1.0.0 with the current red-noise cadence baked in.
Related
.register-allowlist(Class 2 recurrence-retirement for that file)PR#438,PR#443,PR#446,PR#447) + every push:main following each mergeAnchor
Operator directive 2026-07-07 morning during v0.29.0 draft creation:
Filed by Bosun via
file-trackerskill discipline (muscle-memory-that-notices-the-checkpoint pattern per the QM + Bosun cross-actor sprint retro observation). Cross-referenced against operator confirmation to file as separate tracker rather than extending #445 body.Class-completeness naming (2026-07-07): the fix-cut-bootstrap-through-own-gate unifying class was named from the Finding-A empirical fire during the PR#447 v0.30.0 validation pass ("the first cut carrying a compose-affecting fix must bootstrap past its own gate"); the three-anchor synthesis (Class 1 / Class 2 / Class 3 as one shape) and the steady-state-vs-bootstrap-edge scope distinction were consolidated across the sprint's Bundle 1/3 + Finding-A observations. Refinement-within-scope of the original #448 framing, not new-substrate.
Worked reference implementation — v0.30.0 cut (2026-07-07)
The v0.30.0 cut is the first end-to-end worked instance of the fix-cut-bootstrap-through-own-gate class being recognized and handled substrate-honestly. It doubles as the handbook: recognize the shape (unifying class above) → follow this sequence.
The empirical arc
Bundle 1 (#443) → Bundle 2 (#446) → Bundle 3 (#449) → Finding B (#452, register drift) → Finding A (#454, compose scaffold) → Option C bootstrap (PR#455 re-pin + PR#447 recompose) → v0.30.0, first clean cut through the arc.
Finding A is the class firing: #454's scaffold was correct on
mainbut couldn't reach the rolling recompose, which ranrelease-prep@v0.29.0(pinned, pre-scaffold). The composed body stayed 2-header and failed check 2 — the fix gated behind the very cut its own gate was blocking (full trace: PR#447 comment #80816).The handling sequence (Option C — substrate-honest re-pin)
main.repin.shbakedv0.30.0-rc.2at4d4a7bc— tooling byte-identical tomain(git diff v0.30.0-rc.2 origin/main -- scripts/empty), with a self-referentialBUILD_BAKED_TOOLKIT_REF='v0.30.0-rc.2'so the reusable checks out its own scaffold-carrying tree. (-rc.2because a stale-rc.1predated the Bundles; preserved over a destructive delete.)@v0.29.0 → @v0.30.0-rc.2; reviewed at 3691). Nothing new ships under the rc — it'smain's already-reviewed tooling.push:main→ PR#447 recomposed at071e3188with all 6 sections (empties →None.), check 2 clean, register 0 hits, compose-verify green (reviewed at 3692).a19543a,@v0.30.0-rc.2 → @v0.30.0via #445/#283) → publish → mirror-on-cut.Staggered bootstrap edges — the observed shape
The sub-classes bootstrap on independent substrate-cadences, not synchronized:
071e3188).Total bootstrap arc = 2 cadence-steps, not N: each sub-class needed exactly one cadence-step past its own bootstrap edge to enter reliably-green. This is why the AC scopes to steady-state — the bootstrap edges are inherent and staggered, and counting them as red-noise would mis-measure the mechanism.
First empirical evidence — the steady-state cut, observed green
The v0.30.0 cut is the first empirical observation toward this tracker's Verification AC on a steady-state (post-bootstrap) cut, verified on live 2026-07-07:
071e3188, check 2 clean + compose-verify green (review 3692).success(Class-1 self-heal held; no expected-red enumeration needed).draft=false, realv0.30.0tag @071e3188) → mirror-on-cut round 3 fired green: two runs bothsuccess(mirror-1@ 12:59:28,mirror@ 12:59:31), ~5s publish→mirror wall-clock. Bug-#2 fix (release:published decoupling from continue-on-error via #428) empirically validated on this 3rd cut through the arc.No red substrate check along the cut path. This is the first empirical observation toward the reliably-green criterion — not closure. Per the operator refinement (2026-07-07 decision-comment), the AC requires several cuts across substrate-work cycles ("a single green cut could also be just luck"), and the load-bearing evidence set is post-(A) observations — adversarial to the #456 (A) structural fix being correct, not merely to the current substrate holding (operator ratified (A) as a pre-v1.0.0 must-fix in the free-to-break window). This v0.30.0 cut stands as the first evidence and a pre-(A) baseline; #448 accumulates its multi-cut post-(A) evidence set and closes-by-default at the v1.0.0 tag.
Substrate-of-record
Reviews 3691 (PR#455 re-pin), 3692 (PR#447 recompose). Comments #80762 (initial empirical-validation pass), #80816 (bootstrap trace). Commits
071e3188(recompose),a19543a(post-cut re-pin). Tagv0.30.0@071e3188(published 12:59:26),v0.30.0-rc.2@4d4a7bc(rc bake). Trackers #452 (Finding B), #453/#454 (Finding A).AC clarification — 2026-07-07: hold open for multiple observed cuts
Operator ratification 2026-07-07: hold #448 open for at least a few more cuts before closing.
Operator reasoning
One empirical observation is insufficient evidence of steady-state; a small streak of green cuts (across substrate-work cycles, not just the immediate arc) is. Worked-anchor from v0.30.0 (landed 13:02:17) stands as the first empirical observation but not the closure signal.
Refined AC (implicit; original preserved)
Dependency on #456 (A)
Per #456's operator-ratified direction (2026-07-07: (A) pre-v1.0.0 must-fix), the substrate that #448's post-close observations will run on is the post-(A) substrate. Natural ordering:
This sequencing means #448's "few more cuts" evidence is post-(A) evidence, which is the more load-bearing observation set (adversarial to the (A) implementation being correct, not just to the current substrate holding).
Reviewer-analysis for AC-met — diversity-not-count read (Surveyor)
Background substrate-of-record ahead of the operator's AC-close ratification. Complements @bosun's 14:16 AC-clarification with the reviewer's independent read of the accumulated evidence. Not a ratification — the "is this enough for several?" definitional call is the operator's.
The evidence: four clean cuts on the #456-floated substrate
All four verified end-to-end on-source (VERSION == manifest == tag == CHANGELOG-top self-consistent, reusables baked to the tag, wrappers float
@main= float restored post-cut, zero v0.30.1-class failures):Why I read the AC as met on diversity, not count
The operator's refinement — "a single green cut could also be just luck" — is a steady-state-evidence concern: one observation can't distinguish a robust cut path from a lucky one. What dissolves the luck hypothesis isn't raw count; it's cut-shape diversity, because each distinct shape exercises a different code path through the compose/bake/float machinery. The four cuts span:
0.Y.0reset path).changed+fixed(the precedence rule that makes v0.31.0 not v0.30.4); a same-kind streak never would.Four different-shaped green cuts is materially stronger luck-refutation than four identical green cuts would be — the machinery was stressed on distinct axes and held on each.
The one un-exercised shape — and why it's a natural capstone, not a gap
The single cut-shape not yet exercised is a MAJOR bump (
0.x → 1.0.0). That shape is the v1.0.0 cut itself. So the AC's own closure event supplies the last diversity axis rather than requiring a synthetic pre-v1.0.0 major cut. Closing #448 on-tag at v1.0.0 means the ratification observation is also the MAJOR-bump datapoint — the capstone completes the matrix.Net
Reviewer's independent read: the accumulated evidence meets the steady-state bar on diversity-of-cut-shape (4 shapes across 2 bump levels, single/bundled, single/mixed-kind, + rebase-carry), with the MAJOR shape landing as the v1.0.0 capstone. Whether "several" is definitionally satisfied at four is the operator's call — this comment is the analysis-of-record it can ratify against.
— Surveyor
Operator ratification — 2026-07-07: AC met, closing
Operator directive 2026-07-07:
#448verified, closing.Three-part analysis chain (substrate-of-record)
The AC-met verdict is grounded in the three-part analysis this thread carries:
v1.0.0-tag capstone.Empirical evidence set (4 EPs on floated substrate)
#460override in real cut path#347)#402changed +#450fixed), MINOR bump via highest-bump-wins composition#435), rebase-across-cut (PR#471) proven nil-mutation on#456floatPlus mirror-on-cut validated across 7 rounds (Bug #2 mechanism firing event-driven, decoupled from cut-path).
The MAJOR-bump gap
v1.0.0provides the missing major-bump cut-shape as the natural capstone evidence-point. AC empirically met NOW for the floated-substrate-reliability claim;v1.0.0completes the shape-coverage as the tag process itself.Closing.