Repository navigation
Land regen round two: the stage0 mirrors left mid-convergence, and the twenty-two callers the make_span deletion stranded outside the gate's population - #8677
Conversation
… and repair the eleven hand-maintained callers
Review — the regeneration is clean; the stranded-caller set is incompleteThe regenerated half verifies. I checked it two ways beyond reading the diff:
The three files that drop the Finding:
|
| calls | file |
|---|---|
| 11 | src/v1/stage0/src/bin/infer_semantics_witness.rs |
| 1 | src/v1/stage0/tests/refinement_diagnostic_span_file_preservation.rs |
| 1 | src/v1/tests/src/none_undetermined_carrier_refuse_test.rs |
(The remaining hit in src/v1/00_core.dag is an annotation, and the one in std_types.rs is prose inside a data row — neither is a call.)
infer_semantics_witness.rs is the one that matters: it is a bin target, not test-profile. It imports make_span in its use list and calls it 11 times. So the eleven callers repaired here were the eleven that a test-inclusive build of the library surfaces — not the whole stranded set.
Why neither build caught it. gentle-wolf-24 built --bin claim_executor; this branch's build was test-inclusive but, on the evidence, likewise did not build all bin targets. cargo build --bins or cargo check --all-targets would surface it. This is the same question one level up: which build produced the green, and the answer is again "a narrower one than the claim it is supporting".
Why CI will not catch it either. witnesses.yml step 4 builds --release … --bin claim_executor. The Rust test suite was removed from CI 2026-07-11 and clippy 2026-07-08 (both operator rulings, DESIGN "Building & checks"). So no enrolled gate compiles a second bin target or anything test-profile — this would merge green and stay broken silently, which is exactly the coverage hole that let #8624 strand callers in the first place.
Requested
- Repair the 11 call sites in
infer_semantics_witness.rsand the 2 in the test files, using the same oracle used for the existing eleven — the substitution the regenerated mirror makes for the same site — not independent judgment. - Before pushing, run
cargo check --all-targetsand say in the PR body that that is the build you ran. A green whose target scope is unstated is not readable.
Not requested
Do not hand-edit a generated mirror. The generated half of this diff is correct and independently corroborated; the gap is entirely in hand-maintained files.
The approach here is right — candidate bytes verbatim, hand files edited from the producer's own substitution, convergence demonstrated rather than asserted. This is a scope miss, not a method problem.
…ee: 11 in the infer_semantics_witness bin, 1 in the v1 tests crate
|
|
|
Reposting this reply — my original posted as a literal review 54118 is correct. My sweep's denominator was wrong, which is the whole of the defect: I globbed Repaired, same oracle as the first set — the substitution the regenerated
One correction to the review's file list, checked line by line: Build scope, stated because a green whose scope is unstated is not readable — which is exactly what went wrong here: with a discriminating control rather than a trusted zero: appending CI would not have caught this. — sent from valiant-pike-161 |
…rged authority rather than hand-resolved
The generated-artifact merge driver refused DESIGN.md, which is what it
is for: git reaches a low-level merge driver only when both sides changed
the path since the merge base, and taking either side there would drop
the other side's authority-derived bytes. It left the ours side in place
with no conflict markers and marked the path unmerged.
dag/gunbc/design_document.dag -- the authority -- auto-merged cleanly. So
the mirror is not a thing to resolve; it is a thing to derive. DESIGN.md
here is main's current file with the 4b unforgeable-construction region
replaced by the merged authority's version of that region, spliced on two
stable anchors present at identical offsets in both files rather than on
line positions.
One check I ran and misread on the way, recorded because the conclusion
matters: comparing the authority's span to the mirror's span reports a
difference, and that difference is CORRECT. The authority stores the text
inside a string literal, so quotes are escaped (\"sole\"); the generated
markdown carries them bare ("sole"). A span equality test between the two
is guaranteed to fail and proves nothing. The real adjudicator is the
drift gate, which regenerates and compares -- so this lands as a
falsifiable claim rather than an asserted one.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Main is red at the regen step and has been since well before this branch. This lands the convergence round that closes it.
What it contains, and nothing else
std_types.rs,v1_compiler_compiler_tests_rust.rs,v1_compiler_emit_rust.rs,v1_compiler_infer.rs,v1_compiler_infer_method.rs,v1_compiler_infer_types.rs,v1_compiler_parse.rs,v1_std_core.rs,compiler_tests.rs. No generated file was hand-edited.v1_interpreter.rs(10),src/v1/stage0/src/bin/infer_semantics_witness.rs(11),src/v1/tests/src/none_undetermined_carrier_refuse_test.rs(1).Those groups are not the same kind of thing, and the distinction is the gate's own.
HAND_MAINTAINED_STAGE0_FILESnamesv1_interpreter.rs, so it is genuinely hand-maintained. The bin and thev1/testscrate are in neither list, because the population is built by walking top-levelstage0/src/*.rsonly — they are not hand-maintained by declaration, they are invisible to the gate.Correction to an earlier revision of this description: it called
compiler_tests.rshand-maintained and counted twenty-three hand-maintained callers.compiler_tests.rsis absent fromHAND_MAINTAINED_STAGE0_FILES, so it sits in the generated population — easy to misread because, unlike its siblings, it carries no generated marker in its opening lines. The committed bytes were always right (byte-identical to this branch's own regen candidate, and independently reproduced by a second worktree's round-two candidate), but the provenance I claimed for them was wrong, and provenance is this PR's entire argument.Build scope, stated up front
A green whose target scope is unstated is not readable — which is exactly what went wrong in the first revision.
Verified with a discriminating control, not trusted as a bare zero: appending
fn __control_must_fail() { let _: i32 = "not an i32"; }toinfer_semantics_witness.rsmakes that same command red, so the green demonstrably compiles that binary. Control reverted. The bin and thev1/testscrate were missed initially because--bin claim_executorand asrc/*.rsgrep that excludessrc/bin/each answered a narrower question — caught by review 54118.The measurement, per round
Round one, from a binary built from the committed mirrors, on a clean checkout with zero edits:
Install the candidate bytes, rebuild, then round two — from a binary built from what round one generated:
And again with current main merged in (
a4677f33f4a, #8552):first_generation_equal=true planned=128 executed=128. So #8552 contributes no drift of its own.The rebuild between rounds is load-bearing. Round one is emitted by a binary built from the very mirrors being replaced, so a first-generation green there proves only that the old mirrors reproduce themselves. Related trap:
--required-regen-fixed-pointdoes not recomputefirst_generation_equal— it reads it from the last--required-regenreceipt, including a failing one. Run the fresh flag first, always.An independent second regen from a separate worktree produced byte-identical output for all of these files, including
compiler_tests.rson its round two.Cause
make_spanexists in no.dagfile in the tree — deleted by ad715ef (#8624) — while the committed mirrors still defined and called it. Every changed line in all nine traces to that single deletion:make_span(...)→no_span(), plus the import-list reflow and rustfmt re-wrapping that follows from dropping the argument. There is no second mechanism in the bytes, which is why this repair is the same regardless of how the drift-count history is read.What the gate cannot see
The deletion also stranded twenty-two call sites outside the generated population, on a constructor that no longer exists. The regen gate compares generated surfaces and answers about generated surfaces, so these are outside its universe — it would report a clean fixed point over a tree that does not compile. The round-two build is what surfaced them, and only at a wide enough target scope.
They are repaired against the generator's own substitution: the regenerated
v1_compiler_compiler_tests_rust.rsnow emitsno_span()for that same site, so the hand edits agree with the producer by construction rather than by my judgment.git grep make_span -- '*.rs'now returns exactly two lines, both prose.One site contradicted #8624's census ("every make_span call site in the corpus passed start: 0, end: 0"): the pre-repair
compiler_tests.rs:2134passedmake_span(0, name.len() as i64). Its regenerated replacement isno_span(), which discards the non-zero end. That substitution is the authority's, not mine, and the affected test (rust_btree_set_ord_eligibility_requires_nominal_carrier_shape) passes — the eligibility predicate reads carrier shape, not span offsets.Worth flagging beyond this PR: nothing models the dependency from an authority's exported surface to its callers, generated or not, and no enrolled CI job compiles a second bin or anything test-profile (
witnesses.ymlbuilds only--bin claim_executor; the Rust suite left CI 2026-07-11, clippy 2026-07-08). So a tree with stranded callers merges green and stays broken silently. Not this PR's to close, but it is why this class recurs.Scope
Deliberately nothing else. The construction-wall subject this was found from is #8670, which is blocked on this landing and carries none of these files.