Repository navigation
A wrong cause recruits effort where a missing one merely stalls - #10755
Conversation
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
…erm-that-is-not-the-cause
…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
|
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: 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. 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
|
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 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 |
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
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)andO(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:O(reached × pool)O(reached²)Why source reading produces this class rather than catching it: the same walk contains three genuinely quadratic-in-
reachedshapes, 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.
The footprint was visible throughout
The witness reads one file, so
nwas 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 wasinterrupted_before_verdict— the carrier's own comment says so.n is small herewas 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
#10701landed a docs-projection gate becausemain_wetdies inside the whole-registry emit graph, so the recipe is nowgunbc run … --entry dag/gunbc/instruments/docs_projection_gate.dag --function regen, homed intools.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