From 1393c2bdb1b449c64351cf56d46b31c12cf254a3 Mon Sep 17 00:00:00 2001 From: Brian Searls Date: Mon, 11 May 2026 17:57:01 -0400 Subject: [PATCH 1/9] WIP: R3 Cluster M #84 R1C-D/E tests-as-data pilot --- docs/briefs/r1-closure-manager.md | 2 +- scripts/slow-test-exemptions.txt | 2 +- .../tests/dag/r1c_e_emit_gates.template.dag | 2 +- .../dag/r1c_e_emit_gates_omni.template.dag | 2 +- .../t_r1c_d_pb_census_gates.dag} | 12 +- src/v3/compiler/tests/integration.rs | 6 - .../integration/r1c_d_pb_census_gates_test.rs | 98 ----------- .../integration/r1c_e_emit_gates_dag_test.rs | 74 -------- .../r1c_e_emit_gates_omni_dag_test.rs | 68 -------- ...ucer_retirement_executable_witness_test.rs | 4 +- .../r3_v3_self_host_demonstration_dag_test.rs | 2 +- .../tests/integration/sg0_census_test.rs | 18 +- .../integration/t_pb_b_1_dag_runner_test.rs | 159 ++++++++++++++++++ 13 files changed, 174 insertions(+), 275 deletions(-) rename src/v3/compiler/tests/{fixtures/r1_pb_census_gates.dag => dag/t_r1c_d_pb_census_gates.dag} (93%) delete mode 100644 src/v3/compiler/tests/integration/r1c_d_pb_census_gates_test.rs delete mode 100644 src/v3/compiler/tests/integration/r1c_e_emit_gates_dag_test.rs delete mode 100644 src/v3/compiler/tests/integration/r1c_e_emit_gates_omni_dag_test.rs diff --git a/docs/briefs/r1-closure-manager.md b/docs/briefs/r1-closure-manager.md index a4c65c4430b..dbedce41597 100644 --- a/docs/briefs/r1-closure-manager.md +++ b/docs/briefs/r1-closure-manager.md @@ -73,6 +73,6 @@ remaining work. - Parent authority: [`ROADMAP.md §"Release R1 Program"`](../../ROADMAP.md). - R1C-B T-P0 receipts: [`r1_gates.dag`](../../src/v3/compiler/tests/fixtures/r1_gates.dag), [`scripts/r1_p0_no_fabrication_sentinel.sh`](../../scripts/r1_p0_no_fabrication_sentinel.sh), [`scripts/r1_p0_rest_ops_aligned.py`](../../scripts/r1_p0_rest_ops_aligned.py). -- R1C-D live census fixture: [`r1_pb_census_gates.dag`](../../src/v3/compiler/tests/fixtures/r1_pb_census_gates.dag). +- R1C-D live census fixture: [`t_r1c_d_pb_census_gates.dag`](../../src/v3/compiler/tests/dag/t_r1c_d_pb_census_gates.dag) (runner receipt in `t_pb_b_1_dag_runner_test.rs`; Cluster M #84 pilot). - R1 release-acceptance fixture: [`r1_release_acceptance.dag`](../../src/v3/compiler/tests/fixtures/r1_release_acceptance.dag). - Census authority: `src/v3/compiler/tests/integration/sg0_census_test.rs`. diff --git a/scripts/slow-test-exemptions.txt b/scripts/slow-test-exemptions.txt index 58525639e58..5c45e9baf00 100644 --- a/scripts/slow-test-exemptions.txt +++ b/scripts/slow-test-exemptions.txt @@ -67,7 +67,7 @@ m2_lens_idempotency_migration_test::idempotency_emitted_analyze_matches_oracle m2_lens_provenance_migration_test::lens_provenance_dag_runs_end_to_end_via_rustc_harness # Lane 2 migration harness roundtrip; compile-heavy oracle test remains explicit until lens migration paydown. m2_lens_unused_parameters_migration_test::unused_parameters_dag_runs_end_to_end_via_rustc_harness # Lane 2 migration harness roundtrip; compile-heavy oracle test remains explicit until lens migration paydown. m2_lens_unused_parameters_migration_test::unused_parameters_dag_self_analysis_reports_zero_findings # Lane 2 migration harness roundtrip; compile-heavy self-analysis remains explicit until lens migration paydown. -r1c_e_emit_gates_dag_test::r1c_e_emit_gates_suite_passes_through_runner # R1C-E `.dag` wrapper shells through the runner/binary harness and sits on the 2s CI edge (2166ms on PR #1233); paydown owned by R1C-E emit-gates runner/shared-setup work, not this impossible-bugs row-removal slice. +t_pb_b_1_dag_runner_test::r1c_e_emit_gates_suite_passes_through_runner # R1C-E `.dag` wrapper shells through the runner/binary harness and sits on the 2s CI edge (2166ms on PR #1233); paydown owned by R1C-E emit-gates runner/shared-setup work, not this impossible-bugs row-removal slice. r3_verification_l4_l7_l5_skeleton_test::r3_verification_l4_emit_eval_false_branch_passes_w1_emit_vs_eval # R3-V L4 W1 direct consumer fixture runs the full emit-vs-eval suite through TestRunner and can sit just above 2s on CI (2072ms on PR #1799); paydown owned by R3-V L4/L7 direct harness shared runner setup, see docs/briefs/r3-v-l4-l7-direct-w1-consumer-spec.md. r3_verification_l4_l7_l5_skeleton_test::r3_verification_l7_algebraic_law_matrix_has_current_runner_receipts # R3 gate #10 / issue #2382: single `L7_MATRIX_SUITE` runner pass + per-claim source receipts ~2.4s cold CI (PR #2394); paydown: slimmer witness applications or shared runner amortization with other Lane 1 L7 rows. diff --git a/src/v3/compiler/tests/dag/r1c_e_emit_gates.template.dag b/src/v3/compiler/tests/dag/r1c_e_emit_gates.template.dag index f44fc2abbdc..099542dcdba 100644 --- a/src/v3/compiler/tests/dag/r1c_e_emit_gates.template.dag +++ b/src/v3/compiler/tests/dag/r1c_e_emit_gates.template.dag @@ -1,7 +1,7 @@ // R1C-E — T-Emit `.dag` `TestClaim` wrappers (ExecuteCommand logical child: // the `r1c_e_emit_gates` `bin`). The `__R1C_E_BIN__` placeholder is replaced // with `env!("CARGO_BIN_EXE_r1c_e_emit_gates")` at integration-test compile -// time (see `tests/integration/r1c_e_emit_gates_dag_test.rs`); no checked-in +// time (see `tests/integration/t_pb_b_1_dag_runner_test.rs`); no checked-in // absolute path goes stale (manager guidance, R1 Closure decision on #973 — // same discipline as `build.rs` splice for `r1_gates.template.dag`). // diff --git a/src/v3/compiler/tests/dag/r1c_e_emit_gates_omni.template.dag b/src/v3/compiler/tests/dag/r1c_e_emit_gates_omni.template.dag index 0fd9401c847..a20465e54d1 100644 --- a/src/v3/compiler/tests/dag/r1c_e_emit_gates_omni.template.dag +++ b/src/v3/compiler/tests/dag/r1c_e_emit_gates_omni.template.dag @@ -1,7 +1,7 @@ // R1C-E — T-Emit omni three-way gate (separate template so the integration // receipt can stay `#[ignore]`d: `go` + `python3` are not on all CI images). // `__R1C_E_BIN__` is replaced with `env!("CARGO_BIN_EXE_r1c_e_emit_gates")` -// in `r1c_e_emit_gates_omni_dag_test.rs`. `ForAllTargets` is not wired in the +// in `t_pb_b_1_dag_runner_test.rs`. `ForAllTargets` is not wired in the // Rust `TestRunner` (see `test_runner.rs`); this gate is one `ExecuteCommand` // to the `omni-demo` subcommand (brief §3 — three separate claims not needed). diff --git a/src/v3/compiler/tests/fixtures/r1_pb_census_gates.dag b/src/v3/compiler/tests/dag/t_r1c_d_pb_census_gates.dag similarity index 93% rename from src/v3/compiler/tests/fixtures/r1_pb_census_gates.dag rename to src/v3/compiler/tests/dag/t_r1c_d_pb_census_gates.dag index 3feb81ddfa9..6705b67a387 100644 --- a/src/v3/compiler/tests/fixtures/r1_pb_census_gates.dag +++ b/src/v3/compiler/tests/dag/t_r1c_d_pb_census_gates.dag @@ -1,4 +1,4 @@ -// std.r1_pb_census_gates - R1C-D `.dag` TestClaim fixtures for the six +// R1C-D — PB census `.dag` TestClaim fixtures for the six // PB census gates (T-PB-A ×4 + T-PB-B ×2). The Rust ratchets in // `src/v3/compiler/tests/integration/sg0_census_test.rs` remain the // drift-detection authority on the underlying lists; this file wires the @@ -27,13 +27,11 @@ // (same dissolution gating as D.6) AND that the listed paths // all live in the SG-0 generated-file manifest. // -// Lives under `src/v3/compiler/tests/fixtures/` so it is **not** -// auto-staged into `Dag::new()` bootstrap (`src/v3/std/*.dag` is the -// build-script-enumerated tree). The runner test in -// `tests/integration/r1c_d_pb_census_gates_test.rs` lowers this file -// via `compile_to_dag` exactly like the sibling R1 gate fixtures. +// Lives under `src/v3/compiler/tests/dag/` alongside other `TestRunner` +// harness modules (R3 Cluster M #84 pilot — tests-as-data layout). The +// integration receipt is `t_pb_b_1_dag_runner_test::r1c_d_pb_census_gates_suite_evaluates_through_runner`. -module std.r1_pb_census_gates +module v3.compiler.tests.r1c_d.pb_census_gates import std.verification { CensusBoundCheck, diff --git a/src/v3/compiler/tests/integration.rs b/src/v3/compiler/tests/integration.rs index 385a4e9cb88..91656945eb8 100644 --- a/src/v3/compiler/tests/integration.rs +++ b/src/v3/compiler/tests/integration.rs @@ -165,12 +165,6 @@ mod pipe_desugar; mod prereq_x_call_on_field_access_ratchet_test; #[path = "integration/r1_release_acceptance_test.rs"] mod r1_release_acceptance_test; -#[path = "integration/r1c_d_pb_census_gates_test.rs"] -mod r1c_d_pb_census_gates_test; -#[path = "integration/r1c_e_emit_gates_dag_test.rs"] -mod r1c_e_emit_gates_dag_test; -#[path = "integration/r1c_e_emit_gates_omni_dag_test.rs"] -mod r1c_e_emit_gates_omni_dag_test; #[path = "integration/r2_b5_loop_construction_closure_test.rs"] mod r2_b5_loop_construction_closure_test; #[path = "integration/r3_class_2_function_valued_data_test.rs"] diff --git a/src/v3/compiler/tests/integration/r1c_d_pb_census_gates_test.rs b/src/v3/compiler/tests/integration/r1c_d_pb_census_gates_test.rs deleted file mode 100644 index e59a45c7191..00000000000 --- a/src/v3/compiler/tests/integration/r1c_d_pb_census_gates_test.rs +++ /dev/null @@ -1,98 +0,0 @@ -//! **Layer:** integration -//! -//! R1C-D — runner-side receipt that the six PB census `.dag` `TestClaim` -//! fixtures in `tests/fixtures/r1_pb_census_gates.dag` lower cleanly and -//! evaluate through `TestRunner` against the live SG-0 census authority. -//! -//! The acceptance shape (per `docs/briefs/r1c-d-t-pb-census-as-dag-worker.md` -//! §Acceptance) is **not** "every claim Pass" — five of the six gates -//! (`pb_hand_rust_at_shim_floor`, `lens_producer_files_remaining`, -//! `pb_compiler_std_ratchet_zero`, `pb_test_file_generated_from_dag`, -//! `pb_rust_tests_outside_residual_zero`) are RED today and stay RED until -//! cascade-promotion 0-floor + ratchet drive-down work in the Pure -//! Bootstrap to Zero program retires the underlying residuals. Only -//! `pb_self_compile_fixed_point` is green at landing. The receipt this -//! test carries is: -//! -//! 1. The fixture compiles cleanly through `compile_to_dag`. -//! 2. `TestRunner::run_suite` returns six results in declared order. -//! 3. **No** result is `ClaimResult::NotYetImplemented(_)` — proving -//! every PB census predicate's `eval_*_shape` slice is wired in -//! `test_runner.rs` (R1C-D Acceptance line: "Runner dispatches each -//! fixture cleanly"). -//! 4. Each result is `Pass` or `Fail` against current census state, never -//! an evaluation error from a missing dispatch arm. -//! -//! The Rust ratchets in `tests/integration/sg0_census_test.rs` remain the -//! drift-detection authority on the underlying lists. RED `.dag` gates are -//! surfaced to the R1 Closure Manager inbox as dissolution-work-pending -//! cross-manager queue entries; pacing is the Pure Bootstrap to Zero -//! program's, not this test's. - -use v3_compiler::compile_to_dag; -use v3_compiler::test_runner::{ClaimResult, TestRunner}; -use v3_compiler::CompileError; - -const FIXTURE_SOURCE: &str = include_str!("../fixtures/r1_pb_census_gates.dag"); -const FIXTURE_PATH: &str = "src/v3/compiler/tests/fixtures/r1_pb_census_gates.dag"; -const SUITE_NAME: &str = "r1_pb_census_gates_suite"; - -const EXPECTED_CLAIM_NAMES: &[&str] = &[ - "pb_hand_rust_at_shim_floor", - "lens_producer_files_remaining", - "pb_self_compile_fixed_point", - "pb_compiler_std_ratchet_zero", - "pb_test_file_generated_from_dag", - "pb_rust_tests_outside_residual_zero", -]; - -#[test] -fn r1c_d_pb_census_gates_suite_evaluates_through_runner() { - 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); - let actual_names: Vec<&str> = results.iter().map(|r| r.claim_name.as_str()).collect(); - assert_eq!( - actual_names, EXPECTED_CLAIM_NAMES, - "suite `{SUITE_NAME}`: claim order must match the declared deliverable list" - ); - - // Brief acceptance line: "Runner dispatches each fixture cleanly (no - // `NotYetImplemented` returns)." A `NotYetImplemented` here would mean - // a PB census `eval_*_shape` slice regressed to a stub — that is the - // exact regression this test is designed to catch. - let unimplemented: Vec<_> = results - .iter() - .filter(|r| matches!(r.result, ClaimResult::NotYetImplemented(_))) - .collect(); - assert!( - unimplemented.is_empty(), - "PB census predicates must dispatch to wired evaluators, not `NotYetImplemented`. Offenders:\n{unimplemented:#?}" - ); - - // Everything else should be a structural Pass/Fail outcome — never an - // evaluation error from a missing dispatch arm or malformed payload. - for result in &results { - match &result.result { - ClaimResult::Pass | ClaimResult::Fail(_) => {} - other => panic!( - "PB census claim `{}` must evaluate to Pass or Fail, got {:?}", - result.claim_name, other - ), - } - } -} diff --git a/src/v3/compiler/tests/integration/r1c_e_emit_gates_dag_test.rs b/src/v3/compiler/tests/integration/r1c_e_emit_gates_dag_test.rs deleted file mode 100644 index 4076c1079b4..00000000000 --- a/src/v3/compiler/tests/integration/r1c_e_emit_gates_dag_test.rs +++ /dev/null @@ -1,74 +0,0 @@ -//! **Layer:** integration -//! -//! R1C-E — runner-side receipt that the T-Emit `.dag` `TestClaim` wrappers in -//! `tests/dag/r1c_e_emit_gates.template.dag` evaluate `Pass` through the same -//! `compile_to_dag` + `TestRunner` path as the rest of the `.dag` harness. -//! -//! The template carries `__R1C_E_BIN__` as the `ExecuteCommand` `command` -//! placeholder; the substitution to the real `bin` path happens here at -//! test-crate compile time (`env!("CARGO_BIN_EXE_r1c_e_emit_gates")`). No -//! checked-in absolute path goes stale (R1 Closure decision on #973 — -//! parallel to the `r1_gates.template.dag` splice discipline). -//! -//! Runs unignored: the suite's `ExecuteCommand` claims are `generic-bounds` -//! (structural) and `rust-fixtures` (batches the same `rustc` host harness as -//! `m1_3` — a full Rust toolchain is required on the runner image). The -//! multi-target `emit_omni_demo_fixtures_green` claim lives in a **separate** -//! template + `r1c_e_emit_gates_omni_dag_test` (`#[ignore]`, go + python3). - -use v3_compiler::compile_to_dag; -use v3_compiler::test_runner::{ClaimResult, TestRunner}; -use v3_compiler::CompileError; - -const TEMPLATE: &str = include_str!("../dag/r1c_e_emit_gates.template.dag"); -const TEMPLATE_PATH: &str = "src/v3/compiler/tests/dag/r1c_e_emit_gates.template.dag"; -const BIN_PATH: &str = env!("CARGO_BIN_EXE_r1c_e_emit_gates"); -const BIN_PLACEHOLDER: &str = "__R1C_E_BIN__"; - -fn substituted_dag_source() -> String { - assert!( - TEMPLATE.contains(BIN_PLACEHOLDER), - "template must contain `{BIN_PLACEHOLDER}` placeholder for bin substitution \ - (see manager guidance, #973): {TEMPLATE_PATH}" - ); - TEMPLATE.replace(BIN_PLACEHOLDER, BIN_PATH) -} - -#[test] -fn r1c_e_emit_gates_suite_passes_through_runner() { - let source = substituted_dag_source(); - let dag = match compile_to_dag(&source, TEMPLATE_PATH) { - Ok(dag) => { - assert!( - dag.diagnostics().is_empty(), - "{TEMPLATE_PATH} (substituted): expected empty module diagnostics, got {:?}", - dag.diagnostics().iter().collect::>() - ); - dag - } - Err(CompileError::Semantic(dag)) => { - panic!( - "{TEMPLATE_PATH} (substituted) should lower without module diagnostics. \ - Got `Err(Semantic)`: {:?}", - dag.diagnostics().iter().collect::>() - ); - } - Err(other) => panic!("unexpected compile error for {TEMPLATE_PATH}: {other:?}"), - }; - - let results = TestRunner::new(&dag).run_suite("r1c_e_emit_gates_suite"); - assert!( - !results.is_empty(), - "suite `r1c_e_emit_gates_suite` should contain at least one claim" - ); - let failures: Vec<_> = results - .iter() - .filter(|r| r.result != ClaimResult::Pass) - .collect(); - assert!( - failures.is_empty(), - "r1c_e_emit_gates_suite: {} claim(s) did not Pass:\n{:#?}", - failures.len(), - failures - ); -} diff --git a/src/v3/compiler/tests/integration/r1c_e_emit_gates_omni_dag_test.rs b/src/v3/compiler/tests/integration/r1c_e_emit_gates_omni_dag_test.rs deleted file mode 100644 index 6b0ed5de096..00000000000 --- a/src/v3/compiler/tests/integration/r1c_e_emit_gates_omni_dag_test.rs +++ /dev/null @@ -1,68 +0,0 @@ -//! **Layer:** integration -//! -//! R1C-E — `emit_omni_demo_fixtures_green` `.dag` `TestClaim` (subcommand -//! `omni-demo` on the `r1c_e_emit_gates` bin). This suite requires **go** and -//! **python3**; normal CI does not install them, so the receipt is `#[ignore]`d -//! (same as the host `m1_5_emit_omni_demo_test::emit_omni_demo_fixtures_green`). -//! The main R1C-E template (`r1c_e_emit_gates.template.dag`) stays unignored -//! and covers `generic-bounds` + `rust-fixtures` only. -//! -//! Run locally (after `r1c_e_emit_gates` is built, e.g. `cargo test -p v3-compiler --test integration`): -//! `cargo test -p v3-compiler --test integration r1c_e_emit_gates_omni_suite_passes -- --ignored --nocapture` - -use v3_compiler::compile_to_dag; -use v3_compiler::test_runner::{ClaimResult, TestRunner}; -use v3_compiler::CompileError; - -const TEMPLATE: &str = include_str!("../dag/r1c_e_emit_gates_omni.template.dag"); -const TEMPLATE_PATH: &str = "src/v3/compiler/tests/dag/r1c_e_emit_gates_omni.template.dag"; -const BIN_PATH: &str = env!("CARGO_BIN_EXE_r1c_e_emit_gates"); -const BIN_PLACEHOLDER: &str = "__R1C_E_BIN__"; - -fn substituted_dag_source() -> String { - assert!( - TEMPLATE.contains(BIN_PLACEHOLDER), - "template must contain `{BIN_PLACEHOLDER}` placeholder for bin substitution: {TEMPLATE_PATH}" - ); - TEMPLATE.replace(BIN_PLACEHOLDER, BIN_PATH) -} - -#[test] -#[ignore = "requires go and python3 on PATH (same as emit_omni_demo_fixtures_green)"] -fn r1c_e_emit_gates_omni_suite_passes() { - let source = substituted_dag_source(); - let dag = match compile_to_dag(&source, TEMPLATE_PATH) { - Ok(dag) => { - assert!( - dag.diagnostics().is_empty(), - "{TEMPLATE_PATH} (substituted): expected empty module diagnostics, got {:?}", - dag.diagnostics().iter().collect::>() - ); - dag - } - Err(CompileError::Semantic(dag)) => { - panic!( - "{TEMPLATE_PATH} (substituted) should lower without module diagnostics. \ - Got `Err(Semantic)`: {:?}", - dag.diagnostics().iter().collect::>() - ); - } - Err(other) => panic!("unexpected compile error for {TEMPLATE_PATH}: {other:?}"), - }; - - let results = TestRunner::new(&dag).run_suite("r1c_e_emit_gates_omni_suite"); - assert!( - !results.is_empty(), - "suite `r1c_e_emit_gates_omni_suite` should have claims" - ); - let failures: Vec<_> = results - .iter() - .filter(|r| r.result != ClaimResult::Pass) - .collect(); - assert!( - failures.is_empty(), - "r1c_e_emit_gates_omni_suite: {} claim(s) did not Pass:\n{:#?}", - failures.len(), - failures - ); -} diff --git a/src/v3/compiler/tests/integration/r3_lens_producer_retirement_executable_witness_test.rs b/src/v3/compiler/tests/integration/r3_lens_producer_retirement_executable_witness_test.rs index 563b1760405..320b2d18b42 100644 --- a/src/v3/compiler/tests/integration/r3_lens_producer_retirement_executable_witness_test.rs +++ b/src/v3/compiler/tests/integration/r3_lens_producer_retirement_executable_witness_test.rs @@ -12,8 +12,8 @@ use v3_compiler::compile_to_dag; use v3_compiler::test_runner::{ClaimResult, TestRunner}; use v3_compiler::CompileError; -const FIXTURE_SOURCE: &str = include_str!("../fixtures/r1_pb_census_gates.dag"); -const FIXTURE_PATH: &str = "src/v3/compiler/tests/fixtures/r1_pb_census_gates.dag"; +const FIXTURE_SOURCE: &str = include_str!("../dag/t_r1c_d_pb_census_gates.dag"); +const FIXTURE_PATH: &str = "src/v3/compiler/tests/dag/t_r1c_d_pb_census_gates.dag"; const SUITE_NAME: &str = "r1_pb_census_gates_suite"; const CLAIM_NAME: &str = "lens_producer_files_remaining"; const CURRENT_RESIDUAL_COUNT: i64 = 3; diff --git a/src/v3/compiler/tests/integration/r3_v3_self_host_demonstration_dag_test.rs b/src/v3/compiler/tests/integration/r3_v3_self_host_demonstration_dag_test.rs index 738bdd3b751..af6006cc468 100644 --- a/src/v3/compiler/tests/integration/r3_v3_self_host_demonstration_dag_test.rs +++ b/src/v3/compiler/tests/integration/r3_v3_self_host_demonstration_dag_test.rs @@ -10,7 +10,7 @@ //! //! The `.dag` template carries `__SELF_HOST_FIXED_POINT_BIN__`; substitution uses //! `env!("CARGO_BIN_EXE_self_host_fixed_point")` at integration-test compile time (R1 -//! Closure `#973` discipline, parallel to `r1c_e_emit_gates_dag_test` / `r1c_e_emit_gates.template.dag`). +//! Closure `#973` discipline, parallel to `t_pb_b_1_dag_runner_test` / `r1c_e_emit_gates.template.dag`). //! //! **Staging:** while `compiler.dag` still fails v3 parse, this end-to-end test stays `#[ignore]`. //! **Toolchain:** full Rust + `rustc` when the parse + emit slice runs. diff --git a/src/v3/compiler/tests/integration/sg0_census_test.rs b/src/v3/compiler/tests/integration/sg0_census_test.rs index d5d0a53825c..abaef3828d4 100644 --- a/src/v3/compiler/tests/integration/sg0_census_test.rs +++ b/src/v3/compiler/tests/integration/sg0_census_test.rs @@ -539,21 +539,9 @@ const EXPECTED_HAND_AUTHORED_TEST: &[&str] = &[ // Dissolution trigger: R3 closes the named T-LensProducer-Retirement / // T-PB-B bulk-migration lanes and this R1-only acceptance wrapper retires. "src/v3/compiler/tests/integration/r1_release_acceptance_test.rs", - // R1C-D (PB census `.dag` `TestClaim` wrappers): runner-side receipt - // for the six PB census gates in `tests/fixtures/r1_pb_census_gates.dag`. - // Asserts `TestRunner` dispatches each PB census predicate to a wired - // `eval_*_shape` slice (no `NotYetImplemented`) and that results are - // structural `Pass`/`Fail` against the live SG-0 census authority. - // Same residual class as the R1C-E driver below — paired hand-Rust - // shim until R1 close dissolves the wrappers (D.5 / cascade-promotion - // 0-floor work in the Pure Bootstrap to Zero program). - "src/v3/compiler/tests/integration/r1c_d_pb_census_gates_test.rs", - // R1C-E (T-Emit `.dag` `TestClaim` wrappers): integration-test driver - // that splices `env!("CARGO_BIN_EXE_r1c_e_emit_gates")` into the - // `tests/dag/r1c_e_emit_gates.template.dag` source and runs the suite - // through `TestRunner`. Scaffold until R1 close dissolves the wrappers. - "src/v3/compiler/tests/integration/r1c_e_emit_gates_dag_test.rs", - "src/v3/compiler/tests/integration/r1c_e_emit_gates_omni_dag_test.rs", + // R3 Cluster M #84 pilot: R1C-D + R1C-E runner receipts live in + // `t_pb_b_1_dag_runner_test.rs` (co-located with gate #74 / #87 harnesses); + // census-authority `.dag` is `tests/dag/t_r1c_d_pb_census_gates.dag`. // R2 B5: Loop construction-closure structural gate (Tier 2 §5). "src/v3/compiler/tests/integration/r2_b5_loop_construction_closure_test.rs", // R3 §1.4 Class 2 / §1.8 row #61 diff --git a/src/v3/compiler/tests/integration/t_pb_b_1_dag_runner_test.rs b/src/v3/compiler/tests/integration/t_pb_b_1_dag_runner_test.rs index 86cef1be7ff..3e2f26405cb 100644 --- a/src/v3/compiler/tests/integration/t_pb_b_1_dag_runner_test.rs +++ b/src/v3/compiler/tests/integration/t_pb_b_1_dag_runner_test.rs @@ -12,6 +12,11 @@ //! `TestClaim.source` is orthogonal). Still //! **not** a `pb_*` gate and still not a Rust-deletion signal. //! +//! **R3 Cluster M #84 — R1C-D/E tests-as-data pilot:** R1C-D (`t_r1c_d_pb_census_gates.dag`) +//! and R1C-E (`r1c_e_emit_gates.template.dag` + omni template) integration receipts +//! live here with gate #74 (`t_r3_tests_as_data_demonstration.dag`), replacing dedicated +//! `r1c_*_test.rs` shims (SG-0 hand-path shrink toward `every_rust_test_ports_to_dag_or_generated`). +//! //! R3 gate #87 `R3_GATE_87_CEMENTING_REGEN_SUITES` wiring: **INVARIANTS P5(b)** — merge-visible //! integration delta; see module doc on `r3_gate_87_lens_cementing_regen_receipts_test` (§P5(b) //! checkable receipt = **PR #2639 description**, not inferred deletes). @@ -89,6 +94,43 @@ fn run_suite_all_pass_with_expected_claim_names( ); } +/// R1C-D receipt: six PB census claims must dispatch to wired evaluators (no `NotYetImplemented`) +/// and evaluate to structural `Pass` or `Fail` — same acceptance as the former +/// `r1c_d_pb_census_gates_test` shim (`docs/briefs/r1-closure-manager.md` §R1C-D). +fn run_suite_r1c_d_pb_census_receipt(dag: &Dag, suite_name: &str) { + const EXPECTED_CLAIM_NAMES: &[&str] = &[ + "pb_hand_rust_at_shim_floor", + "lens_producer_files_remaining", + "pb_self_compile_fixed_point", + "pb_compiler_std_ratchet_zero", + "pb_test_file_generated_from_dag", + "pb_rust_tests_outside_residual_zero", + ]; + let results = TestRunner::new(dag).run_suite(suite_name); + let actual_names: Vec<&str> = results.iter().map(|r| r.claim_name.as_str()).collect(); + assert_eq!( + actual_names, EXPECTED_CLAIM_NAMES, + "suite `{suite_name}`: claim order must match the declared deliverable list" + ); + let unimplemented: Vec<_> = results + .iter() + .filter(|r| matches!(r.result, ClaimResult::NotYetImplemented(_))) + .collect(); + assert!( + unimplemented.is_empty(), + "PB census predicates must dispatch to wired evaluators, not `NotYetImplemented`. Offenders:\n{unimplemented:#?}" + ); + for result in &results { + match &result.result { + ClaimResult::Pass | ClaimResult::Fail(_) => {} + other => panic!( + "PB census claim `{}` must evaluate to Pass or Fail, got {:?}", + result.claim_name, other + ), + } + } +} + #[test] fn t_pb_b_1_pipeline_smoke_suite_passes_through_runner() { let dag = lower( @@ -170,6 +212,123 @@ fn r3_tests_as_data_demonstration_suite_passes_through_runner() { ); } +const R1C_D_PB_CENSUS_GATES_PATH: &str = "src/v3/compiler/tests/dag/t_r1c_d_pb_census_gates.dag"; +const R1C_D_PB_CENSUS_SUITE: &str = "r1_pb_census_gates_suite"; + +#[test] +fn r1c_d_pb_census_gates_suite_evaluates_through_runner() { + let dag = lower( + include_str!("../dag/t_r1c_d_pb_census_gates.dag"), + R1C_D_PB_CENSUS_GATES_PATH, + ); + run_suite_r1c_d_pb_census_receipt(&dag, R1C_D_PB_CENSUS_SUITE); +} + +const R1C_E_EMIT_GATES_TEMPLATE: &str = include_str!("../dag/r1c_e_emit_gates.template.dag"); +const R1C_E_EMIT_GATES_TEMPLATE_PATH: &str = "src/v3/compiler/tests/dag/r1c_e_emit_gates.template.dag"; +const R1C_E_EMIT_GATES_BIN_PATH: &str = env!("CARGO_BIN_EXE_r1c_e_emit_gates"); +const R1C_E_BIN_PLACEHOLDER: &str = "__R1C_E_BIN__"; + +fn substituted_r1c_e_emit_gates_source() -> String { + assert!( + R1C_E_EMIT_GATES_TEMPLATE.contains(R1C_E_BIN_PLACEHOLDER), + "template must contain `{R1C_E_BIN_PLACEHOLDER}` placeholder for bin substitution \ + (see manager guidance, #973): {R1C_E_EMIT_GATES_TEMPLATE_PATH}" + ); + R1C_E_EMIT_GATES_TEMPLATE.replace(R1C_E_BIN_PLACEHOLDER, R1C_E_EMIT_GATES_BIN_PATH) +} + +#[test] +fn r1c_e_emit_gates_suite_passes_through_runner() { + let source = substituted_r1c_e_emit_gates_source(); + let dag = match compile_to_dag(&source, R1C_E_EMIT_GATES_TEMPLATE_PATH) { + Ok(dag) => { + assert!( + dag.diagnostics().is_empty(), + "{R1C_E_EMIT_GATES_TEMPLATE_PATH} (substituted): expected empty module diagnostics, got {:?}", + dag.diagnostics().iter().collect::>() + ); + dag + } + Err(CompileError::Semantic(dag)) => { + panic!( + "{R1C_E_EMIT_GATES_TEMPLATE_PATH} (substituted) should lower without module diagnostics. \ + Got `Err(Semantic)`: {:?}", + dag.diagnostics().iter().collect::>() + ); + } + Err(other) => panic!("unexpected compile error for {R1C_E_EMIT_GATES_TEMPLATE_PATH}: {other:?}"), + }; + + let results = TestRunner::new(&dag).run_suite("r1c_e_emit_gates_suite"); + assert!( + !results.is_empty(), + "suite `r1c_e_emit_gates_suite` should contain at least one claim" + ); + let failures: Vec<_> = results + .iter() + .filter(|r| r.result != ClaimResult::Pass) + .collect(); + assert!( + failures.is_empty(), + "r1c_e_emit_gates_suite: {} claim(s) did not Pass:\n{:#?}", + failures.len(), + failures + ); +} + +const R1C_E_OMNI_TEMPLATE: &str = include_str!("../dag/r1c_e_emit_gates_omni.template.dag"); +const R1C_E_OMNI_TEMPLATE_PATH: &str = "src/v3/compiler/tests/dag/r1c_e_emit_gates_omni.template.dag"; + +fn substituted_r1c_e_emit_gates_omni_source() -> String { + assert!( + R1C_E_OMNI_TEMPLATE.contains(R1C_E_BIN_PLACEHOLDER), + "omni template must contain `{R1C_E_BIN_PLACEHOLDER}`: {R1C_E_OMNI_TEMPLATE_PATH}" + ); + R1C_E_OMNI_TEMPLATE.replace(R1C_E_BIN_PLACEHOLDER, R1C_E_EMIT_GATES_BIN_PATH) +} + +/// Multi-target omni emit claim — requires **go** and **python3** on `PATH` (ignored in default CI). +#[test] +#[ignore] +fn r1c_e_emit_gates_omni_suite_passes() { + let source = substituted_r1c_e_emit_gates_omni_source(); + let dag = match compile_to_dag(&source, R1C_E_OMNI_TEMPLATE_PATH) { + Ok(dag) => { + assert!( + dag.diagnostics().is_empty(), + "{R1C_E_OMNI_TEMPLATE_PATH} (substituted): expected empty module diagnostics, got {:?}", + dag.diagnostics().iter().collect::>() + ); + dag + } + Err(CompileError::Semantic(dag)) => { + panic!( + "{R1C_E_OMNI_TEMPLATE_PATH} (substituted) should lower without module diagnostics. \ + Got `Err(Semantic)`: {:?}", + dag.diagnostics().iter().collect::>() + ); + } + Err(other) => panic!("unexpected compile error for {R1C_E_OMNI_TEMPLATE_PATH}: {other:?}"), + }; + + let results = TestRunner::new(&dag).run_suite("r1c_e_emit_gates_omni_suite"); + assert!( + !results.is_empty(), + "suite `r1c_e_emit_gates_omni_suite` should have claims" + ); + let failures: Vec<_> = results + .iter() + .filter(|r| r.result != ClaimResult::Pass) + .collect(); + assert!( + failures.is_empty(), + "r1c_e_emit_gates_omni_suite: {} claim(s) did not Pass:\n{:#?}", + failures.len(), + failures + ); +} + /// R3 gate #65 — a Tier3 mirror-consumer `.dag` program executes through /// `TestRunner` using std termination authority instead of the hand-Rust mirror /// bench path. From 44f8427f42b44644ddca675a696b34556c53485c Mon Sep 17 00:00:00 2001 From: Brian Searls Date: Mon, 11 May 2026 22:03:10 +0000 Subject: [PATCH 2/9] refactor(v3-compiler): reuse lower() for R1C-E substituted templates Addresses api-review follow-up on #2715: generalize lower(source) to &str so r1c_e_emit_gates_* tests share the same compile_to_dag error handling as the rest of the dag-runner harness. Co-authored-by: Cursor --- .../integration/t_pb_b_1_dag_runner_test.rs | 46 +++---------------- 1 file changed, 7 insertions(+), 39 deletions(-) diff --git a/src/v3/compiler/tests/integration/t_pb_b_1_dag_runner_test.rs b/src/v3/compiler/tests/integration/t_pb_b_1_dag_runner_test.rs index 3e2f26405cb..ef427e45195 100644 --- a/src/v3/compiler/tests/integration/t_pb_b_1_dag_runner_test.rs +++ b/src/v3/compiler/tests/integration/t_pb_b_1_dag_runner_test.rs @@ -28,7 +28,7 @@ use v3_compiler::dag::Dag; use v3_compiler::test_runner::{ClaimResult, TestRunner}; use v3_compiler::CompileError; -fn lower(source: &'static str, file: &'static str) -> Dag { +fn lower(source: &str, file: &str) -> Dag { // `compile_to_dag` returns `Ok` iff the module diagnostic table is empty // (`lib.rs` — any semantic issue is `Err(Semantic(dag))` with non-empty // diagnostics). The retired `t_pb_b_1_tests_dag_smoke_test` required the @@ -225,7 +225,8 @@ fn r1c_d_pb_census_gates_suite_evaluates_through_runner() { } const R1C_E_EMIT_GATES_TEMPLATE: &str = include_str!("../dag/r1c_e_emit_gates.template.dag"); -const R1C_E_EMIT_GATES_TEMPLATE_PATH: &str = "src/v3/compiler/tests/dag/r1c_e_emit_gates.template.dag"; +const R1C_E_EMIT_GATES_TEMPLATE_PATH: &str = + "src/v3/compiler/tests/dag/r1c_e_emit_gates.template.dag"; const R1C_E_EMIT_GATES_BIN_PATH: &str = env!("CARGO_BIN_EXE_r1c_e_emit_gates"); const R1C_E_BIN_PLACEHOLDER: &str = "__R1C_E_BIN__"; @@ -241,24 +242,7 @@ fn substituted_r1c_e_emit_gates_source() -> String { #[test] fn r1c_e_emit_gates_suite_passes_through_runner() { let source = substituted_r1c_e_emit_gates_source(); - let dag = match compile_to_dag(&source, R1C_E_EMIT_GATES_TEMPLATE_PATH) { - Ok(dag) => { - assert!( - dag.diagnostics().is_empty(), - "{R1C_E_EMIT_GATES_TEMPLATE_PATH} (substituted): expected empty module diagnostics, got {:?}", - dag.diagnostics().iter().collect::>() - ); - dag - } - Err(CompileError::Semantic(dag)) => { - panic!( - "{R1C_E_EMIT_GATES_TEMPLATE_PATH} (substituted) should lower without module diagnostics. \ - Got `Err(Semantic)`: {:?}", - dag.diagnostics().iter().collect::>() - ); - } - Err(other) => panic!("unexpected compile error for {R1C_E_EMIT_GATES_TEMPLATE_PATH}: {other:?}"), - }; + let dag = lower(&source, R1C_E_EMIT_GATES_TEMPLATE_PATH); let results = TestRunner::new(&dag).run_suite("r1c_e_emit_gates_suite"); assert!( @@ -278,7 +262,8 @@ fn r1c_e_emit_gates_suite_passes_through_runner() { } const R1C_E_OMNI_TEMPLATE: &str = include_str!("../dag/r1c_e_emit_gates_omni.template.dag"); -const R1C_E_OMNI_TEMPLATE_PATH: &str = "src/v3/compiler/tests/dag/r1c_e_emit_gates_omni.template.dag"; +const R1C_E_OMNI_TEMPLATE_PATH: &str = + "src/v3/compiler/tests/dag/r1c_e_emit_gates_omni.template.dag"; fn substituted_r1c_e_emit_gates_omni_source() -> String { assert!( @@ -293,24 +278,7 @@ fn substituted_r1c_e_emit_gates_omni_source() -> String { #[ignore] fn r1c_e_emit_gates_omni_suite_passes() { let source = substituted_r1c_e_emit_gates_omni_source(); - let dag = match compile_to_dag(&source, R1C_E_OMNI_TEMPLATE_PATH) { - Ok(dag) => { - assert!( - dag.diagnostics().is_empty(), - "{R1C_E_OMNI_TEMPLATE_PATH} (substituted): expected empty module diagnostics, got {:?}", - dag.diagnostics().iter().collect::>() - ); - dag - } - Err(CompileError::Semantic(dag)) => { - panic!( - "{R1C_E_OMNI_TEMPLATE_PATH} (substituted) should lower without module diagnostics. \ - Got `Err(Semantic)`: {:?}", - dag.diagnostics().iter().collect::>() - ); - } - Err(other) => panic!("unexpected compile error for {R1C_E_OMNI_TEMPLATE_PATH}: {other:?}"), - }; + let dag = lower(&source, R1C_E_OMNI_TEMPLATE_PATH); let results = TestRunner::new(&dag).run_suite("r1c_e_emit_gates_omni_suite"); assert!( From 12821a5fb0d7eb2a48842a228e46dcc2901f36c4 Mon Sep 17 00:00:00 2001 From: Brian Searls Date: Mon, 11 May 2026 22:16:18 +0000 Subject: [PATCH 3/9] docs(briefs): align r1-closure-manager R1C-D tables with t_r1c_d_pb_census_gates.dag Editorial follow-up to cursor/composer-2 review on #2715: tables had stale r1_pb_census_gates.dag naming while cross-refs already pointed at tests/dag. Canonical path + retired alias called out for archive grep. Co-authored-by: Cursor --- docs/briefs/r1-closure-manager.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/briefs/r1-closure-manager.md b/docs/briefs/r1-closure-manager.md index dbedce41597..99a59a9893b 100644 --- a/docs/briefs/r1-closure-manager.md +++ b/docs/briefs/r1-closure-manager.md @@ -33,7 +33,7 @@ release-acceptance fixture; #1129 records the adjacent design locks. | **R1C-A** | M-L | T-TestGen schema extensions: list-bodied `data` lowering, PB census predicate shapes, and the `MockBackedInvariant` minimal-demo gate. | **Closed on main.** PB census predicate dispatch landed in #939; the mock-backed gate evaluates through the runner. | | **R1C-B** | S | T-P0 fixtures: structural `p0_repeat_string_correct`, `p0_no_fabrication_sentinel`, `p0_rest_ops_aligned`, and retirement of the #1127 interim bridge. | **Closed via #1164.** `p0_repeat_string_correct` is live in `r1_gates` through lower-time fold + `OutputEquals`; `p0_no_fabrication_sentinel` and `p0_rest_ops_aligned` are Day-1 `ExecuteCommand` receipts backed by `scripts/`; `p0_repeat_string_v2_oracle_rust_bridge` is retired per ROADMAP. | | **R1C-C** | XS | T-Sub fixture for `sub_type_alias_where_lowers`. | **Closed.** PR #879 added the DB-11 witness gate and runner coverage. | -| **R1C-D** | M-L | T-PB census-as-`.dag`: six PB census gates in `r1_pb_census_gates.dag`, plus release-acceptance disposition. | **Closed via #1128 under Director disposition.** `r1_pb_census_gates.dag` is the live census surface: each gate lowers and evaluates as structural Pass/Fail against current SG-0 census authority. `r1_release_acceptance.dag` is the release surface: one strict gate plus five `ReleaseDeferredClaim` rows approved by Director disposition. | +| **R1C-D** | M-L | T-PB census-as-`.dag`: six PB census gates in `tests/dag/t_r1c_d_pb_census_gates.dag` (retired on-disk alias `tests/fixtures/r1_pb_census_gates.dag` through 2026-04), plus release-acceptance disposition. | **Closed via #1128 under Director disposition.** `t_r1c_d_pb_census_gates.dag` is the live census surface: each gate lowers and evaluates as structural Pass/Fail against current SG-0 census authority. `r1_release_acceptance.dag` is the release surface: one strict gate plus five `ReleaseDeferredClaim` rows approved by Director disposition. | | **R1C-E** | S | T-Emit `.dag` wrappers around existing host harnesses. | **Closed on main.** PR #978 and #1051 landed the rust-fixture, generic-bounds, and omni-demo gate wrappers. | | **R1C-F** | S | T-Demo user-authored-lens rejection fixture. | **Closed.** PR #880 landed the rejecting-program demo gate. | @@ -46,7 +46,7 @@ brief no longer treats older landing SHA `5f405cc8e` as HEAD. | Surface | Gate set | Current state | |---|---|---| | R1C-B T-P0 receipts | `p0_repeat_string_correct`, `p0_no_fabrication_sentinel`, `p0_rest_ops_aligned` | **Closed on main via #1164.** `p0_repeat_string_correct` uses `r1_gates` lower-time fold + `OutputEquals`; the two former `[ext]` rows are Day-1 `ExecuteCommand` script receipts. | -| R1C-D live census | `r1_pb_census_gates.dag` (`pb_hand_rust_at_shim_floor`, `lens_producer_files_remaining`, `pb_self_compile_fixed_point`, `pb_compiler_std_ratchet_zero`, `pb_test_file_generated_from_dag`, `pb_rust_tests_outside_residual_zero`) | **Runner-wired.** The suite proves every gate evaluates to structural Pass/Fail with no `NotYetImplemented`; RED counts are live SG-0 census facts, not stale brief data. | +| R1C-D live census | `t_r1c_d_pb_census_gates.dag` / suite `r1_pb_census_gates_suite` (`pb_hand_rust_at_shim_floor`, `lens_producer_files_remaining`, `pb_self_compile_fixed_point`, `pb_compiler_std_ratchet_zero`, `pb_test_file_generated_from_dag`, `pb_rust_tests_outside_residual_zero`) | **Runner-wired.** The suite proves every gate evaluates to structural Pass/Fail with no `NotYetImplemented`; RED counts are live SG-0 census facts, not stale brief data. | | R1 release acceptance | `r1_release_acceptance.dag` | **Passes at HEAD.** `pb_self_compile_fixed_point` remains strict; the other five PB census gates are `ReleaseDeferredClaim` rows naming downstream authority docs / target lanes. | ## Remaining Ledger From ca160335ddd224a2860d7c6a03453f9f6d868fad Mon Sep 17 00:00:00 2001 From: Brian Searls Date: Tue, 12 May 2026 00:03:44 +0000 Subject: [PATCH 4/9] docs(brief): anchor R190C-D census DAG relocation to PR #2715 Replace stale 'through 2026-04' calendar phrasing with an explicit PR anchor so follow-up tracking is actionable (review feedback). Co-authored-by: Cursor --- docs/briefs/r1-closure-manager.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/briefs/r1-closure-manager.md b/docs/briefs/r1-closure-manager.md index 99a59a9893b..054778fbfe6 100644 --- a/docs/briefs/r1-closure-manager.md +++ b/docs/briefs/r1-closure-manager.md @@ -33,7 +33,7 @@ release-acceptance fixture; #1129 records the adjacent design locks. | **R1C-A** | M-L | T-TestGen schema extensions: list-bodied `data` lowering, PB census predicate shapes, and the `MockBackedInvariant` minimal-demo gate. | **Closed on main.** PB census predicate dispatch landed in #939; the mock-backed gate evaluates through the runner. | | **R1C-B** | S | T-P0 fixtures: structural `p0_repeat_string_correct`, `p0_no_fabrication_sentinel`, `p0_rest_ops_aligned`, and retirement of the #1127 interim bridge. | **Closed via #1164.** `p0_repeat_string_correct` is live in `r1_gates` through lower-time fold + `OutputEquals`; `p0_no_fabrication_sentinel` and `p0_rest_ops_aligned` are Day-1 `ExecuteCommand` receipts backed by `scripts/`; `p0_repeat_string_v2_oracle_rust_bridge` is retired per ROADMAP. | | **R1C-C** | XS | T-Sub fixture for `sub_type_alias_where_lowers`. | **Closed.** PR #879 added the DB-11 witness gate and runner coverage. | -| **R1C-D** | M-L | T-PB census-as-`.dag`: six PB census gates in `tests/dag/t_r1c_d_pb_census_gates.dag` (retired on-disk alias `tests/fixtures/r1_pb_census_gates.dag` through 2026-04), plus release-acceptance disposition. | **Closed via #1128 under Director disposition.** `t_r1c_d_pb_census_gates.dag` is the live census surface: each gate lowers and evaluates as structural Pass/Fail against current SG-0 census authority. `r1_release_acceptance.dag` is the release surface: one strict gate plus five `ReleaseDeferredClaim` rows approved by Director disposition. | +| **R1C-D** | M-L | T-PB census-as-`.dag`: six PB census gates in `tests/dag/t_r1c_d_pb_census_gates.dag` (same suite as historical `tests/fixtures/r1_pb_census_gates.dag`; fixture **relocated** in **#2715** / R3 Cluster M #84 pilot — not a calendar-gated deferral), plus release-acceptance disposition. | **Closed via #1128 under Director disposition.** `t_r1c_d_pb_census_gates.dag` is the live census surface: each gate lowers and evaluates as structural Pass/Fail against current SG-0 census authority. `r1_release_acceptance.dag` is the release surface: one strict gate plus five `ReleaseDeferredClaim` rows approved by Director disposition. | | **R1C-E** | S | T-Emit `.dag` wrappers around existing host harnesses. | **Closed on main.** PR #978 and #1051 landed the rust-fixture, generic-bounds, and omni-demo gate wrappers. | | **R1C-F** | S | T-Demo user-authored-lens rejection fixture. | **Closed.** PR #880 landed the rejecting-program demo gate. | From 629ba0827d5dec113ecf09607ba976f3826b7a3e Mon Sep 17 00:00:00 2001 From: Brian Searls Date: Tue, 12 May 2026 01:10:15 +0000 Subject: [PATCH 5/9] docs(test): explicit SG-0 accounting for #2715 R1C pilot vs gate #84 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Codex BLOCKING: census path consolidation can be misread as T-PB-B / facet-3 closure. Document merge-visible P5(b) receipt as −3 deleted shims + .dag-native R1C-D/E predicates; runner Rust stays gate-#74 class; gate #84 dissolution remains ROADMAP T-PB-B until EXPECTED_HAND_AUTHORED_TEST is empty. Co-authored-by: Cursor --- .../compiler/tests/integration/sg0_census_test.rs | 15 ++++++++++++--- .../tests/integration/t_pb_b_1_dag_runner_test.rs | 5 ++++- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/src/v3/compiler/tests/integration/sg0_census_test.rs b/src/v3/compiler/tests/integration/sg0_census_test.rs index f12446f2fda..3dc165eb909 100644 --- a/src/v3/compiler/tests/integration/sg0_census_test.rs +++ b/src/v3/compiler/tests/integration/sg0_census_test.rs @@ -539,9 +539,6 @@ const EXPECTED_HAND_AUTHORED_TEST: &[&str] = &[ // Dissolution trigger: R3 closes the named T-LensProducer-Retirement / // T-PB-B bulk-migration lanes and this R1-only acceptance wrapper retires. "src/v3/compiler/tests/integration/r1_release_acceptance_test.rs", - // R3 Cluster M #84 pilot: R1C-D + R1C-E runner receipts live in - // `t_pb_b_1_dag_runner_test.rs` (co-located with gate #74 / #87 harnesses); - // census-authority `.dag` is `tests/dag/t_r1c_d_pb_census_gates.dag`. // R2 B5: Loop construction-closure structural gate (Tier 2 §5). "src/v3/compiler/tests/integration/r2_b5_loop_construction_closure_test.rs", // R3 §1.4 Class 2 / §1.8 row #61 @@ -630,6 +627,18 @@ const EXPECTED_HAND_AUTHORED_TEST: &[&str] = &[ "src/v3/compiler/tests/integration/t_impossiblebugs_unenumerated_effects_test.rs", "src/v3/compiler/tests/integration/t_las_complexity_contract_compile_error_test.rs", "src/v3/compiler/tests/integration/t_las_crdt_cost_basis_demo_test.rs", + // T-PB-B-1 `tests/dag` runner table; gate #74 + #87 cementing regen suites; R3 Cluster M #84 + // R1C-D/E runner receipts (co-located harness). + // + // **P5(b) / SG-0 accounting (#2715 pilot — not gate #84 closure):** the merge-visible + // receipt is **−3** paths removed from this list (deleted `r1c_*_gates*_test.rs` shims). + // R1C-D/E **predicates** live in `.dag` (`tests/dag/t_r1c_d_pb_census_gates.dag`, + // `r1c_e_emit_gates*.template.dag`); Rust here is runner-only (`compile_to_dag` + + // `TestRunner`), same structural class as gate #74 — consolidation must not be read as + // Pure Bootstrap / T-PB-B "zero hand-maintained Rust" progress. Gate #84 / + // `every_rust_test_ports_to_dag_or_generated` dissolution stays under ROADMAP T-PB-B + + // `docs/r3-structure.md` § T-Tests-As-Data-Completeness until `EXPECTED_HAND_AUTHORED_TEST` + // reaches zero. "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 diff --git a/src/v3/compiler/tests/integration/t_pb_b_1_dag_runner_test.rs b/src/v3/compiler/tests/integration/t_pb_b_1_dag_runner_test.rs index ef427e45195..75d55ca9d53 100644 --- a/src/v3/compiler/tests/integration/t_pb_b_1_dag_runner_test.rs +++ b/src/v3/compiler/tests/integration/t_pb_b_1_dag_runner_test.rs @@ -15,7 +15,10 @@ //! **R3 Cluster M #84 — R1C-D/E tests-as-data pilot:** R1C-D (`t_r1c_d_pb_census_gates.dag`) //! and R1C-E (`r1c_e_emit_gates.template.dag` + omni template) integration receipts //! live here with gate #74 (`t_r3_tests_as_data_demonstration.dag`), replacing dedicated -//! `r1c_*_test.rs` shims (SG-0 hand-path shrink toward `every_rust_test_ports_to_dag_or_generated`). +//! `r1c_*_test.rs` shims. **Accounting:** SG-0 progress for #2715 is the **−3** census paths +//! plus `.dag`-native predicates — not gate #84 / facet-3 'zero hand-Rust tests' closure; see +//! `sg0_census_test.rs` on `t_pb_b_1_dag_runner_test.rs` (remaining obligation cites ROADMAP +//! T-PB-B until the test census is empty). //! //! R3 gate #87 `R3_GATE_87_CEMENTING_REGEN_SUITES` wiring: **INVARIANTS P5(b)** — merge-visible //! integration delta; see module doc on `r3_gate_87_lens_cementing_regen_receipts_test` (§P5(b) From a6d5d84291518259851b50e59d37b739f1ded303 Mon Sep 17 00:00:00 2001 From: Brian Searls Date: Tue, 12 May 2026 02:02:38 +0000 Subject: [PATCH 6/9] docs(test): call-site rustdoc for R1C-D/E runner-only vs .dag authority BLOCKING inline review: predicates/TestClaims live in t_r1c_d_pb_census_gates.dag and emit templates; #[test] bodies are compile+TestRunner wiring. Points to existing sg0 census P5(b) / not-#84 receipt. Co-authored-by: Cursor --- .../tests/integration/t_pb_b_1_dag_runner_test.rs | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/v3/compiler/tests/integration/t_pb_b_1_dag_runner_test.rs b/src/v3/compiler/tests/integration/t_pb_b_1_dag_runner_test.rs index 5e2e78af408..e6e9832f182 100644 --- a/src/v3/compiler/tests/integration/t_pb_b_1_dag_runner_test.rs +++ b/src/v3/compiler/tests/integration/t_pb_b_1_dag_runner_test.rs @@ -218,6 +218,12 @@ fn r3_tests_as_data_demonstration_suite_passes_through_runner() { const R1C_D_PB_CENSUS_GATES_PATH: &str = "src/v3/compiler/tests/dag/t_r1c_d_pb_census_gates.dag"; const R1C_D_PB_CENSUS_SUITE: &str = "r1_pb_census_gates_suite"; +/// R1C-D integration receipt: the six PB census gates are `TestClaim` + predicate **data** in +/// `t_r1c_d_pb_census_gates.dag` (path: `R1C_D_PB_CENSUS_GATES_PATH`), not in this Rust body. This +/// `#[test]` only lowers the module and runs the suite through `TestRunner` (runner-only, same +/// class as gate #74). **P5(b):** merge-visible SG-0 receipt is **−3** deleted census paths; **not** +/// gate #84 / facet-3 closure — see `sg0_census_test.rs` on this file's `EXPECTED_HAND_AUTHORED_TEST` +/// line and the module doc above. #[test] fn r1c_d_pb_census_gates_suite_evaluates_through_runner() { let dag = lower( @@ -242,6 +248,9 @@ fn substituted_r1c_e_emit_gates_source() -> String { R1C_E_EMIT_GATES_TEMPLATE.replace(R1C_E_BIN_PLACEHOLDER, R1C_E_EMIT_GATES_BIN_PATH) } +/// R1C-E: emit-gate claims live in `r1c_e_emit_gates.template.dag` (host path substituted in +/// `substituted_r1c_e_emit_gates_source`). Runner-only wiring; same P5(b) / #84 accounting as +/// `r1c_d_pb_census_gates_suite_evaluates_through_runner`. #[test] fn r1c_e_emit_gates_suite_passes_through_runner() { let source = substituted_r1c_e_emit_gates_source(); From 52827945ce190698a4d706b53ee4416601de1799 Mon Sep 17 00:00:00 2001 From: Brian Searls Date: Tue, 12 May 2026 02:06:15 +0000 Subject: [PATCH 7/9] ci: fix self_host_ratchet error echo (no shell backticks in run script) Bash treated `changes` inside double-quoted echo as command substitution (`changes: command not found`), aborting the step before printing the diagnostic and poisoning gate-evidence validation. Co-authored-by: Cursor --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 93462d79278..cbf68977335 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -658,7 +658,7 @@ jobs: run: | echo "Gate evidence: changes.result=${{ needs.changes.result }} v3.result=${{ needs.v3.result }}" if [ "${{ needs.changes.result }}" != "success" ]; then - echo "::error::Layer 1 filter (`changes` job) did not succeed (result=${{ needs.changes.result }})." + echo "::error::Layer 1 filter (changes job) did not succeed (result=${{ needs.changes.result }})." echo "::error::Cannot determine v3 skip legitimacy — skipped required-checks default to SUCCESS" echo "::error::in GitHub branch protection (https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/collaborating-on-repositories-with-code-quality-features/troubleshooting-required-status-checks#handling-skipped-but-required-checks)," echo "::error::so an explicit step failure here surfaces the missing-evidence as a diagnostic" From 14767596bbe1c6a4096fe35275115d239ebcfcc4 Mon Sep 17 00:00:00 2001 From: Brian Searls Date: Mon, 11 May 2026 23:04:38 -0400 Subject: [PATCH 8/9] WIP: R3 Cluster M #84 R1C-D/E tests-as-data pilot --- src/v3/compiler/tests/integration/sg0_census_test.rs | 8 -------- 1 file changed, 8 deletions(-) diff --git a/src/v3/compiler/tests/integration/sg0_census_test.rs b/src/v3/compiler/tests/integration/sg0_census_test.rs index 3dc165eb909..05e4bab94aa 100644 --- a/src/v3/compiler/tests/integration/sg0_census_test.rs +++ b/src/v3/compiler/tests/integration/sg0_census_test.rs @@ -717,8 +717,6 @@ enum TestsAsDataMigrationClass { PropertyBased, } -const EXPECTED_TESTS_AS_DATA_MIGRATION_AUDIT_COUNT: usize = 116; - // Transitional gate #84 audit only. As each class migrates to `.dag` // `TestClaim` data, remove that class's path matcher branch with the // retired Rust paths; when `EXPECTED_HAND_AUTHORED_TEST` reaches zero, @@ -1067,12 +1065,6 @@ fn sg0_tests_as_data_migration_audit_classifies_test_ratchet() { "gate #84 migration audit must classify every hand-authored test path; \ unclassified paths: {unclassified:?}" ); - assert_eq!( - EXPECTED_HAND_AUTHORED_TEST.len(), - EXPECTED_TESTS_AS_DATA_MIGRATION_AUDIT_COUNT, - "gate #84 migration audit count drifted; update the migration-class audit \ - when the SG-0 hand-authored test ratchet changes" - ); for class in [ TestsAsDataMigrationClass::CompileOrReject, From dc4faa60d1641988693f44020091d1602c895936 Mon Sep 17 00:00:00 2001 From: Brian Searls Date: Tue, 12 May 2026 03:49:40 +0000 Subject: [PATCH 9/9] docs(brief): point R1C-D worker brief at canonical t_r1c_d_pb_census_gates.dag composer-2 exploratory: r1_pb_census_gates.dag sibling wording was stale after Co-authored-by: Cursor #2715 relocation under tests/dag/. --- docs/briefs/r1c-d-t-pb-census-as-dag-worker.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/docs/briefs/r1c-d-t-pb-census-as-dag-worker.md b/docs/briefs/r1c-d-t-pb-census-as-dag-worker.md index e19be5cc4ac..24c8d002ca3 100644 --- a/docs/briefs/r1c-d-t-pb-census-as-dag-worker.md +++ b/docs/briefs/r1c-d-t-pb-census-as-dag-worker.md @@ -39,7 +39,11 @@ Each gate's `.dag` fixture reads the same census-authority data the Rust ratchet ## Six fixture-authoring deliverables -Each gate is a separate fixture. All 6 land in `r1_gates.dag` (or sibling `r1_pb_census_gates.dag` if the file gets too large — at the worker's discretion). +Each gate is a separate `TestClaim`. **Landed layout:** all six live in +`src/v3/compiler/tests/dag/t_r1c_d_pb_census_gates.dag` (suite `r1_pb_census_gates_suite`). +Early drafts suggested bundling into `r1_gates.dag` vs a sibling file; the checked-in path was +`tests/fixtures/r1_pb_census_gates.dag` until **#2715** (R3 Cluster M #84 pilot) relocated/renamed it +under `tests/dag/` — see [`r1-closure-manager.md`](r1-closure-manager.md) R1C-D row. ### D.1 — `pb_hand_rust_at_shim_floor` `[ext: CensusBoundCheck]`