Files
peltier.io/crates/bench-runner/src/lib.rs
T
Claude 52089c0451 bench: GitHub Actions CI — trust-layer checks, no-net gates, runner calibration
Closes the CI-reachable slice of the Phase 1 infra gaps:
- trust-layer job: cargo test + clippy -D warnings + fmt
- target-gates-no-net: fetches pinned targets (new targets/fetch.sh),
  regenerates + verifies corpora, runs 'just gates tokei'
  mechanically, and executes the bench workload inside a
  --network=none container (SPEC 3.1/10 no-net requirement)
- runner-calibration (informational): A/A + injection harness measures
  the shared runner's noise floor per run, evidence uploaded as an
  artifact — environments are judged empirically, not assumed
- perf-probe (informational): reports which perf event sources work

docs/infra.md maps each remaining hardware requirement (pinned cores,
governor/SMT control, separate-uid trust layer) to the bench-metal
self-hosted runner setup a human can complete in ~15 min.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EcKPWQ3MQD4NdEHwar96u2
2026-07-07 00:13:21 +00:00

52 lines
1.5 KiB
Rust

//! bench-runner core (SPEC §3.1, §7).
//!
//! The product is this crate: interleaved A/B measurement, bootstrap CIs
//! over the ratio of medians, threshold-gated accept decisions, and A/A
//! self-calibration. Pure statistics live here and are unit-tested;
//! process execution and `perf stat` integration live in `exec`.
pub mod config;
pub mod exec;
pub mod fingerprint;
pub mod schedule;
pub mod stats;
use ledger::Verdict;
/// Decide a verdict from a speedup CI and the accept threshold.
///
/// Speedup is baseline/candidate (>1 means the candidate is faster).
/// Accepted only if the CI *lower bound* clears `1 + threshold` — the
/// point estimate is never enough (SPEC §3.1).
pub fn decide(speedup_ci: stats::RatioCi, threshold: f64) -> Verdict {
if speedup_ci.lo >= 1.0 + threshold {
Verdict::Accepted
} else {
Verdict::RejectedBench
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::stats::RatioCi;
#[test]
fn accept_requires_ci_lower_bound_not_point_estimate() {
// 10% median speedup but the CI dips below threshold: rejected.
let noisy = RatioCi {
median: 1.10,
lo: 1.005,
hi: 1.21,
};
assert_eq!(decide(noisy, 0.02), Verdict::RejectedBench);
// 4% speedup with a tight CI: accepted.
let tight = RatioCi {
median: 1.04,
lo: 1.025,
hi: 1.055,
};
assert_eq!(decide(tight, 0.02), Verdict::Accepted);
}
}