The public-baseline freshness gate costs ~2 hours on a specific, quiet, correctly-pinned host and is triggered by 17 paths, several of which change for reasons unrelated to what the benchmark measures. That ratio is not sustainable, and the consequences are already on the record.
What it actually fingerprints today
SOURCE_PATHS = ("Cargo.toml",
"benchmarks/suite/*.ts",
"benchmarks/json_polyglot/*.ts",
"benchmarks/app-patterns/kernels/*.ts")
HARNESS_PATHS = (13 entries: every harness script, plus the honest_bench
workloads/ scripts/ harness/ directories and expected.json)
Why this is unsustainable
Cargo.toml is the worst offender. It changes on every new perry-ext-* crate, every dependency bump, every workspace restructure — none of which alter the measured kernels. #6758/#6761's restructuring tripped this gate with the .ts kernels untouched, and the gate then sat red on every PR and nightly from ~2026-07-25.
Harness scripts are the second. #7265 fixed error handling in benchmarks/json_polyglot/run.sh — a script that printed a success line and exited 0 while writing nothing. That fix cannot change a single measured number, yet it invalidates the artifact because run.sh is in HARNESS_PATHS.
The observed cost: the artifact went 40+ commits stale. Because lint is a required status check and the freshness step runs at position 9, every subsequent step (file-size, GC store-site inventory, addr-class audit, and #7253's new gate-wiring check) never executed in CI at all — they had to be reproduced locally to even be seen. And every merge required --admin bypass, which makes branch protection theatre. A permanently-red required gate does not protect anything; it trains everyone to route around it.
What the gate is actually for
Published performance claims must describe the code they claim to describe. So the fingerprint should cover what could change a measured number:
- the benchmark kernels themselves ✅ (already covered, correctly)
- the build profile —
opt-level, lto, codegen-units, panic (a profile change absolutely invalidates comparability)
- the pinned toolchain versions used in the comparison (node/bun/zig)
- harness content that sets run parameters — run counts, warmup, workload sizes
It should not cover: workspace membership, dependency additions unrelated to benchmarked code, harness error handling, logging, or output formatting.
Proposal
- Replace whole-file
Cargo.toml with a targeted extract. Fingerprint the [profile.*] tables and the workspace toolchain/version pins, not the file. This is the single biggest win and removes the most common false trigger.
- Split
HARNESS_PATHS into measurement-affecting vs plumbing. Run counts, warmup, workload sizing and expected.json stay fingerprinted; error handling, logging and output formatting do not. If a clean split is impractical per-file, extract the run parameters into one small fingerprinted config and let the scripts read it.
- Keep the gate required, and keep it hard-failing. The problem is trigger breadth, not strictness. A narrower fingerprint that fires rarely and blocks absolutely is strictly better than a broad one everyone bypasses.
Do not do
- Do not make it warn-only, and do not add a manual "measurements unaffected" attestation. Both re-create the failure mode this issue exists to fix.
- Note the deliberate circularity:
ci_public_baseline_check.py reuses public_baseline.py's functions rather than reimplementing them, precisely so the checker's own file is not in HARNESS_PATHS. Any fix must preserve that — otherwise changing the checker requires a 2-hour regeneration to satisfy the checker.
Context: the current regeneration is being run now, blocked until today by #7264 (a JSON.stringify data-loss bug that made the json_polyglot leg impossible to publish).
The public-baseline freshness gate costs ~2 hours on a specific, quiet, correctly-pinned host and is triggered by 17 paths, several of which change for reasons unrelated to what the benchmark measures. That ratio is not sustainable, and the consequences are already on the record.
What it actually fingerprints today
Why this is unsustainable
Cargo.tomlis the worst offender. It changes on every newperry-ext-*crate, every dependency bump, every workspace restructure — none of which alter the measured kernels. #6758/#6761's restructuring tripped this gate with the.tskernels untouched, and the gate then sat red on every PR and nightly from ~2026-07-25.Harness scripts are the second. #7265 fixed error handling in
benchmarks/json_polyglot/run.sh— a script that printed a success line and exited 0 while writing nothing. That fix cannot change a single measured number, yet it invalidates the artifact becauserun.shis inHARNESS_PATHS.The observed cost: the artifact went 40+ commits stale. Because
lintis a required status check and the freshness step runs at position 9, every subsequent step (file-size, GC store-site inventory, addr-class audit, and #7253's new gate-wiring check) never executed in CI at all — they had to be reproduced locally to even be seen. And every merge required--adminbypass, which makes branch protection theatre. A permanently-red required gate does not protect anything; it trains everyone to route around it.What the gate is actually for
Published performance claims must describe the code they claim to describe. So the fingerprint should cover what could change a measured number:
opt-level,lto,codegen-units,panic(a profile change absolutely invalidates comparability)It should not cover: workspace membership, dependency additions unrelated to benchmarked code, harness error handling, logging, or output formatting.
Proposal
Cargo.tomlwith a targeted extract. Fingerprint the[profile.*]tables and the workspace toolchain/version pins, not the file. This is the single biggest win and removes the most common false trigger.HARNESS_PATHSinto measurement-affecting vs plumbing. Run counts, warmup, workload sizing andexpected.jsonstay fingerprinted; error handling, logging and output formatting do not. If a clean split is impractical per-file, extract the run parameters into one small fingerprinted config and let the scripts read it.Do not do
ci_public_baseline_check.pyreusespublic_baseline.py's functions rather than reimplementing them, precisely so the checker's own file is not inHARNESS_PATHS. Any fix must preserve that — otherwise changing the checker requires a 2-hour regeneration to satisfy the checker.Context: the current regeneration is being run now, blocked until today by #7264 (a
JSON.stringifydata-loss bug that made thejson_polyglotleg impossible to publish).