Skip to content

A wrong cause recruits effort where a missing one merely stalls - #10755

Merged
gunbai-bot[bot] merged 5 commits into
mainfrom
fix/trigger-names-a-term-that-is-not-the-cause
Sep 7, 2026
Merged

gunbai-bot[bot] merged 5 commits into
mainfrom
fix/trigger-names-a-term-that-is-not-the-cause

Conversation

@gunbai-bot

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

Copy link
Copy Markdown
Contributor

The class

A declared drop's restoration trigger names a quantity that is not what the subject actually costs.

The trigger is well formed by every structural check the corpus can run: it states a capability, it says what that capability must be sufficient for, its citations resolve, and it has never been satisfied. What is false is the causal premise underneath it.

The asymmetry is the class: a missing trigger stalls, a wrong one recruits. A row with no trigger is visibly incomplete and §4b(2) already refuses it. A row with a confident wrong trigger reads as tracked — so someone picks it up, reduces the named quantity, watches the number not move, and concludes the trigger is simply hard. The drop then stands with an honest-looking receipt and a failed attempt behind it, which is stronger evidence of difficulty than silence would have been. The class consumes effort in proportion to how well the row is written.

The evidence

Established on #10744, against gunbc.rung_drop.determinism_transitive_reachability, whose trigger stated the pressure came from the number of reachable declarations.

At the directory grain the trigger names, the walk reaches fewer than 100 declarations — barely more than the 78 it seeds from — against a candidate pool of 1500–2000, costing 10137ms against a 500ms line.

The discrimination required two grains, not a bigger sample at one. At file grain the pool equals the reached set, so O(reached × pool) and O(reached²) make identical predictions and no amount of data at that grain separates them. Varying the grain decouples the populations, and the models score outright:

model file grain directory grain agreement
O(reached × pool) 0.0347 0.0655 1.9x
O(reached²) 0.0347 1.5289 44x

Why source reading produces this class rather than catching it: the same walk contains three genuinely quadratic-in-reached shapes, all real, all subject to the bare-minimum-cost rule — and none is what is being paid. Reading source finds every candidate term; only a measurement in which the candidates make different predictions finds the cause. A row whose cause came from a source reading is the expected outcome of ordinary diligence, not carelessness, which is why this needs a rule rather than an exhortation.

The second failure direction

The same row also prescribed narrowing the subject to the reachable modules. That would lower the number — by shrinking the pool, leaving the shape intact — so the trigger was satisfiable by the very narrow-the-subject move that created the drop, and a drop retired that way re-breaks the instant the subject widens, which is what the drop exists to restore.

A trigger that can be satisfied by shrinking the subject is not a trigger — it is a restatement of the budget.

The footprint was visible throughout

The witness reads one file, so n was small, and three lanes called it near-ceiling noise on exactly that ground. But the subject had been narrowed to one file because the directory walk was interrupted_before_verdict — the carrier's own comment says so. n is small here was the defect's footprint, not a reason to tolerate it: the corpus had already paid the cost once, in coverage, and the drop is the receipt for that payment.

Rung and ceiling

Rung found at: outside the ladder, honestly rather than at 1 — nothing fails, nothing refuses, no diagnostic fires, and the row passes every structural check; §4b(2) asks whether a trigger exists and names a capability, and this one does both.

Ceiling 2, and not higher. Whether a stated cause is the true cause is a claim about the world, so no construction can make a wrong one unwritable. The trigger is therefore a check on the evidence's shape, not on the cause's truth: a drop whose reason is a cost names the instrument that measured it and the populations that instrument varied, refused if it varied only one where the stated term multiplies two. The first is decidable and the second is not, and conflating them is how this class would be over-promised into a wall it cannot reach.

Distinguished from both neighbours

  • trigger_satisfied_before_the_row_was_written — there the capability had already shipped, so the class is born retired and nothing is owed. Here the work is genuinely outstanding; what is wrong is which work.
  • dissolution_trigger_cites_a_mechanism_that_is_later_deleted — there the citation rots, and a resolver can find that a named mechanism no longer exists. Here every citation resolves and every name is live; the falsehood is a claim about causation, which no citation check can see.

Regenerated through the new actuator

#10701 landed a docs-projection gate because main_wet dies inside the whole-registry emit graph, so the recipe is now gunbc run … --entry dag/gunbc/instruments/docs_projection_gate.dag --function regen, homed in tools.docs_projection_agreement. This branch is cut from current main (1e51ea99bb), two commits past where the earlier rows landed.

Receipt that the new actuator agrees with the committed tree: the regen rewrote both ledger projections and the only diff is this row's two lines — zero unrelated insertions, zero deletions.

🤖 Generated with Claude Code

https://claude.ai/code/session_01CQyej6wA7GiSibWkkjMsro

Brian Searls and others added 4 commits September 7, 2026 09:36
The class established by measurement on #10744: a declared drop's
restoration trigger names a quantity that is not what the subject costs.
The trigger is WELL FORMED by every structural check the corpus can run --
it states a capability, it says what that capability must be sufficient
for, its citations resolve, and it has never been satisfied. What is false
is the causal premise underneath it.

THE ASYMMETRY IS THE CLASS. A missing trigger stalls and 4b(2) already
refuses it. A confident wrong one reads as tracked, so someone picks it up,
reduces the named quantity, watches it not move, and concludes the trigger
is hard -- leaving the drop standing with an honest-looking receipt AND a
failed attempt behind it, which is stronger evidence of difficulty than
silence. The class consumes effort in proportion to how well the row is
written.

THE EVIDENCE IS THE TWO-GRAIN DISCRIMINATION, and it is the part that could
not have come from more data at one grain. At file grain the candidate pool
EQUALS the reached set, so reached-times-pool and reached-squared make
identical predictions and no sample size separates them. Varying the grain
decouples the populations and the models score outright: 1.9x agreement
against 44x disagreement.

WHY SOURCE READING PRODUCES THIS RATHER THAN CATCHING IT: the same walk
contains three genuinely quadratic-in-reached shapes, all real, and none is
what is being paid. Reading source finds every CANDIDATE term; only a
measurement in which the candidates make different predictions finds the
cause. A row whose cause came from a source reading is the expected outcome
of ordinary diligence, which is why this needs a rule and not an
exhortation.

THE SECOND FAILURE DIRECTION retires the drop wrongly rather than never:
the same row prescribed narrowing the subject, which lowers the number by
shrinking the pool while leaving the shape intact -- so the trigger was
satisfiable by the move that created the drop. A trigger that can be
satisfied by shrinking the subject is not a trigger; it is a restatement of
the budget.

AND THE FOOTPRINT WAS VISIBLE THROUGHOUT: the witness read one file, so n
was small, and three lanes called it near-ceiling noise on that ground. The
subject had been narrowed to one file BECAUSE the directory walk was
interrupted_before_verdict. "n is small here" was the defect's footprint,
not a reason to tolerate it.

Rung: outside the ladder, honestly -- nothing fails and the row passes every
structural check. Ceiling 2 and NOT higher: whether a stated cause is the
true cause is a claim about the world, so no construction makes a wrong one
unwritable. The trigger is therefore a check on the EVIDENCE's shape, not
on the cause's truth -- a cost reason must name the instrument and the
populations it varied, refused if it varied one where the stated term
multiplies two. The first is decidable and the second is not, and
conflating them would over-promise this class into a wall it cannot reach.

Distinguished from both neighbours: trigger_satisfied_before_the_row_was_written
is born retired with nothing owed, and here the work is genuinely
outstanding -- what is wrong is which work;
dissolution_trigger_cites_a_mechanism_that_is_later_deleted rots a citation
a resolver can check, and here every citation resolves and the falsehood is
about causation, which no citation check can see.

REGENERATED THROUGH THE NEW ACTUATOR, not the old one. #10701 landed a
docs-projection gate because main_wet dies inside the whole-registry emit
graph, so the recipe is now
`gunbc run --entry dag/gunbc/instruments/docs_projection_gate.dag --function regen`,
homed in tools.docs_projection_agreement. Cut from current main
(1e51ea9), two commits past where the earlier rows landed. The receipt
that the new actuator agrees with the committed tree: the regen rewrote
both ledger projections and the only diff is this row's two lines, zero
unrelated insertions and zero deletions.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CQyej6wA7GiSibWkkjMsro
…ming the wrong term

This row's receipts stated the cost as "a full scan of the candidate pool per callee lookup". That
mechanism has been refuted BY EXECUTION on the repair lane: `decls_in_modules` is a plain-valued
call with hashable arguments, so the eval-frame memo had already collapsed the repeats to one
evaluation -- the rescan was not being paid, and an index built to remove it made the witness about
1.1s WORSE.

WHAT THE MEASUREMENT ESTABLISHED IS THE FIT, NOT THE MECHANISM, and the receipts now say only
that. Cost is POOL-PROPORTIONAL -- reached-times-pool agrees within 1.9x across two grains where
reached-squared disagrees by 44x, and the repair lane has since confirmed it with the reached set
pinned identical at 89 of 89: cost tracks the pool the walk is HANDED, not what it reaches. The
mechanism paying that term is unattributed and is left unattributed here.

WHY THIS EDIT AND NOT A LATER ONE. main already carries one refuted mechanism sentence with a
repair prescription attached, and it is being corrected. A second copy in a different row would be
the same defect propagating through the ledger -- and in this row it would be worse than
elsewhere, because the class this row names is a carrier asserting a cause it did not establish.
Writing a plausible unverified mechanism into it would commit its own error inside the row that
names it, which is what the new receipt says in place of the old sentence.

Projection regenerated with `gunbc.instruments.docs_projection_agreement`
`docs_projection_regen_command`; the only diff is this row's line.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CQyej6wA7GiSibWkkjMsro
Review 61926's second finding is right against DESIGN.md section 6: the receipts carried 10137ms,
90ms and 2.9ms per reached declaration, 1.9x, 44x, an index regression in seconds and a pinned
reached count, and named no producer that re-derives any of them.

ONE RECEIPT NOW NAMES THE INSTRUMENT for every figure in the row -- `claim_batch` over a probe
calling `call_reachable_decls` at both grains, bracketing the reached count and the pool size by
threshold ladder, which is the producer `gunbc.rung_drop.determinism_transitive_reachability`
already names for the figures this row draws from. The two-model scores are that probe read at
file and directory grain; the index refutation is the same probe with the index arm present and
absent, which is also what pins the reached set identical across arms.

THE TWO FIGURES WITH NO PRODUCER ANYWHERE ARE GONE RATHER THAN CITED. The 1.1s regression and the
89-of-89 reached count came from the repair lane's execution, not from a run this row can name, so
they now read as "WORSE rather than faster" and "pinned identical across both arms" -- the facts
that carry the argument, without borrowing precision the row cannot re-derive. The discriminating
ratios stay, because the 1.9x-versus-44x spread IS the finding rather than an output beside it,
and it is now cited to the producer that yields it.

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

gunbai-bot Bot commented Sep 7, 2026

Copy link
Copy Markdown
Contributor Author

Both findings in review 61926 are real. One is fixed here; the other is fixed in a PR that was already open when the review ran.

Finding 2 — figures transcribed without their producer. Fixed in ec26f13. One receipt now names the instrument for every figure in the row: claim_batch over a probe calling call_reachable_decls at both grains, bracketing the reached count and the pool size by threshold ladder — the same producer gunbc.rung_drop.determinism_transitive_reachability already names for the figures this row draws from. The two-model scores are that probe at file and directory grain; the index refutation is the same probe with the index arm present and absent, which is also what pins the reached set identical across arms.

The two figures with no producer anywhere — the ~1.1s regression and the 89-of-89 reached count — are removed rather than cited. They came from the repair lane's execution, not from a run this row can name, so they now read as "WORSE rather than faster" and "pinned identical across both arms". The discriminating ratios stay: the 1.9x-versus-44x spread is the finding rather than an output beside it, and it is now cited to the producer that yields it.

Finding 1 — the refuted mechanism standing in the live trigger. Correct, and being repaired in #10757, not here. gunbc/rung_drop/determinism_transitive_reachability.dag is the subject of #10757, "A restoration trigger prescribed an index; the mechanism it derived that from is refuted", which was already open when this review ran. Two lanes editing one row is how the corpus gets a merge conflict on the exact file whose authority is in question.

The choice is not between fixing it here and leaving it standing. The lane that produced the refuting measurement is the lane that can state the replacement capability, and I cannot: naming a new mechanism for the pool term is precisely what this row says not to do without a measurement that discriminates it, and that measurement is theirs and still has a falsifier queued. Writing a plausible replacement trigger into that drop would commit this row's own error inside the change that files it.

So the honest split is: the class lands here with its own mechanism sentence corrected (065448d removed the refuted "full scan of the candidate pool per callee lookup" from this row's receipts), and the live instance is corrected by its owner in #10757.

— sent from valiant-hawk-92

…r branch to remove it

Review 61926's first finding is that this PR files the class while its live instance stands:
`gunbc.rung_drop.determinism_transitive_reachability` carries a restoration trigger prescribing
that the callee lookup answer by index rather than by scanning the candidate pool, over prose
attributing the cost to that rescan -- the mechanism this row's measurement refutes. That trigger
is therefore satisfiable by shipping the index while the number it exists to restore does not
move, which is this class exactly.

THE ROW NOW SAYS SO. Two receipts name the instance, name why this change does not correct it, and
claim no discharge. Correcting it means naming a REPLACEMENT capability for the pool term, which is
the move this class forbids without a measurement that discriminates the mechanism -- and that
measurement belongs to the lane holding the falsifier. Writing a plausible replacement trigger into
that drop would commit this row's own error inside the change that files it.

DISCLOSURE RATHER THAN A PROMISE, AND THE DIFFERENCE IS THE WHOLE POINT. An earlier form of this
answer said the instance would be corrected elsewhere. That is a claim about another branch which
this head cannot verify and which is false the moment that branch slips. What is written instead is
true at this head, true if the instance is corrected tomorrow, and true if it never is. Section 4b
already requires a class below its ceiling to state its residual honestly; an unremediated live
instance is part of that residual, and a row that names its own instance is better evidence the
class is understood than one that assumes it away.

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

gunbai-bot Bot commented Sep 7, 2026

Copy link
Copy Markdown
Contributor Author

Follow-up on finding 1 — my earlier reply was right about why this change does not correct the drop row, and wrong to leave the answer resting on another branch landing. Fixed in 6ff883b.

The row now names its own live instance. Two receipts state that gunbc.rung_drop.determinism_transitive_reachability carries a restoration trigger prescribing the index over prose attributing the cost to the rescan, that the trigger is therefore satisfiable by shipping the index while the number it exists to restore does not move, and that this change does not discharge it and promises nothing about who will.

The reason it is disclosure rather than a repair is unchanged and stands on its own: correcting that trigger means naming a replacement capability for the pool term, which is the move this class forbids without a measurement that discriminates the mechanism, and that measurement belongs to the lane holding the falsifier. Writing a plausible replacement trigger into that drop would commit this row's own error inside the change that files it.

What changed is that the claim is now verifiable at this head. "The instance will be corrected elsewhere" is a statement about someone else's branch that goes false the moment it slips; "a live instance exists, here it is, this change does not remove it" is true at this head, true if it is corrected tomorrow, and true if it never is. §4b already requires a class below its ceiling to state its residual honestly, and an unremediated live instance is part of that residual.

— sent from valiant-hawk-92

@gunbai-bot
gunbai-bot Bot merged commit 6e18ac4 into main Sep 7, 2026
4 checks passed
@gunbai-bot
gunbai-bot Bot deleted the fix/trigger-names-a-term-that-is-not-the-cause branch September 7, 2026 13:13
briansrls pushed a commit that referenced this pull request Sep 7, 2026
Main landed #10755 on the failure-mode roster and its projection while this PR was open.

Co-authored-by: Cursor <cursoragent@cursor.com>

# Conflicts:
#	docs/design-failure-modes.md
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.

0 participants