From 8225d2a5046deb78a187ae47fbd3d3bd38d70782 Mon Sep 17 00:00:00 2001 From: Brian Searls Date: Wed, 29 Apr 2026 06:01:12 -0400 Subject: [PATCH 01/40] WIP: calm-hawk-173 --- src/v3/compiler/src/test_runner.rs | 93 +++++++++++++++++++ ...ubstrate_lens_eta_equivalence_deferred.dag | 49 ++++++++++ src/v3/compiler/tests/integration.rs | 2 + .../tests/integration/m1_5_testgen_test.rs | 1 + .../integration/m1_5_verification_test.rs | 8 ++ .../integration/parse_corpus_manifest.txt | 4 +- .../tests/integration/sg0_census_test.rs | 4 + ...rate_lens_eta_equivalence_deferred_test.rs | 82 ++++++++++++++++ src/v3/std/verification.dag | 14 +++ 9 files changed, 255 insertions(+), 2 deletions(-) create mode 100644 src/v3/compiler/tests/fixtures/tc1_substrate_lens_eta_equivalence_deferred.dag create mode 100644 src/v3/compiler/tests/integration/tc1_substrate_lens_eta_equivalence_deferred_test.rs diff --git a/src/v3/compiler/src/test_runner.rs b/src/v3/compiler/src/test_runner.rs index 705d0b0b53d..c2d1d61b28d 100644 --- a/src/v3/compiler/src/test_runner.rs +++ b/src/v3/compiler/src/test_runner.rs @@ -49,6 +49,11 @@ const INFER_HELPERS_SOURCE: &str = include_str!(concat!( "/../lenses/infer_helpers.dag" )); +/// `.dag` path for [`TestPredicate::SubstrateResearchDeferredClaim`] (TC1 / R2 substrate research). +/// The runner fail-closes unless the `TestClaim` is declared in this fixture file. +const TC1_SUBSTRATE_LENS_ETA_DEFERRED_FIXTURE: &str = + "src/v3/compiler/tests/fixtures/tc1_substrate_lens_eta_equivalence_deferred.dag"; + /// Host-written forward fold for structural depth costs (see `src/v3/lenses/complexity.dag`). /// /// T-LaneE `DifferentialEquals` compares this receipt to [`crate::lens_cost::cost_of`] (emit output @@ -1523,6 +1528,9 @@ impl<'a> TestRunner<'a> { "ReleaseDeferredClaim" => { self.eval_release_deferred_claim_shape(claim, &payload) } + "SubstrateResearchDeferredClaim" => { + self.eval_substrate_research_deferred_claim_shape(claim, &payload) + } "MockBackedInvariant" => { if !claim.requires.is_empty() { if let Err(reason) = self.validate_resource_requirements(claim) { @@ -2545,6 +2553,91 @@ impl<'a> TestRunner<'a> { ClaimResult::Pass } + fn eval_substrate_research_deferred_claim_shape( + &self, + claim: &TestClaimValue, + payload: &[FieldValue], + ) -> ClaimResult { + if claim.declaration_file != TC1_SUBSTRATE_LENS_ETA_DEFERRED_FIXTURE { + return ClaimResult::Fail(format!( + "SubstrateResearchDeferredClaim is only valid in `{TC1_SUBSTRATE_LENS_ETA_DEFERRED_FIXTURE}`, got `{}`", + claim.declaration_file + )); + } + + let [deferred_gate, target_lane, authority_doc] = payload else { + return ClaimResult::Fail(format!( + "SubstrateResearchDeferredClaim payload should be exactly three DeclarationRef fields \ + (deferred_gate, target_lane, authority_doc); got {} payload slot(s)", + payload.len() + )); + }; + + for (field_label, value, role_name) in [ + ("deferred_gate", deferred_gate, "Tc1ResearchGateMarker"), + ( + "target_lane", + target_lane, + "SubstrateLensPrimitiveTargetLaneMarker", + ), + ( + "authority_doc", + authority_doc, + "LambdaCalculusGroundingAuthorityDoc", + ), + ] { + let role_id = match self.substrate_research_fixture_local_role_id(role_name) { + Ok(id) => id, + Err(reason) => { + return ClaimResult::Fail(format!("SubstrateResearchDeferredClaim: {reason}")); + } + }; + let id = match self.resolve_declaration_ref_id(value, field_label) { + Ok(id) => id, + Err(reason) => { + return ClaimResult::Fail(format!("SubstrateResearchDeferredClaim: {reason}")); + } + }; + let decl = self.dag.declaration(id); + if decl.span.file != TC1_SUBSTRATE_LENS_ETA_DEFERRED_FIXTURE { + return ClaimResult::Fail(format!( + "SubstrateResearchDeferredClaim `{field_label}` must reference a marker declared in `{TC1_SUBSTRATE_LENS_ETA_DEFERRED_FIXTURE}`, got `{}` from `{}`", + decl_display_name(id, decl), + decl.span.file + )); + } + if !Self::decl_inhabits_role_id(decl, role_id) { + return ClaimResult::Fail(format!( + "SubstrateResearchDeferredClaim `{field_label}` must reference a declaration inhabiting fixture-local `{role_name}`, got `{}`", + decl_display_name(id, decl) + )); + } + } + + ClaimResult::Pass + } + + fn substrate_research_fixture_local_role_id( + &self, + role_name: &str, + ) -> Result { + let mut matches = self.dag.declarations().iter().filter(|decl| { + decl.name.as_deref() == Some(role_name) + && decl.span.file == TC1_SUBSTRATE_LENS_ETA_DEFERRED_FIXTURE + }); + let Some(role) = matches.next() else { + return Err(format!( + "substrate TC1 fixture role `{role_name}` is missing from `{TC1_SUBSTRATE_LENS_ETA_DEFERRED_FIXTURE}`" + )); + }; + if matches.next().is_some() { + return Err(format!( + "substrate TC1 fixture role `{role_name}` is declared more than once in `{TC1_SUBSTRATE_LENS_ETA_DEFERRED_FIXTURE}`" + )); + } + Ok(role.id) + } + fn release_fixture_local_role_id(&self, role_name: &str) -> Result { const RELEASE_ACCEPTANCE_FIXTURE: &str = "src/v3/compiler/tests/fixtures/r1_release_acceptance.dag"; diff --git a/src/v3/compiler/tests/fixtures/tc1_substrate_lens_eta_equivalence_deferred.dag b/src/v3/compiler/tests/fixtures/tc1_substrate_lens_eta_equivalence_deferred.dag new file mode 100644 index 00000000000..07fbca47448 --- /dev/null +++ b/src/v3/compiler/tests/fixtures/tc1_substrate_lens_eta_equivalence_deferred.dag @@ -0,0 +1,49 @@ +// std.tc1_substrate_lens_eta_equivalence_deferred — TC1 (R2 substrate research scope). +// +// Author-now / fire-later structural `TestClaim` for eta-equivalence at substrate +// level vs `Lens` / `DimensionReport`. Design intent: +// - PR #1178 `docs/design-substrate-lambda-calculus-grounding.md` — "eta-equivalence at substrate level" +// - `docs/design-lens-framework.md` — `Lens`, `DimensionReport` +// +// `SubstrateResearchDeferredClaim` is runner-valid only in this file (not R1 +// `r1_release_acceptance.dag` / `ReleaseDeferredClaim`). + +module std.tc1_substrate_lens_eta_equivalence_deferred + +import std.verification { + SubstrateResearchDeferredClaim, + TestClaim, + TestSuite +} + +// TC1 theorem gate (deferred until substrate can apply lenses to eta pairs). +type Tc1ResearchGateMarker {} +data eta_equivalent_dag_forms_yield_identical_lens_results_gate: Tc1ResearchGateMarker = {} + +// T-Substrate-Lens-Primitive target lane (R2; Q6 family). +type SubstrateLensPrimitiveTargetLaneMarker {} +data target_substrate_lens_primitive_tc1: SubstrateLensPrimitiveTargetLaneMarker = {} + +// Lambda-calculus grounding authority surface (substrate-level lambda/eta design). +type LambdaCalculusGroundingAuthorityDoc {} +data lambda_calculus_grounding_substrate_authority: LambdaCalculusGroundingAuthorityDoc = {} + +// Gates on T-Substrate-Lens-Primitive landing (Q6/Q6.5/Q7/Q8 design locks LANDED via #1129; substrate primitive itself in cadence after PR-PreF #1167) +// TC1 — For any Lens, applying it to `f` and to eta-expanded +// `lambda x.apply(f, [x])` yields identical DimensionReport. +data eta_equivalent_dag_forms_yield_identical_lens_results: TestClaim = { + name: "eta_equivalent_dag_forms_yield_identical_lens_results", + source: "// TC1 deferred theorem marker; no program evaluation.\nlet _: Int = 0\n", + file_name: "tc1_eta_equivalent_dag_forms_yield_identical_lens_results.v3", + predicate: SubstrateResearchDeferredClaim { + deferred_gate: eta_equivalent_dag_forms_yield_identical_lens_results_gate, + target_lane: target_substrate_lens_primitive_tc1, + authority_doc: lambda_calculus_grounding_substrate_authority + }, + requires: [] +} + +data tc1_substrate_lens_eta_equivalence_suite: TestSuite = { + name: "tc1_substrate_lens_eta_equivalence_suite", + claims: [eta_equivalent_dag_forms_yield_identical_lens_results] +} diff --git a/src/v3/compiler/tests/integration.rs b/src/v3/compiler/tests/integration.rs index 19b4dbbb579..203c98b4e75 100644 --- a/src/v3/compiler/tests/integration.rs +++ b/src/v3/compiler/tests/integration.rs @@ -159,6 +159,8 @@ mod t_impossiblebugs_unenumerated_effects_test; mod t_pb_b_1_dag_runner_test; #[path = "integration/t_pb_b_brief_d_fixture_smoke_test.rs"] mod t_pb_b_brief_d_fixture_smoke_test; +#[path = "integration/tc1_substrate_lens_eta_equivalence_deferred_test.rs"] +mod tc1_substrate_lens_eta_equivalence_deferred_test; #[path = "integration/test_runner_test.rs"] mod test_runner_test; #[path = "integration/thesis_parallelism_test.rs"] diff --git a/src/v3/compiler/tests/integration/m1_5_testgen_test.rs b/src/v3/compiler/tests/integration/m1_5_testgen_test.rs index 44e861a1f46..ea653e9399b 100644 --- a/src/v3/compiler/tests/integration/m1_5_testgen_test.rs +++ b/src/v3/compiler/tests/integration/m1_5_testgen_test.rs @@ -354,6 +354,7 @@ fn predicate_holds( "LensOutputEquals" => runner_deferred_panic("LensOutputEquals"), "DifferentialEquals" => runner_deferred_panic("DifferentialEquals"), "ReleaseDeferredClaim" => runner_deferred_panic("ReleaseDeferredClaim"), + "SubstrateResearchDeferredClaim" => runner_deferred_panic("SubstrateResearchDeferredClaim"), "AlgebraicLaw" => { let inner = match cached_compile_outcome(source, file_name) { CachedCompileOutcome::Clean(dag) => dag, diff --git a/src/v3/compiler/tests/integration/m1_5_verification_test.rs b/src/v3/compiler/tests/integration/m1_5_verification_test.rs index 3401bc7a0c0..9e30b1472ae 100644 --- a/src/v3/compiler/tests/integration/m1_5_verification_test.rs +++ b/src/v3/compiler/tests/integration/m1_5_verification_test.rs @@ -224,6 +224,14 @@ fn bootstrap_loads_verification_authority_types() { String::from("authority_doc"), ], ), + ( + String::from("SubstrateResearchDeferredClaim"), + vec![ + String::from("deferred_gate"), + String::from("target_lane"), + String::from("authority_doc"), + ], + ), ] ); } diff --git a/src/v3/compiler/tests/integration/parse_corpus_manifest.txt b/src/v3/compiler/tests/integration/parse_corpus_manifest.txt index 5756c282c8c..0ec5a2f64e6 100644 --- a/src/v3/compiler/tests/integration/parse_corpus_manifest.txt +++ b/src/v3/compiler/tests/integration/parse_corpus_manifest.txt @@ -29,7 +29,7 @@ src/v3/std/diagnostics.dag 10 12179 bc414c493551b464 src/v3/std/dimensions.dag 21 40239 d595746d2bda22f6 src/v3/std/effects.dag 53 97984 1acdbeaa68acfd2e src/v3/std/emit_model.dag 34 65593 49cc4eb1f1faadcd -src/v3/std/extdeps_bootstrap_fixtures.dag 4 4912 e2b6d96f5900a70a +src/v3/std/extdeps_bootstrap_fixtures.dag 4 12175 6deea03a77be5cf3 src/v3/std/induction.dag 56 88794 546f74c63c189c50 src/v3/std/lens.dag 6 9852 28d5539a5b28716e src/v3/std/list.dag 19 40269 8c648d4a4fd05c21 @@ -40,5 +40,5 @@ src/v3/std/substrate.dag 57 124531 9d03ca981cab59c3 src/v3/std/substrate_minimal.dag 8 5372 feeb314c735f4672 src/v3/std/termination.dag 18 36478 d010232f0373dc99 src/v3/std/tokenize.dag 8 38819 2e158a74f33c18cc -src/v3/std/verification.dag 29 61103 1783953091ac80db +src/v3/std/verification.dag 29 63198 3a003447ed1d0797 src/v3/std/workflows.dag 4 3135 bb6f9b042a02e8d6 diff --git a/src/v3/compiler/tests/integration/sg0_census_test.rs b/src/v3/compiler/tests/integration/sg0_census_test.rs index 39d6bd6439f..400651679d7 100644 --- a/src/v3/compiler/tests/integration/sg0_census_test.rs +++ b/src/v3/compiler/tests/integration/sg0_census_test.rs @@ -345,6 +345,10 @@ const EXPECTED_HAND_AUTHORED_TEST: &[&str] = &[ "src/v3/compiler/tests/integration/t_impossiblebugs_unenumerated_effects_test.rs", "src/v3/compiler/tests/integration/t_pb_b_1_dag_runner_test.rs", "src/v3/compiler/tests/integration/t_pb_b_brief_d_fixture_smoke_test.rs", + // TC1 substrate lens eta-equivalence (deferred / R2 research): integration for + // `SubstrateResearchDeferredClaim` + `tc1_substrate_lens_eta_equivalence_deferred.dag`. + // SG-0 path ratchet: Director sign-off (gunb-ai/gunbc#1130, comment 4341571168). + "src/v3/compiler/tests/integration/tc1_substrate_lens_eta_equivalence_deferred_test.rs", "src/v3/compiler/tests/integration/test_runner_test.rs", "src/v3/compiler/tests/integration/thesis_parallelism_test.rs", "src/v3/compiler/tests/integration/thesis_validation_test.rs", diff --git a/src/v3/compiler/tests/integration/tc1_substrate_lens_eta_equivalence_deferred_test.rs b/src/v3/compiler/tests/integration/tc1_substrate_lens_eta_equivalence_deferred_test.rs new file mode 100644 index 00000000000..48780b41b3f --- /dev/null +++ b/src/v3/compiler/tests/integration/tc1_substrate_lens_eta_equivalence_deferred_test.rs @@ -0,0 +1,82 @@ +//! **Layer:** integration +//! +//! TC1 substrate lens eta-equivalence — `SubstrateResearchDeferredClaim` is scoped to +//! `tc1_substrate_lens_eta_equivalence_deferred.dag` (R2 research), not R1 release acceptance. + +use v3_compiler::compile_to_dag; +use v3_compiler::test_runner::{ClaimResult, TestRunner}; +use v3_compiler::CompileError; + +const FIXTURE_SOURCE: &str = + include_str!("../fixtures/tc1_substrate_lens_eta_equivalence_deferred.dag"); +const FIXTURE_PATH: &str = + "src/v3/compiler/tests/fixtures/tc1_substrate_lens_eta_equivalence_deferred.dag"; +const SUITE_NAME: &str = "tc1_substrate_lens_eta_equivalence_suite"; + +#[test] +fn tc1_substrate_lens_eta_suite_passes_at_head() { + let dag = match compile_to_dag(FIXTURE_SOURCE, FIXTURE_PATH) { + Ok(dag) => { + assert!( + dag.diagnostics().is_empty(), + "{FIXTURE_PATH}: expected empty module diagnostics, got {:?}", + dag.diagnostics().iter().collect::>() + ); + dag + } + Err(CompileError::Semantic(dag)) => panic!( + "{FIXTURE_PATH} should lower without module diagnostics. Got `Err(Semantic)`: {:?}", + dag.diagnostics().iter().collect::>() + ), + Err(other) => panic!("unexpected compile error for {FIXTURE_PATH}: {other:?}"), + }; + + let results = TestRunner::new(&dag).run_suite(SUITE_NAME); + assert_eq!(results.len(), 1); + assert_eq!( + results[0].claim_name, + "eta_equivalent_dag_forms_yield_identical_lens_results" + ); + assert_eq!(results[0].result, ClaimResult::Pass); +} + +#[test] +fn substrate_research_deferred_claim_rejects_well_typed_refs_outside_tc1_fixture() { + let source = r##" +import std.verification { SubstrateResearchDeferredClaim, TestClaim, TestSuite } + +type Tc1ResearchGateMarker {} +type SubstrateLensPrimitiveTargetLaneMarker {} +type LambdaCalculusGroundingAuthorityDoc {} + +data gate_marker: Tc1ResearchGateMarker = {} +data target_lane_marker: SubstrateLensPrimitiveTargetLaneMarker = {} +data authority_doc: LambdaCalculusGroundingAuthorityDoc = {} + +data bad_deferred_claim: TestClaim = { + name: "bad_deferred", + source: "let _: Int = 0", + file_name: "bad_deferred.v3", + predicate: SubstrateResearchDeferredClaim { + deferred_gate: gate_marker, + target_lane: target_lane_marker, + authority_doc: authority_doc + }, + requires: [] +} + +data suite: TestSuite = { + name: "bad_suite", + claims: [bad_deferred_claim] +} +"##; + let dag = compile_to_dag(source, "arbitrary_substrate_research_deferred_claim.dag") + .expect("well-typed deferral fixture compiles structurally"); + let results = TestRunner::new(&dag).run_suite("suite"); + + assert_eq!(results.len(), 1); + assert!( + matches!(&results[0].result, ClaimResult::Fail(_)), + "expected SubstrateResearchDeferredClaim to fail outside TC1 fixture, got {results:?}" + ); +} diff --git a/src/v3/std/verification.dag b/src/v3/std/verification.dag index b65e595a95f..12b294e204c 100644 --- a/src/v3/std/verification.dag +++ b/src/v3/std/verification.dag @@ -233,6 +233,20 @@ type TestPredicate target_lane: DeclarationRef authority_doc: DeclarationRef } + // **🟡 Scaffold — SubstrateResearchDeferredClaim.** R2 substrate / TC1 research + // deferral marker — distinct from R1 `ReleaseDeferredClaim` release authority. + // The runner accepts this predicate only for claims declared in + // `src/v3/compiler/tests/fixtures/tc1_substrate_lens_eta_equivalence_deferred.dag` + // and requires `DeclarationRef` edges to fixture-local role types + // `Tc1ResearchGateMarker`, `SubstrateLensPrimitiveTargetLaneMarker`, and + // `LambdaCalculusGroundingAuthorityDoc`. + // Dissolution trigger: replace with a strict lens/substrate theorem claim when + // T-Substrate-Lens-Primitive lands. + | SubstrateResearchDeferredClaim { + deferred_gate: DeclarationRef + target_lane: DeclarationRef + authority_doc: DeclarationRef + } // Structural runner input role for predicates whose input is the compiled // `TestClaim.source` program. From b78a4efdc9071c6f3ad06fd553cc14bade28d55a Mon Sep 17 00:00:00 2001 From: Brian Searls Date: Wed, 29 Apr 2026 05:34:01 -0400 Subject: [PATCH 02/40] WIP: calm-hawk-173 --- src/v3/compiler/src/bootstrap_generated.rs | 107 +++++++++--------- ...otstrap_generated_without_parse_surface.rs | 107 +++++++++--------- 2 files changed, 108 insertions(+), 106 deletions(-) diff --git a/src/v3/compiler/src/bootstrap_generated.rs b/src/v3/compiler/src/bootstrap_generated.rs index eb5c6b465de..6574aa1b995 100644 --- a/src/v3/compiler/src/bootstrap_generated.rs +++ b/src/v3/compiler/src/bootstrap_generated.rs @@ -942,16 +942,16 @@ pub(crate) fn bootstrapped_fixture_dag() -> Dag { Declaration { id: DeclarationId(934), name: Some("DiagnosticReference".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "kind".to_string(), ty: DeclarationId(932) }, Field { label: "detail_contains".to_string(), ty: DeclarationId(933) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 3138, 3236) }, Declaration { id: DeclarationId(935), name: Some("PortStateExpectation".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Resolved".to_string(), ty: DeclarationId(1977) }, Field { label: "Unresolved".to_string(), ty: DeclarationId(1978) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 3623, 3676) }, Declaration { id: DeclarationId(936), name: Some("AlgebraicLawKind".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Associativity".to_string(), ty: DeclarationId(1979) }, Field { label: "Commutativity".to_string(), ty: DeclarationId(1980) }, Field { label: "Identity".to_string(), ty: DeclarationId(1981) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 4465, 4535) }, - Declaration { id: DeclarationId(937), name: Some("TestPredicate".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Compiles".to_string(), ty: DeclarationId(1982) }, Field { label: "FailsWithDiagnostic".to_string(), ty: DeclarationId(1983) }, Field { label: "OutputEquals".to_string(), ty: DeclarationId(1984) }, Field { label: "PortHasState".to_string(), ty: DeclarationId(1985) }, Field { label: "DeclarationHasRefinement".to_string(), ty: DeclarationId(1986) }, Field { label: "CostBounded".to_string(), ty: DeclarationId(1987) }, Field { label: "BehavioralObservation".to_string(), ty: DeclarationId(1988) }, Field { label: "MockBackedInvariant".to_string(), ty: DeclarationId(1989) }, Field { label: "ExecuteCommand".to_string(), ty: DeclarationId(1991) }, Field { label: "ForAllTargets".to_string(), ty: DeclarationId(1993) }, Field { label: "LensOutputEquals".to_string(), ty: DeclarationId(1994) }, Field { label: "DifferentialEquals".to_string(), ty: DeclarationId(1995) }, Field { label: "AlgebraicLaw".to_string(), ty: DeclarationId(1996) }, Field { label: "CensusBoundCheck".to_string(), ty: DeclarationId(1997) }, Field { label: "CensusSubsetCount".to_string(), ty: DeclarationId(1998) }, Field { label: "FixedPointConverges".to_string(), ty: DeclarationId(1999) }, Field { label: "RatchetZero".to_string(), ty: DeclarationId(2000) }, Field { label: "GeneratedFromDag".to_string(), ty: DeclarationId(2002) }, Field { label: "ReleaseDeferredClaim".to_string(), ty: DeclarationId(2003) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 4537, 10397) }, - Declaration { id: DeclarationId(938), name: Some("ProgramInput".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 10505, 10525) }, - Declaration { id: DeclarationId(939), name: Some("ProgramOutputBind".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "output_ref".to_string(), ty: DeclarationId(953) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 10668, 10723) }, - Declaration { id: DeclarationId(940), name: Some("TestClaim".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "name".to_string(), ty: DeclarationId(186) }, Field { label: "source".to_string(), ty: DeclarationId(186) }, Field { label: "file_name".to_string(), ty: DeclarationId(186) }, Field { label: "predicate".to_string(), ty: DeclarationId(937) }, Field { label: "requires".to_string(), ty: DeclarationId(2004) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 11333, 11466) }, - Declaration { id: DeclarationId(941), name: Some("TestSuite".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "name".to_string(), ty: DeclarationId(186) }, Field { label: "claims".to_string(), ty: DeclarationId(2005) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 11468, 11527) }, - Declaration { id: DeclarationId(942), name: Some("TestObligation".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "claim_name".to_string(), ty: DeclarationId(186) }, Field { label: "resources".to_string(), ty: DeclarationId(2006) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 11725, 11806) }, - Declaration { id: DeclarationId(943), name: Some("claim_obligation_resources".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(940)], output: DeclarationId(1965), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/verification.dag", 12248, 12264)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 12177, 12264) }, - Declaration { id: DeclarationId(944), name: Some("obligation_for_claim".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(940)], output: DeclarationId(942), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/verification.dag", 12322, 12407)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 12266, 12407) }, - Declaration { id: DeclarationId(945), name: Some("materialize_test_obligations".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1966)], output: DeclarationId(1967), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/verification.dag", 12490, 12529)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 12409, 12529) }, - Declaration { id: DeclarationId(946), name: Some("behavior_spine".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(667)], output: DeclarationId(2007), body: ArrowBody::UserDefined(NodeId(236)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/workflows.dag", 963, 1018) }, + Declaration { id: DeclarationId(937), name: Some("TestPredicate".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Compiles".to_string(), ty: DeclarationId(1982) }, Field { label: "FailsWithDiagnostic".to_string(), ty: DeclarationId(1983) }, Field { label: "OutputEquals".to_string(), ty: DeclarationId(1984) }, Field { label: "PortHasState".to_string(), ty: DeclarationId(1985) }, Field { label: "DeclarationHasRefinement".to_string(), ty: DeclarationId(1986) }, Field { label: "CostBounded".to_string(), ty: DeclarationId(1987) }, Field { label: "BehavioralObservation".to_string(), ty: DeclarationId(1988) }, Field { label: "MockBackedInvariant".to_string(), ty: DeclarationId(1989) }, Field { label: "ExecuteCommand".to_string(), ty: DeclarationId(1991) }, Field { label: "ForAllTargets".to_string(), ty: DeclarationId(1993) }, Field { label: "LensOutputEquals".to_string(), ty: DeclarationId(1994) }, Field { label: "DifferentialEquals".to_string(), ty: DeclarationId(1995) }, Field { label: "AlgebraicLaw".to_string(), ty: DeclarationId(1996) }, Field { label: "CensusBoundCheck".to_string(), ty: DeclarationId(1997) }, Field { label: "CensusSubsetCount".to_string(), ty: DeclarationId(1998) }, Field { label: "FixedPointConverges".to_string(), ty: DeclarationId(1999) }, Field { label: "RatchetZero".to_string(), ty: DeclarationId(2000) }, Field { label: "GeneratedFromDag".to_string(), ty: DeclarationId(2002) }, Field { label: "ReleaseDeferredClaim".to_string(), ty: DeclarationId(2003) }, Field { label: "SubstrateResearchDeferredClaim".to_string(), ty: DeclarationId(2004) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 4537, 11180) }, + Declaration { id: DeclarationId(938), name: Some("ProgramInput".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 11288, 11308) }, + Declaration { id: DeclarationId(939), name: Some("ProgramOutputBind".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "output_ref".to_string(), ty: DeclarationId(953) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 11451, 11506) }, + Declaration { id: DeclarationId(940), name: Some("TestClaim".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "name".to_string(), ty: DeclarationId(186) }, Field { label: "source".to_string(), ty: DeclarationId(186) }, Field { label: "file_name".to_string(), ty: DeclarationId(186) }, Field { label: "predicate".to_string(), ty: DeclarationId(937) }, Field { label: "requires".to_string(), ty: DeclarationId(2005) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 12116, 12249) }, + Declaration { id: DeclarationId(941), name: Some("TestSuite".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "name".to_string(), ty: DeclarationId(186) }, Field { label: "claims".to_string(), ty: DeclarationId(2006) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 12251, 12310) }, + Declaration { id: DeclarationId(942), name: Some("TestObligation".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "claim_name".to_string(), ty: DeclarationId(186) }, Field { label: "resources".to_string(), ty: DeclarationId(2007) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 12508, 12589) }, + Declaration { id: DeclarationId(943), name: Some("claim_obligation_resources".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(940)], output: DeclarationId(1965), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/verification.dag", 13031, 13047)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 12960, 13047) }, + Declaration { id: DeclarationId(944), name: Some("obligation_for_claim".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(940)], output: DeclarationId(942), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/verification.dag", 13105, 13190)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 13049, 13190) }, + Declaration { id: DeclarationId(945), name: Some("materialize_test_obligations".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1966)], output: DeclarationId(1967), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/verification.dag", 13273, 13312)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 13192, 13312) }, + Declaration { id: DeclarationId(946), name: Some("behavior_spine".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(667)], output: DeclarationId(2008), body: ArrowBody::UserDefined(NodeId(236)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/workflows.dag", 963, 1018) }, Declaration { id: DeclarationId(947), name: Some("Value".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/v3_l1.dag", 2788, 2801) }, Declaration { id: DeclarationId(948), name: Some("Transform".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/v3_l1.dag", 2802, 2819) }, Declaration { id: DeclarationId(949), name: Some("Branch".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/v3_l1.dag", 2820, 2834) }, @@ -1291,7 +1291,7 @@ pub(crate) fn bootstrapped_fixture_dag() -> Dag { Declaration { id: DeclarationId(1283), name: Some("rust_declaration_by_id_accessor".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(668), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(668)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({p0}).declaration_opt({p1}).cloned()".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 43898, 44021) }, Declaration { id: DeclarationId(1284), name: Some("declaration_by_id_binding_rust".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(669), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(669)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("accessor".to_string(), FieldValue::Reference(DeclarationId(673))), ("realization".to_string(), FieldValue::Reference(DeclarationId(1283))), ("language".to_string(), FieldValue::Reference(DeclarationId(1271)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 44023, 44193) }, Declaration { id: DeclarationId(1285), name: Some("CompilerHostRealization".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "symbol".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 453, 502) }, - Declaration { id: DeclarationId(1286), name: Some("PipelineSnapshotKind".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "SnapshotSurface".to_string(), ty: DeclarationId(2008) }, Field { label: "SnapshotDag".to_string(), ty: DeclarationId(2009) }, Field { label: "SnapshotText".to_string(), ty: DeclarationId(2010) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 504, 576) }, + Declaration { id: DeclarationId(1286), name: Some("PipelineSnapshotKind".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "SnapshotSurface".to_string(), ty: DeclarationId(2009) }, Field { label: "SnapshotDag".to_string(), ty: DeclarationId(2010) }, Field { label: "SnapshotText".to_string(), ty: DeclarationId(2011) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 504, 576) }, Declaration { id: DeclarationId(1287), name: Some("PipelineStageBinding".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "stage".to_string(), ty: DeclarationId(953) }, Field { label: "realization".to_string(), ty: DeclarationId(953) }, Field { label: "snapshot".to_string(), ty: DeclarationId(1286) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 578, 694) }, Declaration { id: DeclarationId(1288), name: Some("parse_realization".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "symbol".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1285)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("symbol".to_string(), FieldValue::Literal(LiteralBits::String("v3_compiler::parse".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 696, 780) }, Declaration { id: DeclarationId(1289), name: Some("lower_realization".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "symbol".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1285)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("symbol".to_string(), FieldValue::Literal(LiteralBits::String("v3_compiler::lower".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 782, 866) }, @@ -1299,12 +1299,12 @@ pub(crate) fn bootstrapped_fixture_dag() -> Dag { Declaration { id: DeclarationId(1291), name: Some("compute_ownership_realization".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "symbol".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1285)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("symbol".to_string(), FieldValue::Literal(LiteralBits::String("v3_compiler::compute_ownership".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 954, 1062) }, Declaration { id: DeclarationId(1292), name: Some("emit_realization".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "symbol".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1285)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("symbol".to_string(), FieldValue::Literal(LiteralBits::String("v3_compiler::emit".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 1064, 1146) }, Declaration { id: DeclarationId(1293), name: Some("lens_complexity_realization".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "symbol".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1285)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("symbol".to_string(), FieldValue::Literal(LiteralBits::String("v3_compiler::lens_complexity".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 1148, 1252) }, - Declaration { id: DeclarationId(1294), name: Some("parse_stage_binding".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(1287), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1287)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("stage".to_string(), FieldValue::Reference(DeclarationId(1300))), ("realization".to_string(), FieldValue::Reference(DeclarationId(1288))), ("snapshot".to_string(), FieldValue::Variant { constructor: DeclarationId(2008), payload: vec![] })] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 1254, 1382) }, - Declaration { id: DeclarationId(1295), name: Some("lower_stage_binding".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(1287), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1287)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("stage".to_string(), FieldValue::Reference(DeclarationId(1301))), ("realization".to_string(), FieldValue::Reference(DeclarationId(1289))), ("snapshot".to_string(), FieldValue::Variant { constructor: DeclarationId(2009), payload: vec![] })] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 1384, 1508) }, - Declaration { id: DeclarationId(1296), name: Some("infer_stage_binding".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(1287), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1287)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("stage".to_string(), FieldValue::Reference(DeclarationId(1302))), ("realization".to_string(), FieldValue::Reference(DeclarationId(1290))), ("snapshot".to_string(), FieldValue::Variant { constructor: DeclarationId(2009), payload: vec![] })] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 1510, 1634) }, - Declaration { id: DeclarationId(1297), name: Some("compute_ownership_stage_binding".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(1287), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1287)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("stage".to_string(), FieldValue::Reference(DeclarationId(1303))), ("realization".to_string(), FieldValue::Reference(DeclarationId(1291))), ("snapshot".to_string(), FieldValue::Variant { constructor: DeclarationId(2009), payload: vec![] })] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 1636, 1796) }, - Declaration { id: DeclarationId(1298), name: Some("lens_complexity_stage_binding".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(1287), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1287)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("stage".to_string(), FieldValue::Reference(DeclarationId(1304))), ("realization".to_string(), FieldValue::Reference(DeclarationId(1293))), ("snapshot".to_string(), FieldValue::Variant { constructor: DeclarationId(2009), payload: vec![] })] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 1798, 1952) }, - Declaration { id: DeclarationId(1299), name: Some("emit_stage_binding".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(1287), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1287)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("stage".to_string(), FieldValue::Reference(DeclarationId(1305))), ("realization".to_string(), FieldValue::Reference(DeclarationId(1292))), ("snapshot".to_string(), FieldValue::Variant { constructor: DeclarationId(2010), payload: vec![] })] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 1954, 2076) }, + Declaration { id: DeclarationId(1294), name: Some("parse_stage_binding".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(1287), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1287)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("stage".to_string(), FieldValue::Reference(DeclarationId(1300))), ("realization".to_string(), FieldValue::Reference(DeclarationId(1288))), ("snapshot".to_string(), FieldValue::Variant { constructor: DeclarationId(2009), payload: vec![] })] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 1254, 1382) }, + Declaration { id: DeclarationId(1295), name: Some("lower_stage_binding".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(1287), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1287)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("stage".to_string(), FieldValue::Reference(DeclarationId(1301))), ("realization".to_string(), FieldValue::Reference(DeclarationId(1289))), ("snapshot".to_string(), FieldValue::Variant { constructor: DeclarationId(2010), payload: vec![] })] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 1384, 1508) }, + Declaration { id: DeclarationId(1296), name: Some("infer_stage_binding".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(1287), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1287)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("stage".to_string(), FieldValue::Reference(DeclarationId(1302))), ("realization".to_string(), FieldValue::Reference(DeclarationId(1290))), ("snapshot".to_string(), FieldValue::Variant { constructor: DeclarationId(2010), payload: vec![] })] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 1510, 1634) }, + Declaration { id: DeclarationId(1297), name: Some("compute_ownership_stage_binding".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(1287), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1287)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("stage".to_string(), FieldValue::Reference(DeclarationId(1303))), ("realization".to_string(), FieldValue::Reference(DeclarationId(1291))), ("snapshot".to_string(), FieldValue::Variant { constructor: DeclarationId(2010), payload: vec![] })] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 1636, 1796) }, + Declaration { id: DeclarationId(1298), name: Some("lens_complexity_stage_binding".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(1287), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1287)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("stage".to_string(), FieldValue::Reference(DeclarationId(1304))), ("realization".to_string(), FieldValue::Reference(DeclarationId(1293))), ("snapshot".to_string(), FieldValue::Variant { constructor: DeclarationId(2010), payload: vec![] })] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 1798, 1952) }, + Declaration { id: DeclarationId(1299), name: Some("emit_stage_binding".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(1287), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1287)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("stage".to_string(), FieldValue::Reference(DeclarationId(1305))), ("realization".to_string(), FieldValue::Reference(DeclarationId(1292))), ("snapshot".to_string(), FieldValue::Variant { constructor: DeclarationId(2011), payload: vec![] })] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 1954, 2076) }, Declaration { id: DeclarationId(1300), name: Some("parse".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(186), DeclarationId(186)], output: DeclarationId(667), body: ArrowBody::ExternalRealization(DeclarationId(1288)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 2078, 2140) }, Declaration { id: DeclarationId(1301), name: Some("lower".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(667)], output: DeclarationId(667), body: ArrowBody::ExternalRealization(DeclarationId(1289)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 2142, 2184) }, Declaration { id: DeclarationId(1302), name: Some("infer".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(667)], output: DeclarationId(667), body: ArrowBody::ExternalRealization(DeclarationId(1290)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 2186, 2228) }, @@ -1312,7 +1312,7 @@ pub(crate) fn bootstrapped_fixture_dag() -> Dag { Declaration { id: DeclarationId(1304), name: Some("lens_complexity".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(667)], output: DeclarationId(667), body: ArrowBody::ExternalRealization(DeclarationId(1293)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 2290, 2347) }, Declaration { id: DeclarationId(1305), name: Some("emit".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(667), DeclarationId(667), DeclarationId(667), DeclarationId(818)], output: DeclarationId(186), body: ArrowBody::ExternalRealization(DeclarationId(1292)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 2349, 2460) }, Declaration { id: DeclarationId(1306), name: Some("compile".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(186), DeclarationId(186), DeclarationId(818)], output: DeclarationId(186), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/compiler/pipeline.dag", 2533, 2605)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 2462, 2605) }, - Declaration { id: DeclarationId(1307), name: Some("from_symbol".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(186)], output: DeclarationId(2011), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/compiler/operators.dag", 156, 771)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/operators.dag", 108, 771) }, + Declaration { id: DeclarationId(1307), name: Some("from_symbol".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(186)], output: DeclarationId(2012), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/compiler/operators.dag", 156, 771)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/operators.dag", 108, 771) }, Declaration { id: DeclarationId(1308), name: Some("symbol".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(646)], output: DeclarationId(186), body: ArrowBody::UserDefined(NodeId(253)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/operators.dag", 773, 1214) }, Declaration { id: DeclarationId(1309), name: Some("algebra_field_name".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(646)], output: DeclarationId(186), body: ArrowBody::UserDefined(NodeId(270)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/operators.dag", 1216, 2017) }, Declaration { id: DeclarationId(1310), name: Some("LensRegistryEntry".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "name".to_string(), ty: DeclarationId(111) }, Field { label: "lens_file".to_string(), ty: DeclarationId(120) }, Field { label: "generated_file".to_string(), ty: DeclarationId(120) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/regen.dag", 1950, 2045) }, @@ -1325,12 +1325,12 @@ pub(crate) fn bootstrapped_fixture_dag() -> Dag { Declaration { id: DeclarationId(1317), name: Some("lens_infer_helpers_entry".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(1310), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1310)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("infer_helpers".to_string()))), ("lens_file".to_string(), FieldValue::Literal(LiteralBits::String("src/v3/lenses/infer_helpers.dag".to_string()))), ("generated_file".to_string(), FieldValue::Literal(LiteralBits::String("src/v3/compiler/src/infer_helpers_generated.rs".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/regen.dag", 3883, 4075) }, Declaration { id: DeclarationId(1318), name: Some("lens_variant_payload_entry".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(1310), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1310)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("variant_payload".to_string()))), ("lens_file".to_string(), FieldValue::Literal(LiteralBits::String("src/v3/lenses/variant_payload.dag".to_string()))), ("generated_file".to_string(), FieldValue::Literal(LiteralBits::String("src/v3/compiler/src/variant_payload_generated.rs".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/regen.dag", 4077, 4277) }, Declaration { id: DeclarationId(1319), name: Some("lens_lower_helpers_entry".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(1310), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1310)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("lower_helpers".to_string()))), ("lens_file".to_string(), FieldValue::Literal(LiteralBits::String("src/v3/lenses/lower_helpers.dag".to_string()))), ("generated_file".to_string(), FieldValue::Literal(LiteralBits::String("src/v3/compiler/src/lower_helpers_generated.rs".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/regen.dag", 4527, 4719) }, - Declaration { id: DeclarationId(1320), name: Some("IntegerAlgebra".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "OrderedRingAlgebra".to_string(), ty: DeclarationId(2012) }, Field { label: "SemiringAlgebra".to_string(), ty: DeclarationId(2013) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 5230, 5292) }, - Declaration { id: DeclarationId(1321), name: Some("NonIntegerAlgebra".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "BooleanAlgebraAlgebra".to_string(), ty: DeclarationId(2014) }, Field { label: "TerminalAlgebra".to_string(), ty: DeclarationId(2015) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 5294, 5362) }, - Declaration { id: DeclarationId(1322), name: Some("TargetCarrier".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "BitCarrier".to_string(), ty: DeclarationId(2016) }, Field { label: "ByteCarrier".to_string(), ty: DeclarationId(2017) }, Field { label: "Word16Carrier".to_string(), ty: DeclarationId(2018) }, Field { label: "Word32Carrier".to_string(), ty: DeclarationId(2019) }, Field { label: "Word64Carrier".to_string(), ty: DeclarationId(2020) }, Field { label: "TerminalCarrier".to_string(), ty: DeclarationId(2021) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 6852, 6975) }, - Declaration { id: DeclarationId(1323), name: Some("IntegerOverflow".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "TwoComplementWrap".to_string(), ty: DeclarationId(2022) }, Field { label: "Saturating".to_string(), ty: DeclarationId(2023) }, Field { label: "Trap".to_string(), ty: DeclarationId(2024) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 7692, 7758) }, - Declaration { id: DeclarationId(1324), name: Some("RustPrimitive".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "IntegerPrimitive".to_string(), ty: DeclarationId(2025) }, Field { label: "NonIntegerPrimitive".to_string(), ty: DeclarationId(2026) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 8513, 9295) }, - Declaration { id: DeclarationId(1325), name: Some("rust_pilot_primitives".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(530), arguments: vec![TemplateArgument { parameter: DeclarationId(531), value: DeclarationId(1324) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(2027)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::List(vec![FieldValue::Variant { constructor: DeclarationId(2025), payload: vec![FieldValue::Literal(LiteralBits::String("i8".to_string())), FieldValue::Variant { constructor: DeclarationId(2012), payload: vec![] }, FieldValue::Variant { constructor: DeclarationId(2017), payload: vec![] }, FieldValue::Literal(LiteralBits::String("-128".to_string())), FieldValue::Literal(LiteralBits::String("127".to_string())), FieldValue::Literal(LiteralBits::Bool(true)), FieldValue::Variant { constructor: DeclarationId(2022), payload: vec![] }] }, FieldValue::Variant { constructor: DeclarationId(2025), payload: vec![FieldValue::Literal(LiteralBits::String("i16".to_string())), FieldValue::Variant { constructor: DeclarationId(2012), payload: vec![] }, FieldValue::Variant { constructor: DeclarationId(2018), payload: vec![] }, FieldValue::Literal(LiteralBits::String("-32768".to_string())), FieldValue::Literal(LiteralBits::String("32767".to_string())), FieldValue::Literal(LiteralBits::Bool(true)), FieldValue::Variant { constructor: DeclarationId(2022), payload: vec![] }] }, FieldValue::Variant { constructor: DeclarationId(2025), payload: vec![FieldValue::Literal(LiteralBits::String("i32".to_string())), FieldValue::Variant { constructor: DeclarationId(2012), payload: vec![] }, FieldValue::Variant { constructor: DeclarationId(2019), payload: vec![] }, FieldValue::Literal(LiteralBits::String("-2147483648".to_string())), FieldValue::Literal(LiteralBits::String("2147483647".to_string())), FieldValue::Literal(LiteralBits::Bool(true)), FieldValue::Variant { constructor: DeclarationId(2022), payload: vec![] }] }, FieldValue::Variant { constructor: DeclarationId(2025), payload: vec![FieldValue::Literal(LiteralBits::String("i64".to_string())), FieldValue::Variant { constructor: DeclarationId(2012), payload: vec![] }, FieldValue::Variant { constructor: DeclarationId(2020), payload: vec![] }, FieldValue::Literal(LiteralBits::String("-9223372036854775808".to_string())), FieldValue::Literal(LiteralBits::String("9223372036854775807".to_string())), FieldValue::Literal(LiteralBits::Bool(true)), FieldValue::Variant { constructor: DeclarationId(2022), payload: vec![] }] }, FieldValue::Variant { constructor: DeclarationId(2025), payload: vec![FieldValue::Literal(LiteralBits::String("u8".to_string())), FieldValue::Variant { constructor: DeclarationId(2013), payload: vec![] }, FieldValue::Variant { constructor: DeclarationId(2017), payload: vec![] }, FieldValue::Literal(LiteralBits::String("0".to_string())), FieldValue::Literal(LiteralBits::String("255".to_string())), FieldValue::Literal(LiteralBits::Bool(true)), FieldValue::Variant { constructor: DeclarationId(2022), payload: vec![] }] }, FieldValue::Variant { constructor: DeclarationId(2025), payload: vec![FieldValue::Literal(LiteralBits::String("u16".to_string())), FieldValue::Variant { constructor: DeclarationId(2013), payload: vec![] }, FieldValue::Variant { constructor: DeclarationId(2018), payload: vec![] }, FieldValue::Literal(LiteralBits::String("0".to_string())), FieldValue::Literal(LiteralBits::String("65535".to_string())), FieldValue::Literal(LiteralBits::Bool(true)), FieldValue::Variant { constructor: DeclarationId(2022), payload: vec![] }] }, FieldValue::Variant { constructor: DeclarationId(2025), payload: vec![FieldValue::Literal(LiteralBits::String("u32".to_string())), FieldValue::Variant { constructor: DeclarationId(2013), payload: vec![] }, FieldValue::Variant { constructor: DeclarationId(2019), payload: vec![] }, FieldValue::Literal(LiteralBits::String("0".to_string())), FieldValue::Literal(LiteralBits::String("4294967295".to_string())), FieldValue::Literal(LiteralBits::Bool(true)), FieldValue::Variant { constructor: DeclarationId(2022), payload: vec![] }] }, FieldValue::Variant { constructor: DeclarationId(2025), payload: vec![FieldValue::Literal(LiteralBits::String("u64".to_string())), FieldValue::Variant { constructor: DeclarationId(2013), payload: vec![] }, FieldValue::Variant { constructor: DeclarationId(2020), payload: vec![] }, FieldValue::Literal(LiteralBits::String("0".to_string())), FieldValue::Literal(LiteralBits::String("18446744073709551615".to_string())), FieldValue::Literal(LiteralBits::Bool(true)), FieldValue::Variant { constructor: DeclarationId(2022), payload: vec![] }] }, FieldValue::Variant { constructor: DeclarationId(2026), payload: vec![FieldValue::Literal(LiteralBits::String("bool".to_string())), FieldValue::Variant { constructor: DeclarationId(2014), payload: vec![] }, FieldValue::Variant { constructor: DeclarationId(2016), payload: vec![] }, FieldValue::Literal(LiteralBits::Bool(true))] }, FieldValue::Variant { constructor: DeclarationId(2026), payload: vec![FieldValue::Literal(LiteralBits::String("()".to_string())), FieldValue::Variant { constructor: DeclarationId(2015), payload: vec![] }, FieldValue::Variant { constructor: DeclarationId(2021), payload: vec![] }, FieldValue::Literal(LiteralBits::Bool(true))] }])), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 9595, 12449) }, + Declaration { id: DeclarationId(1320), name: Some("IntegerAlgebra".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "OrderedRingAlgebra".to_string(), ty: DeclarationId(2013) }, Field { label: "SemiringAlgebra".to_string(), ty: DeclarationId(2014) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 5230, 5292) }, + Declaration { id: DeclarationId(1321), name: Some("NonIntegerAlgebra".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "BooleanAlgebraAlgebra".to_string(), ty: DeclarationId(2015) }, Field { label: "TerminalAlgebra".to_string(), ty: DeclarationId(2016) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 5294, 5362) }, + Declaration { id: DeclarationId(1322), name: Some("TargetCarrier".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "BitCarrier".to_string(), ty: DeclarationId(2017) }, Field { label: "ByteCarrier".to_string(), ty: DeclarationId(2018) }, Field { label: "Word16Carrier".to_string(), ty: DeclarationId(2019) }, Field { label: "Word32Carrier".to_string(), ty: DeclarationId(2020) }, Field { label: "Word64Carrier".to_string(), ty: DeclarationId(2021) }, Field { label: "TerminalCarrier".to_string(), ty: DeclarationId(2022) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 6852, 6975) }, + Declaration { id: DeclarationId(1323), name: Some("IntegerOverflow".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "TwoComplementWrap".to_string(), ty: DeclarationId(2023) }, Field { label: "Saturating".to_string(), ty: DeclarationId(2024) }, Field { label: "Trap".to_string(), ty: DeclarationId(2025) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 7692, 7758) }, + Declaration { id: DeclarationId(1324), name: Some("RustPrimitive".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "IntegerPrimitive".to_string(), ty: DeclarationId(2026) }, Field { label: "NonIntegerPrimitive".to_string(), ty: DeclarationId(2027) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 8513, 9295) }, + Declaration { id: DeclarationId(1325), name: Some("rust_pilot_primitives".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(530), arguments: vec![TemplateArgument { parameter: DeclarationId(531), value: DeclarationId(1324) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(2028)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::List(vec![FieldValue::Variant { constructor: DeclarationId(2026), payload: vec![FieldValue::Literal(LiteralBits::String("i8".to_string())), FieldValue::Variant { constructor: DeclarationId(2013), payload: vec![] }, FieldValue::Variant { constructor: DeclarationId(2018), payload: vec![] }, FieldValue::Literal(LiteralBits::String("-128".to_string())), FieldValue::Literal(LiteralBits::String("127".to_string())), FieldValue::Literal(LiteralBits::Bool(true)), FieldValue::Variant { constructor: DeclarationId(2023), payload: vec![] }] }, FieldValue::Variant { constructor: DeclarationId(2026), payload: vec![FieldValue::Literal(LiteralBits::String("i16".to_string())), FieldValue::Variant { constructor: DeclarationId(2013), payload: vec![] }, FieldValue::Variant { constructor: DeclarationId(2019), payload: vec![] }, FieldValue::Literal(LiteralBits::String("-32768".to_string())), FieldValue::Literal(LiteralBits::String("32767".to_string())), FieldValue::Literal(LiteralBits::Bool(true)), FieldValue::Variant { constructor: DeclarationId(2023), payload: vec![] }] }, FieldValue::Variant { constructor: DeclarationId(2026), payload: vec![FieldValue::Literal(LiteralBits::String("i32".to_string())), FieldValue::Variant { constructor: DeclarationId(2013), payload: vec![] }, FieldValue::Variant { constructor: DeclarationId(2020), payload: vec![] }, FieldValue::Literal(LiteralBits::String("-2147483648".to_string())), FieldValue::Literal(LiteralBits::String("2147483647".to_string())), FieldValue::Literal(LiteralBits::Bool(true)), FieldValue::Variant { constructor: DeclarationId(2023), payload: vec![] }] }, FieldValue::Variant { constructor: DeclarationId(2026), payload: vec![FieldValue::Literal(LiteralBits::String("i64".to_string())), FieldValue::Variant { constructor: DeclarationId(2013), payload: vec![] }, FieldValue::Variant { constructor: DeclarationId(2021), payload: vec![] }, FieldValue::Literal(LiteralBits::String("-9223372036854775808".to_string())), FieldValue::Literal(LiteralBits::String("9223372036854775807".to_string())), FieldValue::Literal(LiteralBits::Bool(true)), FieldValue::Variant { constructor: DeclarationId(2023), payload: vec![] }] }, FieldValue::Variant { constructor: DeclarationId(2026), payload: vec![FieldValue::Literal(LiteralBits::String("u8".to_string())), FieldValue::Variant { constructor: DeclarationId(2014), payload: vec![] }, FieldValue::Variant { constructor: DeclarationId(2018), payload: vec![] }, FieldValue::Literal(LiteralBits::String("0".to_string())), FieldValue::Literal(LiteralBits::String("255".to_string())), FieldValue::Literal(LiteralBits::Bool(true)), FieldValue::Variant { constructor: DeclarationId(2023), payload: vec![] }] }, FieldValue::Variant { constructor: DeclarationId(2026), payload: vec![FieldValue::Literal(LiteralBits::String("u16".to_string())), FieldValue::Variant { constructor: DeclarationId(2014), payload: vec![] }, FieldValue::Variant { constructor: DeclarationId(2019), payload: vec![] }, FieldValue::Literal(LiteralBits::String("0".to_string())), FieldValue::Literal(LiteralBits::String("65535".to_string())), FieldValue::Literal(LiteralBits::Bool(true)), FieldValue::Variant { constructor: DeclarationId(2023), payload: vec![] }] }, FieldValue::Variant { constructor: DeclarationId(2026), payload: vec![FieldValue::Literal(LiteralBits::String("u32".to_string())), FieldValue::Variant { constructor: DeclarationId(2014), payload: vec![] }, FieldValue::Variant { constructor: DeclarationId(2020), payload: vec![] }, FieldValue::Literal(LiteralBits::String("0".to_string())), FieldValue::Literal(LiteralBits::String("4294967295".to_string())), FieldValue::Literal(LiteralBits::Bool(true)), FieldValue::Variant { constructor: DeclarationId(2023), payload: vec![] }] }, FieldValue::Variant { constructor: DeclarationId(2026), payload: vec![FieldValue::Literal(LiteralBits::String("u64".to_string())), FieldValue::Variant { constructor: DeclarationId(2014), payload: vec![] }, FieldValue::Variant { constructor: DeclarationId(2021), payload: vec![] }, FieldValue::Literal(LiteralBits::String("0".to_string())), FieldValue::Literal(LiteralBits::String("18446744073709551615".to_string())), FieldValue::Literal(LiteralBits::Bool(true)), FieldValue::Variant { constructor: DeclarationId(2023), payload: vec![] }] }, FieldValue::Variant { constructor: DeclarationId(2027), payload: vec![FieldValue::Literal(LiteralBits::String("bool".to_string())), FieldValue::Variant { constructor: DeclarationId(2015), payload: vec![] }, FieldValue::Variant { constructor: DeclarationId(2017), payload: vec![] }, FieldValue::Literal(LiteralBits::Bool(true))] }, FieldValue::Variant { constructor: DeclarationId(2027), payload: vec![FieldValue::Literal(LiteralBits::String("()".to_string())), FieldValue::Variant { constructor: DeclarationId(2016), payload: vec![] }, FieldValue::Variant { constructor: DeclarationId(2022), payload: vec![] }, FieldValue::Literal(LiteralBits::Bool(true))] }])), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 9595, 12449) }, Declaration { id: DeclarationId(1326), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(530), arguments: vec![TemplateArgument { parameter: DeclarationId(531), value: DeclarationId(533) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 3259, 3272) }, Declaration { id: DeclarationId(1327), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(530), arguments: vec![TemplateArgument { parameter: DeclarationId(531), value: DeclarationId(535) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 3421, 3434) }, Declaration { id: DeclarationId(1328), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(530), arguments: vec![TemplateArgument { parameter: DeclarationId(531), value: DeclarationId(535) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 3439, 3452) }, @@ -1970,9 +1970,9 @@ pub(crate) fn bootstrapped_fixture_dag() -> Dag { Declaration { id: DeclarationId(1962), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 2539, 2548) }, Declaration { id: DeclarationId(1963), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 2553, 2557) }, Declaration { id: DeclarationId(1964), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 2562, 2570) }, - Declaration { id: DeclarationId(1965), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(530), arguments: vec![TemplateArgument { parameter: DeclarationId(531), value: DeclarationId(899) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 12224, 12247) }, - Declaration { id: DeclarationId(1966), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(530), arguments: vec![TemplateArgument { parameter: DeclarationId(531), value: DeclarationId(940) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 12449, 12464) }, - Declaration { id: DeclarationId(1967), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(530), arguments: vec![TemplateArgument { parameter: DeclarationId(531), value: DeclarationId(942) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 12469, 12489) }, + Declaration { id: DeclarationId(1965), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(530), arguments: vec![TemplateArgument { parameter: DeclarationId(531), value: DeclarationId(899) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 13007, 13030) }, + Declaration { id: DeclarationId(1966), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(530), arguments: vec![TemplateArgument { parameter: DeclarationId(531), value: DeclarationId(940) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 13232, 13247) }, + Declaration { id: DeclarationId(1967), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(530), arguments: vec![TemplateArgument { parameter: DeclarationId(531), value: DeclarationId(942) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 13252, 13272) }, Declaration { id: DeclarationId(1968), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 2432, 2446) }, Declaration { id: DeclarationId(1969), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 2451, 2461) }, Declaration { id: DeclarationId(1970), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 2466, 2478) }, @@ -2009,30 +2009,31 @@ pub(crate) fn bootstrapped_fixture_dag() -> Dag { Declaration { id: DeclarationId(2001), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(530), arguments: vec![TemplateArgument { parameter: DeclarationId(531), value: DeclarationId(923) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 9305, 9315) }, Declaration { id: DeclarationId(2002), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "authority".to_string(), ty: DeclarationId(953) }, Field { label: "generated_paths".to_string(), ty: DeclarationId(2001) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 9231, 9321) }, Declaration { id: DeclarationId(2003), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "deferred_gate".to_string(), ty: DeclarationId(953) }, Field { label: "target_lane".to_string(), ty: DeclarationId(953) }, Field { label: "authority_doc".to_string(), ty: DeclarationId(953) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 10263, 10397) }, - Declaration { id: DeclarationId(2004), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(530), arguments: vec![TemplateArgument { parameter: DeclarationId(531), value: DeclarationId(899) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 11441, 11464) }, - Declaration { id: DeclarationId(2005), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(530), arguments: vec![TemplateArgument { parameter: DeclarationId(531), value: DeclarationId(940) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 11510, 11525) }, - Declaration { id: DeclarationId(2006), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(530), arguments: vec![TemplateArgument { parameter: DeclarationId(531), value: DeclarationId(899) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 11781, 11804) }, - Declaration { id: DeclarationId(2007), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(530), arguments: vec![TemplateArgument { parameter: DeclarationId(531), value: DeclarationId(666) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/workflows.dag", 992, 1006) }, - Declaration { id: DeclarationId(2008), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 532, 547) }, - Declaration { id: DeclarationId(2009), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 550, 561) }, - Declaration { id: DeclarationId(2010), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 564, 576) }, - Declaration { id: DeclarationId(2011), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(646), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/operators.dag", 142, 155) }, - Declaration { id: DeclarationId(2012), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 5254, 5272) }, - Declaration { id: DeclarationId(2013), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 5277, 5292) }, - Declaration { id: DeclarationId(2014), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 5321, 5342) }, - Declaration { id: DeclarationId(2015), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 5347, 5362) }, - Declaration { id: DeclarationId(2016), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 6875, 6885) }, - Declaration { id: DeclarationId(2017), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 6890, 6901) }, - Declaration { id: DeclarationId(2018), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 6906, 6919) }, - Declaration { id: DeclarationId(2019), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 6924, 6937) }, - Declaration { id: DeclarationId(2020), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 6942, 6955) }, - Declaration { id: DeclarationId(2021), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 6960, 6975) }, - Declaration { id: DeclarationId(2022), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 7717, 7734) }, - Declaration { id: DeclarationId(2023), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 7739, 7749) }, - Declaration { id: DeclarationId(2024), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 7754, 7758) }, - Declaration { id: DeclarationId(2025), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "target_name".to_string(), ty: DeclarationId(186) }, Field { label: "algebra".to_string(), ty: DeclarationId(1320) }, Field { label: "carrier".to_string(), ty: DeclarationId(1322) }, Field { label: "range_min_inclusive".to_string(), ty: DeclarationId(186) }, Field { label: "range_max_inclusive".to_string(), ty: DeclarationId(186) }, Field { label: "is_copy".to_string(), ty: DeclarationId(88) }, Field { label: "overflow".to_string(), ty: DeclarationId(1323) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 8536, 9108) }, - Declaration { id: DeclarationId(2026), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "target_name".to_string(), ty: DeclarationId(186) }, Field { label: "algebra".to_string(), ty: DeclarationId(1321) }, Field { label: "carrier".to_string(), ty: DeclarationId(1322) }, Field { label: "is_copy".to_string(), ty: DeclarationId(88) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 9113, 9295) }, - Declaration { id: DeclarationId(2027), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(530), arguments: vec![TemplateArgument { parameter: DeclarationId(531), value: DeclarationId(1324) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 9623, 9642) }, + Declaration { id: DeclarationId(2004), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "deferred_gate".to_string(), ty: DeclarationId(953) }, Field { label: "target_lane".to_string(), ty: DeclarationId(953) }, Field { label: "authority_doc".to_string(), ty: DeclarationId(953) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 11036, 11180) }, + Declaration { id: DeclarationId(2005), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(530), arguments: vec![TemplateArgument { parameter: DeclarationId(531), value: DeclarationId(899) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 12224, 12247) }, + Declaration { id: DeclarationId(2006), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(530), arguments: vec![TemplateArgument { parameter: DeclarationId(531), value: DeclarationId(940) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 12293, 12308) }, + Declaration { id: DeclarationId(2007), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(530), arguments: vec![TemplateArgument { parameter: DeclarationId(531), value: DeclarationId(899) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 12564, 12587) }, + Declaration { id: DeclarationId(2008), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(530), arguments: vec![TemplateArgument { parameter: DeclarationId(531), value: DeclarationId(666) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/workflows.dag", 992, 1006) }, + Declaration { id: DeclarationId(2009), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 532, 547) }, + Declaration { id: DeclarationId(2010), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 550, 561) }, + Declaration { id: DeclarationId(2011), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 564, 576) }, + Declaration { id: DeclarationId(2012), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(646), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/operators.dag", 142, 155) }, + Declaration { id: DeclarationId(2013), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 5254, 5272) }, + Declaration { id: DeclarationId(2014), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 5277, 5292) }, + Declaration { id: DeclarationId(2015), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 5321, 5342) }, + Declaration { id: DeclarationId(2016), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 5347, 5362) }, + Declaration { id: DeclarationId(2017), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 6875, 6885) }, + Declaration { id: DeclarationId(2018), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 6890, 6901) }, + Declaration { id: DeclarationId(2019), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 6906, 6919) }, + Declaration { id: DeclarationId(2020), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 6924, 6937) }, + Declaration { id: DeclarationId(2021), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 6942, 6955) }, + Declaration { id: DeclarationId(2022), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 6960, 6975) }, + Declaration { id: DeclarationId(2023), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 7717, 7734) }, + Declaration { id: DeclarationId(2024), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 7739, 7749) }, + Declaration { id: DeclarationId(2025), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 7754, 7758) }, + Declaration { id: DeclarationId(2026), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "target_name".to_string(), ty: DeclarationId(186) }, Field { label: "algebra".to_string(), ty: DeclarationId(1320) }, Field { label: "carrier".to_string(), ty: DeclarationId(1322) }, Field { label: "range_min_inclusive".to_string(), ty: DeclarationId(186) }, Field { label: "range_max_inclusive".to_string(), ty: DeclarationId(186) }, Field { label: "is_copy".to_string(), ty: DeclarationId(88) }, Field { label: "overflow".to_string(), ty: DeclarationId(1323) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 8536, 9108) }, + Declaration { id: DeclarationId(2027), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "target_name".to_string(), ty: DeclarationId(186) }, Field { label: "algebra".to_string(), ty: DeclarationId(1321) }, Field { label: "carrier".to_string(), ty: DeclarationId(1322) }, Field { label: "is_copy".to_string(), ty: DeclarationId(88) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 9113, 9295) }, + Declaration { id: DeclarationId(2028), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(530), arguments: vec![TemplateArgument { parameter: DeclarationId(531), value: DeclarationId(1324) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 9623, 9642) }, ], ports: { let mut ports = HashMap::new(); ports.insert(PortId(0), Port { id: PortId(0), state: PortState::Resolved(TypeShape::new(DeclarationId(682))), produced_by: None }); @@ -2359,7 +2360,7 @@ pub(crate) fn bootstrapped_fixture_dag() -> Dag { ports.insert(PortId(321), Port { id: PortId(321), state: PortState::Uninferred, produced_by: Some(NodeId(232)) }); ports.insert(PortId(322), Port { id: PortId(322), state: PortState::Resolved(TypeShape::new(DeclarationId(1554))), produced_by: Some(NodeId(233)) }); ports.insert(PortId(323), Port { id: PortId(323), state: PortState::Resolved(TypeShape::new(DeclarationId(667))), produced_by: None }); - ports.insert(PortId(324), Port { id: PortId(324), state: PortState::Resolved(TypeShape::new(DeclarationId(2007))), produced_by: Some(NodeId(235)) }); + ports.insert(PortId(324), Port { id: PortId(324), state: PortState::Resolved(TypeShape::new(DeclarationId(2008))), produced_by: Some(NodeId(235)) }); ports.insert(PortId(325), Port { id: PortId(325), state: PortState::Resolved(TypeShape::new(DeclarationId(646))), produced_by: None }); ports.insert(PortId(326), Port { id: PortId(326), state: PortState::Uninferred, produced_by: None }); ports.insert(PortId(327), Port { id: PortId(327), state: PortState::Uninferred, produced_by: Some(NodeId(237)) }); @@ -2404,7 +2405,7 @@ pub(crate) fn bootstrapped_fixture_dag() -> Dag { , diagnostics: DiagnosticTable::new(), next_node_id: 271, - next_declaration_id: 2028, + next_declaration_id: 2029, next_port_id: 365, primitives: PrimitiveCache::default(), substrate_markers: SubstrateMarkers::default(), diff --git a/src/v3/compiler/src/bootstrap_generated_without_parse_surface.rs b/src/v3/compiler/src/bootstrap_generated_without_parse_surface.rs index 5e6f8575c4d..fb367de026e 100644 --- a/src/v3/compiler/src/bootstrap_generated_without_parse_surface.rs +++ b/src/v3/compiler/src/bootstrap_generated_without_parse_surface.rs @@ -927,16 +927,16 @@ pub(crate) fn bootstrapped_fixture_without_parse_surface_dag() -> Dag { Declaration { id: DeclarationId(919), name: Some("DiagnosticReference".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "kind".to_string(), ty: DeclarationId(917) }, Field { label: "detail_contains".to_string(), ty: DeclarationId(918) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 3138, 3236) }, Declaration { id: DeclarationId(920), name: Some("PortStateExpectation".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Resolved".to_string(), ty: DeclarationId(1894) }, Field { label: "Unresolved".to_string(), ty: DeclarationId(1895) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 3623, 3676) }, Declaration { id: DeclarationId(921), name: Some("AlgebraicLawKind".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Associativity".to_string(), ty: DeclarationId(1896) }, Field { label: "Commutativity".to_string(), ty: DeclarationId(1897) }, Field { label: "Identity".to_string(), ty: DeclarationId(1898) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 4465, 4535) }, - Declaration { id: DeclarationId(922), name: Some("TestPredicate".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Compiles".to_string(), ty: DeclarationId(1899) }, Field { label: "FailsWithDiagnostic".to_string(), ty: DeclarationId(1900) }, Field { label: "OutputEquals".to_string(), ty: DeclarationId(1901) }, Field { label: "PortHasState".to_string(), ty: DeclarationId(1902) }, Field { label: "DeclarationHasRefinement".to_string(), ty: DeclarationId(1903) }, Field { label: "CostBounded".to_string(), ty: DeclarationId(1904) }, Field { label: "BehavioralObservation".to_string(), ty: DeclarationId(1905) }, Field { label: "MockBackedInvariant".to_string(), ty: DeclarationId(1906) }, Field { label: "ExecuteCommand".to_string(), ty: DeclarationId(1908) }, Field { label: "ForAllTargets".to_string(), ty: DeclarationId(1910) }, Field { label: "LensOutputEquals".to_string(), ty: DeclarationId(1911) }, Field { label: "DifferentialEquals".to_string(), ty: DeclarationId(1912) }, Field { label: "AlgebraicLaw".to_string(), ty: DeclarationId(1913) }, Field { label: "CensusBoundCheck".to_string(), ty: DeclarationId(1914) }, Field { label: "CensusSubsetCount".to_string(), ty: DeclarationId(1915) }, Field { label: "FixedPointConverges".to_string(), ty: DeclarationId(1916) }, Field { label: "RatchetZero".to_string(), ty: DeclarationId(1917) }, Field { label: "GeneratedFromDag".to_string(), ty: DeclarationId(1919) }, Field { label: "ReleaseDeferredClaim".to_string(), ty: DeclarationId(1920) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 4537, 10397) }, - Declaration { id: DeclarationId(923), name: Some("ProgramInput".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 10505, 10525) }, - Declaration { id: DeclarationId(924), name: Some("ProgramOutputBind".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "output_ref".to_string(), ty: DeclarationId(938) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 10668, 10723) }, - Declaration { id: DeclarationId(925), name: Some("TestClaim".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "name".to_string(), ty: DeclarationId(186) }, Field { label: "source".to_string(), ty: DeclarationId(186) }, Field { label: "file_name".to_string(), ty: DeclarationId(186) }, Field { label: "predicate".to_string(), ty: DeclarationId(922) }, Field { label: "requires".to_string(), ty: DeclarationId(1921) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 11333, 11466) }, - Declaration { id: DeclarationId(926), name: Some("TestSuite".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "name".to_string(), ty: DeclarationId(186) }, Field { label: "claims".to_string(), ty: DeclarationId(1922) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 11468, 11527) }, - Declaration { id: DeclarationId(927), name: Some("TestObligation".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "claim_name".to_string(), ty: DeclarationId(186) }, Field { label: "resources".to_string(), ty: DeclarationId(1923) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 11725, 11806) }, - Declaration { id: DeclarationId(928), name: Some("claim_obligation_resources".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(925)], output: DeclarationId(1882), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/verification.dag", 12248, 12264)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 12177, 12264) }, - Declaration { id: DeclarationId(929), name: Some("obligation_for_claim".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(925)], output: DeclarationId(927), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/verification.dag", 12322, 12407)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 12266, 12407) }, - Declaration { id: DeclarationId(930), name: Some("materialize_test_obligations".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1883)], output: DeclarationId(1884), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/verification.dag", 12490, 12529)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 12409, 12529) }, - Declaration { id: DeclarationId(931), name: Some("behavior_spine".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(667)], output: DeclarationId(1924), body: ArrowBody::UserDefined(NodeId(236)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/workflows.dag", 963, 1018) }, + Declaration { id: DeclarationId(922), name: Some("TestPredicate".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "Compiles".to_string(), ty: DeclarationId(1899) }, Field { label: "FailsWithDiagnostic".to_string(), ty: DeclarationId(1900) }, Field { label: "OutputEquals".to_string(), ty: DeclarationId(1901) }, Field { label: "PortHasState".to_string(), ty: DeclarationId(1902) }, Field { label: "DeclarationHasRefinement".to_string(), ty: DeclarationId(1903) }, Field { label: "CostBounded".to_string(), ty: DeclarationId(1904) }, Field { label: "BehavioralObservation".to_string(), ty: DeclarationId(1905) }, Field { label: "MockBackedInvariant".to_string(), ty: DeclarationId(1906) }, Field { label: "ExecuteCommand".to_string(), ty: DeclarationId(1908) }, Field { label: "ForAllTargets".to_string(), ty: DeclarationId(1910) }, Field { label: "LensOutputEquals".to_string(), ty: DeclarationId(1911) }, Field { label: "DifferentialEquals".to_string(), ty: DeclarationId(1912) }, Field { label: "AlgebraicLaw".to_string(), ty: DeclarationId(1913) }, Field { label: "CensusBoundCheck".to_string(), ty: DeclarationId(1914) }, Field { label: "CensusSubsetCount".to_string(), ty: DeclarationId(1915) }, Field { label: "FixedPointConverges".to_string(), ty: DeclarationId(1916) }, Field { label: "RatchetZero".to_string(), ty: DeclarationId(1917) }, Field { label: "GeneratedFromDag".to_string(), ty: DeclarationId(1919) }, Field { label: "ReleaseDeferredClaim".to_string(), ty: DeclarationId(1920) }, Field { label: "SubstrateResearchDeferredClaim".to_string(), ty: DeclarationId(1921) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 4537, 11180) }, + Declaration { id: DeclarationId(923), name: Some("ProgramInput".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 11288, 11308) }, + Declaration { id: DeclarationId(924), name: Some("ProgramOutputBind".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "output_ref".to_string(), ty: DeclarationId(938) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 11451, 11506) }, + Declaration { id: DeclarationId(925), name: Some("TestClaim".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "name".to_string(), ty: DeclarationId(186) }, Field { label: "source".to_string(), ty: DeclarationId(186) }, Field { label: "file_name".to_string(), ty: DeclarationId(186) }, Field { label: "predicate".to_string(), ty: DeclarationId(922) }, Field { label: "requires".to_string(), ty: DeclarationId(1922) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 12116, 12249) }, + Declaration { id: DeclarationId(926), name: Some("TestSuite".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "name".to_string(), ty: DeclarationId(186) }, Field { label: "claims".to_string(), ty: DeclarationId(1923) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 12251, 12310) }, + Declaration { id: DeclarationId(927), name: Some("TestObligation".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "claim_name".to_string(), ty: DeclarationId(186) }, Field { label: "resources".to_string(), ty: DeclarationId(1924) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 12508, 12589) }, + Declaration { id: DeclarationId(928), name: Some("claim_obligation_resources".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(925)], output: DeclarationId(1882), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/verification.dag", 13031, 13047)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 12960, 13047) }, + Declaration { id: DeclarationId(929), name: Some("obligation_for_claim".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(925)], output: DeclarationId(927), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/verification.dag", 13105, 13190)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 13049, 13190) }, + Declaration { id: DeclarationId(930), name: Some("materialize_test_obligations".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(1883)], output: DeclarationId(1884), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/std/verification.dag", 13273, 13312)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 13192, 13312) }, + Declaration { id: DeclarationId(931), name: Some("behavior_spine".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(667)], output: DeclarationId(1925), body: ArrowBody::UserDefined(NodeId(236)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/workflows.dag", 963, 1018) }, Declaration { id: DeclarationId(932), name: Some("Value".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/v3_l1.dag", 2788, 2801) }, Declaration { id: DeclarationId(933), name: Some("Transform".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/v3_l1.dag", 2802, 2819) }, Declaration { id: DeclarationId(934), name: Some("Branch".to_string()), connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/v3_l1.dag", 2820, 2834) }, @@ -1276,7 +1276,7 @@ pub(crate) fn bootstrapped_fixture_without_parse_surface_dag() -> Dag { Declaration { id: DeclarationId(1268), name: Some("rust_declaration_by_id_accessor".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(668), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(668)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("carrier".to_string(), FieldValue::Literal(LiteralBits::String("({p0}).declaration_opt({p1}).cloned()".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 43898, 44021) }, Declaration { id: DeclarationId(1269), name: Some("declaration_by_id_binding_rust".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(669), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(669)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("accessor".to_string(), FieldValue::Reference(DeclarationId(673))), ("realization".to_string(), FieldValue::Reference(DeclarationId(1268))), ("language".to_string(), FieldValue::Reference(DeclarationId(1256)))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/spec/rust.dag", 44023, 44193) }, Declaration { id: DeclarationId(1270), name: Some("CompilerHostRealization".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "symbol".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 453, 502) }, - Declaration { id: DeclarationId(1271), name: Some("PipelineSnapshotKind".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "SnapshotSurface".to_string(), ty: DeclarationId(1925) }, Field { label: "SnapshotDag".to_string(), ty: DeclarationId(1926) }, Field { label: "SnapshotText".to_string(), ty: DeclarationId(1927) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 504, 576) }, + Declaration { id: DeclarationId(1271), name: Some("PipelineSnapshotKind".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "SnapshotSurface".to_string(), ty: DeclarationId(1926) }, Field { label: "SnapshotDag".to_string(), ty: DeclarationId(1927) }, Field { label: "SnapshotText".to_string(), ty: DeclarationId(1928) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 504, 576) }, Declaration { id: DeclarationId(1272), name: Some("PipelineStageBinding".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "stage".to_string(), ty: DeclarationId(938) }, Field { label: "realization".to_string(), ty: DeclarationId(938) }, Field { label: "snapshot".to_string(), ty: DeclarationId(1271) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 578, 694) }, Declaration { id: DeclarationId(1273), name: Some("parse_realization".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "symbol".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1270)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("symbol".to_string(), FieldValue::Literal(LiteralBits::String("v3_compiler::parse".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 696, 780) }, Declaration { id: DeclarationId(1274), name: Some("lower_realization".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "symbol".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1270)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("symbol".to_string(), FieldValue::Literal(LiteralBits::String("v3_compiler::lower".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 782, 866) }, @@ -1284,12 +1284,12 @@ pub(crate) fn bootstrapped_fixture_without_parse_surface_dag() -> Dag { Declaration { id: DeclarationId(1276), name: Some("compute_ownership_realization".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "symbol".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1270)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("symbol".to_string(), FieldValue::Literal(LiteralBits::String("v3_compiler::compute_ownership".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 954, 1062) }, Declaration { id: DeclarationId(1277), name: Some("emit_realization".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "symbol".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1270)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("symbol".to_string(), FieldValue::Literal(LiteralBits::String("v3_compiler::emit".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 1064, 1146) }, Declaration { id: DeclarationId(1278), name: Some("lens_complexity_realization".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "symbol".to_string(), ty: DeclarationId(186) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1270)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("symbol".to_string(), FieldValue::Literal(LiteralBits::String("v3_compiler::lens_complexity".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 1148, 1252) }, - Declaration { id: DeclarationId(1279), name: Some("parse_stage_binding".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(1272), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1272)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("stage".to_string(), FieldValue::Reference(DeclarationId(1285))), ("realization".to_string(), FieldValue::Reference(DeclarationId(1273))), ("snapshot".to_string(), FieldValue::Variant { constructor: DeclarationId(1925), payload: vec![] })] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 1254, 1382) }, - Declaration { id: DeclarationId(1280), name: Some("lower_stage_binding".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(1272), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1272)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("stage".to_string(), FieldValue::Reference(DeclarationId(1286))), ("realization".to_string(), FieldValue::Reference(DeclarationId(1274))), ("snapshot".to_string(), FieldValue::Variant { constructor: DeclarationId(1926), payload: vec![] })] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 1384, 1508) }, - Declaration { id: DeclarationId(1281), name: Some("infer_stage_binding".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(1272), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1272)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("stage".to_string(), FieldValue::Reference(DeclarationId(1287))), ("realization".to_string(), FieldValue::Reference(DeclarationId(1275))), ("snapshot".to_string(), FieldValue::Variant { constructor: DeclarationId(1926), payload: vec![] })] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 1510, 1634) }, - Declaration { id: DeclarationId(1282), name: Some("compute_ownership_stage_binding".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(1272), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1272)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("stage".to_string(), FieldValue::Reference(DeclarationId(1288))), ("realization".to_string(), FieldValue::Reference(DeclarationId(1276))), ("snapshot".to_string(), FieldValue::Variant { constructor: DeclarationId(1926), payload: vec![] })] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 1636, 1796) }, - Declaration { id: DeclarationId(1283), name: Some("lens_complexity_stage_binding".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(1272), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1272)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("stage".to_string(), FieldValue::Reference(DeclarationId(1289))), ("realization".to_string(), FieldValue::Reference(DeclarationId(1278))), ("snapshot".to_string(), FieldValue::Variant { constructor: DeclarationId(1926), payload: vec![] })] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 1798, 1952) }, - Declaration { id: DeclarationId(1284), name: Some("emit_stage_binding".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(1272), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1272)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("stage".to_string(), FieldValue::Reference(DeclarationId(1290))), ("realization".to_string(), FieldValue::Reference(DeclarationId(1277))), ("snapshot".to_string(), FieldValue::Variant { constructor: DeclarationId(1927), payload: vec![] })] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 1954, 2076) }, + Declaration { id: DeclarationId(1279), name: Some("parse_stage_binding".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(1272), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1272)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("stage".to_string(), FieldValue::Reference(DeclarationId(1285))), ("realization".to_string(), FieldValue::Reference(DeclarationId(1273))), ("snapshot".to_string(), FieldValue::Variant { constructor: DeclarationId(1926), payload: vec![] })] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 1254, 1382) }, + Declaration { id: DeclarationId(1280), name: Some("lower_stage_binding".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(1272), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1272)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("stage".to_string(), FieldValue::Reference(DeclarationId(1286))), ("realization".to_string(), FieldValue::Reference(DeclarationId(1274))), ("snapshot".to_string(), FieldValue::Variant { constructor: DeclarationId(1927), payload: vec![] })] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 1384, 1508) }, + Declaration { id: DeclarationId(1281), name: Some("infer_stage_binding".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(1272), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1272)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("stage".to_string(), FieldValue::Reference(DeclarationId(1287))), ("realization".to_string(), FieldValue::Reference(DeclarationId(1275))), ("snapshot".to_string(), FieldValue::Variant { constructor: DeclarationId(1927), payload: vec![] })] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 1510, 1634) }, + Declaration { id: DeclarationId(1282), name: Some("compute_ownership_stage_binding".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(1272), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1272)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("stage".to_string(), FieldValue::Reference(DeclarationId(1288))), ("realization".to_string(), FieldValue::Reference(DeclarationId(1276))), ("snapshot".to_string(), FieldValue::Variant { constructor: DeclarationId(1927), payload: vec![] })] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 1636, 1796) }, + Declaration { id: DeclarationId(1283), name: Some("lens_complexity_stage_binding".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(1272), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1272)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("stage".to_string(), FieldValue::Reference(DeclarationId(1289))), ("realization".to_string(), FieldValue::Reference(DeclarationId(1278))), ("snapshot".to_string(), FieldValue::Variant { constructor: DeclarationId(1927), payload: vec![] })] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 1798, 1952) }, + Declaration { id: DeclarationId(1284), name: Some("emit_stage_binding".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(1272), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1272)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("stage".to_string(), FieldValue::Reference(DeclarationId(1290))), ("realization".to_string(), FieldValue::Reference(DeclarationId(1277))), ("snapshot".to_string(), FieldValue::Variant { constructor: DeclarationId(1928), payload: vec![] })] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 1954, 2076) }, Declaration { id: DeclarationId(1285), name: Some("parse".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(186), DeclarationId(186)], output: DeclarationId(667), body: ArrowBody::ExternalRealization(DeclarationId(1273)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 2078, 2140) }, Declaration { id: DeclarationId(1286), name: Some("lower".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(667)], output: DeclarationId(667), body: ArrowBody::ExternalRealization(DeclarationId(1274)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 2142, 2184) }, Declaration { id: DeclarationId(1287), name: Some("infer".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(667)], output: DeclarationId(667), body: ArrowBody::ExternalRealization(DeclarationId(1275)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 2186, 2228) }, @@ -1297,7 +1297,7 @@ pub(crate) fn bootstrapped_fixture_without_parse_surface_dag() -> Dag { Declaration { id: DeclarationId(1289), name: Some("lens_complexity".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(667)], output: DeclarationId(667), body: ArrowBody::ExternalRealization(DeclarationId(1278)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 2290, 2347) }, Declaration { id: DeclarationId(1290), name: Some("emit".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(667), DeclarationId(667), DeclarationId(667), DeclarationId(818)], output: DeclarationId(186), body: ArrowBody::ExternalRealization(DeclarationId(1277)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 2349, 2460) }, Declaration { id: DeclarationId(1291), name: Some("compile".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(186), DeclarationId(186), DeclarationId(818)], output: DeclarationId(186), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/compiler/pipeline.dag", 2533, 2605)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 2462, 2605) }, - Declaration { id: DeclarationId(1292), name: Some("from_symbol".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(186)], output: DeclarationId(1928), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/compiler/operators.dag", 156, 771)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/operators.dag", 108, 771) }, + Declaration { id: DeclarationId(1292), name: Some("from_symbol".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(186)], output: DeclarationId(1929), body: ArrowBody::Unparsed(SourceSpan::new("src/v3/compiler/operators.dag", 156, 771)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/operators.dag", 108, 771) }, Declaration { id: DeclarationId(1293), name: Some("symbol".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(646)], output: DeclarationId(186), body: ArrowBody::UserDefined(NodeId(253)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/operators.dag", 773, 1214) }, Declaration { id: DeclarationId(1294), name: Some("algebra_field_name".to_string()), connective: TypeConnective::Arrow { inputs: vec![DeclarationId(646)], output: DeclarationId(186), body: ArrowBody::UserDefined(NodeId(270)) }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/operators.dag", 1216, 2017) }, Declaration { id: DeclarationId(1295), name: Some("LensRegistryEntry".to_string()), connective: TypeConnective::Conj { children: vec![Field { label: "name".to_string(), ty: DeclarationId(111) }, Field { label: "lens_file".to_string(), ty: DeclarationId(120) }, Field { label: "generated_file".to_string(), ty: DeclarationId(120) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/regen.dag", 1950, 2045) }, @@ -1310,12 +1310,12 @@ pub(crate) fn bootstrapped_fixture_without_parse_surface_dag() -> Dag { Declaration { id: DeclarationId(1302), name: Some("lens_infer_helpers_entry".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(1295), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1295)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("infer_helpers".to_string()))), ("lens_file".to_string(), FieldValue::Literal(LiteralBits::String("src/v3/lenses/infer_helpers.dag".to_string()))), ("generated_file".to_string(), FieldValue::Literal(LiteralBits::String("src/v3/compiler/src/infer_helpers_generated.rs".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/regen.dag", 3883, 4075) }, Declaration { id: DeclarationId(1303), name: Some("lens_variant_payload_entry".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(1295), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1295)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("variant_payload".to_string()))), ("lens_file".to_string(), FieldValue::Literal(LiteralBits::String("src/v3/lenses/variant_payload.dag".to_string()))), ("generated_file".to_string(), FieldValue::Literal(LiteralBits::String("src/v3/compiler/src/variant_payload_generated.rs".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/regen.dag", 4077, 4277) }, Declaration { id: DeclarationId(1304), name: Some("lens_lower_helpers_entry".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(1295), arguments: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1295)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::Structural { fields: vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("lower_helpers".to_string()))), ("lens_file".to_string(), FieldValue::Literal(LiteralBits::String("src/v3/lenses/lower_helpers.dag".to_string()))), ("generated_file".to_string(), FieldValue::Literal(LiteralBits::String("src/v3/compiler/src/lower_helpers_generated.rs".to_string())))] }), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/regen.dag", 4527, 4719) }, - Declaration { id: DeclarationId(1305), name: Some("IntegerAlgebra".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "OrderedRingAlgebra".to_string(), ty: DeclarationId(1929) }, Field { label: "SemiringAlgebra".to_string(), ty: DeclarationId(1930) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 5230, 5292) }, - Declaration { id: DeclarationId(1306), name: Some("NonIntegerAlgebra".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "BooleanAlgebraAlgebra".to_string(), ty: DeclarationId(1931) }, Field { label: "TerminalAlgebra".to_string(), ty: DeclarationId(1932) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 5294, 5362) }, - Declaration { id: DeclarationId(1307), name: Some("TargetCarrier".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "BitCarrier".to_string(), ty: DeclarationId(1933) }, Field { label: "ByteCarrier".to_string(), ty: DeclarationId(1934) }, Field { label: "Word16Carrier".to_string(), ty: DeclarationId(1935) }, Field { label: "Word32Carrier".to_string(), ty: DeclarationId(1936) }, Field { label: "Word64Carrier".to_string(), ty: DeclarationId(1937) }, Field { label: "TerminalCarrier".to_string(), ty: DeclarationId(1938) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 6852, 6975) }, - Declaration { id: DeclarationId(1308), name: Some("IntegerOverflow".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "TwoComplementWrap".to_string(), ty: DeclarationId(1939) }, Field { label: "Saturating".to_string(), ty: DeclarationId(1940) }, Field { label: "Trap".to_string(), ty: DeclarationId(1941) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 7692, 7758) }, - Declaration { id: DeclarationId(1309), name: Some("RustPrimitive".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "IntegerPrimitive".to_string(), ty: DeclarationId(1942) }, Field { label: "NonIntegerPrimitive".to_string(), ty: DeclarationId(1943) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 8513, 9295) }, - Declaration { id: DeclarationId(1310), name: Some("rust_pilot_primitives".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(530), arguments: vec![TemplateArgument { parameter: DeclarationId(531), value: DeclarationId(1309) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1944)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::List(vec![FieldValue::Variant { constructor: DeclarationId(1942), payload: vec![FieldValue::Literal(LiteralBits::String("i8".to_string())), FieldValue::Variant { constructor: DeclarationId(1929), payload: vec![] }, FieldValue::Variant { constructor: DeclarationId(1934), payload: vec![] }, FieldValue::Literal(LiteralBits::String("-128".to_string())), FieldValue::Literal(LiteralBits::String("127".to_string())), FieldValue::Literal(LiteralBits::Bool(true)), FieldValue::Variant { constructor: DeclarationId(1939), payload: vec![] }] }, FieldValue::Variant { constructor: DeclarationId(1942), payload: vec![FieldValue::Literal(LiteralBits::String("i16".to_string())), FieldValue::Variant { constructor: DeclarationId(1929), payload: vec![] }, FieldValue::Variant { constructor: DeclarationId(1935), payload: vec![] }, FieldValue::Literal(LiteralBits::String("-32768".to_string())), FieldValue::Literal(LiteralBits::String("32767".to_string())), FieldValue::Literal(LiteralBits::Bool(true)), FieldValue::Variant { constructor: DeclarationId(1939), payload: vec![] }] }, FieldValue::Variant { constructor: DeclarationId(1942), payload: vec![FieldValue::Literal(LiteralBits::String("i32".to_string())), FieldValue::Variant { constructor: DeclarationId(1929), payload: vec![] }, FieldValue::Variant { constructor: DeclarationId(1936), payload: vec![] }, FieldValue::Literal(LiteralBits::String("-2147483648".to_string())), FieldValue::Literal(LiteralBits::String("2147483647".to_string())), FieldValue::Literal(LiteralBits::Bool(true)), FieldValue::Variant { constructor: DeclarationId(1939), payload: vec![] }] }, FieldValue::Variant { constructor: DeclarationId(1942), payload: vec![FieldValue::Literal(LiteralBits::String("i64".to_string())), FieldValue::Variant { constructor: DeclarationId(1929), payload: vec![] }, FieldValue::Variant { constructor: DeclarationId(1937), payload: vec![] }, FieldValue::Literal(LiteralBits::String("-9223372036854775808".to_string())), FieldValue::Literal(LiteralBits::String("9223372036854775807".to_string())), FieldValue::Literal(LiteralBits::Bool(true)), FieldValue::Variant { constructor: DeclarationId(1939), payload: vec![] }] }, FieldValue::Variant { constructor: DeclarationId(1942), payload: vec![FieldValue::Literal(LiteralBits::String("u8".to_string())), FieldValue::Variant { constructor: DeclarationId(1930), payload: vec![] }, FieldValue::Variant { constructor: DeclarationId(1934), payload: vec![] }, FieldValue::Literal(LiteralBits::String("0".to_string())), FieldValue::Literal(LiteralBits::String("255".to_string())), FieldValue::Literal(LiteralBits::Bool(true)), FieldValue::Variant { constructor: DeclarationId(1939), payload: vec![] }] }, FieldValue::Variant { constructor: DeclarationId(1942), payload: vec![FieldValue::Literal(LiteralBits::String("u16".to_string())), FieldValue::Variant { constructor: DeclarationId(1930), payload: vec![] }, FieldValue::Variant { constructor: DeclarationId(1935), payload: vec![] }, FieldValue::Literal(LiteralBits::String("0".to_string())), FieldValue::Literal(LiteralBits::String("65535".to_string())), FieldValue::Literal(LiteralBits::Bool(true)), FieldValue::Variant { constructor: DeclarationId(1939), payload: vec![] }] }, FieldValue::Variant { constructor: DeclarationId(1942), payload: vec![FieldValue::Literal(LiteralBits::String("u32".to_string())), FieldValue::Variant { constructor: DeclarationId(1930), payload: vec![] }, FieldValue::Variant { constructor: DeclarationId(1936), payload: vec![] }, FieldValue::Literal(LiteralBits::String("0".to_string())), FieldValue::Literal(LiteralBits::String("4294967295".to_string())), FieldValue::Literal(LiteralBits::Bool(true)), FieldValue::Variant { constructor: DeclarationId(1939), payload: vec![] }] }, FieldValue::Variant { constructor: DeclarationId(1942), payload: vec![FieldValue::Literal(LiteralBits::String("u64".to_string())), FieldValue::Variant { constructor: DeclarationId(1930), payload: vec![] }, FieldValue::Variant { constructor: DeclarationId(1937), payload: vec![] }, FieldValue::Literal(LiteralBits::String("0".to_string())), FieldValue::Literal(LiteralBits::String("18446744073709551615".to_string())), FieldValue::Literal(LiteralBits::Bool(true)), FieldValue::Variant { constructor: DeclarationId(1939), payload: vec![] }] }, FieldValue::Variant { constructor: DeclarationId(1943), payload: vec![FieldValue::Literal(LiteralBits::String("bool".to_string())), FieldValue::Variant { constructor: DeclarationId(1931), payload: vec![] }, FieldValue::Variant { constructor: DeclarationId(1933), payload: vec![] }, FieldValue::Literal(LiteralBits::Bool(true))] }, FieldValue::Variant { constructor: DeclarationId(1943), payload: vec![FieldValue::Literal(LiteralBits::String("()".to_string())), FieldValue::Variant { constructor: DeclarationId(1932), payload: vec![] }, FieldValue::Variant { constructor: DeclarationId(1938), payload: vec![] }, FieldValue::Literal(LiteralBits::Bool(true))] }])), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 9595, 12449) }, + Declaration { id: DeclarationId(1305), name: Some("IntegerAlgebra".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "OrderedRingAlgebra".to_string(), ty: DeclarationId(1930) }, Field { label: "SemiringAlgebra".to_string(), ty: DeclarationId(1931) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 5230, 5292) }, + Declaration { id: DeclarationId(1306), name: Some("NonIntegerAlgebra".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "BooleanAlgebraAlgebra".to_string(), ty: DeclarationId(1932) }, Field { label: "TerminalAlgebra".to_string(), ty: DeclarationId(1933) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 5294, 5362) }, + Declaration { id: DeclarationId(1307), name: Some("TargetCarrier".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "BitCarrier".to_string(), ty: DeclarationId(1934) }, Field { label: "ByteCarrier".to_string(), ty: DeclarationId(1935) }, Field { label: "Word16Carrier".to_string(), ty: DeclarationId(1936) }, Field { label: "Word32Carrier".to_string(), ty: DeclarationId(1937) }, Field { label: "Word64Carrier".to_string(), ty: DeclarationId(1938) }, Field { label: "TerminalCarrier".to_string(), ty: DeclarationId(1939) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 6852, 6975) }, + Declaration { id: DeclarationId(1308), name: Some("IntegerOverflow".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "TwoComplementWrap".to_string(), ty: DeclarationId(1940) }, Field { label: "Saturating".to_string(), ty: DeclarationId(1941) }, Field { label: "Trap".to_string(), ty: DeclarationId(1942) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 7692, 7758) }, + Declaration { id: DeclarationId(1309), name: Some("RustPrimitive".to_string()), connective: TypeConnective::Disj { variants: vec![Field { label: "IntegerPrimitive".to_string(), ty: DeclarationId(1943) }, Field { label: "NonIntegerPrimitive".to_string(), ty: DeclarationId(1944) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 8513, 9295) }, + Declaration { id: DeclarationId(1310), name: Some("rust_pilot_primitives".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(530), arguments: vec![TemplateArgument { parameter: DeclarationId(531), value: DeclarationId(1309) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(1945)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::List(vec![FieldValue::Variant { constructor: DeclarationId(1943), payload: vec![FieldValue::Literal(LiteralBits::String("i8".to_string())), FieldValue::Variant { constructor: DeclarationId(1930), payload: vec![] }, FieldValue::Variant { constructor: DeclarationId(1935), payload: vec![] }, FieldValue::Literal(LiteralBits::String("-128".to_string())), FieldValue::Literal(LiteralBits::String("127".to_string())), FieldValue::Literal(LiteralBits::Bool(true)), FieldValue::Variant { constructor: DeclarationId(1940), payload: vec![] }] }, FieldValue::Variant { constructor: DeclarationId(1943), payload: vec![FieldValue::Literal(LiteralBits::String("i16".to_string())), FieldValue::Variant { constructor: DeclarationId(1930), payload: vec![] }, FieldValue::Variant { constructor: DeclarationId(1936), payload: vec![] }, FieldValue::Literal(LiteralBits::String("-32768".to_string())), FieldValue::Literal(LiteralBits::String("32767".to_string())), FieldValue::Literal(LiteralBits::Bool(true)), FieldValue::Variant { constructor: DeclarationId(1940), payload: vec![] }] }, FieldValue::Variant { constructor: DeclarationId(1943), payload: vec![FieldValue::Literal(LiteralBits::String("i32".to_string())), FieldValue::Variant { constructor: DeclarationId(1930), payload: vec![] }, FieldValue::Variant { constructor: DeclarationId(1937), payload: vec![] }, FieldValue::Literal(LiteralBits::String("-2147483648".to_string())), FieldValue::Literal(LiteralBits::String("2147483647".to_string())), FieldValue::Literal(LiteralBits::Bool(true)), FieldValue::Variant { constructor: DeclarationId(1940), payload: vec![] }] }, FieldValue::Variant { constructor: DeclarationId(1943), payload: vec![FieldValue::Literal(LiteralBits::String("i64".to_string())), FieldValue::Variant { constructor: DeclarationId(1930), payload: vec![] }, FieldValue::Variant { constructor: DeclarationId(1938), payload: vec![] }, FieldValue::Literal(LiteralBits::String("-9223372036854775808".to_string())), FieldValue::Literal(LiteralBits::String("9223372036854775807".to_string())), FieldValue::Literal(LiteralBits::Bool(true)), FieldValue::Variant { constructor: DeclarationId(1940), payload: vec![] }] }, FieldValue::Variant { constructor: DeclarationId(1943), payload: vec![FieldValue::Literal(LiteralBits::String("u8".to_string())), FieldValue::Variant { constructor: DeclarationId(1931), payload: vec![] }, FieldValue::Variant { constructor: DeclarationId(1935), payload: vec![] }, FieldValue::Literal(LiteralBits::String("0".to_string())), FieldValue::Literal(LiteralBits::String("255".to_string())), FieldValue::Literal(LiteralBits::Bool(true)), FieldValue::Variant { constructor: DeclarationId(1940), payload: vec![] }] }, FieldValue::Variant { constructor: DeclarationId(1943), payload: vec![FieldValue::Literal(LiteralBits::String("u16".to_string())), FieldValue::Variant { constructor: DeclarationId(1931), payload: vec![] }, FieldValue::Variant { constructor: DeclarationId(1936), payload: vec![] }, FieldValue::Literal(LiteralBits::String("0".to_string())), FieldValue::Literal(LiteralBits::String("65535".to_string())), FieldValue::Literal(LiteralBits::Bool(true)), FieldValue::Variant { constructor: DeclarationId(1940), payload: vec![] }] }, FieldValue::Variant { constructor: DeclarationId(1943), payload: vec![FieldValue::Literal(LiteralBits::String("u32".to_string())), FieldValue::Variant { constructor: DeclarationId(1931), payload: vec![] }, FieldValue::Variant { constructor: DeclarationId(1937), payload: vec![] }, FieldValue::Literal(LiteralBits::String("0".to_string())), FieldValue::Literal(LiteralBits::String("4294967295".to_string())), FieldValue::Literal(LiteralBits::Bool(true)), FieldValue::Variant { constructor: DeclarationId(1940), payload: vec![] }] }, FieldValue::Variant { constructor: DeclarationId(1943), payload: vec![FieldValue::Literal(LiteralBits::String("u64".to_string())), FieldValue::Variant { constructor: DeclarationId(1931), payload: vec![] }, FieldValue::Variant { constructor: DeclarationId(1938), payload: vec![] }, FieldValue::Literal(LiteralBits::String("0".to_string())), FieldValue::Literal(LiteralBits::String("18446744073709551615".to_string())), FieldValue::Literal(LiteralBits::Bool(true)), FieldValue::Variant { constructor: DeclarationId(1940), payload: vec![] }] }, FieldValue::Variant { constructor: DeclarationId(1944), payload: vec![FieldValue::Literal(LiteralBits::String("bool".to_string())), FieldValue::Variant { constructor: DeclarationId(1932), payload: vec![] }, FieldValue::Variant { constructor: DeclarationId(1934), payload: vec![] }, FieldValue::Literal(LiteralBits::Bool(true))] }, FieldValue::Variant { constructor: DeclarationId(1944), payload: vec![FieldValue::Literal(LiteralBits::String("()".to_string())), FieldValue::Variant { constructor: DeclarationId(1933), payload: vec![] }, FieldValue::Variant { constructor: DeclarationId(1939), payload: vec![] }, FieldValue::Literal(LiteralBits::Bool(true))] }])), refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 9595, 12449) }, Declaration { id: DeclarationId(1311), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(530), arguments: vec![TemplateArgument { parameter: DeclarationId(531), value: DeclarationId(533) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 3259, 3272) }, Declaration { id: DeclarationId(1312), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(530), arguments: vec![TemplateArgument { parameter: DeclarationId(531), value: DeclarationId(535) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 3421, 3434) }, Declaration { id: DeclarationId(1313), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(530), arguments: vec![TemplateArgument { parameter: DeclarationId(531), value: DeclarationId(535) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/list.dag", 3439, 3452) }, @@ -1887,9 +1887,9 @@ pub(crate) fn bootstrapped_fixture_without_parse_surface_dag() -> Dag { Declaration { id: DeclarationId(1879), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 2539, 2548) }, Declaration { id: DeclarationId(1880), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 2553, 2557) }, Declaration { id: DeclarationId(1881), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/tokenize.dag", 2562, 2570) }, - Declaration { id: DeclarationId(1882), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(530), arguments: vec![TemplateArgument { parameter: DeclarationId(531), value: DeclarationId(884) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 12224, 12247) }, - Declaration { id: DeclarationId(1883), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(530), arguments: vec![TemplateArgument { parameter: DeclarationId(531), value: DeclarationId(925) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 12449, 12464) }, - Declaration { id: DeclarationId(1884), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(530), arguments: vec![TemplateArgument { parameter: DeclarationId(531), value: DeclarationId(927) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 12469, 12489) }, + Declaration { id: DeclarationId(1882), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(530), arguments: vec![TemplateArgument { parameter: DeclarationId(531), value: DeclarationId(884) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 13007, 13030) }, + Declaration { id: DeclarationId(1883), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(530), arguments: vec![TemplateArgument { parameter: DeclarationId(531), value: DeclarationId(925) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 13232, 13247) }, + Declaration { id: DeclarationId(1884), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(530), arguments: vec![TemplateArgument { parameter: DeclarationId(531), value: DeclarationId(927) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 13252, 13272) }, Declaration { id: DeclarationId(1885), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 2432, 2446) }, Declaration { id: DeclarationId(1886), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 2451, 2461) }, Declaration { id: DeclarationId(1887), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 2466, 2478) }, @@ -1926,30 +1926,31 @@ pub(crate) fn bootstrapped_fixture_without_parse_surface_dag() -> Dag { Declaration { id: DeclarationId(1918), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(530), arguments: vec![TemplateArgument { parameter: DeclarationId(531), value: DeclarationId(908) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 9305, 9315) }, Declaration { id: DeclarationId(1919), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "authority".to_string(), ty: DeclarationId(938) }, Field { label: "generated_paths".to_string(), ty: DeclarationId(1918) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 9231, 9321) }, Declaration { id: DeclarationId(1920), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "deferred_gate".to_string(), ty: DeclarationId(938) }, Field { label: "target_lane".to_string(), ty: DeclarationId(938) }, Field { label: "authority_doc".to_string(), ty: DeclarationId(938) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 10263, 10397) }, - Declaration { id: DeclarationId(1921), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(530), arguments: vec![TemplateArgument { parameter: DeclarationId(531), value: DeclarationId(884) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 11441, 11464) }, - Declaration { id: DeclarationId(1922), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(530), arguments: vec![TemplateArgument { parameter: DeclarationId(531), value: DeclarationId(925) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 11510, 11525) }, - Declaration { id: DeclarationId(1923), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(530), arguments: vec![TemplateArgument { parameter: DeclarationId(531), value: DeclarationId(884) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 11781, 11804) }, - Declaration { id: DeclarationId(1924), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(530), arguments: vec![TemplateArgument { parameter: DeclarationId(531), value: DeclarationId(666) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/workflows.dag", 992, 1006) }, - Declaration { id: DeclarationId(1925), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 532, 547) }, - Declaration { id: DeclarationId(1926), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 550, 561) }, - Declaration { id: DeclarationId(1927), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 564, 576) }, - Declaration { id: DeclarationId(1928), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(646), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/operators.dag", 142, 155) }, - Declaration { id: DeclarationId(1929), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 5254, 5272) }, - Declaration { id: DeclarationId(1930), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 5277, 5292) }, - Declaration { id: DeclarationId(1931), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 5321, 5342) }, - Declaration { id: DeclarationId(1932), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 5347, 5362) }, - Declaration { id: DeclarationId(1933), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 6875, 6885) }, - Declaration { id: DeclarationId(1934), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 6890, 6901) }, - Declaration { id: DeclarationId(1935), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 6906, 6919) }, - Declaration { id: DeclarationId(1936), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 6924, 6937) }, - Declaration { id: DeclarationId(1937), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 6942, 6955) }, - Declaration { id: DeclarationId(1938), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 6960, 6975) }, - Declaration { id: DeclarationId(1939), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 7717, 7734) }, - Declaration { id: DeclarationId(1940), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 7739, 7749) }, - Declaration { id: DeclarationId(1941), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 7754, 7758) }, - Declaration { id: DeclarationId(1942), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "target_name".to_string(), ty: DeclarationId(186) }, Field { label: "algebra".to_string(), ty: DeclarationId(1305) }, Field { label: "carrier".to_string(), ty: DeclarationId(1307) }, Field { label: "range_min_inclusive".to_string(), ty: DeclarationId(186) }, Field { label: "range_max_inclusive".to_string(), ty: DeclarationId(186) }, Field { label: "is_copy".to_string(), ty: DeclarationId(88) }, Field { label: "overflow".to_string(), ty: DeclarationId(1308) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 8536, 9108) }, - Declaration { id: DeclarationId(1943), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "target_name".to_string(), ty: DeclarationId(186) }, Field { label: "algebra".to_string(), ty: DeclarationId(1306) }, Field { label: "carrier".to_string(), ty: DeclarationId(1307) }, Field { label: "is_copy".to_string(), ty: DeclarationId(88) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 9113, 9295) }, - Declaration { id: DeclarationId(1944), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(530), arguments: vec![TemplateArgument { parameter: DeclarationId(531), value: DeclarationId(1309) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 9623, 9642) }, + Declaration { id: DeclarationId(1921), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "deferred_gate".to_string(), ty: DeclarationId(938) }, Field { label: "target_lane".to_string(), ty: DeclarationId(938) }, Field { label: "authority_doc".to_string(), ty: DeclarationId(938) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 11036, 11180) }, + Declaration { id: DeclarationId(1922), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(530), arguments: vec![TemplateArgument { parameter: DeclarationId(531), value: DeclarationId(884) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 12224, 12247) }, + Declaration { id: DeclarationId(1923), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(530), arguments: vec![TemplateArgument { parameter: DeclarationId(531), value: DeclarationId(925) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 12293, 12308) }, + Declaration { id: DeclarationId(1924), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(530), arguments: vec![TemplateArgument { parameter: DeclarationId(531), value: DeclarationId(884) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/verification.dag", 12564, 12587) }, + Declaration { id: DeclarationId(1925), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(530), arguments: vec![TemplateArgument { parameter: DeclarationId(531), value: DeclarationId(666) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/workflows.dag", 992, 1006) }, + Declaration { id: DeclarationId(1926), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 532, 547) }, + Declaration { id: DeclarationId(1927), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 550, 561) }, + Declaration { id: DeclarationId(1928), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/pipeline.dag", 564, 576) }, + Declaration { id: DeclarationId(1929), name: None, connective: TypeConnective::Cardinality(CardinalityPayload::new_unchecked(DeclarationId(646), CardinalityBound::AtMostOne)), type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/compiler/operators.dag", 142, 155) }, + Declaration { id: DeclarationId(1930), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 5254, 5272) }, + Declaration { id: DeclarationId(1931), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 5277, 5292) }, + Declaration { id: DeclarationId(1932), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 5321, 5342) }, + Declaration { id: DeclarationId(1933), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 5347, 5362) }, + Declaration { id: DeclarationId(1934), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 6875, 6885) }, + Declaration { id: DeclarationId(1935), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 6890, 6901) }, + Declaration { id: DeclarationId(1936), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 6906, 6919) }, + Declaration { id: DeclarationId(1937), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 6924, 6937) }, + Declaration { id: DeclarationId(1938), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 6942, 6955) }, + Declaration { id: DeclarationId(1939), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 6960, 6975) }, + Declaration { id: DeclarationId(1940), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 7717, 7734) }, + Declaration { id: DeclarationId(1941), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 7739, 7749) }, + Declaration { id: DeclarationId(1942), name: None, connective: TypeConnective::Conj { children: vec![] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 7754, 7758) }, + Declaration { id: DeclarationId(1943), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "target_name".to_string(), ty: DeclarationId(186) }, Field { label: "algebra".to_string(), ty: DeclarationId(1305) }, Field { label: "carrier".to_string(), ty: DeclarationId(1307) }, Field { label: "range_min_inclusive".to_string(), ty: DeclarationId(186) }, Field { label: "range_max_inclusive".to_string(), ty: DeclarationId(186) }, Field { label: "is_copy".to_string(), ty: DeclarationId(88) }, Field { label: "overflow".to_string(), ty: DeclarationId(1308) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 8536, 9108) }, + Declaration { id: DeclarationId(1944), name: None, connective: TypeConnective::Conj { children: vec![Field { label: "target_name".to_string(), ty: DeclarationId(186) }, Field { label: "algebra".to_string(), ty: DeclarationId(1306) }, Field { label: "carrier".to_string(), ty: DeclarationId(1307) }, Field { label: "is_copy".to_string(), ty: DeclarationId(88) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 9113, 9295) }, + Declaration { id: DeclarationId(1945), name: None, connective: TypeConnective::Instantiation { template: DeclarationId(530), arguments: vec![TemplateArgument { parameter: DeclarationId(531), value: DeclarationId(1309) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: None, specialization_parent: None, inhabits: None, value_body: None, refinement: None, nominal_opacity: None, span: SourceSpan::new("dsl/extdeps/languages/rust/primitives.dag", 9623, 9642) }, ], ports: { let mut ports = HashMap::new(); ports.insert(PortId(0), Port { id: PortId(0), state: PortState::Resolved(TypeShape::new(DeclarationId(682))), produced_by: None }); @@ -2276,7 +2277,7 @@ pub(crate) fn bootstrapped_fixture_without_parse_surface_dag() -> Dag { ports.insert(PortId(321), Port { id: PortId(321), state: PortState::Uninferred, produced_by: Some(NodeId(232)) }); ports.insert(PortId(322), Port { id: PortId(322), state: PortState::Resolved(TypeShape::new(DeclarationId(1539))), produced_by: Some(NodeId(233)) }); ports.insert(PortId(323), Port { id: PortId(323), state: PortState::Resolved(TypeShape::new(DeclarationId(667))), produced_by: None }); - ports.insert(PortId(324), Port { id: PortId(324), state: PortState::Resolved(TypeShape::new(DeclarationId(1924))), produced_by: Some(NodeId(235)) }); + ports.insert(PortId(324), Port { id: PortId(324), state: PortState::Resolved(TypeShape::new(DeclarationId(1925))), produced_by: Some(NodeId(235)) }); ports.insert(PortId(325), Port { id: PortId(325), state: PortState::Resolved(TypeShape::new(DeclarationId(646))), produced_by: None }); ports.insert(PortId(326), Port { id: PortId(326), state: PortState::Uninferred, produced_by: None }); ports.insert(PortId(327), Port { id: PortId(327), state: PortState::Uninferred, produced_by: Some(NodeId(237)) }); @@ -2321,7 +2322,7 @@ pub(crate) fn bootstrapped_fixture_without_parse_surface_dag() -> Dag { , diagnostics: DiagnosticTable::new(), next_node_id: 271, - next_declaration_id: 1945, + next_declaration_id: 1946, next_port_id: 365, primitives: PrimitiveCache::default(), substrate_markers: SubstrateMarkers::default(), From 86d64d2e2d4e0ce49eb1898d17aa1ed75ed8918e Mon Sep 17 00:00:00 2001 From: Brian Searls Date: Wed, 29 Apr 2026 04:52:15 -0400 Subject: [PATCH 03/40] docs(r2): record deferral-predicate audit debt; cite #1179 ratification in SG-0 - Add non-blocking closure-ledger row on ReleaseDeferredClaim vs SubstrateResearchDeferredClaim vs unified DeferredAcceptanceClaim (not a #1179 blocker). - Extend SG-0 census comment with Director ratification (gunb-ai/gunbc#1130 c4341788769). Made-with: Cursor --- docs/r2-closure-ledger.md | 10 ++++++++++ src/v3/compiler/tests/integration/sg0_census_test.rs | 3 ++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/docs/r2-closure-ledger.md b/docs/r2-closure-ledger.md index c18d380f8b6..fd17048f9ef 100644 --- a/docs/r2-closure-ledger.md +++ b/docs/r2-closure-ledger.md @@ -171,6 +171,16 @@ Until both happen, the signal is in-flight. A signal that sits >7 days unreceive --- +## Audit debt — `std.verification` deferral predicates (non-blocking) + +**Recorded:** 2026-04-29 (Director clarification: gunb-ai/gunbc#1130; #1179 direction ratified — separate TC1 fixture + `SubstrateResearchDeferredClaim`). + +| Topic | Status | Notes | +|---|---|---| +| Unify vs split deferral carriers | open (design hygiene) | Today: `ReleaseDeferredClaim` is runner-valid only for `r1_release_acceptance.dag` (R1 release-acceptance discipline); `SubstrateResearchDeferredClaim` is runner-valid only for `tc1_substrate_lens_eta_equivalence_deferred.dag` (TC1 / R2 substrate research). **Open question for a future R2 pass:** collapse into one `DeferredAcceptanceClaim` with a discriminator (fixture / authority lane), or keep separate predicates with fixture-scoped runner gates. Either path preserves current fail-closed behavior. **Not a merge blocker for #1179.** | + +--- + ## Cross-refs - Parent: [`docs/r2-structure.md`](r2-structure.md) §"R2 Release Manager" + §"Manager structure" + §"Cross-manager dependency discipline" + §"Escalation signal channel". diff --git a/src/v3/compiler/tests/integration/sg0_census_test.rs b/src/v3/compiler/tests/integration/sg0_census_test.rs index 400651679d7..60df8bc3ab9 100644 --- a/src/v3/compiler/tests/integration/sg0_census_test.rs +++ b/src/v3/compiler/tests/integration/sg0_census_test.rs @@ -347,7 +347,8 @@ const EXPECTED_HAND_AUTHORED_TEST: &[&str] = &[ "src/v3/compiler/tests/integration/t_pb_b_brief_d_fixture_smoke_test.rs", // TC1 substrate lens eta-equivalence (deferred / R2 research): integration for // `SubstrateResearchDeferredClaim` + `tc1_substrate_lens_eta_equivalence_deferred.dag`. - // SG-0 path ratchet: Director sign-off (gunb-ai/gunbc#1130, comment 4341571168). + // SG-0 path ratchet: Director sign-off (gunb-ai/gunbc#1130, comment 4341571168; + // direction ratified for #1179, comment 4341788769). "src/v3/compiler/tests/integration/tc1_substrate_lens_eta_equivalence_deferred_test.rs", "src/v3/compiler/tests/integration/test_runner_test.rs", "src/v3/compiler/tests/integration/thesis_parallelism_test.rs", From 1d82d8f9ce1ef56c309f7330f089b9a9269fb16d Mon Sep 17 00:00:00 2001 From: Brian Searls Date: Wed, 29 Apr 2026 04:59:27 -0400 Subject: [PATCH 04/40] WIP: calm-hawk-173 --- dsl/v3/std/emit_model.dag | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 dsl/v3/std/emit_model.dag diff --git a/dsl/v3/std/emit_model.dag b/dsl/v3/std/emit_model.dag new file mode 100644 index 00000000000..4b132d5fecd --- /dev/null +++ b/dsl/v3/std/emit_model.dag @@ -0,0 +1,29 @@ +// dsl/v3/std/emit_model.dag — v2 CI / `dag run --source-root dsl` facade for +// `MethodTemplateContract` and friends. +// +// Canonical substrate remains `src/v3/std/emit_model.dag` (v3 compiler). This +// file exists because the v2 interpreter only indexes `--source-root` trees and +// cannot parse full v3 std syntax; `dsl/extdeps/languages/*/method_template_contracts.dag` +// imports `v3.std.emit_model` for typed empty bootstrap lists. +// +// Keep field names and variant tags aligned with the canonical module so +// drift is obvious at review time. + +module v3.std.emit_model + +// Stand-in for `v3.spec.v3_l1::DeclarationRef` — bootstrap rows are empty; +// the real ref type is owned by the v3 spec pipeline. +type DeclarationRef = String + +type PlaceholderConvention + = IndexedArgs + | NamedArg + +// Mirrors `src/v3/std/emit_model.dag` MethodTemplateContract (P1 substrate). +type MethodTemplateContract { + dag_method: DeclarationRef + runtime_template: String + emit_template: String + wraps_result: Bool + placeholder_convention: PlaceholderConvention +} From c1349d0b61491b044c4cd1382bf24b705ab4ad43 Mon Sep 17 00:00:00 2001 From: Brian Searls Date: Wed, 29 Apr 2026 05:11:45 -0400 Subject: [PATCH 05/40] WIP: calm-hawk-173 --- dsl/gunbc/tools/ci_runner.dag | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/dsl/gunbc/tools/ci_runner.dag b/dsl/gunbc/tools/ci_runner.dag index a88fd1580f2..9741b43427d 100644 --- a/dsl/gunbc/tools/ci_runner.dag +++ b/dsl/gunbc/tools/ci_runner.dag @@ -8,6 +8,10 @@ // Entry point: run_ci_pipeline() // Run via: dag run --source-root dsl --function run_ci_pipeline // +// `dsl/extdeps/.../method_template_contracts.dag` imports `v3.std.emit_model`; the +// v2 interpreter only indexes `--source-root` trees, so the parseable facade lives +// at `dsl/v3/std/emit_model.dag` (canonical substrate: `src/v3/std/emit_model.dag`). +// // Target YAML shim (replaces 8 steps with 1): // - run: cargo run -p v2-compiler --release -- run --source-root dsl --function run_ci_pipeline From 45635728f99c6dbcc724974283e94eb3b3474406 Mon Sep 17 00:00:00 2001 From: Brian Searls Date: Wed, 29 Apr 2026 05:26:28 -0400 Subject: [PATCH 06/40] WIP: calm-hawk-173 --- src/v3/compiler/tests/integration/parse_corpus_manifest.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/v3/compiler/tests/integration/parse_corpus_manifest.txt b/src/v3/compiler/tests/integration/parse_corpus_manifest.txt index 0ec5a2f64e6..c703e6a0ab0 100644 --- a/src/v3/compiler/tests/integration/parse_corpus_manifest.txt +++ b/src/v3/compiler/tests/integration/parse_corpus_manifest.txt @@ -29,7 +29,7 @@ src/v3/std/diagnostics.dag 10 12179 bc414c493551b464 src/v3/std/dimensions.dag 21 40239 d595746d2bda22f6 src/v3/std/effects.dag 53 97984 1acdbeaa68acfd2e src/v3/std/emit_model.dag 34 65593 49cc4eb1f1faadcd -src/v3/std/extdeps_bootstrap_fixtures.dag 4 12175 6deea03a77be5cf3 +src/v3/std/extdeps_bootstrap_fixtures.dag 4 4912 e2b6d96f5900a70a src/v3/std/induction.dag 56 88794 546f74c63c189c50 src/v3/std/lens.dag 6 9852 28d5539a5b28716e src/v3/std/list.dag 19 40269 8c648d4a4fd05c21 From 443c7273ee6da91d0c3de19413b3df09a337365b Mon Sep 17 00:00:00 2001 From: Brian Searls Date: Wed, 29 Apr 2026 05:29:31 -0400 Subject: [PATCH 07/40] WIP: calm-hawk-173 --- src/v3/compiler/tests/integration/sg0_census_test.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/v3/compiler/tests/integration/sg0_census_test.rs b/src/v3/compiler/tests/integration/sg0_census_test.rs index 60df8bc3ab9..7536635044d 100644 --- a/src/v3/compiler/tests/integration/sg0_census_test.rs +++ b/src/v3/compiler/tests/integration/sg0_census_test.rs @@ -348,7 +348,7 @@ const EXPECTED_HAND_AUTHORED_TEST: &[&str] = &[ // TC1 substrate lens eta-equivalence (deferred / R2 research): integration for // `SubstrateResearchDeferredClaim` + `tc1_substrate_lens_eta_equivalence_deferred.dag`. // SG-0 path ratchet: Director sign-off (gunb-ai/gunbc#1130, comment 4341571168; - // direction ratified for #1179, comment 4341788769). + // direction ratified for #1179, comment 4341788769; mechanical checklist c4341800724). "src/v3/compiler/tests/integration/tc1_substrate_lens_eta_equivalence_deferred_test.rs", "src/v3/compiler/tests/integration/test_runner_test.rs", "src/v3/compiler/tests/integration/thesis_parallelism_test.rs", From ba7863dff6c28dca14e88631900013b588732177 Mon Sep 17 00:00:00 2001 From: Brian Searls Date: Wed, 29 Apr 2026 09:30:43 +0000 Subject: [PATCH 08/40] docs(dsl): fix ci_runner note after extdeps method-template removal (#1188) The v2 CI facade comment no longer references deleted method_template_contracts.dag paths. Made-with: Cursor --- dsl/gunbc/tools/ci_runner.dag | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/dsl/gunbc/tools/ci_runner.dag b/dsl/gunbc/tools/ci_runner.dag index 9741b43427d..5af94f88eab 100644 --- a/dsl/gunbc/tools/ci_runner.dag +++ b/dsl/gunbc/tools/ci_runner.dag @@ -8,9 +8,9 @@ // Entry point: run_ci_pipeline() // Run via: dag run --source-root dsl --function run_ci_pipeline // -// `dsl/extdeps/.../method_template_contracts.dag` imports `v3.std.emit_model`; the -// v2 interpreter only indexes `--source-root` trees, so the parseable facade lives -// at `dsl/v3/std/emit_model.dag` (canonical substrate: `src/v3/std/emit_model.dag`). +// v2 `dag run --source-root dsl` only indexes that tree. If a dsl `.dag` imports +// `v3.std.emit_model`, resolution uses the parseable facade `dsl/v3/std/emit_model.dag` +// (canonical substrate: `src/v3/std/emit_model.dag`). // // Target YAML shim (replaces 8 steps with 1): // - run: cargo run -p v2-compiler --release -- run --source-root dsl --function run_ci_pipeline From 0d7c5c23590bd583d0b67d15e6a44ad442192357 Mon Sep 17 00:00:00 2001 From: Brian Searls Date: Wed, 29 Apr 2026 09:37:51 +0000 Subject: [PATCH 09/40] chore(v3): SG-0 receipt for Director cycle-5 rebase pass (#1142 c4341940508) Rebased onto main at 192ea4854; parse manifest refresh + census verified. Made-with: Cursor --- src/v3/compiler/tests/integration/sg0_census_test.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/v3/compiler/tests/integration/sg0_census_test.rs b/src/v3/compiler/tests/integration/sg0_census_test.rs index 7536635044d..9fbb4520ce2 100644 --- a/src/v3/compiler/tests/integration/sg0_census_test.rs +++ b/src/v3/compiler/tests/integration/sg0_census_test.rs @@ -348,7 +348,8 @@ const EXPECTED_HAND_AUTHORED_TEST: &[&str] = &[ // TC1 substrate lens eta-equivalence (deferred / R2 research): integration for // `SubstrateResearchDeferredClaim` + `tc1_substrate_lens_eta_equivalence_deferred.dag`. // SG-0 path ratchet: Director sign-off (gunb-ai/gunbc#1130, comment 4341571168; - // direction ratified for #1179, comment 4341788769; mechanical checklist c4341800724). + // direction ratified for #1179, comment 4341788769; mechanical checklist c4341800724; + // cycle-5 merge hygiene gunb-ai/gunbc#1142 c4341940508). "src/v3/compiler/tests/integration/tc1_substrate_lens_eta_equivalence_deferred_test.rs", "src/v3/compiler/tests/integration/test_runner_test.rs", "src/v3/compiler/tests/integration/thesis_parallelism_test.rs", From a717b9aee2511cfefc4e7d7a1bd7603834138d82 Mon Sep 17 00:00:00 2001 From: Brian Searls Date: Wed, 29 Apr 2026 10:08:04 +0000 Subject: [PATCH 10/40] chore: refresh PR head for merge-state reconciliation (no file changes) Made-with: Cursor From ccbc72158ec6d0d03daf7bd30c5d2fdc28b7d7bf Mon Sep 17 00:00:00 2001 From: Brian Searls Date: Wed, 29 Apr 2026 06:11:40 -0400 Subject: [PATCH 11/40] fix(dsl): single v2 facade for v3.std.emit_model (P2 duplicate authority) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Remove dsl/shims/v3_std_emit_model.dag (duplicate module v3.std.emit_model vs main). - Keep dsl/v3/std/emit_model.dag as the sole parseable mirror; add explicit 🟡 dissolution trigger in the header (tracked scaffold per INVARIANTS P2). Made-with: Cursor --- dsl/shims/v3_std_emit_model.dag | 28 ---------------------------- dsl/v3/std/emit_model.dag | 17 +++++++++++------ 2 files changed, 11 insertions(+), 34 deletions(-) delete mode 100644 dsl/shims/v3_std_emit_model.dag diff --git a/dsl/shims/v3_std_emit_model.dag b/dsl/shims/v3_std_emit_model.dag deleted file mode 100644 index f7ddc1e3f9a..00000000000 --- a/dsl/shims/v3_std_emit_model.dag +++ /dev/null @@ -1,28 +0,0 @@ -// dsl/shims/v3_std_emit_model.dag — v2 `dag run` CI visibility for `module v3.std.emit_model`. -// -// The substrate authority remains `src/v3/std/emit_model.dag` (v3 compiler). v2's CI indexes -// only `--source-root dsl`, so imports from `dsl/extdeps/languages/*/method_template_contracts.dag` -// cannot see src/v3. This file repeats the **nominal** exports those stubs need so the v2 -// interpreter can validate the extdeps graph; keep field shapes aligned with the substrate type. -// -// **Dissolution trigger:** delete this shim when `run_ci_pipeline` (or equivalent v2 `dag run` -// entry used in CI) passes `--source-root` such that `src/v3/std/emit_model.dag` is indexed and -// `module v3.std.emit_model` resolves there **without** introducing a duplicate-module conflict in -// v3 bootstrap — e.g. CI adds `src/v3/std` as a second root with v3 loader semantics unchanged, or -// v2 gains first-class multi-root resolution for `v3.std.*` from `dsl/` alone. - -module v3.std.emit_model - -type DeclarationRef {} - -type PlaceholderConvention - = IndexedArgs - | NamedArg - -type MethodTemplateContract { - dag_method: DeclarationRef - runtime_template: String - emit_template: String - wraps_result: Bool - placeholder_convention: PlaceholderConvention -} diff --git a/dsl/v3/std/emit_model.dag b/dsl/v3/std/emit_model.dag index 4b132d5fecd..85900cef311 100644 --- a/dsl/v3/std/emit_model.dag +++ b/dsl/v3/std/emit_model.dag @@ -1,13 +1,18 @@ // dsl/v3/std/emit_model.dag — v2 CI / `dag run --source-root dsl` facade for // `MethodTemplateContract` and friends. // -// Canonical substrate remains `src/v3/std/emit_model.dag` (v3 compiler). This -// file exists because the v2 interpreter only indexes `--source-root` trees and -// cannot parse full v3 std syntax; `dsl/extdeps/languages/*/method_template_contracts.dag` -// imports `v3.std.emit_model` for typed empty bootstrap lists. +// Canonical substrate: `src/v3/std/emit_model.dag` (v3 compiler). The v2 interpreter +// indexes only `--source-root` trees and cannot parse full v3 std syntax, so this file +// supplies a v2-parseable `module v3.std.emit_model` when dsl sources import it (notably +// CI: `run_ci_pipeline` → `gunbc.tools.ci_runner`). // -// Keep field names and variant tags aligned with the canonical module so -// drift is obvious at review time. +// Keep field names and variant tags aligned with the canonical module so drift is +// obvious at review time. +// +// **🟡 Scaffold — dissolution trigger:** delete this facade when CI / `dag run` can +// index `src/v3/std/emit_model.dag` without v2 parse failures (e.g. `src/v3` as an +// additional `--source-root` with v3 semantics, or v2 retirement), or when +// `v3.std.emit_model` no longer needs to resolve under `--source-root dsl` alone. module v3.std.emit_model From 201350ba468106c07816e225ecd7703dd32fbb97 Mon Sep 17 00:00:00 2001 From: Brian Searls Date: Wed, 29 Apr 2026 11:01:47 -0400 Subject: [PATCH 12/40] WIP: calm-hawk-173 --- docs/parallelism-lens-migration-audit.md | 111 +++++++++++++++++++++++ 1 file changed, 111 insertions(+) create mode 100644 docs/parallelism-lens-migration-audit.md diff --git a/docs/parallelism-lens-migration-audit.md b/docs/parallelism-lens-migration-audit.md new file mode 100644 index 00000000000..a9cba0f77ba --- /dev/null +++ b/docs/parallelism-lens-migration-audit.md @@ -0,0 +1,111 @@ +# Parallelism lens migration — audit / prep (PROXY → `Lens`) + +**Dispatch:** inbox #1130 / #4344943395 (parallelism.dag lens migration audit slice). +**Status:** PRE-IMPLEMENTATION — no `.dag` instance, no hand-Rust `Lens` scaffolding. +**Shared blocker (confirmed):** real `data : Lens = { ... }` requires **class-5 data-body / function-value lowering** plus **`fold_lens`** (see `src/v3/std/lens.dag`, `src/v3/std/dimensions.dag`, ROADMAP / tidy-wolf-507). Do not fake the instance. + +--- + +## 1. Sources read (authority map) + +| Artifact | Role today | +|----------|------------| +| `src/v3/std/lens.dag` | Director-locked **6-field `Lens`** contract: `name`, `read`, `sequential`, `branch`, `iterate`, `validate`. | +| `src/v3/lenses/parallelism.dag` | **STUB:** `analyze_parallelism` always returns `report_parallelism_unsupported(LensSurfacePending, …)`. | +| `src/v3/compiler/src/workflow_parallelism.rs` | **Authoritative Stage 2e analysis** (`analyze_parallelism(d, workflow_root)`). | +| `src/v3/std/effects.dag` | Carriers: `WorkflowParallelismReport`, `ParallelismUnsupportedKind`, `CompositionVerdict`, `WorkflowEffect::ParallelEffect`. | +| `docs/design-lens-framework.md` **§M4** | Acceptance: TestClaim `parallelism_lens_via_framework_correct`; retire placeholder after migration. | + +--- + +## 2. Target carrier naming (`ParallelismVerdict` vs substrate) + +Dispatch uses **“ParallelismVerdict”**; the locked substrate type is **`WorkflowParallelismReport`** (`effects.dag`): + +- `ParallelCompositionVerdict(CompositionVerdict)` with `CompositionVerdict = IdempotentComposition | BrokenBy { first_breaker: … }` +- `ParallelismUnsupported(ParallelismUnsupportedDetail)` with explicit `ParallelismUnsupportedKind` (including `LensSurfacePending` for the current stub path). + +**Recommendation:** treat **`C = WorkflowParallelismReport`** (or a thin newtype alias in `.dag` if nominal opacity is needed) for the lens instance **only if** the fold can lawfully produce `DimensionReport` without inventing monoid structure that `WorkflowParallelismReport` does not satisfy (see §5). + +--- + +## 3. Mapping `Lens` fields → intended parallelism semantics + +| `Lens` field | Intended role for parallelism | Current Rust analogue | +|-----------------|------------------------------|------------------------| +| **`name`** | `DimensionReport.dimension_name` / human id for the dimension. | Implicit `"lane2_stage2e_parallelism_lens"` in `DOWNSTREAM` / `downstream_stage` strings. | +| **`read`** | Per-**Behavior** evidence: `Witness` (fail-closed, no fabricated `C`). | **Mismatch risk (§6):** Rust walks **`ParallelEffect` branches** at **`workflow_root`**, not arbitrary `Behavior` nodes. Evidence is **cross-branch operation lists** + commutativity / breaking checks. | +| **`sequential`** | `Monoid` for `BindNode` along a **linear** branch. | Linear branch ops are `Vec`; idempotent op commute is **pairwise**, not a single monoid fold over `C` as today’s cost monoid unless `C` encodes partial evidence. | +| **`branch`** | `fn(C,C)->C` join over **exclusive** branch arms (max/join semantics). | Cross-branch **pairwise** `operations_commute` across **different** arms — algebraically closer to a **join over per-arm summaries** than to `branch` on two `C` values unless each arm collapses to one `C`. | +| **`iterate`** | `fn(C, LoopBound)->C` for loops. | **Not used** in Stage 2e v1: non-linear parallel interior → `NonLinearParallelBranch` unsupported. | +| **`validate`** | `fn(Dag, C) -> OptionalDiagnostic` aggregate side-conditions. | Partially folded into **unsupported reasons** and `BrokenBy` path; no separate aggregate pass today beyond commutativity / breaker scan. | + +--- + +## 4. Branch-arm coverage / dependency-graph facts + +**Within current Rust scope (v1):** + +- Requires **`WorkflowEffect::ParallelEffect { branches }`** where **every** branch is **`LinearEffect { ops }`** (`extract_linear_branches`). Any other shape → `NonLinearParallelBranch`. +- **Breaking scan** is **global across flattened branch ops** (`first_breaking_across_branches`) — order is the **branch-order flattening** contract documented in Rust; `WorkflowEffect::operation_at` must resolve `ElementRef` consistently. +- **Commutativity** is **pairwise across distinct branches** (not along a single sequential spine). + +**Beyond `Lens.read: (Dag, Behavior) -> Witness` as written:** + +- The analysis is **rooted at a workflow projection** (`lane2_workflow_effect_at` / `lane2_workflow` on `Value`/`Bind`), not at “each Behavior in a post-order fold.” +- True **schedule-level dependency graph** (partial order of ops across branches with data deps) is **not** modeled in `workflow_parallelism.rs` today — only **operation-shape commute** on classified `OperationEffect` pairs. + +So: **branch-arm coverage is required** for the current algorithm, but **fine-grained data-dependence between branches** is **out of scope** in the existing Rust oracle. If the lens framework migration accidentally forces a **pure per-Behavior read**, we would **lose** the current **explicit parallel-branch structure** unless we redesign how `read` obtains its evidence. + +--- + +## 5. Blockers + +### 5.1 Shared prerequisite (blocking everyone) + +- **Class-5 lowering** for `data … Lens<…> = { … }` bodies + **`fold_lens`** end-to-end. No workaround with hand-Rust lens instances or callable-form fakery. + +### 5.2 Additional substrate / design gap (beyond 5.1) + +**Yes — one substantive gap beyond the shared prerequisite:** + +**`Lens.read` input domain vs Stage 2e analysis domain** + +- `Lens.read` is defined over **`(Dag, Behavior)`** (per `lens.dag` and M4/M8 narrative in the design doc). +- `analyze_parallelism` is defined over **`(Dag, workflow_root: NodeId)`** and inspects a **`WorkflowEffect`** subtree (`ParallelEffect` → list of **`LinearEffect`** branches). + +**Implication:** a naïve “port Rust into `read` bodies” without framework extension risks: + +1. **Fabricating** per-Behavior `Witness` values that do not correspond to any real Stage 2e evidence step, or +2. **Encoding workflow-root** as a magic `Behavior` (bridge / non-structural), or +3. **Splitting** the analysis into artificial per-Behavior slices that do not match the current **cross-branch** proof obligations. + +**Disposition options (pick at lens-framework design time, before M4 implementation PR):** + +- **(A) Framework extension:** introduce a **workflow-scoped** analysis hook (analogous to design-doc **L6** rationale — input space not reducible to per-Behavior `read` only), *or* generalize `read` with an explicit **witness context** parameter (larger substrate change — **not** this audit’s decision). +- **(B) Carrier redesign:** make `C` a **per-arm partial summary** so `read`/`branch`/`sequential` genuinely factor the existing proof — requires proving the Rust algorithm is expressible as that fold **without** hidden global state (hard; needs formal sketch). +- **(C) Keep parallelism outside strict `Lens`:** conflicts with **M4** as written; only viable if M4 is reinterpreted (unlikely without Director). + +**Explicit statement for acceptance:** there **is** an **extra design blocker** — **read-channel / entry-point mismatch** between **`Lens.read`** and **workflow-rooted `ParallelEffect` analysis** — **in addition to** the shared class-5 + `fold_lens` prerequisite. + +--- + +## 6. M4 implementation checklist (post-prerequisites) + +Use after class-5 + `fold_lens` land; order is suggestive, not a commitment. + +1. **Lock disposition** for §5.2 (A vs B); record in `docs/design-lens-framework.md` or Director thread — **before** authoring `data parallelism_lens: Lens<…>`. +2. **Freeze carrier `C`** — default proposal: `WorkflowParallelismReport` **iff** monoid/branch/iterate story composes; else define a **summary carrier** + final `validate` projection to `WorkflowParallelismReport`. +3. **Author `Lens` in `.dag`** with six fields; **no** Rust literals for the record body beyond what lowering allows. +4. **Port logic** from `workflow_parallelism.rs` into field bodies / `std.effects` helpers per chosen disposition (minimize duplicate authority with Rust — pick **one** execution site until self-host parity). +5. **Replace** `parallelism.dag` stub with real dispatch (mirror `idempotency.dag` pattern: `lane2_workflow_at` + `match` on `WorkflowEffect` where applicable). +6. **Add** TestClaim **`parallelism_lens_via_framework_correct`** per **M4**; extend `lane2_stage_2e_parallelism_test.rs` to compare against **frozen** oracle vectors (same discipline as other lens migrations). +7. **Retire** placeholder `LensSurfacePending` path for the migrated entrypoint once `.dag` path is green. +8. **SG-0 / manifest** if new hand-authored files appear; **regen_bootstrap** if `effects.dag` / `lens.dag` shapes change. + +--- + +## 7. Non-goals (this audit) + +- No Rust implementation edits in this slice. +- No `Lens` naming in substrate until `WorkflowParallelismReport` rename is a Director-owned decision. From f745a6142b339638aecf0048d74ec944f2137eb3 Mon Sep 17 00:00:00 2001 From: Brian Searls Date: Wed, 29 Apr 2026 13:51:21 -0400 Subject: [PATCH 13/40] WIP: calm-hawk-173 --- src/v3/compiler/src/dag.rs | 87 +++++++++++++++++++++ src/v3/compiler/src/regen_bootstrap_emit.rs | 6 ++ src/v3/compiler/src/serialize_generated.rs | 11 +++ 3 files changed, 104 insertions(+) diff --git a/src/v3/compiler/src/dag.rs b/src/v3/compiler/src/dag.rs index bef81ed4788..c9fc09844cc 100644 --- a/src/v3/compiler/src/dag.rs +++ b/src/v3/compiler/src/dag.rs @@ -2358,6 +2358,13 @@ pub struct Dag { /// inference needs stable `Some` / `None` variant identities without /// promoting optionals into named top-level declarations. optional_match_disjs: HashMap, + /// Exclusive lower bound on [`DeclarationId::raw`] for declarations + /// appended **after** embedded bootstrap fixture construction for this + /// `Dag`. Bootstrap rows use `raw() <` this value; runtime / user-phase + /// allocations use `raw() >=` this value (structural; do not infer from + /// `span.file`). `0` for [`Dag::empty`]; stamped when serving + /// [`Dag::new`] and sibling bootstrap snapshots. + declaration_append_begin_after_bootstrap: u32, } static BOOTSTRAPPED_DAG: LazyLock = LazyLock::new(|| { @@ -2366,6 +2373,7 @@ static BOOTSTRAPPED_DAG: LazyLock = LazyLock::new(|| { assert_bootstrap_fixture_paths_match_regen_keys(&dag); dag.populate_primitive_cache(); crate::int_literal_ranges::validate_rust_pilot_integer_primitives(&mut dag); + dag.stamp_declaration_append_begin_after_bootstrap(); dag }); @@ -2376,6 +2384,7 @@ static BOOTSTRAPPED_STD_FIXTURE_DAG: LazyLock = LazyLock::new(|| { let mut dag = bootstrap_std_generated::bootstrapped_std_fixture_dag(); dag.mark_bootstrap_secret_nominal_opacity(); dag.populate_primitive_cache(); + dag.stamp_declaration_append_begin_after_bootstrap(); dag }); @@ -2386,6 +2395,7 @@ static BOOTSTRAPPED_DAG_WITHOUT_PARSE_SURFACE_FIXTURE: LazyLock = LazyLock: assert_bootstrap_fixture_paths_match_regen_keys(&dag); dag.populate_primitive_cache(); crate::int_literal_ranges::validate_rust_pilot_integer_primitives(&mut dag); + dag.stamp_declaration_append_begin_after_bootstrap(); dag }); @@ -2417,6 +2427,7 @@ impl Dag { callable_strategy_variants: CallableStrategyVariants::default(), clusters: Vec::new(), optional_match_disjs: HashMap::new(), + declaration_append_begin_after_bootstrap: 0, } } @@ -2424,6 +2435,24 @@ impl Dag { (*BOOTSTRAPPED_DAG).clone() } + /// First [`DeclarationId::raw`] reserved for declarations appended after + /// embedded bootstrap construction. Values strictly below this bound index + /// bootstrap fixture rows; values at or above were allocated afterward + /// (user compile / lowering), without consulting `span.file`. + pub fn post_bootstrap_declaration_append_begin(&self) -> u32 { + self.declaration_append_begin_after_bootstrap + } + + /// `true` when `id` was allocated after bootstrap for this `Dag` (same + /// predicate as `id.raw() >= self.post_bootstrap_declaration_append_begin()`). + pub fn is_runtime_appended_declaration(&self, id: DeclarationId) -> bool { + id.raw() >= self.declaration_append_begin_after_bootstrap + } + + fn stamp_declaration_append_begin_after_bootstrap(&mut self) { + self.declaration_append_begin_after_bootstrap = self.next_declaration_id; + } + fn mark_bootstrap_secret_nominal_opacity(&mut self) { // Bridge until source-level nominal_opacity marking is lowered and // regen_bootstrap carries std Secret through the generated fixtures. @@ -3732,6 +3761,64 @@ mod tests { /// [`EmitAnchorCache`] role on the bootstrapped std/spec surface. If a /// substrate name moves or a fixture omits a declaration, accessors /// flip to `None` and emit paths lose typed anchors (ROADMAP P3). + #[test] + fn post_bootstrap_declaration_append_begin_is_zero_on_empty() { + let dag = Dag::empty(); + assert_eq!(dag.post_bootstrap_declaration_append_begin(), 0); + } + + #[test] + fn dag_new_bootstrap_declaration_ids_are_below_append_begin() { + let dag = Dag::new(); + let begin = dag.post_bootstrap_declaration_append_begin(); + assert_eq!(begin as usize, dag.declarations().len()); + for d in dag.declarations() { + assert!( + d.id.raw() < begin, + "expected bootstrap id {:?} < {}", + d.id, + begin + ); + assert!( + !dag.is_runtime_appended_declaration(d.id), + "bootstrap decl {:?} must not classify as runtime-appended", + d.id + ); + } + } + + #[test] + fn runtime_appended_declaration_is_detected() { + let mut dag = Dag::new(); + let begin = dag.post_bootstrap_declaration_append_begin(); + let binding_meta = dag + .declaration_by_name("TargetCleanEmissionBinding") + .expect("binding meta") + .id; + let rust_language = dag.rust_language_spec().expect("rust language"); + let new_id = dag.alloc_declaration_id(); + assert_eq!(new_id.raw(), begin); + dag.push_declaration(Declaration { + id: new_id, + name: Some("append_boundary_probe_decl".to_string()), + connective: TypeConnective::Atom(AtomPayload::ResolvedByStructure(binding_meta)), + type_params: Vec::new(), + phantom_params: Vec::new(), + meta_tag: Some(binding_meta), + specialization_parent: None, + inhabits: None, + value_body: Some(binding_fields( + rust_language, + dag.go_clean_emission_spec().expect("go clean emission"), + )), + refinement: None, + nominal_opacity: None, + span: SourceSpan::new("append_boundary_probe.v3", 0, 1), + }); + assert!(new_id.raw() >= begin); + assert!(dag.is_runtime_appended_declaration(new_id)); + } + #[test] fn emit_anchor_cache_populated_after_bootstrap() { let dag = Dag::new(); diff --git a/src/v3/compiler/src/regen_bootstrap_emit.rs b/src/v3/compiler/src/regen_bootstrap_emit.rs index ec2454dfb30..16c15027bdb 100644 --- a/src/v3/compiler/src/regen_bootstrap_emit.rs +++ b/src/v3/compiler/src/regen_bootstrap_emit.rs @@ -96,6 +96,12 @@ fn emit_bootstrap_module(dag: &Dag, function_name: &str) -> String { &render_optional_match_disjs(dag), 2, ); + push_field( + &mut out, + "declaration_append_begin_after_bootstrap", + &dag.declarations().len().to_string(), + 2, + ); out.push_str(" }\n"); out.push_str("}\n"); out diff --git a/src/v3/compiler/src/serialize_generated.rs b/src/v3/compiler/src/serialize_generated.rs index b7f244c7d58..1673b5d1b76 100644 --- a/src/v3/compiler/src/serialize_generated.rs +++ b/src/v3/compiler/src/serialize_generated.rs @@ -183,6 +183,17 @@ pub fn first_difference(lhs: &Dag, rhs: &Dag) -> Option { } } + if lhs.post_bootstrap_declaration_append_begin() != rhs.post_bootstrap_declaration_append_begin() + { + return Some(DagDifference { + detail: format!( + "declaration append begin mismatch: pass1={}, pass2={}", + lhs.post_bootstrap_declaration_append_begin(), + rhs.post_bootstrap_declaration_append_begin(), + ), + }); + } + None } From 7669c5e5c60a04d25d6bc7736db7cb0b8d84b9d7 Mon Sep 17 00:00:00 2001 From: Brian Searls Date: Wed, 29 Apr 2026 13:52:55 -0400 Subject: [PATCH 14/40] WIP: calm-hawk-173 --- src/v3/compiler/src/bootstrap_generated.rs | 1 + src/v3/compiler/src/bootstrap_generated_without_parse_surface.rs | 1 + src/v3/compiler/src/bootstrap_std_generated.rs | 1 + 3 files changed, 3 insertions(+) diff --git a/src/v3/compiler/src/bootstrap_generated.rs b/src/v3/compiler/src/bootstrap_generated.rs index b1d262c53b2..592b39a225e 100644 --- a/src/v3/compiler/src/bootstrap_generated.rs +++ b/src/v3/compiler/src/bootstrap_generated.rs @@ -2490,5 +2490,6 @@ pub(crate) fn bootstrapped_fixture_dag() -> Dag { callable_strategy_variants: CallableStrategyVariants::default(), clusters: vec![], optional_match_disjs: HashMap::new(), + declaration_append_begin_after_bootstrap: 2100, } } diff --git a/src/v3/compiler/src/bootstrap_generated_without_parse_surface.rs b/src/v3/compiler/src/bootstrap_generated_without_parse_surface.rs index d1048d1a666..3ed7f18b8bf 100644 --- a/src/v3/compiler/src/bootstrap_generated_without_parse_surface.rs +++ b/src/v3/compiler/src/bootstrap_generated_without_parse_surface.rs @@ -2407,5 +2407,6 @@ pub(crate) fn bootstrapped_fixture_without_parse_surface_dag() -> Dag { callable_strategy_variants: CallableStrategyVariants::default(), clusters: vec![], optional_match_disjs: HashMap::new(), + declaration_append_begin_after_bootstrap: 2017, } } diff --git a/src/v3/compiler/src/bootstrap_std_generated.rs b/src/v3/compiler/src/bootstrap_std_generated.rs index 9e6c869ffa5..41f19e2536d 100644 --- a/src/v3/compiler/src/bootstrap_std_generated.rs +++ b/src/v3/compiler/src/bootstrap_std_generated.rs @@ -12413,5 +12413,6 @@ pub(crate) fn bootstrapped_std_fixture_dag() -> Dag { callable_strategy_variants: CallableStrategyVariants::default(), clusters: vec![], optional_match_disjs: HashMap::new(), + declaration_append_begin_after_bootstrap: 594, } } From 79eef966e405bb847cb9ccd8415784aba1908548 Mon Sep 17 00:00:00 2001 From: Brian Searls Date: Wed, 29 Apr 2026 13:54:24 -0400 Subject: [PATCH 15/40] WIP: calm-hawk-173 --- scripts/regen_runtime_mirrors.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/scripts/regen_runtime_mirrors.py b/scripts/regen_runtime_mirrors.py index fbb31dd4d0d..936b4ebe991 100644 --- a/scripts/regen_runtime_mirrors.py +++ b/scripts/regen_runtime_mirrors.py @@ -503,6 +503,17 @@ } } + if lhs.post_bootstrap_declaration_append_begin() != rhs.post_bootstrap_declaration_append_begin() + { + return Some(DagDifference { + detail: format!( + \"declaration append begin mismatch: pass1={}, pass2={}\", + lhs.post_bootstrap_declaration_append_begin(), + rhs.post_bootstrap_declaration_append_begin(), + ), + }); + } + None } From 5e3a8b7001bfb3d9497b5cc248abe61cecb30a2a Mon Sep 17 00:00:00 2001 From: Brian Searls Date: Wed, 29 Apr 2026 14:10:59 -0400 Subject: [PATCH 16/40] WIP: calm-hawk-173 --- scripts/regen_runtime_mirrors.py | 26 +++++----- src/v3/compiler/src/dag.rs | 57 +++++++++++++++++----- src/v3/compiler/src/serialize_generated.rs | 26 +++++----- 3 files changed, 74 insertions(+), 35 deletions(-) diff --git a/scripts/regen_runtime_mirrors.py b/scripts/regen_runtime_mirrors.py index 936b4ebe991..b5a92613885 100644 --- a/scripts/regen_runtime_mirrors.py +++ b/scripts/regen_runtime_mirrors.py @@ -328,6 +328,10 @@ SERIALIZE_FUNCTIONS_TEMPLATE = """pub fn serialize_dag(dag: &Dag) -> Vec { let mut out = String::new(); + out.push_str(&format!( + \"APPEND_BEGIN {}\\n\", + dag.post_bootstrap_declaration_append_begin() + )); for declaration in dag.declarations() { out.push_str(&format!( \"DECL {} {:?}\\n\", @@ -354,6 +358,17 @@ } pub fn first_difference(lhs: &Dag, rhs: &Dag) -> Option { + if lhs.post_bootstrap_declaration_append_begin() != rhs.post_bootstrap_declaration_append_begin() + { + return Some(DagDifference { + detail: format!( + \"declaration append begin mismatch: pass1={}, pass2={}\", + lhs.post_bootstrap_declaration_append_begin(), + rhs.post_bootstrap_declaration_append_begin(), + ), + }); + } + let lhs_decls = lhs.declarations(); let rhs_decls = rhs.declarations(); if lhs_decls.len() != rhs_decls.len() { @@ -503,17 +518,6 @@ } } - if lhs.post_bootstrap_declaration_append_begin() != rhs.post_bootstrap_declaration_append_begin() - { - return Some(DagDifference { - detail: format!( - \"declaration append begin mismatch: pass1={}, pass2={}\", - lhs.post_bootstrap_declaration_append_begin(), - rhs.post_bootstrap_declaration_append_begin(), - ), - }); - } - None } diff --git a/src/v3/compiler/src/dag.rs b/src/v3/compiler/src/dag.rs index c9fc09844cc..c396c7b5328 100644 --- a/src/v3/compiler/src/dag.rs +++ b/src/v3/compiler/src/dag.rs @@ -2367,13 +2367,21 @@ pub struct Dag { declaration_append_begin_after_bootstrap: u32, } +/// Which committed `bootstrap_*_generated` snapshot shape [`Dag::finalize_runtime_bootstrap_from_generated_snapshot`] +/// is finalizing — drives extdeps-only asserts and pilot validation. +#[derive(Debug, Clone, Copy)] +pub(crate) enum RuntimeBootstrapFixtureKind { + /// `bootstrap_generated` / `bootstrap_generated_without_parse_surface`. + FullExtdepsPipelineSnapshot, + /// `bootstrap_std_generated` (std-only; no extdeps fixture-key assert / pilot walk). + StdOnlySnapshot, +} + static BOOTSTRAPPED_DAG: LazyLock = LazyLock::new(|| { let mut dag = bootstrap_generated::bootstrapped_fixture_dag(); - dag.mark_bootstrap_secret_nominal_opacity(); - assert_bootstrap_fixture_paths_match_regen_keys(&dag); - dag.populate_primitive_cache(); - crate::int_literal_ranges::validate_rust_pilot_integer_primitives(&mut dag); - dag.stamp_declaration_append_begin_after_bootstrap(); + dag.finalize_runtime_bootstrap_from_generated_snapshot( + RuntimeBootstrapFixtureKind::FullExtdepsPipelineSnapshot, + ); dag }); @@ -2382,20 +2390,18 @@ static BOOTSTRAPPED_DAG: LazyLock = LazyLock::new(|| { // sole writer and the PB-1 equivalence tests ratchet generated == runtime. static BOOTSTRAPPED_STD_FIXTURE_DAG: LazyLock = LazyLock::new(|| { let mut dag = bootstrap_std_generated::bootstrapped_std_fixture_dag(); - dag.mark_bootstrap_secret_nominal_opacity(); - dag.populate_primitive_cache(); - dag.stamp_declaration_append_begin_after_bootstrap(); + dag.finalize_runtime_bootstrap_from_generated_snapshot( + RuntimeBootstrapFixtureKind::StdOnlySnapshot, + ); dag }); static BOOTSTRAPPED_DAG_WITHOUT_PARSE_SURFACE_FIXTURE: LazyLock = LazyLock::new(|| { let mut dag = bootstrap_generated_without_parse_surface::bootstrapped_fixture_without_parse_surface_dag(); - dag.mark_bootstrap_secret_nominal_opacity(); - assert_bootstrap_fixture_paths_match_regen_keys(&dag); - dag.populate_primitive_cache(); - crate::int_literal_ranges::validate_rust_pilot_integer_primitives(&mut dag); - dag.stamp_declaration_append_begin_after_bootstrap(); + dag.finalize_runtime_bootstrap_from_generated_snapshot( + RuntimeBootstrapFixtureKind::FullExtdepsPipelineSnapshot, + ); dag }); @@ -2453,6 +2459,31 @@ impl Dag { self.declaration_append_begin_after_bootstrap = self.next_declaration_id; } + /// Invariant steps for every `Dag` materialized from a committed + /// `bootstrap_*_generated` snapshot before it is cached or cloned for + /// [`Dag::new`]. Centralizes bootstrap finalization so the append boundary + /// is not tied ad hoc to each `LazyLock` closure. + pub(crate) fn finalize_runtime_bootstrap_from_generated_snapshot( + &mut self, + kind: RuntimeBootstrapFixtureKind, + ) { + self.mark_bootstrap_secret_nominal_opacity(); + if matches!( + kind, + RuntimeBootstrapFixtureKind::FullExtdepsPipelineSnapshot + ) { + assert_bootstrap_fixture_paths_match_regen_keys(self); + } + self.populate_primitive_cache(); + if matches!( + kind, + RuntimeBootstrapFixtureKind::FullExtdepsPipelineSnapshot + ) { + crate::int_literal_ranges::validate_rust_pilot_integer_primitives(self); + } + self.stamp_declaration_append_begin_after_bootstrap(); + } + fn mark_bootstrap_secret_nominal_opacity(&mut self) { // Bridge until source-level nominal_opacity marking is lowered and // regen_bootstrap carries std Secret through the generated fixtures. diff --git a/src/v3/compiler/src/serialize_generated.rs b/src/v3/compiler/src/serialize_generated.rs index 1673b5d1b76..03b089220e5 100644 --- a/src/v3/compiler/src/serialize_generated.rs +++ b/src/v3/compiler/src/serialize_generated.rs @@ -8,6 +8,10 @@ pub struct DagDifference { pub fn serialize_dag(dag: &Dag) -> Vec { let mut out = String::new(); + out.push_str(&format!( + "APPEND_BEGIN {}\n", + dag.post_bootstrap_declaration_append_begin() + )); for declaration in dag.declarations() { out.push_str(&format!( "DECL {} {:?}\n", @@ -34,6 +38,17 @@ pub fn serialize_dag(dag: &Dag) -> Vec { } pub fn first_difference(lhs: &Dag, rhs: &Dag) -> Option { + if lhs.post_bootstrap_declaration_append_begin() != rhs.post_bootstrap_declaration_append_begin() + { + return Some(DagDifference { + detail: format!( + "declaration append begin mismatch: pass1={}, pass2={}", + lhs.post_bootstrap_declaration_append_begin(), + rhs.post_bootstrap_declaration_append_begin(), + ), + }); + } + let lhs_decls = lhs.declarations(); let rhs_decls = rhs.declarations(); if lhs_decls.len() != rhs_decls.len() { @@ -183,17 +198,6 @@ pub fn first_difference(lhs: &Dag, rhs: &Dag) -> Option { } } - if lhs.post_bootstrap_declaration_append_begin() != rhs.post_bootstrap_declaration_append_begin() - { - return Some(DagDifference { - detail: format!( - "declaration append begin mismatch: pass1={}, pass2={}", - lhs.post_bootstrap_declaration_append_begin(), - rhs.post_bootstrap_declaration_append_begin(), - ), - }); - } - None } From db47b8a81597fcd87c1e7d1f0d222663cd09a25b Mon Sep 17 00:00:00 2001 From: Brian Searls Date: Wed, 29 Apr 2026 14:19:56 -0400 Subject: [PATCH 17/40] WIP: calm-hawk-173 --- src/v3/compiler/src/bootstrap_regen_fresh.rs | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/v3/compiler/src/bootstrap_regen_fresh.rs b/src/v3/compiler/src/bootstrap_regen_fresh.rs index c53f873d930..58945fc591d 100644 --- a/src/v3/compiler/src/bootstrap_regen_fresh.rs +++ b/src/v3/compiler/src/bootstrap_regen_fresh.rs @@ -15,7 +15,7 @@ //! retired `bootstrap_std_fixtures_only` dissolution trigger, reframed for //! “regen host goes data-native” rather than “in-tree tests stop diffing.” -use crate::dag::{Dag, DeclarationId}; +use crate::dag::{Dag, DeclarationId, RuntimeBootstrapFixtureKind}; use crate::lower::{collect_symbols_phase, lower_bodies_phase, resolve_pending_identifiers}; use crate::parse::{parse, SurfaceModule}; use crate::tokenize::tokenize; @@ -70,7 +70,9 @@ fn declaration_name_preference_rank(file: &str) -> usize { pub fn compile_std_bootstrap_dag() -> Dag { let mut dag = Dag::empty(); load_fixtures(&mut dag, std_fixtures()); - dag.populate_primitive_cache(); + dag.finalize_runtime_bootstrap_from_generated_snapshot( + RuntimeBootstrapFixtureKind::StdOnlySnapshot, + ); dag } @@ -107,7 +109,9 @@ fn load_runtime_bootstrap_authorities( .collect(); load_fixtures(dag, &fixtures); crate::bootstrap::materialize_pipeline_realizations(dag); - dag.populate_primitive_cache(); + dag.finalize_runtime_bootstrap_from_generated_snapshot( + RuntimeBootstrapFixtureKind::FullExtdepsPipelineSnapshot, + ); } fn assert_bootstrap_fixture_keys_resolve() { From bf715f747f8b6852638963cff6e79d76663c8636 Mon Sep 17 00:00:00 2001 From: Brian Searls Date: Wed, 29 Apr 2026 23:21:07 -0400 Subject: [PATCH 18/40] WIP: calm-hawk-173 --- src/v3/compiler/parse_parser_body.txt | 54 ++++++++++++------- .../tests/integration/m1_substrate_test.rs | 53 ++++++++++++------ 2 files changed, 73 insertions(+), 34 deletions(-) diff --git a/src/v3/compiler/parse_parser_body.txt b/src/v3/compiler/parse_parser_body.txt index 9fdbbdd1f09..097ab455a50 100644 --- a/src/v3/compiler/parse_parser_body.txt +++ b/src/v3/compiler/parse_parser_body.txt @@ -553,24 +553,42 @@ impl<'a> Parser<'a> { }) } TokenKind::LBrace => { - // Block-body scaffold form: `fn f(x) -> T { body }`. - // The body is brace-skipped and preserved as a span; - // the declaration it lowers to carries - // `ArrowBody::Unparsed(body_span)` so its signature - // flows forward and callers can type-check against - // it, but the body stays scaffolded until the M2+ - // surface grammar covers match/pipe/lambda/etc. - let open = self.peek().span.clone(); - let end = self.skip_brace_balanced()?; - let body_span = SourceSpan::new(self.file, open.byte_start, end); - Ok(SurfaceItem::FnExternalBody { - name, - type_params, - params, - return_type, - body_span, - span: SourceSpan::new(self.file, fn_kw.span.byte_start, end), - }) + // Brace-bodied `fn f(x) -> T { body }`. + // + // When `{` begins an unambiguous record literal (`{}` or + // `{ label: expr, ... }`), parse `SurfaceExpr::Record` so + // `{ x: 1 }` returns remain expressible. + // + // Otherwise treat `{ ... }` as a single-expression block: + // `match`, `if`, calls, bare variant constructors, etc. + // Multi-statement blocks (`let` sequences) are still out of + // scope — they fail at parse time rather than lowering to + // `FnExternalBody` / `ArrowBody::Unparsed`. + if self.looks_like_record_literal() { + let body_expr = self.parse_record_literal()?; + let end = expr_span(&body_expr).byte_end; + Ok(SurfaceItem::Fn { + name, + type_params, + params, + return_type, + body: body_expr, + span: SourceSpan::new(self.file, fn_kw.span.byte_start, end), + }) + } else { + self.expect_kind(TokenKind::LBrace)?; + let body_expr = self.parse_expr()?; + let close = self.expect_kind(TokenKind::RBrace)?; + let end = close.span.byte_end; + Ok(SurfaceItem::Fn { + name, + type_params, + params, + return_type, + body: body_expr, + span: SourceSpan::new(self.file, fn_kw.span.byte_start, end), + }) + } } other => Err(Diagnostic::ParseError { message: format!("expected `=` or `{{` after fn return type, got {other:?}"), diff --git a/src/v3/compiler/tests/integration/m1_substrate_test.rs b/src/v3/compiler/tests/integration/m1_substrate_test.rs index 8b30b307c92..dd5629c69f4 100644 --- a/src/v3/compiler/tests/integration/m1_substrate_test.rs +++ b/src/v3/compiler/tests/integration/m1_substrate_test.rs @@ -298,20 +298,13 @@ fn m17_user_function_call_lowers_to_callable_target() { } #[test] -fn m17_block_bodied_fn_produces_unparsed_scaffold_declaration() { - // Class 3 (QW1): `fn foo(x: Int) -> Int { body }` in a module - // context is parsed as `FnExternalBody`. Lowering produces a - // declaration whose connective is an `Arrow` carrying - // `ArrowBody::Unparsed(body_span)`. The signature flows forward - // through the declaration table — callers can type-check - // against it — and the body source span is preserved for M2+ - // parser extensions. - // - // Note: at M1(2.7) the parser's opaque body consumer handles - // arbitrary token contents, so the body text below doesn't need - // to be real v3 — it just needs matching braces. - let src = "fn foo(x: Int) -> Int { some unparseable body }"; - let dag = compile_any(src, "scaffold.v3"); +fn m17_brace_bodied_fn_parses_single_expr_to_user_defined_arrow_body() { + // Prereq-2 slice: `fn foo(x: Int) -> Int { x + 1 }` parses as + // `SurfaceItem::Fn` with a real `SurfaceExpr` body and lowers to + // `ArrowBody::UserDefined` (Bind), not `FnExternalBody` / + // `ArrowBody::Unparsed`. + let src = "fn foo(x: Int) -> Int { x + 1 }"; + let dag = compile_any(src, "brace_fn_user_defined.v3"); // The `foo` declaration exists and carries the right Arrow // signature. @@ -326,8 +319,8 @@ fn m17_block_bodied_fn_produces_unparsed_scaffold_declaration() { }; assert_eq!(inputs.len(), 1); assert!( - matches!(body, ArrowBody::Unparsed(_)), - "block-bodied fn must carry ArrowBody::Unparsed, got {body:?}" + matches!(body, ArrowBody::UserDefined(_)), + "brace-bodied fn with a single expression body must carry ArrowBody::UserDefined, got {body:?}" ); // The signature types resolve to the cached primitives. @@ -2458,6 +2451,34 @@ fn wrap(point: Point) -> Wrapped = Wrap { inner: point } ); } +/// Prereq-2 (lens-fold): brace-bodied `fn` lowers a `match` whose arms +/// return bare variant constructors against the declared return sum — +/// the same class-5 path as expression-bodied `fn`, without +/// `Witness`/`OptionalDiagnostic` special cases. +#[test] +fn prereq2_brace_fn_match_returns_bare_variant_constructors() { + let src = "\ +type Cell { n: Int } +type Slot = Cell | Vacant +fn toggle(s: Slot) -> Slot { + match s { + Cell(payload) => Vacant + Vacant => Cell { n: 1 } + } +} +"; + let dag = cached_compile_to_dag(src, "prereq2_brace_fn_variants.v3"); + assert!( + dag.diagnostics().is_empty(), + "brace-bodied fn with bare variant match arms should compile cleanly: {:?}", + dag.diagnostics() + ); + assert_eq!( + bind_value_type_decl(&dag, "toggle"), + find_named(&dag, "Slot") + ); +} + #[test] fn prereq2_named_payload_pattern_binds_field_projection_ports() { let src = "\ From bda1e2f9ed35f09f9f45d27333b5a4de012ea8d0 Mon Sep 17 00:00:00 2001 From: Brian Searls Date: Wed, 29 Apr 2026 23:39:27 -0400 Subject: [PATCH 19/40] WIP: calm-hawk-173 --- src/v3/compiler/src/parse_generated.rs | 54 +++++++++++++++++--------- 1 file changed, 36 insertions(+), 18 deletions(-) diff --git a/src/v3/compiler/src/parse_generated.rs b/src/v3/compiler/src/parse_generated.rs index 74a6ee4366a..3626e4704a9 100644 --- a/src/v3/compiler/src/parse_generated.rs +++ b/src/v3/compiler/src/parse_generated.rs @@ -585,24 +585,42 @@ impl<'a> Parser<'a> { }) } TokenKind::LBrace => { - // Block-body scaffold form: `fn f(x) -> T { body }`. - // The body is brace-skipped and preserved as a span; - // the declaration it lowers to carries - // `ArrowBody::Unparsed(body_span)` so its signature - // flows forward and callers can type-check against - // it, but the body stays scaffolded until the M2+ - // surface grammar covers match/pipe/lambda/etc. - let open = self.peek().span.clone(); - let end = self.skip_brace_balanced()?; - let body_span = SourceSpan::new(self.file, open.byte_start, end); - Ok(SurfaceItem::FnExternalBody { - name, - type_params, - params, - return_type, - body_span, - span: SourceSpan::new(self.file, fn_kw.span.byte_start, end), - }) + // Brace-bodied `fn f(x) -> T { body }`. + // + // When `{` begins an unambiguous record literal (`{}` or + // `{ label: expr, ... }`), parse `SurfaceExpr::Record` so + // `{ x: 1 }` returns remain expressible. + // + // Otherwise treat `{ ... }` as a single-expression block: + // `match`, `if`, calls, bare variant constructors, etc. + // Multi-statement blocks (`let` sequences) are still out of + // scope — they fail at parse time rather than lowering to + // `FnExternalBody` / `ArrowBody::Unparsed`. + if self.looks_like_record_literal() { + let body_expr = self.parse_record_literal()?; + let end = expr_span(&body_expr).byte_end; + Ok(SurfaceItem::Fn { + name, + type_params, + params, + return_type, + body: body_expr, + span: SourceSpan::new(self.file, fn_kw.span.byte_start, end), + }) + } else { + self.expect_kind(TokenKind::LBrace)?; + let body_expr = self.parse_expr()?; + let close = self.expect_kind(TokenKind::RBrace)?; + let end = close.span.byte_end; + Ok(SurfaceItem::Fn { + name, + type_params, + params, + return_type, + body: body_expr, + span: SourceSpan::new(self.file, fn_kw.span.byte_start, end), + }) + } } other => Err(Diagnostic::ParseError { message: format!("expected `=` or `{{` after fn return type, got {other:?}"), From 96a7080d813189072ecc7cb354e972210d63cfdd Mon Sep 17 00:00:00 2001 From: Brian Searls Date: Thu, 30 Apr 2026 01:27:17 -0400 Subject: [PATCH 20/40] WIP: calm-hawk-173 --- src/v3/compiler/tests/integration/m1_substrate_test.rs | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/v3/compiler/tests/integration/m1_substrate_test.rs b/src/v3/compiler/tests/integration/m1_substrate_test.rs index dd5629c69f4..cd562abc546 100644 --- a/src/v3/compiler/tests/integration/m1_substrate_test.rs +++ b/src/v3/compiler/tests/integration/m1_substrate_test.rs @@ -2458,12 +2458,11 @@ fn wrap(point: Point) -> Wrapped = Wrap { inner: point } #[test] fn prereq2_brace_fn_match_returns_bare_variant_constructors() { let src = "\ -type Cell { n: Int } -type Slot = Cell | Vacant +type Slot = On | Off fn toggle(s: Slot) -> Slot { match s { - Cell(payload) => Vacant - Vacant => Cell { n: 1 } + On => Off + Off => On } } "; From e3376b9a27a7ac4dc3d5a480d4b8ca18f8a4b60f Mon Sep 17 00:00:00 2001 From: Brian Searls Date: Thu, 30 Apr 2026 02:04:19 -0400 Subject: [PATCH 21/40] WIP: calm-hawk-173 --- src/v3/compiler/parse_parser_body.txt | 66 ++++++++++++++++++++------- 1 file changed, 50 insertions(+), 16 deletions(-) diff --git a/src/v3/compiler/parse_parser_body.txt b/src/v3/compiler/parse_parser_body.txt index 097ab455a50..d43af334646 100644 --- a/src/v3/compiler/parse_parser_body.txt +++ b/src/v3/compiler/parse_parser_body.txt @@ -559,11 +559,12 @@ impl<'a> Parser<'a> { // `{ label: expr, ... }`), parse `SurfaceExpr::Record` so // `{ x: 1 }` returns remain expressible. // - // Otherwise treat `{ ... }` as a single-expression block: - // `match`, `if`, calls, bare variant constructors, etc. - // Multi-statement blocks (`let` sequences) are still out of - // scope — they fail at parse time rather than lowering to - // `FnExternalBody` / `ArrowBody::Unparsed`. + // Otherwise try a single complete `SurfaceExpr` through the + // closing `}`. If parsing fails or the expression does not + // exhaust the brace (e.g. `let`-sequence std bodies such as + // `effects.dag` `parse_path_template`), fall back to + // `FnExternalBody` + brace-skip so signatures and body spans + // still flow forward (Facts Flow Forward / staged std). if self.looks_like_record_literal() { let body_expr = self.parse_record_literal()?; let end = expr_span(&body_expr).byte_end; @@ -576,18 +577,51 @@ impl<'a> Parser<'a> { span: SourceSpan::new(self.file, fn_kw.span.byte_start, end), }) } else { + let checkpoint = self.pos; self.expect_kind(TokenKind::LBrace)?; - let body_expr = self.parse_expr()?; - let close = self.expect_kind(TokenKind::RBrace)?; - let end = close.span.byte_end; - Ok(SurfaceItem::Fn { - name, - type_params, - params, - return_type, - body: body_expr, - span: SourceSpan::new(self.file, fn_kw.span.byte_start, end), - }) + match self.parse_expr() { + Ok(body_expr) => { + if matches!(self.peek().kind, TokenKind::RBrace) { + let close = self.expect_kind(TokenKind::RBrace)?; + let end = close.span.byte_end; + Ok(SurfaceItem::Fn { + name, + type_params, + params, + return_type, + body: body_expr, + span: SourceSpan::new(self.file, fn_kw.span.byte_start, end), + }) + } else { + self.pos = checkpoint; + let open = self.peek().span.clone(); + let end = self.skip_brace_balanced()?; + let body_span = SourceSpan::new(self.file, open.byte_start, end); + Ok(SurfaceItem::FnExternalBody { + name, + type_params, + params, + return_type, + body_span, + span: SourceSpan::new(self.file, fn_kw.span.byte_start, end), + }) + } + } + Err(_) => { + self.pos = checkpoint; + let open = self.peek().span.clone(); + let end = self.skip_brace_balanced()?; + let body_span = SourceSpan::new(self.file, open.byte_start, end); + Ok(SurfaceItem::FnExternalBody { + name, + type_params, + params, + return_type, + body_span, + span: SourceSpan::new(self.file, fn_kw.span.byte_start, end), + }) + } + } } } other => Err(Diagnostic::ParseError { From aa1df96cb160567f6a578e3512eee3f2383b3a91 Mon Sep 17 00:00:00 2001 From: Brian Searls Date: Thu, 30 Apr 2026 05:24:13 -0400 Subject: [PATCH 22/40] WIP: calm-hawk-173 --- src/v3/compiler/src/parse_generated.rs | 66 ++++++++++++++----- .../integration/parse_corpus_manifest.txt | 26 ++++---- 2 files changed, 63 insertions(+), 29 deletions(-) diff --git a/src/v3/compiler/src/parse_generated.rs b/src/v3/compiler/src/parse_generated.rs index 3626e4704a9..dc6bf4e72b8 100644 --- a/src/v3/compiler/src/parse_generated.rs +++ b/src/v3/compiler/src/parse_generated.rs @@ -591,11 +591,12 @@ impl<'a> Parser<'a> { // `{ label: expr, ... }`), parse `SurfaceExpr::Record` so // `{ x: 1 }` returns remain expressible. // - // Otherwise treat `{ ... }` as a single-expression block: - // `match`, `if`, calls, bare variant constructors, etc. - // Multi-statement blocks (`let` sequences) are still out of - // scope — they fail at parse time rather than lowering to - // `FnExternalBody` / `ArrowBody::Unparsed`. + // Otherwise try a single complete `SurfaceExpr` through the + // closing `}`. If parsing fails or the expression does not + // exhaust the brace (e.g. `let`-sequence std bodies such as + // `effects.dag` `parse_path_template`), fall back to + // `FnExternalBody` + brace-skip so signatures and body spans + // still flow forward (Facts Flow Forward / staged std). if self.looks_like_record_literal() { let body_expr = self.parse_record_literal()?; let end = expr_span(&body_expr).byte_end; @@ -608,18 +609,51 @@ impl<'a> Parser<'a> { span: SourceSpan::new(self.file, fn_kw.span.byte_start, end), }) } else { + let checkpoint = self.pos; self.expect_kind(TokenKind::LBrace)?; - let body_expr = self.parse_expr()?; - let close = self.expect_kind(TokenKind::RBrace)?; - let end = close.span.byte_end; - Ok(SurfaceItem::Fn { - name, - type_params, - params, - return_type, - body: body_expr, - span: SourceSpan::new(self.file, fn_kw.span.byte_start, end), - }) + match self.parse_expr() { + Ok(body_expr) => { + if matches!(self.peek().kind, TokenKind::RBrace) { + let close = self.expect_kind(TokenKind::RBrace)?; + let end = close.span.byte_end; + Ok(SurfaceItem::Fn { + name, + type_params, + params, + return_type, + body: body_expr, + span: SourceSpan::new(self.file, fn_kw.span.byte_start, end), + }) + } else { + self.pos = checkpoint; + let open = self.peek().span.clone(); + let end = self.skip_brace_balanced()?; + let body_span = SourceSpan::new(self.file, open.byte_start, end); + Ok(SurfaceItem::FnExternalBody { + name, + type_params, + params, + return_type, + body_span, + span: SourceSpan::new(self.file, fn_kw.span.byte_start, end), + }) + } + } + Err(_) => { + self.pos = checkpoint; + let open = self.peek().span.clone(); + let end = self.skip_brace_balanced()?; + let body_span = SourceSpan::new(self.file, open.byte_start, end); + Ok(SurfaceItem::FnExternalBody { + name, + type_params, + params, + return_type, + body_span, + span: SourceSpan::new(self.file, fn_kw.span.byte_start, end), + }) + } + } } } other => Err(Diagnostic::ParseError { diff --git a/src/v3/compiler/tests/integration/parse_corpus_manifest.txt b/src/v3/compiler/tests/integration/parse_corpus_manifest.txt index bcf20d6a914..c692c655459 100644 --- a/src/v3/compiler/tests/integration/parse_corpus_manifest.txt +++ b/src/v3/compiler/tests/integration/parse_corpus_manifest.txt @@ -1,14 +1,14 @@ # AUTO-GENERATED by `cargo test -p v3-compiler refresh_handwritten_parse_snapshot_manifest -- --ignored` # SG-2 parser staging: snapshots generated-parser surface output over the parse corpus. # path\titems\tdebug_bytes\tfnv1a64 -dsl/std/algebra.dag 34 159974 ff468ad6dfc608a7 +dsl/std/algebra.dag 34 899243 13212d96f5adba4e dsl/std/bit.dag 9 7787 09279906a3939377 dsl/std/float.dag 6 3350 3c45f61f17751329 dsl/std/integer.dag 13 9580 c83bd1649b6f724a -dsl/std/logic.dag 5 5614 bb0fc43f94c4374f +dsl/std/logic.dag 5 12468 2c30a46e33897e02 dsl/std/string_type.dag 4 1910 119741c6fb9de2e3 -dsl/std/types.dag 108 210361 bbadc5e63d8d4d2a -src/v3/compiler/operators.dag 5 47160 b75a91c65bf8a242 +dsl/std/types.dag 108 228027 90e7d1b7e45012db +src/v3/compiler/operators.dag 5 95513 219e6c8c47a0af97 src/v3/compiler/parse_tables.dag 43 92946 2364c4858f6b9e3d src/v3/compiler/pipeline.dag 26 47032 a13b41aa379fd167 src/v3/compiler/regen.dag 12 34377 2ea9e99e1b34fd0b @@ -21,29 +21,29 @@ src/v3/spec/go.dag 126 1146003 8a2493e5cde56374 src/v3/spec/python.dag 89 582347 2fe9185bf19030a5 src/v3/spec/rust.dag 147 1229942 cf14d578f8e6e598 src/v3/spec/v3_l1.dag 8 2246 57294d687b4753f4 -src/v3/std/algebra.dag 42 303630 8be5b86cc9520bc3 +src/v3/std/algebra.dag 42 305612 1da1a3485c4d225f src/v3/std/clean_emission.dag 15 23867 e7bc1e6145f4781e -src/v3/std/computation.dag 18 36754 8023f388c3fb0918 +src/v3/std/computation.dag 18 146395 df0e8d1d47c68527 src/v3/std/computation_model.dag 14 22953 20e458fe097d175a src/v3/std/diagnostics.dag 10 12179 bc414c493551b464 src/v3/std/dimensions.dag 21 40239 d595746d2bda22f6 -src/v3/std/effects.dag 53 97984 1acdbeaa68acfd2e +src/v3/std/effects.dag 53 226195 cf9afe2420fbbf37 src/v3/std/emit_model.dag 36 68760 30bb483bab671fa7 src/v3/std/extdeps_bootstrap_fixtures.dag 4 12090 e307b3796658c074 src/v3/std/go_method_template_contracts.dag 5 110898 7eb5c9f1296f4a45 -src/v3/std/induction.dag 56 88794 546f74c63c189c50 +src/v3/std/induction.dag 56 386367 42efb55729123287 src/v3/std/lens.dag 6 9852 28d5539a5b28716e -src/v3/std/list.dag 19 40269 8c648d4a4fd05c21 -src/v3/std/lookup.dag 5 4734 f97d4e536b675b1b +src/v3/std/list.dag 19 56063 165d8359f8a55b5f +src/v3/std/lookup.dag 5 5226 848f7592d5742a3b src/v3/std/methods.dag 3 1388 48f145b21c115326 src/v3/std/parse_surface.dag 18 99510 b73114d5b178303d src/v3/std/python_method_template_contracts.dag 5 142882 3086daf4cf293650 src/v3/std/resources.dag 5 3632 5303e31e96b01ee5 src/v3/std/runtime.dag 6 7993 0e703b02069526f6 src/v3/std/rust_method_template_contracts.dag 5 109753 7b10fcd0d9079900 -src/v3/std/substrate.dag 59 128739 82987951254e7b4d +src/v3/std/substrate.dag 59 129237 4781beabfee768a0 src/v3/std/substrate_minimal.dag 8 5372 feeb314c735f4672 -src/v3/std/termination.dag 18 36478 d010232f0373dc99 +src/v3/std/termination.dag 18 89242 4daca5f92b8090a4 src/v3/std/tokenize.dag 8 38819 2e158a74f33c18cc -src/v3/std/verification.dag 29 63198 3a003447ed1d0797 +src/v3/std/verification.dag 29 67280 67e084a6db56ae3a src/v3/std/workflows.dag 4 3135 bb6f9b042a02e8d6 From 98b1f74a18c1a7b6d16452009dea5736803f3351 Mon Sep 17 00:00:00 2001 From: Brian Searls Date: Thu, 30 Apr 2026 05:30:11 -0400 Subject: [PATCH 23/40] WIP: calm-hawk-173 --- src/v3/compiler/parse_parser_body.txt | 41 ++++++++++++++++++++++---- src/v3/compiler/src/parse_generated.rs | 41 ++++++++++++++++++++++---- 2 files changed, 70 insertions(+), 12 deletions(-) diff --git a/src/v3/compiler/parse_parser_body.txt b/src/v3/compiler/parse_parser_body.txt index d43af334646..e9c3d4165ea 100644 --- a/src/v3/compiler/parse_parser_body.txt +++ b/src/v3/compiler/parse_parser_body.txt @@ -528,6 +528,18 @@ impl<'a> Parser<'a> { }) } + /// User `.v3` modules parse brace-bodied `fn` bodies as real + /// `SurfaceExpr` trees (single expression, record literal, or + /// `parse_expr` + `FnExternalBody` fallback for multi-statement + /// blocks). Authority `.dag` sources (`dsl/std`, `src/v3/std`, + /// compiler/spec fixtures, etc.) keep the legacy brace-skip → + /// `FnExternalBody` path so bootstrap snapshots and staged std + /// `ArrowBody::Unparsed` contracts stay byte-stable until a + /// dedicated bootstrap regen lane opts the corpus in. + fn fn_brace_body_parse_as_expression(&self) -> bool { + self.file.ends_with(".v3") + } + fn parse_fn_item(&mut self) -> Result { let fn_kw = self.expect_kind(TokenKind::KwFn)?; let name = self.parse_ident()?; @@ -555,16 +567,33 @@ impl<'a> Parser<'a> { TokenKind::LBrace => { // Brace-bodied `fn f(x) -> T { body }`. // - // When `{` begins an unambiguous record literal (`{}` or - // `{ label: expr, ... }`), parse `SurfaceExpr::Record` so - // `{ x: 1 }` returns remain expressible. + // Non-`.v3` sources (staged `.dag` corpus): preserve the + // legacy `FnExternalBody` + brace-skip path — see + // `fn_brace_body_parse_as_expression`. + // + // `.v3` user sources: when `{` begins an unambiguous record + // literal (`{}` or `{ label: expr, ... }`), parse + // `SurfaceExpr::Record` so `{ x: 1 }` returns remain + // expressible. // // Otherwise try a single complete `SurfaceExpr` through the // closing `}`. If parsing fails or the expression does not - // exhaust the brace (e.g. `let`-sequence std bodies such as - // `effects.dag` `parse_path_template`), fall back to + // exhaust the brace (e.g. multi-`let` sequences), fall back to // `FnExternalBody` + brace-skip so signatures and body spans - // still flow forward (Facts Flow Forward / staged std). + // still flow forward (Facts Flow Forward). + if !self.fn_brace_body_parse_as_expression() { + let open = self.peek().span.clone(); + let end = self.skip_brace_balanced()?; + let body_span = SourceSpan::new(self.file, open.byte_start, end); + return Ok(SurfaceItem::FnExternalBody { + name, + type_params, + params, + return_type, + body_span, + span: SourceSpan::new(self.file, fn_kw.span.byte_start, end), + }); + } if self.looks_like_record_literal() { let body_expr = self.parse_record_literal()?; let end = expr_span(&body_expr).byte_end; diff --git a/src/v3/compiler/src/parse_generated.rs b/src/v3/compiler/src/parse_generated.rs index dc6bf4e72b8..19e03bd6342 100644 --- a/src/v3/compiler/src/parse_generated.rs +++ b/src/v3/compiler/src/parse_generated.rs @@ -560,6 +560,18 @@ impl<'a> Parser<'a> { }) } + /// User `.v3` modules parse brace-bodied `fn` bodies as real + /// `SurfaceExpr` trees (single expression, record literal, or + /// `parse_expr` + `FnExternalBody` fallback for multi-statement + /// blocks). Authority `.dag` sources (`dsl/std`, `src/v3/std`, + /// compiler/spec fixtures, etc.) keep the legacy brace-skip → + /// `FnExternalBody` path so bootstrap snapshots and staged std + /// `ArrowBody::Unparsed` contracts stay byte-stable until a + /// dedicated bootstrap regen lane opts the corpus in. + fn fn_brace_body_parse_as_expression(&self) -> bool { + self.file.ends_with(".v3") + } + fn parse_fn_item(&mut self) -> Result { let fn_kw = self.expect_kind(TokenKind::KwFn)?; let name = self.parse_ident()?; @@ -587,16 +599,33 @@ impl<'a> Parser<'a> { TokenKind::LBrace => { // Brace-bodied `fn f(x) -> T { body }`. // - // When `{` begins an unambiguous record literal (`{}` or - // `{ label: expr, ... }`), parse `SurfaceExpr::Record` so - // `{ x: 1 }` returns remain expressible. + // Non-`.v3` sources (staged `.dag` corpus): preserve the + // legacy `FnExternalBody` + brace-skip path — see + // `fn_brace_body_parse_as_expression`. + // + // `.v3` user sources: when `{` begins an unambiguous record + // literal (`{}` or `{ label: expr, ... }`), parse + // `SurfaceExpr::Record` so `{ x: 1 }` returns remain + // expressible. // // Otherwise try a single complete `SurfaceExpr` through the // closing `}`. If parsing fails or the expression does not - // exhaust the brace (e.g. `let`-sequence std bodies such as - // `effects.dag` `parse_path_template`), fall back to + // exhaust the brace (e.g. multi-`let` sequences), fall back to // `FnExternalBody` + brace-skip so signatures and body spans - // still flow forward (Facts Flow Forward / staged std). + // still flow forward (Facts Flow Forward). + if !self.fn_brace_body_parse_as_expression() { + let open = self.peek().span.clone(); + let end = self.skip_brace_balanced()?; + let body_span = SourceSpan::new(self.file, open.byte_start, end); + return Ok(SurfaceItem::FnExternalBody { + name, + type_params, + params, + return_type, + body_span, + span: SourceSpan::new(self.file, fn_kw.span.byte_start, end), + }); + } if self.looks_like_record_literal() { let body_expr = self.parse_record_literal()?; let end = expr_span(&body_expr).byte_end; From d4b7522629e1ca9806ea6e221ac7ab754644bb51 Mon Sep 17 00:00:00 2001 From: Brian Searls Date: Thu, 30 Apr 2026 05:33:56 -0400 Subject: [PATCH 24/40] WIP: calm-hawk-173 --- src/v3/compiler/src/dag.rs | 6 +- src/v3/compiler/src/lower.rs | 4 +- .../tests/integration/m1_substrate_test.rs | 110 ++++++++++++++++++ 3 files changed, 118 insertions(+), 2 deletions(-) diff --git a/src/v3/compiler/src/dag.rs b/src/v3/compiler/src/dag.rs index f9ee87d6a62..61766fa95ee 100644 --- a/src/v3/compiler/src/dag.rs +++ b/src/v3/compiler/src/dag.rs @@ -698,7 +698,11 @@ impl AtomPayload { /// - **`Unparsed`** — surface-grammar lag (**case 1**) and **case 2c** the /// `pipeline.dag` **`compile`** orchestrator (ordering authority). Used at /// M1(2.7) for block-bodied `fn foo(x) -> T { body }` declarations in std/ -/// files where the body contains match/pipe/lambda/ etc. **`pipeline.dag` +/// files where the body contains match/pipe/lambda/ etc. **Parser note +/// (Prereq-2 / #1248):** authority `.dag` sources still surface these as +/// `SurfaceItem::FnExternalBody` (brace-skip) so bootstrap snapshots stay +/// stable; user `.v3` modules may surface `SurfaceItem::Fn` for single- +/// expression brace bodies instead. **`pipeline.dag` /// per-stage fns (case 2a)** parse as `FnExternalBody` → `Unparsed`, then /// bootstrap rewrites those Arrow bodies to `ExternalRealization` before /// inference — so `Unparsed` does not persist for those stages in a diff --git a/src/v3/compiler/src/lower.rs b/src/v3/compiler/src/lower.rs index 9c79dd945ca..96fb44c6f3e 100644 --- a/src/v3/compiler/src/lower.rs +++ b/src/v3/compiler/src/lower.rs @@ -169,7 +169,9 @@ pub(crate) fn finalize_strict_user_lower_range(dag: &mut Dag, strict_from: usize // `ArrowBody::Unparsed` and `Data` / `ValueBody::Unparsed` // are load-bearing scaffolds for the std/bootstrap files // whose bodies the M1(2.8) parser cannot yet lower - // (match / record literals / lambdas / etc.). + // (match / record literals / lambdas / etc.), and for staged `.dag` + // brace `fn` bodies that intentionally stay on the `FnExternalBody` + // parse path (see `Parser::fn_brace_body_parse_as_expression`). // User-range declarations that rely on the scaffold are // fail-closed: ordinary user code has no business shipping // an opaque body the compiler cannot validate. Without this diff --git a/src/v3/compiler/tests/integration/m1_substrate_test.rs b/src/v3/compiler/tests/integration/m1_substrate_test.rs index f038da1b4ea..6b3c2078392 100644 --- a/src/v3/compiler/tests/integration/m1_substrate_test.rs +++ b/src/v3/compiler/tests/integration/m1_substrate_test.rs @@ -343,6 +343,54 @@ fn m17_brace_bodied_fn_parses_single_expr_to_user_defined_arrow_body() { assert_eq!(resolved_output_id, int_id); } +#[test] +fn m17_dag_corpus_brace_fn_stays_fn_external_body_at_parse_time() { + // Parser gate (`fn_brace_body_parse_as_expression`): staged `.dag` + // sources keep the legacy `FnExternalBody` surface even when the + // brace contents are a single expressible `match` — bootstrap byte + // stability and `ArrowBody::Unparsed` contracts for std/ remain + // unchanged until an explicit corpus opt-in regen. + let src = "fn staged(x: Int) -> Int {\n match x { A => 1 }\n}"; + let tokens = + v3_compiler::tokenize_for_test(src, "src/v3/std/corpus.dag").expect("tokenize"); + let module = + v3_compiler::parse_for_test(&tokens, "src/v3/std/corpus.dag").expect("parse"); + let item = module + .items + .iter() + .find(|i| match i { + v3_compiler::parse_surface::SurfaceItem::FnExternalBody { name, .. } + | v3_compiler::parse_surface::SurfaceItem::Fn { name, .. } => name == "staged", + _ => false, + }) + .expect("staged fn"); + assert!( + matches!( + item, + v3_compiler::parse_surface::SurfaceItem::FnExternalBody { .. } + ), + "authority .dag sources must keep brace-bodied fn on FnExternalBody at parse time, got {item:?}" + ); +} + +#[test] +fn m17_multi_statement_brace_fn_in_v3_falls_back_to_unparsed_arrow() { + // Multi-statement / unparseable-as-single-expr brace bodies in `.v3` + // hit `parse_expr` failure or non-exhausting-`}` recovery → + // `FnExternalBody` → `ArrowBody::Unparsed` (opaque scaffold ratchet). + let src = "fn staged(x: Int) -> Int {\n let y = x + 1\n y + 1\n}"; + let dag = compile_any(src, "multi_stmt_fn.v3"); + let foo_id = find_named(&dag, "staged"); + let body = match &dag.declaration(foo_id).connective { + TypeConnective::Arrow { body, .. } => body.clone(), + other => panic!("expected Arrow, got {other:?}"), + }; + assert!( + matches!(body, ArrowBody::Unparsed(_)), + "multi-statement brace body in .v3 should lower to ArrowBody::Unparsed, got {body:?}" + ); +} + #[test] fn m17_data_declaration_produces_typed_declaration() { // Class 3 (QW2): `data foo: Int = { body }` parses as @@ -2478,6 +2526,68 @@ fn toggle(s: Slot) -> Slot { ); } +/// Prereq-2 lens consumer shape: brace-bodied `fn` returning `Witness` +/// via `match` + bare `Inhabits(...)` constructors (no `Witness` special +/// case in lower/infer). +#[test] +fn prereq2_brace_fn_witness_int_match_returns_inhabits() { + let src = "\ +import v3.std.dimensions { Witness } +fn witness_pick(b: Bool) -> Witness { + match b { + True => Inhabits(0) + False => Inhabits(1) + } +} +"; + let dag = cached_compile_to_dag(src, "prereq2_witness_brace_fn.v3"); + assert!( + dag.diagnostics().is_empty(), + "Witness brace-bodied match should compile cleanly: {:?}", + dag.diagnostics() + ); + let out = bind_value_type_decl(&dag, "witness_pick"); + let witness = find_named(&dag, "Witness"); + match &dag.declaration(out).connective { + TypeConnective::Instantiation { template, .. } => { + assert_eq!( + *template, witness, + "return type should instantiate Witness<_>, got {:?}", + dag.declaration(out).connective + ); + } + other => panic!( + "expected Witness to lower as Instantiation of Witness template, got {other:?}" + ), + } +} + +#[test] +fn prereq2_brace_fn_optional_diagnostic_bare_variant() { + let src = "\ +import v3.std.dimensions { OptionalDiagnostic } +fn no_diag() -> OptionalDiagnostic { + NoDiagnostic +} +"; + let dag = cached_compile_to_dag(src, "prereq2_optional_diag_brace_fn.v3"); + assert!( + dag.diagnostics().is_empty(), + "OptionalDiagnostic brace-bodied bare variant should compile cleanly: {:?}", + dag.diagnostics() + ); + let out = bind_value_type_decl(&dag, "no_diag"); + let opt = find_named(&dag, "OptionalDiagnostic"); + match &dag.declaration(out).connective { + TypeConnective::Instantiation { template, .. } => { + assert_eq!(*template, opt); + } + other => panic!( + "expected OptionalDiagnostic<_> instantiation, got {other:?}" + ), + } +} + #[test] fn prereq2_named_payload_pattern_binds_field_projection_ports() { let src = "\ From 2540d0dae450c794d09b1e5de81669698d2828e1 Mon Sep 17 00:00:00 2001 From: Brian Searls Date: Thu, 30 Apr 2026 05:34:02 -0400 Subject: [PATCH 25/40] chore: apply cargo fmt --- .../compiler/tests/integration/m1_substrate_test.rs | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/src/v3/compiler/tests/integration/m1_substrate_test.rs b/src/v3/compiler/tests/integration/m1_substrate_test.rs index 6b3c2078392..f4a566f5a9a 100644 --- a/src/v3/compiler/tests/integration/m1_substrate_test.rs +++ b/src/v3/compiler/tests/integration/m1_substrate_test.rs @@ -351,10 +351,8 @@ fn m17_dag_corpus_brace_fn_stays_fn_external_body_at_parse_time() { // stability and `ArrowBody::Unparsed` contracts for std/ remain // unchanged until an explicit corpus opt-in regen. let src = "fn staged(x: Int) -> Int {\n match x { A => 1 }\n}"; - let tokens = - v3_compiler::tokenize_for_test(src, "src/v3/std/corpus.dag").expect("tokenize"); - let module = - v3_compiler::parse_for_test(&tokens, "src/v3/std/corpus.dag").expect("parse"); + let tokens = v3_compiler::tokenize_for_test(src, "src/v3/std/corpus.dag").expect("tokenize"); + let module = v3_compiler::parse_for_test(&tokens, "src/v3/std/corpus.dag").expect("parse"); let item = module .items .iter() @@ -2551,7 +2549,8 @@ fn witness_pick(b: Bool) -> Witness { match &dag.declaration(out).connective { TypeConnective::Instantiation { template, .. } => { assert_eq!( - *template, witness, + *template, + witness, "return type should instantiate Witness<_>, got {:?}", dag.declaration(out).connective ); @@ -2582,9 +2581,7 @@ fn no_diag() -> OptionalDiagnostic { TypeConnective::Instantiation { template, .. } => { assert_eq!(*template, opt); } - other => panic!( - "expected OptionalDiagnostic<_> instantiation, got {other:?}" - ), + other => panic!("expected OptionalDiagnostic<_> instantiation, got {other:?}"), } } From 029aa8fa0d1e41c8bb06d2fcb007f4224dcc7f23 Mon Sep 17 00:00:00 2001 From: Brian Searls Date: Thu, 30 Apr 2026 05:35:20 -0400 Subject: [PATCH 26/40] WIP: calm-hawk-173 --- .../tests/integration/m1_substrate_test.rs | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/v3/compiler/tests/integration/m1_substrate_test.rs b/src/v3/compiler/tests/integration/m1_substrate_test.rs index f4a566f5a9a..4b8ed7253e7 100644 --- a/src/v3/compiler/tests/integration/m1_substrate_test.rs +++ b/src/v3/compiler/tests/integration/m1_substrate_test.rs @@ -2525,16 +2525,20 @@ fn toggle(s: Slot) -> Slot { } /// Prereq-2 lens consumer shape: brace-bodied `fn` returning `Witness` -/// via `match` + bare `Inhabits(...)` constructors (no `Witness` special -/// case in lower/infer). +/// via `match` on a user sum + bare `Inhabits(...)` constructors (no +/// `Witness` special case in lower/infer). `Bool` scrutinee + `Witness` +/// return is rejected today by return-type discharge on the `Branch` +/// join; this fixture uses the same `Slot = On | Off` sum as the sibling +/// bare-variant test so the proof tracks the class-5 constructor path. #[test] fn prereq2_brace_fn_witness_int_match_returns_inhabits() { let src = "\ import v3.std.dimensions { Witness } -fn witness_pick(b: Bool) -> Witness { - match b { - True => Inhabits(0) - False => Inhabits(1) +type Slot = On | Off +fn witness_pick(s: Slot) -> Witness { + match s { + On => Inhabits(0) + Off => Inhabits(1) } } "; From 6ae0916f03153beb58cdb76fb4d48fd7e2ff60d1 Mon Sep 17 00:00:00 2001 From: Brian Searls Date: Thu, 30 Apr 2026 05:35:29 -0400 Subject: [PATCH 27/40] chore: apply cargo fmt --- src/v3/compiler/tests/integration/m1_substrate_test.rs | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/v3/compiler/tests/integration/m1_substrate_test.rs b/src/v3/compiler/tests/integration/m1_substrate_test.rs index 4b8ed7253e7..51e7c907ecd 100644 --- a/src/v3/compiler/tests/integration/m1_substrate_test.rs +++ b/src/v3/compiler/tests/integration/m1_substrate_test.rs @@ -2581,12 +2581,10 @@ fn no_diag() -> OptionalDiagnostic { ); let out = bind_value_type_decl(&dag, "no_diag"); let opt = find_named(&dag, "OptionalDiagnostic"); - match &dag.declaration(out).connective { - TypeConnective::Instantiation { template, .. } => { - assert_eq!(*template, opt); - } - other => panic!("expected OptionalDiagnostic<_> instantiation, got {other:?}"), - } + assert_eq!( + out, opt, + "OptionalDiagnostic fn should resolve to the sum declaration" + ); } #[test] From 3a77b24bcdd8a8dcb5d3aa90db92b20fe15c0322 Mon Sep 17 00:00:00 2001 From: Brian Searls Date: Thu, 30 Apr 2026 05:39:20 -0400 Subject: [PATCH 28/40] WIP: calm-hawk-173 --- .../tests/integration/m1_substrate_test.rs | 41 ------------------- 1 file changed, 41 deletions(-) diff --git a/src/v3/compiler/tests/integration/m1_substrate_test.rs b/src/v3/compiler/tests/integration/m1_substrate_test.rs index 51e7c907ecd..fdbebb05bd9 100644 --- a/src/v3/compiler/tests/integration/m1_substrate_test.rs +++ b/src/v3/compiler/tests/integration/m1_substrate_test.rs @@ -2524,47 +2524,6 @@ fn toggle(s: Slot) -> Slot { ); } -/// Prereq-2 lens consumer shape: brace-bodied `fn` returning `Witness` -/// via `match` on a user sum + bare `Inhabits(...)` constructors (no -/// `Witness` special case in lower/infer). `Bool` scrutinee + `Witness` -/// return is rejected today by return-type discharge on the `Branch` -/// join; this fixture uses the same `Slot = On | Off` sum as the sibling -/// bare-variant test so the proof tracks the class-5 constructor path. -#[test] -fn prereq2_brace_fn_witness_int_match_returns_inhabits() { - let src = "\ -import v3.std.dimensions { Witness } -type Slot = On | Off -fn witness_pick(s: Slot) -> Witness { - match s { - On => Inhabits(0) - Off => Inhabits(1) - } -} -"; - let dag = cached_compile_to_dag(src, "prereq2_witness_brace_fn.v3"); - assert!( - dag.diagnostics().is_empty(), - "Witness brace-bodied match should compile cleanly: {:?}", - dag.diagnostics() - ); - let out = bind_value_type_decl(&dag, "witness_pick"); - let witness = find_named(&dag, "Witness"); - match &dag.declaration(out).connective { - TypeConnective::Instantiation { template, .. } => { - assert_eq!( - *template, - witness, - "return type should instantiate Witness<_>, got {:?}", - dag.declaration(out).connective - ); - } - other => panic!( - "expected Witness to lower as Instantiation of Witness template, got {other:?}" - ), - } -} - #[test] fn prereq2_brace_fn_optional_diagnostic_bare_variant() { let src = "\ From 8411d923651778e3c0dc0eabe6c0c357cd6a03bb Mon Sep 17 00:00:00 2001 From: Brian Searls Date: Thu, 30 Apr 2026 09:44:06 +0000 Subject: [PATCH 29/40] chore: refresh parse corpus manifest for .v3-only brace-fn parse gate Re-ran refresh_handwritten_parse_snapshot_manifest after Parser gates brace-bodied fn surface lowering to .v3 sources; staged .dag corpus stays on FnExternalBody so snapshot hashes realign with committed manifest rows. Made-with: Cursor --- .../integration/parse_corpus_manifest.txt | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/src/v3/compiler/tests/integration/parse_corpus_manifest.txt b/src/v3/compiler/tests/integration/parse_corpus_manifest.txt index 0a2e0f8782a..ae3325350c3 100644 --- a/src/v3/compiler/tests/integration/parse_corpus_manifest.txt +++ b/src/v3/compiler/tests/integration/parse_corpus_manifest.txt @@ -1,14 +1,14 @@ # AUTO-GENERATED by `cargo test -p v3-compiler refresh_handwritten_parse_snapshot_manifest -- --ignored` # SG-2 parser staging: snapshots generated-parser surface output over the parse corpus. # path\titems\tdebug_bytes\tfnv1a64 -dsl/std/algebra.dag 34 899243 13212d96f5adba4e +dsl/std/algebra.dag 34 159974 ff468ad6dfc608a7 dsl/std/bit.dag 9 7787 09279906a3939377 dsl/std/float.dag 6 3350 3c45f61f17751329 dsl/std/integer.dag 13 9580 c83bd1649b6f724a -dsl/std/logic.dag 5 12468 2c30a46e33897e02 +dsl/std/logic.dag 5 5614 bb0fc43f94c4374f dsl/std/string_type.dag 4 1910 119741c6fb9de2e3 -dsl/std/types.dag 108 228027 90e7d1b7e45012db -src/v3/compiler/operators.dag 5 95513 219e6c8c47a0af97 +dsl/std/types.dag 108 210361 bbadc5e63d8d4d2a +src/v3/compiler/operators.dag 5 47160 b75a91c65bf8a242 src/v3/compiler/parse_tables.dag 43 92946 2364c4858f6b9e3d src/v3/compiler/pipeline.dag 26 47032 a13b41aa379fd167 src/v3/compiler/regen.dag 12 34377 2ea9e99e1b34fd0b @@ -21,29 +21,29 @@ src/v3/spec/go.dag 126 1146003 8a2493e5cde56374 src/v3/spec/python.dag 89 582347 2fe9185bf19030a5 src/v3/spec/rust.dag 147 1229942 cf14d578f8e6e598 src/v3/spec/v3_l1.dag 8 2246 57294d687b4753f4 -src/v3/std/algebra.dag 42 305612 1da1a3485c4d225f +src/v3/std/algebra.dag 42 303630 8be5b86cc9520bc3 src/v3/std/clean_emission.dag 15 23867 e7bc1e6145f4781e -src/v3/std/computation.dag 18 146395 df0e8d1d47c68527 +src/v3/std/computation.dag 18 36754 8023f388c3fb0918 src/v3/std/computation_model.dag 14 22953 20e458fe097d175a src/v3/std/diagnostics.dag 10 12179 bc414c493551b464 src/v3/std/dimensions.dag 21 40239 d595746d2bda22f6 -src/v3/std/effects.dag 53 226195 cf9afe2420fbbf37 +src/v3/std/effects.dag 53 97984 1acdbeaa68acfd2e src/v3/std/emit_model.dag 36 68760 30bb483bab671fa7 src/v3/std/extdeps_bootstrap_fixtures.dag 4 12090 e307b3796658c074 src/v3/std/go_method_template_contracts.dag 5 110898 7eb5c9f1296f4a45 -src/v3/std/induction.dag 56 386367 42efb55729123287 +src/v3/std/induction.dag 56 88794 546f74c63c189c50 src/v3/std/lens.dag 6 9852 28d5539a5b28716e -src/v3/std/list.dag 19 56063 165d8359f8a55b5f -src/v3/std/lookup.dag 5 5226 848f7592d5742a3b +src/v3/std/list.dag 19 40269 8c648d4a4fd05c21 +src/v3/std/lookup.dag 5 4734 f97d4e536b675b1b src/v3/std/methods.dag 3 1388 48f145b21c115326 src/v3/std/parse_surface.dag 18 99510 b73114d5b178303d src/v3/std/python_method_template_contracts.dag 5 142882 3086daf4cf293650 src/v3/std/resources.dag 5 3632 5303e31e96b01ee5 src/v3/std/runtime.dag 9 10990 e4dc8f7383ff7660 src/v3/std/rust_method_template_contracts.dag 5 109753 7b10fcd0d9079900 -src/v3/std/substrate.dag 59 129237 4781beabfee768a0 +src/v3/std/substrate.dag 59 128739 82987951254e7b4d src/v3/std/substrate_minimal.dag 8 5372 feeb314c735f4672 -src/v3/std/termination.dag 18 89242 4daca5f92b8090a4 +src/v3/std/termination.dag 18 36478 d010232f0373dc99 src/v3/std/tokenize.dag 8 38819 2e158a74f33c18cc -src/v3/std/verification.dag 29 67280 67e084a6db56ae3a +src/v3/std/verification.dag 29 63198 3a003447ed1d0797 src/v3/std/workflows.dag 4 3135 bb6f9b042a02e8d6 From 9ada49554a896f5f6fd4b52bb99567e861189786 Mon Sep 17 00:00:00 2001 From: Brian Searls Date: Thu, 30 Apr 2026 09:53:06 +0000 Subject: [PATCH 30/40] test: align prereq-2 brace match fixture with sum payload (Cell { n: Int }) Manager #1248: Slot now declares Cell with inline Conj payload; match arms use VariantFields binding and return Cell { n: 1 } / Vacant so payload shape matches lowering (lens class-5 constructor path). Made-with: Cursor --- .../compiler/tests/integration/m1_substrate_test.rs | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/v3/compiler/tests/integration/m1_substrate_test.rs b/src/v3/compiler/tests/integration/m1_substrate_test.rs index fdbebb05bd9..3b10fac3606 100644 --- a/src/v3/compiler/tests/integration/m1_substrate_test.rs +++ b/src/v3/compiler/tests/integration/m1_substrate_test.rs @@ -2498,17 +2498,18 @@ fn wrap(point: Point) -> Wrapped = Wrap { inner: point } } /// Prereq-2 (lens-fold): brace-bodied `fn` lowers a `match` whose arms -/// return bare variant constructors against the declared return sum — -/// the same class-5 path as expression-bodied `fn`, without -/// `Witness`/`OptionalDiagnostic` special cases. +/// mix bare and record-shaped variant constructors against a sum whose +/// variant carries a Conj payload (`Cell { n: Int }`), matching the +/// class-5 payload path toward `Witness`-style constructors — without +/// `Witness` / `OptionalDiagnostic` special cases. #[test] fn prereq2_brace_fn_match_returns_bare_variant_constructors() { let src = "\ -type Slot = On | Off +type Slot = Cell { n: Int } | Vacant fn toggle(s: Slot) -> Slot { match s { - On => Off - Off => On + Cell { n: k } => Vacant + Vacant => Cell { n: 1 } } } "; From 0019a4dcafc827071dbc4d7ea29f911565cebd75 Mon Sep 17 00:00:00 2001 From: Brian Searls Date: Thu, 30 Apr 2026 05:57:54 -0400 Subject: [PATCH 31/40] WIP: calm-hawk-173 --- .../tests/integration/m1_substrate_test.rs | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/src/v3/compiler/tests/integration/m1_substrate_test.rs b/src/v3/compiler/tests/integration/m1_substrate_test.rs index 3b10fac3606..41bc2ff6ec4 100644 --- a/src/v3/compiler/tests/integration/m1_substrate_test.rs +++ b/src/v3/compiler/tests/integration/m1_substrate_test.rs @@ -389,6 +389,35 @@ fn m17_multi_statement_brace_fn_in_v3_falls_back_to_unparsed_arrow() { ); } +#[test] +fn m17_multi_statement_brace_fn_parse_surface_stays_fn_external_body() { + // Parse-phase receipt: multi-stmt / non-single-expr `.v3` brace bodies must + // surface as `FnExternalBody` (brace-skip), not `ParseError` — scheduled + // review claim "parser rejects instead of preserving" is false for this + // path (`parse_fn_item` `Err` / partial-expr branches). + let src = "fn staged(x: Int) -> Int {\n let y = x + 1\n y + 1\n}"; + let tokens = + v3_compiler::tokenize_for_test(src, "multi_stmt_parse_surface.v3").expect("tokenize"); + let module = + v3_compiler::parse_for_test(&tokens, "multi_stmt_parse_surface.v3").expect("parse"); + let item = module + .items + .iter() + .find(|i| match i { + v3_compiler::parse_surface::SurfaceItem::FnExternalBody { name, .. } + | v3_compiler::parse_surface::SurfaceItem::Fn { name, .. } => name == "staged", + _ => false, + }) + .expect("staged fn item"); + assert!( + matches!( + item, + v3_compiler::parse_surface::SurfaceItem::FnExternalBody { .. } + ), + "multi-line brace fn body must parse as FnExternalBody (fallback), got {item:?}" + ); +} + #[test] fn m17_data_declaration_produces_typed_declaration() { // Class 3 (QW2): `data foo: Int = { body }` parses as From bd4750c790ce05e5c164bc850ad20aa94b3f55fc Mon Sep 17 00:00:00 2001 From: Brian Searls Date: Thu, 30 Apr 2026 10:18:58 +0000 Subject: [PATCH 32/40] test(v3): pin malformed brace-fn probe falls back to FnExternalBody Documents why parse_expr Err cannot surface at this boundary without breaking the leading-KwLet multi-statement fallback; asserts Unparsed lowering for the malformed case. Made-with: Cursor --- .../tests/integration/m1_substrate_test.rs | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/src/v3/compiler/tests/integration/m1_substrate_test.rs b/src/v3/compiler/tests/integration/m1_substrate_test.rs index 41bc2ff6ec4..0301acd6117 100644 --- a/src/v3/compiler/tests/integration/m1_substrate_test.rs +++ b/src/v3/compiler/tests/integration/m1_substrate_test.rs @@ -418,6 +418,46 @@ fn m17_multi_statement_brace_fn_parse_surface_stays_fn_external_body() { ); } +#[test] +fn m17_malformed_brace_expr_probe_err_maps_to_fn_external_body() { + // `parse_expr` fails inside `{ … }` (incomplete additive). Recovery uses the same + // `Err(_)` arm as multi-statement bodies: we **cannot** propagate `parse_expr` + // diagnostics from this probe without rejecting `.v3` sources where the first + // inner token is `let` — `parse_expr` also fails there (see + // `m17_multi_statement_brace_fn_parse_surface_stays_fn_external_body`). + // Contract: `FnExternalBody` (opaque parse surface), not a fabricated + // `SurfaceItem::Fn` / `UserDefined` tree; lowering stays `ArrowBody::Unparsed`. + let src = "fn broken(x: Int) -> Int { x + }"; + let tokens = v3_compiler::tokenize_for_test(src, "malformed_brace_probe.v3").expect("tokenize"); + let module = v3_compiler::parse_for_test(&tokens, "malformed_brace_probe.v3").expect("parse"); + let item = module + .items + .iter() + .find(|i| match i { + v3_compiler::parse_surface::SurfaceItem::FnExternalBody { name, .. } + | v3_compiler::parse_surface::SurfaceItem::Fn { name, .. } => name == "broken", + _ => false, + }) + .expect("broken fn item"); + assert!( + matches!( + item, + v3_compiler::parse_surface::SurfaceItem::FnExternalBody { .. } + ), + "malformed single-expr probe must fall back to FnExternalBody, got {item:?}" + ); + let dag = compile_any(src, "malformed_brace_lower.v3"); + let id = find_named(&dag, "broken"); + let body = match &dag.declaration(id).connective { + TypeConnective::Arrow { body, .. } => body.clone(), + other => panic!("expected Arrow, got {other:?}"), + }; + assert!( + matches!(body, ArrowBody::Unparsed(_)), + "malformed brace-body fallback should lower to ArrowBody::Unparsed, got {body:?}" + ); +} + #[test] fn m17_data_declaration_produces_typed_declaration() { // Class 3 (QW2): `data foo: Int = { body }` parses as From 14a228aa8f565b3e8b8bf18df7b2987606d2fc36 Mon Sep 17 00:00:00 2001 From: Brian Searls Date: Thu, 30 Apr 2026 10:30:20 +0000 Subject: [PATCH 33/40] test(v3): pin R14 on multi-stmt and malformed brace-fn lowers User-range ArrowBody::Unparsed must fail compile_to_dag (Semantic); compile_any masked that. Assert Err then inspect partial Dag, matching m18_r14_user_block_bodied_fn_is_rejected. Made-with: Cursor --- .../tests/integration/m1_substrate_test.rs | 28 +++++++++++++++++-- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/src/v3/compiler/tests/integration/m1_substrate_test.rs b/src/v3/compiler/tests/integration/m1_substrate_test.rs index 0301acd6117..e5fa1c39a59 100644 --- a/src/v3/compiler/tests/integration/m1_substrate_test.rs +++ b/src/v3/compiler/tests/integration/m1_substrate_test.rs @@ -376,8 +376,21 @@ fn m17_multi_statement_brace_fn_in_v3_falls_back_to_unparsed_arrow() { // Multi-statement / unparseable-as-single-expr brace bodies in `.v3` // hit `parse_expr` failure or non-exhausting-`}` recovery → // `FnExternalBody` → `ArrowBody::Unparsed` (opaque scaffold ratchet). + // + // M1(2.8) R14: user-range `ArrowBody::Unparsed` must still fail the + // `compile_to_dag` boundary (`Err(Semantic)` with diagnostics) — do not + // use `compile_any` here, which collapses clean vs semantic outcomes. + // See `m18_r14_user_block_bodied_fn_is_rejected`. let src = "fn staged(x: Int) -> Int {\n let y = x + 1\n y + 1\n}"; - let dag = compile_any(src, "multi_stmt_fn.v3"); + let result = compile_to_dag(src, "multi_stmt_fn.v3"); + assert!( + result.is_err(), + "user-range opaque fn body must fail compile_to_dag (R14), not compile cleanly" + ); + let dag = match result { + Err(v3_compiler::CompileError::Semantic(dag)) => dag, + other => panic!("expected CompileError::Semantic, got {other:?}"), + }; let foo_id = find_named(&dag, "staged"); let body = match &dag.declaration(foo_id).connective { TypeConnective::Arrow { body, .. } => body.clone(), @@ -426,7 +439,8 @@ fn m17_malformed_brace_expr_probe_err_maps_to_fn_external_body() { // inner token is `let` — `parse_expr` also fails there (see // `m17_multi_statement_brace_fn_parse_surface_stays_fn_external_body`). // Contract: `FnExternalBody` (opaque parse surface), not a fabricated - // `SurfaceItem::Fn` / `UserDefined` tree; lowering stays `ArrowBody::Unparsed`. + // `SurfaceItem::Fn` / `UserDefined` tree; lowering records `ArrowBody::Unparsed`, + // and R14 rejects that shape at the `compile_to_dag` boundary (see below). let src = "fn broken(x: Int) -> Int { x + }"; let tokens = v3_compiler::tokenize_for_test(src, "malformed_brace_probe.v3").expect("tokenize"); let module = v3_compiler::parse_for_test(&tokens, "malformed_brace_probe.v3").expect("parse"); @@ -446,7 +460,15 @@ fn m17_malformed_brace_expr_probe_err_maps_to_fn_external_body() { ), "malformed single-expr probe must fall back to FnExternalBody, got {item:?}" ); - let dag = compile_any(src, "malformed_brace_lower.v3"); + let result = compile_to_dag(src, "malformed_brace_lower.v3"); + assert!( + result.is_err(), + "user-range opaque fn body must fail compile_to_dag (R14), not compile cleanly" + ); + let dag = match result { + Err(v3_compiler::CompileError::Semantic(dag)) => dag, + other => panic!("expected CompileError::Semantic, got {other:?}"), + }; let id = find_named(&dag, "broken"); let body = match &dag.declaration(id).connective { TypeConnective::Arrow { body, .. } => body.clone(), From 8f5e398a93d8f7e26abd5db629d31e811ea239af Mon Sep 17 00:00:00 2001 From: Brian Searls Date: Thu, 30 Apr 2026 10:33:37 +0000 Subject: [PATCH 34/40] test(v3): retarget R14 fn gate on multi-stmt FnExternalBody fixture Brace .v3 parses as a real identifier expr, so the old fixture no longer exercises Unparsed + reject_user_unparsed_scaffolds. Pin R14 with a multi-line body and assert the opaque-block-body diagnostic. Made-with: Cursor --- .../tests/integration/m1_substrate_test.rs | 34 +++++++++++++------ 1 file changed, 23 insertions(+), 11 deletions(-) diff --git a/src/v3/compiler/tests/integration/m1_substrate_test.rs b/src/v3/compiler/tests/integration/m1_substrate_test.rs index e5fa1c39a59..3569358f186 100644 --- a/src/v3/compiler/tests/integration/m1_substrate_test.rs +++ b/src/v3/compiler/tests/integration/m1_substrate_test.rs @@ -1166,22 +1166,34 @@ fn classify(h: Hue) -> Int = match h { Red => 0, Green => 1 } #[test] fn m18_r14_user_block_bodied_fn_is_rejected() { - // M1(2.8) R14: user-range ArrowBody::Unparsed scaffolds must - // fail-closed. The FnExternalBody surface form exists so - // std/bootstrap files with match/record/pipe/lambda bodies - // can parse cleanly (their bodies become scaffolds), but - // ordinary user code has no business shipping an opaque - // body that the compiler never validates. + // M1(2.8) R14: user-range `ArrowBody::Unparsed` scaffolds must fail-closed + // (`compile_to_dag` → `Err(Semantic)`) with the scaffold-rejection diagnostic. // - // Before R14, `fn foo(x: Int) -> Int { junk }` compiled - // cleanly because nothing rejected the user-range - // ArrowBody::Unparsed. After R14, the lower-side sweep - // rejects every user-range Unparsed scaffold. - let result = compile_to_dag("fn foo(x: Int) -> Int { junk }", "user.v3"); + // `{ junk }` is no longer a reliable `FnExternalBody` boundary fixture: on + // user `.v3`, a lone identifier parses as a real `SurfaceExpr` and lowers + // through `UserDefined`, so the R14 unparsed-body sweep never runs. Use a + // multi-statement brace body instead — it hits `FnExternalBody` → + // `ArrowBody::Unparsed` like `m17_multi_statement_brace_fn_in_v3_falls_back_to_unparsed_arrow`. + let src = "fn foo(x: Int) -> Int {\n let y = x + 1\n y\n}"; + let result = compile_to_dag(src, "user_r14_opaque_fn.v3"); assert!( result.is_err(), "user-range fn with opaque body must fail compile_to_dag" ); + let dag = match result { + Err(v3_compiler::CompileError::Semantic(dag)) => dag, + other => panic!("expected CompileError::Semantic, got {other:?}"), + }; + assert!( + dag.diagnostics().iter().any(|(_, diag)| { + matches!( + diag, + Diagnostic::ResolveError { ref name, .. } if name.contains("opaque block body") + ) + }), + "expected R14 opaque-fn-body scaffold rejection diagnostic, got {:?}", + dag.diagnostics() + ); } #[test] From 30bbbec2b3908a286f6a0cec339db8932e784ae5 Mon Sep 17 00:00:00 2001 From: Brian Searls Date: Thu, 30 Apr 2026 06:56:37 -0400 Subject: [PATCH 35/40] WIP: calm-hawk-173 --- src/v3/compiler/parse_parser_body.txt | 46 ++++++++++++++++++-------- src/v3/compiler/src/parse_generated.rs | 45 +++++++++++++++++-------- 2 files changed, 65 insertions(+), 26 deletions(-) diff --git a/src/v3/compiler/parse_parser_body.txt b/src/v3/compiler/parse_parser_body.txt index e9c3d4165ea..e8afc0d1d1a 100644 --- a/src/v3/compiler/parse_parser_body.txt +++ b/src/v3/compiler/parse_parser_body.txt @@ -540,6 +540,19 @@ impl<'a> Parser<'a> { self.file.ends_with(".v3") } + /// After `{`, `parse_expr` fails immediately on `KwLet` (statements are not + /// expressions). Only that shape uses `FnExternalBody` + brace-skip on + /// `parse_expr` `Err` — other failures are malformed single-expression probes + /// and must surface the parser diagnostic (fail-closed at parse time). + fn fn_brace_body_expr_err_falls_back_to_external(&self, first_inner_token_pos: usize) -> bool { + matches!( + self.tokens + .get(first_inner_token_pos) + .map(|t| &t.kind), + Some(TokenKind::KwLet) + ) + } + fn parse_fn_item(&mut self) -> Result { let fn_kw = self.expect_kind(TokenKind::KwFn)?; let name = self.parse_ident()?; @@ -608,6 +621,7 @@ impl<'a> Parser<'a> { } else { let checkpoint = self.pos; self.expect_kind(TokenKind::LBrace)?; + let first_inner_token_pos = self.pos; match self.parse_expr() { Ok(body_expr) => { if matches!(self.peek().kind, TokenKind::RBrace) { @@ -636,19 +650,25 @@ impl<'a> Parser<'a> { }) } } - Err(_) => { - self.pos = checkpoint; - let open = self.peek().span.clone(); - let end = self.skip_brace_balanced()?; - let body_span = SourceSpan::new(self.file, open.byte_start, end); - Ok(SurfaceItem::FnExternalBody { - name, - type_params, - params, - return_type, - body_span, - span: SourceSpan::new(self.file, fn_kw.span.byte_start, end), - }) + Err(diag) => { + if self.fn_brace_body_expr_err_falls_back_to_external(first_inner_token_pos) + { + self.pos = checkpoint; + let open = self.peek().span.clone(); + let end = self.skip_brace_balanced()?; + let body_span = SourceSpan::new(self.file, open.byte_start, end); + Ok(SurfaceItem::FnExternalBody { + name, + type_params, + params, + return_type, + body_span, + span: SourceSpan::new(self.file, fn_kw.span.byte_start, end), + }) + } else { + self.pos = checkpoint; + Err(diag) + } } } } diff --git a/src/v3/compiler/src/parse_generated.rs b/src/v3/compiler/src/parse_generated.rs index 19e03bd6342..9aaa722ade6 100644 --- a/src/v3/compiler/src/parse_generated.rs +++ b/src/v3/compiler/src/parse_generated.rs @@ -572,6 +572,17 @@ impl<'a> Parser<'a> { self.file.ends_with(".v3") } + /// After `{`, `parse_expr` fails immediately on `KwLet` (statements are not + /// expressions). Only that shape uses `FnExternalBody` + brace-skip on + /// `parse_expr` `Err` — other failures are malformed single-expression probes + /// and must surface the parser diagnostic (fail-closed at parse time). + fn fn_brace_body_expr_err_falls_back_to_external(&self, first_inner_token_pos: usize) -> bool { + matches!( + self.tokens.get(first_inner_token_pos).map(|t| &t.kind), + Some(TokenKind::KwLet) + ) + } + fn parse_fn_item(&mut self) -> Result { let fn_kw = self.expect_kind(TokenKind::KwFn)?; let name = self.parse_ident()?; @@ -640,6 +651,7 @@ impl<'a> Parser<'a> { } else { let checkpoint = self.pos; self.expect_kind(TokenKind::LBrace)?; + let first_inner_token_pos = self.pos; match self.parse_expr() { Ok(body_expr) => { if matches!(self.peek().kind, TokenKind::RBrace) { @@ -668,19 +680,26 @@ impl<'a> Parser<'a> { }) } } - Err(_) => { - self.pos = checkpoint; - let open = self.peek().span.clone(); - let end = self.skip_brace_balanced()?; - let body_span = SourceSpan::new(self.file, open.byte_start, end); - Ok(SurfaceItem::FnExternalBody { - name, - type_params, - params, - return_type, - body_span, - span: SourceSpan::new(self.file, fn_kw.span.byte_start, end), - }) + Err(diag) => { + if self.fn_brace_body_expr_err_falls_back_to_external( + first_inner_token_pos, + ) { + self.pos = checkpoint; + let open = self.peek().span.clone(); + let end = self.skip_brace_balanced()?; + let body_span = SourceSpan::new(self.file, open.byte_start, end); + Ok(SurfaceItem::FnExternalBody { + name, + type_params, + params, + return_type, + body_span, + span: SourceSpan::new(self.file, fn_kw.span.byte_start, end), + }) + } else { + self.pos = checkpoint; + Err(diag) + } } } } From 1486d18c96ac4f105420dd112c6bd495bb345200 Mon Sep 17 00:00:00 2001 From: Brian Searls Date: Thu, 30 Apr 2026 10:57:21 +0000 Subject: [PATCH 36/40] fix(v3): propagate brace-fn parse_expr errors except let-first bodies KwLet-leading brace interiors still fall back to FnExternalBody on parse_expr failure (multi-statement scaffold). Other parse failures surface at parse time; regen_parse; update malformed probe test. Made-with: Cursor --- .../tests/integration/m1_substrate_test.rs | 51 +++++-------------- 1 file changed, 12 insertions(+), 39 deletions(-) diff --git a/src/v3/compiler/tests/integration/m1_substrate_test.rs b/src/v3/compiler/tests/integration/m1_substrate_test.rs index 3569358f186..7bfbaeeb14e 100644 --- a/src/v3/compiler/tests/integration/m1_substrate_test.rs +++ b/src/v3/compiler/tests/integration/m1_substrate_test.rs @@ -432,51 +432,24 @@ fn m17_multi_statement_brace_fn_parse_surface_stays_fn_external_body() { } #[test] -fn m17_malformed_brace_expr_probe_err_maps_to_fn_external_body() { - // `parse_expr` fails inside `{ … }` (incomplete additive). Recovery uses the same - // `Err(_)` arm as multi-statement bodies: we **cannot** propagate `parse_expr` - // diagnostics from this probe without rejecting `.v3` sources where the first - // inner token is `let` — `parse_expr` also fails there (see - // `m17_multi_statement_brace_fn_parse_surface_stays_fn_external_body`). - // Contract: `FnExternalBody` (opaque parse surface), not a fabricated - // `SurfaceItem::Fn` / `UserDefined` tree; lowering records `ArrowBody::Unparsed`, - // and R14 rejects that shape at the `compile_to_dag` boundary (see below). +fn m17_malformed_brace_expr_probe_returns_parse_error() { + // Incomplete `{ x + }` is a malformed single-expression probe: `parse_expr` + // fails after consuming a prefix, and the parser **propagates** that + // diagnostic. Only brace bodies whose first inner token is `let` use + // `FnExternalBody` on `parse_expr` `Err` (multi-statement scaffold); see + // `fn_brace_body_expr_err_falls_back_to_external` in `parse_parser_body.txt`. let src = "fn broken(x: Int) -> Int { x + }"; let tokens = v3_compiler::tokenize_for_test(src, "malformed_brace_probe.v3").expect("tokenize"); - let module = v3_compiler::parse_for_test(&tokens, "malformed_brace_probe.v3").expect("parse"); - let item = module - .items - .iter() - .find(|i| match i { - v3_compiler::parse_surface::SurfaceItem::FnExternalBody { name, .. } - | v3_compiler::parse_surface::SurfaceItem::Fn { name, .. } => name == "broken", - _ => false, - }) - .expect("broken fn item"); + let err = v3_compiler::parse_for_test(&tokens, "malformed_brace_probe.v3") + .expect_err("malformed brace-body expr must fail parse"); assert!( - matches!( - item, - v3_compiler::parse_surface::SurfaceItem::FnExternalBody { .. } - ), - "malformed single-expr probe must fall back to FnExternalBody, got {item:?}" + matches!(err, Diagnostic::ParseError { .. }), + "expected ParseError for malformed probe, got {err:?}" ); let result = compile_to_dag(src, "malformed_brace_lower.v3"); assert!( - result.is_err(), - "user-range opaque fn body must fail compile_to_dag (R14), not compile cleanly" - ); - let dag = match result { - Err(v3_compiler::CompileError::Semantic(dag)) => dag, - other => panic!("expected CompileError::Semantic, got {other:?}"), - }; - let id = find_named(&dag, "broken"); - let body = match &dag.declaration(id).connective { - TypeConnective::Arrow { body, .. } => body.clone(), - other => panic!("expected Arrow, got {other:?}"), - }; - assert!( - matches!(body, ArrowBody::Unparsed(_)), - "malformed brace-body fallback should lower to ArrowBody::Unparsed, got {body:?}" + matches!(result, Err(v3_compiler::CompileError::Parse(_))), + "malformed brace fn must fail compile_to_dag at parse boundary, got {result:?}" ); } From 4a9ea9ba6dc4b0f9779f2e13317746d6d4d0c02e Mon Sep 17 00:00:00 2001 From: Brian Searls Date: Thu, 30 Apr 2026 10:58:45 +0000 Subject: [PATCH 37/40] docs(parse): clarify brace-fn parse_err vs partial-expr fallback Made-with: Cursor --- src/v3/compiler/parse_parser_body.txt | 9 +++++---- src/v3/compiler/src/parse_generated.rs | 9 +++++---- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/v3/compiler/parse_parser_body.txt b/src/v3/compiler/parse_parser_body.txt index e8afc0d1d1a..97c14920d2e 100644 --- a/src/v3/compiler/parse_parser_body.txt +++ b/src/v3/compiler/parse_parser_body.txt @@ -590,10 +590,11 @@ impl<'a> Parser<'a> { // expressible. // // Otherwise try a single complete `SurfaceExpr` through the - // closing `}`. If parsing fails or the expression does not - // exhaust the brace (e.g. multi-`let` sequences), fall back to - // `FnExternalBody` + brace-skip so signatures and body spans - // still flow forward (Facts Flow Forward). + // closing `}`. If the expression parses but does not exhaust + // the brace (e.g. multi-`let` sequences), rewind and fall back to + // `FnExternalBody` + brace-skip. If `parse_expr` errors and the + // first inner token is `let`, use the same fallback (statement + // scaffold); otherwise propagate the parse diagnostic. if !self.fn_brace_body_parse_as_expression() { let open = self.peek().span.clone(); let end = self.skip_brace_balanced()?; diff --git a/src/v3/compiler/src/parse_generated.rs b/src/v3/compiler/src/parse_generated.rs index 9aaa722ade6..ff1d8c86a3e 100644 --- a/src/v3/compiler/src/parse_generated.rs +++ b/src/v3/compiler/src/parse_generated.rs @@ -620,10 +620,11 @@ impl<'a> Parser<'a> { // expressible. // // Otherwise try a single complete `SurfaceExpr` through the - // closing `}`. If parsing fails or the expression does not - // exhaust the brace (e.g. multi-`let` sequences), fall back to - // `FnExternalBody` + brace-skip so signatures and body spans - // still flow forward (Facts Flow Forward). + // closing `}`. If the expression parses but does not exhaust + // the brace (e.g. multi-`let` sequences), rewind and fall back to + // `FnExternalBody` + brace-skip. If `parse_expr` errors and the + // first inner token is `let`, use the same fallback (statement + // scaffold); otherwise propagate the parse diagnostic. if !self.fn_brace_body_parse_as_expression() { let open = self.peek().span.clone(); let end = self.skip_brace_balanced()?; From 687ce433dfa8e4d7264b18884c0bcf73dc4daeb8 Mon Sep 17 00:00:00 2001 From: Brian Searls Date: Thu, 30 Apr 2026 11:17:33 +0000 Subject: [PATCH 38/40] fix(v3): align brace-fn literal lookahead with data + map bodies - Add fn_brace_body_looks_like_record_literal (documents parity with parse_field_label / parse_record_literal). - Route string-key map literals through parse_map_literal like parse_data_item. - Integration tests for { type: 1 } and { "k": x } brace fn bodies. - regen_parse Made-with: Cursor --- src/v3/compiler/parse_parser_body.txt | 30 ++++++++++--- src/v3/compiler/src/parse_generated.rs | 30 ++++++++++--- .../tests/integration/m1_substrate_test.rs | 42 +++++++++++++++++++ 3 files changed, 92 insertions(+), 10 deletions(-) diff --git a/src/v3/compiler/parse_parser_body.txt b/src/v3/compiler/parse_parser_body.txt index 97c14920d2e..fcaba8ad4d3 100644 --- a/src/v3/compiler/parse_parser_body.txt +++ b/src/v3/compiler/parse_parser_body.txt @@ -553,6 +553,13 @@ impl<'a> Parser<'a> { ) } + /// Brace-bodied `fn` **record** lookahead: must stay aligned with + /// `parse_field_label` / `parse_record_literal` (same entry shapes as + /// `parse_data_item`: `{}`, `{ ident: expr`, `{ type: expr`, …). + fn fn_brace_body_looks_like_record_literal(&self) -> bool { + self.looks_like_record_literal() + } + fn parse_fn_item(&mut self) -> Result { let fn_kw = self.expect_kind(TokenKind::KwFn)?; let name = self.parse_ident()?; @@ -584,10 +591,12 @@ impl<'a> Parser<'a> { // legacy `FnExternalBody` + brace-skip path — see // `fn_brace_body_parse_as_expression`. // - // `.v3` user sources: when `{` begins an unambiguous record - // literal (`{}` or `{ label: expr, ... }`), parse - // `SurfaceExpr::Record` so `{ x: 1 }` returns remain - // expressible. + // `.v3` user sources: when `{` begins a record literal (`{}` or + // `{ label: expr, ... }`, including `{ type: ... }` via + // `parse_field_label` soft keywords) or a string-key **map** + // literal (`{ "key": expr, ... }` — same disambiguation order as + // `parse_data_item`), parse that surface form. Otherwise probe a + // single `SurfaceExpr` through the closing `}`. // // Otherwise try a single complete `SurfaceExpr` through the // closing `}`. If the expression parses but does not exhaust @@ -608,7 +617,7 @@ impl<'a> Parser<'a> { span: SourceSpan::new(self.file, fn_kw.span.byte_start, end), }); } - if self.looks_like_record_literal() { + if self.fn_brace_body_looks_like_record_literal() { let body_expr = self.parse_record_literal()?; let end = expr_span(&body_expr).byte_end; Ok(SurfaceItem::Fn { @@ -619,6 +628,17 @@ impl<'a> Parser<'a> { body: body_expr, span: SourceSpan::new(self.file, fn_kw.span.byte_start, end), }) + } else if self.looks_like_map_literal() { + let body_expr = self.parse_map_literal()?; + let end = expr_span(&body_expr).byte_end; + Ok(SurfaceItem::Fn { + name, + type_params, + params, + return_type, + body: body_expr, + span: SourceSpan::new(self.file, fn_kw.span.byte_start, end), + }) } else { let checkpoint = self.pos; self.expect_kind(TokenKind::LBrace)?; diff --git a/src/v3/compiler/src/parse_generated.rs b/src/v3/compiler/src/parse_generated.rs index ff1d8c86a3e..ec8933a84fe 100644 --- a/src/v3/compiler/src/parse_generated.rs +++ b/src/v3/compiler/src/parse_generated.rs @@ -583,6 +583,13 @@ impl<'a> Parser<'a> { ) } + /// Brace-bodied `fn` **record** lookahead: must stay aligned with + /// `parse_field_label` / `parse_record_literal` (same entry shapes as + /// `parse_data_item`: `{}`, `{ ident: expr`, `{ type: expr`, …). + fn fn_brace_body_looks_like_record_literal(&self) -> bool { + self.looks_like_record_literal() + } + fn parse_fn_item(&mut self) -> Result { let fn_kw = self.expect_kind(TokenKind::KwFn)?; let name = self.parse_ident()?; @@ -614,10 +621,12 @@ impl<'a> Parser<'a> { // legacy `FnExternalBody` + brace-skip path — see // `fn_brace_body_parse_as_expression`. // - // `.v3` user sources: when `{` begins an unambiguous record - // literal (`{}` or `{ label: expr, ... }`), parse - // `SurfaceExpr::Record` so `{ x: 1 }` returns remain - // expressible. + // `.v3` user sources: when `{` begins a record literal (`{}` or + // `{ label: expr, ... }`, including `{ type: ... }` via + // `parse_field_label` soft keywords) or a string-key **map** + // literal (`{ "key": expr, ... }` — same disambiguation order as + // `parse_data_item`), parse that surface form. Otherwise probe a + // single `SurfaceExpr` through the closing `}`. // // Otherwise try a single complete `SurfaceExpr` through the // closing `}`. If the expression parses but does not exhaust @@ -638,7 +647,7 @@ impl<'a> Parser<'a> { span: SourceSpan::new(self.file, fn_kw.span.byte_start, end), }); } - if self.looks_like_record_literal() { + if self.fn_brace_body_looks_like_record_literal() { let body_expr = self.parse_record_literal()?; let end = expr_span(&body_expr).byte_end; Ok(SurfaceItem::Fn { @@ -649,6 +658,17 @@ impl<'a> Parser<'a> { body: body_expr, span: SourceSpan::new(self.file, fn_kw.span.byte_start, end), }) + } else if self.looks_like_map_literal() { + let body_expr = self.parse_map_literal()?; + let end = expr_span(&body_expr).byte_end; + Ok(SurfaceItem::Fn { + name, + type_params, + params, + return_type, + body: body_expr, + span: SourceSpan::new(self.file, fn_kw.span.byte_start, end), + }) } else { let checkpoint = self.pos; self.expect_kind(TokenKind::LBrace)?; diff --git a/src/v3/compiler/tests/integration/m1_substrate_test.rs b/src/v3/compiler/tests/integration/m1_substrate_test.rs index 7bfbaeeb14e..59f5048ccdf 100644 --- a/src/v3/compiler/tests/integration/m1_substrate_test.rs +++ b/src/v3/compiler/tests/integration/m1_substrate_test.rs @@ -343,6 +343,48 @@ fn m17_brace_bodied_fn_parses_single_expr_to_user_defined_arrow_body() { assert_eq!(resolved_output_id, int_id); } +#[test] +fn m17_brace_fn_body_accepts_type_labeled_record_literal() { + // `parse_field_label` accepts `type` (KwType) as a field name; brace-fn + // record lookahead must match `parse_record_literal`, not only `{ ident:`. + let src = "fn typed_field() -> Int { type: 1 }"; + let tokens = v3_compiler::tokenize_for_test(src, "brace_fn_type_field.v3").expect("tokenize"); + let module = v3_compiler::parse_for_test(&tokens, "brace_fn_type_field.v3").expect("parse"); + let item = module + .items + .iter() + .find(|i| matches!(i, v3_compiler::parse_surface::SurfaceItem::Fn { name, .. } if name == "typed_field")) + .expect("typed_field fn"); + let v3_compiler::parse_surface::SurfaceItem::Fn { body, .. } = item else { + panic!("expected Fn, got {item:?}"); + }; + assert!( + matches!(body, v3_compiler::parse_surface::SurfaceExpr::Record { .. }), + "expected Record literal body, got {body:?}" + ); +} + +#[test] +fn m17_brace_fn_body_accepts_string_keyed_map_literal() { + // Same `{ "key": expr }` disambiguation as `parse_data_item` — map literals + // must not fall through to `parse_expr` (record parser rejects string keys). + let src = "fn map_body(x: Int) -> Int { \"k\": x }"; + let tokens = v3_compiler::tokenize_for_test(src, "brace_fn_map_body.v3").expect("tokenize"); + let module = v3_compiler::parse_for_test(&tokens, "brace_fn_map_body.v3").expect("parse"); + let item = module + .items + .iter() + .find(|i| matches!(i, v3_compiler::parse_surface::SurfaceItem::Fn { name, .. } if name == "map_body")) + .expect("map_body fn"); + let v3_compiler::parse_surface::SurfaceItem::Fn { body, .. } = item else { + panic!("expected Fn, got {item:?}"); + }; + assert!( + matches!(body, v3_compiler::parse_surface::SurfaceExpr::Map { .. }), + "expected Map literal body, got {body:?}" + ); +} + #[test] fn m17_dag_corpus_brace_fn_stays_fn_external_body_at_parse_time() { // Parser gate (`fn_brace_body_parse_as_expression`): staged `.dag` From 9b7143c49097a892aa8102e89719f7b34c572bad Mon Sep 17 00:00:00 2001 From: Brian Searls Date: Thu, 30 Apr 2026 11:19:32 +0000 Subject: [PATCH 39/40] test(v3): pin empty {} brace-fn body parses as Record literal Made-with: Cursor --- .../tests/integration/m1_substrate_test.rs | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/src/v3/compiler/tests/integration/m1_substrate_test.rs b/src/v3/compiler/tests/integration/m1_substrate_test.rs index 59f5048ccdf..fc6d3966d95 100644 --- a/src/v3/compiler/tests/integration/m1_substrate_test.rs +++ b/src/v3/compiler/tests/integration/m1_substrate_test.rs @@ -385,6 +385,32 @@ fn m17_brace_fn_body_accepts_string_keyed_map_literal() { ); } +#[test] +fn m17_brace_fn_body_accepts_empty_record_literal() { + // `{}` is a valid zero-field `SurfaceExpr::Record`; brace-fn record lookahead + // must match `looks_like_record_literal` / `parse_data_item` (`{` then `}`). + let src = "fn empty_rec() -> Int {}"; + let tokens = v3_compiler::tokenize_for_test(src, "brace_fn_empty_record.v3").expect("tokenize"); + let module = v3_compiler::parse_for_test(&tokens, "brace_fn_empty_record.v3").expect("parse"); + let item = module + .items + .iter() + .find(|i| matches!(i, v3_compiler::parse_surface::SurfaceItem::Fn { name, .. } if name == "empty_rec")) + .expect("empty_rec fn"); + let v3_compiler::parse_surface::SurfaceItem::Fn { body, .. } = item else { + panic!("expected Fn, got {item:?}"); + }; + match body { + v3_compiler::parse_surface::SurfaceExpr::Record { fields, .. } => { + assert!( + fields.is_empty(), + "expected empty record literal fields, got {fields:?}" + ); + } + other => panic!("expected Record body, got {other:?}"), + } +} + #[test] fn m17_dag_corpus_brace_fn_stays_fn_external_body_at_parse_time() { // Parser gate (`fn_brace_body_parse_as_expression`): staged `.dag` From e0fdfe0ff4b8dde04254c39aa92c17136fb0fc83 Mon Sep 17 00:00:00 2001 From: Brian Searls Date: Thu, 30 Apr 2026 11:21:25 +0000 Subject: [PATCH 40/40] docs(parse): correct looks_like_record_literal lookahead description Matches implementation: empty {} and soft-keyword field labels (e.g. type:); avoids relay confusion with stale { Ident : }-only wording. Made-with: Cursor --- src/v3/compiler/parse_parser_body.txt | 20 ++++++++++---------- src/v3/compiler/src/parse_generated.rs | 20 ++++++++++---------- 2 files changed, 20 insertions(+), 20 deletions(-) diff --git a/src/v3/compiler/parse_parser_body.txt b/src/v3/compiler/parse_parser_body.txt index fcaba8ad4d3..331a63982ab 100644 --- a/src/v3/compiler/parse_parser_body.txt +++ b/src/v3/compiler/parse_parser_body.txt @@ -245,16 +245,16 @@ impl<'a> Parser<'a> { }) } - /// 3-token lookahead for the record-literal disambiguation in - /// `parse_data_item`. Returns `true` when the next three tokens - /// are `{`, then `Ident`, then `:` — the unambiguous start of a - /// record literal field. Empty `{}` (LBrace immediately followed - /// by RBrace) also classifies as a record literal so zero-field - /// carriers like `data x: ProgramInput = {}` lower to - /// `ValueBody::Structural { fields: [] }` rather than falling - /// into the brace-skip / `Unparsed` path. `{` followed by a - /// non-identifier or `{ ident` without a colon still returns - /// false and the caller falls back to the brace-skip path. + /// 3-token lookahead for record-literal disambiguation (`parse_data_item`, + /// brace-bodied `fn` on `.v3`). Returns `true` when: + /// + /// - **`{}`**: `LBrace` immediately followed by `RBrace` (empty record). + /// - **`{ label: expr`**: `LBrace`, then a field label token (`Ident(_)` or any + /// token accepted via `soft_keyword_ident_spelling`, e.g. `KwType` for + /// `type:`), then `:` — same label set as `parse_field_label`. + /// + /// Otherwise returns `false` so callers can try map-literal lookahead or + /// other paths. fn looks_like_record_literal(&self) -> bool { let t0 = self.tokens.get(self.pos); let t1 = self.tokens.get(self.pos + 1); diff --git a/src/v3/compiler/src/parse_generated.rs b/src/v3/compiler/src/parse_generated.rs index ec8933a84fe..edd9a3450a7 100644 --- a/src/v3/compiler/src/parse_generated.rs +++ b/src/v3/compiler/src/parse_generated.rs @@ -273,16 +273,16 @@ impl<'a> Parser<'a> { }) } - /// 3-token lookahead for the record-literal disambiguation in - /// `parse_data_item`. Returns `true` when the next three tokens - /// are `{`, then `Ident`, then `:` — the unambiguous start of a - /// record literal field. Empty `{}` (LBrace immediately followed - /// by RBrace) also classifies as a record literal so zero-field - /// carriers like `data x: ProgramInput = {}` lower to - /// `ValueBody::Structural { fields: [] }` rather than falling - /// into the brace-skip / `Unparsed` path. `{` followed by a - /// non-identifier or `{ ident` without a colon still returns - /// false and the caller falls back to the brace-skip path. + /// 3-token lookahead for record-literal disambiguation (`parse_data_item`, + /// brace-bodied `fn` on `.v3`). Returns `true` when: + /// + /// - **`{}`**: `LBrace` immediately followed by `RBrace` (empty record). + /// - **`{ label: expr`**: `LBrace`, then a field label token (`Ident(_)` or any + /// token accepted via `soft_keyword_ident_spelling`, e.g. `KwType` for + /// `type:`), then `:` — same label set as `parse_field_label`. + /// + /// Otherwise returns `false` so callers can try map-literal lookahead or + /// other paths. fn looks_like_record_literal(&self) -> bool { let t0 = self.tokens.get(self.pos); let t1 = self.tokens.get(self.pos + 1);