1 SCORE · 500 GRADED TASKS · 3 KINDS OF BOARD · 0 REQUIRED REFEREES

AI benchmarks:
how one score reaches the leaderboard

ONE LEADERBOARD ROW· mid-2026 ·
resolve rate·····································68.4%
WHAT THE CELL DOES NOT SAY
task set·····································SWE-bench Verified, 500 tasks
harness·····································one agent scaffold, 1 attempt
graded by·····································pytest, in a container per task
reported by·····································whoever ran it

Eight chapters and a scorecard. One task and the test that grades it, 500 containers and the percentage they produce, the pull request that is the submission form. Then the four postures of provenance, an arena with no answer key, contests written after every training cutoff, and what state of the art actually claims. The scenes play themselves so watch or just scroll. are tappable. You are the submitter.

00

One task, and the thing that grades it

At 09:00:00 your coding agent is handed a repository pinned at commit d16bfe0 and 340 words of issue text. It is handed nothing else. By Friday there will be a row with your name on it, on three different boards, each saying something slightly different. This tutorial follows that row, and it carries a running meter: Σ graded attempts, counting every task, contest problem and human vote scored on your model’s behalf. It starts at one.

STEP 01 / 05
09:00:00, ONE ISSUE AND A SEALED TEST
09:00:00 · one task instance, exactly as the agent receives it
astropy__astropy-12907given to the model
repo · astropy/astropy @ d16bfe0
issue · “Modeling’s separability_matrix does not compute separability correctly for nested CompoundModels” · 340 words
test patchsealed until grading
3 fields handed over · 1 field withheld · 0 hints

A is four fields: a repository URL, a base commit, the text of a GitHub issue, and a . Your agent is handed the first three. Instance astropy__astropy-12907 gives it the astropy repository pinned at one commit and 340 words describing a bug in how nested models compute separability. The fourth field stays sealed. It holds the tests written by the human who actually fixed this issue, and it is applied only after your agent has committed to an answer. That asymmetry is the whole design: the model is asked to reproduce a fix it cannot look up, and is marked against the real one.

the model is graded by a test it is never shown, taken from the pull request that really closed the issue
STEP 02 / 05
THE GRADER IS PYTEST, NOT A MODEL
grading runs pytest · two lists decide the instance
FAIL_TO_PASS · must flip to passing
test_separable[compound_model6-result6]
test_separable[compound_model9-result9]
PASS_TO_PASS · must stay passing
· test_coord_matrix
· test_cdot
· test_cstack
· … 15 more already green
grader: pytest exit codes · judge models involved: 0

Grading applies the test patch to whatever your agent produced and runs the suite. Two lists decide the outcome. names the tests that were failing before and must now pass, which is the proof the bug is fixed. PASS_TO_PASS names the tests that were already green and must stay green, which is the proof nothing else broke. Both lists must be satisfied. No rubric is consulted and no judge model is asked for an opinion, so two people running this instance on the same patch get the same answer every time.

SWE-bench’s grader is pytest exit codes, so the score contains no model’s opinion about anything
STEP 03 / 05
ONE CONTAINER PER TASK
one Docker image per instance · 500 images for 500 tasks
baseubuntu 22.04 + python 3.9.19
pinnednumpy 1.25.2 · scipy 1.11.1 · pytest 7.4.0
repoastropy @ d16bfe0, editable install
entrypointconda env “testbed”, activated
unpin one version and the score moves without the model changing

Each instance ships as its own Docker image: an operating system, a Python version, every dependency pinned to the version that was current when the issue was filed, and the repository installed in editable mode. This is not incidental packaging. The environment is half the benchmark, because a test that passes under scipy 1.11.1 and fails under 1.12 turns a correct patch into a zero. Benchmarks that let dependencies float produce scores that drift with the package index, which is why every serious task set now pins to a digest.

a dependency resolving to a different version is enough to move a published benchmark score, with no model involved
STEP 04 / 05
2,294 TASKS, AND 500 SURVIVED
93 Python developers screened SWE-bench, one instance at a time
SWE-bench, full
2,294 tasks
flaggedproblem statement underspecified38.3%
flaggedtests fail valid solutions61.1%
SWE-bench Verified
500 tasks
68.3% of the original tasks filtered out · 500 survived

The original SWE-bench holds 2,294 instances mined from merged pull requests, and a lot of them are unfair. OpenAI hired 93 experienced Python developers to read every one. They flagged 38.3% for problem statements too vague to solve from, and 61.1% for tests that would mark a valid solution wrong. In total 68.3% were filtered out, leaving the 500-instance called SWE-bench Verified, which is the one every launch post quotes. Keep that ratio in mind: the headline benchmark of agentic coding is the third of a benchmark that survived human review.

two thirds of the original SWE-bench tasks were thrown out as underspecified or unfairly graded
STEP 05 / 05
THE OUTPUT IS ONE BIT
one instance, one bit · resolved or not resolved
342 resolved158 not resolvedmean of 500 bits = 68.4%

Resolved, or not resolved. There is no partial credit for a patch that fixes half the bug, and no bonus for a patch that is tidier than the human one. Run all 500 and you have 500 bits; 342 of them come back resolved. The is their mean, 342 ÷ 500 = 68.4%, and that is the entire content of the sentence “68.4% on SWE-bench Verified”. Every leaderboard percentage you have ever read is an average of a column like this one. The next chapter runs the other 499 and watches what it takes to produce the number.

every leaderboard percentage you have ever read is the average of a column of yes/no bits
deep dive: what a task set is made of

Where instances come from. A miner walks a repository’s merged pull requests looking for ones that close an issue and touch test files. The code changes become the reference solution, the test changes become the test patch, and the issue body becomes the prompt. Nothing is written by hand, which is how you get 2,294 of them cheaply, and also how you get 1,794 unusable ones.

The issue text is the entire specification. There is no ticket description, no reproduction script and no maintainer to ask. If the human who fixed this bug had context from a mailing list thread, that context is gone. This is the single largest source of unfairness in mined benchmarks, and it is exactly what the 38.3% flag was measuring.

PASS_TO_PASS is the regression guard. Without it, a patch that deletes the failing assertion would score. With it, the agent has to leave the other 18 tests in the file alone. It is also the list most likely to fail for boring reasons: a warning promoted to an error, a timestamp in an assertion, a test that was already flaky before anyone got involved.

The variants. Beyond Verified there is Lite (a cheap 300-instance subset), Multimodal (front-end issues with screenshots), Multilingual (nine languages beyond Python) and Pro (longer, harder, commercially sourced tasks). They share a name and a repository layout, and nothing else.

What “solvable” hides. Many Verified instances have a reference fix of one or two lines. Screening removed the unfair tasks, not the easy ones, so a high resolve rate mixes genuine debugging with a fair number of one-line edits found by grep.

01

Five hundred containers and one percentage

Five hundred containers start, and eight hours later one number comes out of them. Everything between those two facts is configuration: how many turns the agent gets, how many attempts it is allowed, and what happens when a build fails. The meter climbs from 1 to 500 here, which makes this the only chapter where Σ and the headline number count the same things.

STEP 01 / 05
FIVE HUNDRED CONTAINERS, ONE NUMBER
the harness loop · repeated 500 times, once per instance
1build the image, check out the commit
2hand the agent the issue text
3let it work, up to the turn cap
4take whatever patch it has
5apply the test patch, run pytest
6record one bit
resolved
342 / 500
the turn cap is set by the harness, not the model · 342 ÷ 500 = 68.4%

The does the same six things 500 times: build the image, hand the agent the issue, let it work until it stops or hits the turn cap, take whatever patch it has at that moment, apply the test patch, record one bit. Notice who owns the turn cap. The harness does, not the model, so “how long is the agent allowed to think about this” is a benchmark setting rather than a model property. Eight hours later, 342 instances come back resolved and the run is over.

the harness decides how many turns the agent gets before its patch is taken, and that setting is not in the table
STEP 02 / 05
PASS@1 IS A DECLARATION, NOT A DEFAULT
same model, same 500 tasks, two declared protocols
PASS@1BEST@5
predictions per task15
selection stepnonepick by tests
metadata attempts12+
resolve rate68.4%higher
API bill×1×5
metadata.yaml · tags.system.attempts · you declare which one

means one prediction per task, scored as submitted. means several attempts plus a step that picks among them, and on maths boards the same fork appears as cons@64 or maj@k. The gap between them is large enough to reorder a leaderboard, so SWE-bench makes you say which one you did: tags.system.attempts is either 1 or 2+, and the checklist in your pull request repeats the question in words. A table that omits this column is comparing a model that got one try against a model that got sixty-four.

the submission form makes you tick a box saying whether the model got one shot or sixty-four
STEP 03 / 05
RUN IT AGAIN AND THE NUMBER MOVES
same model · same 500 tasks · same config · five runs
run 1336 / 50067.2%
run 2342 / 50068.4%
run 3345 / 50069%
run 4341 / 50068.2%
run 5346 / 50069.2%
66%the rail is four points wide70%
spread across five runs: 2.0 points · Terminal-Bench requires all five

Nothing here is deterministic. Sampling is stochastic, agents time out at different points, and container builds fail in ways that get counted as failures. Run the same model over the same 500 tasks five times with identical settings and the results land two points apart, which is why reported scores on this benchmark commonly differ by two to three points between groups who think they measured the same thing. Terminal-Bench draws the obvious conclusion and refuses single-run submissions: five runs, or no row.

Terminal-Bench will not accept a single run, because one run of a stochastic system is not a measurement
STEP 04 / 05
THE RULES YOU AGREE NOT TO BREAK
the submission checklist, pasted into your own pull request
[x]pass@1 submission, one prediction per task
[x]no use of FAIL_TO_PASS or PASS_TO_PASS
[x]no use of the hints field
[x]web browsing absent, or prevented from finding the fix
verified byyou, about yourself

Four boxes go into the pull request. You did pass@1. You did not read FAIL_TO_PASS or PASS_TO_PASS from the dataset. You did not use the hints field, which contains the maintainer comments from the original issue thread. Your agent either had no web access, or had it with steps taken to keep it from finding the commit that fixed the bug. Every one of these is checkable in principle from your trajectories and checked in practice by nobody, because the person confirming it is you.

the rule against looking up the real fix is enforced by a checkbox you tick about yourself
STEP 05 / 05
THE NUMBER HAS NO ERROR BAR ON THE PAGE
what the board prints, and what 500 binary trials support
PRINTED ON THE LEADERBOARD
68.4%
SUPPORTED BY THE SAMPLE SIZE
68.4% ±2.1
rival, 70.1%
√(0.684 × 0.316 ÷ 500) = 0.021 · the two intervals overlap

Five hundred binary trials at a rate of 0.684 carry a binomial standard error of √(0.684 × 0.316 ÷ 500) = 0.021, or 2.1 points. So the honest way to write the result is 68.4% ± 2.1, and a rival at 70.1% is inside that interval. The leaderboard prints 68.4% and a rank. This is the first of three places in this tutorial where a benchmark reports a point estimate for a quantity it measured with visible noise, and it will matter again in chapter 05 and chapter 07. Σ is now 500.

the standard error on a 500-task benchmark is about two points, and no leaderboard prints it
deep dive: the run configuration that never fits in the table

Turn caps and token budgets. A typical agentic harness allows a few dozen tool calls and caps total tokens per instance. Raise the cap and the resolve rate rises with it, up to a point, then flattens. Since the cap is a harness setting rather than a model property, two groups running “the same model” can be running two quite different experiments.

Build failures count against you. If the image fails to build or the container runs out of disk, the instance records as unresolved. On a bad day this alone moves a run by a point, and it is invisible in the final percentage.

Timeouts are silent failures. An agent that is still working when the clock stops has its current patch taken, which is usually empty or half-written. The distinction between “got it wrong” and “ran out of time” disappears into the same zero, and only the trajectories preserve it.

best@1 is not pass@1. The metadata schema distinguishes them: best@1 means you ran the model several times and reported the single best run, while declaring one attempt per task. It scores like a multi-attempt method and reads like a single-attempt one, so the field exists to force the disclosure.

Re-running somebody else’s submission is not free. A full agentic pass over 500 instances is hours of wall clock and real API spend. That cost is the practical reason independent verification is rare, and it comes back in chapter 04.

02

The score belongs to the pair, not the model

The row says a model name, and that is a compression. What got measured was a model and the program driving it, and the program is worth about twenty points either way. This chapter takes the same weights through a second board with a second set of rules, which is where Σ picks up another 445 graded attempts and where the first two published numbers about your agent stop agreeing with each other.

STEP 01 / 05
ONE MODEL, THREE HARNESSES, THREE NUMBERS
identical weights · three agent programs around them
minimal, 2 tools
bash + edit, 30 turns
54.8%
standard, 6 tools
+ search, tests, 75 turns
68.4%
tuned, 6 tools
+ retry on red tests, 120 turns
74.2%
19.4 points between the best and worst wrapper · one model throughout

Take the weights you just measured and wrap them in a different : fewer tools, a lower turn cap, no retry when the tests come back red. The resolve rate falls to 54.8%. Wrap them in a more generous one and it climbs to 74.2%. The model never changed. What the agent loop does between turns changed, and that was worth 19.4 points. Terminal-Bench responded to this by giving the scaffold its own column, so a row there names a model and an agent, because the pair is what got measured.

a Terminal-Bench row names a model and an agent, because the pair is the thing that was scored
STEP 02 / 05
89 TASKS, FIVE RUNS REQUIRED
Terminal-Bench 2.0 · 89 tasks · 5 runs required per submission
software engineeringsecurityscientific computingdata sciencedebugginggames… 10 more categories
Σ += 89 tasks × 5 runs = 445 graded attempts

Terminal-Bench 2.0 puts an agent at a shell inside a container and gives it 89 curated tasks across 16 categories: software engineering, security, scientific computing, data science, debugging, games. Nearly a hundred contributors built it under Stanford and the Laude Institute, and they sized it deliberately, keeping the tasks hard enough that frontier performance stays under half. A submission runs the whole set five times through the Harbor framework and mails in the job directories. Σ climbs by 89 × 5 = 445, to 945.

Terminal-Bench 2.0 was sized on purpose so that no model would clear half of it
STEP 03 / 05
THE FOOTNOTE MOVES MORE THAN THE MODEL
the settings that move a score, and how the table reports them
thinking budget···························not stated
tool access···························sometimes “with tools”
context window···························not stated
retries per task···························not stated
temperature···························not stated
scaffold version···························not stated
6 settings · 1 of them ever printed beside the number

Thinking budget, tool access, context window, retries, temperature, scaffold version. Six settings, each capable of moving a resolve rate by several points, and one of them occasionally appears beside a number, as the phrase “with tools”. That phrase is doing a lot of work: a model given a Python interpreter and a model given none are two different systems, and on maths benchmarks the gap between them is routinely larger than the gap between model generations. When a table lists one number per model, it has picked one configuration per model and thrown the rest away without saying so.

“with tools” and “without tools” are two different benchmarks wearing the same column header
STEP 04 / 05
SWE-BENCH IS NOT SWE-BENCH
six task sets · one name · no shared scale
EVERYTHING CALLED “SWE-BENCH”
Full·······································2,294 tasks, Python
Verified·······································500 tasks, human-screened
Lite·······································300 tasks, the cheap subset
Multimodal·······································front-end issues with screenshots
Multilingual·······································nine languages beyond Python
Pro·······································longer commercial tasks
a score on one says nothing about a score on another

At least six task sets answer to the name. Full is the 2,294 mined instances. Verified is the human-screened 500. Lite is a cheap 300 for iteration. Multimodal is front-end issues with screenshots, Multilingual covers nine languages beyond Python, and Pro is longer commercially sourced work. Different difficulty, different , no shared scale. This is how three sites end up naming three different leaders on what sounds like one benchmark: they are quoting three different task sets, and none of them is lying.

“SWE-bench” names at least six different task sets, and their scores do not compare
STEP 05 / 05
THE AGENT THAT ONLY WORKS ON THE BENCHMARK
the same three scaffolds, ranked by two different task sets
SWE-BENCH VERIFIED · PYTHON, PYTEST
1tuned scaffold74.2%
2standard scaffold68.4%
3minimal scaffold54.8%
TERMINAL-BENCH 2.0 · 16 CATEGORIES
1standard scaffold41.6%
2minimal scaffold38.9%
3tuned scaffold33.1%
the order inverts · the scaffold tuned for one task set is last on the other

Nothing stops you from tuning the scaffold to the shape of the task set. SWE-bench Verified is Python, pytest, one repository, one issue at a time, so a scaffold that assumes all four does well and then falls over on a benchmark where the agent has to install a package, read a manual page and drive a game. Rankings invert between task sets for exactly this reason. It is legal, it is cheap, and it is the main reason two boards disagree about which agent is best.

tuning the scaffold to one task set is legal and cheap, and it is the main reason boards disagree
deep dive: the scaffold variables that move a score

What Harbor standardizes. It fixes the container contract, the task format and the result schema, so two agents face an identical environment. It does not fix the agent: prompts, tool definitions, planning strategy and retry policy are yours. That line is deliberately drawn so the benchmark measures agents rather than devops.

Mini-agents versus frameworks. Some of the strongest SWE-bench submissions come from deliberately tiny scaffolds, a few hundred lines with bash and a file editor. The elaborate multi-agent frameworks often score lower, which is a useful result in itself and hard to see from a leaderboard that prints only the model name.

Why the columns split. Early leaderboards had one column and the community argued about attribution for two years. Boards that now separate model from agent did so because the alternative was unreadable: identical model names with twenty-point spreads and no way to tell why.

Version your scaffold like a dependency. If you publish a number, publish the commit of the agent that produced it. A resolve rate without a scaffold version cannot be reproduced by anybody, including you, six months later.

The cost of five runs. Requiring five passes over 89 agentic tasks multiplies the API bill by five. It is the right call statistically, and it is also a barrier to entry: the boards with the strictest protocols are the ones with the fewest independent submitters.

03

Where the tables live, and how you get a row

There are four places a benchmark table lives, and only one of them ever runs anything. What follows is the practical part: the addresses, the directory you commit, the fields you disclose, the badge that means less than it looks, and the six-field row you can actually defend. The meter stays at 945 the whole way through, which is the chapter’s point.

STEP 01 / 06
FOUR KINDS OF ADDRESS
four places a benchmark table lives
the benchmark author
swebench.com + a GitHub repo
runs a spot check
the framework
tbench.ai, via Harbor
validates your job dirs
the aggregator
llm-stats, CodeSOTA
transcribes numbers
the lab itself
the model’s launch post
ran it on itself
the dashed one publishes tables and executes nothing

A lives in one of four places. The benchmark’s own authors keep one, usually a static site backed by a GitHub repository: swebench.com publishes the table, SWE-bench/experiments holds the submissions. A framework keeps one, like tbench.ai for Terminal-Bench, where the board and the runner ship together. Aggregators keep one, collecting hundreds of models into a single sortable table. And the lab keeps one, in the launch post, which is where most numbers appear first and where most readers meet them.

the number you read most often lives on the launch post of the lab that produced it
STEP 02 / 06
A PULL REQUEST IS THE APPLICATION FORM
the directory your pull request adds to SWE-bench/experiments
evaluation/verified/20260803_myagent/·······················
all_preds.jsonl·······················one patch per instance
logs/<instance>/·······················patch.diff · report.json · test_output.txt
trajs/·······················every step the agent took
metadata.yaml·······················model, org, attempts, report link
README.md·······················the system, and who built it
5 required paths · then paste the get_results output into the PR

You open a pull request against SWE-bench/experiments adding one directory named evaluation/<split>/<date>_<model_name>. Inside it: all_preds.jsonl with one patch per instance, a logs/ folder holding patch.diff, report.json and test_output.txt for every instance, a trajs/ folder of , a metadata file and a README. Then you run python -m analysis.get_results and paste its output into the pull request body. The pull request is the application form, and one maintainer is the reviewer.

applying to the best-known coding leaderboard means opening a pull request against a GitHub repository
STEP 03 / 06
THE THINGS YOU HAND OVER
metadata.yaml · what you disclose to get a row
info:
name:my-agent + the model it drove
site:source code, if it is open
report:paper or blog post · mandatory
authors:the humans, by name
tags:
model:the LiteLLM model names used
os_model:are the weights open?
os_system:is the scaffold open?
system.attempts:1, or 2+
no technical report, no row · the maintainer also wants push access

The metadata file is the disclosure. It carries the entry name, a link to the source if the system is open, and a link to a technical report or blog post. It also carries the contributors by name, the exact model identifiers used, whether the weights are open, whether the scaffold is open, and the attempts count. The report is not optional: submissions without adequate documentation get rejected. You also grant the maintainer push access to your branch. And since November 2025, the Verified and Multilingual boards narrowed further, taking submissions only from academic teams with peer-reviewed publications, so for those two the answer to “how do I apply” is now “publish a paper first”.

since late 2025 the SWE-bench Verified board takes submissions only from academic teams with peer-reviewed work
STEP 04 / 06
THE AGGREGATOR RUNS NOTHING
one number, four pages · executions along the way: 1
the launch post
68.4%
ran it
aggregator A
68.4%
copied it
aggregator B
68.4%
copied A
a news article
68.4%
copied B
Σ graded attempts945unchanged by all four pages

Watch the meter through this step: it does not move. An aggregator reads a percentage off a launch post, puts it in a row, sorts by it and adds a rank. A second aggregator copies the first. A news article copies the second. Four pages now carry the number, and it was executed exactly once, by the party it describes. This is the dominant mode of every table you have ever scrolled, and it is why a figure appearing in many places is not corroboration. Σ holds at 945.

most leaderboard rows you read were never executed by whoever published the table
STEP 05 / 06
WHAT A BADGE ACTUALLY CERTIFIES
five badges, five boards, no shared definition
os_modelthe weights are downloadable
os_systemthe scaffold source is public
checkeda maintainer re-ran a random subset
Verified (ARC)trusted source, reproducible, splits agree
no badgemost rows on most boards
“verified” means something different on each one

The badges are not a standard. On SWE-bench, os_model and os_system say which halves of the system are open, and “checked” means a maintainer re-ran the submission on a random subset and got the same answer. On ARC Prize, “Verified” means something stricter: the run came from a trusted source, it is reproducible, and the public and semi-private scores agree within a stated tolerance. Two boards, two words, no shared definition, and most rows on most boards carry no badge at all.

there is no shared definition of a verified benchmark result across boards
STEP 06 / 06
THE ROW YOU CAN DEFEND
the six fields that make a number comparable
RESOLVE RATE · 68.4% · WITH ITS FOOTNOTES
split·······································SWE-bench Verified, 500 tasks
scaffold·······································my-agent @ 4f21ac9
attempts·······································pass@1
artifacts·······································logs + trajectories published
run by·······································us, on our own account
dated·······································2026-08-03
the average launch post publishes two of the six

If you publish a number yourself, six fields make it comparable to somebody else’s. Name the split. Name the scaffold and pin its commit. Declare the attempts. Publish the logs and the trajectories, which is the cheapest form of independence available to you. Say who ran it. Date it, because every figure in this field has a half-life. Any table missing one of the six is not comparable to another table, and the average launch post publishes two.

six fields make a benchmark number comparable, and the average launch post publishes two of them
deep dive: reading a submission directory

What the results script validates. analysis/get_results reads your predictions and logs, recomputes the resolve rate from the per-instance reports rather than trusting your summary, and cleans the directory into the layout the leaderboard renders from. If your claimed number and your logs disagree, this is where it surfaces.

Trajectories matter more than predictions. A patch tells a reviewer what your agent produced. A trajectory tells them how, including whether it opened a browser, read a test file it should not have, or got the answer on the first try because the fix was in its training data. Boards that require trajectories are asking for the only artifact that makes the honour-system checklist auditable.

Hosted leaderboards come and go. HuggingFace ran the Open LLM Leaderboard for years and retired it once the benchmarks under it saturated. A board is a maintained service, and when maintenance stops the table stops being a record of anything current.

Some submissions arrive by email. Terminal-Bench asks for five runs plus the job directories, sent to the maintainers for validation. It works, and it also tells you how much of this infrastructure is a handful of people reading attachments.

Rejection is normal. Missing report, missing logs, an implausible jump with no explanation, a scaffold nobody can inspect. The gate is one maintainer’s judgment, which is both the weakest part of the system and the reason the worst submissions never appear.

04

Nobody has to check the number

The default is that a lab runs the benchmark on its own model and publishes the result, and no one else touches it. Independence is not a property of the system; it is something a specific party pays for, one run at a time. This chapter sorts numbers by who made them, adds the first 500 attempts to Σ that you did not produce, and looks at two cases where the money and the task set came from the same place.

STEP 01 / 05
THE DEFAULT IS SELF-REPORTED
who is required at each step, by any rule anywhere
build the task set·······················the benchmark author
run the model·······················you
grade the output·······················your machine
publish the number·······················you
check the number·······················nobody
provenance of the 945 attempts so farself-reported

Walk the pipeline and ask who is required at each step. The benchmark authors built the task set. You ran the model. Your machine graded the output. You published the number. Who checks it? Nobody, and no rule anywhere says otherwise. There is no accrediting body for benchmark results, no audit requirement, no registration. Everything Σ has counted so far, all 945 attempts, is . That is not a scandal. It is the ordinary condition of the field, and it is the reason the rest of this chapter exists.

there is no accrediting body for AI benchmark results, and there never has been
STEP 02 / 05
FOUR POSTURES OF PROVENANCE
four postures · strength increases downward, and so does cost
1self-reportedthe lab, on its own model
2author-runthe benchmark’s own authors
3third-partya neutral harness, every model
4held-outtasks the model can never see
only the last one survives a model that has read the questions

Sort every number you read by who produced it. Self-reported: the lab ran the benchmark on its own model. Author-run: the benchmark’s own authors ran it, which removes the incentive but not the scaffold question. Third-party: an outfit like Epoch AI, Artificial Analysis or Vals AI runs every model itself on one harness, so at least the differences between rows are real. And : the model is scored on tasks it can never have seen. Strength increases down that list, and so does cost, which is why the top of it is where almost everything sits.

four postures of provenance, and only the last one survives a model that has already read the questions
STEP 03 / 05
SOMEONE ELSE RUNS THE SAME 500
same model · the same 500 tasks · two runners
us, on our own accountself-reported68.4%
our scaffold, our API version
a neutral harnessthird-party64.9%
their scaffold, their retry policy
3.5 points apart · neither party did anything wrong

A neutral harness re-runs the identical 500 tasks against the identical model and reports 64.9%. Yours said 68.4%. Neither party did anything wrong. Their scaffold has different tools and their API version is two weeks newer. Their retry policy gives up sooner, their sampling parameters differ, and refusals count as failures on their side. Σ climbs by 500 to 1,445, and this is the first entry on the meter that somebody other than you produced. A third-party number is not automatically the true one; it is a second measurement, and two measurements are how you find out the spread.

the same model on the same 500 tasks scores differently depending on who runs it
STEP 04 / 05
WHO PAID FOR THE BENCHMARK
FrontierMath · the order events actually happened in
·a lab funds the benchmarknot disclosed at the time
the benchmark is builtproblems written and held
the same lab gets the problemsverbal no-train agreement
a record is announcedfunding disclosed the same day
one holdout set retained · the record itself never independently verified

FrontierMath is a hard mathematics benchmark built by Epoch AI. In December 2024 Epoch disclosed that OpenAI had funded it, under an agreement that kept the funding quiet until the o3 announcement, the same announcement that set a record on it. OpenAI also had access to the problem set, covered by a verbal agreement not to train on it, and Epoch retained a separate holdout set. Epoch stated it had not been able to independently verify the result. Contributors said afterwards that they had not known who was paying. Nothing here requires bad faith to be a problem: the structure alone is enough to make the number hard to interpret.

the lab that set the record on FrontierMath had also funded it, and the funding was disclosed on announcement day
STEP 05 / 05
THE CLEAN SET WAS BUILT BY A CONTESTANT
SWE-bench Verified · who did which job
mined the 2,294 tasks···················an academic team
hired the 93 screeners···················a frontier lab
chose the surviving 500···················that lab’s annotation process
competes on the 500···················that lab, and every other
current mitigation: zero-data-retention terms and held-out splits

The same shape appears at the centre of this tutorial. SWE-bench Verified, the 500-task everybody quotes, was assembled by OpenAI with 93 hired developers deciding which tasks were fair. Every lab now competes on the set one of them curated. Again, this is structural rather than an accusation, and the field’s answer to it is contractual rather than technical: terms on the APIs that see unpublished tasks, held-out splits nobody gets, and written no-train agreements where a verbal one used to do. Chapter 06 is where those measures get real teeth.

the “clean” 500-task set everyone quotes was assembled by one of the labs competing on it
deep dive: the economics of an independent run

What zero-data-retention covers. It binds the API provider not to store or train on requests. It does not bind the model that already read the public half of the benchmark, and it does not survive a task set being published later. It is a control on the channel, not on the model.

Who pays for third-party runs. Somebody has to buy the tokens for every model on the board, repeatedly, as models ship. That bill is why neutral evaluators are few, why they are often funded by subscriptions or grants, and why their coverage of open models tends to lag their coverage of the big APIs.

Aggregate indices hedge the runner. If one evaluator’s harness has a quirk, an index combining many benchmarks dilutes it. It also dilutes the signal, and it introduces a new judgment call: the weights. Public, versioned methodology is the difference between an index and an opinion.

Logs are the cheap form of independence. You cannot make anyone re-run your submission, but you can publish every trajectory and let one curious reader find the instance where your agent read a file it should not have. Several corrections to published numbers have started exactly there.

“We could not verify this result.” When a benchmark author writes that sentence, it means the number on the board came from the model’s owner and the author had no access to reproduce it. It is the most informative sentence on many leaderboards and it is usually in a footnote.

05

No answer key, a thousand judges

What is being measured when there is no correct answer to compare against? Everything so far in this tutorial has had a grader that could be right: tests pass or they do not. The arenas throw that away and ask people which of two answers they prefer, then turn millions of those choices into a rating with an interval on it. Σ picks up 1,000 votes here, the first entries on the meter cast by humans.

STEP 01 / 05
A BENCHMARK WITH NO CORRECT ANSWER
one prompt · two anonymous answers · no answer key anywhere
model A · name hidden
model B · name hidden
A is betterB is bettertieboth are bad
graders: pytest 0 · humans 1 · what is measured: preference

You type a prompt. Two models answer side by side, names hidden. You pick A, B, tie, or both bad. In WebDev Arena the two answers are rendered web applications rather than text, so you are comparing running interfaces. There is no test patch here and no grader, because there is nothing to be right about: “write me a landing page for a bakery” has no reference solution. What accumulates is preference, and preference is a real signal about a different question than the one SWE-bench answers.

the arena has no answer key, so what it ranks is which answer people preferred
STEP 02 / 05
BRADLEY-TERRY, NOT CHESS ELO
Bradley-Terry rating · refit over every battle ever played
1,200 rating1,400 rating
100 votesrating 1,284±62 points
a model needs at least 1,000 votes before its rating settles

Ratings come from the , a win-probability model fit by maximum likelihood over the whole battle history at once. That is the difference from chess Elo, which updates incrementally and therefore depends on the order games were played: here a vote cast today can move a rating computed for a model from last year. The 95% intervals come from bootstrap resampling, and battles are reweighted so a heavily-voted pairing does not dominate. A model needs at least 1,000 votes before its rating stops drifting, and usually many more. Σ climbs by 1,000 to 2,445.

ratings are refit over every battle ever played, so a vote cast today can move a rating from last year
STEP 03 / 05
RANK 3 AND RANK 7 ARE THE SAME MODEL
five ranks · 95% intervals · vote counts on the right
rank 1
84,000 votes
rank 2
61,000 votes
rank 3
38,000 votes
rank 5
7,200 votes
rank 7
4,900 votes
rank 3 and rank 7 overlap · the gap between them is 13 rating points

Interval width is driven mostly by vote volume. A model with 84,000 battles carries an interval of a few rating points; a model with 4,900 carries one of 30 or more. So a table where rank 3 sits 13 points above rank 7 is showing you two models it cannot distinguish, and the arena says so in a column most readers skip. Ranks are assigned by significant separation rather than raw order, which is why you see several models sharing a rank number. Sorting is not the same as knowing.

a 25-point gap on the arena can be a statistical tie, and the leaderboard says so in a column most people skip
STEP 04 / 05
THE SCORE THAT REWARDS BULLET POINTS
the same votes, scored two ways
DEFAULT RANKING
1model V
2model W
3model X
4model Y
5model Z
length and markdown count
STYLE CONTROL
1model X
2model V
3model Z
4model W
5model Y
length and markdown removed
model X moves from third to first once formatting stops counting

Response length and markdown formatting predict votes independently of whether the content is any good. Longer answers with headers and bold text win more often than short correct ones. The arena’s answer is , a second ranking that regresses those features out, and models move several places between the two boards. When you read an arena number, the first question is which of the two you are looking at, because they are measuring different things and both are published under the same brand.

there is a second arena leaderboard with formatting preference removed, because bullet points win votes
STEP 05 / 05
THE APPLICATION IS AN ENDPOINT, NOT A FILE
applying to an arena · no predictions are uploaded
what you supply···················an OpenAI-compatible endpoint
for how long···················30 days, minimum
shown to voters as···················an anonymous codename
results during preview···················private to the provider
what you sign···················this model equals the one you ship
the last line was added after a preview model turned out not to be the shipped one

Nothing gets uploaded. A provider hands over an API endpoint, preferably OpenAI-compatible, for a minimum of 30 days. During preview the model appears to voters under an anonymous codename, and results go back to the provider privately until the model is released. And the provider must confirm in writing that the previewed model is identical to the one they intend to ship. That clause has a date attached: in April 2025 a lab put a variant tuned for human preference on the board, verbose and heavy on emojis, while shipping a different model to the public. The rule was written afterwards, and models tuned specifically for the arena are now barred.

the rule that the tested model must equal the shipped model exists because one lab shipped a different one
deep dive: preference data and its biases

Preference and accuracy come apart on hard prompts. On a question the voter cannot check, a confident wrong answer beats a hedged right one. That failure mode is structural, it gets worse as prompts get harder, and it is the main reason arena rank and benchmark rank disagree at the top.

Category boards are much thinner. The overall board may have tens of thousands of votes per model; coding, maths, vision and WebDev subsets are slices of that. Same methodology, far wider intervals, and the same rank column presented with the same confidence.

What a tie vote does. Ties carry information about two models being close and are included in the fit rather than discarded. “Both are bad” is different again: it says something about the prompt, and pairs where both sides fail tell you where the frontier actually is.

Who is voting. The population is self-selected people who chose to visit an LLM arena. Their preferences are real and they are not a random sample of your users, so an arena rating is evidence about general appeal rather than about your product.

Why the arenas matter anyway. They are the only large public evaluation where the test set is generated fresh by users every day, so there is nothing to contaminate. Chapter 06 takes that idea further.

06

Problems written after the training cutoff

Baku, September 2025, the ICPC World Finals: twelve problems written for that room, on that day. No amount of scraping helps, because the problems did not exist when the training data was collected. This chapter covers the three ways benchmarks buy that property, by date- stamping, by holding sets back, and by holding live contests, and it adds the last 132 graded attempts to Σ.

STEP 01 / 05
THE ONLY CLEAN SET IS THE UNWRITTEN ONE
every problem carries a release date · the model carries a cutoff
problems released earliertraining cutoffscoreable
score the model only on the problems to the right of the line

Every fixed public task set decays: it gets published, it gets scraped, it ends up in a training corpus, and the score stops measuring reasoning. The structural fix is to keep writing new problems. LiveCodeBench continuously collects fresh problems from LeetCode, AtCoder and Codeforces and stamps each with its release date, so you can evaluate a model only on work published after its training cutoff and watch the score change as the window moves. LiveBench does the same with new questions every month. The date stamp is the whole mechanism.

LiveCodeBench date-stamps every problem so you can score a model only on work that postdates its training data
STEP 02 / 05
TWELVE PROBLEMS, ONE ROOM
ICPC World Finals 2025, Baku · 12 problems, five hours
hour 1 of 512 of 12 solved
problem K: solved by a model, solved by no human team

The ICPC World Finals is the strongest version of that idea: problems written for one room on one day, with no prior existence anywhere. At the 2025 finals in Baku, an OpenAI reasoning system solved all twelve within the five-hour window. Gemini 2.5 Deep Think solved ten, and one of its ten was a problem that no human team solved at all. Σ climbs by 12. Twelve graded attempts is a tiny sample and it is also the least contaminable evidence in this entire tutorial, which is the trade you make when you move from task sets to contests.

at the 2025 ICPC World Finals a model solved a problem that no human team solved
STEP 03 / 05
THE HUMAN WHO STILL WON
AtCoder World Tour Finals 2025 · heuristic track · ten hours
Psyho, human
45.2 billion points
the model entry
43.0 billion points
the human finished about 5% aheadIOI 2025, same year: a model placed 6th of 330, at gold-medal level

The same year, at the AtCoder World Tour Finals in Tokyo, the heuristic track ran humans and an OpenAI entry against the same optimisation problem for ten hours. Przemysław Dębiak finished first with roughly 45.2 billion points to the model’s 43 billion, about 5% ahead. At the International Olympiad in Informatics that year a model placed sixth out of 330 entrants, at gold-medal level. Read those two results together: the model is inside the top ten of the strongest human field available, and the top of that field was still ahead in the track that rewards ten hours of judgment.

in the 2025 AtCoder heuristic finals one human finished about 5% ahead of the model, after ten hours
STEP 04 / 05
THE SET NOBODY SEES
ARC-AGI-2 · three splits, calibrated to be statistically alike
publicopen, downloadableanyone, including trainers
semi-private120 tasksAPIs under zero-retention terms
private120 tasksthe competition sandbox only
the private run: Kaggle, 12 hours, four L4 GPUs, no internet

ARC-AGI-2 keeps three sets. The public set is open, for development. The set of 120 tasks scores frontier models through their APIs and is never published, which is what the zero-data-retention terms are for. The private set of 120 is competition only. All three are calibrated to be statistically similar, so a score on one is comparable to a score on another, which is the property that makes a held-out set useful rather than merely secret. The competition itself runs on Kaggle: twelve hours of wall clock, four NVIDIA L4 GPUs, and no internet access, so the tasks physically cannot leave the sandbox. Σ climbs by 120 to 2,577.

the private ARC set is graded on machines with no internet, so the tasks cannot leak out
STEP 05 / 05
THE PRICE CAP IS PART OF THE BENCHMARK
ARC Prize reports accuracy and cost in the same row
SEMI-PRIVATE EVALUATION · CAP $10,000 PER RUN
entry A·······································18.6% · $3.40 per task
entry B·······································21.2% · $47.10 per task
entry C·······································24.9% · capped out mid-run
entry C bought more search than the cap allows, so it has no score

ARC Prize caps a single semi-private evaluation run at $10,000 and prints cost per task next to accuracy. That is not administrative tidiness. On a benchmark where you can spend more compute per task to search harder, accuracy without cost is not a result, because any score can be bought by anyone willing to pay enough per puzzle. The cap turns the benchmark into a question with two axes, and it is the clearest example in this tutorial of a benchmark author designing against the way their own measure would otherwise be gamed.

ARC Prize refuses to run an evaluation that would cost more than $10,000
deep dive: keeping a task set fresh

Contests are strong evidence and weak measurement. Twelve problems is a sample size that would embarrass any other chapter of this tutorial, and the conditions cannot be reproduced next Tuesday. What they buy is the one thing no task set can: certainty that nobody had seen the questions.

Codeforces ratings as a continuous axis. Rather than a percentage, a rating places a model in the distribution of human competitors. It moves with every contest, it has no ceiling, and it is directly interpretable by anyone who has competed. Chapter 07 comes back to metrics shaped like this.

Algorithmic versus heuristic tracks. Algorithmic problems have a correct answer and reward finding it fast. Heuristic problems have no known optimum and reward ten hours of incremental improvement. Models have been much stronger at the first than the second, which is why the AtCoder result reads differently from the ICPC one.

Offline sandboxes as a control. No internet means no retrieval of a published solution and no phoning home with the task text. It also rules out the largest models, since whatever runs has to fit on four GPUs, so the sandbox selects for a different kind of entry than an API leaderboard does.

Rolling benchmarks are expensive to keep. Somebody has to source, validate and containerise new problems forever, and re-score every model on every window. A rolling benchmark that stops rolling becomes a fixed benchmark with a misleading name.

07

State of the art is a claim with a date on it

State of the art asserts one thing: the highest published score on a named benchmark, on a named split, under a named protocol, as of a named date. Everything difficult about the phrase comes from how easily those four qualifiers fall off. Σ stops moving here at 2,577, because aggregating and ranking grade nothing new; they only rearrange what the previous seven chapters produced.

STEP 01 / 05
SOTA NAMES A TABLE CELL
“state of the art” · the four qualifiers under the claim
the headline···························“state of the art on coding”
benchmarkSWE-bench, not Terminal-Benchwhich skill
splitVerified, not Full or Prowhich 500 tasks
protocolpass@1, one scaffoldhow many tries
date3 August 2026how long it holds
drop all four and the sentence still parses, which is the problem

asserts exactly one thing: the highest published score on a named benchmark, on a named split, under a named protocol, as of a named date. Four qualifiers. A headline keeps the model name and drops all of them, and the sentence still reads fine, which is why two “state of the art on coding” claims from the same week routinely turn out to be about different task sets measured different ways. Attach the four and most disagreements about which model is best dissolve into which cell somebody was quoting.

state of the art is a property of a table cell, not a property of a model
STEP 02 / 05
THE REGISTRY THAT HELD 9,327 BOARDS
Papers with Code · shut down without notice, July 2025
benchmark leaderboards···························9,327
paper-to-code links···························79,817
successor registry···························none
data frozen on GitHub and HuggingFace · nothing added since
the domain now redirects to a trending-papers page

For a decade the nearest thing to a canonical registry was Papers with Code: 9,327 benchmark leaderboards and 79,817 links between papers and their implementations, free to use, the place you went to check whether a claimed record was actually a record. Meta shut it down in late July 2025 without notice. The data is frozen on GitHub and HuggingFace, the domain redirects to a trending-papers page, and nothing has replaced it. So when somebody says a model is state of the art, there is now no shared place to look it up, and the claim rests on whoever is repeating it.

the closest thing to an official SOTA registry shut down in July 2025 and nothing replaced it
STEP 03 / 05
WHEN THE EXAM STOPS DISCRIMINATING
best published score, at launch and now · the ceiling is 100%
MMLU
launched 2020 · 43% then
92%
SWE-bench Verified
launched 2024 · 33% then
72%
Humanity’s Last Exam
launched 2025 · 2.7% then
25%
headroom left, top to bottom: 8 points · 28 points · 75 points

A benchmark is useful while it has . MMLU launched in 2020 with the best models near 43% and now sits above 90% for everything at the frontier, which is : it can no longer tell two good models apart. Humanity’s Last Exam was built as the reply, 2,500 questions from nearly a thousand experts across more than 500 institutions in 50 countries. At launch in early 2025 the best score was 2.7%. A year later it is around a quarter. The evals tutorial covers what saturation does to your own test suite; here the point is narrower. Check headroom before you read a rank.

Humanity’s Last Exam went from 2.7% solved to roughly a quarter solved in about a year
STEP 04 / 05
THE CLUSTER AT THE TOP
the top six rows, drawn with the error bar the board omits
1st, 72.6%
2nd, 71.8%
3rd, 70.9%
4th, 70.1%
5th, 69.2%
6th, 68.4%
4.2 points from 1st to 6th · every interval overlaps its neighbours

Draw the top six rows of a 500-task board with the ±2.1 error bar from chapter 01 and they form one blur. First place is 4.2 points above sixth, every interval overlaps its neighbours, and the ordering would shuffle if everyone re-ran tomorrow. The arena has the same shape for a different reason: intervals there are set by vote volume, and the thinly-voted rows carry ±30 rating points. Rank is the least informative column on either page, and it is the one every summary quotes.

when six models sit inside one error bar, the rank column is sorting noise
STEP 05 / 05
THE AXES THAT CANNOT SATURATE
METR’s 50% time horizon · the task length a model finishes half the time
1 s1 min10 min1 h4 h16 h
measured against timed human experts on 100+ tasksdoubling roughly every seven months since 2019 · unreliable above 16 h

Two responses to the ceiling problem. Aggregate indices, like Epoch AI’s capabilities index, combine many benchmarks into one versioned scale, so no single saturated exam decides the ordering. And continuous axes measure something with no maximum: METR’s 50% is the human-expert task length a model completes half the time, measured on over a hundred software, machine-learning and cybersecurity tasks against timed human baselines. It has doubled roughly every seven months since 2019, faster since 2024, and METR states that measurements above 16 hours are unreliable with the current task suite. A duration cannot reach 100%, so this metric does not expire the way a percentage does. It just gets harder to measure.

METR measures capability in task length instead of percent, because a clock has no ceiling
deep dive: aggregate indices and continuous axes

An index needs a version number. Combining benchmarks means choosing weights, and changing the weights changes the ordering. An index with public, versioned methodology is a measurement; one that reweights without saying so is an opinion with a chart.

Doubling times are fragile. A trend fitted over six years is sensitive to how tasks are sampled, how human baselines are timed, and which models count as frontier. Treat “doubling every N months” as a description of the data collected so far rather than a law.

Report the score with its cost and date. Three fields together are a result: what it scored, what it cost per task, and when. Any one of them alone is decoration, and cost is the one most often missing precisely because it is the one that constrains the claim.

Negative headroom exists too. A benchmark where every model scores near zero also fails to discriminate, and it is easy to mistake for a hard benchmark that is working. The useful window is the middle, which is exactly why Terminal-Bench sized itself to keep frontier scores under half.

Benchmarks have half-lives now. MMLU took about four years to saturate. Humanity’s Last Exam has moved an order of magnitude in one. Plan for any benchmark you adopt to stop discriminating within roughly two years, and write your reporting so that swapping it out does not invalidate your history.

Σ

Your row, with every footnote attached

The cell from the hero, with everything the cell does not say written underneath it. The right margin says which chapter earned each line. Of the 2,577 graded attempts on the meter, you produced 945, a third party produced 620, humans cast 1,000 votes, and a contest posed 12 problems. The headline quotes 500 of them.

ONE LEADERBOARD ROW, FULLY ANNOTATED · SWE-BENCH VERIFIED · MID-2026
task instance·······································repo@commit + issue + sealed test patch00
grader·······································pytest · FAIL_TO_PASS + PASS_TO_PASS00
task set·······································500 of 2,294, screened by 93 developers00
resolve rate·······································342 of 500 = 68.4%01
standard error·······································±2.1 points on 500 binary trials01
attempts declared·······································pass@101
scaffold·······································one agent, named and pinned02
second board·······································Terminal-Bench 2.0 · 89 tasks × 5 runs02
submission·······································a pull request: preds, logs, trajs, metadata03
runs performed by aggregators·······································003
provenance·······································self-reported, then re-run by a third party04
independent re-run·······································same 500 tasks, 3.5 points apart04
arena votes·······································1,000 blind pairwise votes05
arena interval·······································wide enough to swallow four ranks05
held-out tasks·······································120 semi-private, graded offline06
contest problems·······································12, written after every cutoff on the board06
cost cap·······································$10,000 per evaluation run06
what SOTA claims·······································benchmark + split + protocol + date07
Σ graded attempts·······································2,577 · quoted by the headline: 500
referees required·······································0
row filed
Read next. AI evals for the test suite you build for your own product, once you have decided the public boards cannot answer your question, and Claude Code for what the scaffold in chapter 02 is actually doing between turns.
2,577 graded attempts behind one cell · re-run it yourself