Skip to content

Re-measure the src/v1 RESTORE ruling: the conclusion stands, the reason was wrong - #8520

Merged
briansrls merged 3 commits into
mainfrom
work/floor-v1-source-root
Aug 19, 2026
Merged

briansrls merged 3 commits into
mainfrom
work/floor-v1-source-root

Conversation

@gunbai-bot

@gunbai-bot gunbai-bot Bot commented Aug 19, 2026 •

Copy link
Copy Markdown
Contributor

This PR originally widened the required floor's source roots to include src/v1. review 53699 correctly requested changes: v1_dead_witness_tree_triage_receipt_remainder had already ruled that out, and I had not reconciled against it. The receipt is in the same file whose compile_clean_source_roots I reached for; I searched it for consumers of witness_layer_roots and never read its v1 triage notes.

So I ran the experiment this PR already was — CI run 32219326621, srv1-04, floor step 05:27:35Z–05:36:41Z.

The old reason no longer reproduces

stalled 8+ minutes in strict-preparation, RSS plateaued ~7.2GB, zero phase progress, killed

Preparation ran to completion in ~9 minutes and refused with 532 typed, located diagnostics. No stall, no kill. The cost objection went stale the night before this PR was authored:

landed change measured effect
#8465 grammar sync tokens as an enumeration unblocked the prepare_grammar memo for every language
#8487 one left-corner relation instead of 38 closures first row of a parse-bearing module 10890ms → 1106ms

The conclusion survives anyway, for a better reason

Zero of the 532 diagnostics are in src/v1 — 525 in src/v2, 7 in dag/test. The two trees share no exact module path, but collide on the last segment twelve times:

artifact  coercion  common  compile  complexity  emit
infer  normalize  ownership  parse  resolve  tokenize

v2.compiler.program_assembly calls tokenize(...) at line 28 with no import for it. That bare cross-module reference resolves today only by pool-membership coincidence; adding src/v1 supplies a second module whose last segment matches, and it stops resolving. This is the Class B failure DESIGN's import-strip cascade thread already names, reached from the opposite direction.

Why the correction matters more than the ruling

Under the old receipt the dissolve-on is implicitly "when the floor gets faster" — so the next person to land a preparation win retries this and hits 532 errors again. I would have been that person. The corrected receipt sets the trigger on namespace-only resolution: bare cross-module references binding by containment rather than by pool coincidence. Right trigger, right lane.

What this PR now is

The source-root change is reverted. Net diff is one line in one file; the emitted floor invocation is unchanged at two roots. The old measurement is retained beside the new one rather than overwritten — it was true when written.

And one consequence the receipt now states plainly instead of leaving implicit: src/v1 has no per-PR gate on its source validity until that lane lands, because compile-clean died with the floor cut and regen is red by construction. #8519 is the specimen that proved a parse error there is invisible.

🤖 Generated with Claude Code

…ubject

src/v1's .dag sources had NO per-PR coverage of their source validity. The
floor folded witness_layer_roots (= dag + src/v2), which is the corpus MINUS
the seed, so nothing on every-PR CI ever parsed src/v1/**.dag. A parse error
there was invisible, which is how one landed (#8519, fixed).

What DID cover v1 and no longer does:
  compile-clean  deleted with the 2026-08-15 floor cut
  regen          red by construction since the regen root cut (#8406)

v1's BEHAVIOR is covered -- 253 files under dag/test/claim reach it -- but
through host builtins against the compiled Rust seed, not by resolving v1 .dag
sources. Behavior tested, source validity not.

THE CHANGE IS ONE LINE AND MINTS NOTHING. gunbc.ci_layer_roots already defines
compile_clean_source_roots() = witness_layer_roots + [src/v1], the pool
authority meaning 'the corpus including the seed'. The emitter folds that
instead. Deliberately NOT adding src/v1 to witness_layer_roots: that list has
227 references and 13 witnesses pin its value (shard partition boundaries,
pre-push scope, doc-graph roots, lens grounding pools), so widening it would
move four unrelated subsystems' entry roots in one edit.

VERIFIED RATHER THAN ASSUMED that this actually parses the files:
prepare_repository_once builds its index over ALL source roots and pushes every
indexed module into the compiled subject, calling witness_file_from_source on
each. Pool membership IS subject membership on this path -- so src/v1 is parsed
and typechecked, and its witnesses enroll. I had assumed the opposite first.

RETIRES A SCAFFOLD. src/v1/stage0/src/bin/v1_src_dag_parse.rs is a registered
Scaffold whose dissolve-on reads 'when src/v1 .dag is parsed by the modeled
pipeline'. That is this change. It is also weaker than what it is replaced by:
it read src/v1/*.dag NON-recursively, missing 8 nested files including
src/v1/tests/claim/checkpoint_identity_keying_witness_test.dag and its 7
witnesses, and nothing executed it -- it is built and shipped in the release
bin pack and invoked by no workflow. Its deletion is not bundled here; this
commit only makes it retirable.

Local probe on this tree: 46/46 top-level src/v1 .dag parse clean (#8519 is
already merged as e1da001). Whether typechecking src/v1 as part of the
prepared subject surfaces more is what this PR's CI answers.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@gunbai-bot

gunbai-bot Bot commented Aug 19, 2026

Copy link
Copy Markdown
Contributor Author

REQUEST_CHANGES accepted as correct. I missed that receipt, and I should not have — it lives in ci_layer_roots.dag, the same file whose compile_clean_source_roots I reached for. I searched that file for consumers of witness_layer_roots and never read its v1 triage notes.

The receipt (v1_dead_witness_tree_triage_receipt_remainder) says plainly:

RESTORE (widening the required floor's source roots to include src/v1) was measured and conclusively ruled out for the whole population in a prior window of this same triage (claim_executor --required-floor with --source-root src/v1 added stalled 8+ minutes in strict-preparation, RSS plateaued ~7.2GB, zero phase progress, killed)

That is exactly this change, and §3 does forbid leaving the tree with a merged behavior contradicting a standing receipt. So one of two things has to land in this PR: an executed re-measurement, or a retraction of the receipt.

The re-measurement is already running — this PR's own CI is that experiment. Run 32219326621, floor step started 05:27:35Z. I will report the result here either way, including if it stalls and the PR has to close.

Why I think it may genuinely have moved, stated as a hypothesis and not a defence. The stall was in strict-preparation, and preparation is precisely what changed last night, after the triage window that produced this receipt:

landed change effect on preparation
72676cf0be 21:01 grammar sync tokens as an enumeration (#8465) unblocked the prepare_grammar memo for every language
7cc7a16744 23:16 one left-corner relation instead of 38 closures (#8487) first row of every parse-bearing module 10890ms → 1106ms

Measured on the arrow-lambda module: 12 of 14 rows went 12–14s → under 400ms, and the module total 228167ms → 27876ms. The surviving ~10s per-module preparation constant that #8487 removed is exactly the cost a strict-preparation stall over 54 more source files would have been dominated by.

So the honest reading is that the receipt was true when written and may have been invalidated hours later by unrelated work — which is the same staleness class this PR's sibling (#8500) exists to fix in DESIGN.md. That does not make it stale; the run does.

If the run is green, I will update v1_dead_witness_tree_triage_receipt_remainder in this PR — retracting the RESTORE ruling with the new receipt beside the old one and the reason it moved, not silently deleting it. If it stalls, I close this PR and the receipt stands reinforced with a second dated measurement.

Either way the contradiction does not survive this PR.

— sent from tidy-lark-471

…rong

REQUEST_CHANGES on this PR was correct. v1_dead_witness_tree_triage_receipt_remainder
already ruled out widening the required floor's source roots to include src/v1,
and this PR did exactly that without reconciling against it. I missed the
receipt in the same file I reached into.

So I ran the experiment this PR already was. CI run 32219326621, srv1-04, floor
step 05:27:35Z-05:36:41Z.

THE OLD REASON NO LONGER REPRODUCES. The receipt says 'stalled 8+ minutes in
strict-preparation, RSS plateaued ~7.2GB, zero phase progress, killed'.
Preparation ran to COMPLETION in ~9 minutes and refused with 532 typed located
diagnostics. No stall, no kill. The cost objection went stale the night before:
#8465 unblocked the prepare_grammar memo for every language, #8487 replaced 38
left-corner closures with one converging relation, and a parse-bearing module's
first row went 10890ms -> 1106ms.

THE CONCLUSION SURVIVES ANYWAY, for a better reason. Zero of the 532 diagnostics
are in src/v1 -- 525 in src/v2, 7 in dag/test. The two trees share NO exact
module path but collide on the LAST SEGMENT twelve times: artifact, coercion,
common, compile, complexity, emit, infer, normalize, ownership, parse, resolve,
tokenize. v2.compiler.program_assembly calls tokenize at line 28 with no import
for it; that bare cross-module reference resolves today only by pool-membership
coincidence, and adding src/v1 supplies a second module whose last segment
matches. The reference stops resolving. That is the Class B failure DESIGN's
import-strip cascade thread names, reached from the opposite direction.

WHY THE CORRECTION MATTERS MORE THAN THE RULING. Under the old receipt the
dissolve-on is implicitly 'when the floor gets faster' -- so the next person to
land a preparation win retries this and hits 532 errors again. The corrected
receipt sets it on namespace-only resolution instead: bare cross-module
references binding by containment rather than by pool coincidence. Right
trigger, right lane.

The source-root change is REVERTED. This PR now carries only the receipt, and
the old measurement is retained beside the new one rather than overwritten.

Stated plainly in the receipt rather than left implicit: src/v1 has NO per-PR
gate on source validity until that lane lands, because compile-clean died with
the floor cut and regen is red by construction. #8519 is the specimen that
proved a parse error there is invisible.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@gunbai-bot gunbai-bot Bot changed the title Floor: fold compile_clean_source_roots so src/v1 is in the prepared subject Re-measure the src/v1 RESTORE ruling: the conclusion stands, the reason was wrong Aug 19, 2026
@gunbai-bot

gunbai-bot Bot commented Aug 19, 2026

Copy link
Copy Markdown
Contributor Author

Result of the re-measurement I promised, and it settles review 53699 in a way I did not expect: you were right to block, and the receipt you cited was also wrong.

CI run 32219326621, floor step 05:27:35Z–05:36:41Z.

It did not stall. Preparation ran to completion in ~9 minutes and refused with 532 typed, located diagnostics. No plateau, no kill. The performance objection had gone stale hours before I opened this PR — #8465 unblocked the prepare_grammar memo and #8487 replaced 38 left-corner closures with one converging relation, taking a parse-bearing module's first row from 10890ms to 1106ms.

But the ruling holds, for a cause the old receipt could not see. Zero of the 532 are in src/v1 — 525 in src/v2, 7 in dag/test. The trees share no exact module path and collide on the last segment twelve times (tokenize, parse, compile, infer, resolve, emit, normalize, coercion, artifact, complexity, ownership, common). v2.compiler.program_assembly calls tokenize(...) at line 28 with no import for it — a bare cross-module reference resolving by pool-membership coincidence, which a second same-named module breaks. Class B, from the opposite direction.

So the honest disposition is neither "merge it" nor "close it":

The §3 contradiction you flagged is gone in both directions — the tree no longer carries a receipt contradicting merged behavior, and no longer carries a receipt whose stated mechanism is false.

— sent from tidy-lark-471

The APPROVE on this PR cited v1_dead_witness_tree_triage_receipt (line 928).
I had corrected v1_dead_witness_tree_triage_receipt_remainder (931). Checking
that discrepancy found the real defect: THREE receipts carry the RESTORE
ruling, and I had corrected one.

  929  v1_dead_witness_tree_triage_receipt                      stale
  931  v1_dead_witness_tree_triage_receipt_remainder            corrected
  933  v1_dead_witness_tree_triage_receipt_emitter_ambiguous..  stale

That is a partial sweep -- the failure I flagged twice today in other diffs and
then committed here. It took a reviewer's mis-citation to surface it.

Line 933 makes it worse than symmetry: it records that the stall was
'corroborated independently by smart-ram-730 via CI run 32196317824 on a
dedicated srv4 runner'. So a second session's measurement was also attached to
a mechanism that no longer reproduces, and the corrected receipt would have been
outvoted two-to-one by its own stale siblings.

FIXED BY CITATION, NOT DUPLICATION. The full corrected measurement stays in
_remainder alone. The other two now record three facts -- the stall does not
reproduce, the ruling stands on twelve last-segment module collisions, the
trigger is namespace-only resolution rather than a floor speedup -- and then
cite _remainder instead of restating it. One authority, two references. Both
original measurements are retained as the record of what was true then.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@gunbai-bot

gunbai-bot Bot commented Aug 19, 2026

Copy link
Copy Markdown
Contributor Author

Your APPROVE had no findings, but its citation did — and it was the useful part of the review.

You named v1_dead_witness_tree_triage_receipt (line 928). I had corrected ..._remainder (931). Checking that discrepancy found the actual defect: three receipts carry the RESTORE ruling and I had corrected one.

929  v1_dead_witness_tree_triage_receipt                          stale
931  v1_dead_witness_tree_triage_receipt_remainder                corrected
933  v1_dead_witness_tree_triage_receipt_emitter_ambiguous_...    stale

A partial sweep — which is the failure I flagged twice today in other diffs and then committed here myself.

Line 933 makes it sharper than mere symmetry: it records that the stall was "corroborated independently by smart-ram-730 via CI run 32196317824 on a dedicated srv4 runner." So a second session's measurement was also pinned to a mechanism that no longer reproduces, and the corrected receipt would have been outvoted two-to-one by its own stale siblings. Anyone reading the file would have found two rows asserting the stall and one denying it.

Fixed by citation rather than duplication. The full corrected measurement stays in _remainder alone. The other two now record the three load-bearing facts — the stall does not reproduce, the ruling stands on twelve last-segment module collisions, the trigger is namespace-only resolution and not a floor speedup — then cite _remainder instead of restating it. One authority, two references; both original measurements retained as the record of what was true when written.

Net diff is now 3 lines in 1 file. dag/gunbc/ci_layer_roots.dag parses clean locally.

— sent from tidy-lark-471

@briansrls
briansrls merged commit 3d11188 into main Aug 19, 2026
1 check passed
@briansrls
briansrls deleted the work/floor-v1-source-root branch August 19, 2026 06:45
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