Know whether your LLM eval gains are real or just noise. Catch it in CI, before shipping.
Quickstart | CLI reference | Methodology | Design doc | Verification
EVALSIG sits between any LLM eval harness (Inspect AI, lm-eval-harness, HELM, simple-evals, your internal pipeline) and the decision to ship a model. It applies the statistical machinery the academic literature has spent the last two years recommending but no commercial tool ships end-to-end: paired-difference testing, clustered standard errors, permutation tests, minimum-detectable-effect / power analysis, always-valid sequential monitoring, and multiple-comparison corrections.
Frontier labs ship model updates on 1 to 3 percentage-point eval deltas, and Anthropic measured a 6 percentage-point swing on Terminal-Bench from infrastructure config alone. EVALSIG is the release gate that tells those two cases apart.
Read Methodology for the citations and the Monte Carlo validation.
Install from source (not yet published to PyPI):
git clone https://github.com/vtensor/evalsig.git
cd evalsig
pip install -e .Compare two runs:
evalsig gate \
--baseline baseline.json \
--candidate candidate.json \
--metric accuracy \
--cluster passage_id \
--min-delta 0.005 \
--alpha 0.05 \
--power 0.80EVALSIG release gate
====================
delta: +0.0124 (cluster_bootstrap)
CI (95%): [+0.0023, +inf]
p-value: 0.0070
required MDE: 0.0050
detectable: 0.0040 at 80% power
VERDICT: ALLOW
Exit code is 0 for ALLOW, 1 for REJECT, 2 for INCONCLUSIVE.
| You want to... | Go here |
|---|---|
| Install and run your first comparison | Quickstart |
| Understand every field in the output | Understanding the output |
| Pick the right test for your data | Paired vs unpaired |
| Handle clustered items | Clustered standard errors |
| Plan how many items you need | MDE and power |
| Stop expensive runs early | Sequential testing |
| Gate on a multi-task suite | Multiple comparisons |
| Look up a function | Modules |
| Wire into CI | CI release gate |
| Keep an audit trail | Compliance audit trail |
- Paired-difference inference -- paired t, paired permutation, paired bootstrap, McNemar exact / chi-squared.
- Clustered standard errors -- block bootstrap on any cluster id the harness provides.
- MDE and power analysis -- closed-form MDE, required-N inverse, Kish design-effect adjustment for clustered designs.
- Always-valid sequential testing -- Howard 2021 confidence sequence, stop whenever the CI excludes zero.
- Multiple-comparison corrections -- Bonferroni, Holm, Benjamini- Hochberg.
- Effect sizes -- Cohen's d (two-sample and paired), Cliff's delta.
- One CLI invocation gates CI -- exit code 0 / 1 / 2 maps to ALLOW / REJECT / INCONCLUSIVE.
- Reads every common eval format -- Inspect AI
.evalexports, lm-eval-harnesssamples_*.jsonl, HELMscenario_state.json, Parquet, and EVALSIG's own JSON schema. - Append-only run history -- Parquet store with a JSON manifest;
query via the
historysubcommand. - GitHub Action + pytest plugin -- drop-in CI integrations.
- Three output formats -- TTY for logs, JSON for dashboards, Markdown for PR comments.
[tool.evalsig]
alpha = 0.05
power = 0.80
min_delta = 0.005
method = "auto" # or "paired_t" / "paired_permutation" / ...
cluster = "passage_id"
one_sided = true
resamples = 10000
seed = 0(Configuration in pyproject.toml is on the v0.2 roadmap; for v0.1
pass the same values as CLI flags or function arguments.)
- uses: vtensor/evalsig@v0.1
with:
baseline: baseline.json
candidate: candidate.json
metric: accuracy
min_delta: '0.005'def test_no_regression(evalsig_gate):
a = evalsig_gate.load("baseline.json")
b = evalsig_gate.load("candidate.json")
evalsig_gate.assert_no_regression(a, b, min_delta=0.005)- repo: https://github.com/vtensor/evalsig
rev: v0.1.0
hooks:
- id: evalsig-doctorevalsig compare --baseline a.json --candidate b.json
evalsig gate --baseline a.json --candidate b.json --min-delta 0.005
evalsig mde --sd-diff 0.30 --target-delta 0.01 --power 0.80
evalsig watch --baseline a.json --candidate b.json --alternative greater
evalsig doctor a.json b.json
evalsig history --root .evalsig/store --project mmlu-pro
evalsig versionRun evalsig <subcommand> --help for every flag.
from evalsig import compare, gate, mde
from evalsig.io import read_runframe_json
a = read_runframe_json("baseline.json")
b = read_runframe_json("candidate.json")
result = compare(a, b, alpha=0.05, one_sided=True)
print(result.delta, result.p_value, result.significant)
report = gate(a, b, min_delta=0.005, alpha=0.05, power=0.80)
print(report.verdict.value) # 'ALLOW' / 'REJECT' / 'INCONCLUSIVE'Full API: docs/usage/python-api.md.
Surveyed every credible eval tool in May 2026. The whole field maxes out at "bootstrap CI on a single run". Inspect AI is the only player shipping clustered SE. Nobody ships paired-difference inference, permutation tests, MDE / power, or sequential testing. The academic recipes have been public for 18+ months and remain unimplemented commercially.
EVALSIG closes that gap.
References:
- Miller (2024), "Adding Error Bars to Evals". arXiv:2411.00640.
- Anthropic Engineering (2025), "Quantifying infrastructure noise in agentic coding evals".
- Howard et al. (2021), "Time-uniform, nonparametric, nonasymptotic confidence sequences," Annals of Statistics.
- Benjamini & Hochberg (1995), "Controlling the False Discovery Rate," JRSS-B.
- Version: 0.1.0
- Python: 3.10+
- Tests: 45 unit + 4 end-to-end Monte Carlo experiments, all passing.
- License: Apache-2.0.
Bug reports, feature requests, and PRs welcome. See CONTRIBUTING.md and CODE_OF_CONDUCT.md.
Security issues should follow SECURITY.md.