From 506012b8b8b41c62fab627fe3320770661ff253e Mon Sep 17 00:00:00 2001 From: Noah Gift Date: Wed, 21 Oct 2026 22:07:38 +0200 Subject: [PATCH 1/2] test(contracts-cli): ont4/ont4b/ont5 + pv-sat full-run gate tests lint a fixture and copy files only (Refs #5446) Batch of the one stop-the-line, gate-free READY branch (#5527, rebased onto main; the witness json and shapes.ttl regeneration are not carried: main's own pins stay). Co-Authored-By: Claude Sonnet 5.5 --- crates/aprender-contracts-cli/src/bin/pv-sat/tests.rs | 5 +++++ crates/aprender-contracts-cli/tests/ont4_relations_gate.rs | 3 ++- crates/aprender-contracts-cli/tests/ont4b_shapes_gate.rs | 3 ++- crates/aprender-contracts-cli/tests/ont5_consistency_gate.rs | 5 +++++ 4 files changed, 14 insertions(+), 2 deletions(-) diff --git a/crates/aprender-contracts-cli/src/bin/pv-sat/tests.rs b/crates/aprender-contracts-cli/src/bin/pv-sat/tests.rs index c632147f69..533447d153 100644 --- a/crates/aprender-contracts-cli/src/bin/pv-sat/tests.rs +++ b/crates/aprender-contracts-cli/src/bin/pv-sat/tests.rs @@ -90,6 +90,11 @@ fn corpus() -> tempfile::TempDir { let dir = tempfile::tempdir().expect("tempdir"); for entry in std::fs::read_dir(src).expect("fixture") { let entry = entry.expect("entry"); + // The ont4/ont4b gates lint this fixture in place (#5446), and pv leaves a `.pv/` directory in it; copy + // the corpus files only, never that directory. + if !entry.file_type().expect("file type").is_file() { + continue; + } std::fs::copy(entry.path(), dir.path().join(entry.file_name())).expect("copy"); } dir diff --git a/crates/aprender-contracts-cli/tests/ont4_relations_gate.rs b/crates/aprender-contracts-cli/tests/ont4_relations_gate.rs index 1fc8f2b871..6e5855a057 100644 --- a/crates/aprender-contracts-cli/tests/ont4_relations_gate.rs +++ b/crates/aprender-contracts-cli/tests/ont4_relations_gate.rs @@ -178,7 +178,8 @@ fn the_legacy_ratchet_rejects_a_rise_and_passes_a_hold() { /// R-8: the gate is computed in every `pv lint` run, not only under `--gate`. #[test] fn the_full_run_computes_the_relations_gate() { - let dir = s(&repo_contracts()); + // A small fixture corpus: the gate list does not depend on the corpus, and the repo tree costs ~27 s in a debug pv (#5446). + let dir = s(&fixture("relations-ok")); let r = pv(&["lint", &dir, "--format", "json"]); let v = json_of(&r); let names: Vec = v["gates"] diff --git a/crates/aprender-contracts-cli/tests/ont4b_shapes_gate.rs b/crates/aprender-contracts-cli/tests/ont4b_shapes_gate.rs index 59014352b8..da73452c40 100644 --- a/crates/aprender-contracts-cli/tests/ont4b_shapes_gate.rs +++ b/crates/aprender-contracts-cli/tests/ont4b_shapes_gate.rs @@ -262,7 +262,8 @@ fn the_tracked_repo_graph_is_fresh() { /// R-8: the gate is computed in every `pv lint` run. #[test] fn the_full_run_computes_the_shapes_gate() { - let r = pv(&["lint", &s(&repo_contracts()), "--format", "json"]); + // A small fixture corpus: the gate list does not depend on the corpus, and the repo tree costs ~27 s in a debug pv (#5446). + let r = pv(&["lint", &s(&fixture("relations-ok")), "--format", "json"]); let v = json_of(&r); let names: Vec = v["gates"] .as_array() diff --git a/crates/aprender-contracts-cli/tests/ont5_consistency_gate.rs b/crates/aprender-contracts-cli/tests/ont5_consistency_gate.rs index 7b8d7b4cd0..db0506e891 100644 --- a/crates/aprender-contracts-cli/tests/ont5_consistency_gate.rs +++ b/crates/aprender-contracts-cli/tests/ont5_consistency_gate.rs @@ -68,6 +68,11 @@ fn corpus() -> tempfile::TempDir { for entry in std::fs::read_dir(repo().join("tests/fixtures/ont/relations-ok")).expect("fixture") { let entry = entry.expect("entry"); + // The ont4/ont4b gates lint this fixture in place (#5446), and pv leaves a `.pv/` directory in it; a parallel + // test must copy the corpus files only, never that directory. + if !entry.file_type().expect("file type").is_file() { + continue; + } std::fs::copy(entry.path(), dir.path().join(entry.file_name())).expect("copy"); } dir From 7547c38fd28a3268e904bc1b3d87213c7da13704 Mon Sep 17 00:00:00 2001 From: t Date: Thu, 22 Oct 2026 07:15:29 +0200 Subject: [PATCH 2/2] fix(contracts): consistency_gate test corpus copies fixture files only, skipping pv's .pv/ dir (Refs #5446) The ont4/ont4b/ont5 gate tests lint tests/fixtures/ont/relations-ok in place and pv leaves .pv/cache there; the lib test read_to_string'd every entry and hit IsADirectory (shard 2/12). Verified: all 2363 aprender-contracts lib tests pass with a planted .pv dir. Co-Authored-By: Claude Sonnet 5.5 --- crates/aprender-contracts/src/lint/consistency_gate_tests.rs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/crates/aprender-contracts/src/lint/consistency_gate_tests.rs b/crates/aprender-contracts/src/lint/consistency_gate_tests.rs index c8131b4935..6154d5b593 100644 --- a/crates/aprender-contracts/src/lint/consistency_gate_tests.rs +++ b/crates/aprender-contracts/src/lint/consistency_gate_tests.rs @@ -17,6 +17,10 @@ fn corpus(consistent: bool) -> tempfile::TempDir { let dir = tempfile::tempdir().expect("tempdir"); for entry in std::fs::read_dir(fixture()).expect("fixture dir") { let entry = entry.expect("entry"); + // The ont4/ont4b/ont5 gate tests lint this fixture in place (#5446) and pv leaves a `.pv/` directory in it. + if !entry.file_type().expect("file type").is_file() { + continue; + } let mut text = std::fs::read_to_string(entry.path()).expect("fixture file"); if consistent && entry.file_name() == "a.yaml" { assert!(