bench: checked-in baseline.txt is 24% stale, so the local Ir gate fails on clean main and PERFORMANCE.md publishes October 1 counts
Maintainers usually reply within 1 day
Nobody has claimed this yet.
Assessment
- Difficulty
- 3/5
- Estimated time
- 1-2 days
- Newbie friendliness
- 35/100
- Issue type
- Bug
- Clarity
- Mostly clear
- Activity status
- Active
- Domain
- performance, tooling
Research direction
Start by running make && bash bench/check_regression.sh to reproduce the stale-baseline failures. The default-mode loop over baseline.txt rows is at bench/check_regression.sh:162-163, and it skips missing .eigs files silently. Done means baseline.txt has one row per bench/*.eigs, the script reports missing rows and orphan rows with self-tests, and the PERFORMANCE.md observer counts are re-measured on current main.
Written by the indexing model from the issue text.
Description
Found by audit area 10 (performance claims as measurement devices), read-only.
What
bench/baseline.txt was last written by 2bd607ed (2026-10-01). On main b367cd7, the local default mode of bench/check_regression.sh, which docs/PERFORMANCE.md "Reproducing" tells readers to run, fails on an unmodified tree:
$ make && bash bench/check_regression.sh
ok: dict_ops Ir 110846715 (0.929% vs baseline)
STALE BASELINE: observed_loop Ir 59530737 -> 45015332 (-24.383%, gate would be measuring less)
STALE BASELINE: scalar_loop Ir 44561062 -> 33450042 (-24.934%, gate would be measuring less)
ok: string_build Ir 76105936 (1.601% vs baseline)
STALE BASELINE: unobserved_loop Ir 59536974 -> 45025538 (-24.374%, gate would be measuring less)
REGRESSION: unobserved_armed_loop Ir 514322736 -> 569571330 (+10.742% > 5%)
Control (rules out the host): the same script at 2bd607ed, built on the same machine (gcc 13.3, glibc 2.39), reads every row within 1% of the file. So the -24% and +10.7% are code changes since October 1, not a host offset (the cross-host ifunc term in the script's comment is 0.72%).
Three consequences:
- The two-sided local gate is red on main, so anyone reproducing locally sees a failure that is not theirs. Nothing in CI runs this mode (CI runs
--vs, which is fine), so nothing noticed. - Four workloads are never measured locally. The default mode loops over
baseline.txtrows, notbench/*.eigs(check_regression.sh:162-163).alloc_heavy,conservative_observed_loop,conservative_unobserved_loopandobserver_gate_soft_keywordhave no row, so they are skipped with no message. A row whose.eigsis deleted is also skipped silently ([ -f "$f" ] || continue). docs/PERFORMANCE.mdpublishes the stale numbers. The observer table's "Cachegrind baselineIr" column shows 59,530,737 / 59,536,974 (from the file) and the Callgrind medians show 60.46M (frombench/observer_callgrind.txt, 2026-10-01). Main measures about 45.0M for both loops. The derived -0.01% overhead still holds (45,015,332 vs 45,025,538 is -0.02%), but the absolute counts are 25% off.tools/performance_observer_docs.pychecks the table againstbaseline.txtand the Callgrind file, never against the binary, so it passes while both inputs are stale.
Context: how the drift built up
Ir of two workloads at sampled main commits, measured here with cachegrind:
| commit | date | unobserved_armed_loop | scalar_loop |
|---|---|---|---|
| 2bd607ed | 10-01 | 519.8M | 45.4M |
| 19f8b52e | 10-02 | 542.0M (+4.3%) | 47.4M |
| f652f0d8 | 10-04 | 552.2M | 48.7M |
| 036e6280 | 10-18 | 550.8M | 32.3M |
| 6bc1f02d | 10-27 | 571.3M (+3.7% vs 10-24) | 33.3M |
| 89039f93 | 10-28 | 569.6M | 33.4M |
| 75f7e3e8 | 10-31 | 569.6M | 33.5M |
The +10.7% on unobserved_armed_loop came in steps of 2 to 4%, all before #2072 lowered the --vs threshold from 5% to 0.5% on 2026-10-28; since then it is flat. So the current CI gate is not the problem. The point is that the checked-in file was the only cumulative reference, and it stopped being refreshed.
Expected vs actual
- Expected:
bash bench/check_regression.shpasses on clean main, measures everybench/*.eigs, and the published counts match main within the gate's resolution. - Actual: red on clean main, 4 of 10 workloads unmeasured, published counts 25% off.
Done when
-
bench/baseline.txtis regenerated with--updateand holds one row perbench/*.eigs(10 today). - The default mode fails (or at least prints) when a
bench/*.eigshas no baseline row or a row has no.eigs, with a self-test plant for each. -
bench/observer_callgrind.txtand the PERFORMANCE.md observer tables are re-measured on current main. - Something re-checks the file against the binary on a schedule or at each release cut (for example the release checklist runs the default mode), so the next drift is caught before it reaches 24%.
— Duet (orchestrator)
- Dominant language
- C
- Stars
- 3
- Forks
- 7
- Avg merge
- 6h 32m
- Merged PRs (30d)
- 285
Getting set up
Starts the project's dev container in your browser, under your own GitHub account.
- Ships a Dockerfile or Docker Compose file
- Has a pull request template
- Read the contributing guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from InauguralSystems/EigenScript
-
good first issue needs-triage
Difficulty 1/5 Under an hour Newbie friendliness 88/100
InauguralSystems/EigenScript#2347 · 1 comment ·
Maintainers usually reply within 1 day
-
needs-triage
Difficulty 1/5 Under an hour Newbie friendliness 82/100
InauguralSystems/EigenScript#2335 · 1 comment ·
Maintainers usually reply within 1 day
-
area:embed kind:bug
Difficulty 2/5 1-3 hours Newbie friendliness 62/100
InauguralSystems/EigenScript#2311 · 1 comment ·
Maintainers usually reply within 1 day
-
area:gates kind:gate-defect
Difficulty 2/5 1-3 hours Newbie friendliness 62/100
InauguralSystems/EigenScript#2305 · 1 comment ·
Maintainers usually reply within 1 day
-
area:ci bug found-by:duet-audit
Difficulty 2/5 1-3 hours Newbie friendliness 62/100
InauguralSystems/EigenScript#2283 ·
Maintainers usually reply within 1 day
All issues in InauguralSystems/EigenScript
Similar issues
-
bug
Difficulty 2/5 1-3 hours Newbie friendliness 78/100
FujiNetWIFI/fujinet-config#379 ·
Maintainers usually reply within 1 day
-
Ship /Local/Applications, the Local domain's Applications folderPossibly taken @pkgdemon claimed this today. Openarea:base enhancement
Difficulty 1/5 Under an hour Newbie friendliness 94/100
nextbsd/nextbsd-userland#612 ·
Maintainers usually reply within 1 day
-
Difficulty 2/5 1-3 hours Newbie friendliness 78/100
zephyrproject-rtos/zephyr#125543 ·
Maintainers usually reply within 2 days
-
Difficulty 2/5 1-3 hours Newbie friendliness 78/100
colbymchenry/codegraph#3277 ·
Maintainers usually reply within 1 day
-
Difficulty 2/5 1-3 hours Newbie friendliness 78/100