Twice in eight runs, the model on my GPU bumped a peer dependency, which cleared the install error CI had died on and surfaced a type error behind it. Then it wrote "status": "fixed" into its result file, summarized the fix in confident prose, and stopped. Both times the type checker still failed on the error the model itself had uncovered and then declared fixed. The cheapest hosted model I tested fixed the same two cases, and the other six, in about 48 seconds each, for 0.13 USD total.

The problem the benchmark grew out of

Earlier this summer I cleared a Dependabot backlog across my repositories and wrote up the lockfile contention that strands parallel merges (Why One Dependabot Merge Leaves the Other Five Behind). Serial merging solved the green PRs. It did nothing for the red ones: the bumps whose CI failed and sat there until a human read the log.

So I designed a fix lane for my agent platform. The idea is ordinary: replay the failing PR in a sandbox, hand a coding agent the failing log, let it patch, verify from outside, and hand a human a draft packet. The open question was the engine. I own a DGX Spark that serves a 30-billion-parameter open-weight coding model, and I had been assuming it would do this job for free. The design draft carried a key-injecting proxy, a client lock, a context budget and a scheduling constraint to make the local lane work. Before I built any of that, I wanted to know whether it earned its complexity.

What I ran

Eight real Dependabot pull requests from my own repositories, each of which had failed CI. Not synthetic bugs: the actual PR head, the actual failing job log, the actual verify command CI ran. The shapes were the ones every Node maintainer recognizes: a lockfile regenerated without an overrides block, an Express 5 route syntax change, a TypeScript major that removed a compiler option, a Tailwind 4 plugin move, two Vite peer-range conflicts, and two React 19 type migrations.

Seven arms ran every case: Codex CLI with three OpenAI models (GPT-6 Astra, gpt-5.6-luna, gpt-5.4-mini), Claude Code with three Anthropic models (Opus 5, Sonnet 5, Haiku 4.5), and Codex CLI pointed at the local Qwen3-Coder-30B lane. Fifty-six runs. Each one got the same prompt, the same rules (keep the bumps, do not touch tests or CI config, write a result file), a ten-minute cap, and a fresh container. The agent never scored itself. A separate container reinstalled dependencies from scratch and ran the exact CI command. Pass or fail came from that exit code and nothing else.

What happened

Every hosted arm fixed every case. Forty-eight of forty-eight. Frontier and budget models landed on the same fix families, which tells me the corpus is easy once the error message is read. That is an observation about these eight cases, not a claim about dependency repair in general.

The cheapest arm, gpt-5.6-luna through Codex CLI, passed eight of eight with a mean of 48 seconds per case and a total bill of 0.13 USD. The two frontier arms produced the same fixes for 3.29 and 3.40 USD, roughly 25 times the cost.

The local lane passed six of eight, with a mean of 454 seconds per case. Four of its eight runs ran until the 600-second cap killed them, and in all four the fix was already in place; the model kept running git status and git diff and telling itself to check more carefully. Three of its passing trees contained files no reviewer wants to see: a 927-line .backup copy of an application file, a temporary tsconfig, a tsconfig backup. And the two failures were the ones that open this piece: both React 19 type cases, where the model bumped the peer versions, declared the work done, and left TS2503: Cannot find namespace 'JSX' unfixed behind that bump. Every hosted model fixed those two by adding explicit JSX type imports.

Token use tells the same story from another angle. The local lane consumed several times the default Codex and Opus arms' input tokens on the same case, up to 1.18 million on one React case, and the four capped runs reported no usage at all because the client only emits it when a turn completes. The real figure is higher than the table shows.

The decision

On 2026-09-08 I took the local model out of the design. The fix lane runs on the cheapest hosted model that passed, escalating to a stronger one only when the verify step fails.

Correctness mattered most. A lane that emits "fixed" over a still-failing build is worse than a lane that says nothing, because it spends a human's trust on the wrong runs. The verify step would have caught both false claims, so no bad patch would have shipped. But a lane whose engine is wrong about its own output one time in four cannot be trusted with anything the verifier does not cover, and no verifier covers everything.

Time mattered second. Seven to ten minutes per PR against about one minute is not a rounding error when the goal is to attempt every failing PR every week. Cleanliness was third: junk files are filterable, but every filter is code I have to maintain for one engine.

Cost, oddly, mattered least, and it still went against the GPU. The local lane is billed at zero in the table because I own the hardware. It is not free. The Spark's idle draw alone, 22 to 45 watts across the reviews and forum reports I found, depending on firmware, costs more per year at typical US residential rates than the hosted lane would at observed volume, which the companion research puts at 7 to 27 USD a year. The break-even analyses I read put local parity against mini-tier pricing past 200 million tokens a month. A weekly dependency sweep is not that.

What did not change: the sandbox, the credential-free container, the egress allowlist, the patch path rules, the independent verify, the draft-only packet, and human review of every patch. The one real cost of the decision is a data-sharing one. PR diffs and CI logs from my repositories, all of them private, now leave the house to a vendor API. That is a choice I made knowingly, and it is the strongest argument left for a local lane. It was not strong enough here.

What this does not show

Eight cases, one run each, one corpus from three small Node repositories, one local model on one serving stack, and hosted models as they existed on 2026-09-07. Agents are not deterministic; a second pass could move a row. The per-arm speed ordering is soft. The 48-for-48 is an observed result on this corpus, not a reliability figure. Six arms agreeing shows that every case was fixable by several different models under this harness. It does not replicate anything: all six saw the same eight cases under the same protocol, once each. What I measured is case coverage. How often any one arm would repeat its result on a second run, I did not measure.

The local model is a 2025-vintage release, two agent-training generations behind the current open-weight coding models. Its failures match the documented open-weight agent failure class: non-termination, false completion, messy trees. If I retry local for this lane I will retry on a current model with a repeat-action detector and hard caps, not on this one. That is a plan, not a prediction that it would win.

The GPU is still busy. It runs my repository quality scanner and is the target of the eval harness that produced this benchmark. It just does not fix my dependency PRs.