Skip to content

A measurement discharges one ceiling sentence and reveals a second hole - #10783

Merged
briansrls merged 23 commits into
mainfrom
session/bright-badger-637-argument-shape
Sep 9, 2026
Merged

briansrls merged 23 commits into
mainfrom
session/bright-badger-637-argument-shape

Conversation

@gunbai-bot

@gunbai-bot gunbai-bot Bot commented Sep 7, 2026

Copy link
Copy Markdown
Contributor

gunbc.recurring_failure_mode.generic_application_admits_distinct_unit_variant_arguments says its own ceiling is unestablished, in as many words:

CEILING: unestablished. The diagnostic name says generic-formal undecidable, but no measurement establishes undecidability; do not use that name to declare a permanent ceiling.

This is that measurement. §4b requires a ceiling to be derived rather than aspirational, and until now that field was resting on the diagnostic's own name.

The fixture

take_map_concrete declares a concrete m: Map<String, Bool>; map_insert declares the same argument at a generic formal. One compile:

arm argument position result
3 String concrete refuses — type mismatch: expected 'Map(...)', got 'Primitive(String)'
5 String generic silent at m (the only diagnostics name key and value, the enclosing formals)
4 unapplied empty_map concrete silent
6 unapplied empty_map generic silent

One argument, one shape, two declared positions, two answers. Refusal is reachable and genericity is not the reason it does not fire — a String inhabits Map<K, V> for no instantiation of K and V, so the mismatch is decidable without deciding the generic, and the checker demonstrably decides exactly this shape one arm over. The undecidability the diagnostic reports is a property of where it is asked, not of what it was asked.

What the receipt does and does not do

It discharges that row's ceiling sentence and nothing else. That row's population is variant identity (Record<Second> where Record<First> is declared); the fixture's is shape. Variant identity may not be decidable from the argument, and nothing here says it is. The row explicitly forbids borrowing evidence across populations, so the boundary is written into the receipt rather than left for a later reader to infer. The rung and the trigger stand exactly as they were.

The second hole gets its own identity

Arm 4 is not about generics at all: an unapplied function admitted at a concrete position, in the same compile where a String at that identical position refuses. No instantiation makes fn() -> T inhabit T.

unapplied_function_value_admitted_at_a_value_position — rung outside the ladder (accepted with no diagnostic; an accepted wrong program is not a rung), ceiling structurally impossible and derived, trigger naming the capability (decide function-type-against-non-function-type from the argument before consulting the position) rather than the fixture, with arm 4 enrolled as the discriminating RED and arm 3 as the accepted positive control — neither retiring on the climb, arm 4 flipping to a permanent regression control.

It is a separate identity rather than a receipt because two mechanisms sharing one consequence would let a repair for either be credited to both.

Roster placement

Appended at the end of roster.dag, not alphabetically. That file's header rules that order is source order and load-bearing: the projection renders in roster order, so sorting would reorder docs/design-failure-modes.md and destroy the empty-diff oracle that proves a cut was structural. Projection regenerated through docs_projection_gate regen.

Provenance

This is the class that admitted my own defect in gunbc#10779 — found by a reader, on a diff the compiler reported nothing about. The fixture is scratch and is not part of this PR; the arms are reproduced verbatim in the row so they are re-derivable.

🤖 Generated with Claude Code

https://claude.ai/code/session_01CQuBs4mLu9ArojSWFiRcey

Brian Searls and others added 2 commits September 7, 2026 15:32
…harper hole

DESIGN section 4b requires a ceiling to be derived rather than aspirational,
and generic_application_admits_distinct_unit_variant_arguments said its own
was unestablished in as many words: 'The diagnostic name says generic-formal
undecidable, but no measurement establishes undecidability; do not use that
name to declare a permanent ceiling.'

A four-arm fixture is that measurement. take_map_concrete declares a CONCRETE
m: Map<String, Bool>; map_insert declares the same argument at a GENERIC
formal. A String at the concrete formal REFUSES with a located, typed
mismatch. The same String at the generic formal is SILENT at that argument.
One argument, one shape, two positions, two answers -- so refusal is reachable
and genericity is not the reason it does not fire, and a String inhabits
Map<K, V> for no instantiation of K and V.

That receipt lands on the existing row and discharges its ceiling sentence and
NOTHING ELSE. That row's population is variant identity; the fixture's is
shape; the row itself forbids borrowing evidence across populations, and the
boundary is stated in the receipt so a later reader cannot credit a repair for
one to the other.

A second arm found a hole that is not that row's subject at all: an unapplied
function -- empty_map rather than empty_map() -- admitted at the CONCRETE
position, in the same compile where a String at that identical position
refuses. No instantiation makes fn() -> T inhabit T, so it is decidable from
the argument alone. That gets its own identity rather than a receipt, because
two mechanisms sharing one consequence would let a repair for either be
credited to both.

The new row is rostered at the END of the list: roster order is source order
and the projection renders it, so inserting alphabetically would have
reordered docs/design-failure-modes.md and destroyed the empty-diff oracle.

This is the class that admitted my own defect in gunbc#10779, found by a
reader on a diff the compiler reported nothing about.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CQuBs4mLu9ArojSWFiRcey
review 62002 refused two things and both were right: the fixture was described
in prose with its output copied into the rows, and the row said arm 4 IS
ENROLLED in the present tense while no fixture existed in the tree at all.

THE PROBE IS NOW REAL AND IT DISCRIMINATES. Four sources through
compile_dag_diagnostic_census, the same harness the duplicate-definition probe
uses, folded to a blocking-diagnostic count:

  a_string_at_a_concrete_position_is_refused          PASS  positive control
  an_unapplied_function_at_a_concrete_position...     FAIL  the defect
  a_string_at_a_generic_position_is_refused           FAIL  the deferral
  the_well_typed_call_is_clean                        PASS  fixture not broken

Two greens bracketing two reds is what makes this a discrimination matrix
rather than a test that happens to be red. Without the concrete-position
control, a red on the function arm would be indistinguishable from a probe
whose source broke some other way; without the well-typed control, an import
typo would red everything and read as walls landing.

The fixture is source handed to the compiler rather than corpus modules
because two of the four programs are invalid and one is correctly refused --
as corpus members they would break every build that resolved them. DESIGN
section 4b rules exactly that case.

THE ASSERTIONS ARE THE CORRECT BEHAVIOUR, NOT THE OBSERVED ONE. Written the
other way the rows would pass today and become defenders of the defect: the
day someone lands the wall, the test would red and read as a regression caused
by the fix. A check that must be deleted to make progress was recording the
bug as the specification.

ENROLMENT AND THE PROBE LAND TOGETHER, never separately -- two unenrolled reds
would block every lane in the program, and there is no acceptable window for
that. Both identities go into floor_expected_red, and the stall row is what
makes that admissible rather than green-by-suppression: an expected red with a
declared way to stop being expected is tracked debt, one without is the
untracked stall section 4b(2) forbids. The trigger states the exit explicitly
-- on the day both rows refuse, they LEAVE the roster and stay enrolled as
permanent regression controls per 4b(4).

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

gunbai-bot Bot commented Sep 7, 2026

Copy link
Copy Markdown
Contributor Author

Not a defect: run 34138907526 has conclusion cancelled, and I cancelled it.

The self-hosted pool was at twenty concurrent runs with four of them mine, and gunbc#10699 — the merge-queue leader — was pending with zero jobs for want of a runner. I gave up two of my four, this one included, because its head was about to be superseded anyway. heal-generated-artifacts had already passed at that sha before the cancellation landed.

There is a real fix queued for this PR and it is being held, not withheld. Review 62002 correctly refused two things: the fixture was described in prose with its output copied into the rows, and the row claimed arm 4 is enrolled in the present tense while no fixture existed in the tree at all. Both are fixed in a commit sitting locally:

  • test.claim.argument_shape_at_a_declared_position_probe_test now exists and runs through compile_dag_diagnostic_census, and it discriminates rather than merely being red — a_string_at_a_concrete_position_is_refused PASS (the control that makes the rest mean anything), an_unapplied_function_at_a_concrete_position_is_refused FAIL (the defect), a_string_at_a_generic_position_is_refused FAIL (the deferral), the_well_typed_call_is_clean PASS (so an import typo cannot red the others and read as walls landing).
  • Both reds are enrolled in v2.workflow.floor_expected_red in the same commit — never separately, since two unenrolled reds would block every lane in the program and there is no acceptable window for that.
  • gunbc.guarantee_stall.argument_shape_undecided_at_a_declared_position_stall is what makes that enrolment admissible rather than green-by-suppression. Its trigger states the roster exit explicitly: on the day both rows reach a located, typed refusal they leave floor_expected_red and stay enrolled as permanent regression controls per §4b(4). An expected red with a declared way to stop being expected is tracked debt; one without is the untracked stall §4b(2) forbids.

The assertions are written as the correct behaviour, not the observed one. Inverted, they would pass today and become defenders of the defect — the day someone lands the wall, the test would red and read as a regression caused by the fix.

I will push this the moment #10699 has a verdict and the hold lifts.

— sent from bright-badger-637

Brian Searls and others added 3 commits September 7, 2026 16:32
…olds

review 62023 caught the new stall appended to restored_stalls instead of
all_guarantee_stalls. My edit took the LAST list in the file, and the last
list is not the roster.

That is the section 3c defect this very file already names: a stall declared,
typed, valid, and absent from every projection the roster feeds. Nothing folds
restored_stalls for rendering -- gunbc.rostered_row_join joins against
all_guarantee_stalls -- so the failure-mode row and the expected-red enrolment
were both pointing at a tracking consumer that no fold would ever reach. The
enrolment's whole admissibility rests on that stall being visible, so this was
not cosmetic: it would have left two expected reds tracked by a row nothing
renders.

It also violates that list's own stated rule -- a new stall row must be
admitted WITHOUT editing restored_stalls, which pins four historically
restored subjects so their loss refuses -- and it would have broken
every_restored_stall_is_still_rostered, since a restored member missing from
all_guarantee_stalls is exactly what that fold refuses on.

Removed from restored_stalls, appended at the END of all_guarantee_stalls
because order there is source order and load-bearing. Projection regenerated.

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

review 62034 found that test.claim.argument_shape_at_a_declared_position_probe_test
matches NO prefix in v2.workflow.required_floor required_gate_prefixes. I
checked all thirty mechanically rather than by eye: none matches. The floor
therefore suppresses these identities as dormant -- discovered, not run.

SO THE ENROLMENT ASSERTED THE ONE THING THAT ROSTER EXISTS TO PREVENT.
floor_expected_red's own header: enrolling an identity asserts that it REACHES
ITS SUBJECT AND ANSWERS, and it records 101 rows that left it for exactly this
reason -- never-executed identities reading as debt someone was working. A
dormant red carried as expected debt is the more dangerous of the two
mistakes, because a genuine red is loud once someone looks. Enrolment removed.

Removing it is safe for the reason that made it look necessary: two unenrolled
reds would block every lane, and these do not, precisely BECAUSE they are
dormant.

A SECOND DEFECT IN THE SAME ROW, AND IT IS THE ONE I SHOULD HAVE CAUGHT: the
row said ReadsLiveTree sites have routed to DeclinedLiveTree. That arm IS
DELETED -- required_floor.dag says so at its own root. I lifted the sentence
from the duplicate-definition probe's historical comment without checking it
still held, which is a stale citation standing where a current fact was
required.

A THIRD: the row called the string-at-generic arm 'the sibling row's subject',
contradicting the sibling receipt this same PR adds. That row's subject is
variant IDENTITY; this fixture's population is SHAPE. The arm discharges that
row's CEILING SENTENCE and nothing else, which is what the receipt already
says and what this row now says too.

The row and the stall trigger now state the standing plainly: the executing
consumer is the named claim_batch invocation and nothing else, and admitting
the module to required_gate_prefixes is the prerequisite that would convert
re-derivable evidence into enrolled evidence. That admission is a second gate
and a cost on every floor run, so it is asked for rather than taken.

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

Section 4b(2) requires a class below its ceiling to name its next-rung
trigger, separating cannot-climb from can-climb-after-one-grounding from
can-climb-now-but-unbuilt. This class is below its ceiling for TWO
independent reasons and only one of them was written down.

The class trigger was there: the declared-type judgment decides argument shape
from the argument's own constructor before consulting the declared position.

The EVIDENCE trigger was not, and it is the one actually blocking. The probe
matches no prefix in required_gate_prefixes, so a required lane never runs it.
That leaves the class PROVEN BUT UNROUTED -- it executes, it discriminates,
and no required consumer repeats it, so the rung rests on a human-run command.
Admission to that gate is now named as the trigger rather than left as an
observation, because an honest sentence about the present state quietly
becomes the permanent state if nothing names its end.

The condition on asking is in the row too: request the admission when the
runner pool is not saturated, and as its OWN change rather than as a rider. It
adds four rows to every required floor run, and it was deferred on a day when
the pool sat at roughly twenty concurrent runs and main had gone red on memory
pressure from that load. Both triggers are ClimbableButUnbuilt: neither waits
on a grounding that does not exist.

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

gunbai-bot Bot commented Sep 7, 2026

Copy link
Copy Markdown
Contributor Author

Both findings from review 62034 verified by reading — not taken on trust — and both are fixed at 8f61e524c6d. The first one invalidated a premise this PR was built on.

The probe is dormant, so the expected-red enrolment asserted something false

test.claim.argument_shape_at_a_declared_position_probe_test matches none of the thirty prefixes in v2.workflow.required_floor required_gate_prefixes. I tested all thirty against the module path mechanically rather than scanning them. The floor therefore suppresses these identities as dormant — discovered, not run.

That makes the floor_expected_red enrolment assert precisely what that roster exists to prevent. Its own header:

ENROLLING AN IDENTITY ASSERTS THAT IT REACHES ITS SUBJECT AND ANSWERS. A row that cannot run is not debt this roster can carry, and it is the more dangerous mistake: a genuine red is loud once someone looks, while a never-executed row looks identical to progress.

Enrolment removed. Removing it is safe for the same reason it looked necessary: two unenrolled reds would block every lane, and these do not — because they are dormant.

That header records 101 identities removed for exactly this reason. Mine would have been the 102nd. I mention the number not as credit but because the ratio of caught before landing to caught after is the only evidence anyone has that the header's warning is doing work — a mechanism that has failed the same way a hundred times and been repaired each time after the fact is a mechanism whose warning nobody reads in time.

Two more defects in my own row, both mine

  • The row said ReadsLiveTree sites "have routed to DeclinedLiveTree". That arm is deleted — required_floor.dag says so at its own root. I lifted the sentence from the duplicate-definition probe's historical comment without checking it still held: a stale carrier standing where a current fact was required, which read as true because the sentence was well-formed. That is the §3 citation failure exactly.
  • The row called the string-at-generic arm "the sibling row's subject", contradicting the sibling receipt this same PR adds. That row's subject is variant identity; this fixture's population is shape. The arm discharges that row's ceiling sentence and nothing else.

What the row now says, and the trigger

The executing consumer today is the named claim_batch invocation and nothing else. The class is proven but unrouted: it executes, it discriminates, and no required lane consumes it.

Admission to required_gate_prefixes is now named as a second, separate trigger on the stall row — §4b(2) requires a class below its ceiling to name its trigger, and an honest sentence about the present state becomes the permanent state if nothing names its end. The condition on asking is in the row too: request it when the runner pool is not saturated, and as its own change rather than a rider. It adds four rows to every required floor run, and it was deferred on a day when the pool sat at ~20 concurrent runs and main had gone red on memory pressure from that load.

Nothing in this PR now claims a consumer that does not run.

— sent from bright-badger-637

Brian Searls and others added 2 commits September 7, 2026 17:28
review 62052 found the annotation laying out a 2x2 including generic+function
observed accept, while the module declares three shape arms and a well-typed
control. No such row exists. A reader re-deriving the names in the stall's
trigger would have found a control where the table promised a fourth
measurement -- in the file whose own closing note says WHAT THIS DOES NOT
MEASURE, stated so no receipt reads coverage it does not have.

Corrected the table rather than adding the arm, and the reason is in the file.
The fourth cell cannot come out against anything: acceptance there is already
ENTAILED by the two arms above it, since the position defers on every argument
and the argument is refused at no position. An arm that cannot produce a
result contradicting what its neighbours already establish is not a
measurement, it is a fifth witness to author, review, maintain and eventually
run, which section 2 counts as redundant work on all three of section 1's
quantities.

Its provenance is recorded rather than dropped: it was compiled once during
the investigation and behaved as entailed. That is not evidence this module
carries and it is not cited as any.

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

gunbai-bot Bot commented Sep 7, 2026

Copy link
Copy Markdown
Contributor Author

review 62052 was right and the fix is pushed.

The annotation laid out a 2×2 including generic + function observed accept, while the module declares three shape arms plus a well-typed control. No such row existed — so the table asserted an observation nothing here measures, in the file whose own closing note says "stated so no receipt reads coverage it does not have." A reader re-deriving the names in the stall's trigger would have found a control where the table promised a fourth measurement.

I corrected the table rather than adding the arm, and the reason is in the file rather than left implicit:

The fourth cell cannot come out against anything: acceptance there is already entailed by the two arms above it, since the position defers on every argument and the argument is refused at no position. An arm that cannot produce a result contradicting what its neighbours already establish is not a measurement, it is a fifth witness to author, review, maintain and eventually run — §2 redundant work on all three of §1's quantities.

That is the same test that killed an earlier falsifier in this lane: an arm that cannot come out against the thing it is testing establishes nothing. Its provenance is recorded rather than quietly dropped — it was compiled once during the investigation and behaved as entailed; that is not evidence this module carries and it is not cited as any. The failure-mode row's wording is aligned to match.

Re-verified by execution on this branch, which matters because my first attempt was not: I had a background run going while I checked out another branch to resolve a conflict, so it read an indeterminate tree and its exit=1 proved nothing. Re-run properly:

PASS  a_string_at_a_concrete_position_is_refused          ← positive control
FAIL  an_unapplied_function_at_a_concrete_position_is_refused   ← the defect
FAIL  a_string_at_a_generic_position_is_refused           ← the deferral
PASS  the_well_typed_call_is_clean                        ← fixture intact

Still two greens bracketing two reds.

— sent from bright-badger-637

review 62067 found three defects and all three are one shape: an edit changed
the thing and the prose describing it stayed standing and well-formed.

A MEANING FORK ON ENROLMENT. The probe comment still said the function arm is
enrolled as an expected red, while this same change's typed rows say enrolment
was removed because the module is dormant. One change asserting both. The
comment now says what is true: the reds are REAL AND UNROUTED rather than
held -- nothing suppresses them because nothing runs them -- and it points at
the stall that names gate admission as its own trigger.

A ROSTER EXIT THAT CANNOT HAPPEN. The row attributed to the stall an exit of
LEAVE floor_expected_red. The stall says no such thing, and an identity that
is not on a roster cannot leave it. Replaced with what the trigger carries: on
the day both rows refuse they flip to permanent regression controls.

POSITIONAL CITATIONS, IN THE RULE'S OWN WORDS. arm 3 and arm 4 stopped
matching the module the moment the previous commit reordered the arm table --
section 3's stated failure mode exactly: any edit ABOVE the cited line
silently invalidates it. The references were positional in three rows and are
now the test function names, which the namespace tree can decide.

That last one is worth more than its fix. It is not a slip: a review fix broke
the citations, and nothing caught it but another review. A position is
unreachable from the tree that owns the thing it names, so no gate can see it
rot -- which is why the rule says name the symbol, and why I should not have
been writing ordinals into rows while citing that rule at other people.

Re-verified by execution: the two rows asserting behaviour the compiler
already has still PASS, so the annotation edits did not break the fixture.

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

gunbai-bot Bot commented Sep 7, 2026

Copy link
Copy Markdown
Contributor Author

All three findings in review 62067 verified and fixed at ca6eb95cce3. They are one shape: an edit changed the thing and the prose describing it stayed standing and well-formed.

The meaning fork. The probe comment still said the function arm "is enrolled as an expected red" while this same change's typed rows say enrolment was removed because the module is dormant. One change asserting both. It now says what is true — the reds are real and unrouted rather than held: nothing suppresses them because nothing runs them — and points at the stall that names gate admission as its own trigger.

The roster exit that cannot happen. The row attributed to the stall an exit of "LEAVE floor_expected_red". The stall says no such thing, and an identity that is not on a roster cannot leave it. Replaced with what the trigger actually carries.

The positional citations, and this one is worth more than its fix. arm 3 and arm 4 stopped matching the module the moment the previous commit reordered the arm table — which is §3's stated failure mode verbatim: "any edit above the cited line silently invalidates it." Now the test function names, which the namespace tree can decide.

It is not a slip. A review fix broke the citations, and nothing caught it but another review. A position is unreachable from the tree that owns the thing it names, so no gate can see it rot — which is exactly why the rule says name the symbol, and why I should not have been writing ordinals into rows in the same hours I was citing that rule at other people's work.

Re-verified by execution — the two rows asserting behaviour the compiler already has still pass, so the annotation edits did not break the fixture:

PASS  a_string_at_a_concrete_position_is_refused
PASS  the_well_typed_call_is_clean

A note on the pattern across this PR and gunbc#10779, since it is now four instances: every one was prose surviving a change to the thing it described — a reverted map's comment, a citation of a deleted arm, a projection holding superseded receipts, and now ordinals outliving a reorder. Reviews caught all four. Nothing else can: nothing executes prose, and three of the four were syntactically perfect.

— sent from bright-badger-637

Brian Searls and others added 2 commits September 7, 2026 19:00
…cannot see

review 62079, and it is right: the ceiling-discharge receipt claimed
DeclaredTypeInhabitanceUndecided "is now measured to be reported over at least
one decidable population" and that the undecidability "the diagnostic reports"
is a property of where it is asked. The probe folds census_blocking_rows and
that diagnostic carries GateAdvisoryTypecheck at v1.core, so no arm counts the
class and no arm can see it. That was fabricated measurement in the one
sentence doing the ceiling work.

The receipt now discharges the ceiling by the weaker route the instrument
actually supports, which is the route the reviewer names: one decidable String
shape is refused at a concrete formal and accepted at a generic one in the same
run, so genericity alone is not what makes a mismatch undecidable. It also
states outright what blocking_count can and cannot see, so the comparison is
not read as more than two blocking counts.

The roster conflict is both sides appending at the same position; resolved
additively, main's row first. docs/design-failure-modes.md regenerated from the
merged authorities.

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

gunbai-bot Bot commented Sep 7, 2026

Copy link
Copy Markdown
Contributor Author

review 62079 is right, and the finding is the class this PR exists to file, committed by me in the receipt that discharges the ceiling.

Verified before fixing: blocking_count folds census_blocking_rows, and DeclaredTypeInhabitanceUndecided carries GateAdvisoryTypecheck in v1.core — so no arm counts that class and no arm can see it. Claiming that name "is now measured to be reported over at least one decidable population" was fabricated measurement, and it was load-bearing: it was the whole ceiling discharge.

Fixed to the weaker route you name, which is what the instrument actually supports — the same decidable String shape refused at a concrete formal and accepted at a generic one in the same run, so genericity alone is not what makes a mismatch undecidable. The receipt now also states outright what blocking_count can and cannot see, so the comparison cannot be read as more than two blocking counts. No arm asserts anything about an advisory diagnostic.

Also merged origin/main (roster conflict was both sides appending at the same position; resolved additively, main first) and regenerated the projection from the merged authorities.

Pushed at e73159a.

… claimed otherwise

HELD UNPUSHED: #10783 is parked DIRTY. This is the fix for its CI red, ready
for the window.

The red is not the host and not a flake. Its typed cause is
standing=measurement_completed with four blockers, two of them my own expecting
-red arms returning Bool(false) with cause=claim_failed -- a reached answer, not
a refusal to compute.

I had claimed this module was dormant: it matches no prefix in
required_gate_prefixes, so I concluded the floor discovers and does not run it,
and REMOVED the expected-red enrolment on that basis. The prefix roster is not
the whole admission rule. The floor also plans a witness whose file the change
touches, and the landing run's own required-floor-disposition artifact carries
all four identities at planned_as_changed_witness -- the only four rows at that
disposition in a 16836-row census -- with the two expecting-red arms failed. So
the module is dormant on ORDINARY floors and RUN on every change that touches
it, which necessarily includes the change that lands it. Un-enrolled, these two
block their own landing change while documenting a defect the row admits is
real.

The enrolment is restored, and it is true by the roster's own rule: an enrolled
identity must reach its subject and answer, and both arms evaluate and answer.
The 101 rows that roster's header records as removed were removed for the
opposite condition -- identities that never ran at all. Precedent for this exact
shape is already in the same chunk:
guarantee_floor_class_probe_witness.floor_generic_instantiation_is_still_silently_accepted.

The row and the stall are corrected to say dormant-on-ordinary-floors rather
than not-run, since the artifact answers directly what I had inferred from the
prefix list. The gap they report is unchanged: between changes, no required lane
repeats this measurement.

Verified by compiling floor_expected_red rather than counting brackets: 0
blocking errors.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CQuBs4mLu9ArojSWFiRcey
Brian Searls and others added 2 commits September 8, 2026 17:49
…e class file

#10822 (aac9545) made recurring failure modes ONE CLASS PER FILE with
membership derived from the directory, and deleted both the hand-appended
roster and the combined markdown projection, adding both to .gitignore. This
branch still carried edits to both.

Resolved by ACCEPTING THE DELETION on:
  dag/gunbc/recurring_failure_mode/roster.dag
  docs/design-failure-modes.md
Restoring either to quiet the merge would re-create the exact authority #10822
removed -- the surviving-X attractor DESIGN section 3 names in the
replacement-migration rule. Their imports still resolve because the roster is
generated before compile; it is derived, not absent.

What this branch registers is unchanged: the class file
unapplied_function_value_admitted_at_a_value_position.dag IS the registration
now, and it carries forward as-is.

dag/gunbc/guarantee_stall/roster.dag is ALIVE and was an ordinary content
conflict -- both sides appending. Resolved additively, main's rows first, mine
after, with no row from either side dropped.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CQuBs4mLu9ArojSWFiRcey
The last commit restored the floor_expected_red enrolment of both expecting-red
identities without touching the two places that assert the opposite, so the change
carried both sides of one fact -- a DESIGN section 3 meaning fork, and on the row a
section 4b(1) rung-honesty defect, since a reader could not tell from the row whether
its reds execute.

The probe module's annotation said "THEY ARE NOT ENROLLED ... AND MUST NOT BE DESCRIBED
AS IF THEY WERE" and read the prefix roster as the whole admission rule. It now states
what the landing run's required-floor-disposition artifact actually answers: the module
matches no required_gate_prefixes prefix, so no ORDINARY floor repeats it, but the floor
also plans a witness whose file the change touches, so every change to this module runs
these identities -- which is why the enrolment is true by that roster's own rule.

The row's stall field claimed "no roster exit is claimed here, because there is nothing
to exit". The premise was wrong and the conclusion is still right for a different reason:
section 4b(4) dissolves production handling and never the evidence, so these rows flip to
permanent regression controls and STAY enrolled.

Both edited files compile at 0 blocking errors.

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

gunbai-bot Bot commented Sep 8, 2026

Copy link
Copy Markdown
Contributor Author

review 62582 — both findings are real and both are fixed in db562bc4. They are one defect seen twice: the prior commit restored the floor_expected_red enrolment without touching the two places that asserted the opposite, so the change carried both sides of one fact.

  1. argument_shape_at_a_declared_position_probe_test.dag — the annotation said "THEY ARE NOT ENROLLED … AND MUST NOT BE DESCRIBED AS IF THEY WERE" and read required_gate_prefixes as the whole admission rule. Rewritten to what the landing run's required-floor-disposition artifact answers directly: the module matches no prefix, so no ordinary floor run repeats it, but the floor also plans a witness whose file the change touches — all four identities appear at planned_as_changed_witness with the two expecting-red arms failed. That is why the enrolment is true by that roster's own rule (the arms reach their subject and answer, returning false with cause claim_failed), and why un-enrolled they would block their own landing change. The residual gap — between changes the rung rests on a human-run claim_batch — is kept, and still points at the stall row's separate gate-admission trigger.

  2. unapplied_function_value_admitted_at_a_value_position.dag:39 — "these identities are not enrolled … and an identity that is not on a roster cannot leave it" contradicted line 31 of the same row. The premise was wrong; the conclusion survives for a different reason, which is now the reason given: §4b(4) dissolves production handling and never the evidence, so on the day both arms reach a located, typed refusal they flip to permanent regression controls and stay enrolled.

You are right that this is the same defect the review-62067 commit claimed to fix. The enrolment moved and the prose describing it did not, which is exactly the class stale_claim_survives_its_own_correct_edit names — and §4c is the reason nothing caught it: no Accepted program can read either statement, so there was no red to hit.

Both edited files compile at 0 blocking errors.

Separately, so it is not read as mine: compiling this branch's guarantee_stall/roster.dag entry reports 1 blocking error — a declared-frontier count mismatch for lookup on Primitive(T) in src/v2/std/compilers/target_model.dag. A pristine origin/main worktree with the same entry and the same binary reports the identical error and the identical advisory count, so it is pre-existing and untouched by this diff.

…unt_for: review 62594

census_of and blocking_count were a byte-for-byte re-implementation of
gunbc.compile_census_probe total_blocking_count_for, whose own header declares that
module THE SINGLE HOME for "compile this source string and count what it refused" --
written because a second copy would make one concept answer from two authorities
(DESIGN section 3), and because the two copies can drift on the failure-arm convention,
which is the vacancy-green trap both headers exist to prevent (section 2: net concepts
must not grow by re-invention).

Both local functions are deleted and the four claims call the canonical helper, the way
the sibling algebra_receiver_alias_witness_test already does. The -1-on-CensusNotRunnable
rationale is kept as an annotation at the import site and now names it as the helper's
arm rather than restating it as a local convention.

Compiles at 0 blocking errors. The four identities execute on this change by
planned_as_changed_witness, so the required floor run on this head is their consumer.

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

gunbai-bot Bot commented Sep 8, 2026

Copy link
Copy Markdown
Contributor Author

review 62594 — confirmed and fixed in 5ff9ca6b. census_of and blocking_count were a byte-for-byte re-implementation of gunbc.compile_census_probe total_blocking_count_for, including the 0 - 1 failure arm. Both local functions are deleted and the four claims now call the canonical helper by import, the way algebra_receiver_alias_witness_test already does. The gunbc.compile_diagnostic_census import block went with them — nothing else in the module used it.

You are right that it is not cosmetic. The drift that matters here is the failure-arm convention: if the local copy had ever been "corrected" to 0, every row in this module would have greened by vacancy on a census that could not run, which is precisely the shape both headers were written to prevent. I kept the -1 rationale as an annotation, but moved it to the import site and reworded it to say the arm is the helper's — restating it as a local convention was half of how the copy came to look load-bearing in the first place.

Compiles at 0 blocking errors. I could not execute the four claims locally (this session's available binary predates the claim_batch subcommand, and a workspace build here is against the resource guidance), so the executing evidence is the required floor run on this head: the module's identities run by planned_as_changed_witness on every change that touches the file, which this change does.

Brian Searls and others added 3 commits September 8, 2026 19:52
…admit it, and retire the two consumed rows

The floor refused on namespace-wave-admission with 1 unadjudicated delta. Since
membership of the failure-mode ledger became THE DIRECTORY, the roster is generated
before compile, so filing a class file makes the generated roster gain a reference to it
and the spelling unapplied_function_value_admitted_at_a_value_position goes from binding
nothing at the base to binding the new module at the head. The wall reports that as
NewPoolCoincidenceResolution, correctly. One row, naming the exact tuple the wall
reported rather than a rule about "new class files", because the roster's population is
an enumeration and never a predicate.

That standing cost is recorded beside the row rather than absorbed: every future class
file will owe the same shape.

Adding a row makes this change roster-touching, which is what the two gunbc#10688
call_semantics_target rows named as their own due date. Both reported CONSUMED in this
run. #10688 is on main -- v1.std.core declares call_semantics_target and
v1.compiler.emit_rust imports it -- so the deletion was adjudicated by the per-tuple join
against main their trigger demands, not by the trigger sentence. Both rows and
CALL_SEMANTICS_TARGET_REHOME_LABEL are deleted, so the roster gains one declaration and
loses one.

The seed-growth justification's label enumeration is updated in the same change, because
that row already records the failure mode where a label lives unenumerated and the
"every declaration is enumerated here" sentence decays silently.

cargo check -p v1-compiler --lib is green, proven by a control that must fail: appending
a deliberate type error to this file reds it.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CQuBs4mLu9ArojSWFiRcey
#10813 landed the identical motion independently -- it filed a recurring-failure-mode
class, hit the same NewPoolCoincidenceResolution binding delta in the generated roster,
and deleted the two consumed gunbc#10688 rows on the same reasoning I did. Its side is
taken whole and my row is added beside it rather than merged into a rule covering "new
class files": this roster's population is an enumeration and never a predicate, which is
precisely why two rows of one shape stand side by side.

That the shape arrived twice from two lanes in one day is the evidence it is a standing
cost of the directory-as-membership design rather than an incident, and the annotation
now says so.

One thing main did NOT carry: #10813's RECURRING_FAILURE_MODE_CLASS_ADDED_LABEL is absent
from the .dag declaration enumeration. That is the decay this very justification row warns
about -- "each lane adds honestly and the claim decays silently" -- firing again. Added
here on the next touch, with the omission recorded rather than quietly repaired.

cargo check -p v1-compiler --lib green; the .dag entry compiles at 0 blocking errors.

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

Both findings are real and both were authored by my merge, not inherited.

(1) Two blocks read SEVENTH TRANSITION and the ordinal named two different transitions,
with #10783's narrative sitting on #10813's RECURRING_FAILURE_MODE_CLASS_ADDED_LABEL. The
duplicate is deleted: #10813's paragraph stays on its constant, mine stays on
RECURRING_FAILURE_MODE_CLASS_FILING_LABEL as the EIGHTH, and each doc block now resolves
to the symbol it documents (DESIGN section 3: cite the symbol).

(2) The gunbc#10688 TRIGGER paragraph survived the deletion of the rows it governed --
a standing trigger sentence over a population of zero, on the wall's own authority
surface. It went with the duplicate block; the dissolution paragraph that records why
those rows are gone is the one that stays.

cargo check -p v1-compiler --lib green.

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

gunbai-bot Bot commented Sep 8, 2026

Copy link
Copy Markdown
Contributor Author

review 62662 — both findings are real, both were authored by my merge rather than inherited, and both are fixed in d865636f.

  1. Two SEVENTH TRANSITION blocks, one lane's narrative on another lane's row. The prefill budget is 2048, an exception handler chose it, and the counter that refuted it was never a step counter #10813 landed the identical motion independently while my branch was in CI, and my merge kept both narratives. The duplicate block is deleted: The prefill budget is 2048, an exception handler chose it, and the counter that refuted it was never a step counter #10813's paragraph stays on RECURRING_FAILURE_MODE_CLASS_ADDED_LABEL, mine stays on RECURRING_FAILURE_MODE_CLASS_FILING_LABEL as the EIGHTH, and each doc block now resolves to the symbol it is attached to. You are right to name §3 for it — a narrative that resolves to a different symbol than the one below it is the same decay as a file:line citation, arrived at from the other direction.

  2. A standing TRIGGER sentence over a population of zero. The gunbc#10688 trigger paragraph survived the deletion of the two rows it governed, three lines above the paragraph recording that those rows dissolved. It went with the duplicate block; the dissolution paragraph — which states the join that adjudicated the deletion — is the one that stays.

cargo check -p v1-compiler --lib green.

Worth recording, since it is the substance rather than the tidy-up: two independent lanes filed a recurring-failure-mode class on the same day and both hit the same NewPoolCoincidenceResolution binding delta in the generated roster. That is not two incidents — it is the standing cost of ledger membership being the directory, and every future class filing owes an admission row. The two rows stand side by side rather than being generalised into one predicate, because this roster's population is an enumeration and never a predicate. I also added #10813's label to the .dag declaration enumeration, which main did not carry — that is the "each lane adds honestly and the claim decays silently" warning in that justification row firing on itself again, recorded rather than quietly repaired.

Brian Searls and others added 2 commits September 8, 2026 21:13
…s own trigger

The floor's second refusal was not my delta -- that one is adjudicated, 0 unadjudicated.
It was "1 consumed admission due for deletion on this roster-touching change": #10813's
RECURRING_FAILURE_MODE_CLASS_ADDED_LABEL row. Its class file
dag/gunbc/recurring_failure_mode/cumulative_metric_read_as_per_event.dag is now on main,
so base and head both resolve the spelling into that module and the row is a permission
standing over a motion that is no longer happening.

Adjudicated by the join the row demanded rather than by its trigger sentence: the run
reported it CONSUMED, and the class module is present on main under the exact name the
row named as its target. The row, its label constant, and its declaration enumeration
entry go together.

Recorded beside it, because it is the reusable part: the row is owed for exactly as long
as the class is unlanded, and the next roster touch after it lands collects it. Two lanes
filed a class on one day and both rows passed through this slot in sequence -- that is the
expected shape of a standing cost, not a collision.

cargo check -p v1-compiler --lib green; the .dag entry compiles at 0 blocking errors.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CQuBs4mLu9ArojSWFiRcey
The EIGHTH TRANSITION annotation said "two recurring-failure-mode classes are filed" and,
two lines down, "the change files TWO CLASS MODULES AND ONE STALL MODULE". Both are wrong
and they disagree with each other. git diff --name-status against main reports three added
files: one class module, one guarantee_stall module, one probe-test module.

Corrected to that, and the sentence now says WHY only one produced a binding delta rather
than only that it did: the stall module is named by a hand-authored roster, so its
reference is an authored one, and the probe module is named by nothing.

A third clause was stale in the same block -- it said #10813's row and this one stand side
by side, which stopped being true one commit ago when #10813's class landed and its trigger
collected it. Rewritten to record that they were never generalised into one predicate,
which is exactly what let each retire on its own class.

No wall behaviour changes: the admission row was already exact and is untouched.

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

gunbai-bot Bot commented Sep 8, 2026

Copy link
Copy Markdown
Contributor Author

review 62682 — the finding is right and the count was wrong in two places that disagreed with each other. Fixed in 050598f1.

git diff --name-status origin/main...HEAD reports three added files: one class module (unapplied_function_value_admitted_at_a_value_position.dag), one guarantee_stall module, and one probe-test module. The annotation claimed "two recurring-failure-mode classes are filed" and, two lines below, "TWO CLASS MODULES AND ONE STALL MODULE" — neither matches the diff, and a later lane joining against either sentence would have looked for a class file that does not exist.

While correcting it I made the sentence say why only one spelling produced a binding delta rather than only that it did: the stall module is named by a hand-authored roster, so its reference is an authored one rather than a pool coincidence, and the probe module is named by nothing.

A third clause in the same block had gone stale one commit earlier: it said #10813's row and mine "stand side by side", which stopped being true when #10813's class landed on main and its own trigger collected its row on this roster touch. It now records that the two were never generalised into a single predicate covering "new class files" — which is precisely what let each retire on its own class rather than on the other's.

No wall behaviour changes: the admission row itself was already exact and is untouched. cargo check -p v1-compiler --lib green.

…w goes: take main whole on the wall

#10856 found the root cause of the delta I had been admitting, and it was not the ledger's
growth shape. run_required_wave_admission rebuilt the base index by carrying forward every
head record the diff did not touch, and the generated recurring_failure_mode roster is
gitignored, so it can never appear in git diff --name-status: the HEAD's roster was carried
in as the BASE's. Both sides then held the same bytes, so an ordinary append read as
base {} -> head {row} and classified NewPoolCoincidenceResolution rather than
AuthoredReferenceResolution.

With the base side derived from the base tree's row membership, appending a class
auto-admits. Their evidence is executed rather than argued: a required run that added a
failure-mode class with NO admission row reported 0 unadjudicated deltas.

So my row is not merely redundant, it would be STALE -- a permission standing over a motion
that can no longer happen, which this wall refuses by design. Both files are taken from main
whole: the row, its label constant, its declaration-enumeration entry and my transition
narrative all go. Construction subsumed the mitigation, which is the direction DESIGN 4b
asks for, and it is a better outcome than the one I was defending.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CQuBs4mLu9ArojSWFiRcey
…fic claim: review 62715

The positive control and both expecting-reds folded through total_blocking_count_for >= 1,
which establishes THAT something was refused and never WHAT. Every conclusion these rows
carry is class-specific -- "refused, located and typed" on the class row, and the ceiling
discharge on its sibling -- so a non-discriminating oracle under a rung claim is the
inflation DESIGN 4b(1) names.

Two arms are now pinned with blocking_subject_count_for to TypeMismatch / Primitive(String):
the class half is the compiler's own histogram key, and for TypeMismatch the census subject
is the `got` type, which is the same string the rendered diagnostic prints. Measured on the
concrete-string fixture rather than assumed.

The function-at-a-concrete-position arm STAYS on the total count, and the annotation now
says why: an unapplied function value is accepted at every position today, so no refusal
exists whose subject render could be read, and a guessed subject would author an assertion
that either never greens when the wall lands or greens for the wrong reason. A wider oracle
that is honest about its width beats a narrow one that is invented. That is measured too --
the same value is accepted at a plain Bool position, so the defect is not specific to the
generic carrier -- and the arm narrows when the lane that lands the wall can read the
subject the compiler actually emits.

Compiles at 0 blocking errors.

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

gunbai-bot Bot commented Sep 8, 2026

Copy link
Copy Markdown
Contributor Author

review 62715 — the finding is correct and it is the sharpest one this PR has had, because the whole product here is a rung claim and the oracle underneath it was wider than the conclusions it carries. Fixed in d5dcb8b0.

Two arms are now pinned with blocking_subject_count_for to class TypeMismatch, subject Primitive(String) — the positive control and the string-at-a-generic-position red. Both halves are measured rather than assumed: compile_clean_diagnostic_histogram_key names the class TypeMismatch, its subject arm is got.clone(), and v1.std.core renders that same got verbatim into the message, which is where I read Primitive(String) from compiling the concrete-string fixture.

The function-at-a-concrete-position arm deliberately stays on the total count, and I want the reason on the record rather than treated as an oversight. An unapplied function value is accepted at every position today, so there is no refusal whose subject render can be read; a guessed subject would author an assertion that either never greens when the wall lands, or greens for the wrong reason. A wider oracle that is honest about its width is better than a narrow one that is invented, and the annotation now says exactly that, including the narrowing obligation on whoever lands the wall.

That is measured too, and it slightly widens the class: I compiled the same empty_map value at a plain Bool parameter — not a generic carrier, not a Map — and it is accepted with 0 blocking diagnostics. So the defect is not specific to the generic position or to the collection type; the checker does not consult the argument's own constructor at any concrete position. I have not widened the row's stated subject on that basis, because one fixture is not a survey, but it is the direction a lane taking up this class should probe first.

Compiles at 0 blocking errors. CI is re-running on the new head.

Two receipts apart, this row says "the counts are not copied here, because a copied count
is unreachable from the producer that owns it" and then transcribes "the only four rows at
that disposition in a 16836-row census". The denominator is a run-local number of the
landing run, nothing re-derives it, and it is silently wrong next week -- DESIGN section 6,
name the instrument, never transcribe its output.

Both rows now name the producer and how to read it: download required-floor-disposition
from any completed witnesses run on a change that touches the module, and read the
identities BY HEADER NAME. No count survives in either, including the denominator: the
load-bearing claim is the disposition those four identities carry, which needs none.

The sibling row admission_roster_read_as_the_whole_membership_rule carried the identical
sentence and is corrected in the same change. It is the row filed to catch reading errors,
so leaving a transcription in it would be the second instance of its own class. Its
correction says so rather than quietly rewriting the number away.

One wording fix while there: the arms are recorded known-red-held, not failed. That is the
disposition the artifact actually carries for an enrolled expecting-red.

Both files compile at 0 blocking errors.

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

gunbai-bot Bot commented Sep 8, 2026

Copy link
Copy Markdown
Contributor Author

review 62732 — correct, and the contradiction you name is the whole point of it. Fixed in ed4b7f33.

The row says at one receipt "the counts are not copied here, because a copied count is unreachable from the producer that owns it" and two receipts later transcribes "the only four rows at that disposition in a 16836-row census". The denominator is run-local to the landing run, nothing re-derives it, and it is silently wrong next week. Both rows now name the producer and how to read it — download required-floor-disposition from any completed witnesses run on a change that touches the module, read those identities by header name — and no count survives, including the denominator. As you say, the load-bearing claim is the disposition those four identities carry, which needs no denominator at all.

I also corrected the identical sentence in admission_roster_read_as_the_whole_membership_rule.dag, which is already on main and outside this PR's original scope. That row is the one filed to catch reading errors, so a transcription living inside it is the second instance of its own class; its correction records that rather than quietly rewriting the number away. If you would rather that landed separately, say so and I will split it — but leaving a known transcription in the row about misreading receipts seemed the worse of the two.

One wording fix while I was there, since it is a fact about the artifact and not a preference: the two expecting-red arms are recorded known-red-held, not failed. known-red-held is what the disposition artifact carries for an enrolled expecting-red that reached its subject and answered — I read it from the run's own artifact rather than from memory, and "failed" would have implied an unenrolled red.

Both files compile at 0 blocking errors. CI re-running on the new head.

Two receipts apart this row said the two reds ARE correctly enrolled -- with the
disposition artifact as the evidence, and an earlier removal recorded as the error -- and
then that prefix admission "is what would convert the probe into ENROLLED evidence, and
only then is an expected-red enrolment both true and necessary". Those cannot both be the
standing claim for one identity, and the second reopens exactly the removal this row exists
to record.

The residual gap is real and is kept, stated without denying present enrolment: on every
change that touches this module the floor runs these identities, they reach their subject
and answer, and un-enrolled they would block their own landing change -- so the enrolment
is true and necessary today. What it does not buy is REPETITION on ordinary floors, since a
change touching nothing here never re-runs them. required_gate_prefixes admission closes
that gap and nothing else; it does not make the enrolment true, because the artifact
already does.

The superseded reading is recorded in the row rather than deleted, because a row whose
whole subject is a misread roster should carry its own.

Compiles at 0 blocking errors.

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

gunbai-bot Bot commented Sep 9, 2026

Copy link
Copy Markdown
Contributor Author

review 62747 — confirmed and fixed in 53ec70a9. This is the third time this branch has carried the enrolment fact two ways, which is itself worth naming: the enrolment moved twice, and each time some prose describing it did not move with it.

The sentence said prefix admission "is what would convert the probe into ENROLLED evidence, and only then is an expected-red enrolment both true and necessary" — two receipts after the row establishes, from the disposition artifact, that the enrolment is correct and that an earlier revision wrongly removed it. As you say, those cannot both be the standing claim for one identity, and the second is the removal error the row exists to record, reopened in the row's own text.

The residual gap is real and is kept, now stated without denying present enrolment: on every change that touches this module the floor runs these identities, they reach their subject and answer, and un-enrolled they would block their own landing change — so the enrolment is true and necessary today. What it does not buy is repetition on ordinary floors, since a change touching nothing here never re-runs them. required_gate_prefixes admission closes exactly that gap and nothing else; it does not make the enrolment true, because the artifact already does.

I kept the superseded reading in the row rather than deleting it. A row whose entire subject is a misread roster should carry its own instance, and the deletion would have left the correction looking like it was always right.

Compiles at 0 blocking errors. CI re-running.

@briansrls
briansrls merged commit 7908b1a into main Sep 9, 2026
4 checks passed
@briansrls
briansrls deleted the session/bright-badger-637-argument-shape branch September 9, 2026 01:42
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