The data

Every model graded on the same 8 coding tasks across 1030 runs, each attempt scored 0-3 against the fix that actually shipped. All of it generated straight from the benchmark data.

Experimentally post-trained models (community & RL fine-tunes)

Every model

Ranked by mean tier across all runs, with how each one is served. Setup shows exactly how.

Opus 4.8 API ref
2.51
Sonnet 5 API ref
2.22
Sonnet 4.5 API ref
1.97
DeepSeek V4 Flash 0731 (Think-High) vLLM b12x
deepseek-ai/DeepSeek-V4-Flash-0731
MTP OFF (b12x no-spec; 0731's re-trained MTP head not yet loadable by the fork - decode ~114 vs ~170 t/s w/ MTP on the preview)
2.35
DeepSeek V4 Flash (Think-Max) vLLM b12x
deepseek-ai/DeepSeek-V4-Flash
MTP=1 ON (speculative)
2.21
DeepSeek V4 Flash (Think-High) vLLM b12x
deepseek-ai/DeepSeek-V4-Flash
MTP=1 ON (speculative, b12x)
1.99
Laguna-S-2.1 NVFP4 (thinking) vLLM
poolside/Laguna-S-2.1-NVFP4
no speculative (DFlash head unstable on vLLM 0.25.1 + SM120 - crashes/deadlocks; dropped, retry on 0.26.0)
2.28
Inkling-Small IQ4_XS (276B-A12B) llama.cpp
unsloth/Inkling-Small-GGUF (UD-IQ4_XS)
no speculative (llama.cpp add-inkling branch, danielhanchen; HDD-mmap load, decode VRAM-resident)
2.14
Qwen3.6-27B Q4 (prelim n=3) llama.cpp
unsloth/Qwen3.6-27B-GGUF (IQ4_XS)
no speculative (llama.cpp)
1.78
Hunyuan HY3 (295B-A21B) llama.cpp
tencent/Hy3 (unsloth IQ4-UD GGUF)
no speculative in this run (MTP/NEXTN head present in GGUF; llama.cpp PR#25395 adds --spec-type draft-mtp, +~12%)
2.00
Qwen3.6-27B INT4 vLLM
Lorbus/Qwen3.6-27B-int4-AutoRound
MTP OFF (needs vLLM nightly)
1.88
Qwen3.6-35B-A3B AWQ vLLM
QuantTrio/Qwen3.6-35B-A3B-AWQ
MTP OFF
1.55
MiMo-V2.5 llama.cpp
unsloth/MiMo-V2.5-GGUF (UD-IQ4_XS)
no speculative (llama.cpp)
1.23

Scorecard

The shape behind each score: how every model's attempts spread across the four grades, with gaps where a grade never happened.

MissBasicSolidComplete
MissBasicSolidCompleteOpus 4.8mean 2.51DS V4 0731mean 2.35Laguna Smean 2.28Sonnet 5mean 2.22DS V4 Maxmean 2.21Inkling Smean 2.14HY3 295Bmean 2.00DS V4 Highmean 1.99Sonnet 4.5mean 1.97Qwen3.6 27B INT4mean 1.88Qwen3.6 27B Q4mean 1.78Qwen3.6 35B AWQmean 1.55MiMo 2.5mean 1.23

Time per task

Spread of wall-clock time to finish a task, in real minutes, with each task weighted equally so uneven run counts don't skew it; dashed line is the median, fastest on top.

time scale
30s1m2m5m10m15m20m30m40mDS V4 HighSonnet 4.5DS V4 0731DS V4 MaxQwen3.6 35B AWQLaguna SQwen3.6 27B Q4Opus 4.8Qwen3.6 27B INT4Inkling SSonnet 5MiMo 2.5HY3 295B

Speed & taper

Decode speed as context fills, on the two-card box. Sliding-window and MoE models stay flat, dense models taper hard. Toggle to prefill (top-right) for how fast each reads context in, the TTFT side of the story.

tok/s vs context
50100150200decode speed (tok/s)050K100K150K200K250Kcontext length (tokens)DS V4 HighQwen3.6 35B AWQLaguna SDS V4 0731Qwen3.6 27B INT4MiMo 2.5Inkling SHY3 295B

Working style

How much context each model ingests versus how many tokens it generates to solve a task. Up-and-right = reads and writes a lot.

10K20K30K20K40K60K80Kcontext ingested (tokens)output tokensSonnet 5DS V4 HighDS V4 0731Laguna SInkling SHY3 295BQwen3.6 35B AWQQwen3.6 27B INT4Qwen3.6 27B Q4MiMo 2.5DS V4 Max

VRAM

What each model needs while serving, split into fixed weights (solid) and reserved KV cache (faint) that scales with how much context you keep live. Reference lines mark common total capacities, so it maps onto whatever cards you have rather than any one setup.

weightsKV cache reserved (trim with context)24486496128192DS V4 High186.7 GBDS V4 0731186.7 GBLaguna S180.6 GBHY3 295B176.3 GBMiMo 2.5144.2 GBInkling S136.4 GBQwen3.6 27B INT487 GBQwen3.6 35B AWQ86.2 GB

The tasks

Each task is a real bug from a production TypeScript/GraphQL codebase, reverted to just before its fix and generalized to an archetype.

The aim was tasks that separate models rather than flatter them, so each one had to clear a few bars:

  • Small diff, big search: the actual fix is only a handful of lines, but finding it takes real digging through the codebase, so it rewards understanding over typing.
  • More than one way to do it, not all equal: several fixes will pass, but only some are clean and complete, which is exactly what separates Solid from Complete.
  • An objective fix that actually shipped: each is a real bug with a known-good merged fix, so attempts get graded against ground truth, not taste.
  • Contamination-controlled: a clean just-before-fix checkout with history stripped, so nothing about the solution leaks into the prompt.

The set spans difficulty on purpose, from near-floor tasks almost everyone completes to discriminators only the strongest models get right.

#1 Idempotent-update guard Discriminator

A save that changes nothing still fires an expensive downstream state transition; separately, a class of legacy records silently skips an audit step. Two orthogonal defects, graded independently - and a blanket guard that also suppresses legitimate updates doesn't count as a fix.

#2 Change-detection before a side effect Discriminator

Re-saving a parent record re-runs a costly re-processing side effect on a child field that didn't actually change. The guard has to compare on normalized values (whitespace / line-ending-only differences shouldn't count as a change) and run before the side effect fires.

#3 Search tokenization Discriminator

Terms with internal punctuation (initials, separators) return nothing, because the query and the index tokenize punctuation differently. The real fix aligns the two at the tokenizer; patching the single failing query string is brittle.

#4 Query scoping filter Floor (excluded from headline)

A status filter is scoped too broadly and surfaces records that should be excluded - re-scope the underlying query condition. Straightforward; every model solves it, so it's kept only as a floor (tiers barely separate).

#5 Over-strict invariant Near-floor

A safety assertion is too strict and fires on a legitimate edge case, blocking an operation that should succeed. The fix has to narrow the assertion to what it's actually meant to guard - without deleting the safety check.

#6 Cross-transaction atomicity Hardest discriminator

Two related writes run in separate transactions; if the second fails (timeout, contention) they're left permanently out of sync. It compiles and passes the happy path - the desync only manifests under failure, so you have to reason about the failure path, not the common case.

#7 Boundary / off-by-one Dead floor (excluded)

An unclamped boundary value produces wrong behaviour right at the limit (a rounding / comparison-direction bug). A one-line boundary fix - every model localizes it, so it's kept only as a floor (core is already near-complete, no real split).

#8 Right-surface + recompute Discriminator (surface trap)

The change must land on the correct one of two similar internal surfaces (a routing trap), then trigger a follow-up recompute + refresh - a second step that's easy to miss. Putting it on the wrong surface compiles fine but is wrong.

About

Every model solved the same 8 tasks, run autonomously as an agent, and each resulting diff was graded 0-3 against the fix that actually shipped by a strong LLM judge, with a small penalty for avoidable inefficiency. Local models run under the opencode agent on vLLM or llama.cpp; the hosted ones run under Claude Code. Different scaffolds on purpose: the question is what you get when each model is set up the way people actually run it, not which raw model wins in a vacuum.

Coverage is deliberately uneven. The discriminator tasks, the ones that actually separate models, are run hardest, up to 19 times on a single model; the easy floor tasks and the slowest local models get as few as 1, so read the thin cells as directional rather than precise. Scores are the mean tier across a model's runs, never best-of-N. Task time is wall-clock with each task weighted equally, so no single slow task dominates. Every chart on this page is drawn from that same benchmark data, 1030 graded runs exported as JSON.

Download the dataset

scorecard.json · ~137 KB · the aggregated data behind every chart on this page