Benchmarks
420 real OpenFOAM runs. The same task for every judge.
- Courant,0 of 264 wrong runs let through,10 of 140 right runs rejected
Claude Opus 5.5,69 of 264 wrong runs let through,5 of 140 right runs rejected
Claude Sonnet 5.5,76 of 263 wrong runs let through,0 of 138 right runs rejected
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.
| Judge | All wrong runs | Wrong problem | Solver fault |
|---|---|---|---|
| Courant | 0 of 2640% · 95% CI 0–1% | 0 of 1400% · 95% CI 0–3% | 0 of 1240% · 95% CI 0–3% |
| Claude Opus 5.5 | 69 of 26426% · 95% CI 21–32% | 61 of 14044% · 95% CI 36–52% | 8 of 1246% · 95% CI 3–12% |
| Claude Sonnet 5.5 | 76 of 26329% · 95% CI 24–35% | 59 of 13942% · 95% CI 35–51% | 17 of 12414% · 95% CI 9–21% |
| Claude Haiku 5.5 | 52 of 24921% · 95% CI 16–26% | 46 of 12936% · 95% CI 28–44% | 6 of 1205% · 95% CI 2–10% |
| Judge | Right runs rejected | Abstained | Requests that failed |
|---|---|---|---|
| Courant | 10 of 1407% · 95% CI 4–13% | 16 of 420right 0 of 140 · wrong problem 0 of 140 · solver fault 16 of 140 | 0 of 420 |
| Claude Opus 5.5 | 5 of 1404% · 95% CI 2–8% | 16 of 420right 0 of 140 · wrong problem 0 of 140 · solver fault 16 of 140 | 0 of 420 |
| Claude Sonnet 5.5 | 0 of 1380% · 95% CI 0–3% | 19 of 420right 2 of 140 · wrong problem 1 of 140 · solver fault 16 of 140 | 0 of 420 |
| Claude Haiku 5.5 | 17 of 12214% · 95% CI 9–21% | 49 of 420right 18 of 140 · wrong problem 11 of 140 · solver fault 20 of 140 | 0 of 420 |
Courant’s 10 are 8 of 20 pitzDaily and 2 of 20 hotRoom: the two families behind H3 (below).
| Model | Answered by both | Accepted by the model only | Accepted by Courant only | p | Hypothesis |
|---|---|---|---|---|---|
| Claude Opus 5.5 | 264 | 69 | 0 | 1.69e-21 | Supported |
| Claude Sonnet 5.5 | 262 | 76 | 0 | 1.32e-23 | Supported |
| Claude Haiku 5.5 | 249 | 52 | 0 | 2.22e-16 | Supported |
Courant alone, 1,827 runs.
A hypothesis is supported only when its whole 95% CI sits under a bar fixed before any run.
- Faulted runs accepted, without the task, bar 1%, 3 of 609, 95% CI 0.17–1.44%, Refuted
- Faulted runs accepted, with the task, bar 1%, 0 of 609, 95% CI 0.00–0.63%, Supported
- Wrong-problem runs accepted, with the task, bar 1%, 0 of 609, 95% CI 0.00–0.63%, Supported
- Right runs rejected, with the task, bar 2%, 34 of 609, 95% CI 4.02–7.70%, Refuted
- Right runs left insufficient, with the task, bar 5%, 0 of 609, 95% CI 0.00–0.63%, Supported
- Verifier exceptions, 0 exceptions, 0 in 3,654, Supported
Every number, in a table
| Hypothesis | Measured, with its 95% CI | Pre-registered bar | Verdict |
|---|---|---|---|
| H1 Faulted runs accepted, without the task | 3 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 task | 0 of 60995% CI 0.00–0.63% | under 1% | Supported |
| H2 Wrong-problem runs accepted, with the task | 0 of 60995% CI 0.00–0.63% | under 1% | Supported |
| H3 Right runs rejected, with the task | 34 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 task | 0 of 60995% CI 0.00–0.63% | under 5% | Supported |
| H5 Verifier exceptions | 0 in 3,654 verifications | 0 exceptions | Supported |
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 runcourant verify ./my_caseon 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 updatedownloads a release from github.com;courant doctor --modelsreads OpenRouter’s public model list; and a language model you choose (anllm:judge for the Courant Test, orcourant 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.