Skip to content

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

Closed
briansrls wants to merge 5 commits into
mainfrom
session/smart-crane-257

Conversation

@briansrls

@briansrls briansrls commented Aug 27, 2026 •

Copy link
Copy Markdown
Contributor

What this is

A re-derivation of #9075's owner_module_path threading onto current main. Not a merge: FuncSigResolved gained sites and 04_lookup was 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.dag hoists DeclaredCallableIdentity { owner_module_path, decl_name } and splits CallableIdentity into DeclaredCallable | BuiltinCallable, so the resolved arm cannot carry a builtin — FuncSigResolved { sig, declared } has no spelling in which the owner is absent. CallableCandidate.is_builtin is 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.dag adds CallTargetIdentity = RuntimePrimitiveCall | SourceDeclarationCall | CallableTargetUndetermined, carried on CallSemantics.
  • 04_lookup.dag selects the target beside the existing projection query; a DivergentProjection row stays a source declaration rather than collapsing to a primitive.
  • 05_emit_rust.dag consumes it. The callee lookup is keyed on owner.decl instead of the leaf spelling, and the seam refuses rather than guessing: CallableTargetUndetermined emits a located error, as does a runtime target that lost its bridge identity.

std.primitive_projection gains 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.

  • 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.
  • Four wider-corpus sites (5 diagnostics) needed authored imports — exactly the thinner-coverage region predicted below.

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:

file added
gunbc/host_effect_realize.dag list_map from v2.std.algebra
test/claim/serving_privilege_derivation_witness_test.dag Empty, length from v2.std.algebra
gunbc/roadmap_style.dag List, String, Int, Bool from std.types
gunbc/roadmap_sandbox.dag roadmap_css, workspace_band_paints
gunbc/spark/bootstrap_provision.dag List, String, Int, NonEmptyStr from std.types
test/claim/spark_bootstrap_provision_witness_test.dag six names, incl. the match scrutinee

Two 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.

  1. Predicted roadmap_style's missing List import caused missing kernel container profile: workspace_band_paints. It survived the repair. Real root: roadmap_sandbox.dag never imports workspace_band_paints.
  2. Predicted bootstrap_provision's missing std.types caused the Primitive() receiver. It survived. Real root: the witness never imports the match scrutinee spark_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 returned true for 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

List resolves 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 authority roadmap_style was 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' in extdeps/filesystem/filesystem_io.dag. These are pre-existing and are not closed by this change. They became visible only because the compile reached emit for 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 in src/v1/05_emit.dag, which is not in this diff.

Brian Searls and others added 3 commits August 27, 2026 03:20
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
@gunbai-bot
gunbai-bot Bot marked this pull request as ready for review August 27, 2026 05:17

Copy link
Copy Markdown
Contributor Author

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:

  • dag/gunbc/host_effect_realize.dag:2681:51 — no field verdict on type U
  • dag/test/claim/serving_privilege_derivation_witness_test.dag:137:189 — undefined variable Empty
  • dag/test/claim/spark_bootstrap_provision_witness_test.dag:564 — two unresolved .length method calls on Primitive()
  • synthetic kernel profile workspace_band_paints missing

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>
@briansrls briansrls closed this Aug 27, 2026
gunbai-bot Bot pushed a commit that referenced this pull request Aug 28, 2026
…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
briansrls pushed a commit that referenced this pull request Aug 28, 2026
…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>
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