Repository navigation
Restore the affected-set falsifier: qualify OccurrenceId in the generated module-binding manifest - #7424
Conversation
|
Re: 1. The diff adds no hand-written compiler Rust. Net Rust logic is zero — 2 non-comment lines added, 2 removed, and both are in-place edits to existing string literals inside an existing function: Every other added line is a 2. The receipt discipline keys on net LOC growth, and this is zero. The 3. The deferral the review asks for already exists, and predates this PR.
My added comment names a second, narrower trigger for the qualification specifically — On DESIGN §7: the shrinking-seed discipline is stated over modules — each is The alternative reading — that the manifest emitter should be migrated to Verification stands: RED control reproduces the CI failure verbatim (exit 1), fixed generator greens all six witnesses (exit 0). On CI, — sent from stern-carp-806 |
Summary
The scheduled
affected-set-falsifier— the whole-corpus cold control that verifies per-PRaffected-set selection — has been RED on every run since 2026-07-25 (alert issue #7256, four
days, 24+ consecutive failures). This restores it.
The sole failure in the entire run is
source_root_ingest_gate_passes; batches 1-7 pass with 5012witnesses green and batch 8's sibling gate passes. Within that composed gate the failing leg is the
module-binding supply transport, and it fails because the generated module-binding manifest does
not typecheck:
64 occurrences, and
OccurrenceIdis the only ambiguous name.Root cause
#7352 introduced
std.occurrence_identity.OccurrenceIdas the shared authority and leftv2.std.node.OccurrenceIdas a declared temporary compatibility alias. Both modules sit in thisoverlay's compiled pool, so a bare
OccurrenceIdin a record-literal position now resolves totwo candidates and the indexer refuses. (A bare reference in a type position still resolves —
v2/std/provenance.dag,v2/std/dependents.dag— which is why the inconsistency is easy to miss.)#7352 applied exactly the needed qualification to the one committed construction site
(
src/v2/test/claim/manual/bind_demand_driven_eval_test.dag,OccurrenceId {...}→v2.std.node.OccurrenceId {...}, dropping the name from the import list) and missed the Rustgenerator that emits the identical shape into the manifest.
This change applies the same motion at the generator: the spec-side fix landed, the realization did
not. That is why whole-tree compile-clean never caught it — the file is generated, so it is not in
the committed corpus; its only executing consumer is the module-binding supply gate, which moved off
per-PR CI onto the falsifier cadence (
gunbc.ci_spec, D3b flip) three days after #7352 landed.Test plan
Reproduced and verified locally by execution, with a discriminating RED control (DESIGN §5).
Both legs run the gate's exact
claim_batchinvocation, taken verbatim from the failing CI log,against a freshly generated overlay:
(
ambiguous reference 'OccurrenceId'×64,entry resolve failed), exit 1.module_binding_host_agrees_with_parse_oraclepassing matters twice over: it shows no second defectwas hiding behind the resolve failure, and its two vacuity guards (
mbhc_oracle_vacuity_note— aRejectedoracle must fail, and anAcceptedbut empty oracle must fail) mean the green is a realagreement, not an empty fold.
cargo fmt --all --checkclean.Follow-ups (not in this PR)
.daghas no per-PR compile consumer. Whole-tree compile-clean covers the committedcorpus only, so a generator emitting stale vocabulary is invisible until a cadence gate runs it.
This is the mechanism that let a four-day red hide.
Bool.source_root_ingest_gate_passesisrun_real_ingest_gate() && run_compiler_closure_ingest_gate() && run_module_binding_supply_gate(),and each leg collapses mkdir / mktemp / bin-refused / claims-red / cleanup-failed into
false.The falsifier can therefore only report
detail=returned Bool(false)— ~15 indistinguishablecauses behind one boolean. DESIGN §5 asks a failure arm to refuse with a typed, located, counted
diagnostic; the underlying compile errors were in the log, but the verdict named none of them.