Epoch AI × Honesty.tools · batches 1 and 2
Right answers,
or give-away answers?
Epoch AI checks if a benchmark’s answers are right. We check if the questions give the answers away.
- GraphWalksNo give-away found
- Humanity’s Last ExamBatch 1 void. Batch 2: pass (grouped test borderline)
- SimpleQA VerifiedNot testable this way
Rules locked before any data was touched. Details and receipts ↓ · Independent of Epoch AI; they have not reviewed this page.
Status
Batch 2 on HLE: PASS. The grouped test was borderline. Its first plan failed its pre-run check and was not run. A revised plan passed that check, was locked, and ran on 28 October 2026. Details ↓
GraphWalks’ PASS says little: its node names are random hash codes, so we expected no give-away. HLE batch 1 is void because our shuffled-label safety check flagged, so the test may not give a verdict either way.
Two checks, two different properties
Epoch AI: Benchmark Reviews
Are the tasks and answer keys correct, and is the scoring sound? Each reviewed benchmark gets a verdict: Verified, Flawed or Not enough info. Their list had 22 benchmarks when we checked it on 27 October 2026 (5 Verified, 12 Flawed, 5 Not enough info). Epoch’s list ↗
Honesty.tools: the /audit cue test
Can simple surface probes, with no model, recover the scored labels from the item text alone? The verdict is DISQUALIFIED or PASS. It uses the same tool and thresholds as every row on /audit: nulltest.py v1.4, six probes, worst cell, family-adjusted p below 0.05.
These are different properties. A benchmark can have correct labels and still give them away, or wrong labels and not give them away. Where the two verdicts disagree, that is not a claim that Epoch is wrong. Epoch’s verdict is always shown as theirs, with a link, and never re-scored. A PASS from us means “no surface cue detected at this n”, not “clean”. A DISQUALIFIED means only that a model’s score on that benchmark needs a surface control to be read; it is not a finding of error or misconduct.
Where each benchmark landed
| Our verdict: DISQUALIFIED | Our verdict: PASS | |
|---|---|---|
| Epoch: Verified | VGEpoch Verified; labels recoverable from surface | VPEpoch Verified; no surface cue detected at this nGraphWalks (derived node-membership label) |
| Epoch: Flawed | FGEpoch Flawed; labels recoverable from surface | FPEpoch Flawed; no surface cue detected at this n |
Not on the grid: Humanity’s Last Exam (multiple-choice, text-only subset), VOID, because the shuffled-label control fired. Batch 2 used a different design, so its HLE result is below, not on this grid. SimpleQA Verified, not applicable. The rows are Epoch’s verdicts, as theirs, with their review dates. A benchmark is placed only if both of its controls come out as required.
Batch 1 results
Every number below is copied from results.json and REPORT.md. Tool: nulltest.py v1.4, hash-checked before each run.
GraphWalks: PASS, meaning no surface cue detected at this n
| Run | Result | Worst cell (probe / stratum) | A* | adjusted p |
|---|---|---|---|---|
| Main run6,714 items from 1,006 tasks; 10 cells; 600 permutations | PASS | words / bfs (n = 3,538) | 0.514 | 0.7854 |
| Planted-cue check4 seeds; 30% of label-1 items marked | caught 4 of 4 (valid) | length / bfs or parents | 0.650–0.656 | 0.0083 |
| Shuffled-label controllabels shuffled within each task | PASS (as required) | alpha_last / bfs (n = 3,538) | 0.511 | 0.7521 |
Both controls came out as required, so the main run counts: box VP, “Epoch Verified; no surface cue detected at this n”. This is not a validation of GraphWalks, and it adds nothing to Epoch’s Verified.
Why this PASS carries little information. Every node id is the first 10 characters of an md5 hash of a number. The ids look random by design and are all the same length (which is also why the length probe has nothing to score in the main run: 10 cells there, 12 in the planted copies). A cue would have to decode the hash, and none of the six probes does that. The pre-lock look at the id format, disclosed below, also applies to this result.
Deviation 1: parser fix. The plan said to read the queried node from the last line containing “Operation:”. In the data that line is a bare header, and the sentence naming the node is on the next line, so the literal rule dropped all 1,006 tasks. DEVIATION_1.md reads the next non-empty line instead; nothing else changed. It was written before any GraphWalks item file was built or scored, and Ford accepted it at 07:33 MDT, before scoring (DEVIATION_1_DECISION.md, sha256 041cf0243a2613d7437cf0a80195251af78f530769c2623fee737e090e42eac6). Under it, 0 tasks were dropped. 144 tasks with an empty answer were excluded (113 + 31), and 345 tasks were capped at 5 answer nodes.
Humanity’s Last Exam: VOID, no verdict
The run used 467 text-only multiple-choice questions, giving 3,164 answer options. We dropped 78 questions with images and 46 that failed parsing (8.97%, under the 10% cutoff). The shuffled-label control scrambles which option is keyed within each question, so it should come out PASS. It flagged: words / Humanities/Social Science, A* 0.70, adjusted p 0.023. The unshuffled main run flagged the same cell (A* 0.706, adjusted p 0.022).
The planted-cue rule was formally met (4 of 4), but it tells us nothing here: every planted copy fired on the same words / Humanities cell that fires without any plant. As the plan requires, an exploratory paired run (“exploratory, paired 0.1”) was also done. It came out PASS (A*pair 0.585, adjusted p 0.6211, 467 pairs) and has no effect on any verdict.
Exploratory, not pre-registered: why the control fired. This is a descriptive look at the flagged cell only (76 questions, 501 options). It is not a re-score, and the verdict stays void (EXPLORATORY_HLE_SHUFFLE.md).
- Within a question, the options look nearly the same. The keyed option was longer in 31 questions and shorter in 33. Word-count AUROC within questions is 0.49, about chance.
- The signal comes from differences between questions. Each question gives one keyed option and k−1 wrong ones, so questions with many options add many wrong options. Those options are short: 4.5 words on average in questions with 10 or more options, against 17.8 in five-option questions. The option count alone separates wrong from keyed at AUROC 0.61. Shuffling within a question keeps all of that.
- Limits: the rest of the gap, up to the cell’s 0.70, fits question-specific wording leaking between the test’s folds, but the note does not test that.
Next step: a batch-2 pre-registration with grouped folds, which keep each question’s options together, or with a constant label rate per question. That would be a new design, not a rerun of batch 1. Its first version failed its pre-run check and was not run. A revised version ran and passed; its grouped test was borderline (batch 2 below).
SimpleQA Verified: not applicable
Nothing was downloaded or run. Each row has one reference answer and no wrong answers, so there is no two-class label to test (see scope below).
Batch 2 on HLE: PASS (grouped test borderline)
Short version: the first plan failed its pre-run check, so it was not run. A revised plan passed that check, was locked, and was run. Jump to the result ↓
Version 1: not run
We also publish checks that did not pass.
Before batch 2 could touch any HLE data, its method had to pass a check on synthetic data. The check failed. So batch 2 was not run, as the rule we set in advance requires.
- The rule: each of the two tests must find a planted one-character cue in at least 40 of 50 synthetic datasets.
- The result: with the cue in 60% of questions, the all-options test found it in 49 of 50. The keyed-versus-one-wrong test found it in only 32 of 50.
- So: not enough power. Nothing was run on HLE or scored. No threshold was changed.
- False alarms: those checks passed. The limit was 9 of 200 per test.
Version 1 has no result on HLE. The batch-1 HLE result stays void.
Result, 28 October 2026: PASS. The grouped test was borderline. Neither test found an answer shortcut in HLE beyond what we’d expect by chance at this size. Answer length is the weakest spot.
This is version 2 of the batch-2 plan; version 1 was not run because it failed its own synthetic check. Every number below is copied from the score pack.
- Grouped test (all options, 467 questions, 3,164 options): PASS, borderline. The weakest spot is length, adjusted p 0.0466. The decision line is 0.025, so it passes, but it is close. We call a pass borderline when the adjusted p is from 0.0125 up to 0.05.
- Pair test (keyed versus one wrong, 467 pairs): PASS. The weakest spot is also length, adjusted p 0.2962.
- Planted copies: both tests found a one-character cue planted on the keyed answer in 75% of questions in 4 of 4 copies. The rule needed at least 3 of 4.
- Shuffle controls: both passed (grouped adjusted p 0.1614, pair 0.7488).
About answer length. Length was the weakest spot in both tests. In the grouped test, keyed options rank longer than the wrong options of the same question. This is descriptive only. It is not a detected cue under the locked rule, and it can’t be confirmed on these same items.
- Where it sits: in the grouped test, 1 of 54 cells was flagged: length within Math (83 questions, adjusted p 0.0241). In the pair test, no cell was flagged (length within Math, adjusted p 0.8684).
- This breakdown only says where to look. It never changes a verdict.
Limits.
- The method was checked only against a cue planted in 75% of questions. So a PASS says less than it would with a stronger check. It does not rule out a cue too small to detect at this size.
- This is the same HLE data as batch 1, tested a new way. It is not a replication, and not new evidence beyond batch 1’s data.
- Batch 2 was first pre-registered as v1, whose synthetic check failed (the keyed-versus-one-wrong test missed a cue planted in 60% of questions too often). v2 changed only the planted-cue strength the method must catch, to 75% of questions, after seeing that synthetic result. No batch-2 HLE result existed at either point.
Changes from the plan, written down before use.
- D6: the pair test’s written command would have split scoring by category, so we used the pooled version that the plan describes and the check validated, written down before any score existed. Decided 06:35 MDT, written 06:37:41 MDT, scoring began 06:38:34 MDT. D6 sha256
01a00c90f69ccac29c5d08f251128ca4dda2c162ed34045b1859915439be7af6. - D7: the locked secondary breakdown for the pair test ran after the main results were known, as the plan orders, and it can’t change a verdict. Written 06:45:05 MDT, run at 06:45:33 MDT. D7 sha256
22cb2c778c493263c02a00cc1e1bc9e42c502027a8b31b388dcac38f67f9d5d9.
Scored 28 October 2026, 06:38–06:46 MDT. The pack holds totals only: no question, answer or option text. Plan: PREREG_HLE_B2_v2.md. Downloads are in the file list below.
How the revised plan was set up
- What changed: one extra cue level, with the cue in 75% of questions. The plan says this level was picked by a rule fixed in advance, using a small synthetic pilot. Every threshold is unchanged.
- Timing: the 75% rule is written into the pilot script (b2v2_pilot.py, sha256
b7ac77c0…). File creation times on our server show the script was created 8 seconds before the pilot’s first output file was created. The 15:25 in the plan is a rounded log time. - The check: it passed. With the cue in 75% of questions, the all-options test found it in 50 of 50. The keyed-versus-one-wrong test found it in 49 of 50. The false-alarm checks passed again.
- The cost: the method is now shown to catch only a cue in 75% of questions. So a PASS on HLE says less.
- Locked: 28 October 2026, 06:15 MDT. PREREG_HLE_B2_v2.md sha256
fabb2cc3dcf571d2b412f0d221404529cef9b4c798cc98993cd6ade6b0973680.
The full check
Run on our DGX on 27 October 2026, 08:04–13:56 MDT. It used no HLE data. Every number is copied from B2_SIM_GATE.json and NOTE.md.
| Check | Pass mark | Result |
|---|---|---|
| Batch-1 problem reproducedprivate-word share 0.45 | at least 25 of 50 | 21 of 50, not reproduced, so 0.60 was tried |
| Batch-1 problem reproducedprivate-word share 0.60 | at least 25 of 50 | 25 of 50, reproduced, so 0.60 was used |
| False alarms, no cueshare 0.60 | at most 9 of 200 per test | all-options 0, one-wrong 5: pass |
| False alarms, no cueshare 0.75 | at most 9 of 200 per test | all-options 3, one-wrong 5: pass |
| False alarms, cue planted then labels shuffledshare 0.60 | at most 9 of 200 per test | all-options 1, one-wrong 6: pass |
| False alarms, cue planted then labels shuffledshare 0.75 | at most 9 of 200 per test | all-options 7, one-wrong 7: pass |
| Planted cue foundcue in 30% of questions | at least 40 of 50 per test | all-options 3, one-wrong 1: miss, so 60% was tried |
| Planted cue foundcue in 60% of questions | at least 40 of 50 per test | all-options 49, one-wrong 32: FAIL |
The rule gave no further step after the 60% level, so the outcome is NOT RUN.
| File | sha256 |
|---|---|
| B2_SIM_GATE.jsongate summary (download) | bca24958c511620a060ceeafa7abf43c29b3a82cfb7f3033b6631581f5bc7c2d |
| NOTE.mdplain note on the failed check | fb2ff35e9b20784b047f9e6da003e45b0c710b35bf83d10e98824c1bc48e0a67 |
| B2V2_SIM_GATE.jsonrevised plan: gate summary, passed (download) | e1932d45983e3d1e0345caa7c7aad5da9d491d93438d80c781c3c1317951b78a |
| PREREG_HLE_B2_v2.mdrevised plan, locked 06:15 MDT, 28 Oct 2026 (download) | fabb2cc3dcf571d2b412f0d221404529cef9b4c798cc98993cd6ade6b0973680 |
| b2v2_pilot.pyrevised plan: pilot script with the 75% rule (download) | b7ac77c063b2b626b25e1cd08b6fce8abbf1decbda57af0e3eec0b9cac3fae87 |
| PILOT_SUMMARY.jsonrevised plan: pilot result, synthetic only (download) | 22e802ed6cf970059ad930945bd920fac3fe89aaa06f4e273103ad43e89ea52e |
| publish_pack.tar.gzWhole score pack, v2 (all files below) | 13245e0941f5f589baf35cbe1eaccc1721d67903b88d73692057475b3e1c8b35 |
| README.mdv2 verdicts, length caveat, deviations | 184b980ba773717b9b26caa1b8ae26f8ef8b3c0f5514105b2106ef2eccc3319c |
| DEVIATION_D6_ARM_P_STRATUM.mdD6: pair test pooled | 01a00c90f69ccac29c5d08f251128ca4dda2c162ed34045b1859915439be7af6 |
| DEVIATION_D7_ARM_P_SECONDARY.mdD7: pair-test breakdown | 22cb2c778c493263c02a00cc1e1bc9e42c502027a8b31b388dcac38f67f9d5d9 |
| primary_G.jsonGrouped test, main score | e4dff8314b179610765b0443560e0f5f8b527fa908eebf930f867be231cd51fa |
| primary_P.jsonPair test, main score | 4470b02850da3ff8858f560e2f2094218815d299ffee64e62c1fbd29939a01a5 |
| SCORE_RUN.logCommands, times and output hashes | 06e33e9ec652bd48a19425b1d1734f2d3862d6ee98c3d8d821f52cebeea211c7 |
| SHA256SUMSHashes of every file in the pack, including all 14 score files | 87302795ee28d31b378b08dd9ea01a7414d6ce380749023ded4c6ea3688cac21 |
Check a file with sha256sum. The list is in SHA256SUMS.
What was in scope
| Benchmark | Epoch verdict (theirs) | What we test |
|---|---|---|
| Humanity’s Last Exammultiple-choice, text-only subset | Flawed11 Aug 2026 | One item per answer option, option text only, never the question. Can the keyed option be told from the others by its text alone? Questions with images are left out and counted. Epoch’s verdict covers HLE as a whole (they sampled 48 questions, 6 from each of 8 categories); ours covers only this subset. At the HLE dataset card’s request, the items stay internal and we publish only the numbers. |
| GraphWalksderived node-membership label | Verified29 Sep 2026 | GraphWalks has no two-class label, so we derive one from its own data: for each task, up to 5 answer nodes against the same number of other nodes from that task’s graph. Text is the node id only. Both files, 1,150 tasks; tasks with an empty answer are left out and counted. Carries the disclosure below. |
| SimpleQA Verified | Verified10 Sep 2026 | NOT APPLICABLE The test needs two classes per benchmark. Each SimpleQA Verified row has one reference answer and no wrong answers. If we built the wrong answers ourselves, the label would be ours, not the benchmark’s, so neither verdict would describe SimpleQA Verified. It stays off the grid, with this reason. |
Out of scope for this batch: the other 19 benchmarks Epoch has reviewed. The agentic ones (SWE-bench and the like) have no two-class text label for this test to score, and the grid has no row for a Not enough info verdict. Further benchmarks go in a new pre-registration.
Rules written first
The full plan is PREREG.md, settled and locked by Ford at 07:03:35 MDT on 27 October 2026 (13:03:35 UTC), from a draft by Abe (PREREG_DRAFT.md), and the scoping notes in SCOPE.md. It pins both by hash. The lock was private until this page published it. The locked file is never edited; any change goes in a separate, hashed deviation file written before the step it affects.
- No new thresholds. The tool’s own defaults: 600 permutations, alpha 0.05, worst cell, Westfall–Young correction. The run stops if the tool’s bytes differ from the pinned hash.
- Planted-cue check. On copies of each file we plant a one-character marker, as the tool’s own power test does, with 4 seeds. If fewer than 3 of 4 are caught, that benchmark is reported as INVALID, with no verdict.
- Shuffled-label check. Labels shuffled within each question or task should give a PASS. If it fires, that benchmark’s verdict is void.
- Fixed seeds for every random draw, listed in the plan.
- Power. At small n a PASS shows little; see /audit for what the test can see at each size.
What was seen before the lock
Ford, who settled and locked the plan, opened no benchmark items or labels; he used Hugging Face metadata, the GraphWalks dataset card, saved copies of Epoch’s review pages, and the tool’s own code and docs. No one had accessed any HLE data before the lock. Also before the lock, the draft’s author looked at two files, and the plan discloses it:
- SimpleQA Verified: its CSV (1,000 rows) was downloaded. No effect on any verdict, because SimpleQA Verified is not run.
- GraphWalks: the smaller of its two files was downloaded, and three facts were noted: 750 rows (400 “parents”, 350 “bfs”), 113 tasks with an empty answer, and that 3 node ids checked are the first 10 characters of the md5 of a small integer. No cue statistic was computed. But the GraphWalks design (text = node id) was chosen knowing the id format, so its result will carry this note wherever it is shown.
Files and hashes
Byte-identical copies of the locked plan and the batch 1 results, aggregates only. Check any file with sha256sum; the full list is in SHA256SUMS. No HLE question or answer text is published: HLE items, explain tables and per-item outputs stay on our internal machine. The saved Epoch pages and downloaded data are not published here either; their hashes are in raw/SHA256SUMS, which PREREG.md pins.
| File | sha256 |
|---|---|
| PREREG.mdlocked plan, 07:03:35 MDT | 76b3091cc177df8c63a97e3d0c8efaef82d1e84b50abdfec17a2ebb8b1dcbc16 |
| results.jsonbatch 1 results, all runs | 571d34a800a57516396c3924969163d279e9e9d2998970ba2d2599cd7d87b503 |
| REPORT.mdbatch 1 report | 9e683c257a4e82220231b9782fd666e24bfe677be5ada294c1d54ecdcdecdd69 |
| DATA_MANIFEST.jsondata sources, counts and file hashes | 6ec34b062337d2db58548a2318b1b6d3b24f193620177f6259aace24d45cbf0b |
| DEVIATION_1.mdGraphWalks parser fix | e43d6d35bf63bc908cbaa2ed45586044f1b1169ae6def3b89deebaaee219b661 |
| DEVIATION_1_DECISION.mdaccepted by Ford, 07:33 MDT | 041cf0243a2613d7437cf0a80195251af78f530769c2623fee737e090e42eac6 |
| EXPLORATORY_HLE_SHUFFLE.mdexploratory, not pre-registered | 31d74df7c7421e1f6e50a5e879c60be78680449513144e9d498821f0e27fccfb |
| SCOPE.mdscoping notes, pinned by PREREG.md | 1962f2c1f5815f4acf73f881bb2740d5727439551314d5c5bb9b52b909bd793a |
| PREREG_DRAFT.mddraft, superseded, pinned by PREREG.md | 08b0f28355c90cd749565575c642dee6f657cf56478670b626f33672dc1d4b84 |
| raw/SHA256SUMShashes of the internal Epoch snapshots and data, pinned by PREREG.md | e809e2116bddc414be21bd6bca0aefaaf628168c0e0c408909b470984472fc6f |
By Kevin Russell, Atlas, and the Honesty.tools team.