flakestat reads the JUnit XML your test runner already writes and tells you which tests are actually flaky, ranked, with a confidence level, and with the evidence behind every verdict.
VERDICT SCORE CONF RUNS PASS/FAIL TEST
flaky 0.62 high 20 14/6 test_demo::test_flaky_race
consistently-failing 0.00 high 20 0/20 test_demo::test_broken
1 flaky, 0 suspect, 1 consistently failing,
1 stable, 1 unscored (of 4 tests)
One static binary. No account, no server, no test data leaving your machine.
If your runner writes JUnit XML, and they all do, flakestat reads it.
Recording CI runs costs no extra compute. No per-seat or per-run pricing.
The Go module has no require block. Nothing to audit but the tool.
brew install rowhitswami/tap/flakestatnpm install --save-dev flakestat
# or, without installing:
npx flakestat reportpip install flakestatgo install github.com/rowhitswami/flakestat/cmd/flakestat@latestcurl -sSfL https://raw.githubusercontent.com/rowhitswami/flakestat/main/scripts/install.sh \
| sh -s -- -b /usr/local/bindocker run --rm -v "$PWD:/workspace" ghcr.io/rowhitswami/flakestat reportflakestat hunt --runs 20 --junit 'reports/junit-{run}.xml' \
-- pytest --junitxml='{junit}'flakestat hunt --runs 20 --junit 'reports/junit-{run}.xml' \
-- npx jest --reporters=jest-junitflakestat hunt --runs 20 --junit 'reports/junit-{run}.xml' \
-- gotestsum --junitfile='{junit}' -- ./...flakestat hunt --runs 20 --junit 'target/surefire-reports/*.xml' \
-- mvn -q testThat runs your suite 20 times on unchanged code and reports what disagreed. Already have CI? Record the runs you already pay for instead: it catches environment-dependent flakes a local burst never will, at no extra compute.
A test failing 100% of the time isn't flaky, it's broken. flakestat scores pass→fail→pass transitions, so a broken test scores zero and is reported separately.
Disagreement on the same commit is proof; across commits it may be a regression someone already fixed, so it counts for less.
A score of 0.62 from three runs and from three hundred are different claims. A small
sample can never reach high.
Two outcomes are evidence of nondeterminism only if branch, platform and runtime were held constant.
See exactly how scoring works, including a live demo you can poke at.