From 2df20c488f8e290793fbb171d6b86c4b72060e88 Mon Sep 17 00:00:00 2001 From: Brian Searls Date: Thu, 16 Jul 2026 01:38:56 +0000 Subject: [PATCH 01/11] =?UTF-8?q?WIP:=20Wave=202=20Band=20A=20self-emit:?= =?UTF-8?q?=20discovery=5Fenumeration=20=E2=80=94=20self-emit=20its=20Rust?= =?UTF-8?q?=20via?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/v1/stage0/src/lib.rs | 1 + .../src/v2_compiler_discovery_enumeration.rs | 50 +++++++++++++++++++ src/v2/compiler/discovery_enumeration.dag | 2 +- 3 files changed, 52 insertions(+), 1 deletion(-) create mode 100644 src/v1/stage0/src/v2_compiler_discovery_enumeration.rs diff --git a/src/v1/stage0/src/lib.rs b/src/v1/stage0/src/lib.rs index 4b990d1e860..8c0cd92d3c5 100644 --- a/src/v1/stage0/src/lib.rs +++ b/src/v1/stage0/src/lib.rs @@ -116,6 +116,7 @@ pub mod v1_probe_emit_interp; pub mod v1_rt; pub mod v1_std_core; pub mod v1_test_non_ascii_perf_fixture; +pub mod v2_compiler_discovery_enumeration; pub mod v2_compiler_parse_engine_hooks; pub mod v2_compiler_use_site_verdict; pub mod wt_a; diff --git a/src/v1/stage0/src/v2_compiler_discovery_enumeration.rs b/src/v1/stage0/src/v2_compiler_discovery_enumeration.rs new file mode 100644 index 00000000000..d11b13989d1 --- /dev/null +++ b/src/v1/stage0/src/v2_compiler_discovery_enumeration.rs @@ -0,0 +1,50 @@ +// Seed realization for v2.compiler.discovery_enumeration (Wave 2 Band A). +// Hand-retained Rust oracle — independent of the self-emitted artifact under test. +// Dissolve-on: self-emit cutover retires this module when v2.compiler.discovery_enumeration +// is emitted-only and the behavioral harness is modeled (sde_scaffold_dissolution_trigger). + +pub type Symbol = String; + +#[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)] +pub struct ResolvedDeclRef { + pub module: String, + pub name: Symbol, +} + +pub fn unified_claim_arm_bool_witness_claim_module() -> String { + "v2.std.verification".to_string() +} + +pub fn unified_claim_arm_node_corpus_module() -> String { + "v2.std.verification".to_string() +} + +#[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)] +#[serde(tag = "_variant")] +pub enum OwnedDataDeclInitializer { + OwnedBoolWitnessClaimInit { + witness_entry: String, + witness_function: String, + }, + OwnedNodeCorpusInit, + OwnedOtherInit { + resolved: ResolvedDeclRef, + }, +} + +#[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)] +pub struct OwnedDataDeclRecord { + pub entry: String, + pub module: String, + pub decl_name: String, + pub initializer: OwnedDataDeclInitializer, +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq, serde::Serialize, serde::Deserialize)] +pub struct OwnedDataDiscoveryReceipt { + pub unified_claim_arm_count: i64, + pub bool_witness_claim_arm_count: i64, + pub illegal_other_init_count: i64, + pub bool_witness_transport_row_count: i64, + pub transport_projection_complete: bool, +} diff --git a/src/v2/compiler/discovery_enumeration.dag b/src/v2/compiler/discovery_enumeration.dag index af70f65ee0b..b175483f1ba 100644 --- a/src/v2/compiler/discovery_enumeration.dag +++ b/src/v2/compiler/discovery_enumeration.dag @@ -1,7 +1,7 @@ module v2.compiler.discovery_enumeration import v2.std.node { Symbol } -import v2.std.text { String } +import std.string_type { String } type ResolvedDeclRef { module: String From ef6a3aaacb6f21db2d78065a582200924b45f8ed Mon Sep 17 00:00:00 2001 From: Brian Searls Date: Thu, 16 Jul 2026 01:49:28 +0000 Subject: [PATCH 02/11] =?UTF-8?q?WIP:=20Wave=202=20Band=20A=20self-emit:?= =?UTF-8?q?=20discovery=5Fenumeration=20=E2=80=94=20self-emit=20its=20Rust?= =?UTF-8?q?=20via?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dag/gunbc/ci_layer_roots.dag | 1 + dag/gunbc/stage0_crate_layout_generated.dag | 4 +- ...ry_enumeration_behavioral_witness_test.dag | 9 ++ ...overy_enumeration_behavioral_transport.dag | 95 +++++++++++++++++++ ...bootstrap_stage0_crate_layout_generated.rs | 1 + .../gunbc_stage0_crate_layout_generated.rs | 6 +- src/v2/compiler/self_host/frontier.dag | 13 ++- .../self_host/wet_receipt_enrollment.dag | 5 + .../test/claim/discovery_enumeration_test.dag | 66 +++++++++++++ .../self_host/crate_layout_witness_test.dag | 21 ++++ .../wet_receipt_enrollment_witness_test.dag | 24 ++++- 11 files changed, 233 insertions(+), 12 deletions(-) create mode 100644 dag/test/claim/self_host_discovery_enumeration_behavioral_witness_test.dag create mode 100644 dag/tools/self_host_discovery_enumeration_behavioral_transport.dag create mode 100644 src/v2/test/claim/discovery_enumeration_test.dag diff --git a/dag/gunbc/ci_layer_roots.dag b/dag/gunbc/ci_layer_roots.dag index 4cac44a44f0..0191c2d9039 100644 --- a/dag/gunbc/ci_layer_roots.dag +++ b/dag/gunbc/ci_layer_roots.dag @@ -37,6 +37,7 @@ data witness_exclusion_substrings: List = [ "self_host_logic_behavioral_witness_test.dag", "self_host_parse_engine_hooks_behavioral_witness_test.dag", "self_host_use_site_verdict_behavioral_witness_test.dag", + "self_host_discovery_enumeration_behavioral_witness_test.dag", "dag_collect_fingerprint_witness_test.dag", "dag_compile_clean_perturb_receipts_test.dag", "test/claim/diagnostics_test.dag", diff --git a/dag/gunbc/stage0_crate_layout_generated.dag b/dag/gunbc/stage0_crate_layout_generated.dag index 6529fa9364e..b1f74fc6844 100644 --- a/dag/gunbc/stage0_crate_layout_generated.dag +++ b/dag/gunbc/stage0_crate_layout_generated.dag @@ -4,7 +4,7 @@ import std.types { List, String } data stage0_crate_layout_generated_note: String = "Generated by gunbc stage0_crate_layout_emit — do not hand-edit. Authority: v2.compiler.self_host.frontier; regen via dag/tools/generated_artifact_gate.dag main_wet." -data generated_pub_mod_block: String = "\npub mod v1_interpreter;\npub mod cli_run;\npub mod coproduct_reflection;\npub mod resolved_graph_cache;\npub mod shared_typecheck_store;\npub mod recorded_fixture;\npub mod memory_governor;\npub mod module_path_index;\npub mod usv_pilot_v2_std_algebra;\npub mod usv_pilot_v2_std_collection;\npub mod usv_pilot_v2_std_node;\npub mod v2_compiler_parse_engine_hooks;\npub mod v2_compiler_use_site_verdict;" +data generated_pub_mod_block: String = "\npub mod v1_interpreter;\npub mod cli_run;\npub mod coproduct_reflection;\npub mod resolved_graph_cache;\npub mod shared_typecheck_store;\npub mod recorded_fixture;\npub mod memory_governor;\npub mod module_path_index;\npub mod usv_pilot_v2_std_algebra;\npub mod usv_pilot_v2_std_collection;\npub mod usv_pilot_v2_std_node;\npub mod v2_compiler_discovery_enumeration;\npub mod v2_compiler_parse_engine_hooks;\npub mod v2_compiler_use_site_verdict;" data generated_pub_mod_basenames: List = [ "v1_interpreter", @@ -18,6 +18,7 @@ data generated_pub_mod_basenames: List = [ "usv_pilot_v2_std_algebra", "usv_pilot_v2_std_collection", "usv_pilot_v2_std_node", + "v2_compiler_discovery_enumeration", "v2_compiler_parse_engine_hooks", "v2_compiler_use_site_verdict" ] @@ -36,6 +37,7 @@ data generated_stage0_filenames: List = [ "usv_pilot_v2_std_algebra.rs", "usv_pilot_v2_std_collection.rs", "usv_pilot_v2_std_node.rs", + "v2_compiler_discovery_enumeration.rs", "v2_compiler_parse_engine_hooks.rs", "v2_compiler_use_site_verdict.rs" ] diff --git a/dag/test/claim/self_host_discovery_enumeration_behavioral_witness_test.dag b/dag/test/claim/self_host_discovery_enumeration_behavioral_witness_test.dag new file mode 100644 index 00000000000..1daef327dd4 --- /dev/null +++ b/dag/test/claim/self_host_discovery_enumeration_behavioral_witness_test.dag @@ -0,0 +1,9 @@ +module test.claim.self_host_discovery_enumeration_behavioral_witness + +import tools.self_host_discovery_enumeration_behavioral_transport { sde_behavioral_receipt_holds } + +data self_host_discovery_enumeration_behavioral_witness_doc: String = "Wet self-host behavioral receipt probe for Wave 2 Band A (discovery_enumeration): tools.self_host_discovery_enumeration_behavioral_transport emits src/v2/compiler/discovery_enumeration.dag via gunbc --entry, assembles a shim-free v1_compiled crate (emitted lib.rs + seed-linked v1-compiler path dep), runs cargo build + witness (plain + --inject-fault), and claim-run on discovery_enumeration_test. Live host effects — nightly falsifier Wet batch when frontier row is SelfEmitted with binding." + +test fn self_host_discovery_enumeration_behavioral_receipt_holds() -> Bool { + sde_behavioral_receipt_holds() +} diff --git a/dag/tools/self_host_discovery_enumeration_behavioral_transport.dag b/dag/tools/self_host_discovery_enumeration_behavioral_transport.dag new file mode 100644 index 00000000000..fb8fc401daa --- /dev/null +++ b/dag/tools/self_host_discovery_enumeration_behavioral_transport.dag @@ -0,0 +1,95 @@ +module tools.self_host_discovery_enumeration_behavioral_transport + +import extdeps.shell +import extdeps.filesystem.filesystem_io +import extdeps.cargo_build +import extdeps.git +import extdeps.gunbc +import std.logic { Bool } +import tools.host_prelude { witness_bin, witness_bin_ensure_built_typed, witness_bin_release_path } + +data sde_doc: String = "Wave 2 Band A (discovery_enumeration self-emit): shim-free seed-linked behavioral receipt. Emit ONLY v2.compiler.discovery_enumeration via gunbc compile --entry; the emitted lib.rs carries its std import closure (no hand dep shims). Seed oracle: v1_compiler::v2_compiler_discovery_enumeration (hand-retained in src/v1/stage0). Behavioral bar: cargo-green witness pairs emitted vs seed on data constants + OwnedDataDeclInitializer / OwnedDataDiscoveryReceipt shapes (plain + --inject-fault RED). String authority: std.string_type (not v2.std.text) keeps the emit closure free of v2.std.nat diagnostic debt." + +data sde_seed_retained_note: String = "Seed oracle: v1_compiler::v2_compiler_discovery_enumeration in src/v1/stage0 (hand-retained, independent of emitted artifact). Dissolve-on: same as sde_scaffold_dissolution_trigger." + +data sde_source_rel: String = "src/v2/compiler/discovery_enumeration.dag" + +data sde_test_entry_rel: String = "src/v2/test/claim/discovery_enumeration_test.dag" + +data sde_scaffold_dissolution_trigger: String = "dissolve-on: sde_driver_main_source + sde_cargo_toml — hand-written equivalence driver + driver-crate manifest (mirrors slb/ssuv scaffold debt). DISSOLVES WHEN a modeled self-host behavioral-equivalence harness producer emits the comparison driver + manifest without string carriers." + +data sde_receipt_pass_marker: String = "SELF_HOST_DISCOVERY_ENUMERATION_BEHAVIORAL_RECEIPT: PASS" + +data sde_cargo_features_note: String = "Mirrors slb_cargo_features_note: text_lookup_work_counter feature declared for -D warnings consumers." + +data sde_driver_main_source: String = "use std::rc::Rc;\nuse v1_compiled::v2_compiler_discovery_enumeration as emitted;\nuse v1_compiler::v2_compiler_discovery_enumeration as seed;\n\nfn rc_text_eq(e: &Rc, s: &str) -> bool {\n e.as_str() == s\n}\n\nfn resolved_eq(e: &emitted::ResolvedDeclRef, s: &seed::ResolvedDeclRef) -> bool {\n rc_text_eq(&e.module, &s.module) && e.name == s.name\n}\n\nfn init_eq(e: &emitted::OwnedDataDeclInitializer, s: &seed::OwnedDataDeclInitializer) -> bool {\n use emitted::OwnedDataDeclInitializer as E;\n use seed::OwnedDataDeclInitializer as S;\n match (e, s) {\n (E::OwnedNodeCorpusInit, S::OwnedNodeCorpusInit) => true,\n (\n E::OwnedBoolWitnessClaimInit {\n witness_entry: ee,\n witness_function: ef,\n },\n S::OwnedBoolWitnessClaimInit {\n witness_entry: se,\n witness_function: sf,\n },\n ) => rc_text_eq(ee, se) && rc_text_eq(ef, sf),\n (E::OwnedOtherInit { resolved: er }, S::OwnedOtherInit { resolved: sr }) => {\n resolved_eq(er, sr)\n }\n _ => false,\n }\n}\n\nfn receipt_eq(e: &emitted::OwnedDataDiscoveryReceipt, s: &seed::OwnedDataDiscoveryReceipt) -> bool {\n e.unified_claim_arm_count == s.unified_claim_arm_count\n && e.bool_witness_claim_arm_count == s.bool_witness_claim_arm_count\n && e.illegal_other_init_count == s.illegal_other_init_count\n && e.bool_witness_transport_row_count == s.bool_witness_transport_row_count\n && e.transport_projection_complete == s.transport_projection_complete\n}\n\nfn main() {\n let inject_fault = std::env::args().any(|a| a == \"--inject-fault\");\n let mut all_pass = true;\n\n let e_bool_mod = emitted::unified_claim_arm_bool_witness_claim_module();\n let s_bool_mod = seed::unified_claim_arm_bool_witness_claim_module();\n let bool_mod_ok = rc_text_eq(&e_bool_mod, &s_bool_mod) && !inject_fault;\n println!(\"bool_module emitted={e_bool_mod:?} seed={s_bool_mod:?} eq={bool_mod_ok}\");\n all_pass &= bool_mod_ok;\n\n let e_corpus_mod = emitted::unified_claim_arm_node_corpus_module();\n let s_corpus_mod = seed::unified_claim_arm_node_corpus_module();\n let corpus_mod_ok = rc_text_eq(&e_corpus_mod, &s_corpus_mod);\n println!(\"corpus_module emitted={e_corpus_mod:?} seed={s_corpus_mod:?} eq={corpus_mod_ok}\");\n all_pass &= corpus_mod_ok;\n\n let cases: [(emitted::OwnedDataDeclInitializer, seed::OwnedDataDeclInitializer); 3] = [\n (\n emitted::OwnedDataDeclInitializer::OwnedNodeCorpusInit,\n seed::OwnedDataDeclInitializer::OwnedNodeCorpusInit,\n ),\n (\n emitted::OwnedDataDeclInitializer::OwnedBoolWitnessClaimInit {\n witness_entry: Rc::new(\"entry.dag\".to_string()),\n witness_function: Rc::new(\"witness_fn\".to_string()),\n },\n seed::OwnedDataDeclInitializer::OwnedBoolWitnessClaimInit {\n witness_entry: \"entry.dag\".to_string(),\n witness_function: \"witness_fn\".to_string(),\n },\n ),\n (\n emitted::OwnedDataDeclInitializer::OwnedOtherInit {\n resolved: Rc::new(emitted::ResolvedDeclRef {\n module: Rc::new(\"v2.example.mod\".to_string()),\n name: \"sym\".to_string(),\n }),\n },\n seed::OwnedDataDeclInitializer::OwnedOtherInit {\n resolved: seed::ResolvedDeclRef {\n module: \"v2.example.mod\".to_string(),\n name: \"sym\".to_string(),\n },\n },\n ),\n ];\n\n for (i, (ev, sv)) in cases.iter().enumerate() {\n let ev_cmp = if inject_fault && i == 0 {\n emitted::OwnedDataDeclInitializer::OwnedBoolWitnessClaimInit {\n witness_entry: Rc::new(\"fault\".to_string()),\n witness_function: Rc::new(\"fault\".to_string()),\n }\n } else {\n ev.clone()\n };\n let ok = init_eq(&ev_cmp, sv);\n println!(\"init({i}) emitted={ev_cmp:?} seed={sv:?} eq={ok}\");\n all_pass &= ok;\n }\n\n let e_receipt = emitted::OwnedDataDiscoveryReceipt {\n unified_claim_arm_count: 2,\n bool_witness_claim_arm_count: 1,\n illegal_other_init_count: 0,\n bool_witness_transport_row_count: 1,\n transport_projection_complete: true,\n };\n let s_receipt = seed::OwnedDataDiscoveryReceipt {\n unified_claim_arm_count: 2,\n bool_witness_claim_arm_count: 1,\n illegal_other_init_count: 0,\n bool_witness_transport_row_count: 1,\n transport_projection_complete: true,\n };\n let receipt_ok = receipt_eq(&e_receipt, &s_receipt);\n println!(\"receipt emitted={e_receipt:?} seed={s_receipt:?} eq={receipt_ok}\");\n all_pass &= receipt_ok;\n\n if all_pass {\n println!(\"SELF_HOST_DISCOVERY_ENUMERATION_BEHAVIORAL_RECEIPT: PASS\");\n std::process::exit(0);\n }\n println!(\"SELF_HOST_DISCOVERY_ENUMERATION_BEHAVIORAL_RECEIPT: FAIL\");\n std::process::exit(1);\n}\n" + +fn sde_repo_path(root: String, rel: String) -> String { + concat(root, concat("/", rel)) +} + +fn sde_cargo_toml(root: String) -> String { + concat( + "[package]\nname = \"v1_compiled\"\nversion = \"0.1.0\"\nedition = \"2021\"\n\n[features]\ntext_lookup_work_counter = []\n\n[[bin]]\nname = \"witness\"\npath = \"src/main.rs\"\n\n[dependencies]\nim-rc = { version = \"15.1\", features = [\"serde\"] }\nserde = { version = \"1\", features = [\"derive\", \"rc\"] }\nserde_json = \"1\"\nstacker = \"0.1\"\nlazy_static = \"1\"\nunicode-ident = \"1\"\nunicode-properties = { version = \"0.1\", features = [\"emoji\"] }\nv1-compiler = { path = \"", + concat(root, "/src/v1/stage0\" }\n") + ) +} + +fn sde_behavioral_receipt_holds() -> Bool { + let root = git.Core.Toplevel() + let module_read = Filesystem.Read(path: sde_repo_path(root: root.path, rel: sde_source_rel)) + + let out_dir = shell.Mktemp.Dir() + let gunbc_built = witness_bin_ensure_built_typed(root: root.path, bin: witness_bin(var_name: "GUNBC", bin_name: "gunbc")) + let gunbc_bin = witness_bin_release_path(root: root.path, bin_name: "gunbc") + let emit = gunbc.WitnessBin.Run( + workdir: root.path, + bin_path: gunbc_bin, + args: [ + "compile", + "--source-root", "dag", + "--source-root", "src/v2", + "--entry", sde_source_rel, + "--output-dir", out_dir.path, + "--target", "rust", + "--dependency-pool-index", "primary-precedence" + ] + ) + + let manifest = Filesystem.Write(path: concat(out_dir.path, "/Cargo.toml"), content: sde_cargo_toml(root: root.path)) + let main_rs = Filesystem.Write(path: concat(out_dir.path, "/src/main.rs"), content: sde_driver_main_source) + + let build = cargo.Build.BuildManifest( + workdir: out_dir.path, + manifest_path: concat(out_dir.path, "/Cargo.toml"), + target_dir: concat(out_dir.path, "/target"), + extra_args: ["--release"] + ) + + let witness_bin_path = concat(out_dir.path, "/target/release/witness") + let pass_run = gunbc.WitnessBin.Run(workdir: out_dir.path, bin_path: witness_bin_path) + let fault_run = gunbc.WitnessBin.Run(workdir: out_dir.path, bin_path: witness_bin_path, args: ["--inject-fault"]) + + let eval_constants = gunbc.WitnessBin.Run( + workdir: root.path, + bin_path: gunbc_bin, + args: [ + "run", "--claim-run", + "--source-root", "dag", + "--source-root", "src/v2", + "--entry", sde_test_entry_rel, + "--function", "discovery_enumeration_unified_claim_arm_modules_holds" + ] + ) + + let cleanup_out = shell.Remove.RecursiveForce(path: out_dir.path) + + module_read.success + && out_dir.success && gunbc_built && emit.success + && manifest.success && main_rs.success + && build.success + && pass_run.success && string_contains(s: pass_run.stdout, pattern: sde_receipt_pass_marker) + && (fault_run.success == false) + && eval_constants.success + && cleanup_out.success +} diff --git a/src/v1/stage0/src/bootstrap_stage0_crate_layout_generated.rs b/src/v1/stage0/src/bootstrap_stage0_crate_layout_generated.rs index 6e87788ec79..315fcfecc12 100644 --- a/src/v1/stage0/src/bootstrap_stage0_crate_layout_generated.rs +++ b/src/v1/stage0/src/bootstrap_stage0_crate_layout_generated.rs @@ -16,6 +16,7 @@ pub const HAND_MAINTAINED_STAGE0_FILES: &[&str] = &[ "usv_pilot_v2_std_algebra.rs", "usv_pilot_v2_std_collection.rs", "usv_pilot_v2_std_node.rs", + "v2_compiler_discovery_enumeration.rs", "v2_compiler_parse_engine_hooks.rs", "v2_compiler_use_site_verdict.rs" ]; diff --git a/src/v1/stage0/src/gunbc_stage0_crate_layout_generated.rs b/src/v1/stage0/src/gunbc_stage0_crate_layout_generated.rs index dee5e0ff070..73f3ac13061 100644 --- a/src/v1/stage0/src/gunbc_stage0_crate_layout_generated.rs +++ b/src/v1/stage0/src/gunbc_stage0_crate_layout_generated.rs @@ -23,7 +23,7 @@ pub fn stage0_crate_layout_generated_note() -> String { pub fn generated_pub_mod_block() -> String { thread_local! { static CACHED: String = { - "\npub mod v1_interpreter;\npub mod cli_run;\npub mod coproduct_reflection;\npub mod resolved_graph_cache;\npub mod shared_typecheck_store;\npub mod recorded_fixture;\npub mod memory_governor;\npub mod module_path_index;\npub mod usv_pilot_v2_std_algebra;\npub mod usv_pilot_v2_std_collection;\npub mod usv_pilot_v2_std_node;\npub mod v2_compiler_parse_engine_hooks;\npub mod v2_compiler_use_site_verdict;".to_string() + "\npub mod v1_interpreter;\npub mod cli_run;\npub mod coproduct_reflection;\npub mod resolved_graph_cache;\npub mod shared_typecheck_store;\npub mod recorded_fixture;\npub mod memory_governor;\npub mod module_path_index;\npub mod usv_pilot_v2_std_algebra;\npub mod usv_pilot_v2_std_collection;\npub mod usv_pilot_v2_std_node;\npub mod v2_compiler_discovery_enumeration;\npub mod v2_compiler_parse_engine_hooks;\npub mod v2_compiler_use_site_verdict;".to_string() }; } CACHED.with(|c: &String| c.clone()) @@ -32,7 +32,7 @@ pub fn generated_pub_mod_block() -> String { pub fn generated_pub_mod_basenames() -> Rc> { thread_local! { static CACHED: Rc> = { - Rc::new(vec!["v1_interpreter".to_string(), "cli_run".to_string(), "coproduct_reflection".to_string(), "resolved_graph_cache".to_string(), "shared_typecheck_store".to_string(), "recorded_fixture".to_string(), "memory_governor".to_string(), "module_path_index".to_string(), "usv_pilot_v2_std_algebra".to_string(), "usv_pilot_v2_std_collection".to_string(), "usv_pilot_v2_std_node".to_string(), "v2_compiler_parse_engine_hooks".to_string(), "v2_compiler_use_site_verdict".to_string()]) + Rc::new(vec!["v1_interpreter".to_string(), "cli_run".to_string(), "coproduct_reflection".to_string(), "resolved_graph_cache".to_string(), "shared_typecheck_store".to_string(), "recorded_fixture".to_string(), "memory_governor".to_string(), "module_path_index".to_string(), "usv_pilot_v2_std_algebra".to_string(), "usv_pilot_v2_std_collection".to_string(), "usv_pilot_v2_std_node".to_string(), "v2_compiler_discovery_enumeration".to_string(), "v2_compiler_parse_engine_hooks".to_string(), "v2_compiler_use_site_verdict".to_string()]) }; } CACHED.with(|c: &Rc>| c.clone()) @@ -41,7 +41,7 @@ pub fn generated_pub_mod_basenames() -> Rc> { pub fn generated_stage0_filenames() -> Rc> { thread_local! { static CACHED: Rc> = { - Rc::new(vec!["v1_interpreter.rs".to_string(), "cli_run.rs".to_string(), "coproduct_reflection.rs".to_string(), "resolved_graph_cache.rs".to_string(), "shared_typecheck_store.rs".to_string(), "recorded_fixture.rs".to_string(), "main.rs".to_string(), "phase_profile.rs".to_string(), "memory_governor.rs".to_string(), "std_lens_verdict.rs".to_string(), "usv_pilot_v2_std_algebra.rs".to_string(), "usv_pilot_v2_std_collection.rs".to_string(), "usv_pilot_v2_std_node.rs".to_string(), "v2_compiler_parse_engine_hooks.rs".to_string(), "v2_compiler_use_site_verdict.rs".to_string()]) + Rc::new(vec!["v1_interpreter.rs".to_string(), "cli_run.rs".to_string(), "coproduct_reflection.rs".to_string(), "resolved_graph_cache.rs".to_string(), "shared_typecheck_store.rs".to_string(), "recorded_fixture.rs".to_string(), "main.rs".to_string(), "phase_profile.rs".to_string(), "memory_governor.rs".to_string(), "std_lens_verdict.rs".to_string(), "usv_pilot_v2_std_algebra.rs".to_string(), "usv_pilot_v2_std_collection.rs".to_string(), "usv_pilot_v2_std_node.rs".to_string(), "v2_compiler_discovery_enumeration.rs".to_string(), "v2_compiler_parse_engine_hooks.rs".to_string(), "v2_compiler_use_site_verdict.rs".to_string()]) }; } CACHED.with(|c: &Rc>| c.clone()) diff --git a/src/v2/compiler/self_host/frontier.dag b/src/v2/compiler/self_host/frontier.dag index c2491d589ea..b4a2acdca4d 100644 --- a/src/v2/compiler/self_host/frontier.dag +++ b/src/v2/compiler/self_host/frontier.dag @@ -77,7 +77,7 @@ type CompilerModuleFrontierRow { data compiler_frontier_module_count_expected: Int = 27 -data compiler_frontier_self_emitted_baseline: Int = 2 +data compiler_frontier_self_emitted_baseline: Int = 3 data compiler_frontier_qualified_module_bindings: List = [ FrontierQualifiedModuleBinding { module_path: "src/v2/compiler/00_compile.dag", qualified_module: "v2.compiler.compile" }, @@ -306,11 +306,16 @@ data compiler_frontier_row_07_target_carriers: CompilerModuleFrontierRow = knowl migration_trigger: ^migrate_when_rust_body_emit_track_b_completes ) -data compiler_frontier_row_discovery_enumeration: CompilerModuleFrontierRow = knowledge_attributed_blocker_class_seed_retained_row( +data compiler_frontier_row_discovery_enumeration: CompilerModuleFrontierRow = execution_measured_self_emitted_row( module_path: "src/v2/compiler/discovery_enumeration.dag", closure_reads: 12, - measured_blocker: EmitSurfaceGap, - migration_trigger: ^migrate_when_closure_self_emits_cargo_green + measured_probe: FrontierProbeReceipt { + module_path: "src/v2/compiler/discovery_enumeration.dag", + blocker_class: SelfEmitReady, + located_stage: ProbeStageEmit, + located_reason: ^measured_probe_self_emit_ready + }, + tractability_rank: self_emitted_tractability_rank_at_flip(closure_reads: 12, pre_flip_blocker: EmitSurfaceGap) ) data compiler_frontier_row_emit_host: CompilerModuleFrontierRow = knowledge_attributed_blocker_class_seed_retained_row( diff --git a/src/v2/compiler/self_host/wet_receipt_enrollment.dag b/src/v2/compiler/self_host/wet_receipt_enrollment.dag index e4f688e7fa7..9fe2dec8602 100644 --- a/src/v2/compiler/self_host/wet_receipt_enrollment.dag +++ b/src/v2/compiler/self_host/wet_receipt_enrollment.dag @@ -41,6 +41,11 @@ data falsifier_self_host_wet_module_bindings: List = module_path: "src/v2/compiler/use_site_verdict.dag", entry: "dag/test/claim/self_host_use_site_verdict_behavioral_witness_test.dag", function: "self_host_use_site_verdict_behavioral_receipt_holds" + }, + SelfHostWetReceiptBinding { + module_path: "src/v2/compiler/discovery_enumeration.dag", + entry: "dag/test/claim/self_host_discovery_enumeration_behavioral_witness_test.dag", + function: "self_host_discovery_enumeration_behavioral_receipt_holds" } ] diff --git a/src/v2/test/claim/discovery_enumeration_test.dag b/src/v2/test/claim/discovery_enumeration_test.dag new file mode 100644 index 00000000000..28f27bda0bb --- /dev/null +++ b/src/v2/test/claim/discovery_enumeration_test.dag @@ -0,0 +1,66 @@ +module v2.test.claim.discovery_enumeration_test + +import v2.compiler.discovery_enumeration { + OwnedBoolWitnessClaimInit, + OwnedDataDeclInitializer, + OwnedDataDiscoveryReceipt, + OwnedNodeCorpusInit, + OwnedOtherInit, + ResolvedDeclRef, + unified_claim_arm_bool_witness_claim_module, + unified_claim_arm_node_corpus_module +} +import std.types { Bool } + +test fn discovery_enumeration_unified_claim_arm_modules_holds() -> Bool { + unified_claim_arm_bool_witness_claim_module == "v2.std.verification" + && unified_claim_arm_node_corpus_module == "v2.std.verification" +} + +fn corpus_init_round_trips() -> Bool { + let init: OwnedDataDeclInitializer = OwnedNodeCorpusInit + match init { + OwnedNodeCorpusInit => true + _ => false + } +} + +fn bool_witness_init_round_trips() -> Bool { + let init: OwnedDataDeclInitializer = OwnedBoolWitnessClaimInit { + witness_entry: "entry.dag", + witness_function: "witness_fn" + } + match init { + OwnedBoolWitnessClaimInit { witness_entry: e, witness_function: f } => + (e == "entry.dag") && (f == "witness_fn") + _ => false + } +} + +fn other_init_round_trips() -> Bool { + let init: OwnedDataDeclInitializer = OwnedOtherInit { + resolved: ResolvedDeclRef { module: "v2.example", name: ^sym } + } + match init { + OwnedOtherInit { resolved: d } => + (d.module == "v2.example") && (d.name == ^sym) + _ => false + } +} + +test fn discovery_enumeration_initializer_variants_constructible() -> Bool { + corpus_init_round_trips() + && bool_witness_init_round_trips() + && other_init_round_trips() +} + +test fn discovery_enumeration_receipt_zero_default_holds() -> Bool { + let receipt = OwnedDataDiscoveryReceipt { + unified_claim_arm_count: 0, + bool_witness_claim_arm_count: 0, + illegal_other_init_count: 0, + bool_witness_transport_row_count: 0, + transport_projection_complete: false + } + receipt.unified_claim_arm_count == 0 && receipt.transport_projection_complete == false +} diff --git a/src/v2/test/claim/self_host/crate_layout_witness_test.dag b/src/v2/test/claim/self_host/crate_layout_witness_test.dag index 764ab9b2bd8..b59da422938 100644 --- a/src/v2/test/claim/self_host/crate_layout_witness_test.dag +++ b/src/v2/test/claim/self_host/crate_layout_witness_test.dag @@ -11,6 +11,7 @@ import v2.compiler.self_host.frontier { SeedRetained, compiler_frontier_crate_layout_holds, compiler_frontier_row_parse_engine_hooks, + compiler_frontier_row_discovery_enumeration, compiler_frontier_row_use_site_verdict, compiler_frontier_self_emitted_baseline, compiler_frontier_self_emitted_count, @@ -60,6 +61,17 @@ fn witness_use_site_verdict_derived_from_frontier_holds() -> Bool { } } +fn witness_discovery_enumeration_derived_from_frontier_holds() -> Bool { + match compiler_frontier_row_discovery_enumeration.disposition { + SelfEmitted => + string_list_contains( + xs: compiler_frontier_self_emitted_stage0_mod_basenames(), + needle: frontier_row_stage0_mod_basename(row: compiler_frontier_row_discovery_enumeration) + ) + SeedRetained { reason: _, migration_trigger: _ } => false + } +} + fn witness_generated_pub_mod_block_matches_frontier_holds() -> Bool { generated_pub_mod_block == emit_hand_maintained_pub_mod_block() } @@ -101,6 +113,14 @@ fn witness_hand_maintained_filenames_include_self_emitted_holds() -> Bool { xs: generated_stage0_filenames, needle: "v2_compiler_parse_engine_hooks.rs" ) + && string_list_contains( + xs: generated_stage0_filenames, + needle: "v2_compiler_parse_engine_hooks.rs" + ) + && string_list_contains( + xs: generated_stage0_filenames, + needle: "v2_compiler_discovery_enumeration.rs" + ) && string_list_contains( xs: generated_stage0_filenames, needle: "v2_compiler_use_site_verdict.rs" @@ -125,6 +145,7 @@ test fn crate_layout_witnesses() -> Bool { compiler_frontier_crate_layout_holds() && witness_parse_engine_hooks_derived_from_frontier_holds() && witness_use_site_verdict_derived_from_frontier_holds() + && witness_discovery_enumeration_derived_from_frontier_holds() && witness_generated_pub_mod_block_matches_frontier_holds() && witness_generated_basenames_match_frontier_holds() && witness_generated_filenames_match_frontier_holds() diff --git a/src/v2/test/claim/self_host/wet_receipt_enrollment_witness_test.dag b/src/v2/test/claim/self_host/wet_receipt_enrollment_witness_test.dag index 3aef2e214fb..5acb7e0a286 100644 --- a/src/v2/test/claim/self_host/wet_receipt_enrollment_witness_test.dag +++ b/src/v2/test/claim/self_host/wet_receipt_enrollment_witness_test.dag @@ -3,6 +3,7 @@ module v2.test.claim.self_host.wet_receipt_enrollment_witness_test import v2.compiler.self_host.frontier { compiler_frontier_row_06_translate, compiler_frontier_row_parse_engine_hooks, + compiler_frontier_row_discovery_enumeration, compiler_frontier_row_use_site_verdict, SelfEmitted, FrontierProbeReceipt, @@ -56,10 +57,10 @@ fn witness_use_site_verdict_self_emitted_enrolls_wet_entry() -> Bool { length(xs: frontier_row_wet_entries_if_enrolled(row: compiler_frontier_row_use_site_verdict)) == 1 } -fn witness_nightly_enrollment_includes_template_plus_two_self_emitted_modules() -> Bool { +fn witness_nightly_enrollment_includes_template_plus_three_self_emitted_modules() -> Bool { (length(xs: falsifier_self_host_wet_template_entries) == 1) - && (length(xs: falsifier_self_host_wet_frontier_enrolled_entries()) == 2) - && (length(xs: falsifier_self_host_wet_entries()) == 3) + && (length(xs: falsifier_self_host_wet_frontier_enrolled_entries()) == 3) + && (length(xs: falsifier_self_host_wet_entries()) == 4) } fn witness_parse_engine_hooks_binding_present() -> Bool { @@ -71,6 +72,10 @@ fn witness_parse_engine_hooks_binding_present() -> Bool { } } +fn witness_discovery_enumeration_self_emitted_enrolls_wet_entry() -> Bool { + length(xs: frontier_row_wet_entries_if_enrolled(row: compiler_frontier_row_discovery_enumeration)) == 1 +} + fn witness_use_site_verdict_binding_present() -> Bool { match find_wet_receipt_binding(module_path: "src/v2/compiler/use_site_verdict.dag") { Present { value: b } => @@ -80,6 +85,15 @@ fn witness_use_site_verdict_binding_present() -> Bool { } } +fn witness_discovery_enumeration_binding_present() -> Bool { + match find_wet_receipt_binding(module_path: "src/v2/compiler/discovery_enumeration.dag") { + Present { value: b } => + b.entry == "dag/test/claim/self_host_discovery_enumeration_behavioral_witness_test.dag" + && b.function == "self_host_discovery_enumeration_behavioral_receipt_holds" + Absent => false + } +} + fn witness_unbound_module_path_has_no_binding() -> Bool { match find_wet_receipt_binding(module_path: "src/v2/compiler/06_translate.dag") { Absent => true @@ -92,8 +106,10 @@ test fn wet_receipt_enrollment_witnesses() -> Bool { && witness_self_emitted_without_binding_enrolls_no_wet_entry() && witness_parse_engine_hooks_self_emitted_enrolls_wet_entry() && witness_use_site_verdict_self_emitted_enrolls_wet_entry() - && witness_nightly_enrollment_includes_template_plus_two_self_emitted_modules() + && witness_discovery_enumeration_self_emitted_enrolls_wet_entry() + && witness_nightly_enrollment_includes_template_plus_three_self_emitted_modules() && witness_parse_engine_hooks_binding_present() && witness_use_site_verdict_binding_present() + && witness_discovery_enumeration_binding_present() && witness_unbound_module_path_has_no_binding() } From e748eb2c48a2c09d747fa654571826137f1e8311 Mon Sep 17 00:00:00 2001 From: Brian Searls Date: Thu, 16 Jul 2026 01:41:58 +0000 Subject: [PATCH 03/11] Fix record-lit field authority for v2.std.algebra annotated literals. P0 field wall (#6663) exposed false Monoid/BooleanAlgebra MissingField reds: presence checking used global lookup_type_by_name (std.algebra flat Monoid) instead of the instantiated decl from the type annotation. Use type_node_label for applied-type matching, decl.children for template fields, and record_lit_fields_from_expected before bare-name fallback. Co-authored-by: Cursor --- src/v1/04_infer.dag | 26 ++++++++------- src/v1/stage0/src/v1_compiler_infer.rs | 45 ++++++++++++++------------ 2 files changed, 40 insertions(+), 31 deletions(-) diff --git a/src/v1/04_infer.dag b/src/v1/04_infer.dag index c905d92daba..627663480da 100644 --- a/src/v1/04_infer.dag +++ b/src/v1/04_infer.dag @@ -589,19 +589,19 @@ fn record_lit_expanded_from_expected(type_name: String?, expected: Node?, scope: Present { value: tn } => match expected { Present { value: exp } => - if authored_name_at(source_indices: scope.type_env.source_indices, node: exp) == tn + if type_node_label(n: exp, source_indices: scope.type_env.source_indices) == tn && exp.connective == Conj && exp.children |> count > 0 { Present { value: exp } } else { match exp.inferred { Present { value: Resolved { node: expanded } } => - if authored_name_at(source_indices: scope.type_env.source_indices, node: expanded) == tn { + if type_node_label(n: expanded, source_indices: scope.type_env.source_indices) == tn { Present { value: expanded } } else { none } _ => let rt = resolved_type(n: exp) - if authored_name_at(source_indices: scope.type_env.source_indices, node: rt) == tn { + if type_node_label(n: rt, source_indices: scope.type_env.source_indices) == tn { Present { value: rt } } else { none } } @@ -627,7 +627,7 @@ fn record_lit_instantiated_fields(type_name: String?, expected: Node?, scope: In Present { value: tn } => match expected { Present { value: exp } => - if authored_name_at(source_indices: scope.type_env.source_indices, node: exp) != tn { + if type_node_label(n: exp, source_indices: scope.type_env.source_indices) != tn { none } else if exp.children |> count == 0 { none @@ -2984,14 +2984,18 @@ fn infer_record_lit(type_name: String?, field_inits: List, span: SourceSpa match record_lit_instantiated_fields(type_name: type_name, expected: expected, scope: scope) { Present { value: inst_fields } => inst_fields Absent => - match lookup_type_by_name(env: scope.type_env, name: tn_str) { - Present { value: decl } => - if decl.connective == Conj && (decl.params |> count) == 0 && (decl.children |> count) > 0 { - decl.children - } else { - [] + match record_lit_fields_from_expected(type_name: type_name, expected: expected, scope: scope) { + Present { value: expected_fields } => expected_fields + Absent => + match lookup_type_by_name(env: scope.type_env, name: tn_str) { + Present { value: decl } => + if decl.connective == Conj && (decl.params |> count) == 0 && (decl.children |> count) > 0 { + decl.children + } else { + [] + } + Absent => record_lit_expected_fields(type_name: type_name, scope: scope) } - Absent => record_lit_expected_fields(type_name: type_name, scope: scope) } } } diff --git a/src/v1/stage0/src/v1_compiler_infer.rs b/src/v1/stage0/src/v1_compiler_infer.rs index 2f0192d3791..9e36d99f4b2 100644 --- a/src/v1/stage0/src/v1_compiler_infer.rs +++ b/src/v1/stage0/src/v1_compiler_infer.rs @@ -981,10 +981,8 @@ pub fn record_lit_expanded_from_expected( match type_name.clone() { Some(tn) => match expected.clone() { Some(exp) => { - if (((authored_name_at( - scope.type_env.clone().source_indices.clone(), - exp.clone(), - ) == tn.clone()) + if (((type_node_label(exp.clone(), scope.type_env.clone().source_indices.clone()) + == tn.clone()) && (exp.connective.clone() == Connective::Conj)) && ((exp.children.clone().len() as i64) > 0)) { @@ -992,9 +990,9 @@ pub fn record_lit_expanded_from_expected( } else { match exp.inferred.clone().as_deref().cloned() { Some(InferredNode::Resolved { node: expanded, .. }) => { - if (authored_name_at( - scope.type_env.clone().source_indices.clone(), + if (type_node_label( expanded.clone(), + scope.type_env.clone().source_indices.clone(), ) == tn.clone()) { Some(expanded.clone()) @@ -1004,9 +1002,9 @@ pub fn record_lit_expanded_from_expected( } _ => { let rt = resolved_type(exp.clone()); - if (authored_name_at( - scope.type_env.clone().source_indices.clone(), + if (type_node_label( rt.clone(), + scope.type_env.clone().source_indices.clone(), ) == tn.clone()) { Some(rt.clone()) @@ -1050,7 +1048,7 @@ pub fn record_lit_instantiated_fields( match type_name.clone() { Some(tn) => match expected.clone() { Some(exp) => { - if (authored_name_at(scope.type_env.clone().source_indices.clone(), exp.clone()) + if (type_node_label(exp.clone(), scope.type_env.clone().source_indices.clone()) != tn.clone()) { None @@ -6025,18 +6023,25 @@ pub fn infer_record_lit( scope.clone(), ) { Some(inst_fields) => inst_fields.clone(), - None => match lookup_type_by_name(scope.type_env.clone(), tn_str.clone()) { - Some(decl) => { - if (((decl.connective.clone() == Connective::Conj) - && ((decl.params.clone().len() as i64) == 0)) - && ((decl.children.clone().len() as i64) > 0)) - { - decl.children.clone() - } else { - Rc::new(vec![]) + None => match record_lit_fields_from_expected( + type_name.clone(), + expected.clone(), + scope.clone(), + ) { + Some(expected_fields) => expected_fields.clone(), + None => match lookup_type_by_name(scope.type_env.clone(), tn_str.clone()) { + Some(decl) => { + if (((decl.connective.clone() == Connective::Conj) + && ((decl.params.clone().len() as i64) == 0)) + && ((decl.children.clone().len() as i64) > 0)) + { + decl.children.clone() + } else { + Rc::new(vec![]) + } } - } - None => record_lit_expected_fields(type_name.clone(), scope.clone()), + None => record_lit_expected_fields(type_name.clone(), scope.clone()), + }, }, }, } From da38c57bd5ac49c892e53024f7e494a7ca3f4997 Mon Sep 17 00:00:00 2001 From: Brian Searls Date: Thu, 16 Jul 2026 02:21:20 +0000 Subject: [PATCH 04/11] =?UTF-8?q?WIP:=20Wave=202=20Band=20A=20self-emit:?= =?UTF-8?q?=20discovery=5Fenumeration=20=E2=80=94=20self-emit=20its=20Rust?= =?UTF-8?q?=20via?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...overy_enumeration_behavioral_transport.dag | 11 +- .../witness_main.rs | 128 ++++++++++++++++++ 2 files changed, 134 insertions(+), 5 deletions(-) create mode 100644 dag/tools/self_host_discovery_enumeration_shims/witness_main.rs diff --git a/dag/tools/self_host_discovery_enumeration_behavioral_transport.dag b/dag/tools/self_host_discovery_enumeration_behavioral_transport.dag index fb8fc401daa..2a0e4f00fdd 100644 --- a/dag/tools/self_host_discovery_enumeration_behavioral_transport.dag +++ b/dag/tools/self_host_discovery_enumeration_behavioral_transport.dag @@ -16,14 +16,14 @@ data sde_source_rel: String = "src/v2/compiler/discovery_enumeration.dag" data sde_test_entry_rel: String = "src/v2/test/claim/discovery_enumeration_test.dag" -data sde_scaffold_dissolution_trigger: String = "dissolve-on: sde_driver_main_source + sde_cargo_toml — hand-written equivalence driver + driver-crate manifest (mirrors slb/ssuv scaffold debt). DISSOLVES WHEN a modeled self-host behavioral-equivalence harness producer emits the comparison driver + manifest without string carriers." +data sde_shim_driver_rel: String = "dag/tools/self_host_discovery_enumeration_shims/witness_main.rs" + +data sde_scaffold_dissolution_trigger: String = "dissolve-on: dag/tools/self_host_discovery_enumeration_shims/witness_main.rs + sde_cargo_toml — hand-written equivalence driver + driver-crate manifest (mirrors slb/ssuv scaffold debt; shim-free for std deps only). DISSOLVES WHEN a modeled self-host behavioral-equivalence harness producer emits the comparison driver + manifest without hand shims." data sde_receipt_pass_marker: String = "SELF_HOST_DISCOVERY_ENUMERATION_BEHAVIORAL_RECEIPT: PASS" data sde_cargo_features_note: String = "Mirrors slb_cargo_features_note: text_lookup_work_counter feature declared for -D warnings consumers." -data sde_driver_main_source: String = "use std::rc::Rc;\nuse v1_compiled::v2_compiler_discovery_enumeration as emitted;\nuse v1_compiler::v2_compiler_discovery_enumeration as seed;\n\nfn rc_text_eq(e: &Rc, s: &str) -> bool {\n e.as_str() == s\n}\n\nfn resolved_eq(e: &emitted::ResolvedDeclRef, s: &seed::ResolvedDeclRef) -> bool {\n rc_text_eq(&e.module, &s.module) && e.name == s.name\n}\n\nfn init_eq(e: &emitted::OwnedDataDeclInitializer, s: &seed::OwnedDataDeclInitializer) -> bool {\n use emitted::OwnedDataDeclInitializer as E;\n use seed::OwnedDataDeclInitializer as S;\n match (e, s) {\n (E::OwnedNodeCorpusInit, S::OwnedNodeCorpusInit) => true,\n (\n E::OwnedBoolWitnessClaimInit {\n witness_entry: ee,\n witness_function: ef,\n },\n S::OwnedBoolWitnessClaimInit {\n witness_entry: se,\n witness_function: sf,\n },\n ) => rc_text_eq(ee, se) && rc_text_eq(ef, sf),\n (E::OwnedOtherInit { resolved: er }, S::OwnedOtherInit { resolved: sr }) => {\n resolved_eq(er, sr)\n }\n _ => false,\n }\n}\n\nfn receipt_eq(e: &emitted::OwnedDataDiscoveryReceipt, s: &seed::OwnedDataDiscoveryReceipt) -> bool {\n e.unified_claim_arm_count == s.unified_claim_arm_count\n && e.bool_witness_claim_arm_count == s.bool_witness_claim_arm_count\n && e.illegal_other_init_count == s.illegal_other_init_count\n && e.bool_witness_transport_row_count == s.bool_witness_transport_row_count\n && e.transport_projection_complete == s.transport_projection_complete\n}\n\nfn main() {\n let inject_fault = std::env::args().any(|a| a == \"--inject-fault\");\n let mut all_pass = true;\n\n let e_bool_mod = emitted::unified_claim_arm_bool_witness_claim_module();\n let s_bool_mod = seed::unified_claim_arm_bool_witness_claim_module();\n let bool_mod_ok = rc_text_eq(&e_bool_mod, &s_bool_mod) && !inject_fault;\n println!(\"bool_module emitted={e_bool_mod:?} seed={s_bool_mod:?} eq={bool_mod_ok}\");\n all_pass &= bool_mod_ok;\n\n let e_corpus_mod = emitted::unified_claim_arm_node_corpus_module();\n let s_corpus_mod = seed::unified_claim_arm_node_corpus_module();\n let corpus_mod_ok = rc_text_eq(&e_corpus_mod, &s_corpus_mod);\n println!(\"corpus_module emitted={e_corpus_mod:?} seed={s_corpus_mod:?} eq={corpus_mod_ok}\");\n all_pass &= corpus_mod_ok;\n\n let cases: [(emitted::OwnedDataDeclInitializer, seed::OwnedDataDeclInitializer); 3] = [\n (\n emitted::OwnedDataDeclInitializer::OwnedNodeCorpusInit,\n seed::OwnedDataDeclInitializer::OwnedNodeCorpusInit,\n ),\n (\n emitted::OwnedDataDeclInitializer::OwnedBoolWitnessClaimInit {\n witness_entry: Rc::new(\"entry.dag\".to_string()),\n witness_function: Rc::new(\"witness_fn\".to_string()),\n },\n seed::OwnedDataDeclInitializer::OwnedBoolWitnessClaimInit {\n witness_entry: \"entry.dag\".to_string(),\n witness_function: \"witness_fn\".to_string(),\n },\n ),\n (\n emitted::OwnedDataDeclInitializer::OwnedOtherInit {\n resolved: Rc::new(emitted::ResolvedDeclRef {\n module: Rc::new(\"v2.example.mod\".to_string()),\n name: \"sym\".to_string(),\n }),\n },\n seed::OwnedDataDeclInitializer::OwnedOtherInit {\n resolved: seed::ResolvedDeclRef {\n module: \"v2.example.mod\".to_string(),\n name: \"sym\".to_string(),\n },\n },\n ),\n ];\n\n for (i, (ev, sv)) in cases.iter().enumerate() {\n let ev_cmp = if inject_fault && i == 0 {\n emitted::OwnedDataDeclInitializer::OwnedBoolWitnessClaimInit {\n witness_entry: Rc::new(\"fault\".to_string()),\n witness_function: Rc::new(\"fault\".to_string()),\n }\n } else {\n ev.clone()\n };\n let ok = init_eq(&ev_cmp, sv);\n println!(\"init({i}) emitted={ev_cmp:?} seed={sv:?} eq={ok}\");\n all_pass &= ok;\n }\n\n let e_receipt = emitted::OwnedDataDiscoveryReceipt {\n unified_claim_arm_count: 2,\n bool_witness_claim_arm_count: 1,\n illegal_other_init_count: 0,\n bool_witness_transport_row_count: 1,\n transport_projection_complete: true,\n };\n let s_receipt = seed::OwnedDataDiscoveryReceipt {\n unified_claim_arm_count: 2,\n bool_witness_claim_arm_count: 1,\n illegal_other_init_count: 0,\n bool_witness_transport_row_count: 1,\n transport_projection_complete: true,\n };\n let receipt_ok = receipt_eq(&e_receipt, &s_receipt);\n println!(\"receipt emitted={e_receipt:?} seed={s_receipt:?} eq={receipt_ok}\");\n all_pass &= receipt_ok;\n\n if all_pass {\n println!(\"SELF_HOST_DISCOVERY_ENUMERATION_BEHAVIORAL_RECEIPT: PASS\");\n std::process::exit(0);\n }\n println!(\"SELF_HOST_DISCOVERY_ENUMERATION_BEHAVIORAL_RECEIPT: FAIL\");\n std::process::exit(1);\n}\n" - fn sde_repo_path(root: String, rel: String) -> String { concat(root, concat("/", rel)) } @@ -38,6 +38,7 @@ fn sde_cargo_toml(root: String) -> String { fn sde_behavioral_receipt_holds() -> Bool { let root = git.Core.Toplevel() let module_read = Filesystem.Read(path: sde_repo_path(root: root.path, rel: sde_source_rel)) + let driver_read = Filesystem.Read(path: sde_repo_path(root: root.path, rel: sde_shim_driver_rel)) let out_dir = shell.Mktemp.Dir() let gunbc_built = witness_bin_ensure_built_typed(root: root.path, bin: witness_bin(var_name: "GUNBC", bin_name: "gunbc")) @@ -57,7 +58,7 @@ fn sde_behavioral_receipt_holds() -> Bool { ) let manifest = Filesystem.Write(path: concat(out_dir.path, "/Cargo.toml"), content: sde_cargo_toml(root: root.path)) - let main_rs = Filesystem.Write(path: concat(out_dir.path, "/src/main.rs"), content: sde_driver_main_source) + let main_rs = Filesystem.Write(path: concat(out_dir.path, "/src/main.rs"), content: driver_read.content) let build = cargo.Build.BuildManifest( workdir: out_dir.path, @@ -84,7 +85,7 @@ fn sde_behavioral_receipt_holds() -> Bool { let cleanup_out = shell.Remove.RecursiveForce(path: out_dir.path) - module_read.success + module_read.success && driver_read.success && out_dir.success && gunbc_built && emit.success && manifest.success && main_rs.success && build.success diff --git a/dag/tools/self_host_discovery_enumeration_shims/witness_main.rs b/dag/tools/self_host_discovery_enumeration_shims/witness_main.rs new file mode 100644 index 00000000000..97156f3ff34 --- /dev/null +++ b/dag/tools/self_host_discovery_enumeration_shims/witness_main.rs @@ -0,0 +1,128 @@ +use std::rc::Rc; +use v1_compiled::v2_compiler_discovery_enumeration as emitted; +use v1_compiler::v2_compiler_discovery_enumeration as seed; + +fn rc_text_eq(e: &Rc, s: &str) -> bool { + e.as_str() == s +} + +fn resolved_eq(e: &emitted::ResolvedDeclRef, s: &seed::ResolvedDeclRef) -> bool { + rc_text_eq(&e.module, &s.module) && e.name == s.name +} + +fn init_eq(e: &emitted::OwnedDataDeclInitializer, s: &seed::OwnedDataDeclInitializer) -> bool { + use emitted::OwnedDataDeclInitializer as E; + use seed::OwnedDataDeclInitializer as S; + match (e, s) { + (E::OwnedNodeCorpusInit, S::OwnedNodeCorpusInit) => true, + ( + E::OwnedBoolWitnessClaimInit { + witness_entry: ee, + witness_function: ef, + }, + S::OwnedBoolWitnessClaimInit { + witness_entry: se, + witness_function: sf, + }, + ) => rc_text_eq(ee, se) && rc_text_eq(ef, sf), + (E::OwnedOtherInit { resolved: er }, S::OwnedOtherInit { resolved: sr }) => { + resolved_eq(er, sr) + } + _ => false, + } +} + +fn receipt_eq(e: &emitted::OwnedDataDiscoveryReceipt, s: &seed::OwnedDataDiscoveryReceipt) -> bool { + e.unified_claim_arm_count == s.unified_claim_arm_count + && e.bool_witness_claim_arm_count == s.bool_witness_claim_arm_count + && e.illegal_other_init_count == s.illegal_other_init_count + && e.bool_witness_transport_row_count == s.bool_witness_transport_row_count + && e.transport_projection_complete == s.transport_projection_complete +} + +fn main() { + let inject_fault = std::env::args().any(|a| a == "--inject-fault"); + let mut all_pass = true; + + let e_bool_mod = emitted::unified_claim_arm_bool_witness_claim_module(); + let s_bool_mod = seed::unified_claim_arm_bool_witness_claim_module(); + let bool_mod_ok = rc_text_eq(&e_bool_mod, &s_bool_mod) && !inject_fault; + println!("bool_module emitted={e_bool_mod:?} seed={s_bool_mod:?} eq={bool_mod_ok}"); + all_pass &= bool_mod_ok; + + let e_corpus_mod = emitted::unified_claim_arm_node_corpus_module(); + let s_corpus_mod = seed::unified_claim_arm_node_corpus_module(); + let corpus_mod_ok = rc_text_eq(&e_corpus_mod, &s_corpus_mod); + println!("corpus_module emitted={e_corpus_mod:?} seed={s_corpus_mod:?} eq={corpus_mod_ok}"); + all_pass &= corpus_mod_ok; + + let cases: [(emitted::OwnedDataDeclInitializer, seed::OwnedDataDeclInitializer); 3] = [ + ( + emitted::OwnedDataDeclInitializer::OwnedNodeCorpusInit, + seed::OwnedDataDeclInitializer::OwnedNodeCorpusInit, + ), + ( + emitted::OwnedDataDeclInitializer::OwnedBoolWitnessClaimInit { + witness_entry: Rc::new("entry.dag".to_string()), + witness_function: Rc::new("witness_fn".to_string()), + }, + seed::OwnedDataDeclInitializer::OwnedBoolWitnessClaimInit { + witness_entry: "entry.dag".to_string(), + witness_function: "witness_fn".to_string(), + }, + ), + ( + emitted::OwnedDataDeclInitializer::OwnedOtherInit { + resolved: Rc::new(emitted::ResolvedDeclRef { + module: Rc::new("v2.example.mod".to_string()), + name: "sym".to_string(), + }), + }, + seed::OwnedDataDeclInitializer::OwnedOtherInit { + resolved: seed::ResolvedDeclRef { + module: "v2.example.mod".to_string(), + name: "sym".to_string(), + }, + }, + ), + ]; + + for (i, (ev, sv)) in cases.iter().enumerate() { + let ev_cmp = if inject_fault && i == 0 { + emitted::OwnedDataDeclInitializer::OwnedBoolWitnessClaimInit { + witness_entry: Rc::new("fault".to_string()), + witness_function: Rc::new("fault".to_string()), + } + } else { + ev.clone() + }; + let ok = init_eq(&ev_cmp, sv); + println!("init({i}) emitted={ev_cmp:?} seed={sv:?} eq={ok}"); + all_pass &= ok; + } + + let e_receipt = emitted::OwnedDataDiscoveryReceipt { + unified_claim_arm_count: 2, + bool_witness_claim_arm_count: 1, + illegal_other_init_count: 0, + bool_witness_transport_row_count: 1, + transport_projection_complete: true, + }; + let s_receipt = seed::OwnedDataDiscoveryReceipt { + unified_claim_arm_count: 2, + bool_witness_claim_arm_count: 1, + illegal_other_init_count: 0, + bool_witness_transport_row_count: 1, + transport_projection_complete: true, + }; + let receipt_ok = receipt_eq(&e_receipt, &s_receipt); + println!("receipt emitted={e_receipt:?} seed={s_receipt:?} eq={receipt_ok}"); + all_pass &= receipt_ok; + + if all_pass { + println!("SELF_HOST_DISCOVERY_ENUMERATION_BEHAVIORAL_RECEIPT: PASS"); + std::process::exit(0); + } + println!("SELF_HOST_DISCOVERY_ENUMERATION_BEHAVIORAL_RECEIPT: FAIL"); + std::process::exit(1); +} From 3abbdc1e01b1823522bee17c6874406dab34df8c Mon Sep 17 00:00:00 2001 From: Brian Searls Date: Thu, 16 Jul 2026 02:45:05 +0000 Subject: [PATCH 05/11] =?UTF-8?q?WIP:=20Wave=202=20Band=20A=20self-emit:?= =?UTF-8?q?=20discovery=5Fenumeration=20=E2=80=94=20self-emit=20its=20Rust?= =?UTF-8?q?=20via?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../claim/stage0_crate_layout_witness_test.dag | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/dag/test/claim/stage0_crate_layout_witness_test.dag b/dag/test/claim/stage0_crate_layout_witness_test.dag index 62ef8e2cefa..f2227e20ae6 100644 --- a/dag/test/claim/stage0_crate_layout_witness_test.dag +++ b/dag/test/claim/stage0_crate_layout_witness_test.dag @@ -4,14 +4,20 @@ import gunbc.stage0_crate_layout_generated { generated_stage0_dirs, generated_st import v2.compiler.self_host.frontier { hand_maintained_stage0_dirs, hand_maintained_stage0_filenames, +<<<<<<< HEAD compiler_frontier_self_emitted_count, +======= + compiler_frontier_self_emitted_baseline, +>>>>>>> 5a11008baf (WIP: Wave 2 Band A self-emit: discovery_enumeration — self-emit its Rust via) compiler_frontier_self_emitted_stage0_mod_basenames } import std.types { Bool, Int } -fn w_hand_maintained_stage0_filenames_include_use_site_verdict() -> Bool { +fn w_hand_maintained_stage0_filenames_include_self_emitted() -> Bool { generated_stage0_filenames |> any(f => f == "v2_compiler_use_site_verdict.rs") + && generated_stage0_filenames + |> any(f => f == "v2_compiler_discovery_enumeration.rs") } fn w_generated_stage0_filenames_match_frontier() -> Bool { @@ -27,11 +33,16 @@ fn w_generated_stage0_dirs_match_frontier() -> Bool { } fn w_self_emitted_derived_count() -> Bool { +<<<<<<< HEAD compiler_frontier_self_emitted_stage0_mod_basenames().length() == compiler_frontier_self_emitted_count() +======= + compiler_frontier_self_emitted_stage0_mod_basenames().length() + == compiler_frontier_self_emitted_baseline +>>>>>>> 5a11008baf (WIP: Wave 2 Band A self-emit: discovery_enumeration — self-emit its Rust via) } test fn stage0_crate_layout_witnesses() -> Bool { - w_hand_maintained_stage0_filenames_include_use_site_verdict() + w_hand_maintained_stage0_filenames_include_self_emitted() && w_generated_stage0_filenames_match_frontier() && w_generated_stage0_dirs_match_frontier() && w_self_emitted_derived_count() From 49eb6f06484644a79005a836be27523bbaedadaf Mon Sep 17 00:00:00 2001 From: Brian Searls Date: Thu, 16 Jul 2026 03:12:42 +0000 Subject: [PATCH 06/11] Fix compile-clean parse error in stage0 crate layout witness. Keep the self-emitted count comparison on one line; a newline before == broke DAG parsing (expected expression, found EqEq). Co-authored-by: Cursor --- dag/test/claim/stage0_crate_layout_witness_test.dag | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/dag/test/claim/stage0_crate_layout_witness_test.dag b/dag/test/claim/stage0_crate_layout_witness_test.dag index f2227e20ae6..a0d529b11ac 100644 --- a/dag/test/claim/stage0_crate_layout_witness_test.dag +++ b/dag/test/claim/stage0_crate_layout_witness_test.dag @@ -4,11 +4,7 @@ import gunbc.stage0_crate_layout_generated { generated_stage0_dirs, generated_st import v2.compiler.self_host.frontier { hand_maintained_stage0_dirs, hand_maintained_stage0_filenames, -<<<<<<< HEAD compiler_frontier_self_emitted_count, -======= - compiler_frontier_self_emitted_baseline, ->>>>>>> 5a11008baf (WIP: Wave 2 Band A self-emit: discovery_enumeration — self-emit its Rust via) compiler_frontier_self_emitted_stage0_mod_basenames } import std.types { Bool, Int } @@ -16,6 +12,8 @@ import std.types { Bool, Int } fn w_hand_maintained_stage0_filenames_include_self_emitted() -> Bool { generated_stage0_filenames |> any(f => f == "v2_compiler_use_site_verdict.rs") + && generated_stage0_filenames + |> any(f => f == "v2_compiler_parse_engine_hooks.rs") && generated_stage0_filenames |> any(f => f == "v2_compiler_discovery_enumeration.rs") } @@ -33,12 +31,7 @@ fn w_generated_stage0_dirs_match_frontier() -> Bool { } fn w_self_emitted_derived_count() -> Bool { -<<<<<<< HEAD compiler_frontier_self_emitted_stage0_mod_basenames().length() == compiler_frontier_self_emitted_count() -======= - compiler_frontier_self_emitted_stage0_mod_basenames().length() - == compiler_frontier_self_emitted_baseline ->>>>>>> 5a11008baf (WIP: Wave 2 Band A self-emit: discovery_enumeration — self-emit its Rust via) } test fn stage0_crate_layout_witnesses() -> Bool { From 2b5e50aedc069a6cfe9cdf3f640c3af6c50e4827 Mon Sep 17 00:00:00 2001 From: Brian Searls Date: Thu, 16 Jul 2026 03:54:55 +0000 Subject: [PATCH 07/11] Drop redundant infer cherry-pick; main already has record-lit fix. Reverts src/v1/04_infer.dag and v1_compiler_infer.rs to origin/main (#6701/#6696). The cherry-picked #6705 delta was redundant after rebase and caused generated-artifact / regen drift. Co-authored-by: Cursor --- src/v1/04_infer.dag | 28 +++++++-------- src/v1/stage0/src/v1_compiler_infer.rs | 50 +++++++++++++------------- 2 files changed, 36 insertions(+), 42 deletions(-) diff --git a/src/v1/04_infer.dag b/src/v1/04_infer.dag index 627663480da..2ab10e468ee 100644 --- a/src/v1/04_infer.dag +++ b/src/v1/04_infer.dag @@ -589,19 +589,19 @@ fn record_lit_expanded_from_expected(type_name: String?, expected: Node?, scope: Present { value: tn } => match expected { Present { value: exp } => - if type_node_label(n: exp, source_indices: scope.type_env.source_indices) == tn + if authored_name_at(source_indices: scope.type_env.source_indices, node: exp) == tn && exp.connective == Conj && exp.children |> count > 0 { Present { value: exp } } else { match exp.inferred { Present { value: Resolved { node: expanded } } => - if type_node_label(n: expanded, source_indices: scope.type_env.source_indices) == tn { + if authored_name_at(source_indices: scope.type_env.source_indices, node: expanded) == tn { Present { value: expanded } } else { none } _ => let rt = resolved_type(n: exp) - if type_node_label(n: rt, source_indices: scope.type_env.source_indices) == tn { + if authored_name_at(source_indices: scope.type_env.source_indices, node: rt) == tn { Present { value: rt } } else { none } } @@ -627,7 +627,7 @@ fn record_lit_instantiated_fields(type_name: String?, expected: Node?, scope: In Present { value: tn } => match expected { Present { value: exp } => - if type_node_label(n: exp, source_indices: scope.type_env.source_indices) != tn { + if authored_name_at(source_indices: scope.type_env.source_indices, node: exp) != tn { none } else if exp.children |> count == 0 { none @@ -644,7 +644,7 @@ fn record_lit_instantiated_fields(type_name: String?, expected: Node?, scope: In Absent => acc } ) - let template_fields = decl.children + let template_fields = record_lit_expected_fields(type_name: type_name, scope: scope) Present { value: template_fields |> map(sf => Node { name: sf.name, span: sf.span, ident_span: sf.ident_span, @@ -2984,18 +2984,14 @@ fn infer_record_lit(type_name: String?, field_inits: List, span: SourceSpa match record_lit_instantiated_fields(type_name: type_name, expected: expected, scope: scope) { Present { value: inst_fields } => inst_fields Absent => - match record_lit_fields_from_expected(type_name: type_name, expected: expected, scope: scope) { - Present { value: expected_fields } => expected_fields - Absent => - match lookup_type_by_name(env: scope.type_env, name: tn_str) { - Present { value: decl } => - if decl.connective == Conj && (decl.params |> count) == 0 && (decl.children |> count) > 0 { - decl.children - } else { - [] - } - Absent => record_lit_expected_fields(type_name: type_name, scope: scope) + match lookup_type_by_name(env: scope.type_env, name: tn_str) { + Present { value: decl } => + if decl.connective == Conj && (decl.params |> count) == 0 && (decl.children |> count) > 0 { + decl.children + } else { + [] } + Absent => record_lit_expected_fields(type_name: type_name, scope: scope) } } } diff --git a/src/v1/stage0/src/v1_compiler_infer.rs b/src/v1/stage0/src/v1_compiler_infer.rs index 9e36d99f4b2..bf0417dbbc0 100644 --- a/src/v1/stage0/src/v1_compiler_infer.rs +++ b/src/v1/stage0/src/v1_compiler_infer.rs @@ -981,8 +981,10 @@ pub fn record_lit_expanded_from_expected( match type_name.clone() { Some(tn) => match expected.clone() { Some(exp) => { - if (((type_node_label(exp.clone(), scope.type_env.clone().source_indices.clone()) - == tn.clone()) + if (((authored_name_at( + scope.type_env.clone().source_indices.clone(), + exp.clone(), + ) == tn.clone()) && (exp.connective.clone() == Connective::Conj)) && ((exp.children.clone().len() as i64) > 0)) { @@ -990,9 +992,9 @@ pub fn record_lit_expanded_from_expected( } else { match exp.inferred.clone().as_deref().cloned() { Some(InferredNode::Resolved { node: expanded, .. }) => { - if (type_node_label( - expanded.clone(), + if (authored_name_at( scope.type_env.clone().source_indices.clone(), + expanded.clone(), ) == tn.clone()) { Some(expanded.clone()) @@ -1002,9 +1004,9 @@ pub fn record_lit_expanded_from_expected( } _ => { let rt = resolved_type(exp.clone()); - if (type_node_label( - rt.clone(), + if (authored_name_at( scope.type_env.clone().source_indices.clone(), + rt.clone(), ) == tn.clone()) { Some(rt.clone()) @@ -1048,7 +1050,7 @@ pub fn record_lit_instantiated_fields( match type_name.clone() { Some(tn) => match expected.clone() { Some(exp) => { - if (type_node_label(exp.clone(), scope.type_env.clone().source_indices.clone()) + if (authored_name_at(scope.type_env.clone().source_indices.clone(), exp.clone()) != tn.clone()) { None @@ -1071,7 +1073,10 @@ match exp.children.clone().get(pair.0.clone() as usize).cloned() { None => acc.clone(), } }); - let template_fields = decl.children.clone(); + let template_fields = record_lit_expected_fields( + type_name.clone(), + scope.clone(), + ); Some(Rc::new({ let mut __result = Vec::new(); for sf in template_fields.clone().iter().cloned() { @@ -6023,25 +6028,18 @@ pub fn infer_record_lit( scope.clone(), ) { Some(inst_fields) => inst_fields.clone(), - None => match record_lit_fields_from_expected( - type_name.clone(), - expected.clone(), - scope.clone(), - ) { - Some(expected_fields) => expected_fields.clone(), - None => match lookup_type_by_name(scope.type_env.clone(), tn_str.clone()) { - Some(decl) => { - if (((decl.connective.clone() == Connective::Conj) - && ((decl.params.clone().len() as i64) == 0)) - && ((decl.children.clone().len() as i64) > 0)) - { - decl.children.clone() - } else { - Rc::new(vec![]) - } + None => match lookup_type_by_name(scope.type_env.clone(), tn_str.clone()) { + Some(decl) => { + if (((decl.connective.clone() == Connective::Conj) + && ((decl.params.clone().len() as i64) == 0)) + && ((decl.children.clone().len() as i64) > 0)) + { + decl.children.clone() + } else { + Rc::new(vec![]) } - None => record_lit_expected_fields(type_name.clone(), scope.clone()), - }, + } + None => record_lit_expected_fields(type_name.clone(), scope.clone()), }, }, } From 16e6959941e9c40e50389e5e5a4911f189b41479 Mon Sep 17 00:00:00 2001 From: Brian Searls Date: Thu, 16 Jul 2026 04:34:30 +0000 Subject: [PATCH 08/11] Align infer with main after rebase (drop surviving cherry-pick hunk). Keeps src/v1/04_infer.dag and v1_compiler_infer.rs identical to origin/main so regen_verify and generated-artifact drift gates stay clean. Co-authored-by: Cursor --- src/v1/04_infer.dag | 2 +- src/v1/stage0/src/v1_compiler_infer.rs | 5 +---- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/src/v1/04_infer.dag b/src/v1/04_infer.dag index 2ab10e468ee..c905d92daba 100644 --- a/src/v1/04_infer.dag +++ b/src/v1/04_infer.dag @@ -644,7 +644,7 @@ fn record_lit_instantiated_fields(type_name: String?, expected: Node?, scope: In Absent => acc } ) - let template_fields = record_lit_expected_fields(type_name: type_name, scope: scope) + let template_fields = decl.children Present { value: template_fields |> map(sf => Node { name: sf.name, span: sf.span, ident_span: sf.ident_span, diff --git a/src/v1/stage0/src/v1_compiler_infer.rs b/src/v1/stage0/src/v1_compiler_infer.rs index bf0417dbbc0..2f0192d3791 100644 --- a/src/v1/stage0/src/v1_compiler_infer.rs +++ b/src/v1/stage0/src/v1_compiler_infer.rs @@ -1073,10 +1073,7 @@ match exp.children.clone().get(pair.0.clone() as usize).cloned() { None => acc.clone(), } }); - let template_fields = record_lit_expected_fields( - type_name.clone(), - scope.clone(), - ); + let template_fields = decl.children.clone(); Some(Rc::new({ let mut __result = Vec::new(); for sf in template_fields.clone().iter().cloned() { From ccf87e554ac96563b978fbce2953244cd8dd2dc6 Mon Sep 17 00:00:00 2001 From: Brian Searls Date: Thu, 16 Jul 2026 04:45:15 +0000 Subject: [PATCH 09/11] Regen bootstrap_stage0_crate_layout_generated.rs (trailing-comma drift). main_wet byte-compare caught a hand-merge comma in the last filename entry; aligns bootstrap with stage0_crate_layout_emit output. Co-authored-by: Cursor --- src/v1/stage0/src/bootstrap_stage0_crate_layout_generated.rs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/v1/stage0/src/bootstrap_stage0_crate_layout_generated.rs b/src/v1/stage0/src/bootstrap_stage0_crate_layout_generated.rs index 315fcfecc12..b71803cbca2 100644 --- a/src/v1/stage0/src/bootstrap_stage0_crate_layout_generated.rs +++ b/src/v1/stage0/src/bootstrap_stage0_crate_layout_generated.rs @@ -17,7 +17,10 @@ pub const HAND_MAINTAINED_STAGE0_FILES: &[&str] = &[ "usv_pilot_v2_std_collection.rs", "usv_pilot_v2_std_node.rs", "v2_compiler_discovery_enumeration.rs", +<<<<<<< HEAD "v2_compiler_parse_engine_hooks.rs", +======= +>>>>>>> 2a44a5f0ce (Regen bootstrap_stage0_crate_layout_generated.rs (trailing-comma drift).) "v2_compiler_use_site_verdict.rs" ]; From 964f70537b014e1555341cd5bb916486fea6a6a7 Mon Sep 17 00:00:00 2001 From: Brian Searls Date: Thu, 16 Jul 2026 06:21:49 +0000 Subject: [PATCH 10/11] =?UTF-8?q?WIP:=20Wave=202=20Band=20A=20self-emit:?= =?UTF-8?q?=20discovery=5Fenumeration=20=E2=80=94=20self-emit=20its=20Rust?= =?UTF-8?q?=20via?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/v1/stage0/src/bootstrap_stage0_crate_layout_generated.rs | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/v1/stage0/src/bootstrap_stage0_crate_layout_generated.rs b/src/v1/stage0/src/bootstrap_stage0_crate_layout_generated.rs index b71803cbca2..315fcfecc12 100644 --- a/src/v1/stage0/src/bootstrap_stage0_crate_layout_generated.rs +++ b/src/v1/stage0/src/bootstrap_stage0_crate_layout_generated.rs @@ -17,10 +17,7 @@ pub const HAND_MAINTAINED_STAGE0_FILES: &[&str] = &[ "usv_pilot_v2_std_collection.rs", "usv_pilot_v2_std_node.rs", "v2_compiler_discovery_enumeration.rs", -<<<<<<< HEAD "v2_compiler_parse_engine_hooks.rs", -======= ->>>>>>> 2a44a5f0ce (Regen bootstrap_stage0_crate_layout_generated.rs (trailing-comma drift).) "v2_compiler_use_site_verdict.rs" ]; From 63aa4747cb708723cbf66f4e21f108bc0a8534e0 Mon Sep 17 00:00:00 2001 From: Brian Searls Date: Thu, 16 Jul 2026 07:53:08 +0000 Subject: [PATCH 11/11] =?UTF-8?q?WIP:=20Wave=202=20Band=20A=20self-emit:?= =?UTF-8?q?=20discovery=5Fenumeration=20=E2=80=94=20self-emit=20its=20Rust?= =?UTF-8?q?=20via?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/v2/test/claim/self_host/crate_layout_witness_test.dag | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/v2/test/claim/self_host/crate_layout_witness_test.dag b/src/v2/test/claim/self_host/crate_layout_witness_test.dag index b59da422938..a5f76584b97 100644 --- a/src/v2/test/claim/self_host/crate_layout_witness_test.dag +++ b/src/v2/test/claim/self_host/crate_layout_witness_test.dag @@ -113,10 +113,6 @@ fn witness_hand_maintained_filenames_include_self_emitted_holds() -> Bool { xs: generated_stage0_filenames, needle: "v2_compiler_parse_engine_hooks.rs" ) - && string_list_contains( - xs: generated_stage0_filenames, - needle: "v2_compiler_parse_engine_hooks.rs" - ) && string_list_contains( xs: generated_stage0_filenames, needle: "v2_compiler_discovery_enumeration.rs"