Skip to content

§5 de-fork Step 1 PR-B: grounded cross-tree admission (delete QN-prefix guess) - #5486

Merged
briansrls merged 3 commits into
mainfrom
s5-pr-b-grounded-cross-tree-admission
Jun 21, 2026
Merged

briansrls merged 3 commits into
mainfrom
s5-pr-b-grounded-cross-tree-admission

Conversation

@gunbai-bot

@gunbai-bot gunbai-bot Bot commented Jun 21, 2026 •

Copy link
Copy Markdown
Contributor

§5 de-fork Step 1 PR-B: grounded cross-tree admission

Activates cross-tree imports on filesystem-truth provenance, replacing the unsound
QualifiedName-prefix source-tree guess. Builds directly on PR-A's host-tagged
DagSourceReadWitness.source_root (#5473). Second and final half of de-fork Step 1.

What lands

  • std/cross_tree/resolution.dag — DELETE the QN-prefix fallback
    (source_root_ref_from_qualified_name, source_root_set_from_module_roots,
    cross_tree_import_is_same_tree, cross_tree_import_admitted_qualified). ADD the grounded
    QualifiedName -> SourceRootRef index (SourceRootIndex, lookup with fail-closed
    Ambiguous
    on a module bound to conflicting trees), tree_fundamentality_order, and the
    per-edge cross_tree_edge_decision.
  • compiler/program_assembly.dag — the assembly fold now pairs each parsed module root's
    QualifiedName with its host source_root tag into the index;
    assemble_program_from_ingest resolves with that grounded index +
    source_root_set_from_ingest as active_roots.
  • compiler/03_name_resolve.dag — admission threads the index (replacing the global
    order scalar). resolve_with_admission stays index-less single-tree;
    resolve_with_admission_grounded is the cross-tree authority. Deletes dead
    module_root_nodes_to_qns.

Design note — fundamentality is a grounded relation, not a global scalar

The plan called for order = MoreFundamental. Implemented as a tree-pair relation
(tree_fundamentality_order: v2→dsl = MoreFundamental admit, dsl→v2 = LessFundamental
deny) rather than a caller-supplied global. A global MoreFundamental fails open on a
dsl→v2.std peer edge (layer direction holds at equal ordinals); deriving the order per pair
closes that inversion (§5). This faithfully encodes the operator's decision (dsl is the
authority v2 builds on) as a single grounded authority.

Why grounding, not the QN-prefix guess (measured)

9 src/v2 files declare non-v2.-prefixed modules (extdeps.shell, bisect.add,
extdeps.fixture.*, test.claim.fold_list_generic_instantiation), so the prefix guess
mis-tagged every one as DslTree — unsound, not merely impure (the documented KNOWN
LIMITATION the old scaffold carried).

Proven by execution (claim_batch)

  • name_resolve_cross_tree_resolution_witnesses green: same-tree dsl/v2 resolve; v2→dsl
    cross-tree resolves
    (denied before grounding); dsl→v2 cross-tree denied fail-closed.
  • Discriminating: the dsl→v2 deny witness uses equal-ordinal (std) layers so the denial
    isolates to fundamentality — perturbing tree_fundamentality_order(Dsl,V2) to
    MoreFundamental flips it to FAIL.
  • Regression-checked green: program_assembly multi-file + ingest-fail-closed, parse-table
    memo, admission fail-closed, malformed root, and PR-A's source_root_tagging witness.
    (resolve_dual_imports_do_not_collide_on_header_metadata is pre-existing red on main —
    the dead TestClaim corpus, not a live test fn; behavior unchanged by this PR.)

🤖 Generated with Claude Code

@gunbai-bot gunbai-bot Bot changed the title Section 5 de-fork manager toward one dsl std authority: STEP 1 FIRST and load-bearing is activate cross-tree import via grounded source_root tagging at ingest, escalate before editing source_authority and 03_name_resolve; only after step 1 lands fan out the eleven collapse and rename PRs each green §5 de-fork Step 1 PR-B: grounded cross-tree admission (delete QN-prefix guess) Jun 21, 2026
@gunbai-bot
gunbai-bot Bot marked this pull request as ready for review June 21, 2026 21:42
No tree change vs c86459a. The reused self-hosted runner resolved the
inconsistent intermediate commit 2c5750a (resolution.dag had the symbol
deleted while 03_name_resolve.dag still called it); HEAD c86459a is clean.
A fresh sha forces actions/checkout to reset the poisoned workspace.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@briansrls
briansrls merged commit 65af086 into main Jun 21, 2026
1 check passed
@briansrls
briansrls deleted the s5-pr-b-grounded-cross-tree-admission branch June 21, 2026 22:42
briansrls pushed a commit that referenced this pull request Jun 22, 2026
…n from host tags (#5506)

The remaining activation gate: prove by execution that the source_root carrier (#5473/#5486)
is CONSUMED on the real grounded compile path, not merely carried. Feeds a host-tagged
SourceRootIngest through the real machinery — program_assembly_fold_ingest builds the
QualifiedName->SourceRootRef index, source_root_set_from_ingest builds the active-root set —
then runs cross_tree_edge_decision (the exact fn admit_import_entry calls). Nothing about
fundamentality is supplied; MoreFundamental/LessFundamental is derived by tree_fundamentality_order.

By execution (gunbc run --claim-run):
- v2-subject (V2Tree) -> dsl-target (DslTree)  => EdgeCrossAdmitted  (true)
- tags reversed: dsl-subject -> v2-target       => EdgeCrossDenied    (true)
Asserts the exact decision variant (not a Bool proxy) so the RED leg cannot pass for a wrong
reason. Flip either source_root tag and the witness goes the wrong way (discriminating oracle).

Verdict: cross-tree import is ACTIVE on current main, grounded on filesystem-truth source-root
tags — the de-fork collapse fan-out is unblocked. Floor-auto-enrolled via _test.dag naming.

Co-authored-by: Brian Searls <briansearls1@gmail.com>
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
briansrls pushed a commit that referenced this pull request Jun 22, 2026
…-forks + 7 grounding cluster) (#5511)

* §5 de-fork audit: re-verdict census by execution — 2 mirrors + 2 not-a-forks + 7 grounding cluster

The dsl↔v2 std fork is not "mostly temp v2 mirrors": by-execution decl-set comm
+ shared-type-body diff shows 2 true mirrors (reducible/measure), 2 pure
name-collisions (coercion/node), and 7 divergent groundings (algebra/logic/nat/
integer/float/effects/verification) — the same concept grounded on a different
axis/realization per tree (e.g. EffectShape: operation-axis in dsl vs
idempotency-class in v2; TestClaim simple-proposition vs grounded coproduct).
The grounding cluster is a single-authority unification DESIGN downstream of the
numeric tower (#5428) + model↔realization grounding, not a mechanical repoint.

Also: §1 updated — cross-tree import is ACTIVATED (#5473/#5486 grounded,
#5506 arbiter witness proves it live, #5504 fixed the abs-vs-rel admission bug);
the former "wired but off" blocker is dissolved. Structured §2 as operator
decision-input per concept (shared / shared-body-divergence / each-side-unique /
grounding-entanglement). DESIGN §6: a stale doc contradicting ground-truth is
parallel-representation debt.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* §5 audit: correct node/coercion to v1-artifact category (DEFER to v1-shrink)

verify-before-act caught a scoping error: importer greps omitted src/v1, and
src/v1 is a live consumer of dsl/std. node + coercion renames are NOT clean-lane
— both cascade into the v1 seed (04_infer inference stage import + emitted Rust
std_{node,coercion}.rs + a guard test). Per bright-stag's ruling, DEFER both to
v1-shrink: on v1-delete node self-dissolves (dead file → delete, no rename) and
coercion shrinks to a v1-free disambiguation (4 extdeps + v2). Census now has
THREE categories: (a) 2 true mirrors, (b) 7 grounding divergences, (c) 2
v1-artifact collisions. Recorded the dissolution trigger.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Brian Searls <briansearls1@gmail.com>
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
briansrls added a commit that referenced this pull request Jul 6, 2026
…d by broken regen); keep source_root_ingest V2Tree fix

The #6289 witness ownership_movable_test.dag emits test_claim_ownership_movable.rs,
which references v1.compiler.ownership symbols (merge_branch_licenses, MoveLicenseAccum,
LiveState, move_site_key, ...) that are NOT in the committed v1_compiler_ownership.rs
seed. Registering it as a GENERATED file therefore breaks the seed crate's compile
(E0432/E0425/E0061) -- 'just register it' cannot land in isolation.

Measured blast radius: the fresh self-compile drifts from the committed seed across
33 files (the known-broken regen, emitter bugs #6298), so pulling in the fresh
v1_compiler_ownership.rs cascades into the whole regen. Not a scoped fix; parked for
the regen project (or exclude the off-auto-path witness from the emit closure).

KEPT: the source_root_ingest_gate_passes main-red fix -- emit_source_root_ingest_manifest
now imports v2.std.cross_tree.import_model { DagTree, V2Tree }. The manifest emitter
hardcodes its import block and missed this when source_root became a grounded
SourceRootRef (#5473/#5486), so every witness importing the manifest failed with
'undefined variable V2Tree'. Verified locally: all 3 real_ingest witnesses + the 2
runnable closure witnesses now return true (were compile errors).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
briansrls added a commit that referenced this pull request Jul 6, 2026
…nert-gate hole #1) (#6311)

* WIP: Fork of realization

* WIP: Fork of realization

* WIP: Fork of realization

* WIP: Fork of realization

* Floor affected-set: non-.dag-only diff is structural-∅, not ignorance (unblock pure-.rs PRs)

floor_diff_edits_from_line_ranges refused (Err) when a diff changed only
non-.dag files (saw_non_dag && !saw_dag) — reddening the discovery-corpus
batch for every pure-.rs PR (seed hand-syncs, Rust-only changes). That
conflated a structural-∅ .dag frontier with an ignorance state.

Per the operator's arity ruling: a successful git-diff observation whose
.dag subset is empty is NOMINAL (present, empty) — the SAME outcome as an
empty diff (every row takes the not-affected skip). The only ignorance
state is a FAILED observation (UnifiedDiffFail, floor_diff_observe.dag),
refused upstream in floor_git_diff_range. This mirrors the function's own
departed-.dag-path arm, which already distinguishes structural-∅ (continue)
from ignorance (refuse).

Fix: drop the saw_non_dag/saw_dag refusal; a non-.dag-only diff falls
through to the empty frontier. Observation layer (Ok/Fail + exit code) and
the shell docs-only shortcut are unchanged (already correct / downstream-
safe). Red control: non_dag_only_diff_is_structural_empty_frontier_not_refusal
(was Err, now Ok empty).

Also fixes the compile error at 32fac2e (auto-commit captured this edit
mid-flight: declarations removed, refusal block not yet dropped).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* WIP: Fork of realization

* Revert roster registration of test_claim_ownership_movable.rs (blocked by broken regen); keep source_root_ingest V2Tree fix

The #6289 witness ownership_movable_test.dag emits test_claim_ownership_movable.rs,
which references v1.compiler.ownership symbols (merge_branch_licenses, MoveLicenseAccum,
LiveState, move_site_key, ...) that are NOT in the committed v1_compiler_ownership.rs
seed. Registering it as a GENERATED file therefore breaks the seed crate's compile
(E0432/E0425/E0061) -- 'just register it' cannot land in isolation.

Measured blast radius: the fresh self-compile drifts from the committed seed across
33 files (the known-broken regen, emitter bugs #6298), so pulling in the fresh
v1_compiler_ownership.rs cascades into the whole regen. Not a scoped fix; parked for
the regen project (or exclude the off-auto-path witness from the emit closure).

KEPT: the source_root_ingest_gate_passes main-red fix -- emit_source_root_ingest_manifest
now imports v2.std.cross_tree.import_model { DagTree, V2Tree }. The manifest emitter
hardcodes its import block and missed this when source_root became a grounded
SourceRootRef (#5473/#5486), so every witness importing the manifest failed with
'undefined variable V2Tree'. Verified locally: all 3 real_ingest witnesses + the 2
runnable closure witnesses now return true (were compile errors).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* Red-control test for source_root_ingest manifest cross_tree import

manifest_imports_grounded_source_root_constructors: asserts the emitted manifest
imports v2.std.cross_tree.import_model whenever it emits a grounded source_root
value -- deleting the import line reddens this test (paired with the CI witness
program_assembly_real_ingest_module_roots_parse_holds as the execution oracle).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* Resolve merge with main #6269 in floor_diff_edits + manifest emitter

The auto-committer flushed the in-progress merge with conflict markers (0b74fe4);
this resolves both:

- floor_diff_edits_from_line_ranges: keep #6269's v1_attribution_index + added_paths
  handling; keep the structural-∅ fix (no saw_non_dag/saw_dag refusal -- a non-.dag-only
  diff is a nominal empty frontier). The two are orthogonal and compose.
- emit_source_root_ingest_manifest: take #6269's emit_source_root_ref_import (derives
  the referenced SourceRootRef constructors from records) over the earlier hardcoded
  both-constructors line -- same source_root_ingest V2Tree fix, more precise form.

Kept both red-control tests; retargeted the structural-∅ test off a src/v1/ path
(which #6269 now eagerly resolves via the real workspace tree, unavailable from the
unit-test cwd) onto a path-agnostic non-.dag path. Both green.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* WIP: regen

* WIP: regen

* Revert inert selective-import filter (ancestry bypasses type_env_for_import)

The type_env_for_import specific_names filter was auto-committed to this PR
but is a no-op: lookup_binding_by_name reads ancestry_str_bindings, which
build_type_env fills from union_parent_type_env_caches (04_infer.dag:5507)
and the single-import path (:133) -- both merge each import's full
parent.type_env_cache, bypassing type_env_for_import (which only feeds the
unused 'parents' field). Measured: dag_collect still resolves un-imported
ErrorNode with the filter built in. Reverting so #6311 does not carry a
fail-closed illusion; the real fix belongs in the ancestry-cache seam.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Brian Searls <briansrls@gunb.ai>
Co-authored-by: Claude Opus 4.8 (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