mirror of
https://github.com/bdbrown4/peltier.io.git
synced 2026-11-07 10:58:28 +00:00
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
52 lines
1.5 KiB
Rust
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);
|
|
}
|
|
}
|