Radical Geek field note

The Radical Geek Local Coding Model Leaderboard

Eight downloaded coding models, one frozen SWE-bench baseline, official scoring and the runtime failures the headline scores leave out.

I wanted a leaderboard I could actually use to make routing decisions.

The model cards were useful for choosing candidates, but they could not answer the question I had on the local stack: when each downloaded model sees the same issue and the same heuristically retrieved source context, can it produce a patch that applies and passes the repository tests without Qwen repairing the answer afterwards?

I ran the models on the same five SWE-bench Verified tasks, preserved every raw trace, checked each patch with git apply --check, then used the official SWE-bench harness for the final result.

The result is blunt. Qwen3.6-35B-A3B Q4_K_M is the only model in the shared matrix to produce a cleanly applicable, officially resolved patch. It scored 1/5. Every other model scored 0/5.

That headline is useful, but it is not the whole report. A zero made from five short, non-applicable patches is operationally different from a zero that consumed 98,304 completion tokens on one task. The detailed breakdown matters.

Current leaderboard

RankModel and quantSizeResolvedClean applyPatch yieldP50 latencyOutput tokens
1Qwen3.6-35B-A3B Q4_K_M20.614 GiB1/51/55/5107.0 s25,300
=2DeepSeek-Coder-V2-Lite Q6_K13.101 GiB0/50/55/534.9 s3,248
=2Gemma 4 E4B Q4_K_M4.969 GiB0/50/55/5105.1 s19,212
=2Kimi-Linear-48B-A3B Q4_K_M27.997 GiB0/50/54/547.2 s9,128
=2Devstral Small 2 24B Q4_K_M13.350 GiB0/50/54/578.0 s1,809
=2Ornith 1.0 35B Q4_K_M19.713 GiB0/50/53/5125.5 s123,569
=2GPT-OSS-20B MXFP411.278 GiB0/50/51/520.2 s5,978
=2Laguna S 2.1 118B-A8B Q4_K_M68.098 GiB0/50/50/5135.7 s6,773

The shared rank ties every model with zero solves and zero clean applies. Latency and patch yield are important diagnostics, but I am not allowing either to outrank correctness.

Laguna S 2.1: the fit baseline

Laguna’s official Q4_K_M GGUF is 68.098 GiB. The Evo exposes 30 GiB of host RAM and a 64 GiB GPU carve-out, so the weights and a 131k f16 KV cache could not fit the same envelope as the smaller models. The first attempt generated 7,836 Astropy tokens before the kernel killed the server under host-memory pressure.

I did not count that as a model failure. I kept the same quant and official sampler, then fitted the runtime honestly:

  • Poolside’s laguna llama.cpp branch
  • 65,536-token context
  • 38 of 48 layers on the GPU
  • Q8 KV cache
  • thinking enabled
  • temperature 1.0, top-p 1.0, top-k 20 and min-p 0

At the required 32,768-token allowance, Astropy consumed the entire budget and returned an empty patch. I increased the allowance to 40,960 and restarted all five tasks. Astropy then ended naturally at 5,944 tokens, removing the ceiling ambiguity, but it still returned an empty patch.

The final Laguna result is 0/5: five empty patches, no evaluator errors and no 40,960-token ceiling breaches. It is tied with the other zero-solve, zero-clean-apply models on correctness, while its separate fit envelope remains visible rather than being presented as identical hardware conditions.

The five tasks

ProjectInstance
Astropyastropy__astropy-12907
Djangodjango__django-10097
Matplotlibmatplotlib__matplotlib-13989
Pytestpytest-dev__pytest-10051
Sphinxsphinx-doc__sphinx-10323

Five fixed tasks are not enough for a universal intelligence ranking. They are enough for a controlled promotion screen, especially when the raw failures are kept rather than collapsed into one percentage.

Task-by-task result

The token count in each cell is the completion length. Invalid means an extractable patch failed the clean-apply gate. No patch means the model did not return an extractable patch. Not resolved means the official scorer ran but the repository tests did not pass.

ModelAstropyDjangoMatplotlibPytestSphinx
Qwen3.6Resolved · 4,313Invalid · 5,578Invalid · 4,810Invalid · 4,935Invalid · 5,664
DeepSeek Coder V2 LiteInvalid · 618Invalid · 652Invalid · 832Invalid · 260Invalid · 886
Gemma 4 E4BInvalid · 7,152Invalid · 2,355Not resolved · 3,691Invalid · 3,743Invalid · 2,271
Kimi LinearNo patch · 5,515Invalid · 748Invalid · 1,353Invalid · 983Invalid · 529
Devstral Small 2Invalid · 326Invalid · 579No patch · 167Not resolved · 182Not resolved · 555
Ornith 1.0Invalid · 16,533Invalid · 6,361Ceiling/invalid · 98,304No patch · 2,003No patch · 368
GPT-OSS-20BNo patch · 741Invalid · 5,026No patch · 42No patch · 109No patch · 60
Laguna S 2.1No patch · 5,944No patch · 99No patch · 165No patch · 380No patch · 185

The baseline I froze

The shared seven-model matrix used:

  • SWE-bench/SWE-bench_Verified
  • one model for the whole generation
  • heuristic retrieval capped at 80,000 source characters and 12 files
  • 131,072-token context
  • parallel 1
  • maximum GPU offload
  • no model-assisted repair
  • git apply --check
  • the official SWE-bench scorer

I selected the best already-downloaded quant that fitted the hardware. This is fit parity, not quant parity. Forcing every model to Q4 would have downgraded DeepSeek even though Q6 fitted. Forcing Q6 across the board would have excluded the larger candidates. The benchmark records the exact file size and SHA-256 hash instead.

The 32k output rule changed the run

The first allowance was 32,768 tokens. Qwen spent the allowance in reasoning without returning a final patch, so I increased the allowance and restarted the matrix from the beginning.

At 65,536 tokens, Ornith reached the ceiling on Sphinx and still did not produce a usable patch. That made the run unsuitable for comparison, so I restarted again.

The final shared allowance was 98,304 tokens. This is the largest comparable output budget under GPT-OSS’s 131,072 native context once the prompt is included. Ornith then consumed all 98,304 tokens on Matplotlib and failed the patch gate. There was no honest higher shared setting to try, so that result is recorded as a maximum-context ceiling failure.

The output limit was not being treated as a target. It was a diagnostic ceiling, and the restart rule did its job.

Quant and sampler settings

ModelQuantGeneration settings
Qwen3.6-35B-A3BQ4_K_Mtemperature 0.6, top-p 0.95, top-k 20, min-p 0, repetition penalty 1
Gemma 4 E4BQ4_K_Mtemperature 1.0, top-p 0.95, top-k 64
Kimi-Linear-48B-A3BQ4_K_Mtemperature 1.0
Devstral Small 2 24BQ4_K_Mtemperature 0.15
GPT-OSS-20BMXFP4temperature 1.0, reasoning effort high
DeepSeek-Coder-V2-LiteQ6_Ktemperature 0, top-p 0.95, top-k 50
Ornith 1.0 35BQ4_K_Mtemperature 1.0, top-p 0.95, top-k 20
Laguna S 2.1Q4_K_Mtemperature 1.0, top-p 1.0, top-k 20, min-p 0, thinking enabled

I checked the current model documentation before freezing these settings. For Laguna in particular, Poolside recommends thinking for agentic coding, its laguna llama.cpp branch with --jinja, and publishes Q4_K_M as the local GGUF route. The optional DFlash draft model was not used because it is not among the downloaded models being tested:

What each result actually says

Qwen is still the control

Qwen did not produce five beautiful patches. It produced one verified solve and four invalid patches. That is not a reason to pretend the baseline is stronger than it is.

It is enough to retain Qwen as the control. It was the only model to cross all three gates: emit a patch, apply cleanly and pass the repository tests. Every challenger now has a simple target.

DeepSeek was fast and wrong

DeepSeek’s 34.9-second median looks good on a latency chart. It also emitted five patches. None applied cleanly. Fast invalid output is still invalid output.

Gemma remains a supporting model

Gemma emitted a patch for every task and reached the official test stage on Matplotlib, but it resolved nothing. That fits the evidence from the wider stack: Gemma remains interesting as a classifier, reviewer and judge, not the owner of the final patch.

Kimi and Devstral remain specialists

Kimi and Devstral both produced useful structure in earlier planning and review work. This isolated baseline says neither earned patch ownership. I will keep them available for role-specific experiments without making them a tax on every coding request.

GPT-OSS needs a tighter job

GPT-OSS had the fastest median because several tasks ended with almost no usable output. It produced one extractable patch from five tasks. A narrow judge role may still suit it; this implementer baseline did not.

Ornith failed the output-control gate

Ornith is no longer unranked. The isolated run is now complete and the result is 0/5, with no cleanly applicable patch. Its 98,304-token Matplotlib failure is the clearest diagnostic in the matrix. The previous apparent Ornith success came from a Qwen repair stage; this run removes that attribution error.

Why this is intentionally harsh

The best production workflow may still use several models. A planner can find the right files, a reviewer can spot a missed constraint, and Qwen can repair an otherwise useful candidate.

That is a different benchmark.

This run measures patch ownership. I removed planning diversity, reviewer feedback and model-assisted repair so that a resolved task belongs to the model named in the row. The lower score is worth the cleaner attribution.

What comes next

The next version should use 20–30 stratified tasks and at least three generations for stochastic settings. It should keep Qwen in every batch as the control, retain this heuristic-only retrieval baseline, publish confidence intervals and score planner, reviewer and repair roles separately.

For now the operational decision is straightforward:

Keep Qwen3.6-35B-A3B Q4_K_M as the default local implementer and repairer. Do not promote another model to final patch ownership from this evidence.

That decision can change. The next model has to change it by producing patches that apply and pass, not by looking impressive in its own model card.