chore(v1.0.0): reliably-green CI as v1.0.0 gate — empirical AC (v1.0.0 must-fix) #448

Closed
opened 2026-07-07 10:56:44 +02:00 by bosun · 3 comments
Owner

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:

"In my opinion we should prioritize this topic to sort all those issues out ASAP to reliably have green builds — ideally after (or even during) the next cut."

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.yml pins the reusable release workflow to a specific tag ref (currently v0.30.0-rc.1). Any compose-script edit on main creates drift between the pinned ref (older shipped code) and main (newer code). check-self-bootstrap fails-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:

  • PR#438 (v0.28.0 arc) → red on push:main
  • PR#443 (Bundle 1) → red on push:main
  • v0.29.0 rolling PR merge → red on push:main
  • PR#446 (Bundle 2) → red on PR runs, will be red again on push:main after merge

Class 2: Self-referential pin-drift (register-check)

Root cause: register-check runs 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.sh from the pinned reusable (release.ymlreusable-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 with None. so changelog-body-check check 2 passes — the fix lands on main but 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:

  • PR#447 (v0.30.0 cut) → after #453/#454 merged to main, the recomposed body still carried only ### Added + ### Fixed; changelog-body-check / check red because release-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.

  • Class 1 — pinned workflow lags the compose-script edit.
  • Class 2 — pinned scanner lags the exclusion addition.
  • Class 3 — pinned composer lags the section-scaffold addition.

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):

  1. A rolling release-prep PR at merge-time has all workflow checks green (no expected-red enumeration required)
  2. The resulting push:main after that merge has all workflow checks green
  3. The cut proceeds to draft release + eventual publish + mirror-on-cut without any red substrate checks along the way

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.

  • #124 — check-self-bootstrap origin design
  • #432 — check-self-bootstrap header sharpening ("pin-drift detection, NOT content validation")
  • #445 — auto-re-pin on cut for single-click release UX (structural closer for Class 1; the self-heal mechanic for the unifying class)
  • #442 — compose-time register-check filter on commit-subject → CHANGELOG (partial closer for a related sub-class)
  • #452 — relocate self-referential fixture exclusion to .register-allowlist (Class 2 recurrence-retirement for that file)
  • #453 / #454 — compose scaffolds all six standard sections (Class 3 fix; bootstrap trace in PR#447 comment #80816)
  • Empirical evidence from every substrate PR in the sprint (PR#438, PR#443, PR#446, PR#447) + every push:main following each merge

Anchor

Operator directive 2026-07-07 morning during v0.29.0 draft creation:

"In my opinion we should prioritize this topic to sort all those issues out ASAP to reliably have green builds — ideally after (or even during) the next cut."

Filed by Bosun via file-tracker skill 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 main but couldn't reach the rolling recompose, which ran release-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)

  1. Bake an rc tag from the fix-carrying main. repin.sh baked v0.30.0-rc.2 at 4d4a7bc — tooling byte-identical to main (git diff v0.30.0-rc.2 origin/main -- scripts/ empty), with a self-referential BUILD_BAKED_TOOLKIT_REF='v0.30.0-rc.2' so the reusable checks out its own scaffold-carrying tree. (-rc.2 because a stale -rc.1 predated the Bundles; preserved over a destructive delete.)
  2. Re-pin the consumer wrappers to the rc (PR#455 — 5 wrappers, one line each, @v0.29.0 → @v0.30.0-rc.2; reviewed at 3691). Nothing new ships under the rc — it's main's already-reviewed tooling.
  3. The recompose now runs the scaffold-carrying tooling. Merging PR#455 → push:main → PR#447 recomposed at 071e3188 with all 6 sections (empties → None.), check 2 clean, register 0 hits, compose-verify green (reviewed at 3692).
  4. Merge → cut. Operator merged PR#447 → the steady-state cut ran green → v0.30.0 draft release + auto-re-pin (a19543a, @v0.30.0-rc.2 → @v0.30.0 via #445/#283) → publish → mirror-on-cut.

Staggered bootstrap edges — the observed shape

The sub-classes bootstrap on independent substrate-cadences, not synchronized:

  • Class 1 (check-self-bootstrap) self-healed at the re-pin — PR#455 was the first 7/7-green substrate-touching PR of the sprint; the re-pin is post-bootstrap for its own class immediately.
  • Class 3 (compose scaffold) self-healed one cadence later — at the PR#447 recompose, once the re-pinned reusable ran the scaffold.
  • Steady-state green landed at the cut itself (check-self-bootstrap push + release/decide + release/release all green on 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:

  1. Rolling release-prep PR at merge-time all green — PR#447 recomposed at 071e3188, check 2 clean + compose-verify green (review 3692).
  2. push:main after merge all green — the 12:41 push:main ran check-self-bootstrap + release/decide+act + release all success (Class-1 self-heal held; no expected-red enumeration needed).
  3. Cut → draft → publish → mirror-on-cut all green — draft release at 12:41:28 → operator published at 12:59:26 (draft=false, real v0.30.0 tag @ 071e3188) → mirror-on-cut round 3 fired green: two runs both success (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). Tag v0.30.0 @ 071e3188 (published 12:59:26), v0.30.0-rc.2 @ 4d4a7bc (rc bake). Trackers #452 (Finding B), #453/#454 (Finding A).

## 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**: > "In my opinion we should prioritize this topic to sort all those issues out ASAP to reliably have green builds — ideally after (or even during) the next cut." ## 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.yml` pins the reusable release workflow to a specific tag ref (currently `v0.30.0-rc.1`). Any compose-script edit on main creates drift between the pinned ref (older shipped code) and `main` (newer code). `check-self-bootstrap` fails-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**: - PR#438 (v0.28.0 arc) → red on push:main - PR#443 (Bundle 1) → red on push:main - v0.29.0 rolling PR merge → red on push:main - PR#446 (Bundle 2) → red on PR runs, will be red again on push:main after merge ### Class 2: Self-referential pin-drift (register-check) **Root cause**: `register-check` runs 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.sh` from 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 with `None.` so `changelog-body-check` check 2 passes — the fix lands on `main` but 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**: - PR#447 (v0.30.0 cut) → after #453/#454 merged to `main`, the recomposed body still carried only `### Added` + `### Fixed`; `changelog-body-check / check` red because `release-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. - **Class 1** — pinned *workflow* lags the compose-script edit. - **Class 2** — pinned *scanner* lags the exclusion addition. - **Class 3** — pinned *composer* lags the section-scaffold addition. 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): 1. A rolling release-prep PR at merge-time has all workflow checks green (no expected-red enumeration required) 2. The resulting push:main after that merge has all workflow checks green 3. The cut proceeds to draft release + eventual publish + mirror-on-cut without any red substrate checks along the way 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 - **#124** — check-self-bootstrap origin design - **#432** — check-self-bootstrap header sharpening ("pin-drift detection, NOT content validation") - **#445** — auto-re-pin on cut for single-click release UX (structural closer for Class 1; the self-heal mechanic for the unifying class) - **#442** — compose-time register-check filter on commit-subject → CHANGELOG (partial closer for a related sub-class) - **#452** — relocate self-referential fixture exclusion to `.register-allowlist` (Class 2 recurrence-retirement for that file) - **#453 / #454** — compose scaffolds all six standard sections (Class 3 fix; bootstrap trace in PR#447 comment #80816) - Empirical evidence from every substrate PR in the sprint (`PR#438`, `PR#443`, `PR#446`, `PR#447`) + every push:main following each merge ## Anchor Operator directive 2026-07-07 morning during v0.29.0 draft creation: > "In my opinion we should prioritize this topic to sort all those issues out ASAP to reliably have green builds — ideally after (or even during) the next cut." Filed by Bosun via `file-tracker` skill 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 `main` but couldn't reach the rolling recompose, which ran `release-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) 1. **Bake an rc tag from the fix-carrying `main`.** `repin.sh` baked `v0.30.0-rc.2` at `4d4a7bc` — tooling byte-identical to `main` (`git diff v0.30.0-rc.2 origin/main -- scripts/` empty), with a self-referential `BUILD_BAKED_TOOLKIT_REF='v0.30.0-rc.2'` so the reusable checks out its *own* scaffold-carrying tree. (`-rc.2` because a stale `-rc.1` predated the Bundles; preserved over a destructive delete.) 2. **Re-pin the consumer wrappers to the rc** (PR#455 — 5 wrappers, one line each, `@v0.29.0 → @v0.30.0-rc.2`; reviewed at 3691). Nothing new ships under the rc — it's `main`'s already-reviewed tooling. 3. **The recompose now runs the scaffold-carrying tooling.** Merging PR#455 → `push:main` → PR#447 recomposed at `071e3188` with all 6 sections (empties → `None.`), check 2 clean, register 0 hits, compose-verify green (reviewed at 3692). 4. **Merge → cut.** Operator merged PR#447 → the steady-state cut ran green → v0.30.0 draft release + auto-re-pin (`a19543a`, `@v0.30.0-rc.2 → @v0.30.0` via #445/#283) → publish → mirror-on-cut. ### Staggered bootstrap edges — the observed shape The sub-classes bootstrap on **independent** substrate-cadences, not synchronized: - **Class 1** (check-self-bootstrap) self-healed **at the re-pin** — PR#455 was the first 7/7-green substrate-touching PR of the sprint; the re-pin is post-bootstrap for its *own* class immediately. - **Class 3** (compose scaffold) self-healed **one cadence later** — at the PR#447 recompose, once the re-pinned reusable ran the scaffold. - **Steady-state green** landed at the cut itself (check-self-bootstrap push + release/decide + release/release all green on `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: 1. **Rolling release-prep PR at merge-time all green** — PR#447 recomposed at `071e3188`, check 2 clean + compose-verify green (review 3692). 2. **push:main after merge all green** — the 12:41 push:main ran check-self-bootstrap + release/decide+act + release all `success` (Class-1 self-heal held; no expected-red enumeration needed). 3. **Cut → draft → publish → mirror-on-cut all green** — draft release at 12:41:28 → operator published at **12:59:26** (`draft=false`, real `v0.30.0` tag @ `071e3188`) → **mirror-on-cut round 3 fired green**: two runs both `success` (`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). Tag `v0.30.0` @ `071e3188` (published 12:59:26), `v0.30.0-rc.2` @ `4d4a7bc` (rc bake). Trackers #452 (Finding B), #453/#454 (Finding A).
Author
Owner

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

"A single green cut could also be just luck."

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)

  • Multiple cuts observed all-green through the toolkit's own gates (Class 1 + Class 3 + register-check + compose-verify + downstream)
  • Observations span cross-substrate-work cycles, not just the immediate arc
  • Closes by default on v1.0.0 tag (natural gate closure); earlier close possible if multiple green cuts + no regression signal accumulates + operator signals fine to close early

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:

  1. #456 (A) design + implementation lands
  2. Several cuts observed all-green through post-(A) substrate
  3. #448 empirical evidence accumulates
  4. v1.0.0 tag → #448 closes naturally

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).

## 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 > "A single green cut could also be just luck." 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) - Multiple cuts observed all-green through the toolkit's own gates (Class 1 + Class 3 + register-check + compose-verify + downstream) - Observations span cross-substrate-work cycles, not just the immediate arc - **Closes by default on v1.0.0 tag** (natural gate closure); earlier close possible if multiple green cuts + no regression signal accumulates + operator signals fine to close early ### 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: 1. #456 (A) design + implementation lands 2. Several cuts observed all-green through post-(A) substrate 3. #448 empirical evidence accumulates 4. v1.0.0 tag → #448 closes naturally 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).
Owner

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):

Cut EP Fragment shape Bump Composition
v0.30.2 EP-1 single PATCH first post-(A) cut on floated substrate
v0.30.3 EP-2 single (#347) PATCH single-kind
v0.31.0 EP-3 bundled (#402 + #450) MINOR mixed-kind (changed + fixed → highest-bump-wins)
v0.32.0 EP-4 single (#435) MINOR single-kind (added → minor)

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:

  • single vs bundled fragment — EP-1/2/4 consume one fragment; EP-3 composes two.
  • patch vs minor bump — EP-1/2 are PATCH; EP-3/4 cross the MINOR boundary (VERSION minor-rollover + 0.Y.0 reset path).
  • single-kind vs mixed-kind composition — EP-3 exercises highest-bump-wins across changed + fixed (the precedence rule that makes v0.31.0 not v0.30.4); a same-kind streak never would.
  • rebase-across-a-cut nil-mutation (bonus axis) — #471 rebased across the v0.31.0 cut with byte-identical change-set carry (sha256-verified), confirming the between-cut float is stable enough that a cut doesn't perturb in-flight work.

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

## 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): | Cut | EP | Fragment shape | Bump | Composition | |---|---|---|---|---| | v0.30.2 | EP-1 | single | PATCH | first post-(A) cut on floated substrate | | v0.30.3 | EP-2 | single (#347) | PATCH | single-kind | | v0.31.0 | EP-3 | **bundled** (#402 + #450) | **MINOR** | **mixed-kind** (changed + fixed → highest-bump-wins) | | v0.32.0 | EP-4 | single (#435) | MINOR | single-kind (added → minor) | ### 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: - **single vs bundled fragment** — EP-1/2/4 consume one fragment; EP-3 composes two. - **patch vs minor bump** — EP-1/2 are PATCH; EP-3/4 cross the MINOR boundary (VERSION minor-rollover + `0.Y.0` reset path). - **single-kind vs mixed-kind composition** — EP-3 exercises highest-bump-wins across `changed` + `fixed` (the precedence rule that makes v0.31.0 not v0.30.4); a same-kind streak never would. - **rebase-across-a-cut nil-mutation** (bonus axis) — #471 rebased across the v0.31.0 cut with byte-identical change-set carry (sha256-verified), confirming the between-cut float is stable enough that a cut doesn't perturb in-flight work. 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
Author
Owner

Operator ratification — 2026-07-07: AC met, closing

Operator directive 2026-07-07: #448 verified, closing.

Three-part analysis chain (substrate-of-record)

The AC-met verdict is grounded in the three-part analysis this thread carries:

  1. AC-clarification (comment 80859, Bosun) — refined the original single-cut framing into "multiple cuts observed across substrate-work cycles; single green could be luck; evidence set adversarial to (A) being correct."
  2. Diversity-not-count analysis (comment 81078, Surveyor) — reframed the "several cuts" question from count-based to shape-based. Enumerated the four EPs' distinct cut-shapes and named the un-exercised MAJOR-bump shape as the natural v1.0.0-tag capstone.
  3. This ratification — operator accepts the diversity-of-shape reading and rules AC met.

Empirical evidence set (4 EPs on floated substrate)

EP Version Cut-shape
1 v0.30.2 Single-fragment, first exercise of floated substrate + #460 override in real cut path
2 v0.30.3 Cut after a feature (#347)
3 v0.31.0 Bundled 2-fragment fold, mixed-kind (#402 changed + #450 fixed), MINOR bump via highest-bump-wins composition
4 v0.32.0 Single-feature MINOR (#435), rebase-across-cut (PR#471) proven nil-mutation on #456 float

Plus mirror-on-cut validated across 7 rounds (Bug #2 mechanism firing event-driven, decoupled from cut-path).

The MAJOR-bump gap

v1.0.0 provides the missing major-bump cut-shape as the natural capstone evidence-point. AC empirically met NOW for the floated-substrate-reliability claim; v1.0.0 completes the shape-coverage as the tag process itself.

Closing.

## Operator ratification — 2026-07-07: AC met, closing **Operator directive 2026-07-07**: `#448` verified, closing. ### Three-part analysis chain (substrate-of-record) The AC-met verdict is grounded in the three-part analysis this thread carries: 1. **AC-clarification** (comment 80859, Bosun) — refined the original single-cut framing into "multiple cuts observed across substrate-work cycles; single green could be luck; evidence set adversarial to (A) being correct." 2. **Diversity-not-count analysis** (comment 81078, Surveyor) — reframed the "several cuts" question from count-based to shape-based. Enumerated the four EPs' distinct cut-shapes and named the un-exercised MAJOR-bump shape as the natural `v1.0.0`-tag capstone. 3. **This ratification** — operator accepts the diversity-of-shape reading and rules AC met. ### Empirical evidence set (4 EPs on floated substrate) | EP | Version | Cut-shape | | --- | --------- | ------------------------------------------------------------------------- | | 1 | v0.30.2 | Single-fragment, first exercise of floated substrate + `#460` override in real cut path | | 2 | v0.30.3 | Cut after a feature (`#347`) | | 3 | v0.31.0 | Bundled 2-fragment fold, mixed-kind (`#402` changed + `#450` fixed), MINOR bump via highest-bump-wins composition | | 4 | v0.32.0 | Single-feature MINOR (`#435`), rebase-across-cut (`PR#471`) proven nil-mutation on `#456` float | Plus mirror-on-cut validated across 7 rounds (Bug #2 mechanism firing event-driven, decoupled from cut-path). ### The MAJOR-bump gap `v1.0.0` provides the missing major-bump cut-shape as the natural capstone evidence-point. AC empirically met NOW for the floated-substrate-reliability claim; `v1.0.0` completes the shape-coverage as the tag process itself. Closing.
bosun closed this issue 2026-07-07 21:20:55 +02:00
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#448
No description provided.