You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Per-scenario tables, version-trajectory shape. Headline cells fingerprinted
to linux-x86_64 (Intel Core i7-6700HQ 4-core / 15 GB / ext4 / rustc 1.97.0) —
see METHODOLOGY.md for the hardware contract and why
cross-machine comparisons need like-for-like.
How to read this file
Each scenario gets its own section with:
A one-paragraph overview of what dispatch shape the scenario stresses
and which class of regression it catches.
A table per mode (full and changed) with rows = version (newest
first), columns = size (1k / 10k / 100k / 1M). Cells are
mean ± stddev, formatted in ms below 1 s and seconds above.
— means the version was not measured at that size.
n/a means the scenario didn't exist at the tag.
Significant deltas (anything > 20 % across a release) get an investigation
write-up under investigations/<YYYY-MM-topic>/ that
captures the diagnostic data (traces, flamegraphs, bisect notes).
Source of truth. This file is generated by
xtask/scripts/render-history.py after every release. The bench-record.yml
workflow's PR includes the per-cell numbers for the maintainer to verify
before merging — see ../../RELEASING.md.
Cross-version headline trajectory
1M cells across the most-stressed scenarios. S3 is the realistic-monorepo
anchor; S7 is the cross-file-relational cliff that v0.9.5's path-index fix
didn't fully cover (and v0.9.8 targets directly); S9 is the nested-polyglot
scenario the v0.9.6 scope_filter: primitive exists for.
Version
Date
1M S3 full
1M S6 full
1M S7 full
1M S9 full
Headline change
v0.15.0
2026-08-16
18.11 s ± 0.14
17.60 s ± 0.21
16.06 s ± 0.19
11.97 s ± 0.32
v0.15 makes rules legible and monorepos first-class.
v0.14.2
2026-08-06
18.33 s ± 0.15
17.35 s ± 0.02
16.19 s ± 0.23
11.87 s ± 0.09
A fixes-and-hardening patch on top of 0.14.1.
v0.14.1
2026-07-24
18.02 s ± 0.14
17.27 s ± 0.08
16.24 s ± 0.17
11.77 s ± 0.03
A performance patch.
v0.14.0
2026-07-18
18.63 s ± 0.16
17.86 s ± 0.01
16.24 s ± 0.13
12.20 s ± 0.06
The adoption release. Baseline mode (alint baseline + alint check --baseline) grandfathers a repo's existing violations behind a content-fingerprinted snapshot, so alint check reports and gates only on new findings — alint becomes a blocking merge gate on an established codebase without a flag-day cleanup, and for SARIF the suppressed findings are marked, not deleted, so GitHub Code Scanning dismisses them instead of flapping fixed-then-reopened.
v0.13.0
2026-06-17
17.64 s ± 0.11
16.66 s ± 0.02
16.26 s ± 0.17
11.36 s ± 0.01
This release turns the documented surface into generated, drift-proof contracts.
v0.12.0
2026-06-07
17.52 s ± 0.14
16.71 s ± 0.02
16.13 s ± 0.29
11.48 s ± 0.04
The case-study-driven rule-kind expansion, paired with a security cycle that hardens path handling into a real boundary.
v0.11.0
2026-05-28
17.57 s ± 0.07
16.74 s ± 0.10
16.29 s ± 0.11
11.49 s ± 0.05
The LSP + editor-integration release.
v0.10.2
2026-05-21
17.50 s ± 0.02
16.62 s ± 0.02
16.33 s ± 0.03
11.42 s ± 0.05
Targeted follow-up to v0.10.1.
v0.10.1
2026-05-20
17.49 s ± 0.27
16.62 s ± 0.02
16.25 s ± 0.17
11.46 s ± 0.07
Small post-release follow-up to v0.10.0.
v0.10.0
2026-05-20
17.64 s ± 0.03
16.70 s ± 0.02
16.35 s ± 0.14
11.42 s ± 0.03
The "case-study coverage push" minor.
Earlier history (v0.7.x, v0.8.x): no measured perf change beyond v0.5.7;
see CHANGELOG.md for the contemporaneous notes.
S1 — Filename hygiene
Eight filename-only rules (filename_case, filename_regex). Pure walker plus glob match — no content read. Narrowest scope alint shares with ls-lint, used as the competitive-comparison anchor. Catches walker and scope-match regressions.
S1 — full
Version
1k
10k
100k
1M
v0.15.0
7 ms ± 1
26 ms ± 1
220 ms ± 1
2.36 s ± 0.00
v0.14.2
8 ms ± 1
27 ms ± 1
222 ms ± 2
2.41 s ± 0.06
v0.14.1
8 ms ± 1
27 ms ± 1
224 ms ± 4
2.38 s ± 0.01
v0.14.0
8 ms ± 1
26 ms ± 1
224 ms ± 1
2.39 s ± 0.00
v0.13.0
8 ms ± 1
26 ms ± 1
223 ms ± 1
2.39 s ± 0.00
v0.12.0
8 ms ± 1
27 ms ± 2
223 ms ± 1
2.39 s ± 0.00
v0.11.0
8 ms ± 1
26 ms ± 1
221 ms ± 1
2.37 s ± 0.01
v0.10.2
7 ms ± 1
26 ms ± 1
223 ms ± 2
2.39 s ± 0.01
v0.10.1
7 ms ± 1
27 ms ± 1
223 ms ± 1
2.40 s ± 0.01
v0.10.0
7 ms ± 1
27 ms ± 1
223 ms ± 2
2.40 s ± 0.01
S1 — changed
Version
1k
10k
100k
1M
v0.15.0
12 ms ± 1
46 ms ± 2
389 ms ± 3
4.12 s ± 0.01
v0.14.2
19 ms ± 1
46 ms ± 1
391 ms ± 4
4.16 s ± 0.01
v0.14.1
19 ms ± 1
47 ms ± 1
393 ms ± 4
4.16 s ± 0.00
v0.14.0
19 ms ± 1
46 ms ± 1
393 ms ± 3
4.17 s ± 0.02
v0.13.0
19 ms ± 1
46 ms ± 1
390 ms ± 2
4.17 s ± 0.01
v0.12.0
19 ms ± 1
46 ms ± 1
391 ms ± 2
4.15 s ± 0.00
v0.11.0
11 ms ± 1
46 ms ± 1
391 ms ± 2
4.16 s ± 0.01
v0.10.2
19 ms ± 1
46 ms ± 1
393 ms ± 3
4.18 s ± 0.00
v0.10.1
19 ms ± 1
65 ms ± 1
393 ms ± 2
4.16 s ± 0.01
v0.10.0
19 ms ± 1
46 ms ± 1
392 ms ± 2
4.18 s ± 0.01
S2 — Existence + content
Eight existence + content rules (file_exists, file_absent, file_content_forbidden, file_max_size). Walker plus per-file content scan over narrow scopes. Repolinter-comparable shape. Catches content-rule regressions on common shapes.
S2 — full
Version
1k
10k
100k
1M
v0.15.0
10 ms ± 1
37 ms ± 1
320 ms ± 5
3.56 s ± 0.01
v0.14.2
10 ms ± 1
37 ms ± 1
319 ms ± 5
3.58 s ± 0.01
v0.14.1
10 ms ± 1
37 ms ± 2
324 ms ± 5
3.56 s ± 0.02
v0.14.0
10 ms ± 1
42 ms ± 1
374 ms ± 3
4.14 s ± 0.02
v0.13.0
10 ms ± 1
38 ms ± 1
327 ms ± 5
3.68 s ± 0.04
v0.12.0
11 ms ± 1
37 ms ± 1
325 ms ± 4
3.66 s ± 0.03
v0.11.0
10 ms ± 1
37 ms ± 1
323 ms ± 5
3.65 s ± 0.00
v0.10.2
11 ms ± 1
37 ms ± 1
325 ms ± 4
3.68 s ± 0.01
v0.10.1
10 ms ± 1
37 ms ± 1
324 ms ± 2
3.66 s ± 0.01
v0.10.0
10 ms ± 1
38 ms ± 2
329 ms ± 3
3.67 s ± 0.02
S2 — changed
Version
1k
10k
100k
1M
v0.15.0
14 ms ± 1
48 ms ± 1
397 ms ± 2
4.21 s ± 0.01
v0.14.2
20 ms ± 1
48 ms ± 1
399 ms ± 1
4.24 s ± 0.01
v0.14.1
20 ms ± 1
49 ms ± 1
409 ms ± 7
4.24 s ± 0.01
v0.14.0
20 ms ± 1
49 ms ± 1
407 ms ± 2
4.29 s ± 0.01
v0.13.0
21 ms ± 1
49 ms ± 1
401 ms ± 2
4.26 s ± 0.01
v0.12.0
20 ms ± 1
48 ms ± 1
401 ms ± 2
4.23 s ± 0.01
v0.11.0
12 ms ± 1
48 ms ± 1
400 ms ± 2
4.23 s ± 0.01
v0.10.2
20 ms ± 1
48 ms ± 1
400 ms ± 1
4.25 s ± 0.00
v0.10.1
20 ms ± 1
66 ms ± 1
402 ms ± 2
4.25 s ± 0.02
v0.10.0
20 ms ± 1
48 ms ± 1
403 ms ± 2
4.26 s ± 0.00
S3 — Workspace bundle
extends: oss-baseline + rust + monorepo + cargo-workspace (~34 rules). Heavy mix — content rules over **/*.rs, cross-file for_each_dir over crates/*, toml_path_matches per crate. Realistic monorepo workload; the v0.9.5 cliff (investigations/2026-05-cross-file-rules/) lived here.
S3 — full
Version
1k
10k
100k
1M
v0.15.0
32 ms ± 2
179 ms ± 2
1.71 s ± 0.01
18.11 s ± 0.14
v0.14.2
31 ms ± 1
180 ms ± 2
1.70 s ± 0.01
18.33 s ± 0.15
v0.14.1
32 ms ± 2
182 ms ± 5
1.74 s ± 0.05
18.02 s ± 0.14
v0.14.0
32 ms ± 1
185 ms ± 2
1.75 s ± 0.01
18.63 s ± 0.16
v0.13.0
31 ms ± 1
173 ms ± 2
1.64 s ± 0.01
17.64 s ± 0.11
v0.12.0
31 ms ± 1
173 ms ± 2
1.65 s ± 0.01
17.52 s ± 0.14
v0.11.0
30 ms ± 1
173 ms ± 2
1.64 s ± 0.01
17.57 s ± 0.07
v0.10.2
31 ms ± 2
172 ms ± 2
1.64 s ± 0.00
17.50 s ± 0.02
v0.10.1
30 ms ± 1
172 ms ± 2
1.64 s ± 0.01
17.49 s ± 0.27
v0.10.0
31 ms ± 2
171 ms ± 3
1.64 s ± 0.01
17.64 s ± 0.03
S3 — changed
Version
1k
10k
100k
1M
v0.15.0
26 ms ± 2
95 ms ± 1
721 ms ± 5
7.50 s ± 0.03
v0.14.2
33 ms ± 1
95 ms ± 2
722 ms ± 4
7.54 s ± 0.05
v0.14.1
33 ms ± 1
97 ms ± 2
737 ms ± 8
7.55 s ± 0.02
v0.14.0
34 ms ± 1
97 ms ± 1
726 ms ± 3
7.57 s ± 0.02
v0.13.0
34 ms ± 2
95 ms ± 2
726 ms ± 5
7.59 s ± 0.03
v0.12.0
33 ms ± 1
95 ms ± 1
724 ms ± 3
7.53 s ± 0.02
v0.11.0
25 ms ± 1
95 ms ± 2
724 ms ± 4
7.54 s ± 0.00
v0.10.2
33 ms ± 2
95 ms ± 1
726 ms ± 4
7.58 s ± 0.02
v0.10.1
33 ms ± 2
114 ms ± 1
726 ms ± 3
7.57 s ± 0.05
v0.10.0
34 ms ± 1
95 ms ± 2
726 ms ± 3
7.60 s ± 0.04
S4 — Agent-era hygiene
Five rules from the v0.6 agent-hygiene bundled ruleset (file_absent, file_content_forbidden). Filename plus content fan-out over agent-shaped trees. Catches agent-era rule shapes.
S4 — full
Version
1k
10k
100k
1M
v0.15.0
9 ms ± 1
27 ms ± 1
227 ms ± 4
2.38 s ± 0.01
v0.14.2
8 ms ± 0
28 ms ± 1
227 ms ± 4
2.40 s ± 0.01
v0.14.1
9 ms ± 1
29 ms ± 1
230 ms ± 5
2.41 s ± 0.01
v0.14.0
10 ms ± 1
28 ms ± 1
231 ms ± 4
2.41 s ± 0.00
v0.13.0
9 ms ± 1
28 ms ± 1
229 ms ± 4
2.41 s ± 0.01
v0.12.0
9 ms ± 1
28 ms ± 1
229 ms ± 5
2.41 s ± 0.01
v0.11.0
9 ms ± 1
28 ms ± 1
226 ms ± 3
2.39 s ± 0.01
v0.10.2
9 ms ± 1
28 ms ± 1
227 ms ± 3
2.41 s ± 0.01
v0.10.1
9 ms ± 1
28 ms ± 1
231 ms ± 5
2.41 s ± 0.01
v0.10.0
9 ms ± 1
28 ms ± 1
229 ms ± 3
2.42 s ± 0.01
S4 — changed
Version
1k
10k
100k
1M
v0.15.0
14 ms ± 1
47 ms ± 1
390 ms ± 2
4.12 s ± 0.00
v0.14.2
20 ms ± 1
47 ms ± 1
391 ms ± 2
4.14 s ± 0.01
v0.14.1
20 ms ± 1
48 ms ± 1
399 ms ± 8
4.16 s ± 0.01
v0.14.0
20 ms ± 1
47 ms ± 1
393 ms ± 2
4.16 s ± 0.01
v0.13.0
20 ms ± 1
48 ms ± 1
392 ms ± 3
4.18 s ± 0.01
v0.12.0
21 ms ± 1
47 ms ± 1
393 ms ± 2
4.15 s ± 0.00
v0.11.0
12 ms ± 1
47 ms ± 1
393 ms ± 2
4.15 s ± 0.00
v0.10.2
20 ms ± 1
47 ms ± 1
393 ms ± 2
4.16 s ± 0.00
v0.10.1
20 ms ± 1
66 ms ± 1
393 ms ± 1
4.17 s ± 0.00
v0.10.0
20 ms ± 1
48 ms ± 1
394 ms ± 2
4.17 s ± 0.01
S5 — Fix-pass content edits
Four content-edit rules under --fix (final_newline, no_trailing_whitespace, line_endings, no_bom). Read, transform, atomic-rename. The only --fix-mode bench. Catches fix-pipeline regressions.
S5 — full
Version
1k
10k
100k
1M
v0.15.0
16 ms ± 1
117 ms ± 1
1.20 s ± 0.01
12.77 s ± 0.08
v0.14.2
15 ms ± 1
116 ms ± 1
1.19 s ± 0.00
12.74 s ± 0.03
v0.14.1
16 ms ± 1
121 ms ± 4
1.22 s ± 0.04
12.61 s ± 0.02
v0.14.0
16 ms ± 1
120 ms ± 1
1.24 s ± 0.00
13.18 s ± 0.05
v0.13.0
15 ms ± 1
113 ms ± 1
1.17 s ± 0.00
12.42 s ± 0.03
v0.12.0
15 ms ± 1
114 ms ± 1
1.17 s ± 0.00
12.47 s ± 0.03
v0.11.0
15 ms ± 1
114 ms ± 1
1.17 s ± 0.01
12.48 s ± 0.04
v0.10.2
15 ms ± 1
112 ms ± 1
1.16 s ± 0.00
12.38 s ± 0.03
v0.10.1
15 ms ± 1
112 ms ± 1
1.16 s ± 0.00
12.37 s ± 0.01
v0.10.0
16 ms ± 1
112 ms ± 1
1.17 s ± 0.00
12.45 s ± 0.01
S5 — changed
Version
1k
10k
100k
1M
v0.15.0
13 ms ± 1
49 ms ± 1
430 ms ± 2
4.57 s ± 0.02
v0.14.2
19 ms ± 1
50 ms ± 1
431 ms ± 2
4.59 s ± 0.02
v0.14.1
20 ms ± 2
50 ms ± 2
440 ms ± 6
4.59 s ± 0.00
v0.14.0
19 ms ± 1
50 ms ± 1
437 ms ± 2
4.64 s ± 0.01
v0.13.0
19 ms ± 1
50 ms ± 1
431 ms ± 3
4.61 s ± 0.02
v0.12.0
19 ms ± 1
50 ms ± 1
429 ms ± 1
4.58 s ± 0.01
v0.11.0
11 ms ± 1
49 ms ± 0
430 ms ± 1
4.56 s ± 0.00
v0.10.2
19 ms ± 1
49 ms ± 1
431 ms ± 2
4.60 s ± 0.00
v0.10.1
20 ms ± 1
68 ms ± 1
432 ms ± 2
4.59 s ± 0.01
v0.10.0
19 ms ± 1
50 ms ± 1
433 ms ± 2
4.60 s ± 0.01
S6 — Per-file content fan-out
Thirteen content rules over **/*.rs. Per-file dispatch path width — every .rs file hit by every rule on a single read. Stresses the v0.9.3 dispatch-flip read-coalescing path. Catches per-file inner-loop regressions S3 doesn't surface.
S6 — full
Version
1k
10k
100k
1M
v0.15.0
19 ms ± 1
158 ms ± 1
1.64 s ± 0.01
17.60 s ± 0.21
v0.14.2
19 ms ± 1
158 ms ± 2
1.63 s ± 0.01
17.35 s ± 0.02
v0.14.1
20 ms ± 1
161 ms ± 6
1.68 s ± 0.04
17.27 s ± 0.08
v0.14.0
20 ms ± 1
162 ms ± 1
1.68 s ± 0.01
17.86 s ± 0.01
v0.13.0
19 ms ± 1
149 ms ± 1
1.56 s ± 0.00
16.66 s ± 0.02
v0.12.0
19 ms ± 1
150 ms ± 1
1.57 s ± 0.00
16.71 s ± 0.02
v0.11.0
19 ms ± 1
150 ms ± 1
1.56 s ± 0.01
16.74 s ± 0.10
v0.10.2
18 ms ± 1
149 ms ± 1
1.55 s ± 0.00
16.62 s ± 0.02
v0.10.1
18 ms ± 1
149 ms ± 2
1.56 s ± 0.01
16.62 s ± 0.02
v0.10.0
18 ms ± 1
149 ms ± 1
1.56 s ± 0.01
16.70 s ± 0.02
S6 — changed
Version
1k
10k
100k
1M
v0.15.0
14 ms ± 1
54 ms ± 1
478 ms ± 1
5.06 s ± 0.01
v0.14.2
19 ms ± 1
54 ms ± 1
476 ms ± 2
5.08 s ± 0.01
v0.14.1
20 ms ± 1
56 ms ± 2
486 ms ± 10
5.07 s ± 0.00
v0.14.0
20 ms ± 1
55 ms ± 1
485 ms ± 3
5.12 s ± 0.01
v0.13.0
20 ms ± 1
54 ms ± 1
474 ms ± 2
5.03 s ± 0.00
v0.12.0
19 ms ± 1
54 ms ± 1
473 ms ± 1
5.02 s ± 0.00
v0.11.0
12 ms ± 1
54 ms ± 1
473 ms ± 2
5.02 s ± 0.01
v0.10.2
20 ms ± 1
53 ms ± 2
473 ms ± 2
5.03 s ± 0.01
v0.10.1
19 ms ± 1
72 ms ± 1
474 ms ± 2
5.02 s ± 0.01
v0.10.0
19 ms ± 1
54 ms ± 1
473 ms ± 1
5.04 s ± 0.01
S7 — Cross-file relational
Six cross-file relational kinds (pair, unique_by, for_each_dir, for_each_file, dir_only_contains, every_matching_has). Various fan-out shapes over the synthetic monorepo. Catches the next O(D × N) cliff after the v0.9.5 path-index fix; the v0.9.7 → v0.9.8 transition's headline cell.
S7 — full
Version
1k
10k
100k
1M
v0.15.0
12 ms ± 1
43 ms ± 2
513 ms ± 8
16.06 s ± 0.19
v0.14.2
12 ms ± 1
44 ms ± 2
510 ms ± 9
16.19 s ± 0.23
v0.14.1
12 ms ± 2
45 ms ± 2
521 ms ± 7
16.24 s ± 0.17
v0.14.0
12 ms ± 1
45 ms ± 3
515 ms ± 7
16.24 s ± 0.13
v0.13.0
13 ms ± 1
43 ms ± 1
514 ms ± 8
16.26 s ± 0.17
v0.12.0
13 ms ± 1
44 ms ± 2
517 ms ± 4
16.13 s ± 0.29
v0.11.0
13 ms ± 1
44 ms ± 3
514 ms ± 4
16.29 s ± 0.11
v0.10.2
12 ms ± 1
43 ms ± 2
511 ms ± 4
16.33 s ± 0.03
v0.10.1
12 ms ± 1
43 ms ± 2
516 ms ± 7
16.25 s ± 0.17
v0.10.0
12 ms ± 1
43 ms ± 2
520 ms ± 7
16.35 s ± 0.14
S7 — changed
Version
1k
10k
100k
1M
v0.15.0
18 ms ± 1
65 ms ± 2
697 ms ± 9
18.15 s ± 0.14
v0.14.2
23 ms ± 1
65 ms ± 2
701 ms ± 9
18.13 s ± 0.17
v0.14.1
24 ms ± 2
67 ms ± 3
706 ms ± 11
18.09 s ± 0.11
v0.14.0
24 ms ± 1
65 ms ± 2
696 ms ± 6
18.19 s ± 0.11
v0.13.0
24 ms ± 1
65 ms ± 2
701 ms ± 4
18.15 s ± 0.08
v0.12.0
24 ms ± 1
64 ms ± 2
694 ms ± 5
18.11 s ± 0.13
v0.11.0
16 ms ± 1
65 ms ± 2
693 ms ± 4
18.18 s ± 0.03
v0.10.2
24 ms ± 1
65 ms ± 2
701 ms ± 4
18.11 s ± 0.07
v0.10.1
24 ms ± 1
83 ms ± 2
702 ms ± 8
18.22 s ± 0.05
v0.10.0
24 ms ± 2
64 ms ± 2
695 ms ± 6
18.10 s ± 0.14
S8 — Git overlay
S3 reshape plus git_no_denied_paths and git_tracked_only over a real git repo. Same as S3 but with Engine::collect_git_tracked_if_needed and BlameCache active. Catches git-aware dispatch regressions at scale.
S8 — full
Version
1k
10k
100k
1M
v0.15.0
27 ms ± 1
167 ms ± 2
1.60 s ± 0.01
17.64 s ± 0.39
v0.14.2
27 ms ± 1
166 ms ± 2
1.59 s ± 0.01
17.44 s ± 0.06
v0.14.1
28 ms ± 2
168 ms ± 4
1.62 s ± 0.04
17.29 s ± 0.04
v0.14.0
29 ms ± 1
171 ms ± 2
1.63 s ± 0.01
17.93 s ± 0.04
v0.13.0
27 ms ± 1
160 ms ± 1
1.52 s ± 0.01
16.92 s ± 0.05
v0.12.0
27 ms ± 1
161 ms ± 2
1.53 s ± 0.01
16.85 s ± 0.03
v0.11.0
27 ms ± 1
161 ms ± 2
1.53 s ± 0.01
16.88 s ± 0.03
v0.10.2
27 ms ± 1
159 ms ± 2
1.52 s ± 0.01
16.76 s ± 0.03
v0.10.1
26 ms ± 1
159 ms ± 2
1.51 s ± 0.01
16.54 s ± 0.24
v0.10.0
26 ms ± 1
159 ms ± 2
1.53 s ± 0.01
16.85 s ± 0.03
S8 — changed
Version
1k
10k
100k
1M
v0.15.0
22 ms ± 1
83 ms ± 2
600 ms ± 5
6.47 s ± 0.00
v0.14.2
28 ms ± 1
84 ms ± 2
602 ms ± 7
6.46 s ± 0.01
v0.14.1
29 ms ± 1
85 ms ± 3
613 ms ± 7
6.51 s ± 0.03
v0.14.0
29 ms ± 0
83 ms ± 1
608 ms ± 7
6.52 s ± 0.04
v0.13.0
29 ms ± 1
82 ms ± 1
604 ms ± 3
6.55 s ± 0.02
v0.12.0
29 ms ± 1
83 ms ± 2
605 ms ± 4
6.52 s ± 0.00
v0.11.0
21 ms ± 1
83 ms ± 2
604 ms ± 6
6.52 s ± 0.02
v0.10.2
28 ms ± 1
83 ms ± 1
607 ms ± 5
6.61 s ± 0.03
v0.10.1
28 ms ± 1
101 ms ± 2
606 ms ± 4
6.55 s ± 0.03
v0.10.0
29 ms ± 1
83 ms ± 2
608 ms ± 6
6.58 s ± 0.03
S9 — Nested polyglot
Three competing ecosystem rulesets: extends: rust + node + python (~26 rules) over a polyglot tree (Rust under crates/, Node under packages/, Python under apps/). Per-rule scope_filter: { has_ancestor: <manifest> } ancestor walks. The dispatch shape the v0.9.6 scope_filter: primitive was designed for — without it, every **/*.py rule from python@v1 fires on every .py file in the tree. New in v0.9.6.
S9 — full
Version
1k
10k
100k
1M
v0.15.0
18 ms ± 1
111 ms ± 1
1.10 s ± 0.01
11.97 s ± 0.32
v0.14.2
18 ms ± 1
109 ms ± 1
1.10 s ± 0.01
11.87 s ± 0.09
v0.14.1
18 ms ± 1
114 ms ± 3
1.12 s ± 0.03
11.77 s ± 0.03
v0.14.0
18 ms ± 1
114 ms ± 2
1.14 s ± 0.01
12.20 s ± 0.06
v0.13.0
18 ms ± 1
106 ms ± 2
1.06 s ± 0.01
11.36 s ± 0.01
v0.12.0
17 ms ± 1
107 ms ± 2
1.06 s ± 0.00
11.48 s ± 0.04
v0.11.0
17 ms ± 1
107 ms ± 1
1.07 s ± 0.01
11.49 s ± 0.05
v0.10.2
17 ms ± 1
106 ms ± 2
1.06 s ± 0.00
11.42 s ± 0.05
v0.10.1
17 ms ± 1
105 ms ± 1
1.06 s ± 0.01
11.46 s ± 0.07
v0.10.0
17 ms ± 1
106 ms ± 1
1.06 s ± 0.00
11.42 s ± 0.03
S9 — changed
Version
1k
10k
100k
1M
v0.15.0
22 ms ± 1
53 ms ± 1
442 ms ± 2
4.68 s ± 0.02
v0.14.2
22 ms ± 1
54 ms ± 1
443 ms ± 3
4.69 s ± 0.01
v0.14.1
23 ms ± 1
55 ms ± 1
452 ms ± 8
4.70 s ± 0.02
v0.14.0
14 ms ± 1
54 ms ± 1
446 ms ± 1
4.72 s ± 0.01
v0.13.0
23 ms ± 1
53 ms ± 1
444 ms ± 2
4.72 s ± 0.02
v0.12.0
22 ms ± 1
54 ms ± 1
443 ms ± 3
4.70 s ± 0.01
v0.11.0
22 ms ± 1
54 ms ± 1
442 ms ± 2
4.73 s ± 0.02
v0.10.2
23 ms ± 1
53 ms ± 1
442 ms ± 2
4.70 s ± 0.01
v0.10.1
22 ms ± 1
53 ms ± 1
443 ms ± 2
4.71 s ± 0.00
v0.10.0
22 ms ± 1
53 ms ± 1
445 ms ± 2
4.73 s ± 0.02
S10 — scope_filter outside per-file dispatch
Five rules from outside the PerFileRule dispatch path (file_max_size, no_empty_files, no_symlinks, filename_case, filename_regex) each with scope_filter: { has_ancestor: <manifest> } over the polyglot tree. Per-rule evaluate() iterating ctx.index.files() with both path-glob AND scope_filter narrowing — the dispatch shape v0.9.9 wired through (v0.9.8 silently dropped scope_filter: on these 17 rule kinds). New in v0.9.9.
S10 — full
Version
1k
10k
100k
1M
v0.15.0
10 ms ± 1
51 ms ± 4
459 ms ± 11
5.06 s ± 0.07
v0.14.2
10 ms ± 1
50 ms ± 3
458 ms ± 13
5.04 s ± 0.05
v0.14.1
11 ms ± 1
51 ms ± 2
467 ms ± 12
5.06 s ± 0.02
v0.14.0
10 ms ± 1
51 ms ± 3
457 ms ± 10
5.06 s ± 0.05
v0.13.0
10 ms ± 2
51 ms ± 4
456 ms ± 11
5.06 s ± 0.03
v0.12.0
10 ms ± 1
50 ms ± 4
454 ms ± 9
5.05 s ± 0.10
v0.11.0
10 ms ± 1
51 ms ± 4
458 ms ± 12
5.04 s ± 0.11
v0.10.2
11 ms ± 1
53 ms ± 3
457 ms ± 11
5.12 s ± 0.07
v0.10.1
10 ms ± 1
52 ms ± 3
452 ms ± 8
5.12 s ± 0.22
v0.10.0
11 ms ± 1
51 ms ± 4
460 ms ± 9
5.12 s ± 0.11
S10 — changed
Version
1k
10k
100k
1M
v0.15.0
20 ms ± 1
52 ms ± 1
457 ms ± 5
5.13 s ± 0.03
v0.14.2
19 ms ± 1
50 ms ± 1
428 ms ± 6
4.54 s ± 0.01
v0.14.1
20 ms ± 1
50 ms ± 1
429 ms ± 7
4.53 s ± 0.02
v0.14.0
11 ms ± 1
50 ms ± 1
429 ms ± 5
4.55 s ± 0.01
v0.13.0
19 ms ± 1
50 ms ± 1
430 ms ± 6
4.53 s ± 0.02
v0.12.0
19 ms ± 1
49 ms ± 0
430 ms ± 4
4.57 s ± 0.04
v0.11.0
19 ms ± 1
50 ms ± 1
429 ms ± 3
4.55 s ± 0.02
v0.10.2
20 ms ± 1
50 ms ± 1
430 ms ± 4
4.54 s ± 0.02
v0.10.1
19 ms ± 1
50 ms ± 1
428 ms ± 4
4.56 s ± 0.02
v0.10.0
19 ms ± 1
49 ms ± 1
431 ms ± 5
4.56 s ± 0.01
S11 — v0.10 cross-file dispatch class
Three v0.10 cross-file kinds (registry_paths_resolve, cross_file_value_equals, pair_hash) over the regular synthetic monorepo with a manifest.sha256 overlay. Exercises the whole-repo entry points the v0.10 cross-file engine uses, plus the new crate::extract / crate::io::read_capped helpers. Adds to S7 (the v0.2-era cross-file family: pair / unique_by / for_each_* / dir_only_contains / every_matching_has) by covering the v0.10 additions. New in v0.10.0.
S11 — full
Version
1k
10k
100k
1M
v0.15.0
9 ms ± 1
31 ms ± 1
234 ms ± 2
2.37 s ± 0.00
v0.14.2
9 ms ± 1
31 ms ± 1
235 ms ± 3
2.38 s ± 0.00
v0.14.1
9 ms ± 1
32 ms ± 2
236 ms ± 4
2.39 s ± 0.00
v0.14.0
10 ms ± 1
32 ms ± 1
238 ms ± 4
2.41 s ± 0.01
v0.13.0
9 ms ± 1
30 ms ± 1
230 ms ± 3
2.36 s ± 0.00
v0.12.0
10 ms ± 1
29 ms ± 1
231 ms ± 4
2.36 s ± 0.01
v0.11.0
10 ms ± 1
29 ms ± 1
230 ms ± 3
2.35 s ± 0.01
v0.10.2
9 ms ± 1
30 ms ± 1
231 ms ± 4
2.37 s ± 0.01
v0.10.1
9 ms ± 1
30 ms ± 1
232 ms ± 5
2.36 s ± 0.00
v0.10.0
9 ms ± 1
30 ms ± 2
231 ms ± 4
2.37 s ± 0.00
S11 — changed
Version
1k
10k
100k
1M
v0.15.0
15 ms ± 1
52 ms ± 2
421 ms ± 3
4.37 s ± 0.02
v0.14.2
21 ms ± 1
51 ms ± 1
421 ms ± 4
4.40 s ± 0.02
v0.14.1
21 ms ± 1
53 ms ± 2
424 ms ± 3
4.40 s ± 0.01
v0.14.0
21 ms ± 1
53 ms ± 1
424 ms ± 4
4.41 s ± 0.00
v0.13.0
20 ms ± 1
52 ms ± 1
417 ms ± 4
4.41 s ± 0.01
v0.12.0
21 ms ± 1
51 ms ± 1
418 ms ± 4
4.37 s ± 0.01
v0.11.0
13 ms ± 1
51 ms ± 1
416 ms ± 3
4.37 s ± 0.02
v0.10.2
20 ms ± 1
51 ms ± 1
416 ms ± 2
4.39 s ± 0.01
v0.10.1
20 ms ± 1
70 ms ± 1
418 ms ± 3
4.38 s ± 0.01
v0.10.0
20 ms ± 1
51 ms ± 1
420 ms ± 3
4.38 s ± 0.01
S12 — v0.10 per-file dispatch class
Three v0.10 per-file kinds (ordered_block, import_gate, xml_path_equals + xml_path_matches) over **/*.rs plus a single root-level .csproj overlay (per-package fan-out skipped to keep cross-version file counts stable). Exercises the per-file dispatch path made fast by v0.9.3, with the v0.10-new extraction / regex / XML structured-query paths. Adds to S6 (dense content fan-out on **/*.rs) by covering the v0.10 additions independently of S6's pure-content baseline. New in v0.10.0.
S12 — full
Version
1k
10k
100k
1M
v0.15.0
10 ms ± 1
44 ms ± 1
391 ms ± 2
4.08 s ± 0.01
v0.14.2
11 ms ± 1
42 ms ± 1
379 ms ± 2
3.96 s ± 0.02
v0.14.1
11 ms ± 1
44 ms ± 1
393 ms ± 6
4.06 s ± 0.02
v0.14.0
11 ms ± 1
49 ms ± 1
432 ms ± 2
4.48 s ± 0.01
v0.13.0
11 ms ± 1
44 ms ± 1
385 ms ± 3
4.03 s ± 0.01
v0.12.0
10 ms ± 1
44 ms ± 1
383 ms ± 2
4.02 s ± 0.02
v0.11.0
11 ms ± 1
44 ms ± 1
382 ms ± 3
3.97 s ± 0.03
v0.10.2
11 ms ± 1
45 ms ± 1
397 ms ± 2
4.13 s ± 0.02
v0.10.1
11 ms ± 1
45 ms ± 2
396 ms ± 3
4.15 s ± 0.02
v0.10.0
11 ms ± 1
44 ms ± 1
395 ms ± 1
4.16 s ± 0.02
S12 — changed
Version
1k
10k
100k
1M
v0.15.0
14 ms ± 1
49 ms ± 1
409 ms ± 3
4.37 s ± 0.01
v0.14.2
20 ms ± 1
49 ms ± 1
408 ms ± 2
4.41 s ± 0.01
v0.14.1
20 ms ± 2
49 ms ± 2
417 ms ± 8
4.38 s ± 0.02
v0.14.0
20 ms ± 1
50 ms ± 1
413 ms ± 2
4.42 s ± 0.01
v0.13.0
20 ms ± 1
49 ms ± 1
410 ms ± 2
4.41 s ± 0.01
v0.12.0
20 ms ± 1
48 ms ± 1
411 ms ± 2
4.40 s ± 0.02
v0.11.0
12 ms ± 1
49 ms ± 1
409 ms ± 2
4.39 s ± 0.02
v0.10.2
20 ms ± 1
49 ms ± 1
411 ms ± 3
4.42 s ± 0.01
v0.10.1
20 ms ± 1
67 ms ± 1
413 ms ± 2
4.41 s ± 0.01
v0.10.0
20 ms ± 1
50 ms ± 1
412 ms ± 2
4.42 s ± 0.01
S13 — v0.10 single-shot dispatch class
Two v0.10 single-shot kinds (generated_file_fresh, command_idempotent) declared with command: ["true"] so the row measures crate::spawn::run_capturing (fork / exec / concurrent pipe-drain / wait / stdout-parse), not the user's tool. Single-shot rules add a fixed cost per run; tree walk dominates the row. Signal of interest is cross-version stability of the spawn path — regressions in crate::spawn or the engine's single-shot dispatch surface here in isolation. New in v0.10.0.
S13 — full
Version
1k
10k
100k
1M
v0.15.0
19 ms ± 1
34 ms ± 1
210 ms ± 1
2.18 s ± 0.01
v0.14.2
18 ms ± 1
35 ms ± 1
212 ms ± 1
2.19 s ± 0.00
v0.14.1
18 ms ± 1
35 ms ± 2
222 ms ± 7
2.20 s ± 0.00
v0.14.0
18 ms ± 1
35 ms ± 1
214 ms ± 1
2.20 s ± 0.01
v0.13.0
19 ms ± 1
35 ms ± 1
213 ms ± 1
2.21 s ± 0.00
v0.12.0
18 ms ± 1
35 ms ± 1
213 ms ± 1
2.20 s ± 0.01
v0.11.0
18 ms ± 1
35 ms ± 1
212 ms ± 1
2.19 s ± 0.00
v0.10.2
18 ms ± 1
34 ms ± 1
213 ms ± 1
2.20 s ± 0.00
v0.10.1
18 ms ± 1
35 ms ± 1
213 ms ± 1
2.20 s ± 0.01
v0.10.0
19 ms ± 1
35 ms ± 1
216 ms ± 1
2.21 s ± 0.00
S13 — changed
Version
1k
10k
100k
1M
v0.15.0
23 ms ± 1
56 ms ± 1
397 ms ± 2
4.18 s ± 0.00
v0.14.2
29 ms ± 1
56 ms ± 1
398 ms ± 3
4.22 s ± 0.01
v0.14.1
30 ms ± 1
58 ms ± 2
410 ms ± 8
4.20 s ± 0.00
v0.14.0
29 ms ± 1
57 ms ± 1
401 ms ± 1
4.21 s ± 0.01
v0.13.0
30 ms ± 1
56 ms ± 1
400 ms ± 2
4.22 s ± 0.01
v0.12.0
30 ms ± 1
56 ms ± 1
400 ms ± 1
4.20 s ± 0.01
v0.11.0
22 ms ± 1
57 ms ± 1
399 ms ± 1
4.20 s ± 0.00
v0.10.2
29 ms ± 1
56 ms ± 1
401 ms ± 1
4.21 s ± 0.01
v0.10.1
30 ms ± 1
74 ms ± 1
403 ms ± 3
4.21 s ± 0.01
v0.10.0
30 ms ± 1
56 ms ± 1
401 ms ± 2
4.23 s ± 0.01
S14 — v0.12 featureset
A single deliberately-mixed scenario exercising every file-shape rule kind / mode the v0.12 cycle added, so one row catches a regression anywhere in the v0.12 surface. Where S11-S13 are per-dispatch-class, this is per-feature-set — the v0.12 analogue of running the whole new vocabulary over the macro tree once. New in v0.12.0.
S14 — full
Version
1k
10k
100k
1M
v0.15.0
444 ms ± 1
4.62 s ± 0.02
46.73 s ± 0.21
477.1 s ± 1.8
v0.14.2
445 ms ± 1
4.62 s ± 0.01
46.67 s ± 0.39
474.2 s ± 0.7
v0.14.1
459 ms ± 19
4.65 s ± 0.14
46.70 s ± 0.25
474.7 s ± 0.5
v0.14.0
448 ms ± 2
4.67 s ± 0.02
47.08 s ± 0.19
477.2 s ± 1.4
v0.13.0
456 ms ± 2
4.74 s ± 0.02
48.00 s ± 0.26
488.8 s ± 0.8
v0.12.0
455 ms ± 2
4.72 s ± 0.02
47.87 s ± 0.25
487.3 s ± 2.1
v0.11.0
n/a
n/a
n/a
n/a
v0.10.2
n/a
n/a
n/a
n/a
v0.10.1
n/a
n/a
n/a
n/a
v0.10.0
n/a
n/a
n/a
n/a
S14 — changed
Version
1k
10k
100k
1M
v0.15.0
449 ms ± 1
4.64 s ± 0.02
46.79 s ± 0.12
476.0 s ± 2.2
v0.14.2
455 ms ± 2
4.63 s ± 0.02
46.68 s ± 0.14
474.8 s ± 0.9
v0.14.1
462 ms ± 18
4.66 s ± 0.14
46.78 s ± 0.21
474.5 s ± 1.4
v0.14.0
458 ms ± 2
4.67 s ± 0.03
47.08 s ± 0.18
477.1 s ± 0.5
v0.13.0
465 ms ± 2
4.75 s ± 0.02
48.07 s ± 0.14
487.8 s ± 1.4
v0.12.0
464 ms ± 2
4.75 s ± 0.01
47.81 s ± 0.20
488.3 s ± 0.4
v0.11.0
n/a
n/a
n/a
n/a
v0.10.2
n/a
n/a
n/a
n/a
v0.10.1
n/a
n/a
n/a
n/a
v0.10.0
n/a
n/a
n/a
n/a
How to add a row
When a release tag lands, the bench-record.yml workflow (introduced in
v0.9.7) auto-runs the publish-grade matrix on the self-hosted Linux runner
and opens a PR with the new per-version dir. The maintainer re-renders this
file from the merged data:
v0.9.5 → v0.9.8 cliff (S7 1M): investigations/2026-05-cross-file-rules-v2/
— surfaced the residual O(D × N) shape in dir_only_contains /
dir_contains after the v0.9.5 fix; v0.9.8 closes it via
FileIndex::children_of. (Investigation written alongside v0.9.8.)