Someone on your side will ask how the numbers were made.
This page is for them. It covers which measurement means what, the figure we published that turned out to be wrong and why, what the scanner says when pointed at its own source, and which numbers here have a stale date. Every figure comes from a run against a real tree, with the date it was taken.
Two precision numbers exist, and only one of them is about your code.
One says a rule does not contradict its own documentation. The other says the rule is right about real source. If someone quotes a precision figure at you, the first question is which of these two they mean.
Every pattern that ships a good and a bad example has to fire on its own bad example and stay silent on its own good one. This runs on every change to a spec, so it is always current. It is also narrow: it proves a rule is internally consistent, not that it is accurate against your repository.
Two things moved here. The three patterns that used to fail their own bad example now pass. The population being checked also shrank, from 4,473 to 3,902, as detectors that could not fire were retired: a smaller library, checked completely, rather than a larger one checked loosely.
Findings judged against the source they point at, one at a time, rather than against a bundled example. This is the number that reflects what a rule does in the wild, and it is the one worth arguing about.
It is also the number we cannot refresh cheaply, and the one we have already had to correct in public. The next section is that correction.
We told you most of what we reported on our own code was wrong. That figure was an artefact.
This page carried 58.8% for months, as the share of findings on our own source that were factually wrong. It was measured with the judge running at its provider's default sampling temperature, unpinned. Asked the same question twice, that judge agreed with itself on 67.4% of findings. Pinned to a deterministic setting it agrees with itself on 96.4%. Roughly a third of those wrong verdicts were noise in the measurement, not a stable read of the finding.
Measured at an unpinned temperature, so not comparable with anything below. Left on the record rather than deleted, because a number that quietly disappears is worse than one that is explained.
38 wrong of 432 judged, pinned temperature, fixed seed, capped at 25 findings per detector so no noisy rule dominates. Confidence interval 6.5% to 11.8%, which does not exclude 10%.
43 wrong of 478 judged. A different judge model, because the account behind every other figure here had no balance that day. That is a judge identity change, so it sits alongside the August number rather than replacing it.
every other campaign in the repository was measured severity-blind and has not been re-audited under the current bar · those results are unaudited, not passing
What it says about its own source, including the part that scores badly.
Raw finding counts against the working tree as it actually stands, mid-refactor and dirty, measured 2026-09-02. The test tree scores worse than the source tree, which is the honest shape of a repository whose fixtures contain defect-shaped strings on purpose.
Measured 2026-07-19 across 317 files. The prior measurement covered 184 files in 17.0 seconds, so the file count grew by 72% while the wall clock fell.
The worst realistic single-file case, with no cache to lean on.
A re-run of the same file, which is what an editor or a pre-commit hook actually pays for.
test suite 11,716 collected · 11,708 passing · 8 skipped, 2026-08-06 · no source file over 1,500 lines, checked by full sweep rather than sampling · library size is read from the facts file: 4,808 patterns · 146 spec files · 26 languages
What on this page has a stale date.
A measurement without a date is just a claim. These are the ones we know are behind, listed here so nobody discovers them by being wrong in a meeting.
The speed figures. They were taken on a 317-file source tree, and that tree is now 378 files. They have not been re-measured since, so treat them as the last honest reading rather than today's.
The ten-round real-corpus campaign that took the failing count from 1,854 to 1,362. Not re-run since, and it predates the judge-temperature correction above, so its absolute numbers carry the same inflation. A full re-run is a multi-round campaign, not a build step.
Every per-language campaign result in the repository was measured severity-blind, before the bar became severity-weighted. None has been re-audited under the current definition, so they are unaudited rather than passing, pending a fresh severity-split measurement per language.
The metrics document in the engine repository under-counts library size against the generated facts file: it was written before the library grew to 4,808 patterns across 146 specs and 26 languages. The facts file is generated and wins, and the site reads it, but the document needs regenerating upstream.
The remaining-bottleneck list from the earlier speed work. The optimisation history behind it is accurate as history; the open items should be treated as stale until something is profiled again.
the corpus census (270 repositories, 259,598 files, 2,023,670 findings, 0 analysis failures, 130 of 146 surfaces firing) measures volume, not accuracy, and is dated 2026-08-14 · the rewriting guarantee and its twenty-of-twenty replay are measured separately