Benchmarks

420 real OpenFOAM runs. The same task for every judge.

  1. Courant,0 of 264 wrong runs let through,10 of 140 right runs rejected
  2. Claude Opus 5.5,69 of 264 wrong runs let through,5 of 140 right runs rejected
  3. Claude Sonnet 5.5,76 of 263 wrong runs let through,0 of 138 right runs rejected
  4. Claude Haiku 5.5,52 of 249 wrong runs let through,17 of 122 right runs rejected

Given the task · tutorial runs · these models, this prompt, these dates · pre-registered 15 Oct 2026

Every number, in a table

A statement about these models, this prompt and these dates, on tutorial runs, never about language models in general.

Wrong runs each judge accepted, given the task, on the same 420 runs (15 Oct 2026). Abstentions are in no denominator.
JudgeAll wrong runsWrong problemSolver fault
Courant0 of 2640% · 95% CI 0–1%0 of 1400% · 95% CI 0–3%0 of 1240% · 95% CI 0–3%
Claude Opus 5.569 of 26426% · 95% CI 21–32%61 of 14044% · 95% CI 36–52%8 of 1246% · 95% CI 3–12%
Claude Sonnet 5.576 of 26329% · 95% CI 24–35%59 of 13942% · 95% CI 35–51%17 of 12414% · 95% CI 9–21%
Claude Haiku 5.552 of 24921% · 95% CI 16–26%46 of 12936% · 95% CI 28–44%6 of 1205% · 95% CI 2–10%
Right runs each judge rejected, and the runs it did not answer.
JudgeRight runs rejectedAbstainedRequests that failed
Courant10 of 1407% · 95% CI 4–13%16 of 420right 0 of 140 · wrong problem 0 of 140 · solver fault 16 of 1400 of 420
Claude Opus 5.55 of 1404% · 95% CI 2–8%16 of 420right 0 of 140 · wrong problem 0 of 140 · solver fault 16 of 1400 of 420
Claude Sonnet 5.50 of 1380% · 95% CI 0–3%19 of 420right 2 of 140 · wrong problem 1 of 140 · solver fault 16 of 1400 of 420
Claude Haiku 5.517 of 12214% · 95% CI 9–21%49 of 420right 18 of 140 · wrong problem 11 of 140 · solver fault 20 of 1400 of 420

Courant’s 10 are 8 of 20 pitzDaily and 2 of 20 hotRoom: the two families behind H3 (below).

Does each model accept more of the wrong runs than Courant? Exact one-sided McNemar on the wrong runs both answered, α 0.0167 each, fixed before any request.
ModelAnswered by bothAccepted by the model onlyAccepted by Courant onlypHypothesis
Claude Opus 5.52646901.69e-21Supported
Claude Sonnet 5.52627601.32e-23Supported
Claude Haiku 5.52495202.22e-16Supported

Courant alone, 1,827 runs.

A hypothesis is supported only when its whole 95% CI sits under a bar fixed before any run.

  1. Faulted runs accepted, without the task, bar 1%, 3 of 609, 95% CI 0.17–1.44%, Refuted
  2. Faulted runs accepted, with the task, bar 1%, 0 of 609, 95% CI 0.00–0.63%, Supported
  3. Wrong-problem runs accepted, with the task, bar 1%, 0 of 609, 95% CI 0.00–0.63%, Supported
  4. Right runs rejected, with the task, bar 2%, 34 of 609, 95% CI 4.02–7.70%, Refuted
  5. Right runs left insufficient, with the task, bar 5%, 0 of 609, 95% CI 0.00–0.63%, Supported
  6. Verifier exceptions, 0 exceptions, 0 in 3,654, Supported
Every number, in a table
Pre-registered hypotheses on 1,827 real OpenFOAM runs (14 Oct 2026), each decided on the upper bound of its 95% CI against a bar fixed before any run.
HypothesisMeasured, with its 95% CIPre-registered barVerdict
H1 Faulted runs accepted, without the task3 of 60995% CI 0.17–1.44%under 1%RefutedWithout the task, 3 hotRoom runs set to laminar on a turbulent case were accepted; with it, none was.
H1b Faulted runs accepted, with the task0 of 60995% CI 0.00–0.63%under 1%Supported
H2 Wrong-problem runs accepted, with the task0 of 60995% CI 0.00–0.63%under 1%Supported
H3 Right runs rejected, with the task34 of 60995% CI 4.02–7.70%under 2%Refuted30 of 87 pitzDaily right runs (epsilon still being clipped late in the solve) and 4 of 87 hotRoom (Courant number above the stability limit over the final fifth of the run, adjustTimeStep off).
H4 Right runs left insufficient, with the task0 of 60995% CI 0.00–0.63%under 5%Supported
H5 Verifier exceptions0 in 3,654 verifications0 exceptionsSupported

Method

  • Pre-registered 3aba674 · 25e3c87

    Pre-registered by commits in Courant’s development repository, which is not public: the judges before any request (3aba674, 15 Oct 2026), the run at scale before any run (25e3c87, 10 Oct 2026; its versions 194fa76, 13 Oct 2026).

  • The runs 140 right · 140 wrong problem · 140 solver fault

    Every judge got the same 420 runs and the same task: 140 right, 140 the wrong problem, 140 with a solver fault; Courant’s verdicts are the ones it recorded on them at scale.

    The judges saw a rebuilt case configuration, not the case Courant read.

  • Courant’s gate version 2 · courant 0.5.0 runs version 1

    Courant’s verdicts here are gate version 2’s; courant 0.5.0, the release, judges without what version 2 adds: the cell aspect ratio computed from the mesh files when a case has no checkMesh log and each field’s residual bar from the case’s own residualControl, with a stalled-residual check. Version 1’s interim, stopped at 273 of its 2,100 runs, accepted 6 of 91 faulted runs given the task (95% CI 3.06–13.65%), inconclusive. Versions are never pooled.

  • Scope and spend $77.50 · 1,262 model requests

    Tutorial-sized OpenFOAM v2406 runs of seven families; no customer data. $77.50 in model requests, 1,262 of them.

Questions

  • How do I verify an OpenFOAM simulation?

    Install Courant (pip install 'courant-dev[mcp]') and run courant verify ./my_case on the case directory. It reads the solver log and the case files and returns accept, reject or insufficient, each reason citing the file it read, the method, the threshold and the value. Give it the task’s specification and it also checks that the run is the problem that was asked.

  • How do three Claude models compare with Courant at judging OpenFOAM runs?

    Given the same 420 OpenFOAM tutorial runs and the task, Claude Opus 5.5 accepted 69 of 264 wrong runs, Claude Sonnet 5.5 76 of 263 and Claude Haiku 5.5 52 of 249; Courant, at gate version 2, accepted 0 of 264. Of the right runs, Courant rejected 10 of 140, the models 5 of 140, 0 of 138 and 17 of 122, in the same order. A statement about these models, this prompt and these dates, on tutorial runs, never about language models in general. The judges saw a rebuilt case configuration, not the case Courant read.

  • What does Courant check, and what does it not?

    It reads what a finished run left behind, the solver log and the case files, and checks convergence, stability, bounded fields and the setup. Given the task, it also checks that the case is the problem that was asked: on the same runs it accepted 118 of 140 wrong-problem runs without the task and 0 of 140 with it. It runs no solver, changes no case and does not replace a validation experiment.

  • Does it send my files anywhere?

    Courant runs on your machine and has no account, no telemetry and no service of its own; it never sends your runs, cases or results anywhere. Its checks open no network connection. Only these contact the network, only when you run them, and each names the host first: courant update downloads a release from github.com; courant doctor --models reads OpenRouter’s public model list; and a language model you choose (an llm: judge for the Courant Test, or courant spec extract) sends that task’s text to the model provider with your own API key.

  • How is its error rate measured?

    On real OpenFOAM tutorial runs whose truth is known by construction: right runs, runs with an injected solver fault, and the right physics on the wrong problem. At scale, given the task, it accepted 0 of 609 faulted and 0 of 609 wrong-problem runs, and rejected 34 of 609 right runs, a rate that missed its pre-registered bar; without the task it accepted 3 of 609 faulted runs, which also missed its bar. Both studies on /benchmarks were pre-registered before their first request or run and published whatever they showed, every rate with its denominator and its 95% CI. Courant’s counts here are gate version 2’s; courant 0.5.0, the release, judges without the changes version 2 adds, and version 1’s interim accepted 6 of 91 faulted runs given the task (95% CI 3.06–13.65%), inconclusive. Versions are never pooled.

Claude and the Claude logo are trademarks of Anthropic, PBC.