Repository navigation
SymbolIndex grew a field the one test-module initializer never got, and no gate can see it - #9125
Conversation
…nd no gate can see it
`v1_compiler_infer_env::SymbolIndex` declares `type_head_exposures`.
Every construction site sets it except one: the `SymbolIndex { .. }`
literal in `cli_run.rs`'s `process_resolve_store_tests` fixture. So
`cargo test -p v1-compiler --lib` does not compile -- E0063, missing
field -- and the whole lib test binary is unavailable, including the
hundreds of tests unrelated to the change that broke it.
The value is `rc_empty_map()`, matching `empty_symbol_index()`, which is
what this empty fixture means.
WHY NOTHING CAUGHT IT is the finding worth more than the fix. The Rust
suite was removed from CI 2026-07-11 by operator ruling, for its zero
signal at ~44 minutes. The side effect nobody priced is that the test
build stopped being COMPILED at all. Every required phase -- floor,
regen, parse -- builds the BINARY, and the binary compiles clean; the
break lives entirely inside `#[cfg(test)]`. So the window is silent and
unbounded: nothing measures it, it survives arbitrarily many merges, and
the cost lands on whichever lane next runs a local test and inherits a
break it did not cause. Attributing it took joining four receipts.
I am NOT proposing the gate repair here. `cargo check --tests` would
catch this class in a fraction of the time the 2026-07-11 ruling
objected to, so it is a real proposal rather than a re-litigation -- but
re-adding anything to the required floor is an operator decision and the
floor already has an open re-add queue. Stated as a named finding; the
gate question is being carried separately.
EVIDENCE, both directions, one remote dispatch on a clean checkout of
450b3d3: with the field, `cargo check -p v1-compiler --lib --tests`
finishes and `process_resolve_store_dedupes_repeat_resolve` passes;
removing the same line in the same dispatch returns
`error[E0063]: missing field `type_head_exposures``.
v1 freeze admission: this is a defect repair in the seed under the
2026-08-20 purpose test -- it restores the ability to run v1's own test
suite locally, which the v2 self-host program depends on for every
seed-touching change. It adds no growth surface: one field on one
existing initializer, no new row, no new capability, no semantics moved.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
Taking the approval; one correction to the framing, because acting on it as written would build something we already have. The review reads the meta-concern as "no gate catches missing initializer fields in v1 hand-Rust." That is not the gap. rustc catches missing initializer fields perfectly — E0063 is exactly that check, it is total over struct literals, and it is the reason this defect is a hard compile error rather than a silent wrong value. Nothing needs to be built to detect missing fields. The actual gap is one level up: the test build is never compiled by any required gate. Floor, regen and parse all build the binary, which compiles clean; this break lives entirely inside The distinction decides what the repair is. Under the review's framing you would go looking for a field-completeness lens, which would be a second authority for a judgment the compiler already owns (§3). Under the actual mechanism the repair is Not this PR's job to close either way, and I have deliberately not built it: re-adding to the required floor is an operator decision and the floor has an open re-add queue. Flagging the framing only so the finding does not propagate in the shape that sends someone to write a redundant lens. — sent from sleek-badger-108 |
|
CI is red here and this PR cannot fix it. Recording the mechanism so the red is not mistaken for this diff. The failure
Four witness identities are simultaneously enrolled in Why it is not this diffThis PR's entire change is one line adding a struct field to a Established rather than asserted: both identities I checked are already present in both rosters at this branch's base commit I checked two of the four identities and one roster file per side. That is enough to establish inheritance; it is not a full derivation of the join, and should not be cited as one. The full derived route-gap roster is 110 identities across five chunk functions and spans a Root cause, and it is structural
What I am deliberately not doingNot editing either roster to green this PR. The two dispositions — retire the freeze rows, or drop the identities from the route-gap roster — are not interchangeable: one retires a deferral, the other declares a witness unconsumed, and each records a permanent fact about whether the floor executes those witnesses. Picking one to unblock a one-line change would be resolving someone else's correctness question for my own convenience, and the innocence of this diff is exactly what makes that tempting rather than what makes it acceptable. StatusThe fix is — sent from sleek-badger-108 |
|
Correction to this PR's framing, and it strengthens the case rather than weakening it. My body presents "no gate compiles Credit where it belongs. What follows is the part I can actually add. This is the same struct, breaking again
Same file, same literal, different field, two days apart. What that changes about the disposition
But the recurrence retires one argument that could have been made in good faith after I still make no proposal here. UnchangedThe fix itself stands: one line, Main has been merged in ( — sent from sleek-badger-108 |
The defect
v1_compiler_infer_env::SymbolIndexdeclarestype_head_exposures. Every construction site sets it except one: theSymbolIndex { .. }literal incli_run.rs'sprocess_resolve_store_testsfixture.So
cargo test -p v1-compiler --libdoes not compile on current main —error[E0063]: missing field type_head_exposures— and the entire lib test binary is unavailable, including the ~595 tests unrelated to whatever change introduced the field.The value is
rc_empty_map(), matchingempty_symbol_index(), which is what this empty fixture means. One line.Why nothing caught it — the finding, which is worth more than the fix
The Rust suite was removed from CI on 2026-07-11 by operator ruling, on the grounds that a crate-wide
#![allow(clippy::all)]-style zero signal was not worth ~44 minutes per run. The side effect nobody priced is that the test build stopped being compiled at all.Every required phase — floor, regen, parse — builds the binary, and the binary compiles clean. The break lives entirely inside
#[cfg(test)], so it is invisible to every required gate by construction, not by accident.That makes the window silent and unbounded: nothing measures it, so it persists across arbitrarily many merges, and the cost lands on whichever lane next runs a local test and inherits a break it did not cause. I hit it merging main into an unrelated PR and first read it as my own merge reverting someone else's work; establishing it was main's took joining four receipts (byte-identical
cli_run.rsagainstorigin/main, the mismatch present at two separate commits bygit show, my own diff confined to one unrelated file, and the production build passing while the test build failed).What this PR deliberately does not do
It does not repair the gate.
cargo check --testswould catch this whole class in a fraction of the time the 2026-07-11 ruling objected to, so that is a genuine proposal rather than a re-litigation of the ruling — but re-adding anything to the required floor is an operator decision, and the floor is mid-rung-drop with an open re-add queue. Recorded here as a named finding; the gate question is being carried to the operator separately. Not built speculatively.Evidence — both directions, one remote dispatch, clean checkout of
450b3d3e2ecargo check -p v1-compiler --lib --tests→Finished;process_resolve_store_dedupes_repeat_resolve→okerror[E0063]: missing field `type_head_exposures`The control is what makes this more than "it builds on my machine": the RED is reproduced on demand from the fixed tree.
v1 freeze admission
Argued, not assumed. This is a defect repair in the seed under the 2026-08-20 purpose test ("anything in support of v2 self host is safe"): it restores the ability to run v1's own test suite locally, which the self-host program depends on for every seed-touching change.
cli_run.rsis onHAND_MAINTAINED_STAGE0_FILES, so editing the file directly is the sanctioned route rather than an emitter bypass. It adds no growth surface — one field on one existing initializer, no new row, no new capability, no semantics moved.