petri-labs / bench

petri-bench — can your model do science?

A contamination-proof benchmark for the scientific method of LLM agents: hypothesis isolation, controlled experimentation, inferential statistics, and calibrated claims — scored objectively, with no LLM judge. Every task's ground truth is a seeded random draw created and verified at generation time, so it cannot exist in any training corpus. The answer must be earned by experiment, not recalled.

Headline result: across 699 committed episodes — nine frontier models from five labs on 30 procedurally generated tasks, three episodes per task, identical agent loop — a one-factor-at-a-time sweep with informative test values beats every frontier model by 25–33 points on its completed task cells (paired Wilcoxon per model, all Holm-corrected p < 0.001), solves 100% of tasks, and no model solves above 52%. The ablation that locates the gap: the same sweep with test values drawn blindly from each parameter's legal range scores 40.5–47.7 across three value draws (mean 45.2) — below every model's mean in every draw. Intervention design and procedural discipline are both first-order: models choose values better than chance, then give the advantage back through procedure — skipped measurements, missing factorials, direction errors — all visible in the logs.

Leaderboard (standardized sweep v2 — tier-fair L3, n=3 episodes per task)

Models are ordered by the L1 mean — the one tier every model has completed at n=3. Some queues were paused mid-run to protect subscription quotas, so some cells are partial (episode counts shown in-cell); overall appears only for models with all three tiers complete, and solved/avg calls cover each model's recorded episodes. Small print gives the range of the three per-pass means on complete cells. Every number traces to a committed episode artifact.

solverepisodesL1 identifyL2 + magnitudeL3 interactionsoverallsolvedavg calls
adaptive (curated values)3094.894.287.592.2100%3.4
ofat (curated values; factorial at L3)3092.592.587.590.8100%4.0
gpt-5.6-sol (codex, xhigh)73/9076.7 73.2–80.547.3 44.8–51.444.0 n=13pending34%4.8
claude-opus-4.860/9072.2 68.5–76.257.9 54.3–64.6pendingpending37%5.0
claude-fable-5 (native tools)52/9072.2 65.8–80.040.5 n=22pendingpending52%6.1
gpt-5.5 (codex, xhigh)60/9069.9 66.5–72.553.0 47.7–59.8pendingpending37%4.4
glm-5.181/9068.0 61.5–75.263.9 57.4–68.066.7 n=21pending48%4.1
gemini-3.1-pro9064.4 52.2–74.565.5 59.6–69.144.1 40.2–50.158.049%6.3
claude-haiku-4.59063.1 55.5–76.559.6 50.8–66.359.5 56.0–65.160.736%4.5
claude-sonnet-4.669/9059.3 56.8–61.059.2 54.4–62.353.4 n=9pending38%3.5
ofat-rand (ablation: blind values; lowest of 3 draws, mean 45.2)3038.547.835.140.533%3.7
random (chance floor)3010.019.028.119.03%0

Score = correctness + method rigor (is the conclusion backed by a significant, isolating controlled experiment?) + efficiency, under a hard budget of 8 calls. All models run the identical agent loop (same brief, tools, budget, scoring). Transports: claude/gemini/glm CLIs on the frozen text protocol; codex sessions at xhigh reasoning effort; claude-fable-5 runs the same loop over native MCP tool-calling, because its safety layer deterministically flags text-serialized harness protocols — the finding, the isolation tests, and the transport are documented in the transport record. glm-5.2 joined the sweep and averaged 55.6 over its first 4 episodes before its queue was paused; it gets a row when its cells complete. Sweep v1's per-model L3 numbers were construct-invalid (the interaction tier was briefed with the single-factor instruction) — those 129 episodes are archived in-repo, and every L3 cell above comes from the tier-fair re-run.

What the evaluation found

Failure fingerprints (per model, over its recorded v2 episodes)

modelepisodessolvedwrong paramdirection errorsover-testedp-hackedprobe-only
gpt-5.6-sol (codex)732525211710
claude-opus-4.8602215192230
claude-fable-552271262605
gpt-5.5 (codex)602222162400
glm-5.1813921141210
gemini-3.1-pro904427124215
claude-haiku-4.5903233171100
claude-sonnet-4.6692631111601

p-hacked = the audit caught a submission that reads significant alone but survives only through redundant testing, failing a Holm correction across the episode's full test family. probe-only = the submission rests on matching the hidden world's output rather than an isolating controlled experiment. over-tested = redundant isolating tests (re-testing a parameter, or running more tests than candidates). The algorithmic solvers trigger zero flags; among models, process discipline is not ordered by capability tier or price — the cheapest model (haiku) still runs the cleanest process, gemini's chronic over-testing (42/90) replicates across scaffolds, and the newest, largest model on the board has the most distinctive fingerprint: claude-fable-5 measures compulsively (over-tests in half its episodes), leans on probes for its answers (5 probe-only submissions), and never once p-hacks — a cautious empiricist that pays its score away in method taxes.

How it works

Mystery worlds

Each task seeds one of five validated simulations (market, swarm, origin, morph, social) and secretly changes exactly one parameter (two at L3) from a revealed control config. The change is empirically verified significant at generation; decoys are verified inert. Deterministic per seed; byte-stable and CI-enforced.

A blind, budgeted harness

The agent gets four tools and 8 calls: experiment(A, B, metric) — a replicated controlled A/B returning statistics only (Mann-Whitney U, Holm-adjusted p, Cliff's delta; configs never echoed); probe(guess, metric) — compare a guess against the hidden world (deliberately confoundable); claim; submit.

Objective scoring

Correctness + method rigor — points only when the submitted parameter is backed by a significant experiment isolating exactly that parameter (L3: a genuine 2x2 factorial) — + efficiency. No LLM judge anywhere in the headline metric.

A process-integrity audit

A separate lens re-applies Holm across the episode's whole test family and distinguishes low power (honest, reported) from p-hacking (fishing: redundant tests behind a lone-significant submission). It also catches probe-only "output matching." Headline scores never hide it.

Audit everything

Every number above traces to a self-contained episode artifact {task, log, score, audit, provenance} — the full call log with statistics, the score breakdown, the integrity audit, and a provenance stamp pinning the exact engine versions and commit. Re-score any episode from its log alone.

Browse all episode artifacts · download the full set (zip) · read the tech report

The tech report documents sweep v1 in depth (design, validation, and the L1/L2 episodes, which are unchanged here); this page carries the v2 leaderboard — tier-fair L3, two new frontier models, and the corrected transport notes. The report's v2 revision lands when the paused cells complete.

The instrument underneath

The five simulations are not toys with sliders — each is validated, headless and reproducibly on every release, against an established result from its literature (19/19 checks): the Vicsek order-disorder transition (swarm), Cont's stylized facts of asset returns (market), Deffuant/Hegselmann-Krause cluster scaling (social), and the Pearson Gray-Scott phase diagram (morph). The same engines power the in-browser playgrounds and the petri-labs-mcp server the bench runs through.

validation 19/19 deterministic per seed frozen task specs, CI-enforced power-based difficulty ratings self-contained episode artifacts

Run it on your model

Any MCP client

{
  "mcpServers": {
    "petri-labs": {
      "command": "npx",
      "args": ["-y", "petri-labs-mcp"]
    }
  }
}

The bench composes only the public MCP tools — describe_model, run_experiment, run_simulation — so any agent that speaks MCP can attempt the tasks.

The harness CLI

# one task, by hand
bench task market 101 my-run
bench experiment my-run volatility \
  '{}' '{"chartFrac":0.6}'
bench submit my-run chartFrac up
bench score my-run

# a whole model, one command
bench sweep configs/frontier-v1.json
bench report && bench taxonomy

BYOK over HTTP (Anthropic/OpenAI-compatible) or drive a local CLI (codex / gemini / claude) through the same loop. Crash-safe resume; keys never leave your environment.

Cite

Archived at Zenodo: concept DOI 10.5281/zenodo.20618024. Tech report: HTML · PDF.

@software{petri_labs,
  title  = {petri-labs: validated model organisms and a
            contamination-proof benchmark for AI-driven science},
  author = {Sozudogru, Baris},
  doi    = {10.5281/zenodo.20618024},
  url    = {https://petri-labs.org},
  year   = {2026}
}