129 lines
5.9 KiB
Rust
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})");
|
|
}
|