What Does a Harness Buy? Tokens, Mostly
Organizations: Shandong University
Abstract
A coding agent is a language model wrapped in a harness: the system prompt, the tool set, and the context management that turn a chat model into something that can work inside a repository. Production harnesses ship releases daily, vendors advertise pass-rate gains from harness changes, and leaderboards mix harnesses freely. What is rarely measured is how much the harness itself moves the score when the model is held fixed. We run five models through three production harnesses, Claude Code, mini-SWE-agent, and OpenCode, on SWE-bench Verified, and rerun the same configurations to calibrate how much a score moves when nothing changes but the run. On 447 tasks and the two models we ran there, Claude Code and mini-SWE-agent, the heaviest and the lightest harness, are equivalent within five points. On a 45-task hard subset and five models, swapping the harness flips as many tasks as rerunning the same harness, 13% in both cases, and the tasks a harness wins in one run are not the tasks it wins in the next. The one harness effect that clears the noise is a loss, not a gain: OpenCode trails by up to 9 points on the large pool, and on one model half of that gap sits in runs its output cap cut short. What the harness does decide is the bill. With the same model, the same tasks, and one price list, cost per task differs by up to 3x across harnesses. The gap is set at the first call, by the preamble of system prompt and tool schemas each harness sends with every step, and scaled by the number of steps; per-step growth and per-call tool output differ far less. The provider's price for cached input scales the bill and does not reorder it. The rerun data also give the resolution a harness comparison needs: at the discordance we observe, 45 tasks catch a 13-point gap only half the time and no gap with 80% power, and 447 tasks resolve 5 points, still coarser than the gains many harness changes claim.
Figures & tables
| Model | Pair | (pp) | McNemar | Verdict | |||||
|---|---|---|---|---|---|---|---|---|---|
| Qwen3.6-35B-A3B | CC mini | 445 | 310 | 318 | 26 | 34 | 1.8 [ 5.2, +1.6] | .37 | equivalent |
| CC OC | 445 | 310 | 297 | 43 | 30 | +2.9 [ 0.9, +6.7] | .16 | inconclusive | |
| mini OC | 445 | 318 | 297 | 45 | 24 | +4.7 [+1.1, +8.4] | .02 | inferior | |
| Qwen3.8-27B | CC mini | 444 | 347 | 353 | 17 | 23 | 1.4 [ 4.2, +1.5] | .43 | equivalent |
| CC OC | 444 | 347 | 312 | 52 | 17 | +7.9 [+4.3, +11.5] | .001 | inferior | |
| mini OC | 445 | 353 | 312 | 57 | 16 | +9.2 [+5.5, +12.9] | .001 | inferior |
| Model | Claude Code | mini-SWE-agent | OpenCode (rg) |
|---|---|---|---|
| Qwen3.6-35B-A3B | 11/45 24% [14, 39] | 15/45 33% [21, 48] | 11/45 24% [14, 39] |
| Qwen3.8-27B | 19/43 44% [30, 59] | 17/45 38% [25, 52] | 17/45 38% [25, 52] |
| DeepSeek-V4-Flash | 21/45 47% [33, 61] | 22/45 49% [35, 63] | 19/45 42% [29, 57] |
| GLM-5.3-Flash | 22/45 49% [35, 63] | 20/45 44% [31, 59] | 18/45 40% [27, 55] |
| HY4-Preview | 23/45 51% [37, 65] | 26/45 58% [43, 71] | 21/45 47% [33, 61] |
| Claude Opus 5 | 36/45 80% [66, 89] | — | — |
Appendix figures & tables10 assets
Supplementary material from the paper’s appendix.
Appendix
| Claude Code | mini-SWE-agent | OpenCode | |
| Version (pinned per arm) a | 2.1.259–2.1.273 (2.1.263 on GLM and Opus) | 2.4.6 | 1.18.30–1.18.31 (1.18.30 on GLM) |
| Sampling | none sent (no flag) | none sent | none sent |
| Thinking / effort | GLM: effort high (CLI flag); Qwen: effort xhigh via env (vLLM compat., a no-op) b ; DS: provider default | GLM: reasoning_effort = high (request body); Qwen/DS: default | GLM: reasoningEffort = high (model config); Qwen/DS: default |
| Tools | built-in set (Bash, Read, Edit, Write, Grep…); WebSearch disallowed | bash only | bash, read, edit, write, glob, grep, webfetch, task; ripgrep pre-placed (rg arms) |
| Context management | auto-compaction: 110k window (env override) on the Qwen arms, client default elsewhere c | none; per-observation head/tail trim (10k chars); hard stop at 131k | prune (40k tool-output tail) + auto-compaction at limit.input minus a 20k reserve (78k); input limit 98k, output limit 32k |
| Termination | --max-turns 300 ; soft timeout (exit 124) | step_limit=300 ; no soft timeout | build.steps=300 ; soft timeout (exit 124) |
| (a) Denominator ledger | ||||||||||
| SWE-bench Verified: 500 tasks | ||||||||||
| 8 psf/requests instances (verifier depends on httpbin.org , hangs offline) pool492 492 | ||||||||||
| hard45 45 (whole difficulty bands 1–4 h and 4 h: 42 3; zero sampling degrees of freedom) pool447 447 (the complementary remainder, disjoint) | ||||||||||
| django__django-11133 is filed under the hard45 label as the universal smoke task but belongs to pool447; it has no usable hard45 row, so the scored hard45 universe is 45. | ||||||||||
| (b) What the denominator loses, canonical run-1 trials | ||||||||||
| Subset | Model | Arm | ok | void | overfl. | t/out | step | out-cut | other | |
| Model | Subset | Arm | Run | ok | pass | void | Status | Jobs | |
| Qwen3.6 | hard45 | CC | 1 | 45 | 45 | 11 | 0 | complete | cc-qwen36-hard45-nw |
| CC | 2 | 45 | 45 | 10 | 0 | complete | cc-qwen36-hard45-nw-k2 | ||
| mini | 1 | 45 | 45 | 15 | 0 | complete | mini-qwen36-hard45-nw (+ -r , -r2 ) | ||
| mini | 2 | 45 | 45 | 13 | 0 | complete | mini-qwen36-hard45-nw-k2 | ||
| OC-rg | 1 | 45 | 45 | 11 | 0 | complete | oc-qwen36-hard45-nw-rg (+ -r ) | ||
| OC-rg | 2 | 45 | 45 | 11 | 0 | complete | oc-qwen36-hard45-nw-rg-k2 |
| (a) Tool-return size per call (chars) | |||||
| Harness | calls | mean | median | p90 | Largest sources |
| Claude Code | 4,403 | 1,237 | 392 | 3,095 | Bash 68%, Read 30% |
| mini-SWE-agent | 3,787 | 1,186 | 461 | 3,121 | bash 100% |
| OpenCode | 2,633 | 1,103 | 311 | 3,049 | read 49%, bash 39%, grep 9% |
| Setting | CC version | Solved / 45 | flips | McNemar | output | reas. | steps | USD/trial | |
| 95% CI (%) | /135 | vs. s1 | tok. | tok. | (mean) | ||||
| Control, run 1 | 2.1.263 | 36 | [66.2, 89.1] | — | — | 15,984 | 4,916 | 34 | 1.83 |
| Control, run 2 | 2.1.263 | 35 | [63.7, 87.5] | — | 1.00 | 12,777 | 5,927 | 32 | 1.51 |
| Control, run 3 | 2.1.263 | 35 | [63.7, 87.5] | — | 1.00 | 14,930 | 5,345 | 39 | 1.60 |
| Bash-only, run 1 | 2.1.263 | 36 | [66.2, 89.1] | 16/135 | 1.00 | 13,539 | 5,378 | 31 | 1.42 |
| Bash-only, run 2 | 2.1.263 | 37 | [68.7, 90.7] | 7/135 | 1.00 | 12,250 | 5,853 | 28 | 1.63 |
| Harness | solved / attempts | per-task mean | up / | sign | med. steps | med. output | ||
| on | off | on off | (pp) | down | on off | on off | ||
| Claude Code | 21/90 | 22/87 | 0.233 0.256 | +2.2 | 7 / 5 | 0.77 | 103.5 126 | 27,761 24,550 |
| mini-SWE-agent | 28/90 | 18/90 | 0.311 0.200 | 11.1 | 2 / 10 | 0.04 | 106.5 98 | 25,198 20,582 |
| OpenCode | 15/88 | 16/86 | 0.148 0.182 | +3.4 | 7 / 5 | 0.77 | 56 78.5 | 14,018 15,949.5 |
| HY4-Preview, Claude Code only, one run per side, thinking switched at the API | ||||||||
| Claude Code | 23/45 | 18/45 | 0.511 0.400 | 11.1 | 4 / 9 | 0.27 | 75 90 | 43,189 15,001 |
| Model | Pair | baseline (pp) [95% CI] ( ) | no ovfl. | per-prot. | OC ship | run 2 |
| hard45 | ||||||
| Qwen3.6 | CC mini | -8.9 [-23.9, +6.6] (45) | -9.3 43 | -6.8 44 | — | -6.7 |
| CC OC | +0.0 [-11.8, +11.8] (45) | +0.0 44 | +11.1 | -2.2 | ||
| mini OC | +8.9 [-4.0, +21.5] (45) | +9.3 43 | +20.0 | +4.4 | ||
| Qwen3.8 | CC mini | +7.0 [-5.5, +19.1] (43) | +0.0 32 | +7.0 | — | +4.4 45 |
| CC OC | +7.0 [-1.8, +15.5] (43) | +7.1 42 | +8.1 37 | +4.7 | +11.4 44 | |