Research

We Open Sourced the Harness. Then One Cost Question Gave Us Four Answers.

Field Note

The harness behind our 154 controlled trials of Claude against GPT is now public. It is a Python runner, a set of tasks that prove their own difficulty, two independent judges, and a results file anyone can recompute.

We expected the interesting part to be the ranking. It was not. The interesting part was that one question, which model costs less per solved task, has four defensible ways to ask it, and this corpus answers all four differently.

Short answer

model-eval is our harness for running coding models headlessly, grading them with two blind judges, and writing every transcript and token count next to the code. It is now public. The question left standing after 267 runs was which model costs less per solved task, and that question returned four different answers depending on how the tiers were matched.

Chalk illustration of two identical stick figures dueling with swords and shields at the center of a round coliseum, with a seated judge on each side of the arena holding up a blue scoring tablet
Two fighters, two independent judges, and a result that changed with how the tiers were matched.

What does an open source eval harness actually give you?

It gives you the receipts instead of a leaderboard number. A task is a repo with a real bug, a verify script that fails before the fix and passes after it, and a prompt handed over verbatim. Every transcript, judgment, and token count lands in the repo next to the code.

Public benchmarks hand you a score and nothing to check it against. No transcript, no grading rubric, no way to tell whether a task was genuinely hard or just phrased to suit one vendor's house style. That gap is why we built model-eval and why it is now open. It runs a model headlessly against a small verifiable coding task, grades the diff with two independent judges, and writes the transcript, the judgment, and the raw token counts into the same repo the code lives in. No outcome depends on a number typed in by hand afterward.

Two judges is a control, not decoration. Automated graders carry a documented self preference bias, so we checked the judges against each other before trusting either one. Across the 139 runs both judges scored, their per run averages land within a point of each other 95.7 percent of the time, and 518 of 556 individual dimension pairs agree within a point. Exact integer matches are rare, near 15 percent. Two independently prompted graders converging on the same rough tier but not the same integer is the expected shape, not a sign that one of them is noise.

Why does the same cost question give four different answers?

Because the word cheaper hides a choice about which configurations you compare. Pool every tier and the difference vanishes. Hold both models at medium and it stays gone. Hold them at high and the sign flips. Compare each model at its own cheapest passing tier and a real gap appears.

We compared Claude Fable 5 against GPT-5.6 Sol on the nine tasks both models solved, taking each model's median output tokens per solved run on each task. Output tokens only: all 64 of Fable's input token counts are quarantined as unreliable while all 112 of Sol's are measured, so a combined total would put an undercount against a true count and manufacture a gap out of a measurement artifact. Then we asked the same question four ways.

Read those four charts as one result. Pooled across tiers there is nothing. Matched at medium there is nothing. Matched at high the direction reverses. The only contrast that comes back significant compares Fable at medium against Sol at low, and those are different tiers, so some unknown part of that gap is the knob rather than the model. Fable's floor in this run matrix is medium, which means its cheapest passing configuration is an artifact of what we chose to run. Nine paired tasks is a coarse instrument regardless: the smallest two sided p this test can produce is 0.004, and that requires all nine tasks pointing the same way.

The narrow claim that survives is still useful. If you are picking a configuration to deploy on work in this difficulty band, Sol at low is the cheapest thing in this corpus that passes everything, at roughly a 1.6 times output token advantage over Fable at medium. Whether Fable at some lower tier would close that gap is a run we have not done.

Does turning the effort knob up buy anything?

On tasks in this difficulty band, no. Across 15 adjacent effort comparisons over 144 matched pairs, the number of runs that passed at one tier and failed at the next was zero. What the knob moved was spend. Sol at ultra costs about 4.4 times what Sol at low costs.

Every model here exposes an effort setting, and the pitch is that a higher setting buys better outcomes. The harness walks every adjacent pair of rungs per model, matching runs by task and repetition so task difficulty cancels out. Fifteen comparisons, 144 matched pairs, zero discordant results. Not rare, not statistically insignificant. Zero, for every model, turned in either direction.

Median output tokens per solved run, bare invocation, by effort tier
Modellowmediumhighxhighmax or ultra
GPT-5.6 Sol1,1241,5341,9932,7084,943 (ultra)
GPT-5.6 Luna1,5512,8745,249 (max)
GPT-5.3 Codex Spark2,3083,5304,250
Kimi K31,3851,6311,972 (max)
Claude Fable 51,7372,008
Claude Haiku 4.52,8612,6752,745 (max)
Claude Haiku 4.5 (pinned)5,2285,7584,840 (max)
Source: model-eval corpus, 267 scorable runs. Medians over passing bare runs only. Blank cells were not run.

What the knob moved was the bill. Sol at ultra costs about 4.4 times its low tier and Luna at max about 3.4 times its low, for no additional passing runs. Both Haiku rows step backwards, and neither has low as its cheapest tier, a reminder that the knob's name is a statement of intent and not a guarantee about behavior. That pattern matches published work on overthinking in reasoning models. The honest limit is the ceiling below: effort cannot buy a pass on a task that already passes at the floor.

Why did every model pass every task?

Because the tasks are too easy for current models, not because the models are equal. This is a ceiling effect. With 267 scorable runs spread over 25 cells, the Wilson lower bounds still run from 34 percent to 89 percent, so a perfect score proves considerably less than it looks.

Sol, Fable, Kimi K3, Luna, Codex Spark, and both Haiku snapshots cleared everything they attempted. One row of the 268 on disk is excluded as a CLI error, where the process died before the model got a fair attempt, and exclusions are printed with their counts at the top of the stats output rather than dropped in silence.

Every model passed every run it was scored on
ModelCellsRunsPassedBest Wilson lower bound
GPT-5.6 Sol611211289%
Claude Fable 53636387%
GPT-5.6 Luna3181861%
GPT-5.3 Codex Spark3181861%
Kimi K33181861%
Claude Haiku 4.53181861%
Claude Haiku 4.5 (pinned)3181861%
Hybrid (harnessed)12234%
Source: Stats appendix section 1, 25 model x effort x harness cells condensed to one row per model. The bound shown is from each model's largest cell; across all 25 cells the lower bounds run from 34% to 89%.

The design cost is the part worth stealing if you are building your own harness. At this many cells and this many runs per cell, the smallest true difference the design could detect is about 37 percentage points. A saturated benchmark stops discriminating long before its numbers start looking suspicious, and a perfect score sitting on a 34 percent lower bound is not evidence of much. The fix is harder tasks, not more runs, which is where the next round goes.

What happened when we got our own headline wrong?

The first draft led with a much better result. Same pass rate, roughly a fifth of the tokens, p equals 0.004. It was wrong. We had computed cost as input plus output tokens while every one of Fable's 64 input counts was already flagged unreliable in the data.

Input plus output is the obvious definition of cost and the wrong one here. We were reading a measurement gap as a performance gap. Worse, the repo's own stats script had been corrected for exactly this reason days earlier and states the output only rule in a comment. We did not run it. We recomputed by hand instead, and the hand rolled version quietly reintroduced the bug the script had been fixed to prevent.

Run the script and the flagship finding evaporates: p equals 0.68, direction mixed, nothing detectable. We left the correction in the record rather than restating the numbers quietly. A harness that asks you to trust its methodology should show you the time that methodology caught its author. The failure mode also generalizes past us. A result that is large, significant, and confirms what you already half believed is precisely the result nobody gives a second look. The wrong chart is still in the repo under a filename that says so, and it looks completely convincing.

How do you run this against your own tasks?

Clone the repo, run one task's self test offline, then run the harness in mock mode. Neither step spends a token or needs an API key. Point the runner at your own Claude Code or Codex CLI and it authenticates through the subscription you already pay for.

git clone https://github.com/drakegriffith/model-eval
cd model-eval
bash tasks/t1-py-a/selftest.sh          # offline: verify.sh fails, then passes
python3 runner/run.py --mock --limit 1  # full pipeline, no tokens, no API key

Adding a task means writing a starting repo state with a real defect, a verify script, and a prompt. CONTRIBUTING.md covers that and the model registry. The harness is pointed at public models here because those are the ones people argue about, but the same structure is what we use on client systems, where the tasks are your workflows rather than someone's benchmark suite. That work lives in our agent development practice and our notes on evaluating agents.

Common Questions

Is model-eval free to use?
Yes. The runner, the tasks, the judging rubric, and the raw results file are all public on GitHub. The task self test runs entirely offline, and mock mode exercises the full harness pipeline without spending a token or needing an API key. Live runs authenticate through whatever Claude Code or Codex subscription you already have.
Which model is cheaper for coding, Claude or GPT?
It depends on how you match the configurations, which is the finding. Pooled across all effort tiers, no detectable difference, p equals 0.68. Both held at medium, no detectable difference, p equals 0.43. Both held at high, the direction reverses, p equals 0.086. Each at its own cheapest passing tier, Sol at low beats Fable at medium by roughly 1.6 times, p equals 0.0078. That last one compares different tiers, so read the cell names before the p-value.
Does higher reasoning effort produce better code?
Not at this difficulty. Across 15 adjacent effort comparisons over 144 matched pairs, zero runs passed at one tier and failed at the next. Spend moved a lot. Sol at ultra costs about 4.4 times its low tier for no additional passing runs. Whether the knob earns its price on harder tasks is the question this corpus cannot answer yet.
Why does the harness use two judges instead of one?
Automated graders carry a documented self preference bias, so a single judge scoring its own family is not a control. We strip identity, run one Claude judge and one Codex judge with no visibility into each other, and check their agreement before reading either score. On this corpus they land within a point of each other on 95.7 percent of runs. No judge can override a failing test suite.
Can I add my own tasks to the harness?
That is the intended use. A task is a directory: a starting repo state with a real defect, a verify script that fails before the reference fix and passes after it, and a prompt handed to the model verbatim. The self test proves that wiring offline, and a task that does not wire up cleanly fails CI instead of being silently skipped.
Why did every model score 100 percent?
Ceiling effect. The task set is easy enough for current frontier and near frontier models that pass and fail no longer separates them. That is a statement about the exam, not the students. With 25 cells and 267 scorable runs, the smallest difference the design could detect is about 37 percentage points, so the honest next step is harder tasks rather than more runs.
Why are all the token numbers output tokens only?
Because input token reporting was not trustworthy across every CLI in the corpus. Of 268 runs, 148 input counts were measured directly, 56 were recovered from a secondary usage log, and 64 were quarantined as unreliable. The quarantine is not random: it covers every one of Fable's rows while all 112 of Sol's are measured. Mixing an undercount with a true count invents a difference, which is the mistake we published and then retracted.

Sources

SourcePublisherLink
model-eval: an open source harness for evaluating coding modelsGriffith, GitHub 2026github.com
LiveCodeBench: Holistic and Contamination Free Evaluation of Large Language Models for CodeJain et al., arXiv 2024arxiv.org
Stop Overthinking: A Survey on Efficient Reasoning for Large Language ModelsSui et al., arXiv 2025arxiv.org
Between Underthinking and Overthinking: An Empirical Study of Reasoning LengthSu et al., arXiv 2025arxiv.org
Self-Preference Bias in LLM-as-a-JudgeWataoka et al., arXiv 2024arxiv.org
Binomial proportion confidence interval (Wilson score interval)Wikipediaen.wikipedia.org

Questions to explore next

Keep Exploring

Chalk stick figure in a hard hat presenting a little machine of blue gears it just built

Bring us the bottleneck.
We’ll build the system.

No Dreaming. Just Building.