epiphany/crates/epiphany-testkit/examples/conformance_suite.rs

129 lines
5.9 KiB
Rust

//! Drives the whole conformance suite at scale from the command line, so the
//! heavy gates can run outside the unit-test timeout — the analogue of
//! `epiphany-determinism`'s `fuzz_roundtrip` and `epiphany-bundle`'s
//! `fuzz_crash`. Every gate is deterministic, so any failure reproduces from
//! its seed.
//!
//! Usage:
//! cargo run --release --example conformance_suite [SCALE]
//!
//! `SCALE` (default 1) multiplies the iteration counts. `SCALE=10` is a soak
//! run; `SCALE=0` runs a fast smoke pass. Exits non-zero (via panic) on the
//! first violation.
use epiphany_testkit::{
bundle_harness, convergence, corpus, equivocation, fixtures, generators, layout_stub, negative,
prepass_harness, roundtrip, Rng,
};
fn main() {
let scale: u64 = std::env::args()
.nth(1)
.map(|s| s.parse().expect("SCALE must be an integer"))
.unwrap_or(1);
let n = |base: u64| (base * scale).max(if base == 0 { 0 } else { 1 });
// 0. Agent A's headline hand-off gate: 1,000,000 round-trip iterations.
// (Scaled; at SCALE=0 a smaller smoke count still runs.)
let det_iters = if scale == 0 {
50_000
} else {
1_000_000 * scale
};
eprintln!("[0/8] determinism round-trip gate: {det_iters} iters");
roundtrip::run_determinism_roundtrip_gate(det_iters, 0x0A11_CE5E_EDED_2024);
// 1. Canonical round-trip (criterion 4): type-level corpus.
let iters = (50_000 * scale).max(2_000);
eprintln!("[1/8] canonical round-trip corpus: {iters} iters");
roundtrip::run_roundtrip_corpus(iters, 0x00C0_FFEE_1234_5678);
// 1b. Bundle manifest + reducer-bookkeeping serialization + full-Score byte
// round-trip (item 5's whole-score codec, via reduce_onto).
eprintln!("[1b ] manifest + bookkeeping + full-Score serialization stability");
for seed in 0..n(64) {
roundtrip::assert_manifest_roundtrip(&roundtrip::committed_manifest(seed));
let mut rng = Rng::new(seed.wrapping_mul(0x0100_0193).wrapping_add(17));
roundtrip::assert_manifest_roundtrip(&generators::rich_manifest(&mut rng));
let session = generators::operation_envelopes(&mut rng, 40, 3, 6, 6);
roundtrip::assert_reduction_serialization_stable(&session, seed);
let (score, frontier) = convergence::materialized_score(seed.wrapping_add(101));
roundtrip::assert_score_serialization_stable(&score, &frontier, seed);
let envs = generators::operation_envelopes(&mut rng, 24, 3, 8, 8);
roundtrip::assert_operation_block_summary_survives_storage(&envs, seed.wrapping_add(202));
}
roundtrip::assert_content_mutation_changes_serialization();
// 2. Crash safety (criterion 2): the testkit driver + Agent D's gate.
let crash_iters = (10_000 * scale).max(1_000);
eprintln!("[2/8] crash recovery: {crash_iters} iters (testkit) + bundle gate");
bundle_harness::run_crash_recovery(crash_iters, 0xF00D_BEEF_1234_5678);
bundle_harness::bundle_crash_recovery_fuzz(crash_iters, 0x0123_4567_89AB_CDEF);
// 3. Equivocation (criterion 3): testkit driver + Agent C's gate.
eprintln!("[3/8] equivocation order-independence");
for seed in 0..n(500) {
equivocation::run_equivocation(16, seed.wrapping_mul(0x9E37_79B9).wrapping_add(1));
}
equivocation::ops_equivocation_fuzz((10_000 * scale).max(1_000), 0x1234_5678);
// 4. Manifest selection.
eprintln!("[4/8] manifest selection");
for seed in 0..n(32) {
bundle_harness::run_manifest_selection(seed);
}
// 5. Convergence (criterion 1): real-Score convergence through reduce_onto,
// plus the reducer-bookkeeping projection convergence.
eprintln!("[5/8] convergence across delivery orders (real Score + bookkeeping)");
for seed in 0..n(64) {
convergence::run_graph_convergence(6, seed.wrapping_mul(0x9E37_79B9).wrapping_add(11));
}
for seed in 0..n(500) {
convergence::run_convergence(24, 8, seed.wrapping_mul(0x9E37_79B9));
}
for seed in 0..n(32) {
convergence::run_two_staff_convergence(8, seed.wrapping_mul(0x9E37_79B9).wrapping_add(7));
}
// 5b. Audit regression guards (every defect the Agent C audit surfaced).
eprintln!("[5b ] audit defect regression guards");
negative::run_all();
// 6. Reduction determinism (criterion 5): a large set reduced many ways, the
// testkit's authoritative causal-order gate, + Agent C's own gate.
let big = (1_000 * scale).max(1_000) as usize;
eprintln!("[6/8] reduction determinism: {big}-envelope set, 10 orders");
{
let mut rng = Rng::new(0x5EED_0006_0F0F_0F0F);
let envelopes = generators::operation_envelopes(&mut rng, big, 3, 40, 40);
convergence::assert_causal_order_respected(&envelopes);
convergence::assert_reduction_determinism(&envelopes, 10, &mut rng);
}
// Authoritative: causal-order correctness over many conformant sets.
convergence::run_authoritative_reduction_gate(
(10_000 * scale).max(1_000) as usize,
3,
0x0CA0_05A1,
);
// Supplementary: Agent C's own hand-off gate (permutation invariance).
convergence::ops_reduction_determinism_fuzz((10_000 * scale).max(1_000), 0x00C0_FFEE);
// 7. Layout round-trip (criterion 6).
eprintln!("[7/8] layout round-trip");
for seed in 0..n(128) {
layout_stub::round_trip(&fixtures::ten_measure_single_staff(seed));
layout_stub::round_trip(&generators::graph::valid_score_rich(seed));
}
// 7b. Track A — Agent H pre-pass merge gate (spelling + decomposition):
// the representative-corpus eligibility taxonomy (F3) and the H harness
// (F4) — determinism, spelling correctness, decomposition reconstruction,
// RespellPitch precedence, and the non-vacuity tripwire — at scale.
eprintln!("[7b ] Agent H pre-pass gate: taxonomy coverage + merge gate");
corpus::run_all();
prepass_harness::run_all(scale.max(1));
eprintln!("[8/8] ok: full conformance suite passed (scale {scale})");
}