Skip to content

Restore resolution: floor_cost_basis_boundedness_stall uses the current trigger carrier - #10608

Merged
briansrls merged 2 commits into
mainfrom
work/guarantee-stall-carrier-swap
Sep 5, 2026
Merged

briansrls merged 2 commits into
mainfrom
work/guarantee-stall-carrier-swap

Conversation

@gunbai-bot

@gunbai-bot gunbai-bot Bot commented Sep 5, 2026 •

Copy link
Copy Markdown
Contributor

Main does not resolve today. gunbc.guarantee_stall.roster refuses with type mismatch: expected 'Product(NextRungTrigger)', got 'Primitive(String)' at floor_cost_basis_boundedness_stall. Every branch that merges main pays for it.

One file, one field, converted to the constructor the carrier now requires — the same climbs_when(capability: …) that 31 of the 33 sibling rows already use.

This is not a "no semantic change" edit. It is a representation and type-correctness repair preserving the row's substantive capability requirement: an incompatible String initializer becoming a product construction is compiler-observable, which is the entire point of making it.

The evidence: a paired receipt at the real subject

The strongest thing here is a real type refusal at the real initializer, followed by the real fold returning true. Compiler built in-session from current source (cargo build --release -p v1-compiler --bin gunbc), self-reporting gunbc 72bad21b2e…-dirty, dirty only because the reproducer swaps this one file between arms. Same argv both arms:

gunbc run --source-root dag --source-root src/v2 \
  --entry dag/test/claim/guarantee_stall_witness_test.dag \
  --function every_live_stall_names_a_next_rung_trigger

That entry folds all_guarantee_stalls, so it reaches the actual roster closure and the actual initializer rather than a fixture standing in for them.

  • BEFORE (this row at main's bytes, candidate tree otherwise): resolve failed, cause floor_cost_basis_boundedness_stall.dag:70:22: type mismatch: expected 'Product(NextRungTrigger)', got 'Primitive(String)'.
  • AFTER: returned true, not ProcessExit — the fold completed and the predicate held.

A must-fail argv control was run first and failed; that is supporting, not the discriminator.

On the receipt's compiler SHA, since a reader will notice it differs from the head. It was built from 72bad21b2e; the head is 02605c5b35, whose sole parent is 72bad21b2e, whose only changed file is this row, and whose every changed line is an annotation. Compiler, witness, roster, carrier, import, conversion and capability literal are all unchanged, so the finding carries forward and a rebuild merely to obtain a newer version label would establish nothing further.

A venue disclosure, which is causal rather than evidential. The remote runner cannot execute gunbc at all — no cgroup memory limit binds it, so HostBudgetUnreadable refuses before the row is type-checked, identically on both arms. Two identical preflight refusals establish nothing either way; this is recorded so the unusable experiment is not later mistaken for a result, and so the next lane does not pay the same cost.

What the ordering establishes, and what it does not

The carrier landed first: 86be37f355 (#10582) at 17:21:02 already declared next_rung_trigger: NextRungTrigger and supplied climbs_when. This row landed 74 minutes later, 45074b4e9c (#10281) at 18:35:47, spelling a bare String. git merge-base --is-ancestor answers YES carrier-before-row and NO the other way. An earlier draft had this backwards.

So #10582 did not strand this row, which landed later — and that is all the ordering establishes. It says nothing about whether every other constructor was migrated correctly, and it supports no conduct claim in either direction: commit order establishes neither fault nor its absence without branch and review context, and this repair needs no attribution investigation to be correct.

The incident, at its measured grain

After the product carrier landed, this old-format declaration was added to main. The examined required run succeeded for its selected work while all eleven roster-consuming witnesses were explicitly declined before preparation and not executed. That success did not establish that this declaration satisfied the current carrier. This conversion repairs the initializer, not admission.

Read from the artifact rather than inferred: the required-floor-disposition TSV (artifact 9975676354, run 33986383584 at 2f8819b891, checked against its published SHA-256) carries all eleven identities of test.claim.guarantee_stall_witness_test as declined_outside_gate_closure / not_executed. The narrowing is gunbc.recurring_failure_mode.preparation_membership_derived_from_the_execution_selector; this PR mints no second wording for it.

One explanation is withdrawn and one measured fact is not, because an earlier draft collapsed them. WITHDRAWN: "the roster is enumerated somewhere the floor does not compile" — inadequate, since the witnesses exist and consume the roster through live folds. NOT WITHDRAWN: those witnesses were excluded from preparation and did not execute. The witnesses existing refutes only the claim that nothing reaches the roster.

Why the green checks are not the evidence

The required lanes do not reach this closure, which is why they were green before this repair and after it. required-witnesses-build on main at 2f8819b891 reported success with this exact type error present. Compiling the declaration of NextRungTrigger does not establish that an initializer using it was checked. So the repair rests on the paired receipt above; CI's greens are consistent with it rather than evidence for it.

Verification of the conversion itself

Capability text byte-identical at 321 characters; awaiting: [] discards nothing, since the original trigger carried no delivering-lane provenance to lose.

What this does not do

Landing this closes nothing about admission. It restores resolution, and the hole that let an old-format declaration land stays exactly as open as it is now: does admission validate an incoming declaration against the carrier current at placement? A clean merge and an active author do not establish compatibility with an intervening authority change.

It is also not an argument for compiling everything when the selector is uncertain — that is the absorbing fallback, denominated in the corpus rather than the change.

🤖 Generated with Claude Code

https://claude.ai/code/session_01RvMEJFpYsy55NRdJ1Az4Vd

…rier

MAIN DOES NOT RESOLVE TODAY. gunbc.guarantee_stall.roster refuses with
'type mismatch: expected Product(NextRungTrigger), got Primitive(String)' at
floor_cost_basis_boundedness_stall. Every branch that merges main pays for it.

THE ORDER, MEASURED IN BOTH DIRECTIONS BECAUSE MY FIRST READING HAD IT BACKWARDS.
The carrier landed FIRST -- 86be37f (#10582) at 17:21:02 already declared
next_rung_trigger: NextRungTrigger and supplied climbs_when. The row landed
74 minutes later, 45074b4 (#10281) at 18:35:47, spelling a bare String.
git merge-base --is-ancestor answers YES carrier-before-row and NO the other way.
So #10582 stranded nothing and this is NOT a migration that missed a caller: an
old-format declaration landed onto a carrier that had already changed.

THE INCIDENT IS DENOMINATOR LOSS, NOT A LYING GATE. The required-floor-disposition
TSV (artifact 9975676354, run 33986383584 at 2f8819b, checked against its
published SHA-256) carries all ELEVEN identities of guarantee_stall_witness_test
as declined_outside_gate_closure / not_executed. The floor reported honestly, per
identity, that they did not run; the AGGREGATE reported SUCCESS over a population
that had already excluded them. Discovering an identity so it can receive a
disposition is not the same operation as preparing and executing its dependency
closure. The narrowing is
gunbc.recurring_failure_mode.preparation_membership_derived_from_the_execution_selector.

THE CONVERSION IS MECHANICAL AND VERIFIED AS SUCH, not asserted: the capability
text is byte-identical at 321 characters, and awaiting: [] discards nothing --
the original trigger carried no referent provenance. Before/after through the
SAME compiler route and the same binary (md5 bf014f57, built 2026-09-04, which
PREDATES this tree and is not claimed to be main's current compiler): the bad
initializer refuses with the diagnostic above, the converted row resolves with
zero resolve errors. Because both readings used one binary, its revision cannot
explain the difference.

LANDING THIS CLOSES NOTHING ABOUT ADMISSION. It restores resolution. The question
it leaves open is sharper than the one I started with and no census at the
carrier's own PR could have answered it: does admission validate an incoming
declaration against the carrier current at placement? A clean merge and an active
author do not establish compatibility with an intervening authority change.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RvMEJFpYsy55NRdJ1Az4Vd

@briansrls briansrls left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

REQUEST_CHANGES at 72bad21. The focused carrier repair is the right scope. This is a bounded hold for the newly added incident account and the claimed verification boundary, NOT a demand to solve general admission, widen the floor, or add a CI job.

CREDITED: the inspected diff preserves the complete capability literal, imports climbs_when, and constructs the NextRungTrigger the current carrier requires. climbs_when supplies awaiting: []; no delivering-lane provenance is visible in the original trigger to discard. The domain obligation is unchanged. This is nevertheless a compiler-semantic repair (an incompatible initializer becomes a product construction), not an annotation-only/no-semantic-change edit. The same-binary before/after reported in the body is useful evidence and honestly discloses that the September 4 binary predates the candidate. I did not independently run that reproducer.

R1 — the permanent annotation contradicts the supported explanation and overstates its scope. Its opening correctly distinguishes witness dependency/discovery from preparation. But the later 'TWO EXPLANATIONS ... BOTH ... WITHDRAWN' paragraph says that enumeration outside the floor's compilation was 'refuted by the witnesses existing, consuming it through live folds, and being reported per identity.' Those facts do NOT refute exclusion from preparation; the comment itself then says they were discovered and declined, never prepared. Withdraw 'nothing reaches/imports the roster' or an unused-import explanation, not the demonstrated discovery-versus-preparation distinction.

The claim 'What is wrong is that an AGGREGATE reported SUCCESS over a population that had already excluded them' also needs its contract stated. Scoped aggregate success plus explicitly not-executed witnesses is not by itself a false aggregate verdict. The established defect is the missing required coverage for the incompatible declaration, and the invalid inference from scoped green to corpus-wide/current-carrier validity. Preserve that incident without alleging that strict preparation accepted a wrong type, or that an aggregate failed to cover the population it actually promised to judge. Discovery, preparation admission, and execution selection must not all be called 'the admitted set'. This correction belongs in both the source annotation and the PR body.

Finally narrow '#10582 stranded nothing' to '#10582 did not strand THIS row: it landed later.' The ancestry does not establish that every other constructor was migrated correctly. Likewise the body's 'this row's author did nothing wrong, and the ordering says so' is not established by commit order; neither guilt nor innocence follows without the branch/review context. No attribution investigation is needed for this repair: delete that unsupported conclusion and retain the scoped chronology.

R2 — the asserted build-lane coverage does not hold in this candidate's own receipt. I inspected run 33990451798, attempt 1, exact head above, including build job 101371626316. The four jobs build/floor/heal/witnesses succeeded. In the build's final module census, gunbc.guarantee_stall (the TYPE CARRIER) is in judged-module-identities, but gunbc.guarantee_stall.floor_cost_basis_boundedness_stall (the CHANGED INITIALIZER) and gunbc.guarantee_stall.roster are in admitted-module-identities and unresolved-module-identities, not judged-module-identities. cross-process-content-judged-module-identities is empty. Therefore build green is not the proposed evidence that this row's closure was content-judged.

This is an evidence-scope finding, NOT a claim that the repaired initializer fails. At this same head, src/v1/stage0/src/declaration_index.rs::modules_unresolved_by_lane computes admitted_modules.difference(content_judged_modules). 'Unresolved' here is the explicit accounting complement, not a fresh typechecker diagnostic. I am also not claiming that the build receipt exhausts every possible route in other jobs.

The body currently supplies a differential with binary md5 prefix bf014f57, built 2026-09-04, explicitly not claimed as the current compiler. Holding the binary fixed controls the producer across that pair; it does not by itself establish that the producer/input pair is appropriate to the candidate and the carrier current at placement. Supply the previously requested bounded before/after through the relevant initializer/roster closure, bound to the candidate source and an identified appropriate compiler. Running the existing reproducer with the candidate/current-source compiler is the direct route; an already-existing candidate-bound receipt that actually reaches this subject can also discharge it. Do not substitute another aggregate green for subject coverage. No whole-corpus compile, new harness, or general admission repair is requested.

Release condition: correct the bounded incident account, establish the relevant producer/input execution receipt, then obtain final-head checks and review. The wrapper must still preserve the capability and honest awaiting value. General current-at-placement admission remains open and is NOT a prerequisite to merging this focused repair once these obligations are met. No approval or merge performed.

gunbai-bot Bot pushed a commit that referenced this pull request Sep 5, 2026
The same row was edited by both PRs with DIFFERENT comment text -- +26 here and
+66 on #10608 -- which is two authorities for one fact. Worse than a plain
conflict: whichever landed first, the other conflicts, and if this PR landed
first the SHORTER, UNCORRECTED wording would reach main while the corrected one
waited behind an operator adjudication.

The carrier repair was never part of this PR's subject. It rode along only
because this branch could not resolve main without it. That is exactly the
coupling a standalone PR exists to remove.

This branch may now be unresolvable for local work until #10608 lands, which is
expected and is not a reason to re-add it: a PR whose subject is correct and
whose branch needs another PR first is an ordinary dependency.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RvMEJFpYsy55NRdJ1Az4Vd
…he attribution

Four wording repairs to this row's annotation. The conversion itself is unchanged
and the capability text stays byte-identical.

1. A CONTRADICTION IS RESOLVED BY SPLITTING TWO CLAIMS AN EARLIER DRAFT COLLAPSED.
   WITHDRAWN: "the roster is enumerated somewhere the floor does not compile" --
   inadequate, because the witnesses exist and consume the roster through live folds.
   NOT WITHDRAWN, because it is measured from the artifact: those eleven witnesses
   were declined before preparation and did not execute. The witnesses existing
   refutes only the claim that nothing reaches the roster; it does not refute their
   exclusion.

2. The aggregate accusation is replaced by the narrower measured statement. A run
   succeeding for its SELECTED work did not establish that this declaration
   satisfied the current carrier. DISCOVERY-ADMITTED, PREPARED and
   SELECTED-FOR-EXECUTION are three populations and must not silently become one.

3. "gunbc#10582 stranded nothing" is localised to "DID NOT STRAND THIS ROW, WHICH
   LANDED LATER" -- the ordering measurement covers this row and says nothing about
   whether every other constructor was migrated correctly.

4. The attribution heading is removed entirely. Commit order establishes neither
   fault nor its absence without branch and review context, and this repair needs
   no attribution investigation to be correct.

Also: the edit is no longer described as "no semantic change". It is a
representation and type-correctness repair preserving the row's substantive
capability requirement -- an incompatible String initializer becoming a product
construction is compiler-observable, which is the point of making it.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RvMEJFpYsy55NRdJ1Az4Vd
@gunbai-bot

gunbai-bot Bot commented Sep 5, 2026

Copy link
Copy Markdown
Contributor Author

Four wording fixes applied at 02605c5b35, and the receipt you asked for.

THE RECEIPT, WITH THE PRODUCER IDENTIFIED. Compiler built in this session from CURRENT SOURCE — cargo build --release -p v1-compiler --bin gunbc at branch head 72bad21b2e; ./target/release/gunbc --version self-reports gunbc 72bad21b2e311bbaf3ade92243c5314e7a8e7bab-dirty, the -dirty being the reproducer swapping this one file between arms and nothing else. Argv, identical on both arms:

gunbc run --source-root dag --source-root src/v2 \
  --entry dag/test/claim/guarantee_stall_witness_test.dag \
  --function every_live_stall_names_a_next_rung_trigger

That entry folds all_guarantee_stalls, so it reaches the actual roster closure and the actual initializer rather than a fixture standing in for them.

BEFORE — this row at main bytes, candidate tree otherwise:

error: resolve failed for dag/test/claim/guarantee_stall_witness_test.dag
  cause: .../floor_cost_basis_boundedness_stall.dag:70:22: error: type mismatch:
         expected 'Product(NextRungTrigger)', got 'Primitive(String)'

AFTER — repaired row: returned true, not ProcessExit, i.e. the fold completed and the predicate held. A must-fail argv control was run first and failed, so the binary under test is the one being reached.

WHERE THIS RECEIPT DID NOT COME FROM, because I tried there first. The remote runner cannot execute gunbc at all: no cgroup memory limit binds it, so HostBudgetUnreadable fires and refuses BEFORE and AFTER identically. That pairing would have discriminated nothing, and I am recording it rather than quietly relocating the run.

THE FOUR FIXES.

  1. The contradiction is resolved by splitting two claims an earlier draft collapsed. WITHDRAWN: "the roster is enumerated somewhere the floor does not compile" — inadequate, since the witnesses exist and consume the roster through live folds. NOT WITHDRAWN: those eleven witnesses were declined before preparation and did not execute. The witnesses existing refutes only "nothing reaches the roster"; it does not refute their exclusion.
  2. The aggregate accusation is gone, replaced by your text verbatim. DISCOVERY-ADMITTED, PREPARED and SELECTED-FOR-EXECUTION are three populations.
  3. "stranded nothing" → "DID NOT STRAND THIS ROW, WHICH LANDED LATER".
  4. The attribution heading is removed entirely; the comment now makes no attribution claim.

Also dropped: "no semantic change". It is a representation and type-correctness repair preserving this row's substantive capability requirement — an incompatible String initializer becoming a product construction is compiler-observable, which is the whole point of making it.

ON THE GREENS. The required lanes do not reach this closure, which is why they were green before this repair and after it. required-witnesses-build on main at 2f8819b891 reported success with this exact type error present. So the repair is established by the paired local resolution receipt above; CI's greens are CONSISTENT with it, not evidence for it.

URGENCY, IN ITS MEASURED FORM. Only my two branches carry the carrier and are blocked on this today. session/sleek-pike-96 (behind 55) and session/quick-heron-85 (behind 67) do not carry it and would hit this when they merge main.

— sent from jolly-badger-374

@gunbai-bot

gunbai-bot Bot commented Sep 5, 2026

Copy link
Copy Markdown
Contributor Author

Release conditions for review 5123041616 are met at 02605c5b35. Requesting re-adjudication — I am not dismissing the finding, and a push does not discharge it.

Worth stating first: this review and an independent read arrived at the same two findings separately. The fixes below were made in response to the independent read before this review was posted, and the two agree item for item — including the parts that correct me. That is corroboration reached by two derivations, not one restated.

R1 — the annotation. The contradiction is now an explicit split rather than a collapsed paragraph:

  • Withdrawn: "the roster is enumerated somewhere the floor does not compile" — the witnesses exist and consume the roster through live folds, so that explanation was inadequate.
  • Not withdrawn: the discovery-versus-preparation distinction, which is measured from the artifact.
  • The aggregate claim is replaced with the bounded form and no longer alleges a false verdict: "The examined required run succeeded for its selected work while all eleven roster-consuming witnesses were explicitly declined before preparation and not executed. That success did not establish that this declaration satisfied the current carrier. This conversion repairs the initializer, not admission." Discovery, preparation admission, and execution selection are no longer one "admitted set".
  • Chronology narrowed: "gunbc#10582 did not strand this row, which landed later — and that is all the ordering establishes; it says nothing about whether every other constructor was migrated correctly."
  • Attribution deleted and replaced by its own refusal: "It makes no claim about anyone's conduct: commit order establishes neither fault nor its absence without branch and review context."
  • Description corrected to "a representation and type-correctness repair preserving this row's substantive capability requirement," explicitly not a no-semantic-change edit. Both annotation and body carry these.

R2 — the evidence-scope finding is correct, and the claim it lands on was mine. I argued that four green checks sufficed because the build lane compiles this closure. Your module census settles it: gunbc.guarantee_stall (the type carrier) is judged, while floor_cost_basis_boundedness_stall (the changed initializer) and guarantee_stall.roster are admitted-and-unresolved, with cross-process-content-judged empty. I had distinguished the eleven unprepared witnesses from the build and then failed to distinguish the carrier the build judged from the initializer it left unjudged. I no longer claim the checks test the repair — only that they are consistent with it.

The subject-reaching receipt now exists, replacing the September-4 binary: compiler built in-session from current source at the branch head, self-reporting its own SHA, dirty only because the reproducer swaps the one file under test. Identical argv both arms, entry every_live_stall_names_a_next_rung_trigger, which folds all_guarantee_stalls and therefore reaches the real roster closure and the real initializer rather than a fixture. Before (main bytes for the row, candidate tree otherwise): resolve failed at floor_cost_basis_boundedness_stall.dag:70:22, type mismatch: expected 'Product(NextRungTrigger)', got 'Primitive(String)'. After: returned true, not ProcessExit. A must-fail argv control ran first.

A disclosure the author made rather than hid: the remote runner cannot execute gunbc at all — no cgroup memory limit binds it, so HostBudgetUnreadable refuses identically before and after. A paired receipt captured there would have shown two reds and discriminated nothing while the arms genuinely differ. It is recorded in the PR rather than the run being quietly relocated.

One correction to my own urgency argument, since it appears in this PR's history: I wrote "two lanes cannot merge main." Measured — only this author's two branches carry the current carrier and are blocked now; the other two lanes are 55 and 67 commits behind and would hit it only on merging main. My error ran toward more urgency, which is the direction that suited what I was arguing for.

Final-head state: 02605c5b35, CLEAN, all four checks success. The duplicate edit of this same row on #10545 has been dropped, so no second authority for it remains open. The general current-at-placement admission question stays open and is not claimed closed by this.

@briansrls briansrls left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Re-review at exact head 02605c5. R2 CLOSED for this bounded repair; R1's source-annotation portion CLOSED. R1 remains OPEN only on the live PR description, which has not been synchronized. No approval or merge authorization in this comment; prior review 5123041616 is not dismissed because that remainder is still present.

R2 closure: I read the author-recorded execution receipt in issue comment 5554994048 and inspected the real entry/roster at this head. every_live_stall_names_a_next_rung_trigger calls every_stall_names_a_trigger on all_guarantee_stalls and also rejects the empty-trigger control; the real roster imports and includes floor_cost_basis_boundedness_stall. The recorded pair holds the compiler and argv fixed, restores main bytes for this row only in the BEFORE arm, reports the relevant Product(NextRungTrigger)/Primitive(String) refusal at that initializer, and reaches returned true in the repaired AFTER arm. This is the subject-reaching evidence that the four aggregate greens did not supply. I inspected the record and source; I did NOT independently execute that pair.

Producer binding is precise, not restated as a final-head build: the receipt identifies a compiler built from 72bad21, self-reporting that SHA with -dirty attributed to the single-file reproducer. I inspected commit 02605c5: its sole parent is that SHA, its complete changed-file population is this same row, and every changed line is an annotation. The compiler implementation, witness, roster, carrier, constructor import, initializer conversion and capability literal are unchanged. That inspected delta is sufficient to carry the bounded type-correctness finding to 02605c5; I am not demanding another compiler build or witness run solely to change the version label. This is not a claim of byte-identical trees or universal annotation inertness.

The disclosed remote HostBudgetUnreadable pair is correctly excluded from repair evidence: both attempts stopped before the discriminating subject. It improves the causal account but is not another successful verification and proves nothing about general admission.

R1 source closure: the current annotation scopes the chronology to THIS later-added row, disclaims attribution, describes the compiler-observable representation/type repair, and replaces the aggregate accusation with the selected-work versus unestablished-current-carrier statement. Its final explicit clarification distinguishes 'nothing reaches the roster' from the measured preparation exclusion. I credit that clarification and am not requesting another source rewrite for this wording.

REMAINING R1 — PR BODY, NOT THE DIFF OR A NEW COMMENT. I reread the live body through both get_pr_info and GET /repos/gunb-ai/gunbc/pulls/10608, then refreshed it before this review. It STILL contains the heading 'This row’s author did nothing wrong, and the ordering says so', '#10582 stranded nothing', and the allegation that what is wrong is an 'aggregate reported SUCCESS over a population that had already excluded them'. Its Verification section still presents the September 4 / bf014f57 producer instead of identifying the new source-built receipt. Comment 5554994048 carries the corrections; the actual body does not. Grepping the source diff cannot establish that this separate mutable description was updated.

The remaining correction is ONLY to synchronize the top-level PR description with the already-reviewed annotation and receipt: remove the attribution and universal migration claim, use the measured scoped incident statement, and identify the 72bad21 source-built differential in comment 5554994048 plus its annotation-only carry to this head. The earlier bf014f57 observation may be removed or explicitly retained as superseded historical evidence, not as the current verification basis. Keep 'repairs the initializer, not admission'. No source commit, new test, floor widening, new CI job, or general admission implementation is requested for this metadata correction. Do not rewrite old commits just to remove historical wording; ensure the eventual landing summary does not reintroduce it.

Other inspected facts: run 33993945732, attempt 1, is bound to this full head. required-witnesses-build (101380953565), required-witnesses-floor (101380953460), heal-generated-artifacts (101380953632), and witnesses (101384570183) all succeeded. The complete current changed-filename list for #10545 no longer includes this initializer file. Those observations are not a replacement for the subject-reaching receipt and not a universal census of every possible competing writer. I did not perform local merge-tree composition or any ref mutation.

Urgency: the corrected report distinguishes the author's two presently blocked branches from two branches that would encounter the defect after integrating main. I have not independently remeasured those branches' 55/67 behind counts, and no count is needed for this disposition. Prompt repair is valuable; the claimed number of blocked lanes is not an admission premise.

Finding-level result: R2 closed, R1 source closed, R1 body synchronization outstanding. Ordinary final placement checks and general admission standing remain separate. No new substantive defect is alleged in the constructor repair.

@gunbai-bot

gunbai-bot Bot commented Sep 5, 2026

Copy link
Copy Markdown
Contributor Author

All release conditions for review 5123041616 are now met at 02605c5b35, including the PR description, and the head has not moved. Re-adjudication requested — I am still not dismissing the finding.

The body is synchronized. It previously carried the original of every claim the annotation had already corrected, which mattered because squash-merge makes the body the commit message: landing it would have written the attribution inference, the unlocalised chronology, the aggregate overreach and a superseded differential into main's permanent history, in the commit for a change whose subject is a comment about not overstating what evidence establishes. Verified by grep — did nothing wrong, stranded nothing, aggregate reported SUCCESS, nobody can rebut, bf014f57 all return zero. It was edited with gh pr edit, so there was no push and the four green checks at this head are untouched.

The receipt now leads. The remote HostBudgetUnreadable pair is labelled a causal venue disclosure and explicitly not positive evidence — two identical preflight refusals establish nothing either way. The must-fail argv control is labelled supporting rather than the discriminator; the discriminator is the real type refusal at the real initializer followed by the real fold returning true. The compiler-SHA provenance is stated in the body, so a reader who notices the receipt was built from 72bad21b2e finds the answer rather than reopening R2.

One correction to this thread's record, against ourselves. Earlier I was told the build prints only six keys and that admitted-module-identities / unresolved-module-identities are not among them, which would have made R2's citation unreproducible. I checked claim_executor.rs before editing anything: those two lines print unless source_root_ingest_module_identities_for_ci returns Err, and that arm pushes a phase failure — which would not have left the build green. The author then chased it to the bottom and retracted: the job log ends at cross-process-content-judged-module-identities, with no step-completion or cleanup lines, which is the signature of a truncated capture rather than of code that did not run. Re-fetching the whole run to a file surfaced four further keys. The block itself landed in e64dfc2e06 (#9899), four days before the run, so "the code is newer than the run" is not the explanation either.

R2's readings survive that, and the reason is worth recording. Had the truncation cut mid-line, the membership readings would themselves be artifacts of the cut. It did not: the judged-module-identities line closes its bracket, so it is complete at 1224 identities and the truncation dropped whole lines after it. gunbc.guarantee_stall present, floor_cost_basis_boundedness_stall and guarantee_stall.roster absent, cross-process-content-judged empty. One residual stated honestly: nobody in this thread has seen those two lines print. The control-flow argument is sound but it is an inference, not a reading, and the way to obtain the printed lines is the raw job-log download rather than gh run view.

Final state: 02605c5b35, CLEAN, all four checks success, no second authority for this row open anywhere. The general current-at-placement admission question remains open and is not claimed closed by this repair.

briansrls pushed a commit that referenced this pull request Sep 5, 2026
…r, and the production path is unmeasured on all 28 (#10545)

* Step 0 calibration: what a corpus run's silence about a resolution arm is not

std.reference_binding_observation pays to preserve six typed index-build
refusals as distinct arms of StructuralBindingResolution, and its header says
they are "never collapsed". This measures whether that preservation survives to
a consumer, on controlled fixtures, BEFORE the namespace cut's corpus run cites
the instrument -- because a cell that never fires and a cell that fires and
finds nothing are indistinguishable in a corpus report, and only a calibration
run separates them.

The matrix is 4 observation kinds x 7 resolution arms, and its axes come from
the vocabulary std DECLARES, bound by the total matches arm_of_resolution and
kind_of_observation: an arm added upstream makes this module fail to compile
rather than silently shrink the denominator. A denominator derived from the
cases the instrument managed to produce would report itself complete by
construction.

Each cell carries three separately-sourced facts rather than one verdict word:
a four-valued consumer standing, the measured provenance distinguishability,
and a four-valued production standing. The last is UNSUPPORTED BY THIS ROUTE
for every cell with the missing input named -- this census hands the consumer a
constructed resolution, so it never executes the production path and obtains no
evidence about producibility. That is a statement about the route, not about
the world, and it is deliberately weaker than "unreachable".

The measured result: only the four StructuralBindingResolved cells are
provenance-distinguished. The other 24 render byte-identically to each other
AND to a resolved-but-non-matching comparator, because
binding_outcome_from_resolution maps every non-Resolved arm to Absent and each
consumer arm maps Absent to the same refused(capability, failure) as a
structural non-match. The instrument writes the full matrix and then refuses --
the stopped-line audit of DESIGN section 5.

The controls live in the witness corpus rather than beside the instrument,
because test fn rows under dag/gunbc/instruments are discovered by nothing and
an inert lens is itself a lie.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RvMEJFpYsy55NRdJ1Az4Vd

* The refusal path is the oracle; 28 was a measurement compared to itself

no_cell_is_sound_and_the_instrument_refuses asserted that exactly 28 cells were
unsound, which is a count standing where a check belongs. Two things wrong with
it, and the second is worse.

It has no independent referent: 28 is this run's own measurement of the live
population compared against itself, so automating its update would collapse the
assertion to measure() == measure(). Section 5 admits a numeric literal only
when it is grounded in a fixture, an external authority, a policy budget, or a
monotone debt contract, and this was none of them.

And it points the wrong way. A repair of ONE collapsed cell would have failed
this test with "expected 28" -- reporting a genuine improvement as a regression
and telling the next author to restore the defect to get green.

What must stay true is that the instrument's refusal path is REACHED, which is
a property of the refusal rather than of how much is currently broken. The
specific collapse is already carried by the discriminating controls beside it,
where a repair makes exactly the right row go red and nothing else moves.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RvMEJFpYsy55NRdJ1Az4Vd

* A defect-asserting control must say so where the reader meets it

Two of the five controls assert the COLLAPSE rather than an invariant, and that
is deliberate: a repair makes exactly the right row go red. But the only place
that was written down was a comment on a different function further down the
file, and nobody arrives at a control by reading the module top to bottom. They
arrive at a red test name in a CI log, where
"a_typed_index_refusal_is_not_distinguished_from_a_structural_non_match" reads
like a broken invariant and the obvious repair is to make the two renders
differ -- which is precisely what the real fix would already have done. The
future author would restore the defect to get green.

So each of the two now carries its own disposition on its own declaration:
going red means the defect was repaired, which is success; delete the row, do
not restore the behaviour. The six-arm control also states what a PARTIAL
repair means, because it goes red then too and that is still progress.

This is the count-oracle failure one level up. Both are true signals the reader
misclassifies, and in both cases the fix is to move the meaning to where the
signal is read rather than to weaken the signal.

Also records why the surviving == 28 in the denominator control is not the
literal that was just removed: 4 and 7 are the arities of two std types, an
authority this module does not own and cannot silently drift from, since the
exhaustive matches make an upstream change fail compilation. The removed
literal was this run's own measurement of how much is broken, compared against
itself.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RvMEJFpYsy55NRdJ1Az4Vd

* Three gaps in what the instrument guarantees about itself

The measured matrix and the production-gap separation were right. What was
wrong was every claim this file made about its OWN evidence, and all three
holes are the class the instrument exists to detect, turned inward.

C2, the worst: consumer_standing was a CONSTANT FUNCTION. It returned
CalibrationDemonstrated unconditionally with only the conditions string
varying, so three arms of a four-armed vocabulary were unconstructible on this
route and the field carried zero information -- a fixture pinned at an
absorbing extreme, where admission cannot fail because the input cannot differ.
And cell_is_sound never read it: a cell with RefusedOrIncomplete consumer
standing was SOUND as long as its production standing was demonstrated.
Descriptive data standing where an admission obligation belonged. The matrix
stays red today only because the production axis is unsupported, so repairing
that axis would have made the consumer axis silently admit everything.

consumer_standing now DERIVES from structure that can differ -- the
demonstration's three clauses read literally, with clause two (did the case
reach the intended judging stage) checked by round-tripping the constructed
observation and resolution through the same total matches that bind the
denominator. A parameterised form exists so the RED is authorable at all, and
two of the three non-demonstrated arms are now reached by executing controls.
cell_is_sound requires both standings.

C1: the denominator control proved a COUNT, not an identity join.
calibration_cells folds one traversal list across the other, so its cardinality
is a product, and the round-trip fold checks that each visited element relabels
to itself -- which a duplicate satisfies exactly as well as a unique element.
Replacing IndexModulePathRefusedArm with a second IndexTransportRefusedArm
leaves lengths at 4/7/28 and every control green while one column is measured
twice and another never. Verified by executing that exact sabotage: the old
control stayed true, the new distinctness control went false, and green
returned on restore.

The verdict now consumes traversal integrity too, because an empty or short
traversal has no unsound cell and would otherwise exit success -- "nothing was
measured" and "nothing was wrong" arriving at the same exit.

C3: the refusal control asserted a precondition of the decision, not the
decision. Factoring calibration_verdict out was necessary and is not
sufficient, and the residual gap is stated rather than papered over: replacing
the report's post-write refusal with ExitSuccess leaves every control here
green. No witness can cover it -- the report performs a host effect and the
floor's hermetic envelope refuses those, so such a witness would be counted
executed while its assertion never ran. Declared as a boundary with a
capability-shaped trigger, and the control is renamed to the verdict it checks.

Also synchronises two scope sentences: the opening claimed to measure what the
production path can produce while the body correctly says it does not, and "no
producer anywhere" is scoped to the production route, since this instrument
itself constructs StructuralBindingProductionRefused.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RvMEJFpYsy55NRdJ1Az4Vd

* C3 closed by execution: the wet route existed, so the gap was mine not the floor's

I declared a §4b boundary and named a missing capability: a witness-executable
route that can run an effectful entry point under the floor. That capability
already exists, with thirteen precedents in the same directory. A trigger
naming an existing capability is a drop that never ends, because a drop is
retired by its trigger and by nothing else -- so the declaration would have
been permanent by construction.

My barrier was real and was not a ceiling. Hermetic discovery does refuse host
effects, and a witness swept into it would be counted executed while its
assertion never ran. What I missed is the documented second route: exclusion
from hermetic discovery plus enrolment in a wet lane, exactly as
test.claim.commit_writer_heal_admission_real_execution does.

So the gap is closed rather than declared. A new wet witness calls the real
provenance_calibration_report against a real temp path and asserts the returned
ProcessExit. To make the arm two-sided through the real path, the report is
parameterised on its cell population -- computing it inside meant the only
outcome a wet witness could observe was refusal, which a report that refused
unconditionally would satisfy. The measured matrix must refuse; a constructed
sound matrix must succeed. Two further arms: the refusing report must still
have WRITTEN the matrix, since a refusal with no file is a different and worse
outcome than the stopped-line audit claims and is invisible in the ProcessExit;
and the empty-out-path guard refuses BEFORE any write, so "did it refuse" alone
could be satisfied without reaching the decision at all.

VERIFIED BY MAKING THE SUBSTITUTION. Replacing the post-write refusal with
ExitSuccess: the hermetic control stayed true and the wet witness went false.
That is the sentence that named the gap, now flipped, and running the hermetic
control on the sabotaged tree is what proves it could not have seen it.
Restored byte-identical, green returned.

Enrolled in the identity-grain local-repo wet lane rather than the dark bin-wet
class, deliberately: the witness exists because a wall that stops executing
must refuse rather than read as covered, and enrolling it somewhere it could be
silently absent would reproduce its own subject. Its admitted effect is named
as its own row rather than folded into a neighbour -- it builds no repository,
unlike the throwaway-repo class, and it writes, unlike the read-only probe
class.

Also adds two import lists flagged in review. Both claims were that name
resolution would fail; it does not, and the file carries zero diagnostics with
or without them -- measured both ways. They land for peer consistency, not
because the stated defect was real.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RvMEJFpYsy55NRdJ1Az4Vd

* Five: a helper that claimed a judgement it never ran, and two degenerate passes

N1 is the instrument's own subject one layer up, and it is the one I would not
have found. consumer_standing_for round-tripped the kind and the arm and NEVER
CALLED assess_reference_binding_observation, while its own conditions string
said the case had been "judged by" it. The matrix was not wrong today, because
the only caller supplied consistent arguments -- which is exactly how this
class survives: a derivation asserting what it did not perform is invisible
while its inputs stay well-formed.

It now takes ONE observation and reads the resolution OUT of it, so the judged
case and the checked arm cannot be two different things; the old signature took
both and could be handed a matched pair by convention alone. Demonstrated
standing is reached only after the real consumer runs, and carries that call's
attributed result. The discriminating RED is same-kind/different-embedded-arm,
which the old signature could not detect at all -- without it the change would
be a shape no input can falsify.

C1 and N2 are one shape twice: an assertion true at the absorbing extreme of
its own input.

C1: traversal_is_complete counted DISTINCT keys, which is coverage, and never
counted the list, which is uniqueness. 28 cells plus a duplicate has 28
distinct keys and passed while the population held 29. This became reachable
through the C3 repair -- parameterising the report made the population an INPUT
a caller shapes, so a duplicate now arrives through the parameter rather than
through the traversal lists the other conjuncts guard. Length == distinct ==
declared is the identity join; either count alone is a count.

N2: the write arm asserted Filesystem.Read(...).success, and a read of a
ZERO-BYTE file succeeds -- so a report that created the file and wrote nothing
satisfied the arm whose entire purpose is that the operator gets the evidence
before the line stops. It now compares the payload to calibration_body_of over
the SAME cells, using the existing renderer rather than a second authority, and
a third arm rejects a right-shape wrong-population payload.

Verified by the adjudicator's own falsifier: emptying the write content while
keeping the verdict left all three prior wet arms GREEN and reddened both
content arms. Restored byte-identical, green returned.

Two scope sentences: "no module anywhere constructs
StructuralBindingProductionRefused" was false unscoped -- this module
constructs it -- and is now scoped to the production route; and the empty-out
control no longer claims to observe the absence of a write, which its Boolean
cannot establish since no path is supplied for it to read.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RvMEJFpYsy55NRdJ1Az4Vd

* The wet witness was enrolled in one roster and executed by neither

The floor refused, correctly, and named the defect exactly: four identities
"never reached their subject: the hermetic route has no arm for Dir (operation
declares no mock_response)". My wet witnesses were still being evaluated on the
HERMETIC route, where shell.Mktemp.Dir cannot run. The fifth arm did not gap
because it builds no temp directory.

That refusal is the floor doing the thing this PR is about: it did not count
four unreachable claims as covered, it stopped and said which subject was never
reached.

The cause is a deviation I made deliberately and did not verify. The route I
was pointed at enrolls a wet witness in TWO rosters -- bin_witness_wet_entries,
the per-PR executing consumer, and the local-repo wet schedule, which joins
observed terminals back at identity grain. I chose the schedule alone because
the identity-grain join is the stronger property, and treated the other as an
alternative rather than as the half that actually executes. Measured against
the working precedent: it carries 4 bin_wet rows, I carried 0.

So the enrollment asserted an executing consumer it did not have, which is
specification-without-execution -- and the seed already records another author
making the same mistake on these rosters and reverting it. Both halves now
match the precedent.

What this does not establish: that the rows take effect. That is a claim about
CI mechanics I have now been wrong about twice, and it is settled by the next
floor run rather than by this commit message.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RvMEJFpYsy55NRdJ1Az4Vd

* Revert the bin_wet rows: that cadence has no executor and has not since August

The rows did not take effect and the seed says why, in a note I should have
read before adding them rather than after. std_witness_admission records the
per-cadence realization gate: of ten WitnessConsumerCadence arms, exactly four
have a live scheduled route, and BinWitnessWet is NOT one of them --
"falsifier.yml, the workflow that scheduled all five, was deleted at
611fd02 (2026-08-15, #8283), and no replacement executor exists."

So enrolling there is specification-without-execution by construction, which is
what the floor_prepared_subject_exclusions comment already recorded another
author discovering and reverting. I have now reproduced that experiment and it
came out the same way. Leaving the rows would leave a roster claim with no
consumer standing as though it were coverage.

What the same note establishes is that my ORIGINAL choice was the right one and
the bin_wet addition was the wrong correction: LocalRepoWetLane returns TRUE,
is "the one arm added with its executor rather than before it", and its stated
scope is exactly this witness -- "witnesses whose real effects are confined to
a temporary directory and a local git repository, which the required lane can
run in its own checkout". Its completeness join is at identity grain in both
directions and its liveness check refuses LocalRepoWetExecutorAbsent, which is
why a member it cannot run reds the lane rather than quietly widening it.

That leaves the enrollment as it was two heads ago -- exclusion row classified
LocalRepoWetLane, five rows on the schedule -- and the four identities still
evaluating hermetically and gapping on Dir. I do not know why, I have been
wrong about this lane twice, and I said I would stop rather than try a third
model. Stopping here.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RvMEJFpYsy55NRdJ1Az4Vd

* The floor's prepared subject consults a Rust literal and nothing else

Three CI cycles changed nothing because both rosters I edited were the right
rosters for the wrong consumer. There are two exclusion mechanisms with
different consumers: witness_exclusion_frontier, projected from .dag by
cli_run/witness_gates.rs, governs DISCOVERY SELECTION; the FLOOR PREPARED
SUBJECT consults floor_prepared_subject_exclusions and nothing else, as that
function's own comment has said since someone else learned it the same way. The
identities were gapping in the prepared subject.

The bin_witness_wet_entries detour was the same mistake with a worse cause:
that cadence is one of five whose executor was deleted with falsifier.yml at
611fd02, so the rows were dead on arrival. Reverted last commit. Worth
recording that the precedent I matched against is itself in that dead cadence
-- an excluded witness enrolled in a lane that does not run, which reads as
covered and is not.

This entry is the OPPOSITE of the two already in the list and its comment says
so rather than copying them. Those two are excluded BECAUSE they have no wet
consumer: the exclusion buys a green floor, the claims sit at UNEXECUTED-IN-CI,
and they say so plainly. This one is excluded so that it CAN be executed --
its five functions are on the local-repo wet schedule, whose cadence is one of
the four with a live scheduled route, and whose lane joins roster to terminal
receipts at identity grain in both directions and refuses
LocalRepoWetExecutorAbsent when a nonempty schedule meets an uninvoked
executor. A member it cannot run reds rather than reading as covered.

Admitted against the v1 freeze on the PURPOSE test: this is the executing
evidence for the calibration instrument's refusal path, and without it that
evidence cannot run at all. Mocking is not the alternative -- the witness
exists to prove the REAL report writes the REAL matrix before refusing, and a
mocked write asserts against the mock. One string and a comment; no new
declarations, no exported surface.

Seed verified by execution, with a discriminating control: cargo check
-p v1-compiler exits 0 and reports Finished; cargo check -Z
definitely-not-a-real-flag exits 101 and is refused. Whether the entry takes
effect is settled by the next floor run, not by this message.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RvMEJFpYsy55NRdJ1Az4Vd

* A test with no host effect does not belong in a wet witness

The seed exclusion worked: the four Dir route-gaps are gone. The floor then
refused on a narrower and different cause, which I read from the published
measurement receipt rather than from logs:

  cause=ChangedWitnessOutsidePreparedSubject
  identity=...an_empty_out_path_refuses_by_real_execution
  the changed-witness sublane selected this exact identity, but its module
  closure was not prepared, so execution cannot be represented as a decline

That identity is the fifth function, and it is the one that makes NO host
effect at all: the argument guard returns before the report touches anything --
no temp directory, no write, no shell. I put it in the wet witness because it
was topically adjacent to the arms that do write, and that was a misplacement
independent of any CI mechanism. It made a hermetic property depend on a lane
it does not need, and the floor named it.

So it moves to the hermetic controls, where it always belonged, and its
schedule row goes with it. The wet file now holds exactly the four functions
that perform real effects, and the schedule holds exactly those four -- checked
by an identity join in the direction that can fail, with a guard that refuses
an empty subject list rather than reporting a vacuous clean.

I am not claiming this clears the floor. The cause is new, the reasoning is
about my own file rather than about the lane, and the next floor run settles it.

Also records how the cause was obtained, because it nearly was not: the run was
still in progress, so the job-log API returned "run is still in progress" into
a file I then grepped for my module and found zero hits. That empty capture
read as a clean result, and I was one step from reporting that the route-gaps
were gone on the strength of a refusal I had mistaken for evidence. The receipt
artifact was retrievable while the logs were not.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RvMEJFpYsy55NRdJ1Az4Vd

* Remove the prepared-subject exclusion: the wet lane's members belong IN the subject

The exclusion was the proximate cause of ChangedWitnessOutsidePreparedSubject,
not a cure for the route gaps. A LocalRepoWetLane member is PULLED INTO the
prepared subject by local_repo_wet_schedule seeding the closure; excluding it
puts the identity in the one state the site loop refuses -- selected as a
changed witness and not prepared.

Restores the configuration in which the four route gaps appeared, which is the
configuration the changed-witness projection must be read against:
HermeticRouteGapHeldAndWetPassed is the floor's designed answer here, and this
run is to capture WHICH of its conjuncts fails.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RvMEJFpYsy55NRdJ1Az4Vd

* Enroll the four wet identities in floor_route_gap: the second half of a two-part enrollment

The wet schedule row supplies the EXECUTION; this supplies the record of the
HERMETIC BOUNDARY. Both are required and neither references the other, which is
why the schedule stood alone through five CI cycles.

Operation and ground are MEASURED, from required-floor run 33978797098 at
06c7740: 'the hermetic route has no arm for Dir (operation declares no
mock_response)' for each of the four. The enrollment was withheld until that run
existed rather than written from the inference that it would say Dir/NoMockResponse
-- which it did, but a roster row written from a guess is a transcribed number.

The same run establishes the pair discharges: [local-repo-wet] scheduled=22
admitted=22 refusals=0 with all four observed=passed, and the changed-witness
projection reading standing=hermetic-route-gap-held-and-wet-passed for each. The
hold is never a pass on its own.

Modelled on floor_route_gap_expectation_chunk_05, the same shape for the same
reason, in the typed form so a wrong operation or ground refuses rather than
enrolling silently.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RvMEJFpYsy55NRdJ1Az4Vd

* Write the absence of the wall into the header, since prose cannot refuse

The pair sentence was already here; what it lacked was honesty about its own
weakness. Both rows are required, neither references the other, and NOTHING
refuses a witness that has one and not the other -- stated as a declared
boundary rather than as advice.

The evidence that prose cannot carry this is in this repository, twice today:
floor_prepared_subject_exclusions carries a comment saying run_required_floor
consults that list and nothing else, and it did not reach the next author;
chunk_05's header states this same pairing in this same file, and it did not
reach the author of chunk_06, who supplied the schedule row alone and learned
the rest from five red floors.

Also records that floor_route_gap_expectation_mismatch returns early on a
missing expectation, so the one wall guarding these rows cannot fire for an
UNENROLLED identity -- the state every author is in while deciding what to
write. A guard whose precondition is the state you are not yet in protects the
case that no longer needs it.

Floor verified green at 0a036af before this commit: run 33980428822,
standing=measurement_completed blockers=0, all four jobs passing.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RvMEJFpYsy55NRdJ1Az4Vd

* The boundary paragraph understated the boundary: three carriers, not two

Review 61028 counted the carriers and was right. The enrollment is a TRIPLE:
the expectation in floor_route_gap_expectation_chunk_06, the schedule row in
local_repo_wet_terminal local_repo_wet_schedule, and the ci_layer_roots
witness_exclusion_frontier row classifying the file LocalRepoWetLane. None
references the others and nothing refuses a witness that has some and not all.
Named by symbol rather than by line, so the next edit above them does not
silently invalidate the citation.

A wrong count in a paragraph about a coupling nothing enforces -- written by the
author who checked the OTHER count in this same change an hour earlier and did
not check this one. Same class, same day, same hand, and this one came from
inside. The paragraph now records that it was caught by a reviewer counting,
not by its author.

An understated boundary is worse than no boundary because it will be trusted: it
is stated as a declared boundary in the file the next author is already editing,
and following it exactly supplies two of three and earns a red floor.

C1, N1 and N2 are untouched; this changes comment text in one .dag header and
nothing else.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RvMEJFpYsy55NRdJ1Az4Vd

* C1 reopened: the axes were counted against themselves, so an empty axis passed

THE DEFECT, reproduced as a fixture rather than described. Empty
calibration_resolution_arms, supply cells=[], and every conjunct holds:
distinct_arm_label_count == list_length is 0 == 0, the kind conjunct is 4 == 4,
length == declared is 0 == 4*0, distinct keys == declared is 0 == 0, and the
unsound list is empty. calibration_verdict returned ExitSuccess having measured
NOTHING. The two conjuncts that look like axis guards are vacuously true exactly
when the axes are most broken -- predicate_vacuously_true_on_an_empty_domain,
inside the instrument whose purpose is to refuse an empty traversal, and the
seventh specimen of a row this author appended six to this afternoon.

WHAT CHANGED. The axes are now PARAMETERS of traversal_is_complete_over and
globals only at the call site. That is the whole repair, because while the
predicate read the module lists directly NO FIXTURE COULD SUPPLY A DEGENERATE
AXIS -- the refusal arms were unauthorable, which DESIGN 4b calls a decoration
rather than a weak wall. A positive denominator on both axes now refuses the
empty case by name.

THREE CONTROLS ENROLLED, each red before this change and green after:
- an_empty_axis_refuses_rather_than_holding_vacuously (the case above)
- a_short_axis_is_internally_consistent_and_still_misses_a_kind: a shortened
  axis with its own matching matrix is INTERNALLY CONSISTENT, which is why the
  production defect is silent; the full matrix is refused against it
- a_colliding_axis_refuses_while_a_short_one_does_not: states by execution that
  the distinct-label conjuncts detect COLLISION, never OMISSION

DISCRIMINATION VERIFIED BY SABOTAGE, not by green: removing the positive
denominator turns the empty-axis control false, restoring it turns it true.

WHAT IS NOT FIXED, AND IT IS A LANGUAGE FINDING RATHER THAN A REMAINING TASK.
Axis completeness against the VARIANT TYPES is still not established anywhere.
Deriving the population from the type needs enumeration of a coproduct's
constructors from inside a fold; the substrate has no unfold, no range and no
constructor-listing primitive, so the list cannot be produced from the type by
any construction available. A third hand-maintained list would be a second
authority for the same fact and closes nothing. The capability that retires it
is named in the header.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RvMEJFpYsy55NRdJ1Az4Vd

* File the axis-completeness gap as a guarantee_stall, not a rung_drop

A rung_drop records a REGRESSION and carries a restoration trigger. Axis
completeness against the variant types was NEVER established, so there is no
height to restore and a drop would claim a loss that never happened. This is
DESIGN 4b(2)'s no-untracked-stall obligation: a class below its ceiling naming
what it waits on.

BLOCKER IS AwaitsOneGrounding, following the precedent of
roster_re_enumerates_its_own_rows_stall, which classifies a missing LANGUAGE
capability that way and argues why it is not ClimbableButUnbuilt: the climb is
not merely unstarted, it is unavailable with every construction the language
offers. That row is this one's sibling -- the same shape one layer over, an
authored list mirroring a declared population -- and the difference is the
missing primitive, VALUE BINDING for data declarations there against
CONSTRUCTOR ENUMERATION for a coproduct here. Neither implies the other.

The row carries the surface enumeration as its evidence, so one counterexample
falsifies it: no unfold, no range, no constructor-listing primitive, and std's
list surface is list_block, list_item, list_length, list_to_stack. It also
records why a third hand-maintained list is not the answer -- a second authority
for one fact that would make the stall LOOK discharged.

The trigger is stated as ENUMERATION OF THE TYPE rather than as a completeness
check over the list, because a check comparing the list to another authored
artifact is satisfied by editing that artifact while the axis stays short --
4b(3)'s trigger naming less than the capability it restores.

Guarantee stalls have no doc projection; the generated-artifact gate ran clean
with no drift.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RvMEJFpYsy55NRdJ1Az4Vd

* Say why floor_cost_basis_boundedness_stall was converted: main did not resolve

THE ROW DID NOT HAVE A TYPO. next_rung_trigger was a String when that row landed
(#10281); the field became the NextRungTrigger product with climbs_when as its
constructor in a separate change (#10582). The two never met, 31 of 33 rows in
that directory adopted the constructor, and the closure enumerating them stopped
resolving: expected Product(NextRungTrigger), got Primitive(String).

THE FINDING IS THE GATE, NOT THE ROW. Both commits are ancestors of a GREEN
required floor -- main's required-witnesses-floor at 2f8819b reported SUCCESS
with both in its history. The gate did not lose a race; it RAN AND PASSED over a
rostered row that does not typecheck.
dag/test/claim/guarantee_stall_witness_test.dag imports gunbc.guarantee_stall.roster
and declares eleven test fns, verified, so the closure looks covered and is not.
The roster is enumerated somewhere the required floor does not compile, and until
that is closed any stall row can stop typechecking with no red anywhere.

The conversion carried in the previous merge is mechanical -- the same string,
wrapped in the constructor the field now requires -- and was made only because a
branch merging main cannot resolve this closure otherwise. This commit adds the
explanation to the row so a reader of the diff cannot conclude a stall row had a
typo, which is what an unexplained one-line constructor change looks like.

Not mine to repair: the gate hole belongs to whoever owns the required floor's
discovery closure, and it is worth more than either PR it turned up in.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RvMEJFpYsy55NRdJ1Az4Vd

* Drop the carrier repair from this PR: it belongs to #10608 alone

The same row was edited by both PRs with DIFFERENT comment text -- +26 here and
+66 on #10608 -- which is two authorities for one fact. Worse than a plain
conflict: whichever landed first, the other conflicts, and if this PR landed
first the SHORTER, UNCORRECTED wording would reach main while the corrected one
waited behind an operator adjudication.

The carrier repair was never part of this PR's subject. It rode along only
because this branch could not resolve main without it. That is exactly the
coupling a standalone PR exists to remove.

This branch may now be unresolvable for local work until #10608 lands, which is
expected and is not a reason to re-add it: a PR whose subject is correct and
whose branch needs another PR first is an ordinary dependency.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RvMEJFpYsy55NRdJ1Az4Vd

---------

Co-authored-by: Brian Searls <briansearls1@gmail.com>
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
@briansrls
briansrls merged commit f0e701c into main Sep 5, 2026
4 checks passed
@briansrls
briansrls deleted the work/guarantee-stall-carrier-swap branch September 5, 2026 23:42
gunbai-bot Bot added a commit that referenced this pull request Sep 6, 2026
… cannot be read (#10638)

* Two ledger appends: a naturally-occurring member, and the census that cannot be read

ONE SUBJECT, TWO ROWS. Both are ledger appends and both regenerate the same
projection, so they land together rather than paying a second review and a
second generated-artifact cycle for one review question.

A SECOND CONFIRMED MEMBER FOR admitted_module_without_judged_standing, AND
UNLIKE THE FIRST IT WAS NOT PLANTED. That row's 2,100-identity population had
exactly one confirmed member, produced by deliberately constructing an
undeclared field. A ROW WHOSE ONLY CONFIRMED MEMBER IS AUTHORED IS SAMPLING
ITS AUTHOR, so a naturally-occurring member is a categorically different
receipt rather than one more of the same.

Written in the PAST TENSE with the fix named, because the defect is repaired
on main and a reader reproducing against main today will not find it. What was
true: floor_cost_basis_boundedness_stall spelled next_rung_trigger as a bare
String while 31 of 33 sibling rows used the constructor, and the enumerating
closure refused. When: it landed 74 minutes AFTER the carrier that changed the
requirement, and sat undetected until 2026-09-05, blocking two branches and
taxing every branch that merged main. Fixed by #10608.

Its invisibility is established by the refusal that did not happen: the error
was live on main while all required lanes were green, and any lane that had
content-judged that initializer would have refused, because the closure does
not resolve. The build lane's own census agrees -- the TYPE CARRIER is judged
while the CHANGED INITIALIZER is absent. Compiling a type's DECLARATION does
not establish that an INITIALIZER using it was checked.

A NEW ROW: instrument_unobservable_as_its_subject_grows. A measurement whose
only write is a rendering sized in proportion to the population it reports,
on a size-limited channel, is LEAST readable exactly when its subject is
largest. That is not a logging defect; it is a check that greens by
construction, one layer out, and nobody catches it because every small run
reports fine.

Specimen measured on a required run, not a fixture: a 44,727-byte census line
survived while the larger one in the other lane never appeared, and both
claim_executor lanes lost the remainder of their captured output while two
non-claim_executor jobs in the same run ended normally. Two proposed
mechanisms are recorded as REFUTED by measurement rather than omitted, and so
is a third that would have made this a correctness defect -- the process
survived, proven by its measurement receipt existing for the same run.

Severity is stated DOWN: losing the log loses the DIAGNOSIS, not the REFUSAL.
The verdict rides the exit code. This row forecloses its own stronger reading.

The ceiling is reachable because THE CONSTRUCTION ALREADY RUNS IN THE SAME
BINARY: the receipt path the census should travel is written by the same
process a few statements later and survived the run whose census did not.

The projection was regenerated by its own actuator rather than left to CI's
heal, and verified by set difference that no row went dark.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RvMEJFpYsy55NRdJ1Az4Vd

* State the measurement-citation boundary this row uniquely cannot satisfy (review 61207)

The finding is that section 6 forbids transcribing an instrument's output. It
applies, and this row is the one case where the rule's remedy is unavailable.

WHAT THE ROW NOW SAYS RATHER THAN LEAVING IMPLICIT. The readings are DATED
OBSERVATIONS OF ONE IMMUTABLE RUN, not a live census: run 33990451798 is fixed,
so unlike the reference count this same PR's sibling row was correctly told to
remove, these cannot drift as the corpus changes. The emitting producer is named
by SYMBOL -- v1.compiler.claim_executor's required-ci block -- not by position.
That is already the form both neighbouring run-scoped specimens in this roster
use, including admitted_module_without_judged_standing, the row this PR amends,
which carries five such numbers against its own named run.

AND THE PART THAT MAKES THIS ROW DIFFERENT, WHICH IS THE FINDING ITSELF: NO
PRODUCER CAN RE-DERIVE THESE READINGS, BECAUSE THE SUBJECT OF THE ROW IS THE
LOSS OF THAT OUTPUT. Re-running the lane does not reproduce them; it produces a
new run whose census is lost the same way. The captured log carrying the
surviving fragment is retained for a bounded window, after which this row's
evidence is gone while the defect remains. A row about an unreadable instrument
that cited a re-derivable instrument for its own evidence would be claiming the
very readability it exists to deny.

So the numbers are stated with their run, their bracket and their retention
limit, and the re-derivable entry point offered is for THE CLASS rather than the
readings: the discriminator already named in the row.

Projection regenerated by its own actuator; set difference confirms no row went
dark.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RvMEJFpYsy55NRdJ1Az4Vd

* Narrow the re-derivability claim so the disposition cannot be read as pleading

The previous wording led with the flat form -- NO PRODUCER CAN RE-DERIVE THESE
READINGS -- and the sentences after it were already narrow. A flat claim invites
a reviewer to find one counterexample and dismiss the whole disposition, so the
headline now carries the precise version.

THESE readings belong to one run whose captured output cannot be regenerated
identically. THE CLASS stays perfectly re-derivable by a new run, which will lose
its own census the same way. Those are different claims and only the first is
made.

The row now also cites section 6's own test for which of the two a number is: if
a measurement is worth re-deriving it is worth an entry point, and if it is not
worth an entry point it is not an instrument but a ONE-OFF. The rule exists so a
transcribed number cannot rot away from a producer that would have kept it
current, and a dated observation of one immutable run has no such producer to rot
away from -- re-running yields a different run, not a corrected reading of this
one. So the entry point owed is for the CLASS and is named in the row, while the
readings are carried as a dated one-off with run, bracket and retention limit.

Unchanged and still load-bearing: a row about an unreadable instrument that cited
a re-derivable instrument for its own evidence would be claiming the readability
it exists to deny. That is section 6 applied to a subject whose defining property
is that its output does not survive, not an exception to it.

Projection regenerated by its own actuator; set difference confirms no row went
dark.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RvMEJFpYsy55NRdJ1Az4Vd

---------

Co-authored-by: Brian Searls <briansearls1@gmail.com>
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant