HONESTY.TOOLSAn independent research observatory

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.

Rules locked before any data was touched. Details and receipts ↓ · Independent of Epoch AI; they have not reviewed this page.

Status

Status: batch 1 run on 27 October 2026 (HLE 07:23–07:29 MDT, GraphWalks 07:33:58–07:35:17 MDT) under rules locked at 07:03:35 MDT, PREREG.md sha256 76b3091cc177df8c63a97e3d0c8efaef82d1e84b50abdfec17a2ebb8b1dcbc16. One deviation (a GraphWalks parser fix, accepted before scoring) and one earlier look at the data are disclosed below. Not signed, not anchored in Rekor. Files and hashes ↓

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: DISQUALIFIEDOur verdict: PASS
Epoch: VerifiedVGEpoch Verified; labels recoverable from surfaceVPEpoch Verified; no surface cue detected at this nGraphWalks (derived node-membership label)
Epoch: FlawedFGEpoch Flawed; labels recoverable from surfaceFPEpoch 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

RunResultWorst cell (probe / stratum)A*adjusted p
Main run6,714 items from 1,006 tasks; 10 cells; 600 permutationsPASSwords / bfs (n = 3,538)0.5140.7854
Planted-cue check4 seeds; 30% of label-1 items markedcaught 4 of 4 (valid)length / bfs or parents0.650–0.6560.0083
Shuffled-label controllabels shuffled within each taskPASS (as required)alpha_last / bfs (n = 3,538)0.5110.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).

What that means: the test fires even when the answer key is scrambled, so what it picks up is not about which option is right. Under the pre-registration the result is void. The test is not allowed to give a verdict on HLE, and this says nothing either way about whether HLE’s answers can be found from surface cues. HLE stays off the grid.

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.

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.

CheckPass markResult
Batch-1 problem reproducedprivate-word share 0.45at least 25 of 5021 of 50, not reproduced, so 0.60 was tried
Batch-1 problem reproducedprivate-word share 0.60at least 25 of 5025 of 50, reproduced, so 0.60 was used
False alarms, no cueshare 0.60at most 9 of 200 per testall-options 0, one-wrong 5: pass
False alarms, no cueshare 0.75at most 9 of 200 per testall-options 3, one-wrong 5: pass
False alarms, cue planted then labels shuffledshare 0.60at most 9 of 200 per testall-options 1, one-wrong 6: pass
False alarms, cue planted then labels shuffledshare 0.75at most 9 of 200 per testall-options 7, one-wrong 7: pass
Planted cue foundcue in 30% of questionsat least 40 of 50 per testall-options 3, one-wrong 1: miss, so 60% was tried
Planted cue foundcue in 60% of questionsat least 40 of 50 per testall-options 49, one-wrong 32: FAIL

The rule gave no further step after the 60% level, so the outcome is NOT RUN.

Filesha256
B2_SIM_GATE.jsongate summary (download)bca24958c511620a060ceeafa7abf43c29b3a82cfb7f3033b6631581f5bc7c2d
NOTE.mdplain note on the failed checkfb2ff35e9b20784b047f9e6da003e45b0c710b35bf83d10e98824c1bc48e0a67
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, deviations184b980ba773717b9b26caa1b8ae26f8ef8b3c0f5514105b2106ef2eccc3319c
DEVIATION_D6_ARM_P_STRATUM.mdD6: pair test pooled01a00c90f69ccac29c5d08f251128ca4dda2c162ed34045b1859915439be7af6
DEVIATION_D7_ARM_P_SECONDARY.mdD7: pair-test breakdown22cb2c778c493263c02a00cc1e1bc9e42c502027a8b31b388dcac38f67f9d5d9
primary_G.jsonGrouped test, main scoree4dff8314b179610765b0443560e0f5f8b527fa908eebf930f867be231cd51fa
primary_P.jsonPair test, main score4470b02850da3ff8858f560e2f2094218815d299ffee64e62c1fbd29939a01a5
SCORE_RUN.logCommands, times and output hashes06e33e9ec652bd48a19425b1d1734f2d3862d6ee98c3d8d821f52cebeea211c7
SHA256SUMSHashes of every file in the pack, including all 14 score files87302795ee28d31b378b08dd9ea01a7414d6ce380749023ded4c6ea3688cac21

Check a file with sha256sum. The list is in SHA256SUMS.

What was in scope

BenchmarkEpoch verdict (theirs)What we test
Humanity’s Last Exammultiple-choice, text-only subsetFlawed11 Aug 2026One 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 labelVerified29 Sep 2026GraphWalks 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 VerifiedVerified10 Sep 2026NOT 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.

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:

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.

Filesha256
PREREG.mdlocked plan, 07:03:35 MDT76b3091cc177df8c63a97e3d0c8efaef82d1e84b50abdfec17a2ebb8b1dcbc16
results.jsonbatch 1 results, all runs571d34a800a57516396c3924969163d279e9e9d2998970ba2d2599cd7d87b503
REPORT.mdbatch 1 report9e683c257a4e82220231b9782fd666e24bfe677be5ada294c1d54ecdcdecdd69
DATA_MANIFEST.jsondata sources, counts and file hashes6ec34b062337d2db58548a2318b1b6d3b24f193620177f6259aace24d45cbf0b
DEVIATION_1.mdGraphWalks parser fixe43d6d35bf63bc908cbaa2ed45586044f1b1169ae6def3b89deebaaee219b661
DEVIATION_1_DECISION.mdaccepted by Ford, 07:33 MDT041cf0243a2613d7437cf0a80195251af78f530769c2623fee737e090e42eac6
EXPLORATORY_HLE_SHUFFLE.mdexploratory, not pre-registered31d74df7c7421e1f6e50a5e879c60be78680449513144e9d498821f0e27fccfb
SCOPE.mdscoping notes, pinned by PREREG.md1962f2c1f5815f4acf73f881bb2740d5727439551314d5c5bb9b52b909bd793a
PREREG_DRAFT.mddraft, superseded, pinned by PREREG.md08b0f28355c90cd749565575c642dee6f657cf56478670b626f33672dc1d4b84
raw/SHA256SUMShashes of the internal Epoch snapshots and data, pinned by PREREG.mde809e2116bddc414be21bd6bca0aefaaf628168c0e0c408909b470984472fc6f

By Kevin Russell, Atlas, and the Honesty.tools team.