cert-machine · audit · the answer key · re-decided at this build

GSM8K’s answer key, re-decided to the last step.

Every harness that scores GSM8K compares a model’s number with the answer line of a stored solution, and the solution prints the arithmetic that reaches it: calculator annotations the authors inserted, and the prose steps between them. That arithmetic can be re-decided without a model and without a reader. This page evaluates all 4,282 annotations of the test set and 23,716 of the train set from the expressions they print, reads every prose equation with them in exact rational arithmetic, classes each item by whether its own steps reach its own answer, and sets the result beside GSM8K-Platinum, the human revision of the same test set.

tl;dr
  • The finding. The key’s arithmetic is clean where the humans looked, and slips where no model disagreed. All 4,282 test-set calculator annotations evaluate exactly to the value they print — not one is wrong, not one is rounded — and so do 23,714 of the 23,716 train-set ones (the other two use an operator the calculator grammar does not have and are refused, not guessed). Reading the prose steps too, 2 test keys and 24 train keys print a step that does not hold as printed — 364 / 4 = 273, $32 − $20 = $300 — and both test-set slips sit in items GSM8K-Platinum classes consensus: no frontier model disagreed with the answer, so no human ever read them. The converse holds too: every one of Platinum’s 10 relabelled answers has arithmetic that holds to the last step, and 103 of its 110 removed items are REPRODUCED here. Those errors are readings of the problem, not sums, and no re-decision of the arithmetic can find them. The two halves of a task-QA audit find different things, and the mechanical half costs three seconds.
  • The mechanism. An annotation <> is read as the expression its left side denotes — a hand-written parser for + − × ÷ and parentheses over stdlib fractions; nothing is ever passed to eval — and compared with the rational its right side denotes: EXACT, ROUNDED (within half a unit of the last printed place, and said so), WRONG, or REFUSED. A prose equation is a run of arithmetic characters around an “=”, read as a chain “a = b = c” pair by pair, with the notations GSM8K writers use — a spaced x as times, a dollar sign, a percent sign or the word “cents” as a unit label, “5 and 2/3” as a mixed number, “25 / 1/3” as 25 ÷ (1/3) — and anything cut off by a word, glued to a variable or otherwise unreadable is UNREAD, never a verdict. The answer line is read as the rational it denotes and compared with the last annotation’s value, then with every prose step’s. Platinum’s rows are joined to GSM8K’s by question text, exactly, and their three statuses cross-tabulated with this page’s classes.
  • Check it. python3 instruments/gsm8k/battery.py — 51 checks, 12 red controls that must fire (a planted wrong annotation, a value off by more than half a unit, division by zero, the // operator, a Python name and a power, the two named witnesses, a wrong step whose answer rests on it). python3 tools/run-gsm8k-ledger.py re-hashes the three pinned files and re-decides both sets in about three seconds.
annotations exact
4,282 / 4,282
test set; train 23,714 / 23,716, two refused for an operator outside the grammar
test keys whose steps reach the answer
1,257 / 1,319
1,207 by the last annotation, 50 by a prose step that checks exactly
a reader decides
60
47 answers that are no printed value (a unit change, a rounding up, algebra) and 13 keys with no step at all
printed steps that do not hold
2 test · 24 train
as printed; the answer rests on the wrong step in 1 test and 6 train keys, and is held by another step in the rest
Platinum’s relabelled answers with an arithmetic fault
0 of 10
every relabelling is a reading of the problem; the sums hold
answer keys in a form a harness misreads
0
every key is an integer as printed — 14 with thousands separators, 2 negative — and both pinned scoring rules read those forms
§1 · the two readings

Two audits of one test set, cell by cell

1,257 — the printed arithmetic holds and reaches the answer 60 — no fault, but the answer is no printed value (a reader decides) 2 — a printed step that does not hold as printed
The 1,319 test items in file order, classed by this page: green where every printed step holds and reaches the answer, amber where no step is wrong but the answer is not any printed value, plum where a printed step does not hold. Hover for the item, its class and Platinum’s status.
1,100 consensus — no model disagreed, never inspected 99 verified — inspected, kept 120 removed or relabelled
The same cells, classed by GSM8K-Platinum: green for the 1,100 items every frontier model got right (never inspected), amber for the 99 inspected and kept, plum for the 110 removed and the 10 relabelled.

The two pictures do not overlap where it matters. Platinum’s plum is where models and humans disagreed with the key about what the problem means; this page’s plum is where the key disagrees with itself about what its numbers add up to. The cross-tabulation:

Platinumitemsreproducedanswer in proseunderivedno stepsstep wrong
consensus1,10010084236122
verified99874710
revised1090100
removed1101034300

Of the 110 items Platinum removed as ambiguous or inconsistent, 103 have arithmetic that holds to the last step; so do 9 of the 10 it relabelled. The 2 keys that print a wrong step are both consensus items: every model reproduced the intended answer, so the flagging method — look only where a model disagrees — had no reason to open them. A typo no model copies is invisible to a model-flagged audit by construction.

§2 · the witnesses

2 test keys and 24 train keys print a step that does not hold

Each row is a step exactly as the key prints it, the value its left side actually has, the key’s answer, and whether that answer is still reached by some other step of the same key that does hold. Most are typos beside a correct calculator annotation (“6*2.5” beside <<6*3=18.00>>; “14*20=140” for 280); a few are unit slips (“100 * 0.75 = $0.75”, “5 * 3 = $15,000”) or a fraction divided the way it was not written (“500/ 2/5 = 200”). Two of the train rows read a day number and a week range as arithmetic (“day 1 * 2”, “Weeks 1-2”); they are listed rather than excused, because the rule that would exclude them is not one this page can state.

set · itemthe printed stepexactansweranswer held by another step
test · 501364 / 4 = 27391273yes
test · 1024$32 - $20 = $30012300no
train · 167192*100 = $1920192001920no
train · 1686*2.5 = $18.001554yes
train · 1986/3 = .5230no
train · 2244080 + 4080 / 2 = 4000 + 2040612020655yes
train · 5023/1 = 136yes
train · 716100 * 0.75 = $0.7575265yes
train · 30028*3 = 2402414yes
train · 3334$4200+$3000 = $860072007200no
train · 340910 x .5 = 1055no
train · 38595 * 3 = $15,0001590,000yes
train · 459314 / 1 / 4 = 14 * 47/24no
train · 46912*8 = 2416570yes
train · 4973200*.55 = 1001101100yes
train · 51955 x 1/2 = 105/21yes
train · 53961 * 2 = 202130yes
train · 57817+9+1+2 = $19.501978yes
train · 625610 x 1,248 = 11,4801248027yes
train · 65901-2 = 96 - 70-126yes
train · 67002 / 12 = .1251/61yes
train · 67133 x (8/16) = 63/218yes
train · 681250-8 = 44428yes
train · 6842500/ 2/5 = 2001250250yes
train · 71781152/ 1,536 = .53/41yes
train · 744414*20 = 140280280no

Nothing here changes an answer a harness grades against: in the test set the answer of item 501 (273) is the calculator annotation beside the slip, and item 1024’s 300 is the number the writer meant by “$320 − $20”. These are provenance findings about the key’s text — the kind a few-shot prompt copies into a model’s context verbatim, since both harnesses draw their examples from the train set.

§3 · the relabelled ten

Platinum’s ten corrections all have arithmetic that holds

Platinum changed the answer of ten test items after inspection. This page’s verdict on each original key:

itemGSM8K answerPlatinum answerits arithmetic, here
28834reproduced
40381135reproduced
454150240reproduced
649162000160000reproduced
74936reproduced
8231418reproduced
9523601800reproduced
10353540answer underived
1071251257reproduced
130922802180reproduced

Nine are REPRODUCED and one is ANSWER_UNDERIVED: in every case the printed steps compute what they say they compute, and the error — a rate read as linear, a quantity counted twice, a condition missed — lives in the step from the words to the first number, which no evaluation of the numbers can see. That is the precise boundary between the two halves of a task-QA audit, and this page stays on its side of it: nothing here calls a question ambiguous, and nothing here calls a relabelling right.

§4 · the train set

7,473 train keys, the few-shot pool of both harnesses

0 2,000 4,000 6,000 reproduced 6,981 answer in prose 200 answer underived 193 rounded step 2 printed step wrong 24 no steps 71 refused 2 train items (7,473)
The train set by class. The shape is the test set’s: 7,181 keys whose steps reach the answer, 264 for a reader, 28 with a printed step that does not hold, is rounded, or is refused.

The train set is not scored by anyone, but both harnesses draw their few-shot examples from it (gsm8k.py: ten shuffled train items in the system message; gsm8k.yaml: five). A key with a wrong printed step is then a worked example the model is shown. The 24 train slips are listed in §2; 18 of them stand beside a correct annotation that a calculator-using model would follow instead.

§5 · the graders

The key’s forms, read against two harnesses

Every test answer is an integer as printed: 1,303 plain, 14 with thousands separators (“2,125”, “1,450,000”), 2 negative; no decimal and no fraction, and the train set has the same shape. Read against the two scoring rules pinned by commit in the ledger: Inspect’s match(numeric=True) parses the target as a number and compares numerically — “2125” against “2,125” and “-3” against “-3” are CORRECT (observed on inspect_ai 0.3.266 on 2026-09-21) — and lm-eval strips commas from both sides before its exact match. No key is in a form either harness misreads. Forms a key could take that a grader would not read (a fraction, a percent sign) are observed in the ledger for completeness and occur in no answer line of either set.

what this page does NOT claim

No answer is called wrong: a step that does not hold as printed is a fact about the key’s text, and in every test case the intended answer is recoverable from the key itself. No question is called ambiguous; that is Platinum’s reading and it is reported, not re-decided. The prose reader is conservative by design — 318 test and 1,711 train equations it could not read are UNREAD and counted, never guessed — and two of the train witnesses are notation it read as arithmetic; they are listed with the rest. The harness observations are of two pinned commits on one date and say nothing about other versions. GSM8K is MIT-licensed and its files are held here verbatim for verification; Platinum’s rows were read through the Hugging Face datasets-server at the revision pinned in the corpus.