Skip to content
4 changes: 2 additions & 2 deletions dag/test/claim/ci_compile_jobs_witness_test.dag
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,9 @@ import gunbc.ci_compile_jobs {
}
import extdeps.cargo_build { cargo_nextest_build_jobs_flag, cargo_build_jobs_flag }
import tools.rust_gates_ci { rust_gate_build_jobs_args }
import v2.std.live_tree { LiveTreeDisposition, SubstrateInputsOnly }
import v2.std.live_tree { LiveTreeDisposition, ReadsLiveTree }

data live_tree_disposition: LiveTreeDisposition = SubstrateInputsOnly
data live_tree_disposition: LiveTreeDisposition = ReadsLiveTree

fn join_space(xs: List<String>) -> String {
fold(xs, init: "", f: (acc, p) => if acc == "" { p } else { concat(concat(acc, " "), p) })
Expand Down
4 changes: 2 additions & 2 deletions dag/test/claim/commit_workflow_witness_test.dag
Original file line number Diff line number Diff line change
Expand Up @@ -24,9 +24,9 @@ import gunbc.local_tidy_spec { local_tidy_checks }
import gunbc.generated_artifact {
CiYamlArtifact, GithooksPrePushArtifact, artifact_path
}
import v2.std.live_tree { LiveTreeDisposition, SubstrateInputsOnly }
import v2.std.live_tree { LiveTreeDisposition, ReadsLiveTree }

data live_tree_disposition: LiveTreeDisposition = SubstrateInputsOnly
data live_tree_disposition: LiveTreeDisposition = ReadsLiveTree

fn witness_ci_spec_projects_from_roster() -> Bool {
gate_lists_eq(left: gunbc_ci_floor_gates, right: commit_workflow_ci_floor_gates)
Expand Down
4 changes: 2 additions & 2 deletions dag/test/claim/dag_compile_clean_scope_witness_test.dag
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,9 @@ import tools.dag_compile_clean_scope {
witness_entry_root_is_first_witness_layer_root,
witness_pool_roots_match_witness_layer_roots
}
import v2.std.live_tree { LiveTreeDisposition, SubstrateInputsOnly }
import v2.std.live_tree { LiveTreeDisposition, ReadsLiveTree }

data live_tree_disposition: LiveTreeDisposition = SubstrateInputsOnly
data live_tree_disposition: LiveTreeDisposition = ReadsLiveTree

test fn dag_compile_clean_scope_empty_touched_skips_holds() -> Bool {
witness_empty_touched_skips()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,9 @@ import tools.dag_compile_clean_shard_totality {
witness_totality_fails_closed_on_glob_failure,
witness_totality_green_when_glob_matches_roster
}
import v2.std.live_tree { LiveTreeDisposition, SubstrateInputsOnly }
import v2.std.live_tree { LiveTreeDisposition, ReadsLiveTree }

data live_tree_disposition: LiveTreeDisposition = SubstrateInputsOnly
data live_tree_disposition: LiveTreeDisposition = ReadsLiveTree

test fn compile_clean_shard_roster_is_well_formed() -> Bool {
compile_clean_shard_roster_nonempty()
Expand Down
4 changes: 2 additions & 2 deletions dag/test/claim/generated_artifact_drift_test.dag
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,9 @@ import gunbc.os_install { srv3_autoinstall_spec, fleet_autoinstall_specs, srv3_i
import gunbc.gitignore_emit { path_is_ignored }
import gunbc.plan_registry { all_plans }
import gunbc.plans.idea_machine { idea_machine_plan }
import v2.std.live_tree { LiveTreeDisposition, SubstrateInputsOnly }
import v2.std.live_tree { LiveTreeDisposition, ReadsLiveTree }

data live_tree_disposition: LiveTreeDisposition = SubstrateInputsOnly
data live_tree_disposition: LiveTreeDisposition = ReadsLiveTree

data perturb: String = "\n# gunbc-generated-artifact-drift-receipt-perturb"

Expand Down
4 changes: 2 additions & 2 deletions dag/test/claim/githooks_pre_push_emit_test.dag
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,9 @@ import gunbc.local_tidy_spec {
doc_reachability_trigger_globs, generated_artifact_trigger_globs, cargo_fmt_trigger_globs
}
import extdeps.git.hooks { pre_push_zero_sha, pre_push_stdin_read_vars }
import v2.std.live_tree { LiveTreeDisposition, SubstrateInputsOnly }
import v2.std.live_tree { LiveTreeDisposition, ReadsLiveTree }

data live_tree_disposition: LiveTreeDisposition = SubstrateInputsOnly
data live_tree_disposition: LiveTreeDisposition = ReadsLiveTree

fn has(s: String, p: String) -> Bool {
string_contains(s: s, pattern: p)
Expand Down
4 changes: 2 additions & 2 deletions dag/test/claim/lever_a_local_receipt_witness_test.dag
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
module test.claim.lever_a_local_receipt_witness

import tools.dag_compile_clean_scope { lever_a_local_receipts_hold }
import v2.std.live_tree { LiveTreeDisposition, SubstrateInputsOnly }
import v2.std.live_tree { LiveTreeDisposition, ReadsLiveTree }

data live_tree_disposition: LiveTreeDisposition = SubstrateInputsOnly
data live_tree_disposition: LiveTreeDisposition = ReadsLiveTree

test fn lever_a_local_receipts_hold() -> Bool {
lever_a_local_receipts_hold()
Expand Down
4 changes: 2 additions & 2 deletions dag/test/claim/rust_gates_ci_witness_test.dag
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
module test.claim.rust_gates_ci_witness

import tools.rust_gates_ci { gate_diag, rust_gate_reason }
import v2.std.live_tree { LiveTreeDisposition, SubstrateInputsOnly }
import v2.std.live_tree { LiveTreeDisposition, ReadsLiveTree }

data live_tree_disposition: LiveTreeDisposition = SubstrateInputsOnly
data live_tree_disposition: LiveTreeDisposition = ReadsLiveTree

fn w_diag_names_check() -> Bool {
string_contains(
Expand Down
4 changes: 2 additions & 2 deletions dag/test/claim/rust_stage0_gates_witness_test.dag
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,9 @@ import tools.rust_stage0_gates {
witness_empty_paths_gates_when_substrate_ready,
witness_declared_unit_unaffected_by_other_dag_when_substrate_ready
}
import v2.std.live_tree { LiveTreeDisposition, SubstrateInputsOnly }
import v2.std.live_tree { LiveTreeDisposition, ReadsLiveTree }

data live_tree_disposition: LiveTreeDisposition = SubstrateInputsOnly
data live_tree_disposition: LiveTreeDisposition = ReadsLiveTree

fn w_rs_selects() -> Bool { path_is_rust_monolith(path: "src/v1/stage0/src/lib.rs") }
fn w_cargo_toml_selects() -> Bool { path_is_rust_monolith(path: "src/v1/stage0/Cargo.toml") }
Expand Down
82 changes: 81 additions & 1 deletion src/v1/stage0/src/cli_run.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2242,6 +2242,18 @@ const LIVE_READ_CARRIER_HOME_MODULES_V0: &[&str] = &[
/// (an extra witness run) but never under-report (a missed run). It does not attempt to
/// prove which touched path a reached carrier actually reads at runtime (that precision is
/// G2/G3's job) — reachability plus any touch is treated as a hit.
fn import_closure_module_reaches_carrier_home(
closure_modules: &HashSet<String>,
carrier_home: &str,
) -> bool {
closure_modules.iter().any(|module| {
module == carrier_home
|| module
.strip_prefix(carrier_home)
.is_some_and(|suffix| suffix.starts_with('.'))
})
}

fn runtime_data_dependency_touched_via_carrier_closure(
entry_path: &str,
facts: &ModuleGraphFactsLive,
Expand All @@ -2254,7 +2266,9 @@ fn runtime_data_dependency_touched_via_carrier_closure(
collect_import_closure_module_names_from_facts(entry_path, facts, &mut closure_modules);
LIVE_READ_CARRIER_HOME_MODULES_V0
.iter()
.any(|carrier_module| closure_modules.contains(*carrier_module))
.any(|carrier_home| {
import_closure_module_reaches_carrier_home(&closure_modules, carrier_home)
})
}

#[cfg(test)]
Expand Down Expand Up @@ -9853,6 +9867,72 @@ new file mode 100644
);
}

#[test]
fn import_closure_carrier_home_matches_submodules() {
use std::collections::HashSet;

let carrier = "v2.compiler.self_host";
let mut exact = HashSet::from([carrier.to_string()]);
assert!(super::import_closure_module_reaches_carrier_home(
&exact, carrier
));
let mut submodule = HashSet::from(["v2.compiler.self_host.frontier".to_string()]);
assert!(super::import_closure_module_reaches_carrier_home(
&submodule, carrier
));
let mut homonym = HashSet::from(["v2.compiler.self_hostile".to_string()]);
assert!(!super::import_closure_module_reaches_carrier_home(
&homonym, carrier
));
}

#[test]
fn lying_substrate_inputs_only_stamp_census() {
use std::collections::HashSet;

let ws = workspace_root();
std::env::set_current_dir(&ws).expect("chdir workspace");
let roots = vec![
ws.join("src/v2").to_string_lossy().into_owned(),
ws.join("dag").to_string_lossy().into_owned(),
];
let facts = super::build_module_graph_facts_live(&roots);
let mut lying: Vec<(String, String)> = Vec::new();
for (rel, content) in super::corpus_dag_files() {
if !super::is_test_dag(&rel) {
continue;
}
let Ok(reads_live_tree) = super::parse_entry_live_tree_disposition(&rel, &content)
else {
continue;
};
if reads_live_tree {
continue;
}
let mut closure_modules = HashSet::new();
super::collect_import_closure_module_names_from_facts(
&rel,
&facts,
&mut closure_modules,
);
for carrier in super::LIVE_READ_CARRIER_HOME_MODULES_V0 {
if super::import_closure_module_reaches_carrier_home(&closure_modules, carrier) {
lying.push((rel.clone(), (*carrier).to_string()));
break;
}
}
}
lying.sort();
eprintln!("lying SubstrateInputsOnly stamps (G1 carrier closure): {}", lying.len());
for (entry, carrier) in &lying {
eprintln!(" {entry} -> {carrier}");
}
assert!(
lying.is_empty(),
"lying SubstrateInputsOnly stamps must be re-stamped ReadsLiveTree before merge"
);
}

#[test]
fn node_precise_same_file_referenced_vs_orphan_discriminates() {
let ws = workspace_root();
Expand Down
4 changes: 2 additions & 2 deletions src/v2/lens/disposition_redundancy_test.dag
Original file line number Diff line number Diff line change
Expand Up @@ -38,9 +38,9 @@ import tools.rust_stage0_gates {
import v2.std.collection { List }
import v2.std.algebra { length }
import v2.std.logic { Bool }
import v2.std.live_tree { LiveTreeDisposition, SubstrateInputsOnly }
import v2.std.live_tree { LiveTreeDisposition, ReadsLiveTree }

data live_tree_disposition: LiveTreeDisposition = SubstrateInputsOnly
data live_tree_disposition: LiveTreeDisposition = ReadsLiveTree

data redundancy_present_successor_locator: DeclarationRef = DeclarationRef {
module_path: "std.disposition",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@ module v2.test.claim.complexity.accumulator_copy_roster_gate_lean_bash

import v2.lens.complexity_accumulator_copy.roster_gate { file_gate }
import v2.std.logic { Bool }
import v2.std.live_tree { LiveTreeDisposition, SubstrateInputsOnly }
import v2.std.live_tree { LiveTreeDisposition, ReadsLiveTree }

data live_tree_disposition: LiveTreeDisposition = SubstrateInputsOnly
data live_tree_disposition: LiveTreeDisposition = ReadsLiveTree

test fn roster_lean_zero_suspects_within_ratchet() -> Bool {
file_gate(path: "src/v2/extdeps/languages/lean.dag", refusal_ceiling: 1)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,9 @@ module v2.test.claim.complexity.accumulator_copy_roster_gate_std
import v2.lens.complexity_accumulator_copy.roster_gate { file_gate }
import v2.std.logic { Bool }
import v2.std.text { String }
import v2.std.live_tree { LiveTreeDisposition, SubstrateInputsOnly }
import v2.std.live_tree { LiveTreeDisposition, ReadsLiveTree }

data live_tree_disposition: LiveTreeDisposition = SubstrateInputsOnly
data live_tree_disposition: LiveTreeDisposition = ReadsLiveTree

data std_tranche_offline_roster_note: String = "Enrollment plan (operator ruling 2026-07-10, echoed eager-ram-612 #6452 guidance): CI-enrolled = cheap discriminating units only — dag/test/claim behavioral keystones selected by affected-set discovery when dag/std/ changes (markdown_inline_render_keystone_holds, config_record_emit_keystone_holds / serialize_fields_doc, reconcile_share_collapse_witnesses for realization.dag, std_graph_build_adjacency_views_evaluates for graph.dag). OFFLINE = this roster gate module (file_gate serial resolve per path; discovery exclusion row claim/complexity/accumulator_copy_roster_gate lands via #6452 — NOT duplicated on this branch; NOT in witness_discovery_scan_dirs; NOT in commit_gate_roster). Wet recipe on v2.lens.complexity_accumulator_copy.roster_gate.offline_roster_gate_claim_batch_recipe. List-carrier concat(acc,[x]) folds rewritten to prepend+reverse in markdown.dag, markdown_markup.dag, serialize.dag, realization.dag, materialization_ladder.dag; change.dag keyed_collect_keys + keyed_invert_patch map rewrite. keyed_merge_row_lists left concat(acc,[row]) init:left (order-breaking for prepend+reverse). graph.dag neighbor append unchanged. String-carrier debt (7 sites): http_path.dag (2), markup.dag (2), render.dag (1), render_repeat_string_bootstrap.dag (1), width.dag (1). Roster gates only change.dag (ceiling 13) and render_repeat_string_bootstrap.dag (ceiling 0); other cleaned std files are behavioral-witness gated (substrate concat triggers combiner_unregistered_carrier_reaches refusals)."

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@ module v2.test.claim.complexity.accumulator_copy_roster_gate_swift

import v2.lens.complexity_accumulator_copy.roster_gate { file_gate }
import v2.std.logic { Bool }
import v2.std.live_tree { LiveTreeDisposition, SubstrateInputsOnly }
import v2.std.live_tree { LiveTreeDisposition, ReadsLiveTree }

data live_tree_disposition: LiveTreeDisposition = SubstrateInputsOnly
data live_tree_disposition: LiveTreeDisposition = ReadsLiveTree

test fn roster_swift_zero_suspects_within_ratchet() -> Bool {
file_gate(path: "src/v2/extdeps/languages/swift.dag", refusal_ceiling: 4)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,9 @@ import v2.lens.complexity_accumulator_copy.roster_gate {
}
import v2.std.logic { Bool }
import v2.std.text { String }
import v2.std.live_tree { LiveTreeDisposition, SubstrateInputsOnly }
import v2.std.live_tree { LiveTreeDisposition, ReadsLiveTree }

data live_tree_disposition: LiveTreeDisposition = SubstrateInputsOnly
data live_tree_disposition: LiveTreeDisposition = ReadsLiveTree

test fn roster_machine_code_zero_suspects_within_ratchet() -> Bool {
file_gate(path: "src/v2/extdeps/languages/machine_code.dag", refusal_ceiling: 0)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,9 +39,9 @@ import v2.std.algebra { bag_eq, length, list_snoc_item }
import v2.std.diagnostic { Accepted, None, Rejected }
import v2.std.logic { Bool }
import v2.std.node { Symbol }
import v2.std.live_tree { LiveTreeDisposition, SubstrateInputsOnly }
import v2.std.live_tree { LiveTreeDisposition, ReadsLiveTree }

data live_tree_disposition: LiveTreeDisposition = SubstrateInputsOnly
data live_tree_disposition: LiveTreeDisposition = ReadsLiveTree

fn symbol_eq(left: Symbol, right: Symbol) -> Bool {
left == right
Expand Down
4 changes: 2 additions & 2 deletions src/v2/test/claim/execution/self_host_fixed_point_test.dag
Original file line number Diff line number Diff line change
Expand Up @@ -26,9 +26,9 @@ import v2.compiler.self_host {
}
import v2.std.diagnostic { Accepted, Rejected }
import v2.std.witness { Holds, Violates }
import v2.std.live_tree { LiveTreeDisposition, SubstrateInputsOnly }
import v2.std.live_tree { LiveTreeDisposition, ReadsLiveTree }

data live_tree_disposition: LiveTreeDisposition = SubstrateInputsOnly
data live_tree_disposition: LiveTreeDisposition = ReadsLiveTree

data self_host_fixture_fixpoint_source: String = "self_host_fixpoint_byte_identical_v1"

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,9 @@ import std.algebra { Empty }
import v2.std.collection { Present, Absent, optional_absent }
import v2.std.decl_index { export_signature_facts_host_scaffold_dissolution_trigger }
import v2.std.logic { Bool }
import v2.std.live_tree { LiveTreeDisposition, SubstrateInputsOnly }
import v2.std.live_tree { LiveTreeDisposition, ReadsLiveTree }

data live_tree_disposition: LiveTreeDisposition = SubstrateInputsOnly
data live_tree_disposition: LiveTreeDisposition = ReadsLiveTree

data firewall_fixture_roots: List<String> = ["src/v2/test/fixture/interface_summary"]

Expand Down
4 changes: 2 additions & 2 deletions src/v2/test/claim/live_read_classification_test.dag
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ import v2.std.fn_index {
fn_arrow_skeleton_g2_marshal_host_scaffold_dissolution_trigger
}
import std.disposition { Scaffold, Terminal }
import v2.std.live_tree { LiveTreeDisposition, SubstrateInputsOnly }
import v2.std.live_tree { LiveTreeDisposition, ReadsLiveTree }
import v2.std.logic { Bool }
import v2.std.text { String }
import v2.test.claim.complexity.accumulator_copy_roster_gate { live_tree_disposition }
Expand Down Expand Up @@ -267,7 +267,7 @@ test fn g2_implies_reads_live_tree_for_roster_gate() -> Bool {
carrier_homes: live_read_carrier_homes_v0
)
)
&& live_tree_disposition == SubstrateInputsOnly
&& live_tree_disposition == ReadsLiveTree
}

test fn g2_unknown_path_pattern_fail_closed_touched() -> Bool {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,9 +28,9 @@ import v2.test.workflow.host_frontier_probe_survey_manifest {
}
import v2.std.algebra { length }
import v2.std.logic { Bool }
import v2.std.live_tree { LiveTreeDisposition, SubstrateInputsOnly }
import v2.std.live_tree { LiveTreeDisposition, ReadsLiveTree }

data live_tree_disposition: LiveTreeDisposition = SubstrateInputsOnly
data live_tree_disposition: LiveTreeDisposition = ReadsLiveTree

data compiler_frontier_per_module_probe_note: String = "Fixture-FREE per-module emit-frontier probe over all 27 compiler modules via frontier_probe_survey bin (real ingest, no injected derisk fixtures). Validates roster blocker classes against execution-measured receipts; answers common-root (blocker-class clustering) vs heterogeneous located-reason gaps. Local recipe: frontier_probe_survey --source-root src/v2 --emit-survey-manifest target/frontier-probe-survey/host_frontier_probe_survey_manifest.dag then claim_batch --source-root src/v2 --source-root dag --source-root target/frontier-probe-survey --entry src/v2/test/claim/long/compiler_frontier_per_module_probe_test.dag --function compiler_frontier_per_module_probe_survey_holds"

Expand Down
4 changes: 2 additions & 2 deletions src/v2/test/claim/long/compiler_frontier_probe_entry_test.dag
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,9 @@ import v2.test.workflow.host_source_root_ingest_manifest {
host_source_root_ingest
}
import v2.std.logic { Bool }
import v2.std.live_tree { LiveTreeDisposition, SubstrateInputsOnly }
import v2.std.live_tree { LiveTreeDisposition, ReadsLiveTree }

data live_tree_disposition: LiveTreeDisposition = SubstrateInputsOnly
data live_tree_disposition: LiveTreeDisposition = ReadsLiveTree

fn frontier_probe_entry_receipt() -> FrontierProbeReceipt {
frontier_probe_emit_from_ingest(
Expand Down
4 changes: 2 additions & 2 deletions src/v2/test/claim/long/decl_index_enumeration_test.dag
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,9 @@ import v2.std.decl_index {
logical_qualified_name_from_module
}
import v2.std.logic { Bool }
import v2.std.live_tree { LiveTreeDisposition, SubstrateInputsOnly }
import v2.std.live_tree { LiveTreeDisposition, ReadsLiveTree }

data live_tree_disposition: LiveTreeDisposition = SubstrateInputsOnly
data live_tree_disposition: LiveTreeDisposition = ReadsLiveTree

test fn decl_facts_nonempty_over_witness_roots() -> Bool {
return decl_facts_count(pool_roots: witness_layer_roots) > 500
Expand Down
4 changes: 2 additions & 2 deletions src/v2/test/claim/long/no_dual_representation_test_test.dag
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,9 @@ import v2.lens.no_dual_representation_test {
no_dual_representation_test_live_file_count,
}
import v2.std.logic { Bool }
import v2.std.live_tree { LiveTreeDisposition, SubstrateInputsOnly }
import v2.std.live_tree { LiveTreeDisposition, ReadsLiveTree }

data live_tree_disposition: LiveTreeDisposition = SubstrateInputsOnly
data live_tree_disposition: LiveTreeDisposition = ReadsLiveTree

test fn no_dual_representation_test_has_no_violations() -> Bool {
return no_dual_representation_test_clean_holds()
Expand Down
4 changes: 2 additions & 2 deletions src/v2/test/claim/long/self_host_module_emit_derisk_test.dag
Original file line number Diff line number Diff line change
Expand Up @@ -24,9 +24,9 @@ import v2.std.diagnostic { Accepted, Outcome, Rejected, bind_outcome }
import v2.std.logic { Bool }
import v2.std.node { Node, Symbol }
import v2.std.text { String }
import v2.std.live_tree { LiveTreeDisposition, SubstrateInputsOnly }
import v2.std.live_tree { LiveTreeDisposition, ReadsLiveTree }

data live_tree_disposition: LiveTreeDisposition = SubstrateInputsOnly
data live_tree_disposition: LiveTreeDisposition = ReadsLiveTree

data derisk_module_artifact: Artifact = Artifact {
kind: SourceFile,
Expand Down
4 changes: 2 additions & 2 deletions src/v2/test/claim/long/symbol_index_scaling_receipt_test.dag
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,9 @@ module v2.test.long.symbol_index_scaling_receipt
import v2.lens.complexity_accumulator_copy.roster_gate { file_gate, file_suspect_count }
import v2.std.logic { Bool }
import v2.std.text { String }
import v2.std.live_tree { LiveTreeDisposition, SubstrateInputsOnly }
import v2.std.live_tree { LiveTreeDisposition, ReadsLiveTree }

data live_tree_disposition: LiveTreeDisposition = SubstrateInputsOnly
data live_tree_disposition: LiveTreeDisposition = ReadsLiveTree

data symbol_index_fill_invocation_frequency_note: String = "INVOCATION FREQUENCY (traced 2026-07-13): namespace_for_subject is the sole callsite of symbol_index_fill_module_roots (03_name_resolve.dag:534). namespace_for_subject is called only from resolve_with_admission_policy (:569). That is called only from resolve_with_admission / resolve_with_admission_grounded, each forwarding default_name_resolution_policy(). Upstream: assemble_program_from_ingest / assemble_program_from_module_roots (ONE resolve per ingest assembly over all validated_roots), compile_ingest_with_admission / compile_source_root_ingest_with_admission (ONE resolve per compile entry), plus isolated claim tests. No per-module loop re-fills all roots: cost is O(N_total) per top-level resolve, NOT O(M·N_total). v1 CI floor (whole_tree_resolved_ctx) does NOT exercise this v2 fill path yet."

Expand Down
Loading
Loading