Repository navigation
Re-promote the 35-claim parse-reaching cohort: the residue's release trigger fired at #8565 - #8581
Conversation
The 35 claims across these three files were unpromoted by gunbc#8505 (commit e397169) because eight of them BUDGET-REFUSED at 1553-1568ms against a 1552ms ceiling. The cut was scoped by REACHABILITY rather than by the observed eight: every claim in these files reaches grammar preparation through a shared zero-arg helper, so the cheap rows were cheap only because a prior claim had already paid and they hit the call memo. Removing the observed payers would have promoted their replacements into the identical refusal. floor_expected_red chunk_14's note named the dissolution condition exactly: "the interner-independent hashing fix (dashboard adhoc-e78c4260-d3a). Once the key is a function of the grammar, the preparation amortises across claims and this cohort is promotable in one motion." That fix is gunbc#8565, merged 2026-08-19: the cross-claim prepare_grammar memo now keys on hashes of resolved symbol text rather than on interner-local ordinals. The condition it was waiting on is satisfied. WHAT THIS COMMIT DOES: restores the three files to their exact pre-cut promoted form, taken verbatim from e397169^ rather than re-derived. Re-deriving the promotion set by predicate is how the byte-offset overflow defect was introduced (demotion by enumeration where a property was available), so the authoritative prior state is used instead. Read back after writing: 7 + 25 + 3 = 35 test fns, zero residual TestClaim rows, the three unpromoted files removed. Main's unpromoted copies are byte-identical to the cut's output and nothing has touched them since, so there is no drift to reconcile. WHAT IT DELIBERATELY DOES NOT DO: chunk_14's note still describes these rows as unpromoted. That note is rewritten from the MEASURED outcome, not before it. Two distinct questions the floor run answers, and only the second licenses the dissolution: do the 33 rows PASS -- answers the prediction gunbc#8540 recorded in main do they now COST ~200ms rather than ~1550ms -- answers whether the shared first-payer preparation actually amortises Rows could pass for reasons unrelated to amortisation (a budget policy change, host speed, evaluation order), and a bare pass would then dissolve the residue on a premise that never held. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_015P8uZha7JWXtQDb6wNhyfU
…was wrong
The note explained why 35 claims were absent from the tree. They are no longer
absent, so the note has no subject and is deleted rather than amended --
chunk_14 now matches the bare `Empty {}` shape of chunks 13, 15, 16 and 17.
MEASURED OUTCOME, run 32305275924 on the re-promoted cohort:
planned=9721 executed=9721 terminal=9721 passed=9415 known_red_held=306
failed=0 stale_quarantine=0 interrupted_before_verdict=0
completed_over_cost_requirement=0 host_tool_unresolved=0
All 35 claims execute and reach a verdict. gunbc#8540's recorded prediction
that the rows would pass is CONFIRMED.
BUT THE PREMISE THE NOTE GAVE FOR RE-PROMOTION IS FALSIFIED, and this is why
the two measurements were kept separate. The note said the cohort was
promotable once "the preparation amortises across claims". It does not
amortise. Cohort costs this run, all 35 rows:
136ms, 178ms, then 33 rows between 1806ms and 2210ms (median 1986ms)
Every claim that reaches grammar preparation still pays it in full. Nothing
amortised. The rows pass because gunbc#8533 moved the ceiling from 1552ms to
10000ms, not because the cost went away -- exactly the confound that made a
bare pass/fail insufficient to dissolve this residue.
THIS IS ALSO THE FIRST HONEST MEASUREMENT OF THE COLD COST. Before, a refused
row reported 1553-1568ms, which is the old ceiling plus a scheduler quantum --
where the interruption landed, not what the row cost. The true cost was always
~2000ms and was unobservable while the ceiling cut it off. That closes the gap
that made the ceiling's own derivation unassessable: it was calibrated on rows
that complete and applied to rows it refused.
WHAT REMAINS OPEN, recorded on the memo class rather than here: gunbc#8565 made
the memo key content-addressed and demonstrably fixed the order-dependent
digest, but no amortisation followed. Either the memo still misses for a reason
the key change did not address, or the ~2000ms was never grammar preparation
and the note's cost model was wrong from the start. Both are live; neither is
asserted.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015P8uZha7JWXtQDb6wNhyfU
Both measurements, posted pass or fail as promised — and they disagreeFloor run 32305275924 on the re-promoted cohort: 1. Do the 33 rows pass — CONFIRMEDAll 35 claims execute and reach a verdict. 2. Do they now cost ~200ms rather than ~1550ms — FALSIFIEDAll 35 cohort costs, sorted: Median 1986ms. 33 of 35 rows pay full price. Nothing amortised. The rows pass because gunbc#8533 moved the ceiling from 1552ms to 10000ms — not because the cost went away. This is precisely the confound the PR description named: "rows could pass for reasons unrelated to amortisation, and a bare pass would dissolve the residue on a premise that never held." It did, and it would have. The cold cost was never what the old numbers saidThe eight rows that budget-refused reported 1553–1568ms. That is the old ceiling plus a scheduler quantum — where the interruption landed, not what the row cost. Their true cost, visible for the first time now that the ceiling accommodates them:
This closes a gap that made the 1552ms ceiling's own derivation unassessable: it was computed as a measured-max over rows that complete, and an interrupted row contributes its interruption point rather than its cost — so the calibration sample systematically excluded exactly the rows being refused. What this leaves opengunbc#8565 made the memo key content-addressed and demonstrably fixed the order-dependent digest. No amortisation followed. Either the memo still misses for a reason the key change did not address, or the ~2000ms was never grammar preparation and the residue note's cost model was wrong from the start. Both are live; neither is asserted here. Recorded against the memo class ( chunk_14's note is deleted rather than amended — its subject is gone, and its stated premise for re-promotion turned out to be false, so leaving it edited would preserve a wrong cost model in the roster authority. — sent from wise-bat-141 |
Correction: #8533 split the cost concept, it did not move the ceilingMy previous comment said the rows pass because "#8533 moved the ceiling from 1552ms to 10000ms." That is wrong about the mechanism, and the correct version is more interesting. #8533 split one number into three. On main now:
The cost line is still 1552. The 10000ms figure is a wall safety limit — a different concept doing a different job. So these rows do not pass because a ceiling rose to meet them; they pass because exceeding the cost line stopped being a verdict and became a counted diagnostic, while the thing that still fails is a safety deadline 3–6× higher. That is #8533's stated cut — cost policy separated from safety deadline. The falsification is unaffected. The rows still cost 1806–2210ms against an unchanged 1552ms cost line; nothing amortised. Only my explanation of why that is now survivable was wrong. And the cost line is demonstrably not inert for this populationWorth stating because the natural next worry is that the 1552 policy simply isn't evaluated for these rows. It is. Counting every row in the run whose measured cost exceeds 1552ms, independently of what the fold reports: Exact agreement, including composition — 33 are this cohort, and the 34th is So the ~2000ms is a real measured cost, tested against a real policy, counted when it exceeds it. What that leaves for someone to decide33 rows now sit 16–42% over a policy line, counted and non-blocking, with no owner named. #8533 made that visible rather than fatal, which is defensible — but visible-and-unowned is a state worth an explicit decision rather than a diagnostic nobody reads. That is a policy question for whoever owns the cost line, not something this PR should answer. — sent from wise-bat-141 |
The honest cost of this PR, stated as a numberChecked against main rather than assumed. Main's most recent green run ( Main carries exactly one row over the 1552ms cost line — This PR takes that population from 1 to 34. The delta is exactly this cohort: 33 rows, each 16–42% over the line. That is the price of the promotion and it belongs in front of a reviewer rather than inside a diagnostic nobody reads. Stated plainly:
The two counters agreeing across two different trees — 1 on main, 34 here, delta exactly the cohort I added — is also the strongest available evidence that the cost line is evaluated for these rows rather than skipped for them. I am not arguing that trade is obviously correct. It is a policy decision about whether 33 rows over a cost line is an acceptable price for 35 claims that execute, and it belongs to whoever owns the cost line. If the answer is no, the right response is not to re-shelve these rows — it is to find why every claim reaching grammar preparation pays ~2000ms when the memo was supposed to make that a once-per-subject cost. — sent from wise-bat-141 |
Correction to my own "1 → 34": the baseline is not stable, my contribution isThe second CI run on this branch (
Deleting a comment cannot change execution cost. So I decomposed both:
My cohort's contribution is stable at 33 across both runs. The baseline is not — it moved 1 → 12 with no code change. What the varying population actually isEvery one of the 11 newly-crossing rows is a That is a marginal population crossing a fixed threshold under host variance — real, and confined to rows that are not mine. My 33 sit at 1806–2210ms, 16–42% over, and cross in every run because they are nowhere near marginal. Why this matters beyond bookkeeping
For this PR the honest statement is therefore:
I stated "1 → 34" earlier as though both halves were facts. The first half was one observation of a variable quantity, and I should have measured it twice before quoting it — which is what the second run did for free. — sent from wise-bat-141 |
… floor refusal The floor ran end to end for the first time on this branch and refused with one precise cause: ExpectedRedIdentityDidNotExecute count=1, naming v2.lens.non_fold_residue.non_fold_residue_clean_holds. That identity is a plain `fn`, not a `test fn`, in a module with no test roots, so discovery cannot produce it and the enrollment is stale by construction. Main had already removed the row (#8505 / #8581, promoting orphan TestClaim predicate files to executing witnesses); this branch was simply behind. Absorbing main is the fix, not an edit of mine to the roster. Five conflicts. `src/v1/04_infer.dag` carried three. One is main's new `scalar_shaped_builtin_method_arg_type` plus the `is_lambda_expr` it sits above -- taken as main authored it, with `Node` re-qualified, because the cut is a mechanical transformation of whatever content lands, never a reason to drop it. The other two are the same line seen twice: main changed the argument from `a2` to `a2_qualified` while this branch qualified the callee to `v1.compiler.infer_env.symbol_index_insert`. These are edits to different parts of one call, so the resolution is both -- taking either side alone silently discards the other's work, and neither would have failed loudly. The three `body_lowering_*` manual tests are renames on main (`body_lowering_match.dag` -> `body_lowering_match_test.dag`) that also convert `fn` to `test fn` and drop the hand-authored TestClaim rows -- the promotion to executing witnesses. Taken whole from main and re-cut, the same interval rule the fifth integration used: 169 names qualified across the four files that arrived carrying imports. One modify/delete: `long/transport_script_wall_compile_red_test.dag`, deleted on main and modified here only by the cut. The deletion stands; a file main removed is not resurrected by the fact that this branch reformatted it. Guards green on the merged tree: surviving_import 0, qualified_kernel_type 0, qualified_let_binder 0, local-shadowing detector 0 over 3,760 declared modules.
Re-promotes the 35-claim parse-reaching cohort that gunbc#8505 declared as residue. The dissolution condition this cohort was waiting on has fired.
The residue, and why it existed
gunbc#8505 promoted 322 claims from inert
TestClaimdata rows into executing witnesses. Eight of them budget-refused at 1553–1568ms against a 1552ms ceiling — over by 1 to 11ms. The fold reportedfailed=0: no wrong answer anywhere in 9421 rows. What it reported was eight claims that produced no verdict at all.An enrolled row that budget-refuses is worse than an unplanned one. Enrollment asserts an expected verdict; a refusal preempts the verdict, so a content defect in those rows would be indistinguishable from the enrolled failure. That is the same coverage-shaped-but-not-coverage state #8505 exists to remove, one step further along — so the rows were unpromoted rather than quarantined, leaving them visibly uncovered instead of falsely covered.
The cut was scoped by reachability, not by the observed eight: every claim in these three files reaches grammar preparation through a shared zero-arg helper (
body_lowering_normalized_module,body_lowering_parsed_fn_decl,body_lowering_parsed_tree), so the cheap rows were cheap only because a prior claim had already paid and they hit the call memo. A non-payer's measured cost is not evidence of what it costs as a payer. Dropping the observed eight would have promoted their replacements into the identical refusal.The trigger fired
floor_expected_redchunk_14's note named the condition exactly:That fix is gunbc#8565, merged 2026-08-19: the cross-claim
prepare_grammarmemo now keys on hashes of resolved symbol text rather than interner-local ordinals. The measured defect it closes was that reversing only the order in which the same claims are named produced a different digest for the same grammar — so a first payer's stored result was unreachable to anyone who interned differently.What this PR does
Restores the three files to their exact pre-cut promoted form, taken verbatim from
e397169649^rather than re-derived. Re-deriving a promotion set by predicate is precisely how the byte-offset overflow defect was introduced in this lane (demotion by enumeration where a property was available), so the authoritative prior state is used instead.Verified by reading back after writing: 7 + 25 + 3 = 35
test fn, zero residualTestClaimrows, three unpromoted files removed. Main's unpromoted copies are byte-identical to the cut's output and nothing has touched them since, so there is no drift to reconcile.What it deliberately does not do yet
chunk_14's note still describes these rows as unpromoted. That note is rewritten from the measured outcome, not before it. The floor run answers two distinct questions and only the second licenses dissolving the residue:
Rows could pass for reasons unrelated to amortisation — a budget policy change, host speed, evaluation order — and a bare pass would dissolve the residue on a premise that never held. Both numbers get posted here, pass or fail.
Standing obligation this discharges
gunbc#8540's merged body states that the 33-row prediction is confirmed or falsified after the cohort is re-run on top of the fix, and that the numbers will be posted. That commitment was recorded against a session that has since closed; this PR carries it.
🤖 Generated with Claude Code
https://claude.ai/code/session_015P8uZha7JWXtQDb6wNhyfU