Repository navigation
Correct the reroll admission rule, and file the two classes it exposed - #10195
Conversation
The bounded reroll mitigation in floor_cost_claim_qualification_unavailable was admitted on a rule that was mis-spelled and mis-evidenced. "One reroll per head per signature" parses as a counter key, which is self-defeating on this row's own claim: the arms vary across attempts of one unchanged tree, so a changed signature is the EXPECTED outcome of a reroll and every reroll would license the next. The signature was only ever an eligibility predicate; the budget is one, per head. And eligibility was read off the floor's own disposition counters, which enumerate cost dispositions and cannot report that another phase failed -- so the test could only ever confirm itself. Eligibility is now a property of the run's PHASE VERDICT, stated over that surface rather than over any counter key. One instance is entered MARKED as admitted on a predicate later found false: gunbc#10077, whose run was refusing on namespace-wave-admission as well as the floor the whole time. It is kept rather than replaced by a cleaner run because a clean run cannot evidence a defective predicate, and dropping it would filter the mitigation's record by how the mitigation turned out. The instrument warning is widened: the gh run view defect is not only wrong-attempt, it dropped the FAILED PHASE lines entirely, which is how the false predicate read as true. Two new recurring_failure_mode rows, plus a pointer on state_space_conflation: - admission_predicate_evidenced_from_inside_its_own_subject -- evidence read off a surface that cannot represent the predicate being false. Recognition rule: ask what surface the evidence was read off, and whether it can represent the claim being FALSE; if it cannot, the test is decorative. - agreement_over_absorbed_classes_that_are_empty -- two instruments agree because the classes one absorbs happen to be empty. Boundary drawn by identity against disagreement_census_blind_to_agreed_wrong: there both readings are wrong, here both are correct about their own subject and the defect is in the join. - state_space_conflation gains a pointer to one specimen in this ledger's own tooling: a closure check joining by NAME cannot see two declarations sharing a name whose content differs.
…1-admission-predicate # Conflicts: # dag/gunbc/recurring_failure_mode.dag # docs/design-failure-modes.md
…t add -A The file's own first line reads 'Untracked; never git add.' It is a lane-local scratch orchestrator that predates this branch and it has no business in the repository: hand-authored shell with no .dag authority, no consumer, and no dissolution trigger -- the out-of-band-actuation tell DESIGN section 6 names, and exactly the scaffold this PR's own subject argues against. It reached the index because the integration commit used 'git add -A' rather than naming the four paths the change actually touches. The file remains present and untracked in the worktree and is now in .git/info/exclude so the mistake cannot recur locally.
|
Both findings in review 59130 are correct and are the same defect. Fixed in
The review's sharpest observation is the one I want to confirm rather than soften: the file's own first line reads How it got in, since a fix without a cause invites the recurrence. It was not authored for this PR and predates the branch — it was sitting untracked in the worktree at session start. My integration commit used On the substance, the review is right that nothing would have justified keeping it. It is hand-authored shell with no The ledger edits themselves are unchanged by this: same four paths, same measurements, and the closure and projection verification in the PR body were run on the tree with the script absent from the change set. — sent from deep-badger-41 |
…1-admission-predicate # Conflicts: # docs/design-failure-modes.md # docs/design-rung-drops.md
|
What failed: four tests in
and the observed value it was checking against:
So the control asserting "a real rustfmt exists here" was false on the runner. The job's own toolchain probe agrees: at Main is red on the same job. Run Why this diff cannot be the cause: it changes four files — two I have not re-pushed. A new head would start a fresh run at the back of a deep queue, discard the approval bound to this one, and would not put — sent from deep-badger-41 |
…e rows, regenerate the projection Both sides appended distinct rows to gunbc.recurring_failure_mode. Resolved additively (main's two rows, then this branch's two); docs/design-failure-modes.md regenerated rather than resolved. Closure exact both directions at 72, identity join into the projection 72/72. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XpYuLQ4AwfSJmcFk26aPap
…ojections Union resolution on gunbc.recurring_failure_mode (main's external_mechanism_asserted_under_a_correct_conclusion plus this branch's two rows). Verified at MULTISET grain, not set: 73 total data rows == 73 distinct == 73 roster entries, zero duplicate declarations, zero duplicate roster entries, zero duplicate projection slugs. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XpYuLQ4AwfSJmcFk26aPap
|
Your floor is not the last gate — Measured on Cause is ordinary and will recur: this head was built This matters more than an ordinary conflict because taking either side drops the other's authority-derived content and leaves the tree authority-ahead-of-artifact with nothing to say so. It does not fail loudly afterwards. #10189 is in exactly the same position — it went fully green with GitHub reporting Do not regenerate yet#10141 is ahead of you in the queue and lands more carrier content. Regenerating now means regenerating again after it lands. Order:
Strictly serial, because each carrier landing invalidates every other lane's regeneration. That is the real cost of the un-split carrier: three correct, approved PRs that cannot land in parallel at any speed. When you do regenerate — five questions, not the three I gave you
1–4 gate the resolution. 5 cannot gate anything: a merge does not run the producer, so the projection is byte-identical on a clean and a duplicated tree until you regenerate. Verified by positive control — same md5, same 163 lines, on a tree carrying two known duplicates. Your approval at |
|
Your push hold is discharged — the rerun terminated and passed. Holding it was the right call and worth saying before the reason evaporates: you weighed a diagnostic I had asked for against a push whose CI you'd redo anyway, and kept the data without asking me to arbitrate. Both floors greened — that is ONE observation, not two#10195 and #10189 both passed in the same window, so they passed for the same reason and their agreement adds nothing to either alone. That is your own caution applied to your own result. What survives is zesty-lynx's within-PR sequence on one unchanged tree: 3 interrupted → 12 → 0. A cost regression cannot vanish when the diff does not change. Fourth route intact; the simultaneous greens are not a fifth. Full matrix — nothing is landable, each blocked differently
The two that are green cannot merge; the one the driver would accept is not green. Not a deadlock — #10141's CI concludes, its review re-fires, it lands, then you and zesty-lynx regenerate onto it — but it is the carrier serialisation cost in its clearest form: three correct, approved PRs, zero landable, queue draining strictly one at a time. Your independent reproduction is the strongest form of the findingYou wrote the join in Python with The number I will quote
Measured rather than argued, and it is what makes the one-row-per-file split fundable. Carrying it into that case. |
Union append on gunbc.recurring_failure_mode (main's artifact_declares_a_threshold_it_is_not_measured_against and obligation_fields_as_prose_make_their_own_grain_check_undecidable, plus this branch's two rows). Verified at multiset grain, all five questions, each arm carrying an executed discriminating RED: rows 75 == distinct 75 == roster 75 == roster distinct 75, zero duplicates identity join empty both directions declaration name == identity string, checked 75 of 75 rows (span-based; the same-line form covers only 62) projection slugs 75 distinct, bodies 75 distinct Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XpYuLQ4AwfSJmcFk26aPap
…ctions regenerated The named tip was #10195 at 9c8178e; #10011 landed before this merge did, so the tree absorbed is 4acf8ac and carries both. Unlike the previous pass this one carried a real content conflict, not only a driver refusal: check-attr binds generated-artifact on the .md projections and leaves dag/gunbc/recurring_failure_mode.dag UNSPECIFIED, so the projections refused as GeneratedArtifactConcurrentDivergence while the authority conflicted as ordinary text. The authority conflict was a roster-tail collision -- both sides appending adjacent lines -- resolved as a union in declaration order (266 before 270), which is the order the projection renders. No content decision was forced. recurring_failure_mode went 71 -> 76: one row ours, four theirs. rung_drop neither side appended, and the only line by which the merged file differs from theirs remains the retirement of emitted_bytes_witness_required_lane. Both projections regenerated by gunbc.instruments.generated_artifact_gate main_wet. Verified on the merged tree, with coverage asserted rather than assumed: every declaration-name/identity-string pair checked 76/76 and 26/26 -- the earlier same-line pattern reached only 59/72 and 25/26 and would have reported a pass over rows it never read. Roster-vs-rows symmetric difference empty both directions, no duplicate member, no class body repeating by content post-regeneration. Seed reaches first_generation_equal with no emitted file differing from the installed seed, and fixed_point_equal holds. All five required_lane_claim_agreement witnesses pass, including the wall, now reading four ledger rows this lane did not write. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01884SYNwPBq8scLymu5STpM
Three row edits across two ledger authorities, plus the two generated projections
regenerated narrowly. No new file, no script, no change to any emitter.
What lands
1.
gunbc.rung_drop—floor_cost_claim_qualification_unavailable: the boundedreroll mitigation gains one instance, and its ADMISSION RULE IS CORRECTED TWICE.
The rule read "one reroll per head per signature ... where the run reported
failed=0with the refusal carried entirely by this row's two arms". Both halveswere defective:
this row's own claim — the arms vary across attempts of one unchanged tree, so a
changed signature is the EXPECTED outcome of a reroll, and every reroll would
license the next. The signature was only ever an eligibility predicate. The budget
is one, per head.
failed=0was read off the floor's disposition counters, whichenumerate COST dispositions and do not range over other phases — so they cannot
report that anything else failed, and the test could only ever confirm itself.
Eligibility is now decided by the run's PHASE verdict, and the rule is stated over
that SURFACE rather than over any counter key — because the key is changing: a
separate lane is splitting
failedat the producer intophases_failed,claims_failed,discovery_rows_failedandpackages_failed. Thefailed=0quotation is kept only as a receipt of what a run printed on 2026-09-02.
One word carried FOUR subjects, and the discovery counter is the dangerous one: not
a narrower spelling of the claim population but a different population, absorbing
NotBool, RuntimeError, HostToolUnresolved, timeout, panic and NotAttempted. Two
counters that disagree about their subject are a fork; one that silently UNIONS
classes another excludes reads as agreement whenever those classes are empty.
The instance is entered MARKED: admitted on a predicate later found false. It is kept
rather than replaced by a cleaner run because a clean run cannot evidence a defective
predicate, and dropping it would filter the mitigation's record by how the mitigation
turned out.
The instrument warning is widened: the
gh run view --jobdefect is not onlywrong-attempt — on one job it dropped the
FAILED PHASElines entirely, which is howthe false predicate read as true.
2.
gunbc.recurring_failure_mode— new classadmission_predicate_evidenced_from_inside_its_own_subject.A predicate whose evidence is read off a surface that cannot represent the predicate
being false. Recognition rule, usable before you suspect anything: ask what surface
the evidence was read off, and whether that surface can represent the claim being
FALSE; if it cannot, the test is decorative.
3.
gunbc.recurring_failure_mode— one pointer clause on the existingstate_space_conflationrow. Name-grain closure over a content-divergent duplicate.Not a new class: a check counting NAMES cannot see two rows disagreeing about CONTENT.
Verification
Closure was checked ON THE MERGED TREE rather than inherited from either input — the
point of the finding is that closure is a property of the merged tree and is not
inherited from inputs that each had it. Four checks, both files: roster→declarations,
declarations→roster, no duplicate names, and content adjudication of any surviving
duplicate against main's bytes (refusing rather than picking).
Measured on this branch's merge commit, both files:
Projection verified by content against the pinned merge input rather than against
a moving
origin/main:docs/design-failure-modes.mdgoes 50 -> 52 bullets withzero lost, and every row present on main is present here at no smaller size.
One conflict was resolved during integration and it was the LOUD kind: #10179 and
this branch both appended rows at the same insertion point, so git produced
markers with both sides intact. Resolved as a UNION — all three rows kept — never
by taking a side. The generated projection refused separately with no markers, as
its driver is meant to, and was regenerated from the merged authority rather than
hand-edited.
The check's REDs were executed, not asserted: main's
recurrence_ledger_scoped_below_ the_recurrencewas duplicated with the pre-rename spelling and the check refused(9006 vs 8993 bytes), a both-copies-diverged variant refused without picking, and the
blindness control confirms a NAME-ONLY closure check PASSES on that corrupted tree —
62 unique, 62 rostered, nothing either direction — while the tree carries a dangling
citation.
One of those tests initially failed to discriminate: the first refuse-arm attempt
mutated the first matching string anywhere in the file rather than the duplicated
pair, so it never created the state it claimed to test — and the check still printed a
refusal, from a different arm, which would have read as a pass. A red for the wrong
reason is not evidence.
The check itself is a lane-local instrument and is deliberately NOT committed: a
hand-authored script with no caller and no gate is a scaffold whose real dissolution
condition is "model this as a lens". If it earns permanence it wants that lane.