diff --git a/src/v3/compiler/build.rs b/src/v3/compiler/build.rs index 6957b9e1438..64705bfb5ee 100644 --- a/src/v3/compiler/build.rs +++ b/src/v3/compiler/build.rs @@ -42,7 +42,7 @@ // ]; // // pub static COMPILER_FILES: &[(&str, &str)] = &[ -// ("src/v3/compiler/pipeline.dag", include_str!("...")), +// ("src/v3/compiler/pipeline.dag", ), // ]; // `tokenize.dag` is intentionally omitted: tokenizer authority for `regen_tokenize` // must not be folded into the bootstrap Dag (duplicate declarations when diff --git a/src/v3/compiler/src/bootstrap_generated.rs b/src/v3/compiler/src/bootstrap_generated.rs index 60ef6ab8b97..97cb265c7a8 100644 --- a/src/v3/compiler/src/bootstrap_generated.rs +++ b/src/v3/compiler/src/bootstrap_generated.rs @@ -26951,7 +26951,7 @@ fn bootstrapped_fixture_dag_declarations() -> Vec { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("src/v3/std/bridge_ledger.dag", 4292, 4330), + span: SourceSpan::new("src/v3/std/bridge_ledger.dag", 4553, 4591), }); declarations.push(Declaration { id: DeclarationId(890), @@ -26970,7 +26970,7 @@ fn bootstrapped_fixture_dag_declarations() -> Vec { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("src/v3/std/bridge_ledger.dag", 5294, 5341), + span: SourceSpan::new("src/v3/std/bridge_ledger.dag", 5555, 5602), }); declarations.push(Declaration { id: DeclarationId(891), @@ -27003,9 +27003,9 @@ fn bootstrapped_fixture_dag_declarations() -> Vec { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("src/v3/std/bridge_ledger.dag", 5984, 6094), + span: SourceSpan::new("src/v3/std/bridge_ledger.dag", 6245, 6355), }); - declarations.push(Declaration { id: DeclarationId(892), name: Some("bridge_ledger".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(665), arguments: vec![TemplateArgument { parameter: DeclarationId(666), value: DeclarationId(891) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(2032)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::List(vec![FieldValue::Record(vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("bridge_source_span_file_participation_retired".to_string()))), ("owner".to_string(), FieldValue::Literal(LiteralBits::String("R3".to_string()))), ("status".to_string(), FieldValue::Variant { constructor: DeclarationId(2031), payload: vec![] }), ("authority".to_string(), FieldValue::Literal(LiteralBits::String("ROADMAP.md#lens-fold-file-path-semantics".to_string())))]), FieldValue::Record(vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("bridge_mark_bootstrap_secret_nominal_opacity_retired".to_string()))), ("owner".to_string(), FieldValue::Literal(LiteralBits::String("R2-Substrate".to_string()))), ("status".to_string(), FieldValue::Variant { constructor: DeclarationId(2030), payload: vec![] }), ("authority".to_string(), FieldValue::Literal(LiteralBits::String("PR #937".to_string())))]), FieldValue::Record(vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("bridge_canonical_lens_name_dispatch_pr1183_slice_retired".to_string()))), ("owner".to_string(), FieldValue::Literal(LiteralBits::String("R2-Substrate".to_string()))), ("status".to_string(), FieldValue::Variant { constructor: DeclarationId(2030), payload: vec![] }), ("authority".to_string(), FieldValue::Literal(LiteralBits::String("src/v3/compiler/tests/integration/canonical_lens_bridge_ratchet_test.rs".to_string())))]), FieldValue::Record(vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("bridge_canonical_lens_name_patching_residual".to_string()))), ("owner".to_string(), FieldValue::Literal(LiteralBits::String("PB-Runtime".to_string()))), ("status".to_string(), FieldValue::Variant { constructor: DeclarationId(2031), payload: vec![] }), ("authority".to_string(), FieldValue::Literal(LiteralBits::String("docs/briefs/r2-pb-canonical-lens-bridge-disposition.md".to_string())))]), FieldValue::Record(vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("bridge_include_str_side_channels_retired".to_string()))), ("owner".to_string(), FieldValue::Literal(LiteralBits::String("pipeline_authority".to_string()))), ("status".to_string(), FieldValue::Variant { constructor: DeclarationId(2031), payload: vec![] }), ("authority".to_string(), FieldValue::Literal(LiteralBits::String("PR #1171".to_string())))]), FieldValue::Record(vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("bridge_exact_string_patching_residual_retired".to_string()))), ("owner".to_string(), FieldValue::Literal(LiteralBits::String("PB-Tier-2".to_string()))), ("status".to_string(), FieldValue::Variant { constructor: DeclarationId(2031), payload: vec![] }), ("authority".to_string(), FieldValue::Literal(LiteralBits::String("docs/r3-structure.md:83".to_string())))])])), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/bridge_ledger.dag", 6558, 8315) }); + declarations.push(Declaration { id: DeclarationId(892), name: Some("bridge_ledger".to_string()), connective: TypeConnective::Instantiation { template: DeclarationId(665), arguments: vec![TemplateArgument { parameter: DeclarationId(666), value: DeclarationId(891) }] }, type_params: vec![], phantom_params: Vec::new(), meta_tag: Some(DeclarationId(2032)), specialization_parent: None, inhabits: None, value_body: Some(ValueBody::List(vec![FieldValue::Record(vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("bridge_source_span_file_participation_retired".to_string()))), ("owner".to_string(), FieldValue::Literal(LiteralBits::String("R3".to_string()))), ("status".to_string(), FieldValue::Variant { constructor: DeclarationId(2031), payload: vec![] }), ("authority".to_string(), FieldValue::Literal(LiteralBits::String("ROADMAP.md#lens-fold-file-path-semantics".to_string())))]), FieldValue::Record(vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("bridge_mark_bootstrap_secret_nominal_opacity_retired".to_string()))), ("owner".to_string(), FieldValue::Literal(LiteralBits::String("R2-Substrate".to_string()))), ("status".to_string(), FieldValue::Variant { constructor: DeclarationId(2030), payload: vec![] }), ("authority".to_string(), FieldValue::Literal(LiteralBits::String("PR #937".to_string())))]), FieldValue::Record(vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("bridge_canonical_lens_name_dispatch_pr1183_slice_retired".to_string()))), ("owner".to_string(), FieldValue::Literal(LiteralBits::String("R2-Substrate".to_string()))), ("status".to_string(), FieldValue::Variant { constructor: DeclarationId(2030), payload: vec![] }), ("authority".to_string(), FieldValue::Literal(LiteralBits::String("src/v3/compiler/tests/integration/canonical_lens_bridge_ratchet_test.rs".to_string())))]), FieldValue::Record(vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("bridge_canonical_lens_name_patching_residual".to_string()))), ("owner".to_string(), FieldValue::Literal(LiteralBits::String("PB-Runtime".to_string()))), ("status".to_string(), FieldValue::Variant { constructor: DeclarationId(2031), payload: vec![] }), ("authority".to_string(), FieldValue::Literal(LiteralBits::String("docs/briefs/r2-pb-canonical-lens-bridge-disposition.md".to_string())))]), FieldValue::Record(vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("bridge_include_str_side_channels_retired".to_string()))), ("owner".to_string(), FieldValue::Literal(LiteralBits::String("pipeline_authority".to_string()))), ("status".to_string(), FieldValue::Variant { constructor: DeclarationId(2030), payload: vec![] }), ("authority".to_string(), FieldValue::Literal(LiteralBits::String("src/v3/compiler/tests/integration/l1_5_fixed_point_test.rs".to_string())))]), FieldValue::Record(vec![("name".to_string(), FieldValue::Literal(LiteralBits::String("bridge_exact_string_patching_residual_retired".to_string()))), ("owner".to_string(), FieldValue::Literal(LiteralBits::String("PB-Tier-2".to_string()))), ("status".to_string(), FieldValue::Variant { constructor: DeclarationId(2031), payload: vec![] }), ("authority".to_string(), FieldValue::Literal(LiteralBits::String("docs/r3-structure.md:83".to_string())))])])), refinement: None, nominal_opacity: None, span: SourceSpan::new("src/v3/std/bridge_ledger.dag", 6819, 8629) }); declarations.push(Declaration { id: DeclarationId(893), name: Some("CleanEmissionContract".to_string()), @@ -67676,7 +67676,7 @@ fn bootstrapped_fixture_dag_declarations() -> Vec { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("src/v3/std/bridge_ledger.dag", 4314, 4321), + span: SourceSpan::new("src/v3/std/bridge_ledger.dag", 4575, 4582), }); declarations.push(Declaration { id: DeclarationId(2031), @@ -67690,7 +67690,7 @@ fn bootstrapped_fixture_dag_declarations() -> Vec { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("src/v3/std/bridge_ledger.dag", 4326, 4330), + span: SourceSpan::new("src/v3/std/bridge_ledger.dag", 4587, 4591), }); declarations.push(Declaration { id: DeclarationId(2032), @@ -67710,7 +67710,7 @@ fn bootstrapped_fixture_dag_declarations() -> Vec { value_body: None, refinement: None, nominal_opacity: None, - span: SourceSpan::new("src/v3/std/bridge_ledger.dag", 6578, 6599), + span: SourceSpan::new("src/v3/std/bridge_ledger.dag", 6839, 6860), }); declarations.push(Declaration { id: DeclarationId(2033), 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 e95034e9423..c5ca7a13b83 100644 --- a/src/v3/compiler/src/bootstrap_generated_without_parse_surface.rs +++ b/src/v3/compiler/src/bootstrap_generated_without_parse_surface.rs @@ -26951,7 +26951,7 @@ fn bootstrapped_fixture_without_parse_surface_dag_declarations() -> Vec Vec Vec Vec Vec Vec) { + for entry in std::fs::read_dir(dir).unwrap_or_else(|err| { + panic!( + "failed to read compiler source directory `{}`: {err}", + dir.display() + ) + }) { + let path = entry.expect("read_dir entry").path(); + if path.is_dir() { + visit_rust_sources(&path, files); + } else if path.extension().and_then(|ext| ext.to_str()) == Some("rs") { + files.push(path); + } + } +} + +fn has_pipeline_dag_include_str(source: &str) -> bool { + let include_macro = concat!("include_", "str!"); + let mut offset = 0; + while let Some(found) = source[offset..].find(include_macro) { + let start = offset + found + include_macro.len(); + let Some(close) = source[start..].find(')') else { + return false; + }; + if source[start..start + close].contains("pipeline.dag") { + return true; + } + offset = start + close + 1; + } + false +} + #[test] -fn pipeline_dag_parses() { - let source = include_str!("../../pipeline.dag"); - let tokens = tokenize_for_test(source, "pipeline.dag") - .unwrap_or_else(|diag| panic!("tokenize pipeline.dag failed: {diag:?}")); - let _module = parse_for_test(&tokens, "pipeline.dag") - .unwrap_or_else(|diag| panic!("parse pipeline.dag failed: {diag:?}")); +fn compiler_has_no_pipeline_dag_include_str_side_channel() { + let compiler_root = std::path::PathBuf::from(env!("CARGO_MANIFEST_DIR")); + let mut rust_sources = Vec::new(); + visit_rust_sources(&compiler_root, &mut rust_sources); + + let offenders: Vec<_> = rust_sources + .into_iter() + .filter(|path| { + let source = std::fs::read_to_string(path) + .unwrap_or_else(|err| panic!("failed to read `{}`: {err}", path.display())); + has_pipeline_dag_include_str(&source) + }) + .collect(); + assert!( + offenders.is_empty(), + "R3 bridge_include_str_side_channels_retired forbids {} of {} under \ + src/v3/compiler; offenders: {offenders:?}", + concat!("include_", "str!"), + "pipeline.dag" + ); +} + +#[test] +fn pipeline_dag_is_present_in_structural_bootstrap_witness() { + let dag = generated_full_bootstrap_dag(); + for name in [ + "PipelineStageBinding", + "parse_stage_binding", + "lower_stage_binding", + "infer_stage_binding", + "compute_ownership_stage_binding", + "lens_complexity_stage_binding", + "emit_stage_binding", + ] { + let decl = dag + .declaration_by_name(name) + .unwrap_or_else(|| panic!("`{name}` missing from structural bootstrap witness")); + assert_eq!( + decl.span.file, "src/v3/compiler/pipeline.dag", + "`{name}` should be sourced from the generated pipeline.dag witness" + ); + } } #[test] diff --git a/src/v3/compiler/tests/integration/parse_corpus_manifest.txt b/src/v3/compiler/tests/integration/parse_corpus_manifest.txt index 017b297716b..fcdc1287dd5 100644 --- a/src/v3/compiler/tests/integration/parse_corpus_manifest.txt +++ b/src/v3/compiler/tests/integration/parse_corpus_manifest.txt @@ -32,7 +32,7 @@ src/v3/std/anthropic_schema.dag 14 69934 58a973240ec25777 src/v3/std/approximate_field.dag 11 16864 ccbe4826dc31c636 src/v3/std/bin_shim.dag 4 2544 9ac96f1b3feafe47 src/v3/std/bootstrap_authority.dag 4 70609 e228bb8bb2449ece -src/v3/std/bridge_ledger.dag 7 31662 ec3b4ea8c0455eb7 +src/v3/std/bridge_ledger.dag 7 31715 24b440cabf3c7d6f src/v3/std/clean_emission.dag 15 23867 e7bc1e6145f4781e src/v3/std/computation.dag 19 37870 25c5a33ef4d8735a src/v3/std/computation_model.dag 14 22953 20e458fe097d175a diff --git a/src/v3/std/bridge_ledger.dag b/src/v3/std/bridge_ledger.dag index a99d2b74805..1c4ced2ec1a 100644 --- a/src/v3/std/bridge_ledger.dag +++ b/src/v3/std/bridge_ledger.dag @@ -49,12 +49,15 @@ import v3.spec.v3_l1 { DeclarationRef } // `test_runner.rs` (`include_str!`, name arms, and generic // name-keyed lookups); full retirement waits for PB-Runtime // interpreter-as-data or a typed lens-registry carrier. -// - `bridge_include_str_side_channels_retired` — Open. Per -// `r3-structure.md:82`: "Open disposition (`pipeline_authority`, -// PR #1171, 2026-04-29): `compile` remains `ArrowBody::Unparsed`, -// so compile-body stage order is not yet a structural Dag fact; -// full gate for this site awaits derivation / lowered compile -// witness." +// - `bridge_include_str_side_channels_retired` — Retired for the +// pipeline-authority slice. The active `pipeline.dag` compile-time +// source embed under `src/v3/compiler/` has been replaced by a +// structural bootstrap witness over `PipelineStageBinding`, and the +// integration ratchet forbids reintroducing `include_str!` of +// `pipeline.dag` under the compiler crate. `fn compile` still +// lowers as `ArrowBody::Unparsed`; the retired row therefore means +// no source-text side channel remains for this authority path, not +// that compile-body drift is structurally checkable. // - `bridge_exact_string_patching_residual_retired` — Open. Per // `r3-structure.md:83`: PB lower-helper slice (Tier-2 / #1014 // lineage) is pinned at zero, BUT "Other exact-string patching @@ -148,8 +151,8 @@ data bridge_ledger: List = [ { name: "bridge_include_str_side_channels_retired", owner: "pipeline_authority", - status: Open, - authority: "PR #1171" + status: Retired, + authority: "src/v3/compiler/tests/integration/l1_5_fixed_point_test.rs" }, { name: "bridge_exact_string_patching_residual_retired",