Files
Aura/crates/aura-bench
claude 16ca4e103e fix(bench): make the cli_fixed_cost fingerprint invariant across build commits
Caught by the harness itself on its first post-commit run: the aura run
record line embeds manifest.commit — the binary's compile-time build sha
(crates/aura-cli/build.rs, the invariant-8 audit trail) — so hashing the raw
line flipped the fingerprint on every rebuild at a new commit and reported a
phantom correctness change (exit 1) at each cycle close. The rebase onto the
#191 main exposed it; nothing in #191 touched the record.

RED-first: run_line_fingerprint_is_invariant_across_build_commits pins the
symptom (two lines differing only in manifest.commit must hash identically);
the fix extracts run_line_fingerprint, which parses the line, blanks that
one volatile field, re-serializes (serde_json maps are sorted, so the bytes
are deterministic), and hashes. A missing manifest.commit is a hard error,
so a future record-schema move fails loudly instead of silently passing.
The cli_fixed_cost baseline is re-pinned under the new definition — ratify:
the fingerprint DEFINITION changed (provenance excluded, results still
covered, pinned by run_line_fingerprint_still_detects_result_changes); no
measured behaviour of aura moved.

refs #251
2026-07-17 18:16:56 +02:00
..

aura-bench

Wall-clock benchmarks with committed baselines (issue #251, phase 1). Catches hot-path regressions the E2E suite structurally cannot see: every surface pins its inputs and asserts a determinism fingerprint, so a fast-but-wrong binary fails the bench instead of pinning a bogus baseline.

Running

cargo run --release -p aura-bench -- run              # measure + compare, report-only
cargo run --release -p aura-bench -- run --surface engine_throughput
cargo run --release -p aura-bench -- pin              # rewrite committed baselines

Debug builds refuse to measure (exit 2) — wall-clock numbers from a debug build measure the profile, not the code.

Surfaces

surface workload metrics
engine_throughput 10M synthetic bars through an SMA-cross harness (library) wall_s, bars_per_s
ingest_throughput 24 synthetic archive months x 20 fresh drains via the ingest window API (library) wall_s, bars_per_s
campaign_sweep 8-cell sweep-only campaign, release aura binary on a scratch project wall_s, cpu_percent, peak_rss_mb
campaign_heavy same cells; sweep → gate → walk-forward → 1000-resample bootstrap wall_s, cpu_percent, peak_rss_mb
cli_fixed_cost spawn floor (aura --help) + minimal data-only project run help_ms, run_ms

Discipline

  • Quiet box: the driver warns at 1-min loadavg > 2.0. Close heavy jobs first.
  • 1 discarded warmup + 3 measured reps (median). Reps must agree on the fingerprint — cross-rep drift is reported as nondeterminism, not averaged.
  • Baselines are per-host context (host block inside each JSON): comparison on a different host prints an informational banner and stays report-only.
  • Timing drift NEVER fails the run (report-only phase, #251 cadence decision); a NOTICE line flags drift >= 10%. A fingerprint mismatch exits 1.
  • Re-pin (pin) deliberately, after an accepted behaviour or performance change; the baseline diff is reviewed like any other commit.

Deferred (follow-up on the tracker)

  • Instruction-count backend (iai-callgrind) once valgrind is installed on the measuring host — slots in as a sibling backend without reshaping baselines.
  • Native-crate project-load sub-cost (dylib SHA-256) — needs a build step in the scratch project.
  • Thresholded failure, once recorded variance data justifies thresholds.