Repository navigation
Re-derive #9075's owner_module_path threading onto CURRENT main: FuncSigResolved gained sites and 04_lookup was rewritten 23->262 lines, so this is a re-derivation not a merge (original lane idle 2 days) - #9400
Conversation
A call's target was decided twice. Inference resolved the callee with the module's imports in hand; 05_emit_rust then re-decided it from the authored LEAF SPELLING -- map_contains_key(rt_functions(), func) -- at a grain where those imports no longer exist. An explicitly imported v2 declaration whose name collides with a v1_rt bridge name was emitted as the unrelated primitive. That is DESIGN's authority-substitution class: resolution held the answer and a second mechanism answered for it. FuncSigResolved now binds the signature AND the declaration it came from, and v1.std.core CallTargetIdentity records what was chosen on the call node. Emission reads it. The three re-lookup seams are gone -- plain calls, the generic-method bridge, and callable-field selection. Two supporting facts fall out of touching this territory and are stated rather than bundled silently. CallableCandidate's is_builtin Bool is deleted: the identity variant already carries it and nothing consulted the Bool once the decision read the variant. ExprCall is cross-referencing data, so call-initialized product data routes to the typed-expression emitter instead of the literal/mock path. Parent function environments become import-aware. This is here because the change does not build without it, not as a bundled cleanup: once a call's target is the exact declaration resolution chose, a WRONGLY chosen declaration reaches rustc rather than being accidentally corrected by a leaf-spelling re-lookup. Three such bindings existed on main, each a name its own module never imports -- dag_collect_support's to_string, and infer's map_has twice. With the emit repair alone the seed fails to compile with exactly those three errors; with the narrowing it builds, and all three resolve to the generically-typed builtin, which is the correct callee. Those three are the measured population of the narrowing's EXERCISED consumers; they are not a corpus census, which regen coverage cannot establish. Evidence: claim_executor --required-regen first_generation_equal=true, planned/executed 136/136, one pre-existing declared divergence (main.rs). All final mirrors produced by the fixed .dag pipeline. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
# Conflicts: # src/v1/stage0/src/std_types.rs # src/v1/stage0/src/v1_compiler_emit_rust.rs
# Conflicts: # src/v1/05_emit_rust.dag # src/v1/stage0/src/v1_compiler_emit_rust.rs # src/v1/stage0/src/v1_compiler_trait_derive_emit.rs
|
DO NOT MERGE — the latest executed synthetic merge subject is terminal red, and the failure is semantic rather than the separate cost-carrier issue. Run 33041403696 tested head f8d7297 merged into base 6635135. Required build/floor/witnesses all concluded failure. The base PR's own exact run was green; this subject newly refuses with:
This is consistent with the PR's own survivorship-bias warning: owner-identity consumption has exposed harder latent mis-bindings outside the three regen-exercised seed sites. The three seed sites remaining terminal-green is valid evidence, but it is no longer sufficient evidence that this exact merged subject is ready. Current main has since advanced again, so no green execution exists for the current merge subject either. Fix forward in this atomic change; do not restore leaf-spelling fallback and do not rerun the unchanged failed subject. |
… removed the leaf-spelling re-lookup that was supplying them by parent-pool coincidence Six files call or reference names they never import. Until this branch, a leaf-spelling re-lookup at emission found them anyway in a parent pool they had no declared claim on. Owner-qualified emission does not create these defects; it removes the mask, and the resolver then reports each one. Every site reaches terminal green on the acceptance ladder. None is left at state 3 -- a change that merely converted the type disagreements into unresolved names would have removed masking without completing the migration. Three seed sites reached terminal green automatically: the Unresolved arm routes to the generic builtin and had been unreachable, because the coincidence-admitted declaration short-circuited ahead of it. The four wider-corpus sites repaired here needed authored imports. All six edits are additive import lines. No semantic edits. Verified: whole-corpus compile (3026 sources, 1057 indexed modules), which reproduces the floor's subject -- per-entry compile is a different subject with a greener answer, and an earlier pass was misled by it. required-regen first_generation_equal=true, 136/136, declared_divergent=1 [main.rs]. toolchain_home_interference_probe_wet exits 0 under a bound RUNNER_TEMP and 1 without it, on identical code, so its local red is environmental. Not closed here: five pre-existing 'file' transport emission diagnostics in extdeps/filesystem/filesystem_io.dag, visible only because the compile reached emit for the first time. That file is untouched and the message lives in src/v1/05_emit.dag, not in this diff. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…shrinks The namespace-wave-admission phase fails on every PR with a current merge base, reporting 53 stale admissions. None of them names anything those PRs touch. It is blocking at least #9447, #9512 and #9531, and it will block every PR from here. THE MECHANISM, and the roster's own contract already prescribed the fix. The 53 rows admit exact binding deltas from #9400's owner-qualified call-target cut. Once #9436 merged, any branch with a current merge base carries that cut on BOTH sides, so the admitted deltas no longer occur, so every row matches nothing and reports stale. The comment above the const already said what to do: "this temporary transition roster must shrink with its subject." This is that shrink. MEASURED BEFORE PRUNING, because a partial roster would have made a blanket delete wrong: 53 rows authored, 53 reported stale, 0 unadjudicated deltas. Not a subset -- no row was still carrying a live admission. (My first count said 54 and was wrong: the looser pattern also matched the struct definition line. The numbering runs 01-54 with 19 already pruned earlier by this same rule.) cargo test -p v1-compiler --test namespace_wave_admission -> 32 passed, 0 failed WHAT THIS DOES NOT FIX, AND IT IS THE MORE IMPORTANT HALF. Staleness is computed only inside WaveAdmissionOutcome::Adjudicated. On main the baseline resolves to the head, the outcome is NoSubject, and no WaveAdmissionReport is built at all -- so a spent roster is structurally invisible on the one branch everyone reads as the health signal, and its cost lands on whoever opens the next unrelated PR instead of on the wave's own author. That is exactly how these 53 came to block other lanes. Nothing will surface the NEXT post-wave roster either. I am not repairing that here. Where the staleness check belongs is a design question -- making a wall fire on main is not a change to smuggle in beside an unblocking prune -- and it is recorded at the carrier and reported as a gap in the instrument. Found by sharp-ram-84, who declined to prune it themselves because namespace_wave_admission.rs is the instrument deciding their own PR's admissibility. That was the right call: a PR that edits its own gate to go green is the shape we spent today refusing. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013crMNyLvjKC2Q5UF851PKy
…s are refusing every PR (#9541) The wave-admission phase is red on every open pull request in the repository, and the cause is the roster doing exactly what its own rule says it should. WHAT IS HAPPENING. NAMESPACE_TRANSITION_ADMISSIONS carried 53 exact admissions for the owner-qualified call-target cut. That subject has landed (#9436, #9504); #9400 itself closed unmerged and no successor is open. So every row matches no delta, and `stale_admissions` reports all 53. WHY IT REACHES UNRELATED WORK, which is the part that makes this a fix rather than housekeeping. Staleness is computed PER RUN: a row is stale unless some delta in THAT RUN matches it. A pull_request build adjudicates the MERGE commit, so once the rows were on main every open PR inherited all 53 -- and a PR touching no namespace at all is precisely the case that can never match them. Measured: three of my own branches, none of which touches srv3, admissions, waves or namespaces, each report the identical 53. THIS IS THE ROSTER'S OWN DECLARED LIFECYCLE, not a reinterpretation of it. The const's doc comment: "A row that no longer matches is itself a finding (`stale_admissions`), so this temporary transition roster must shrink with its subject." And gunbc.namespace_wave_admission's seed-growth justification: "stale rows refuse, so the roster has its own deletion trigger: any absorbed or vanished delta makes required CI red until that row is removed ... it dissolves row-by-row with the transition it names." EMPTY IS THE RESTING STATE AND IS NOT PERMISSIVE, which is why shrinking is safe. With no rows, a run carrying no delta reports nothing and passes; a run carrying a real delta reports it as UNADJUDICATED and refuses. So the failure mode of having shrunk too early is a LOUD refusal naming the delta, closed by authoring a row -- never a silent admission. The next transition adds its rows here and removes them when its subject lands. The const declaration itself is retained, not deleted: gunbc.seed_growth enumerates it by name at declaration grain. 32 tests in tests/namespace_wave_admission.rs pass; none asserts on the roster's contents (both arms build their admissions in a `let`). Co-authored-by: gunbc-ci-auto-heal <gunbc-ci-auto-heal@users.noreply.github.com> Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
What this is
A re-derivation of #9075's
owner_module_paththreading onto current main. Not a merge:FuncSigResolvedgained sites and04_lookupwas rewritten 23 → 262 lines since that lane went idle, so the spine was rebuilt against the resolver as it stands rather than replayed.The spine
Resolve once, record the identity, consume it at emission.
04_sigs.daghoistsDeclaredCallableIdentity { owner_module_path, decl_name }and splitsCallableIdentityintoDeclaredCallable | BuiltinCallable, so the resolved arm cannot carry a builtin —FuncSigResolved { sig, declared }has no spelling in which the owner is absent.CallableCandidate.is_builtinis deleted: once the decision reads the variant, the flag had zero readers, and two representations of one fact is the §3 violation this change exists to remove.00_core.dagaddsCallTargetIdentity = RuntimePrimitiveCall | SourceDeclarationCall | CallableTargetUndetermined, carried onCallSemantics.04_lookup.dagselects the target beside the existing projection query; aDivergentProjectionrow stays a source declaration rather than collapsing to a primitive.05_emit_rust.dagconsumes it. The callee lookup is keyed onowner.declinstead of the leaf spelling, and the seam refuses rather than guessing:CallableTargetUndeterminedemits a located error, as does a runtime target that lost its bridge identity.std.primitive_projectiongains one prefix authority; the runtime name is derived from the slug, not stored beside it.Why the scope is wider than the brief
The brief scoped (1) owner threading and (2) emit consumption. (3) import-aware parent environments was expected to be separable. It is not, and the measurement is what says so: with 1+2 present and 3 absent, the regenerated seed fails to compile with three
E0308s. The RED for (3) does not exist until 1+2 lands, so splitting produces a PR whose evidence cannot exist in its own tree.Per the operator ruling, the atomic unit is owner-qualified emission + strict/import-aware resolution + correctly typed replacement bindings. This PR is that unit.
The four-state ladder, and where each site landed
Against the acceptance ladder — old emitter masks a wrong resolver result (RED) → new emitter preserves the exact resolver result (GREEN) → strict resolver leaves a coincidence-only name absent (EXPECTED INTERMEDIATE REFUSAL) → fixed source resolves to the intended typed declaration (TERMINAL GREEN):
Every site reaches terminal green. None is left at state 3. A change that merely converted the type disagreements into unresolved names would have removed masking without completing the migration; that is not what this is.
Unresolvedarm routes to the generic builtin and had been unreachable, because the coincidence-admitted declaration short-circuited ahead of it.Every defect is one class
A name used but never imported, previously supplied by parent-pool coincidence. Owner-qualified emission does not create these; it removes a leaf-spelling re-lookup that was masking them.
Repairs, all additive import lines, no semantic edits:
gunbc/host_effect_realize.daglist_mapfromv2.std.algebratest/claim/serving_privilege_derivation_witness_test.dagEmpty, lengthfromv2.std.algebragunbc/roadmap_style.dagList, String, Int, Boolfromstd.typesgunbc/roadmap_sandbox.dagroadmap_css, workspace_band_paintsgunbc/spark/bootstrap_provision.dagList, String, Int, NonEmptyStrfromstd.typestest/claim/spark_bootstrap_provision_witness_test.dagTwo self-falsifications, kept because they are the method
I predicted a root cause twice and was wrong twice, and found out by compiling rather than by pushing.
roadmap_style's missingListimport causedmissing kernel container profile: workspace_band_paints. It survived the repair. Real root:roadmap_sandbox.dagnever importsworkspace_band_paints.bootstrap_provision's missingstd.typescaused thePrimitive()receiver. It survived. Real root: the witness never imports the match scrutineespark_effective_access_standing.Both misdiagnoses have one shape: I stopped at the first plausible unimported name near the error rather than the one the failing expression actually reaches. A synthetic diagnostic names no file, so proximity in the log is not evidence about the cause.
Instrument correction
An earlier pass used per-entry
gunbc run, which returnedtruefor a witness the floor refused. Per-entry compile is a different subject with a greener answer. Everything above is measured by whole-corpus compile (3026 sources, 1057 indexed modules), which reproduces the floor's subject.Do not read the uniformity claim as a generalization
There is a survivorship effect in the sites that surfaced: they are the subset of unimported-name defects that happened to trip a downstream type demand. Five of the six names I authored produced no diagnostic at all. So these are not a sample of the class — they are its visible tail, and the class is larger than this PR measures. I am not claiming otherwise, and this PR does not widen to chase it.
Reported, deliberately not fixed here
Listresolves against two authorities. That is a §3 violation and it is not this PR's to repair; it is reported to the owning lane and sequenced there. The receipt for which authorityroadmap_stylewas reaching is in the thread. Widening this PR to fix it would fuse two changes with different roots.Not claimed
The whole-corpus compile reports 5 remaining emit-stage diagnostics, all
'file' transport emission is not modeled ... for target 'dag'inextdeps/filesystem/filesystem_io.dag. These are pre-existing and are not closed by this change. They became visible only because the compile reachedemitfor the first time — previously it refused before emitting and truncated the diagnostic set, so a masked run and a clean run rendered identically. That file is touched 0 times here and the message lives insrc/v1/05_emit.dag, which is not in this diff.