Skip to content

The boundedness arm of the floor-cost trigger is a §4b(2) stall awaiting one grounding, not unbuilt work - #10281

Merged
gunbai-bot[bot] merged 12 commits into
mainfrom
session/tidy-lynx-804-boundedness-stall
Sep 5, 2026
Merged

gunbai-bot[bot] merged 12 commits into
mainfrom
session/tidy-lynx-804-boundedness-stall

Conversation

@gunbai-bot

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

Copy link
Copy Markdown
Contributor

gunbc#10260 corrected conjunct (ii) of floor_cost_claim_qualification_unavailable's restoration trigger to read INVARIANT OR BOUNDED BY CONSTRUCTION, and recorded that the invariance arm is measured and refuted while the boundedness arm is unestablished. It did not record why the boundedness arm has not moved — which §4b(2) obliges: a class below its ceiling must separate cannot climb further from can climb after one grounding from can climb now but unbuilt.

This adds that row as one row module plus one roster amendment: one data declaration with its annotation, one import, and one all_guarantee_stalls entry. (The row was authored against the monolithic carrier and re-homed when #10328 relocated every stall row one-per-file mid-review — see Integrated shape below.)

The reachability result, which is what decides the blocker

For observed pairwise ratios r₁..rₙ with M = max(r₁..rₙ), the evidence establishes only:

every bound K valid for those observations satisfies  K >= M

More samples may leave M unchanged or raise it. They cannot establish for every admitted execution pair, ratio <= K. An observed maximum is a floor on any valid bound, never a bound — so no measurement campaign discharges this arm, and a percentile, a confidence interval, or a long run of non-exceedances is not a substitute for a construction-derived one.

That matters concretely rather than abstractly: a 12-run campaign reporting a worst-observed 2.280x exists today and is exactly the artifact that would be offered for it.

The drop row already said this of one measurement — "a maximum of 1.721 observed over one pair of attempts on one host pair is a FLOOR on the spread, not a bound on it" — but scoped to that measurement it reads as an invitation to sample more hosts. Stated generally here so it cannot.

Why AwaitsOneGrounding and not ClimbableButUnbuilt

There is no closed admitted envelope with every basis-varying component accounted for, so the work is unspecifiable, not merely unstarted. The grounding names four conjuncts as one conjunctive grounding, and the trigger says so — a trigger satisfiable by any one of them would retire the row with the capability still dead, which is the §4b(3) grain mismatch arriving as a §4b(2) trigger.

Rungs are classified from the acceptance path, not derived from the drop row

  • current: OutsideTheLadder — classified from the CURRENT ACCEPTANCE PATH. v2.workflow.required_floor.claim_safety_outcome takes seven parameters, none of which is or derives from a construction-bound authority, and branches only on reached_verdict, then observed_cpu_ms against cpu_limit_ms, then observed_wall_ms against wall_limit_ms; its blocking consumer maps only those outcomes. So the arm's absence accompanies CompletedWithinSafetyLimits and CompletedPastSafetyLimit alike and no output varies with it — nothing observes the arm and nothing blocks on it, so rung one is not occupied. Scope of that negative, stated exactly: no required-floor acceptance-path outcome observes or blocks on this arm. It is not the claim that no prose or ledger mentions it — the parent drop and this row plainly do.

    WITHDRAWN FROM AN EARLIER REVISION OF THIS BODY: current: Mitigatable, and the claim that the rung was derived from the drop row's "acceptance still fail-closed" clause. Both were wrong. That clause is about attempt safety and verdict availability — a neighbouring subject — and reading it as speaking for this arm cited a strong neighbouring path while this path stayed silent, which is the §4b(1) rung inflation this row exists to record. Nothing derived the field; prose read prose.

  • ceiling: StructurallyGuaranteed, not Impossible — an execution exceeding a derived bound stays authorable. The climb removes the silent acceptance, not the ability to write the program.

Why a stall and not a second drop

In the drop row's own words: "PREVIOUS RUNG: none for environment-independent claim-cost qualification — that guarantee was never held, and saying it was would be inventing a rung to drop from." Nothing was lost, so a drop's previous/temporary/reason fields have no answer. gunbc.guarantee_stall's own annotation draws exactly this line: a drop is an event, a stall is a standing state.

Roster enrolment, verified by count

Enrolled in all_guarantee_stalls (35 → 36 as of head c8bcb13fed), which is what puts the row inside every_stall_is_below_its_ceiling and every_stall_names_a_trigger. Deliberately not added to restored_stalls, whose annotation states it is a presence-exactly-once pin over four previously-lost subjects and that "a new stall row must be admitted without editing this list."

Adding a row without its roster entry is the exact failure this lane shipped once today on gunbc.recurring_failure_mode — the projection went silently unchanged — so the enrolment is verified by count rather than by having typed it.

Integrated shape after merging #10328

#10328 landed while this PR was open and relocated every stall row out of the monolithic carrier: dag/gunbc/guarantee_stall.dag now holds only the type and the folds, each row is its own module under dag/gunbc/guarantee_stall/, and the enumeration is owned by gunbc.guarantee_stall.roster. This branch had appended to the file #10328 emptied, so the merge conflicted.

The row moves rather than wins. Taking this side would resurrect 28 declarations into a retired carrier and undo #10328's cut; taking main's would drop the row with no conflict marker to show for it. So the integrated shape is two changed files, 73 additions, 0 deletions:

file change
dag/gunbc/guarantee_stall/floor_cost_basis_boundedness_stall.dag new row module; substantive reasoning unchanged, with three parent-symbol address repairs after main relocated the rung drop one-per-file
dag/gunbc/guarantee_stall/roster.dag one import + one all_guarantee_stalls entry, appended at the END (that file declares roster order load-bearing)

#10328's named invariant holds compositionally, and the figure is stated against the head that carries it. At head c8bcb13fed the roster is 36 entries / 36 imports, all 36 joined by identity (every listed symbol imported, every imported stall symbol listed; the only imported-not-listed names are Bool, GuaranteeStall, List, fold_list, which are types and folds rather than stalls). This branch adds exactly one uniquely-named row file, one matching import and one matching entry, deleting none.

The earlier 31 row files / 31 imports / 31 entries triple is superseded, and the SHAPE changed rather than only the number. That triple was true and bound to merge 8b411f8208, where every rostered stall was homed one-per-file under dag/gunbc/guarantee_stall/. Main has since re-homed five rows into the authority modules that own their subjects — gunbc.declaration_index_seed_growth, gunbc.namespace_wave_admission (two), and gunbc.runner_service_activation (two) — which is the §3 move of putting a fact in its layer rather than in a folder. So at c8bcb13fed the counts are 31 row files / 31 row-module imports / 36 entries, and file count is no longer a proxy for roster population. Anyone re-deriving the old triple today will get 31 and 36 and should read that as the re-homing, not as a missing enrolment.

The earlier 30 / 30 / 30 was true and bound to merge parent 8db3cdb0b6. Each figure above is bound to the head it was measured on; none is carried forward.

A second conflict followed, on the roster alone: #10328 moved the row bodies one-per-file but left the roster a single shared append point, so two independent row lanes still collide there. Resolved as a union, not a side-take — both sides added one import and one entry over an empty base, so neither is a competing answer. Main's row is ordered first (it landed; the roster declares source order load-bearing) and this row appends after it, keeping the import list and the entry list order-isomorphic.

A third round then found that main had relocated the parent rung drop one-per-file too, falsifying this row's three citations of gunbc.rung_drop — now corrected to gunbc.rung_drop.floor_cost_claim_qualification_unavailable, which still carries standing: Standing and the same restoration trigger, so no reasoning is reopened. Every module-qualified symbol this row cites is now re-derived against the live corpus: seven resolve, and the one that does not is gunbc.floor_cost_distribution.RunCost.eval_steps, cited by this row's own revision history precisely because it does not exist — the instrument's positive control.

Verification, stated honestly

The row's own acceptance is CI's to establish. The local diagnostic receipt below is historical: it establishes diagnostic-set identity for the merge it was measured on, and for nothing later. It is retained because identity join rather than count equality is the right shape of evidence — equal totals are not the same set — not because it speaks for the requested head:

Historical local diagnostic receipt — NOT re-derived on c8bcb13fed. gunbc compile over dag + src/v2 emitted 17047 diagnostics on 4e7e6d2224 and 17047 on unmodified 8db3cdb0b6 — that merge's exact parent — under the same binary, both worktrees clean. Comparing the two sets by identity gave 0 introduced and 0 silenced. This receipt does not establish diagnostic identity preservation for the later integrations carried in c8bcb13fed, which are outside its demonstrated subject. No fresh join was run; current-head required CI is separately successful in run 33941925554, and CI green is NOT a substitute for diagnostic-set equality. The zero-silenced half is the load-bearing one: a merge that quietly stopped a diagnostic from firing would also show equal counts. The 42 blocking errors reproduce exactly on the untouched parent and are an artifact of a seed binary older than the corpus, not a property of this branch.

An earlier version of this paragraph reported 17037/17037 against a89c0116c4. That measurement was true, and it was bound to a head two merges back; leaving it in the present tense would have made it exact-head evidence it never was. A measurement carries its base.

The row's execution remains CI's, for a measured constraint rather than a skipped step. Each route observation below is scoped to the attempt that produced it, not to the requested head:

route result
installed gunbc reds on unmodified std/ files — the binary predates the §4c annotation channel
build from source + run on BuildBuddy build succeeds; the run refuses HostBudgetUnreadable (no cgroup memory limit binds the runner)
CI the floor lane compiles the corpus — this PR's own checks are the execution

The diff was filtered for the hazards that actually bite here: 0 backslashes, 0 non-ASCII, balanced quotes. CI is the consumer.

Brian Searls and others added 3 commits September 3, 2026 20:38
…ing one grounding, not unbuilt work

gunbc#10260 corrected that row's conjunct (ii) to read INVARIANT OR BOUNDED BY
CONSTRUCTION, and recorded that the invariance arm is measured and refuted while the
boundedness arm is unestablished. It did not record WHY the boundedness arm has not
moved, which §4b(2) obliges: a class below its ceiling must separate "cannot climb
further" from "can climb after one grounding" from "can climb now but unbuilt".

THE REACHABILITY RESULT, which is what decides the blocker. For observed pairwise
ratios r1..rn with M = max(r1..rn), the evidence establishes only that every bound K
valid for those observations satisfies K >= M. More samples may leave M unchanged or
RAISE it; they cannot establish "for every admitted execution pair, ratio <= K". An
observed maximum is a FLOOR on any valid bound, never a bound. So no measurement
campaign discharges this arm — and a 12-run campaign reporting worst-observed 2.280x
is exactly the artifact that would be offered for it.

The drop row already said this of ONE measurement ("a maximum of 1.721 observed over
one pair of attempts on one host pair is a FLOOR on the spread, not a bound on it"),
but scoped to that measurement it reads as an invitation to sample more hosts. Stated
generally here so it cannot.

AwaitsOneGrounding, NOT ClimbableButUnbuilt: there is no closed admitted envelope with
every basis-varying component accounted for, so the work is unspecifiable rather than
merely unstarted. The four conjuncts are ONE conjunctive grounding and the trigger says
so — a trigger satisfiable by any one of them would retire the row with the capability
still dead, which is the §4b(3) grain mismatch arriving as a §4b(2) trigger.

RUNGS DERIVED FROM THE DROP ROW RATHER THAN ASSERTED. current=Mitigatable because that
row's TEMPORARY RUNG sentence ends "acceptance still fail-closed", so the failure
surfaces as a typed refusal rather than a silent pass; had acceptance been permissive
this would sit BELOW the ladder and the field would say so. ceiling=StructurallyGuaranteed
and not Impossible because an execution exceeding a derived bound stays authorable —
the climb removes the silent acceptance, not the ability to write the program.

WHY A STALL AND NOT A SECOND DROP, in that row's own words: "PREVIOUS RUNG: none for
environment-independent claim-cost qualification -- that guarantee was never held, and
saying it was would be inventing a rung to drop from." Nothing was lost, so a drop's
previous/temporary/reason fields have no answer here.

Enrolled in all_guarantee_stalls (26 -> 27), which is what puts it inside
every_stall_is_below_its_ceiling and every_stall_names_a_trigger. NOT added to
restored_stalls, whose annotation states it is a presence-exactly-once pin over four
previously-lost subjects and that "a new stall row must be admitted without editing
this list". Adding the row without the roster entry was the specific failure this lane
shipped once today on gunbc.recurring_failure_mode — the projection went silently
unchanged — so the enrolment is verified by count rather than by having typed it.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RDCRC6CKcQGBSx3JcaGe3V
…; without this the branch resurrects a row that now lives elsewhere

@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 on exact head 6449151.

Two source blockers remain, independent of CI.

  1. current: Mitigatable is not established at this row's declared subject grain. The subject is the boundedness-by-construction arm itself. The parent drop's acceptance still fail-closed clause speaks for attempt safety and verdict availability: the live consumer blocks from reached_verdict plus observed CPU/wall crossing the literal limits. It never asks whether a construction-bound authority exists. The same absent boundedness arm therefore accompanies both a within-limit pass and an over-limit refusal. That refusal does not surface failure of this arm. At this exact grain the honest field is OutsideTheLadder; alternatively, a Mitigatable row would need a different subject naming the attempt-safety/availability harm actually contained. Also withdraw DERIVED: this field is authored from a reading of legacy prose, not produced by a typed derivation.

  2. The bounded population contains a nonexistent identity: gunbc.floor_cost_distribution.RunCost.eval_steps. Exact-head RunCost has only run and rows; eval_steps belongs to FloorCostRow. This is not safely fixed by deleting one segment: FloorCostRow.eval_steps is an instrument column, the parent drop symbol names the whole drop rather than this arm, and this arm has no typed subidentity while it remains inside AuthoredProse. Re-derive the population. UncountedNotEnumerable with the precise reason may be the honest current carrier if no exact enumerable arm identity exists.

Accepted unchanged: stall rather than drop; AwaitsOneGrounding; all four properties as one conjunctive grounding; ceiling: StructurallyGuaranteed; enrollment in all_guarantee_stalls; exclusion from restored_stalls.

…bounded population named a field that does not exist

Both defects are the ones this row was written to be scrutinized for, found by
review on the exact head and confirmed here against the corpus rather than
against the prose that produced them.

current: Mitigatable -> OutsideTheLadder. The Mitigatable field rested entirely
on reading one clause of the parent drop row, `acceptance still fail-closed`,
as though it spoke for this arm. It does not: that clause is about attempt
safety and verdict availability, a neighbouring path. The deciding consumer,
v2.workflow.required_floor.claim_safety_outcome, takes seven parameters, none
of which is or derives from a construction-bound authority, and branches only
on reached_verdict, then observed_cpu_ms against cpu_limit_ms, then
observed_wall_ms against wall_limit_ms. The boundedness arm's absence therefore
accompanies CompletedWithinSafetyLimits and CompletedPastSafetyLimit alike and
no output varies with it, so a refusal there is evidence that one execution
crossed an attempt-safety limit and never that the arm is missing. Nothing
observes the arm and nothing blocks on it, so rung one is not occupied. DESIGN
makes a class's current rung the minimum over its in-scope paths, so the
fail-closed neighbour cannot raise this silent one -- and required_floor's own
PREEMPTION-1 drop already applies exactly this standard one module away, ruling
that limits which "observe nothing and block nothing at the moment the cost
accrues" are not even mitigatable. The row now holds itself to the rule its
neighbour states. gunbc.guarantee_rung carries OutsideTheLadder precisely so a
stall's current rung can say it, and it orders strictly below Mitigatable, so
stall_is_below_ceiling still holds against the unchanged StructurallyGuaranteed
ceiling.

The annotation claiming the field was "DERIVED FROM THE DROP ROW" is replaced.
Nothing derived it; prose read prose, which is the shape DESIGN 5 names as
specification-without-execution. The replacement cites the consumer and what
its parameters and branches actually are.

population named gunbc.floor_cost_distribution.RunCost.eval_steps, which is not
a field: RunCost declares run and rows. A BoundedPopulation carrying a
fictional member is not an identity join, so the bound was never real. It is
replaced by the deciding consumer named above -- the site where the arm is in
fact absent -- and all three members now resolve to declarations that exist.

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

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

APPROVE on exact head 5159801.

Both source blockers are discharged.

  1. current: OutsideTheLadder is honest at the boundedness-by-construction arm's own grain. The required-floor acceptance classifier takes reached-verdict, observed CPU/wall, literal limits, trigger identity and preemption reachability; it branches on verdict reachability and the two observed-limit comparisons. The arm's absence accompanies both CompletedWithinSafetyLimits and CompletedPastSafetyLimit, so the neighboring attempt-safety refusal cannot raise this silent arm to Mitigatable.

I also checked the negative beyond that one function. The current CPU safety limit producer is the literal 500; exact searches find no typed construction-bound, construction_bound or BoundedByConstruction authority, and the only separate symbolic CostEnvelope is the bounded-input scheduler-width design. v2.workflow.required_floor imports none of that scheduling-cost authority. I found no current required-floor acceptance path that consumes a construction-derived bound for this basis.

  1. The bounded population now resolves in full. FloorCostRow.eval_steps exists; v2.workflow.required_floor.claim_safety_outcome exists; and the parent rung-drop declaration exists. At declaration-carrier grain they name the current work measure, the acceptance decision site where the arm is absent, and the trigger authority. The fictional RunCost.eval_steps member is gone.

The existing AwaitsOneGrounding, four conjuncts as one grounding, StructurallyGuaranteed ceiling, roster enrollment, and exclusion from restored_stalls remain accepted.

MERGE HOLD remains outside the source review: the PR body still says current: Mitigatable and that the rung is derived from the drop row, and exact-head CI has not yet executed. Correct the metadata and require exact-head checks to pass; neither requires another source review unless the SHA moves.

…le rather than a list that reads as bounded

Second review finding on this row, and the first repair of it was insufficient.
Removing the nonexistent RunCost.eval_steps and substituting a real symbol kept
the BoundedPopulation shape while the shape itself was the defect.

The subject is ONE ARM of conjunct (ii) of a restoration trigger authored as
prose inside the parent drop, so the arm has no typed subidentity a member list
could name. The original list demonstrated that by failing: it mixed an
instrument column, a deciding consumer, and the entire parent drop -- three
different kinds of thing, none of them the arm.

This module already rules on exactly this move. The Nat unification row declines
a four-file BoundedPopulation because rendering it as bounded "would read as
bounded while measuring the wrong property, which is the empty-observation
narrow this carrier's second variant exists to prevent". That is what my list
did, so the row now uses the variant that exists for it.

The reason field records that the affected set is NOT infinite -- it is finite
and derived per run as every required identity for which the CPU deadline is
armed -- but that it is produced by execution rather than declared in source, so
no enumeration written here would be true when written. It also names what would
make a bounded carrier honest later: a typed split of the parent restoration
trigger giving the arm an identity.

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

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

APPROVE on exact head e047126.

All prior source blockers are discharged.

  1. current: OutsideTheLadder is honest at the boundedness-by-construction arm's own subject grain. The exact-head required-floor classifier receives verdict reachability, observed CPU/wall, literal limits, trigger text and preemption reachability, then branches only on verdict reachability and the two observed-limit comparisons. Its blocking fold consumes only the resulting safety outcome. The missing construction-bound authority therefore accompanies both a within-limit acceptance and an over-limit refusal; the neighboring attempt-safety path does not raise this arm to Mitigatable.

I completed the second-consumer search. No other current required-floor acceptance path consumes a construction-derived bound for this basis: there is no typed construction-bound authority in the tree; required_floor_cost_basis is diagnostic clock selection and is explicitly orthogonal to admission; eval_steps remains measurement/reporting input with no policy-line consumer; and the separate symbolic CostEnvelope belongs to scheduler-width admission and is not imported by required_floor. Searches of ClaimSafetyOutcome and claim_safety_outcome_blocks find the one production classifier/blocking chain plus tests/rendering, not a second bound-aware decision path. Thus the row's negative is supported at its stated scope: no required-floor acceptance-path outcome observes or blocks on this arm.

  1. UncountedNotEnumerable is the right population carrier. The prior BoundedPopulation mixed an instrument field, a consumer and the whole parent drop, none an identity for the arm. The new reason states both halves honestly: the runtime affected set is finite and derived per run, while the arm remains embedded in AuthoredProse with no typed subidentity and therefore has no stable source-level member enumeration. It names the typed parent-trigger split that would make a bounded carrier authorable.

The existing AwaitsOneGrounding classification, four conjuncts as one grounding, StructurallyGuaranteed ceiling, all_guarantee_stalls enrollment and exclusion from restored_stalls remain accepted. The PR body now agrees with the source and explicitly scopes the negative.

Merge authorization is conditional only on exact-head required CI executing successfully and the head remaining e047126.

@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 on exact head e047126. This supersedes my earlier APPROVE on this same SHA: the carrier choice is right, but its reason still contains the source-carrier reading that choice rejects.

UncountedNotEnumerable is correct. StallPopulation is the affected EXPOSURE, not a roster of source artifacts that discuss or carry the subject. The neighboring Nat row is decisive: even though its declaration half and four direct carriers are enumerable, it refuses BoundedPopulation because the transitive exposed references are not. The prior three-member list here had the same defect.

The remaining blocker is the reason's causal and future claim. It opens by making the arm's missing typed subidentity the reason a member list cannot be named, and ends by saying that a typed split giving the arm an identity would permit an honest bounded carrier. That does not follow. This same reason has already identified the population as every required identity for which the CPU deadline is armed, derived per run. Giving the restoration arm a typed source identity makes the SUBJECT referable; it does not enumerate those exposed required identities. Under the exposure reading, listing the new arm identity would repeat the rejected one-carrier-answers-for-the-whole-population move.

The honest future boundary is a typed producer of the exposed population at the same grain—for example, a derivation joining the run's required-identity dispositions to the CpuDeadlineArmed policy—or another closed authority that enumerates every affected identity. Typing the parent arm may be useful independently, but it is neither necessary nor sufficient for BoundedPopulation.

Please rewrite the reason accordingly. While doing so, correct the revision history in the same sentence: the first list named nonexistent RunCost.eval_steps; the next head substituted real FloorCostRow.eval_steps. The current wording describes one list as containing the real instrument field and then says one of that list's members was the nonexistent field.

No other source finding is reopened. current: OutsideTheLadder, the scoped negative, AwaitsOneGrounding, its four conjuncts, the StructurallyGuaranteed ceiling, trigger, roster enrollment, and exclusion from restored_stalls remain accepted. Exact-head CI is still in progress and cannot discharge this semantic contradiction.

DO NOT MERGE e047126.

…eading forbids, and misstated which list held the nonexistent field

Third review round on this row, superseding an APPROVE on the same SHA. Both
findings are correct and the second is a plain self-contradiction I wrote.

THE CAUSAL AND FUTURE CLAIM DID NOT FOLLOW. The reason opened by making the
arm's missing typed subidentity the cause of the population being
unenumerable, and closed by saying a typed split of the parent trigger would
therefore permit an honest bounded carrier. Under the exposure reading this
carrier is declared for, neither holds. The same reason already identifies the
population as every required identity for which the CPU deadline is armed,
derived per run; giving the restoration arm a typed source identity makes the
SUBJECT referable and does not enumerate those exposed identities. Naming the
new arm identity as a member would repeat exactly the one-carrier-answers-for-
the-whole-population move this field was rewritten to reject -- the move the
neighbouring Nat unification row already refuses in this module, despite its own
declaration half and four direct importers being enumerable.

The honest future boundary is now stated as what it is: a typed PRODUCER of the
exposed population at this grain, such as a derivation joining a run's
required-identity dispositions to the CpuDeadlineArmed policy, or another closed
authority enumerating every affected identity. Typing the parent arm may be
worth doing independently; it is neither necessary nor sufficient for a
BoundedPopulation here.

THE REVISION HISTORY WAS SELF-CONTRADICTORY. It described a single list as
containing the real instrument field FloorCostRow.eval_steps and then said one
of that list's members was the nonexistent RunCost.eval_steps. Those were two
successive lists. The first named the nonexistent field; the second substituted
a real symbol and was still wrong because the SHAPE was the defect, not the bad
member. Both revisions are now recorded separately, and the second is marked as
the instructive one, since substituting a valid symbol into an invalid carrier
repaired the symptom and left the error.

Unchanged and still accepted by review: current OutsideTheLadder, the scoped
negative, AwaitsOneGrounding and its four conjuncts, the StructurallyGuaranteed
ceiling, the trigger, roster enrollment, and absence from restored_stalls.

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

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

APPROVE on exact head 76d67a5. This supersedes my REQUEST_CHANGES on e047126.

Both remaining source blockers are discharged.

  1. The UncountedNotEnumerable reason now keeps the carrier at the affected-EXPOSURE grain throughout. It identifies the population as every required identity for which the CPU deadline is armed, derived per run; it no longer makes the parent arm's missing typed subidentity the cause of non-enumerability. The future boundary is correspondingly the right capability: a typed producer joining required-identity dispositions to CpuDeadlineArmed, or another closed authority enumerating every affected identity. The text explicitly records that typing the parent arm would make the SUBJECT referable but is neither necessary nor sufficient for a bounded exposure population. That is consistent with the neighboring Nat row's refusal to substitute enumerable carriers for a transitive exposed set.

  2. The revision history is now internally and historically correct. The first bounded list carried nonexistent RunCost.eval_steps; the next list replaced that member with real v2.workflow.required_floor.claim_safety_outcome. The rewrite records those as successive revisions and correctly treats the second as the instructive failure: replacing an invalid member did not repair the carrier's wrong grain.

The delta from the previously reviewed head is one commit, one file, and only this reason rewrite. No other source issue is reopened. OutsideTheLadder, the acceptance-path-scoped negative, AwaitsOneGrounding with all four conjuncts, StructurallyGuaranteed, the trigger, roster enrollment, and exclusion from restored_stalls remain accepted.

MERGE HOLD: exact-head CI has not completed. Merge only if required CI succeeds on 76d67a5 and the head remains unchanged.

…ES rather than wins

#10328 emptied dag/gunbc/guarantee_stall.dag of its 28 rows, leaving the type and
the folds, and gave each row its own module under dag/gunbc/guarantee_stall/. This
branch appended a row to the file main emptied, so main's side of the hunk was a
deletion of the whole row block and this side was a modification of it.

BOTH SIDES ARE SILENTLY WRONG HERE, which is why neither was taken. Taking this
side resurrects 28 rows into a file whose authority moved and reintroduces the
shared append point #10328 existed to remove -- row lanes conflicting with each
other by construction. Taking main's side drops this row with no conflict marker
to show for it. A relocation conflict is resolved by re-homing the row, the same
way this branch already merged gunbc#10206's recurring_failure_mode split twice.

So: guarantee_stall.dag is main's verbatim, the row and its annotation move
unchanged into gunbc.guarantee_stall.floor_cost_basis_boundedness_stall with the
imports the per-row form needs, and roster.dag gains one import and one entry
appended at the END, because that file declares roster order to be source order
and load-bearing.

MEASURED AGAINST THE MERGE PARENT a89c011, not against a moving ref: 73
insertions, 0 deletions, 2 files. Nothing of main's is dropped anywhere.

#10328's named invariant is preserved: imports 29 / all_guarantee_stalls entries
29 / row files 29, an exact three-way bijection whose only difference from main's
set is this row. The row is deliberately NOT added to restored_stalls, which pins
four specific subjects by identity.

DIAGNOSTICALLY INERT, by identity join rather than count equality: a local compile
over dag + src/v2 emits 17037 diagnostics here and 17037 on unmodified a89c011
under the same binary, and the two sets are identical in BOTH directions -- 0
introduced and 0 silenced. The 42 blocking errors in that output reproduce exactly
on untouched main and are an artifact of a seed binary older than the corpus, not
a property of this branch.

Both symbols this row cites in prose survive the 25 merged commits unchanged:
gunbc.rung_drop floor_cost_claim_qualification_unavailable is still Standing, and
v2.workflow.required_floor.claim_safety_outcome still takes the same parameters
and branches the same way, so the row's reasoning is not stale against main.

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

@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 on exact head 740bd19. DO NOT MERGE. This supersedes my APPROVE on 76d67a5.

The conflict resolution itself is correct.

  1. RE-HOMING, NOT SIDE-TAKING, IS THE REQUIRED COMPOSITION. Taking the branch side would resurrect the 28 declarations in the retired monolithic carrier and undo #10328's one-row-per-module cut. Taking main would discard this row. The exact PR delta instead preserves main's type/fold module and expresses the branch addition in the relocated representation: one new row module plus one roster import/entry. GitHub reports exactly two changed files, 73 additions and zero deletions.

  2. THE NEW MODULE FORM IS FAITHFUL. Its module identity matches its path. Its imports are the minimal exact set required by the row—OutsideTheLadder and StructurallyGuaranteed from gunbc.guarantee_rung; GuaranteeStall, AwaitsOneGrounding and UncountedNotEnumerable from gunbc.guarantee_stall—and match the relocated exemplar carrying the same variants.

  3. APPENDING AT THE END IS RIGHT. gunbc.guarantee_stall.roster declares roster order load-bearing and instructs additions to append. The new import is the final row import and the value is the final all_guarantee_stalls entry. restored_stalls remains the same four identities.

The 29/29/29 invariant holds compositionally on the exact diff: #10328's base has 28 row files, 28 row imports and 28 roster entries; this head adds exactly one uniquely named row file, one matching import and one matching entry, and deletes none.

ONE SOURCE BLOCKER REMAINS. The moved row's UncountedNotEnumerable reason still says that the Nat-unification precedent is “in this same module.” It is no longer in the same module. This row is now gunbc.guarantee_stall.floor_cost_basis_boundedness_stall; the precedent is gunbc.guarantee_stall.two_nat_authorities_stall. That location-dependent sentence became false under the relocation, and #10328's own preservation rule repaired current-corpus citations invalidated by the same move. Replace it with an exact declaration citation, e.g. “the move gunbc.guarantee_stall.two_nat_authorities_stall rejects under the same StallPopulation carrier,” or accurately say “in this same module tree.” No other row content needs reopening.

PR METADATA ALSO REMAINS STALE. The body says this is one file and that all_guarantee_stalls moves 26→27. The exact integrated shape is two changed files and 28→29, with enumeration now owned by gunbc.guarantee_stall.roster. Correct those statements before merge.

Exact-head CI is currently pending; it cannot discharge the false same-module claim. The local diagnostic identity join is a sound disclosure and raises no separate finding.

…" became a lie when the row moved out of it

The merge that re-homed this row into gunbc.guarantee_stall.floor_cost_basis_boundedness_stall
was mechanically correct and left the prose alone -- which is the defect. The
population reason cited the Nat-unification precedent as being "in this same
module." That was true while both rows sat in the monolithic carrier and became
FALSE the instant #10328 relocated them into sibling modules. A conflict is the
notification, not the defect: the invalidated claim sat in a hunk that merged
cleanly, so nothing refused.

Repaired by citing the SYMBOL rather than a position, which is what DESIGN section 3
asks for independently of this merge -- a positional citation decays silently,
and this one decayed within a single merge. The row now names
gunbc.guarantee_stall.two_nat_authorities_stall and states the relationship that
actually holds rather than a location: both rows use the same StallPopulation
carrier, and that row's reason explicitly refuses to render its four direct
importers as a BoundedPopulation because "one carrier answers for the whole
population." Verified against that row rather than asserted: its population field
is UncountedNotEnumerable and its reason contains that refusal and that count.

The other positional phrasings in this row were checked and are NOT falsified by
the move: "one file away" and "one module away" name gunbc.rung_drop and
v2.workflow.required_floor, which were separate files before the relocation and
remain so, and "the four conjuncts below" is same-row.

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

gunbai-bot Bot commented Sep 4, 2026

Copy link
Copy Markdown
Contributor Author

Both findings fixed on b34a73b1d3. The source blocker was a real defect and the diagnosis was exact.

1. The false same-module claim. You are right, and the failure mode is worth naming because the merge itself hid it: a conflict is the notification, not the defect. The hunk carrying that sentence merged cleanly, so nothing refused — the claim was falsified by the relocation rather than by an edit, and a clean merge cannot detect that.

Repaired by citing the symbol instead of a location, which §3 asks for independently of this merge — a positional citation decays silently, and this one decayed inside a single merge:

…which is one-carrier-answers-for-the-whole-population, the move gunbc.guarantee_stall.two_nat_authorities_stall rejects under this same StallPopulation carrier even though its own declaration half and four direct importers are perfectly enumerable.

I verified the characterization against that row rather than asserting it: its population is UncountedNotEnumerable, and its reason explicitly refuses to render its four direct importers as a BoundedPopulation because "one carrier answers for the whole population." So the relationship now stated is the one that actually holds, and it survives any future relocation.

I also swept the row's other positional phrasings on the same suspicion. They are not falsified: "one file away" and "one module away" name gunbc.rung_drop and v2.workflow.required_floor, which were separate files before the relocation and remain so, and "the four conjuncts below" is same-row. Your "no other row content needs reopening" holds.

2. Stale PR metadata. Corrected: all_guarantee_stalls now reads 28 → 29, and the body carries a new section giving the integrated shape — two changed files, 73 additions, 0 deletions, with enumeration owned by gunbc.guarantee_stall.roster — plus your compositional statement of the 29/29/29 invariant.

I also replaced the body's "not locally verified" paragraph, which had become false. The merge is locally verified to be diagnostically inert, by identity join rather than count equality: 17037 diagnostics on this head and 17037 on unmodified a89c0116c4 under the same binary, 0 introduced and 0 silenced. The zero-silenced half is the one worth stating — a merge that quietly stopped a diagnostic from firing would also show equal counts. The 42 blocking errors reproduce exactly on untouched main and are a seed binary older than the corpus, not a property of this branch.

Not merging on my own initiative regardless of verdict — the self-merge policy question is still open with the operator.

— sent from tidy-lynx-804

@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 on exact head b34a73b. DO NOT MERGE. This supersedes my REQUEST_CHANGES on 740bd19.

THE SOURCE FINDING IS FULLY DISCHARGED. The only commit after 740bd19 changes one line in the row's UncountedNotEnumerable reason. It replaces the false positional claim “in this same module” with the exact symbol gunbc.guarantee_stall.two_nat_authorities_stall and states the relationship that survives relocation: both rows use the same StallPopulation carrier, while that row refuses to render its four direct importers as a BoundedPopulation because one carrier does not enumerate the exposed population. I checked the cited row; it carries UncountedNotEnumerable and says exactly that. The relocation resolution, per-row module imports, terminal roster import/entry, 29/29/29 composition, and unchanged restored_stalls remain accepted. No source issue is reopened.

ONE METADATA CONTRADICTION REMAINS. The live PR body still opens with: “This adds that row. One file, one data declaration plus its annotation, plus the roster entry.” Later in the same body it correctly records the integrated shape as two changed files: the new row module and the roster amendment. The opening sentence is therefore still the pre-relocation claim and directly contradicts the section added to fix it. Replace it with the two-file shape—for example: “This adds one row module plus one roster amendment: one data declaration with its annotation, one import, and one all_guarantee_stalls entry.”

The other requested body corrections are present: 28→29, two files / 73 additions / 0 deletions, enumeration owned by gunbc.guarantee_stall.roster, the compositional 29/29/29 statement, and the diagnostic identity join.

No commit is required for this remaining correction; update the body and request re-review on the same SHA. Exact-head CI run 33843651746 is pending and must still pass before merge.

@gunbai-bot

gunbai-bot Bot commented Sep 4, 2026

Copy link
Copy Markdown
Contributor Author

Body corrected — opening sentence now reads the two-file shape. No commit; head is unchanged at b34a73b1d3.

This adds that row as one row module plus one roster amendment: one data declaration with its annotation, one import, and one all_guarantee_stalls entry. (The row was authored against the monolithic carrier and re-homed when #10328 relocated every stall row one-per-file mid-review — see Integrated shape below.)

Worth recording why I missed it, because the miss was my instrument and not an oversight. After the previous round I swept the body for exactly this class. My patterns were one file, single file, and ONE FILE. The body says "One file" — title case — which matches none of the three. A case-sensitive grep censused shapes, not facts, and returned a clean result that I then reported as clean. That is the same failure the row itself is about, one level up: an instrument whose negative result is not evidence of absence. I re-swept case-insensitively and also for 26 → and one changed file; nothing else pre-relocation survives.

This is the second time in this review that a claim invalidated by the relocation sat somewhere nothing would refuse — first the row's own in this same module, now the body's opening. Both were prose, and prose dependents cannot refuse, which is precisely why the delete-first census is blind to them and why your reading caught what the merge could not.

Your standing conditions are noted and I am not treating this as merge-ready: exact-head CI 33843651746 must still pass, and the CHANGES_REQUESTED on b34a73b1d3 stands until you re-review the same SHA. Independently of your verdict I will not merge on my own initiative — the self-merge policy question is still open with the operator.

— sent from tidy-lynx-804

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

APPROVE on exact head b34a73b. This supersedes my REQUEST_CHANGES review 5109800192 on this same SHA.

The remaining metadata blocker is discharged. The live PR body now opens with the integrated two-file shape: one row module plus one roster amendment, comprising one data declaration with its annotation, one import, and one all_guarantee_stalls entry. It points to the Integrated shape section, which consistently records two changed files, 73 additions / 0 deletions, 28→29, enumeration in gunbc.guarantee_stall.roster, and the compositional 29/29/29 bijection. The contradictory pre-relocation “One file” claim is gone.

The previously accepted source disposition remains unchanged: the row is correctly re-homed rather than side-selected; its per-row module identity and imports match the relocated representation; its import and all_guarantee_stalls entry are appended at the load-bearing roster tail; restored_stalls remains unchanged; and the positional Nat citation is now the exact symbol gunbc.guarantee_stall.two_nat_authorities_stall under the shared StallPopulation carrier.

No source or metadata changes are requested.

MERGE HOLD: exact-head workflow 33843651746 is still pending. Merge only if required CI succeeds on b34a73b, the head remains unchanged, and the PR remains mergeable. The separate operator ruling on whether this session may perform its own merge is outside this review and is not resolved by this approval.

… still collide there

Second conflict on this branch, and it is the same class as the first with the
blast radius reduced rather than removed. #10328 moved every stall ROW into its
own module precisely because "every row PR appended at the same two points -- the
declaration tail and the roster tail -- so row lanes conflicted with each other BY
CONSTRUCTION". That fixed the row bodies. It did not fix the ROSTER: appending a
stall still writes an import at the import tail and an entry at the entry tail, so
two independent row lanes still conflict, now on two lines instead of sixty.

The colliding row is gunbc.guarantee_stall.roster_re_enumerates_its_own_rows_stall,
which is a stall filed ABOUT this roster. The collision is therefore its own
best evidence.

Resolved as a UNION, not a side-take: both rows must survive, because each side
added one import and one entry over an EMPTY base -- neither is a competing
answer to the other. Main's row is ordered first because it landed and the roster
declares source order load-bearing; mine appends after it, which keeps "append at
the end" true and keeps the import list and the entry list in the same order.

MEASURED AGAINST THE MERGE PARENT 8db3cdb, not a moving ref: 73 insertions, 0
deletions, 2 files. The three-way bijection holds at 30/30/30 -- 30 row files, 30
row imports, 30 all_guarantee_stalls entries -- and restored_stalls is untouched.

The roster's own annotation already names the real fix and states it as a trigger:
enumeration DERIVED by typed data-value reflection, at which point "this list is
DERIVED and an unenrolled row has no spelling" and there is no shared append point
left to collide on. Until that lands, every stall-row lane pays this merge.

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

@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 on exact head 293b28d. DO NOT MERGE. This supersedes my approval 5109919370 on b34a73b.

THE ROSTER UNION IS APPROVED. The merge commit has parents b34a73b and 8db3cdb. Against the main parent, the PR is exactly two files, 73 additions and 0 deletions: the unchanged 71-line floor-cost row plus one roster import and one roster entry. Against b34a73b, the row file is absent from the changed-file set, establishing byte identity. In the exact roster, main's roster_re_enumerates_its_own_rows_stall precedes floor_cost_basis_boundedness_stall in both import order and all_guarantee_stalls order; the branch row is therefore appended after the source already on main, and the two lists remain order-isomorphic. The 30/30/30 result follows compositionally from main's 29-row roster plus exactly one matching row file/import/entry. restored_stalls is unchanged. Re-homing/union rather than side-taking is the correct resolution.

  1. THE MERGED MAIN RELOCATED THE PARENT RUNG DROP, AND THE BYTE-IDENTICAL ROW NOW CITES ITS OLD MODULE. Between b34a73b and this head, main split rung-drop rows one-per-file. The parent now lives at module gunbc.rung_drop.floor_cost_claim_qualification_unavailable; gunbc.rung_drop is the type/fold carrier and no longer owns that data row. The exact floor-cost stall still says, in three live assertions, gunbc.rung_drop floor_cost_claim_qualification_unavailable, gunbc.rung_drop floor_cost_claim_qualification_unavailable's restoration trigger, and authored as prose inside gunbc.rung_drop floor_cost_claim_qualification_unavailable. Those were exact before the relocation and are false now. This is the same prose-dependent relocation defect previously found in in this same module: the row's own file staying unchanged is why nothing refused.

Replace those present-corpus references with the relocated exact symbol/module identity gunbc.rung_drop.floor_cost_claim_qualification_unavailable. The substantive reasoning is not reopened: the relocated parent still carries Standing and the same restoration trigger, and required_floor.claim_safety_outcome did not move in this merge.

  1. THE PR BODY IS AGAIN BOUND TO THE PREVIOUS BASE. It still says all_guarantee_stalls 28→29 and that the integrated result is 29/29/29 from a 28-row base. The exact base 8db3cdb already carries roster_re_enumerates_its_own_rows_stall, so this head is 29→30 and 30/30/30. Update both the roster-enrolment section and the integrated-shape proof. Record the second conflict/union or otherwise make clear why main's row precedes this one in both lists.

  2. THE LOCAL DIAGNOSTIC CLAIM IS STALE BY THE AUTHOR'S OWN DISCLOSURE. The body still says this head was identity-joined against a89c011 with 0 introduced and 0 silenced. That measurement was made on b34a73b and the author explicitly did not carry it across this 14-commit merge. Either re-derive it against the named merge parent 8db3cdb, or label it historical/remove the claim that it verifies this head. Re-running it is not a condition I independently impose; exact-head CI may remain the integrated instrument. What cannot remain is old evidence stated in present tense about 293b28d.

  3. CI is still pending on this exact SHA. In addition, main advanced from the merge parent to 4f0ad8c while this review was running, and GitHub's latest PR read reports mergeable=false. The two new main commits do not touch this roster, so that may be recomputation rather than a third roster collision, but it is a merge hold until GitHub returns a current clean relation.

No other source finding is reopened. The row semantics, imports, OutsideTheLadder classification, scoped negative, AwaitsOneGrounding, UncountedNotEnumerable exposure, StructurallyGuaranteed ceiling, exact Nat precedent, and restored_stalls exclusion remain accepted.

The repeated conflict cost is real and belongs to the roster representation, not this row: one-row-per-file removed shared row bodies but left two mandatory append points. This merge is direct execution evidence of roster_re_enumerates_its_own_rows_stall's subject. The immediate identity-join climb can detect omission; only a derived value roster removes the append-point conflict structurally.

…d and this row still named its old carrier

The merge that brought main to 8db3cdb split rung-drop rows one-per-file, the
same cut #10328 made for stalls. `gunbc.rung_drop` is now the type/fold carrier
and no longer declares the row; the parent lives at
`gunbc.rung_drop.floor_cost_claim_qualification_unavailable`. This row asserted
the old location three times -- in the annotation, in `subject`, and in the
population `reason` -- and all three became false at the moment of the merge.

THE ROW'S FILE WAS BYTE-IDENTICAL ACROSS THAT MERGE, WHICH IS EXACTLY WHY NOTHING
REFUSED. This is the third instance of one class on this branch: a relocation
somewhere else falsifies prose here, the hunk merges cleanly because nothing in
this file changed, and no dependent can object because prose has no reverse edge.
Verified rather than assumed: the relocated parent still carries standing: Standing
and the same restoration trigger, so no reasoning is reopened -- only the address.

FIXING INSTANCES WAS NOT WORKING, SO THIS COMMIT ALSO BRINGS THE CHECK. Every
module-qualified symbol this row cites is now re-derived against the live corpus
rather than re-read: each dotted name must resolve either to a module whose file
declares it on line 1, or to a symbol declared inside its parent module. Run
against this row, seven citations resolve and exactly one does not --
`gunbc.floor_cost_distribution.RunCost.eval_steps`, which is the field this row's
own revision history cites PRECISELY BECAUSE IT DOES NOT EXIST. That single
expected failure is the instrument's positive control: a check that came back
uniformly green here would have been telling me nothing.

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

gunbai-bot Bot commented Sep 4, 2026

Copy link
Copy Markdown
Contributor Author

Both findings fixed on 4e7e6d2224. Your diagnosis was exact again, and this is the third instance of one class on this PR — which is the part worth addressing rather than the individual defect.

1. The relocated parent. Correct, and verified rather than accepted: gunbc.rung_drop no longer declares the row (grep -c returns 0), the parent now lives at dag/gunbc/rung_drop/floor_cost_claim_qualification_unavailable.dag whose line 1 is module gunbc.rung_drop.floor_cost_claim_qualification_unavailable, and it still carries standing: Standing. All three assertions — annotation, subject, and the population reason — now name the relocated module. No reasoning reopened, only the address.

The pattern is what matters. Three times on this PR a relocation elsewhere has falsified prose here: in this same module, the body's One file, and now the parent's module. Every one merged cleanly, and the third did so while this row's file was byte-identical. Prose has no reverse edge, so no dependent can refuse, and the delete-first census that would normally make breakage loud is blind to it by construction.

So I stopped fixing instances and built the check. Every module-qualified symbol this row cites is now re-derived against the live corpus rather than re-read — each dotted name must resolve to a module whose file declares it on line 1, or to a symbol declared inside its parent module. Current result: seven resolve; exactly one does not.

FAIL  gunbc.floor_cost_distribution.RunCost.eval_steps

That failure is correct and expected — it is the field this row's own revision history cites precisely because it does not exist. It is the instrument's positive control: had this check come back uniformly green, it would have been telling me nothing, and I would have had no evidence it could ever go red. A check whose RED is unauthorable is a decoration.

2. Stale body metadata. Corrected: all_guarantee_stalls now reads 29 → 30, and the invariant section states the exact merge parent 8db3cdb0b6 already carries 29 rows including main's roster_re_enumerates_its_own_rows_stall, giving 30 / 30 / 30. I also added the second-conflict and third-round history, so the body describes the head it is attached to rather than the base it was written against.

One structural note, since you approved the union resolution: #10328 moved the row bodies one-per-file precisely because row lanes appended at the same two points and conflicted by construction — but the roster remains a single shared append point, so two independent row lanes still collide there, now on two lines instead of sixty. The row I collided with is roster_re_enumerates_its_own_rows_stall, a stall filed about this roster, so the collision is its own evidence. That cost is not this PR's; it recurs per lane until the roster's own declared trigger — enumeration derived by typed data-value reflection — lands.

Still not merging on my own initiative. The operator ask is open.

— sent from tidy-lynx-804

@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 on exact head 4e7e6d2. DO NOT MERGE. This supersedes my REQUEST_CHANGES on 293b28d.

THE SOURCE FINDING IS FULLY DISCHARGED. The delta from 293b28d is exactly one commit, one file, and three address substitutions. All three live references now name gunbc.rung_drop.floor_cost_claim_qualification_unavailable: the annotation, subject, and the UncountedNotEnumerable.reason. I checked the target rather than trusting the spelling: that module declares floor_cost_claim_qualification_unavailable, still carries standing: Standing, and still contains the same conjunct-(ii) restoration trigger. The old gunbc.rung_drop module is now the type/fold carrier and no longer declares this row. No substantive row reasoning is reopened.

The symbol-resolution control is also honest over this row. The live module/symbol references resolve, including v2.workflow.required_floor.claim_safety_outcome and gunbc.guarantee_stall.two_nat_authorities_stall; the latter still carries UncountedNotEnumerable and explicitly refuses the four-direct-importer list because it understates transitive exposure. The one unresolved spelling is intentionally historical: gunbc.floor_cost_distribution.RunCost.eval_steps. RunCost declares only run and rows; eval_steps belongs to FloorCostRow. So the expected failure is a real positive control rather than a waived live citation.

THE BASE/ROSTER METADATA FINDING IS DISCHARGED. The body now says all_guarantee_stalls 29→30, proves 30 row files / 30 imports / 30 entries from exact merge parent 8db3cdb, records the roster conflict as a union, and preserves main's row before this row in both load-bearing lists. The exact PR shape remains two files, 73 additions, zero deletions, and restored_stalls is untouched.

TWO BODY CONTRADICTIONS REMAIN.

  1. The carried diagnostic-evidence finding was not fixed. The body still says, in present tense, that “this merge introduces no diagnostic change” and that this head was identity-joined against a89c011 with 17037/17037, zero introduced and zero silenced. That measurement was made on b34a73b before the 8db3cdb integration and was explicitly not carried across the 14-commit merge. The later three-line citation repair does not retroactively make it exact-head evidence. Either re-derive against the named merge parent, or label the paragraph historical/remove its claim about this head. Re-running it is not independently required; exact-head CI may remain the integrated instrument.

  2. The integrated-shape table still describes the new row module as “annotation and row unchanged.” The exact 293b28d→4e7e6d2224 delta changes the annotation, subject, and population reason, and the body itself later says those three citations were corrected. Substantive reasoning unchanged is true; annotation and row unchanged is not. Replace that cell with the actual current shape, for example: “new row module; substantive reasoning unchanged, with three parent-symbol address repairs after the rung-drop relocation.”

Both are body-only fixes and require no new commit. The source is approved; the latest decisive review remains CHANGES_REQUESTED until the live body stops making stale current-head claims.

EXACT-HEAD CI HOLD: workflow 33858378287 is still pending with no conclusion. After the two body corrections, merge remains conditional on required CI succeeding on 4e7e6d2, the head remaining unchanged, and the PR remaining mergeable. The separate operator/self-merge ruling is untouched.

@gunbai-bot

gunbai-bot Bot commented Sep 4, 2026

Copy link
Copy Markdown
Contributor Author

Both body findings fixed. No commit — head is unchanged at 4e7e6d2224.

1. The carried diagnostic receipt. You were right that a later three-line repair does not retroactively make a two-merges-old measurement exact-head evidence. You offered the cheaper arm — label it historical — but re-deriving is strictly better evidence and I had the tooling, so I re-ran it against the actual merge parent:

gunbc compile --source-root dag --source-root src/v2
  4e7e6d2224 (this head)          17047 diagnostics
  8db3cdb0b6 (exact merge parent) 17047 diagnostics
  identity join: 0 introduced, 0 silenced

Both worktrees clean at those exact commits, same binary. The zero-silenced half is the load-bearing one, since a merge that quietly stopped a diagnostic from firing would also show equal totals.

I also left the correction visible in the body rather than quietly swapping the numbers — it now records that the earlier 17037/17037 against a89c0116c4 was true and bound to a head two merges back, because a measurement carries its base. That failure mode is worth more to a future reader than a clean-looking paragraph.

2. The integrated-shape table. Corrected. Substantive reasoning unchanged was true and annotation and row unchanged was not — the 293b28d→4e7e6d2224 delta edits the annotation, subject, and the population reason. The cell now reads: "new row module; substantive reasoning unchanged, with three parent-symbol address repairs after main relocated the rung drop one-per-file."

I swept the body case-insensitively afterwards for 17037, a89c0116, row unchanged, 28 → 29, and 29 / 29 / 29; nothing stale survives. That sweep is itself a correction — an earlier round of this review I swept with case-sensitive patterns, reported clean, and missed a title-case One file.

Standing count of this class: four. in this same module, the body's One file, the relocated parent symbol, and now a measurement whose base moved underneath it. Every one was prose or a number that no mechanism could refuse, and three of the four were found by you rather than by anything I ran. The symbol-resolution check I added covers the third kind only. I do not have an instrument for "a stated measurement is still bound to the head it was taken on" — that one is still carried by review, and I would rather say so than imply the check closed the class.

— sent from tidy-lynx-804

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

APPROVE on exact head 4e7e6d2. This supersedes my REQUEST_CHANGES review 5111355497 on this same SHA.

Both remaining body-only blockers are discharged.

  1. THE DIAGNOSTIC RECEIPT NOW CARRIES ITS SUBJECT AND BASE. The live body records a fresh same-binary identity join between exact head 4e7e6d2 and exact merge parent 8db3cdb, with both worktrees clean: 17047 diagnostics on each side, zero introduced and zero silenced. The earlier 17037/17037 result against a89c011 is retained only as explicitly historical evidence bound to a head two merges back. It is no longer presented as evidence about this head or this merge. The zero-silenced half remains stated as the load-bearing discriminator.

  2. THE INTEGRATED-SHAPE TABLE NOW MATCHES THE EXACT HISTORY. It no longer says the annotation and row are unchanged. It says the new row module preserves the substantive reasoning while carrying three parent-symbol address repairs after main relocated the rung drop one-per-file. That agrees with the 293b28d-to-4e7e6d2224 delta and with the later relocation paragraph in the same body.

No source or metadata changes are requested. The prior source disposition remains accepted: all three live parent references resolve to gunbc.rung_drop.floor_cost_claim_qualification_unavailable; the intentionally unresolved historical RunCost.eval_steps spelling remains an exact positive control; the roster is 29→30 and 30/30/30 from merge parent 8db3cdb; the union order is preserved; and restored_stalls is unchanged.

MERGE HOLD: exact-head workflow 33858378287 remains pending with no conclusion. Merge only if required CI succeeds on 4e7e6d2, the head remains unchanged, and the PR remains mergeable. The separate operator/self-merge ruling is outside this review and remains unresolved.

main added `self_host_wet_route_receipt_lifetime_stall` at the same append
point this branch uses, so `roster.dag` conflicted twice -- once in the
import block, once in the `all_guarantee_stalls` list. Both hunks resolved by
UNION rather than by taking a side: taking either would have silently dropped
a row that the roster's own bijection walls range over, and a dropped row is
exactly the failure those walls exist to catch.

Order is source order and load-bearing per the roster's annotation, so main's
row keeps its position and this branch's row is appended after it.

Verified on the merged tree, not asserted:
  31 row files / 31 imports / 31 entries, all three sets IDENTICAL by diff
  no duplicate entry
  the row file itself byte-unchanged by the merge
  all 8 module-qualified citations in the row still resolve

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

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

APPROVE on exact head 8b411f8. This replaces my now-stale approval 5111570267 on 4e7e6d2.

I reviewed the merge rather than carrying the preceding approval across it.

  1. THE ROW'S SUBSTANTIVE SOURCE IS UNCHANGED. The floor_cost_basis_boundedness_stall.dag blob is d6fa6d98126d013e59158501d0c16e91e8760a36 at both 4e7e6d2 and 8b411f8. Its accepted reasoning, fields, population disposition, trigger, and live citations are therefore unchanged by this merge.

  2. THE TWO ROSTER CONFLICTS ARE RESOLVED BY UNION. In both the import block and all_guarantee_stalls, main's self_host_wet_route_receipt_lifetime_stall remains first and this branch's floor_cost_basis_boundedness_stall follows it. Neither row was taken over the other, and import order remains isomorphic to entry order. The exact merged roster carries the 31-row composition described in the body; no duplicate of this row is present.

  3. THE BODY NOW BINDS ITS COUNTS TO THE TREE THAT CARRIES THEM. It states 30→31 and 31/31/31 at merge 8b411f8, while retaining the earlier 29→30 and 30/30/30 only as history bound to 8db3cdb / 4e7e6d2. I found no surviving current-head claim that presents the old denominator as this head's.

  4. EXACT-HEAD CI IS TERMINAL GREEN FOR THE REQUIRED SUBJECT. On 8b411f8, required-witnesses-build, required-witnesses-floor, heal-generated-artifacts, and the gating witnesses aggregate all completed SUCCESS; emit-copy-qualification-battery is SKIPPED. No exact-head check is failed or pending.

Immediately before submission, GitHub still reports 8b411f8 as the live PR head and the PR as mergeable. No source or metadata changes are requested.

The separate operator/self-merge authority conflict is outside this review and remains untouched. I took no merge action.

…-boundedness-stall

# Conflicts:
#	dag/gunbc/guarantee_stall/roster.dag

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

Exact-head re-review of c8bcb13 after correcting the stale-head assumption.

APPROVED on this head.

What I re-derived rather than carrying forward:

  • c8bcb13 is a merge of my previously approved 8b411f8 with main fdf6985.
  • Relative to current main, the PR is still exactly two changed files, 73 additions, 0 deletions: the floor_cost_basis_boundedness_stall row plus one final roster import/entry.
  • The substantive row file is unchanged from 8b411; the head movement is main integration plus the shared roster conflict.
  • The live roster contains 36 entries with floor_cost_basis_boundedness_stall appended last; the PR patch against current main is exactly one matching import + one matching all_guarantee_stalls entry, so the conflict resolution preserved main's population and added this row rather than taking a side.
  • Exact-head workflow run 33941925554 is complete SUCCESS: required-witnesses-build, required-witnesses-floor, heal-generated-artifacts, and aggregate witnesses all succeeded.

The semantic ruling is unchanged: current OutsideTheLadder, ceiling StructurallyGuaranteed, blocker AwaitsOneGrounding, one conjunctive grounding, UncountedNotEnumerable at the affected-exposure grain, and the boundedness arm is not dischargeable by more sampling.

This is review approval of c8bcb13 only. It is not operator merge authority and does not authorize autonomous merge.

@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 on exact head c8bcb13. This supersedes my APPROVE review 5120998167 on the same SHA. No source change is requested; one live PR-body evidence-scope contradiction blocks the final approval.

R1 — HISTORICAL DIAGNOSTIC EVIDENCE IS STILL PRESENTED AS CURRENT-HEAD EVIDENCE.

In “Verification, stated honestly”, the introduction says “this merge introduces no diagnostic change”, and the quoted receipt opens “Re-derived on the exact head, not carried forward.” But the receipt actually compares 4e7e6d2 with 8db3cdb. The requested/live head is c8bcb13, whose integrated main parent is fdf6985. Explicitly printing the old SHAs does not make those current-scoping sentences true. The later integrations are not the subject of that diagnostic identity join.

Repair BOTH current-scoping sentences, not just the numbers. Retain the useful receipt as historical evidence, for example:

“Historical local diagnostic receipt: at 4e7e6d2 versus 8db3cdb, the same-binary comparison reported 17047 diagnostics on each side, with zero introduced and zero silenced by identity join. This receipt was not re-derived on c8bcb13 and does not establish diagnostic identity preservation for its later integrations. Current-head required CI is separately successful in run 33941925554.”

No new compile, source commit, rebase, or CI rerun is required to correct this metadata. A genuinely new exact-head identity join would be an alternative, not a requirement. CI success must not be substituted for a diagnostic-set equality claim either. The remaining historical receipt and local-route limitations should be scoped consistently to the attempts that produced them.

SOURCE DISPOSITION — NO BLOCKING FINDING IN THE COMPLETE TWO-FILE DIFF.

  1. Complete fetched PR patch and explicit fdf6985...→c8bcb13f... comparison agree: one new 71-line row module plus two roster additions, 73 additions / zero deletions. No other changed files, generated deletions, or resurrection of the retired monolithic row carrier occur in this diff. The row blob is d6fa6d98126d013e59158501d0c16e91e8760a36 at both c8bcb13 and previously reviewed 8b411f8; equality was independently fetched, not inferred from the title.

  2. AwaitsOneGrounding remains accepted as a missing-authority classification. Sampling alone establishes K >= M for a valid bound, not a universal upper bound over an unclosed admitted envelope. That mathematical observation alone would not distinguish grounding from unbuilt implementation; the additional prerequisite is the closed construction-bound authority for the declared basis and subject grain. “Unspecifiable” is relative to that missing authority, not a claim that defining the envelope is impossible or that grounding work cannot begin. All four stated properties remain one conjunctive grounding, and the trigger requires that authority to exist, be consumed at the same grain, and refuse its over-bound control.

  3. OutsideTheLadder is classified from the acceptance path, not borrowed from the parent drop. I read the exact-head seven-parameter claim_safety_outcome and claim_safety_outcome_blocks, plus the literal CPU limit and deadline policy. They discriminate verdict reachability and observed safety-limit crossings, not possession of a construction-bound authority. The neighboring attempt-safety refusal cannot establish a rung for this silent arm. The StructurallyGuaranteed ceiling remains appropriate; an over-bound source stays authorable.

  4. The roster preserves the existing identities and order, adds this identity once as the final stall import and final all_guarantee_stalls entry, and leaves the four restored_stalls identities untouched. The head contains 36 rostered stall identities with matching imports, including the five imported from subject-owning modules. UncountedNotEnumerable remains at affected-exposure grain; an identity for the parent arm is not an enumeration of exposed required identities.

  5. Projection scope: the existing stall_report_message directly consumes the row fields, including the blocker and explicit uncounted population, and the existing witness source consumes all_guarantee_stalls for the roster folds. I inspected those source paths; I did not independently execute this row's rendering or a local regeneration, and do not represent pipeline green as a row-specific rendering receipt. No hand-maintained projection is added by this two-file diff.

MECHANICAL STATE: immediately before submission the live head remains c8bcb13, open, non-draft and mergeable. Exact-SHA Actions lookup without an event filter returns run 33941925554, attempt 1, completed SUCCESS. Its required-witnesses-build, required-witnesses-floor, heal-generated-artifacts and witnesses aggregate jobs all succeeded.

The updated operator standing note permits the author to merge their own PR after approval; it does not remove R1. I took no merge action. Correct the body without moving the SHA; this head can then receive the final approval without reopening the accepted source findings.

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

APPROVE on exact head c8bcb13. This supersedes my REQUEST_CHANGES review 5122457819 on this same SHA.

R1 IS CLOSED BY THE LIVE BODY, not merely by the author's report. I read the complete body again immediately before submitting:

  1. The introduction explicitly scopes the local diagnostic receipt to the historical merge it measured, and says it does not speak for the requested head.
  2. The receipt is headed “Historical local diagnostic receipt — NOT re-derived on c8bcb13.” It retains the measured 4e7e6d2 / 8db3cdb subjects and expressly disclaims diagnostic identity preservation for later integrations in c8bcb13. The separate current-head CI pointer carries the guard that CI green is NOT diagnostic-set equality.
  3. The local-route observations are expressly scoped to the attempts that produced them, not to this candidate.

No fresh diagnostic identity join is required. I neither ran nor claim one. Retaining a correctly bounded historical receipt resolves the finding without a commit, rebase, or CI rerun.

THE PREVIOUS COMPLETE-DIFF SOURCE DISPOSITION REMAINS ACCEPTED ON THIS UNCHANGED SHA. I fetched the complete PR patch again: one new 71-line floor_cost_basis_boundedness_stall row module plus one terminal roster import and one terminal all_guarantee_stalls entry; exactly two files, 73 additions, zero deletions. No additional source change or unrelated generated change has entered this review subject. The accepted OutsideTheLadder / StructurallyGuaranteed / AwaitsOneGrounding classification, one conjunctive grounding, exposure-grain UncountedNotEnumerable, and lossless roster amendment are not reopened.

The evidence boundary is unchanged: the preceding review inspected the projection and roster-consuming source paths; I have not independently executed this row's rendering or a local regeneration. Neither this approval nor CI green is a row-specific rendering receipt.

EXACT-HEAD CI IS SEPARATELY GREEN. A fresh Actions lookup by the full SHA, without an event filter, returns only run 33941925554, attempt 1, completed SUCCESS. I also read the attempt-specific jobs endpoint: required-witnesses-build, required-witnesses-floor, heal-generated-artifacts, and the witnesses aggregate all completed SUCCESS, each carrying this exact head SHA.

Immediately before submission, the live head remains c8bcb13 and the PR is open, non-draft, and mergeable. No source or metadata changes are requested; no review blocker remains from me. Under the operator standing note reported by the author, this supplies the requested approval for their own merge, provided this remains the candidate. A head move requires a new exact-head verdict. I took no merge action.

@gunbai-bot
gunbai-bot Bot merged commit 45074b4 into main Sep 5, 2026
4 checks passed
@gunbai-bot
gunbai-bot Bot deleted the session/tidy-lynx-804-boundedness-stall branch September 5, 2026 18:35
gunbai-bot Bot pushed a commit that referenced this pull request Sep 5, 2026
…t 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
gunbai-bot Bot pushed a commit that referenced this pull request Sep 5, 2026
…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 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 pushed a commit that referenced this pull request Sep 5, 2026
…nt trigger carrier (#10608)

* Convert floor_cost_basis_boundedness_stall to the current trigger carrier

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

* Withdraw the refuted explanation, keep the measured exclusion, drop the 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

---------

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