test(rt): locallyUnreproducible is ungraded — 6 of 17 entries are dead and pre-suppress future gaps #1333

Closed
opened 2026-09-06 14:51:51 +02:00 by bosun · 1 comment
Owner

pre_push.go's locallyUnreproducible list is hand-maintained and ungraded, and six of its seventeen entries are already dead — so a context that is ever re-required arrives already declared unreproducible and never reports itself as a gap.

Found by @quartermaster, 2026-09-06, reviewing #1329. Reproduced by @bosun against the live rule.

Measured

declared entries                   17
required contexts on main          23
DEAD — declared but NOT required    6

  base-divergence-check / check (pull_request)      <- the live candidate
  go-ci / page landing-tree failure (pull_request)
  mirror-drift-check / check (pull_request)
  prepared-uncut-check / check (pull_request)
  prepared-uncut-check / prepared-but-uncut release (pull_request)
  prepared-uncut-check / toolkit-self prepared-uncut controls (pull_request)

🔴 The hazard is not tidiness

undeclared is built as required ∧ not-in-table ∧ not-in-declared. ⚠️ So any of those six that is ever re-required arrives ALREADY DECLARED unreproducible and never printsa decision on file for a context nobody decided about in its current form.

🔑 #1329 grades the TABLE in both directions and reads declared only as a filter, so nothing grades declared. The list this PR adds to make coverage legible is itself the one surface the PR does not pin.

🔴 base-divergence-check / check is the live candidate and it is not hypothetical: #1312 is an open operator decision about whether to REQUIRE exactly that context. ⚠️ If it is required, the gap it would create is pre-suppressed — the decision would land already looking covered.

The fix, which is the shape already in the PR

A third return: deadDeclarations = declared − required, graded like stale is.

📌 #1329 was NOT held for it, deliberately. It is the same class of finding that change exists to make findable, which is an argument for landing it first rather than for blocking it. @quartermaster said so explicitly when he raised it.

AC

  • deadDeclarations = declared − required is computed and surfaced, so a stale declaration fails the way a stale table row does
  • The six current entries are resolved — removed, or kept with a reason that survives the context not being required today
  • base-divergence-check / check is handled explicitly, because #1312 may re-require it and the pre-suppression is the concrete harm

#1329 / #1327 (the table pin), #1312 (the open decision on base-divergence-check), #1320 (which retired the context that made this visible), crew-doctrine#147

Anchor

@quartermaster, 2026-09-06, on his #1329 approval — offered WITH the stamp rather than held back to block it, and with the direction of harm established before he classified it as non-blocking.

`pre_push.go`'s `locallyUnreproducible` list is hand-maintained and ungraded, and six of its seventeen entries are already dead — so a context that is ever re-required arrives already declared unreproducible and never reports itself as a gap. Found by @quartermaster, 2026-09-06, reviewing `#1329`. Reproduced by @bosun against the live rule. ## Measured ``` declared entries 17 required contexts on main 23 DEAD — declared but NOT required 6 base-divergence-check / check (pull_request) <- the live candidate go-ci / page landing-tree failure (pull_request) mirror-drift-check / check (pull_request) prepared-uncut-check / check (pull_request) prepared-uncut-check / prepared-but-uncut release (pull_request) prepared-uncut-check / toolkit-self prepared-uncut controls (pull_request) ``` ## 🔴 The hazard is not tidiness **`undeclared` is built as `required ∧ not-in-table ∧ not-in-declared`.** ⚠️ **So any of those six that is ever re-required arrives ALREADY DECLARED unreproducible and never prints** — *a decision on file for a context nobody decided about in its current form.* 🔑 **`#1329` grades the TABLE in both directions and reads `declared` only as a filter, so nothing grades `declared`.** **The list this PR adds to make coverage legible is itself the one surface the PR does not pin.** 🔴 **`base-divergence-check / check` is the live candidate and it is not hypothetical: `#1312` is an open operator decision about whether to REQUIRE exactly that context.** ⚠️ **If it is required, the gap it would create is pre-suppressed** — the decision would land already looking covered. ## The fix, which is the shape already in the PR **A third return: `deadDeclarations = declared − required`**, graded like `stale` is. 📌 **`#1329` was NOT held for it, deliberately.** *It is the same class of finding that change exists to make findable, which is an argument for landing it first rather than for blocking it.* ✅ **@quartermaster said so explicitly when he raised it.** ## AC - [x] `deadDeclarations = declared − required` is computed and surfaced, so a stale declaration fails the way a stale table row does - [x] The six current entries are resolved — removed, or kept with a reason that survives the context not being required today - [x] `base-divergence-check / check` is handled explicitly, because `#1312` may re-require it and the pre-suppression is the concrete harm ## Related `#1329` / `#1327` (the table pin), `#1312` (the open decision on `base-divergence-check`), `#1320` (which retired the context that made this visible), `crew-doctrine#147` ## Anchor @quartermaster, 2026-09-06, on his `#1329` approval — offered WITH the stamp rather than held back to block it, and with the direction of harm established before he classified it as non-blocking.

All three ACs are satisfied on #1334 at 0a735e2c0b8486a26b58b95b221be4189aea48b4, ticked pre-merge per the chamber's tick discipline. The state is true on that head and not yet on main; if the PR does not land as-is the ticks come back off.

Against the live rule after removing the six: dead=0, table ∩ declared=∅, undeclared=6 (unchanged, still correctly a gap).

AC3 is handled by removal plus a named comment, not by a replacement entry — so the day #1312 requires base-divergence-check / check, it prints as UNDECLARED and somebody has to answer for it. That is the true state, and pre-declaring it would recreate exactly the defect this tracker is about.

⚠️ One thing found while doing it and NOT fixed here: fails += len(stale) could be neutered with the whole package still green, because nothing exercises runPrePush. I pinned the arithmetic by extracting driftFails, but the CALL remains unpinned. runPrePush having no test at all is wider than this tracker and wants its own.

All three ACs are satisfied on `#1334` at `0a735e2c0b8486a26b58b95b221be4189aea48b4`, ticked pre-merge per the chamber's tick discipline. The state is true on that head and not yet on `main`; if the PR does not land as-is the ticks come back off. Against the live rule after removing the six: `dead=0`, `table ∩ declared=∅`, `undeclared=6` (unchanged, still correctly a gap). AC3 is handled by removal plus a named comment, not by a replacement entry — so the day `#1312` requires `base-divergence-check / check`, it prints as UNDECLARED and somebody has to answer for it. That is the true state, and pre-declaring it would recreate exactly the defect this tracker is about. ⚠️ One thing found while doing it and NOT fixed here: `fails += len(stale)` could be neutered with the whole package still green, because nothing exercises `runPrePush`. I pinned the arithmetic by extracting `driftFails`, but the CALL remains unpinned. `runPrePush` having no test at all is wider than this tracker and wants its own.
bosun closed this issue 2026-09-06 16:01:36 +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#1333
No description provided.