Resources
Model bench.
19 models scored against the current fixture set, including the ones that did badly, plus 1 that could not be reached at all. One corpus, one binary, one afternoon, so the rows are comparable to each other.
Generated 2026-08-19 with postil 0.8.26. 57 fixtures carry a seeded defect and 13 are clean pull requests where the correct review is silence. Each model saw all 70 once.
| Model | Detected | Gate correct | Silent on clean | False findings | No envelope | Total cost | p95 |
|---|---|---|---|---|---|---|---|
openai/gpt-5.6-luna | 96.5% | 90.0% | 13/13 | 0 | 0 | US$0.063 | 21.4s |
openai/gpt-5.6-terra | 94.7% | 85.7% | 13/13 | 0 | 0 | US$0.640 | 17.6s |
moonshotai/kimi-k2.7-code | 94.7% | 82.6% | 13/13 | 0 | 1 | US$0.511 | 18.1s |
z-ai/glm-5.2 | 94.7% | 76.8% | 13/13 | 3 | 1 | US$0.633 | 62.1s |
openai/gpt-5.6-luna-pro | 93.0% | 85.7% | 13/13 | 0 | 0 | US$0.303 | 38.8s |
moonshotai/kimi-k2.6 | 91.2% | 84.3% | 13/13 | 1 | 0 | US$1.61 | 57.8s |
google/gemma-4-31b-it | 91.2% | 77.9% | 10/13 | 3 | 2 | US$0.285 | 11.7s |
qwen/qwen3.8-27b | 91.2% | 73.9% | 13/13 | 1 | 1 | US$0.982 | 67.5s |
mistralai/mistral-small-3.2-24b-instruct | 91.2% | 73.1% | 6/13 | 7 | 3 | US$0.034 | 27.9s |
thinkingmachines/inkling-small | 89.5% | 82.1% | 13/13 | 0 | 3 | US$0.247 | 63.2s |
google/gemma-3-27b-it | 87.7% | 79.4% | 4/13 | 8 | 7 | US$0.043 | 41.8s |
deepseek/deepseek-v4-pro-0813 | 86.0% | 78.6% | 12/13 | 2 | 0 | US$0.705 | 48.4s |
qwen/qwen3-32b | 86.0% | 77.8% | 8/13 | 12 | 7 | US$0.132 | 19.6s |
meta/muse-glimmer-30b | 84.2% | 82.9% | 13/13 | 1 | 0 | US$0.281 | 54.5s |
nvidia/nemotron-3.5-lightning | 84.2% | 79.4% | 13/13 | 0 | 2 | US$0.173 | 87.1s |
google/gemini-3.7-flash | 75.4% | 80.3% | 13/13 | 0 | 4 | US$0.232 | 22.0s |
bytedance-seed/seed-2.0-code | 73.7% | 83.3% | 10/13 | 2 | 16 | US$0.660 | 131.6s |
deepseek/deepseek-v4-flash-0731 | 68.4% | 63.2% | 13/13 | 0 | 2 | US$0.065 | 74.4s |
z-ai/glm-5.3 | 63.2% | 75.0% | 12/13 | 0 | 18 | US$1.24 | 134.6s |
qwen/qwen3.8-max | No zero-retention endpoint; every request refused before inference. | ||||||
Download the raw report (JSON). It carries the fixture-corpus, evaluator and binary digests, so you can tell whether any other table is measuring the same thing.
What the columns mean
Detected is the share of seeded defects the model flagged. Gate correct is how often the merge gate blocked exactly when it should have, which is the number that decides whether a review costs someone a merge. Silent on clean counts the clean pull requests the model left alone. False findings counts findings raised against no defect. No envelope counts runs that never produced valid structured output, which fail closed rather than passing unreviewed code.
Read the column, not the decimal
Each figure is one run of a non-deterministic model. We ran two models four times each to measure how much that matters: detection rate moved over roughly nine percentage points for a single unchanged model, which is wider than the gap between most rows in the table. Treat differences under about five points as noise.
Gate correctness and silence on clean pull requests were far steadier across repeats, and they separate the models that detection rate cannot. If you take one thing from this table, take that: the headline metric is the least useful one on it.
Cost is not the sticker price
Total cost here is what the run actually billed, not a rate card. How much a model reasons before answering moves it far more than its per-token price does. The cheapest model per token in this table emitted more than half a million completion tokens to finish the set; the cheapest model per review emitted thirty thousand and scored higher. Price the work, not the tokens.
Routing changes the answer
The rows above come from screening runs, which let the router pick any endpoint. Hosted reviews cannot do that: they require a zero-retention endpoint, pin one upstream provider, and apply a price ceiling. Re-running two models under that contract moved the numbers enough to change which one we chose.
| Model, pinned | Detected | Gate correct | p95 screening | p95 pinned |
|---|---|---|---|---|
openai/gpt-5.6-luna on Azure | 89.5% | 85.5% | 21.4s | 17.6s |
moonshotai/kimi-k2.7-code on CoreWeave | 94.7% | 85.5% | 18.1s | 58.2s |
One model was unaffected; the other lost its entire latency advantage, because the endpoint the router had been choosing for it was not one a zero-retention deployment can use. If you are picking a model for a privacy-constrained deployment, measure it on the route you are allowed to take, not the cheapest one available.
What this cannot tell you
These are seeded defects on synthetic pull requests. A capable model can saturate them, so a high score shows that a model handles the review pipeline and obvious bugs at the stated cost, not that it will find the subtle bug in your codebase. The clean fixtures are the more transferable half: a model that cannot stay quiet here will not stay quiet on your diffs either.
These are our fixtures, and we build the product they score. Read the five-point test for benchmarks and apply it to this page too. The reproduction command below is the honest answer to that problem: run it yourself.
Run it yourself
The harness is in the CLI repository under bench/. Live mode spends real inference tokens and never prints your key.
cargo build --release
cd bench && bun install --frozen-lockfile
export MODEL_API_KEY=...
REVIEW_MODEL=openai/gpt-5.6-luna \
bun run bench:live -- --json-out .runs/luna.jsonOne model per run. Compare only against runs whose fixtureCorpusSha256 and evaluatorSha256 match yours; a different corpus is a different test.
Fixture corpus 8e4c2cb9ad5a7efd, evaluator ebc72a8d7d60c08b, binary 37d0c7ef4b49ab27. Model catalogue and local inference.