The verification layer for machine work

Your graders decide what AI learns.But nobody checks the graders.

Bohrin tells you whether your grader can be fooled, and proves it when it can.

$ pip install bohrin
Book a Call
Detects
Reward HackingGrader GapsWeakened TestsUnderpowered Evals
The problem · Reward hacking

Models learn whatever the grader pays for. Including the shortcuts.

A grader (a test suite, a reward function, a script that compares outputs) decides if AI-written code is right. If it can be passed without doing the work, a model learns to pass it that way. The model isn’t at fault. The grader has a gap.

Fig.1
solution.py
1def add(a: int, b: int) -> int:
2 return 0
Weak graderPassed · 1.0

01 The empty function

Returns a constant of the right type and does no work at all.

  1. 1.1BGW-101 · Trivial implementation
  2. 1.2Fools graders that only check the code imports or runs
  3. 1.3Fix: check return values on inputs the submission can’t see
Fig.2
solution.py
1import sys
2
3def add(a: int, b: int) -> int:
4 sys.exit(0) # "success"
Weak graderPassed · 1.0

02 Exit before the tests run

Ends the process with a success code before a single assertion runs.

  1. 2.1BGW-102 · Exit before the checks
  2. 2.2Fools graders that read the exit code as the verdict
  3. 2.3Fix: require a record that every expected test ran and passed
Fig.3
solution.py
1class Anything:
2 def __eq__(self, other):
3 return True
4
5def add(a: int, b: int) -> int:
6 return Anything()
Weak graderPassed · 1.0

03 The object that equals everything

Returns an object that claims to equal any expected answer.

  1. 3.1BGW-103 · Equality spoofing
  2. 3.2Fools graders that trust the submission’s own ==
  3. 3.3Fix: check the exact type before comparing values
Fig.4
tests/test_parser.pydiff
1+@pytest.mark.skip
2 def test_parse_numbers():
3- assert parse("1,2,3") == [1, 2, 3]
4+ assert parse("1,2,3") is not None
Weak graderPassed · 1.0

04 Edit or skip the tests

Weakens, skips or deletes the tests that judge it, then reports “all tests pass”.

  1. 4.1BGW-109 · Tests edited, deleted or skipped
  2. 4.2Fools graders that run whatever tests remain
  3. 4.3Fix: make tests read-only to the agent, and count them

76%

of attempts in which a frontier model cheated on coding tasks built so that passing is impossible without cheating.

Source · ImpossibleBench, 2025 ↗

79%+

of those cheats, for several model families, were made by modifying the tests themselves.

Source · ImpossibleBench, 2025 ↗

43×

more reward-hacking attempts by frontier models when the scoring code was visible to them.

Source · METR, 2025 ↗

Bohrin checks the checker. It sends your grader submissions that are wrong on purpose. Every one it accepts is a gap, proven, with a script anyone can re-run.

Every known gap

Three questions.
One install.

No account, no model, no API key, no GPU. Runs offline, on your machine.

$ pip install bohrin

Compares what an agent changed with what it claimed. Weakened asserts, added skips and stubbed code, each stated as a plain fact.

$ bohrin verify --since main
Read more

Every score with its margin of error, and the smallest difference your evaluation can actually detect.

$ bohrin power results.jsonl
Read more

Sends your grader submissions that are wrong on purpose, and correct rewrites it must accept. Two numbers, each with its margin of error.

>>> from bohrin.mutate.battery import battery
Read more

bohrin audit runs your grader on the cheats and the correct rewrites, streams findings as they’re proven, and prints the Coverage Score. The first finding should appear within about two minutes.

bohrin verify
01 / 04
For coding-agent users
$ bohrin verify --since main
bohrin verify · since main (7c1d18b) · 1 files changed · 1 commits
 
2 facts and 0 observations about this change, beside 1 commit message claiming success.
 
BGW-109 fact test_parse_numbers in tests/test_parser.py was weakened: from value equality or comparison to a non-None check only (S1 → W2)
BGW-109 fact 1 skip or xfail marker added in tests/test_parser.py
 
Commit messages that claim success:
7757e23 Fix parser, all tests pass
 
Not checked: a test's expected value copied into the source; files other than Python and pytest configuration.
Next: bohrin verify --strict (exit 1 on any fact, for CI)
Reproduction scripts
$ python reproduce_BF-GZW6R2M9CJ.py
… "outcome": "reproduced"}
reproducedexit 0
not-reproducedexit 1
flakyexit 2
baseline-failedexit 3
errorexit 4

Every finding ships with a script that runs your grader, unchanged. No Bohrin installed, no network. Run it yourself.

Evidence levels
provenCounted
proven (experimental)Shown separately
suspectedNot counted
leadNot counted
observationNever an accusation

Only proven findings count. Anything less certain is shown for what it is, and never added to a score.

Proven-correct rewrites
reference → rewritediff
def add(a: int, b: int) -> int:
- total = a + b # the sum
+ total = a + b
return total
same syntax treemust be accepted

A grader that rejects correct code is scored too. A rewrite is sent only when a machine proves it does exactly what your reference does.

Use cases. Wherever a score decides what ships.

Evaluation teams

Know if +3.5 points is real

Every score with its margin of error, and the smallest difference your evaluation can actually detect.

16% of 445 benchmarks reviewed by 29 experts reported any uncertainty estimate or statistical test. Measuring what Matters, 2025

bohrin powerRead the use case
RL environment builders

Graders that can’t be passed without the work

Before you ship an environment, find out whether its grader pays for answers that did none of the work.

219 flaws found across 10 agent benchmarks, most reaching near-perfect scores without solving a task. BenchJack, 2026

Python libraryRead the use case
Coding-agent teams

Weakened tests, caught on the pull request

Your agent says “fixed, all tests pass”. Bohrin shows you whether it fixed the code or changed the tests.

76% of attempts in which a frontier model cheated on coding tasks built so that passing is impossible without cheating. ImpossibleBench, 2025

bohrin verifyRead the use case
The origin of Bohrin

Every AI system has something that decides whether it did a good job: a grader, a benchmark, a test suite. Once machines did more work than people could check, that checker became the only thing between a model and a mistake. Nobody was checking the checker. So we built Bohrin to do exactly that.

Bohrin

Because AI deserves the truth

“Self-improvement is the first step toward greater artificial intelligence. We want AI systems to keep learning safe, correct information, so they can help humans go further.”
PGPrabhu GopalFounder, Bohrin

Start with the one you need. It’s one install.

$ pip install bohrin