Skip to content

ci(codspeed): config is listed by path, never by extension - #578

Merged
FBumann merged 1 commit into
mainfrom
ci/config-by-path-not-by-extension
Aug 11, 2026
Merged

FBumann merged 1 commit into
mainfrom
ci/config-by-path-not-by-extension

Conversation

@FBumann

@FBumann FBumann commented Aug 11, 2026

Copy link
Copy Markdown
Collaborator

Follow-up to #577. The five added paths are nearly worthless; the comment is the point. Stating that up front so the diff is not read as a saving it does not deliver.

The hole this closes

#577's list ends with LICENSE and .gitignore, and the obvious next tidy-up is **.yaml — it looks exactly as inert as **.md. It is not. Counted against the tree:

what `**.yaml`/`**.yml`/`**.json` would have silenced: 48 files, e.g.
    .github/workflows/bench.yml
    .github/workflows/codspeed.yml
    bench/models/dispatch.yaml
    bench/models/fleet.yaml

bench/models/*.yaml are the benchmarked models. A glob that reads as housekeeping would stop measuring a change to dispatch.yaml, and stop measuring changes to the instrument that measures it. examples/** and tests/golden/model.yaml are models too.

**.md is safe for the opposite reason: no markdown in this tree reaches a build. The only files it matches under src/, bench/, examples/ and tests/ are five READMEs.

So the rule that survives is an extension cannot distinguish a tool's configuration from a program's input, and inert config gets named one line at a time.

What the paths buy

skipped, last 100 merges
#577's list 43
this list 44

One. mkdocs.yml, .readthedocs.yaml, .pre-commit-config.yaml, .github/dependabot.yml and .release-please-config.json are added to make the rule concrete — a named example of what qualifies — not to save runs. #577 already took the 43%.

Verified

The guard that matters, replayed over every tracked file under src/, bench/, examples/, tests/, plus pyproject.toml, uv.lock, codspeed.yml and bench.yml — 178 files: nothing that reaches a build or defines the instrument is ignored, the five READMEs aside.

🤖 Generated with Claude Code

#577 left the ignore list one obvious step away from a silent hole. The step is
`**.yaml`, and it would stop measuring `bench/models/*.yaml` -- the benchmarked
models themselves -- along with `examples/**`, `tests/golden/model.yaml` and
this workflow. Counted: an extension glob over yaml/yml/json silences 48 files
that reach a build or define the instrument.

An extension cannot distinguish a tool's configuration from a program's input,
so the inert config files are named one at a time and the rule is written where
the next person to tidy the list will read it.

The five paths added are worth almost nothing on their own -- over the last 100
merges they skip one more than #577's list already did. They are here to make
the rule concrete rather than to save a run, and the commit says so instead of
implying a saving it does not deliver.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@codspeed

codspeed Bot commented Aug 11, 2026

Copy link
Copy Markdown

Merging this PR will regress 1 benchmark

⚠️ Different runtime environments detected

Some benchmarks with significant performance changes were compared across different runtime environments,
which may affect the accuracy of the results.

Open the report in CodSpeed to investigate

⚡ 3 improved benchmarks
❌ 1 regressed benchmark
✅ 10 untouched benchmarks
⏩ 38 skipped benchmarks1

Warning

Please fix the performance issues or acknowledge them on CodSpeed.

Performance Changes

Mode Benchmark BASE HEAD Efficiency
❌ Memory test_emit[sector-s-lpspec-highs] 4.3 MB 4.9 MB -12.15%
⚡ Memory test_emit[transport-s-lpspec-lp] 20.9 MB 17.7 MB +18.16%
⚡ Memory test_emit[profiled-s-lpspec-lp] 24.4 MB 22.4 MB +8.72%
⚡ Memory test_emit[sector-s-lpspec-lp] 5.6 MB 5.2 MB +7.2%

Tip

Investigate this regression by commenting @codspeedbot fix this regression on this PR, or directly use the CodSpeed MCP with your agent.


Comparing ci/config-by-path-not-by-extension (b7e876c) with main (b71ef49)

Open in CodSpeed

Footnotes

  1. 38 benchmarks were skipped, so the baseline results were used instead. If they were deleted from the codebase, click here and archive them to remove them from the performance reports. ↩

FBumann added a commit that referenced this pull request Aug 11, 2026
…race

The build is deterministic given a pool size: repeated runs produce identical
chunk counts and identical bytes. Peak is not, because peak is max simultaneous
liveness and whether two morsels are alive at the same instant is scheduling.
Measured on transport/s, eight runs per arm: spread 1.5% at one thread, 3.2% at
four, 3.6% at eight.

The level moves further than the spread. Per-thread buffers dwarf a small
model -- 176 MB, 194 MB, 216 MB at 1, 4 and 8 threads for a model whose frames
total 4.27 MB -- and chunk count rises with the pool for the same data
(sector/s: 4, 7, 13, 25 chunks at 1, 2, 4, 8, all at 590,000 bytes). memray
counts allocations, so an unpinned pool measures the runner as much as the code.
That is the s-rung instability seen on #578, a pull request whose entire diff is
a YAML comment and which moved four benchmarks across a 30-point range.

Only the memory job. The walltime job stays multi-threaded: polars is
multi-threaded native code, single-threading it would measure something nobody
runs, and its macro runner is dedicated hardware whose pool is already stable.

PYTHONHASHSEED is not pinned beside it. Five seeds produced byte-identical chunk
counts and sizes, so it would be a knob added on plausibility.

This puts a step in the series at this commit; points before and after are not
comparable and nothing makes them so. The trade is deliberate -- this job exists
to make a series readable, and bench.yml with docs/benchmarks.md own the honest
multi-threaded peak measured as RSS.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
FBumann added a commit that referenced this pull request Aug 11, 2026
…race (#579)

The build is deterministic given a pool size: repeated runs produce identical
chunk counts and identical bytes. Peak is not, because peak is max simultaneous
liveness and whether two morsels are alive at the same instant is scheduling.
Measured on transport/s, eight runs per arm: spread 1.5% at one thread, 3.2% at
four, 3.6% at eight.

The level moves further than the spread. Per-thread buffers dwarf a small
model -- 176 MB, 194 MB, 216 MB at 1, 4 and 8 threads for a model whose frames
total 4.27 MB -- and chunk count rises with the pool for the same data
(sector/s: 4, 7, 13, 25 chunks at 1, 2, 4, 8, all at 590,000 bytes). memray
counts allocations, so an unpinned pool measures the runner as much as the code.
That is the s-rung instability seen on #578, a pull request whose entire diff is
a YAML comment and which moved four benchmarks across a 30-point range.

Only the memory job. The walltime job stays multi-threaded: polars is
multi-threaded native code, single-threading it would measure something nobody
runs, and its macro runner is dedicated hardware whose pool is already stable.

PYTHONHASHSEED is not pinned beside it. Five seeds produced byte-identical chunk
counts and sizes, so it would be a knob added on plausibility.

This puts a step in the series at this commit; points before and after are not
comparable and nothing makes them so. The trade is deliberate -- this job exists
to make a series readable, and bench.yml with docs/benchmarks.md own the honest
multi-threaded peak measured as RSS.

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
@FBumann
FBumann merged commit 4fc661a into main Aug 11, 2026
6 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant