Summary
We replayed 12 pull requests merged into browserbase/stagehand between 2026-06-10 and 2026-09-27 as coding tasks. Each of 8 models ran in TokenSpend's reference harness, and 6 of them also ran through 6 other agent harnesses. A task counts as resolved only when the pull request's own tests pass on the model's change. Costs come from the token counts the router metered for each request.
- The harness mattered most for open models. GLM 5.3 resolved between 3 and 11 of 12 tasks, depending on which one it ran in.
- In every harness, Opus 5.5 resolved 11 or 12 tasks and GPT-6 Astra resolved 12. Their cost per resolved task still changed by up to 2× between harnesses.
- In the reference harness, Opus 5.5 resolved 36 of 36 attempts at $0.184 per resolved task.
- DeepSeek V4.1 Flash in tokenspend-mini has the highest arena rating (1707). The arena counts a win for the cheaper setup when both solve a task.
- DeepSeek V4.1 Flash in tokenspend-mini was the cheapest setup to resolve at least 80% of tasks. It resolved 12 of 12 on first attempts, at $0.021 per resolved task.
Results by model
Every model ran in the same reference harness (tokenspend-mini@1), with five tools, one prompt, and 60 turns and 30 minutes per attempt.
| Model | Resolved | Pass rate | Cost per resolved task | Median time | Median turns | Why attempts failed |
|---|---|---|---|---|---|---|
| Opus 5.5 | 36 of 36 | 100% ± 0 | $0.184 | 64s | 10 | none |
| GPT-6 Astra | 36 of 36 | 100% ± 0 | $0.495 | 2.3 min | 12 | none |
| DeepSeek V4.1 Flash | 35 of 36 | 97% ± 3 | $0.021 | 3.8 min | 47 | Tests failed 1 |
| Fable 5.1 | 12 of 12 | 100% | $1.12 | 3.4 min | 16 | none |
| GPT-6 Sol | 11 of 12 | 92% | $0.150 | 2.4 min | 20 | Tests failed 1 |
| Grok 4.7 | 11 of 12 | 92% | $0.998 | 3.0 min | 29 | Tests failed 1 |
| Kimi K3 | 6 of 12 | 50% | $1.71 | 10.1 min | 45 | Tests failed 3, Time limit 2, Turn limit 1 |
| GLM 5.3 | 5 of 12 | 42% | $1.46 | 12.9 min | 60 | Time limit 3, Broke the build 3, Turn limit 1 |
Table 1. Results by model, reference harness.
Running out of turns or time counts as a failure. Cost per resolved task includes all requests from all attempts, including retries. Opus 5.5, GPT-6 Astra and DeepSeek V4.1 Flash ran 3 times; ± is the standard error across runs.
| Model | #2213 | #2220 | #2306 | #2335 | #2347 | #2361 | #2542 | #2752 | #2787 | #2799 | #3034 | #3052 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Opus 5.5 | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 |
| GPT-6 Astra | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 |
| DeepSeek V4.1 Flash | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 3/3 | 2/3 | 3/3 | 3/3 |
| Fable 5.1 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| GPT-6 Sol | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | – | ✓ | ✓ |
| Grok 4.7 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | – | ✓ | ✓ |
| Kimi K3 | ✓ | ✓ | ✓ | ✓ | – | – | – | ✓ | ✓ | – | – | – |
| GLM 5.3 | ✓ | – | – | ✓ | – | ✓ | ✓ | ✓ | – | – | – | – |
Table 2. Results per task, reference harness. ✓ resolved, – not resolved. For models that ran more than once, the cell shows runs resolved. Hover a cell for the reason.
Results by harness
We ran the same 12 tasks through other coding-agent harnesses on 6 of the models. Each harness uses its own prompt, tools and loop. Containers, limits, router and grader match the reference runs.
| Harness | Opus 5.5 | GPT-6 Astra | DeepSeek V4.1 Flash | Grok 4.7 | Kimi K3 | GLM 5.3 |
|---|---|---|---|---|---|---|
| tokenspend-miniv1 | 12/12$0.178 | 12/12$0.485 | 12/12$0.021 | 11/12$0.998 | 6/12$1.71 | 5/12$1.46 |
| mini-swe-agent2.4.6 | 11/12$0.238 | 12/12$0.736 | 10/12$0.031 | 8/12$1.88 | 8/12$1.72 | 5/12$1.32 |
| Claude Code2.1.286 | 12/12$0.242 | – | 10/12$0.025 | 10/12$1.50 | 10/12$1.30 | 10/12$0.756 |
| Codex0.159.3 | – | 12/12$0.559 | – | – | – | – |
| Pi0.99.2 | 12/12$0.168 | 12/12$0.570 | 8/12$0.034 | 10/12$1.32 | 10/12$0.862 | 11/12$0.658 |
| Hermesmain-612d8e4 | 12/12$0.338 | 12/12$1.14 | 9/12$0.047 | 8/12$3.58 | 10/12$1.18 | 3/12$2.70 |
| Cursor2026.09.28-64d2043 | 12/12$0.365* | – | – | 10/12$0.911* | 11/12$0.978* | – |
Table 3. Tasks resolved and cost per resolved task, by harness and model.
Each cell shows tasks resolved out of 12, then cost per resolved task, from first attempts. The reference-harness row can differ from Table 1, which counts every run. The best harness for each model (most tasks resolved, then lowest cost) is shaded and bold. – means not run. * Estimated from Cursor's token counts at its published prices.
tokenspend-mini, the reference harness other harnesses
tokenspend-mini other harnesses estimated cost
| Harness | Resolved | Cost per resolved task | Median turns | Median time | Prompt read from cache |
|---|---|---|---|---|---|
| Opus 5.5 | |||||
| Pi 0.99.2 | 12 of 12 | $0.168 | 10 | 61s | 89% |
| tokenspend-mini v1 | 12 of 12 | $0.178 | 11 | 65s | 87% |
| Claude Code 2.1.286 | 12 of 12 | $0.242 | 8 | 78s | 93% |
| Hermes main-612d8e4 | 12 of 12 | $0.338 | 14 | 1.6 min | 94% |
| Cursor 2026.09.28-64d2043 | 12 of 12 | $0.365* | n/a | 2.1 min | 93% |
| mini-swe-agent 2.4.6 | 11 of 12 | $0.238 | 9 | 89s | 89% |
| GPT-6 Astra | |||||
| tokenspend-mini v1 | 12 of 12 | $0.485 | 12 | 2.0 min | 84% |
| Codex 0.159.3 | 12 of 12 | $0.559 | 11 | 66s | 90% |
| Pi 0.99.2 | 12 of 12 | $0.570 | 12 | 1.6 min | 89% |
| mini-swe-agent 2.4.6 | 12 of 12 | $0.736 | 12 | 1.6 min | 87% |
| Hermes main-612d8e4 | 12 of 12 | $1.14 | 12 | 2.3 min | 88% |
| Kimi K3 | |||||
| Cursor 2026.09.28-64d2043 | 11 of 12 | $0.978* | n/a | 4.7 min | 95% |
| Pi 0.99.2 | 10 of 12 | $0.862 | 35 | 6.5 min | 95% |
| Hermes main-612d8e4 | 10 of 12 | $1.18 | 39 | 6.4 min | 97% |
| Claude Code 2.1.286 | 10 of 12 | $1.30 | 33 | 10.4 min | 96% |
| mini-swe-agent 2.4.6 | 8 of 12 | $1.72 | 50 | 14.9 min | 96% |
| tokenspend-mini v1 | 6 of 12 | $1.71 | 45 | 10.1 min | 93% |
| Grok 4.7 | |||||
| tokenspend-mini v1 | 11 of 12 | $0.998 | 29 | 3.0 min | 84% |
| Cursor 2026.09.28-64d2043 | 10 of 12 | $0.911* | n/a | 5.1 min | 85% |
| Pi 0.99.2 | 10 of 12 | $1.32 | 37 | 5.4 min | 82% |
| Claude Code 2.1.286 | 10 of 12 | $1.50 | 26 | 3.4 min | 88% |
| mini-swe-agent 2.4.6 | 8 of 12 | $1.88 | 28 | 4.5 min | 86% |
| Hermes main-612d8e4 | 8 of 12 | $3.58 | 34 | 5.6 min | 91% |
| GLM 5.3 | |||||
| Pi 0.99.2 | 11 of 12 | $0.658 | 52 | 11.9 min | 97% |
| Claude Code 2.1.286 | 10 of 12 | $0.756 | 56 | 8.2 min | 97% |
| mini-swe-agent 2.4.6 | 5 of 12 | $1.32 | 57 | 13.2 min | 95% |
| tokenspend-mini v1 | 5 of 12 | $1.46 | 60 | 12.9 min | 97% |
| Hermes main-612d8e4 | 3 of 12 | $2.70 | 29 | 30.0 min | 96% |
| DeepSeek V4.1 Flash | |||||
| tokenspend-mini v1 | 12 of 12 | $0.021 | 45 | 3.6 min | 96% |
| Claude Code 2.1.286 | 10 of 12 | $0.025 | 30 | 2.7 min | 97% |
| mini-swe-agent 2.4.6 | 10 of 12 | $0.031 | 38 | 4.4 min | 95% |
| Hermes main-612d8e4 | 9 of 12 | $0.047 | 45 | 5.2 min | 97% |
| Pi 0.99.2 | 8 of 12 | $0.034 | 32 | 6.5 min | 96% |
Table 4. Results per harness and model.
* Estimated from Cursor's token counts at its published prices; Cursor reports no turn count.
Notes
- Only first attempts count in this section.
- mini-swe-agent comes from the team behind SWE-bench.
- Codex ran its GPT-6 Astra profile in the standard Responses format and edited files through its shell tool.
- Pi does not retry a failed model request. Attempts cut off by a provider error were run again.
- Cursor runs model calls on its own servers, so its costs are estimates, made from its token counts at Cursor's published prices. It reports no turn count. Opus 5.5 ran as Cursor's medium-effort 300K-context variant and Kimi K3 as its max-effort variant. Cursor does not offer GLM 5.3, DeepSeek V4.1 Flash or GPT-6.
- Claude Code ran on non-Claude models after a router fix that keeps its turns separate and its prompt cache working.
- Hermes asks for medium reasoning effort with no output limit. GLM 5.3 then reasoned past 8,000 tokens on about one request in seven, and most of those attempts hit the time limit.
- At most 5 attempts ran at once, on one 8-core machine. Attempts that hit the time limit while the machine was overloaded were run again.
Overall scores
Several setups solved every task, so pass rate alone cannot rank them. We add two scores. The difficulty-adjusted score (item response theory, the method behind the Epoch Capabilities Index) puts models, harnesses and tasks on one scale and separates the model's effect from the harness's effect. The arena rating (Bradley-Terry, the method behind LMArena) compares setups two at a time on each task. Solving beats failing, and when both solve a task the cheaper one wins.
| Model | Score | 90% range | Note |
|---|---|---|---|
| GPT-6 Astra | 1909+ | 1834 to 1972 | Lower bound, since it never missed a task. |
| Opus 5.5 | 1803 | 1690 to 1964 | |
| Fable 5.1 | 1615+ | 1571 to 1646 | Lower bound, since it never missed a task. |
| GPT-6 Sol | 1443 | 1248 to 1632 | |
| DeepSeek V4.1 Flash | 1395 | 1275 to 1573 | |
| Grok 4.7 | 1282 | 1109 to 1487 | |
| Kimi K3 | 1246 | 1141 to 1379 | |
| GLM 5.3 | 1059 | 953 to 1174 |
Table 5. Model ability across all harnesses, difficulty-adjusted.
The average task scores 1000. A score 200 points above a task's is about a 76% chance of solving it. Ranges come from refitting on resampled tasks.
| Harness | Points | A task tokenspend-mini solves half the time | 90% range |
|---|---|---|---|
| Cursor | +117 | 66% | −38 to +251 |
| Claude Code | +107 | 65% | −14 to +230 |
| Pi | +83 | 62% | −56 to +220 |
| Codex | Not measurable: every attempt was resolved | ||
| tokenspend-mini reference | 0 | 50% | |
| Hermes | −108 | 35% | −214 to −17 |
| mini-swe-agent | −108 | 35% | −206 to −3 |
Table 6. What each harness adds, against tokenspend-mini.
This assumes a harness helps every model equally. Table 3 shows pairs where it does not, such as Hermes on GLM 5.3.
| Task | Title | Difficulty | Solved |
|---|---|---|---|
| #2799 | fix(cli): resolve template sources and align setup instructions | 1382 | 24 of 41 |
| #2306 | fix(core): declare CUA screenshot media type at capture boundary (#2300) | 1357 | 25 of 41 |
| #3034 | feat: add internal PDF capture to the extension | 1158 | 32 of 41 |
| #2347 | feat(core): support OpenAI Chat Completions via openaiEndpointFormat | 1086 | 34 of 41 |
| #2542 | fix: verify cached local Chrome debug port before trusting it | 1002 | 36 of 41 |
| #2220 | STG-2196 Shadow DOM fix | 952 | 37 of 41 |
| #2361 | feat: warn and add opt-out flag for browse CLI .env auto-loading | 895 | 38 of 41 |
| #3052 | fix(extension): read text() from direct child text nodes (#2728) | 895 | 38 of 41 |
| #2335 | [STG-2511] feat: add browse skills show and agent-facing --help header | 895 | 38 of 41 |
| #2787 | ci: publish commit-addressed alpha releases of the Python SDK | 895 | 38 of 41 |
| #2752 | Allow SDKs to reattach to Stagehand runtimes | 741 | 40 of 41 |
| #2213 | [STG-2183] fix(cli): list full template catalog (send scope=all) | 741 | 40 of 41 |
Table 7. Task difficulty, on the same scale as Table 5. A task every setup solved cannot tell setups apart. Solved counts every graded attempt on the task, repeat runs included.
| Rank | Setup | Rating | 90% range | Won | Lost | Drawn |
|---|---|---|---|---|---|---|
| 1 | DeepSeek V4.1 Flash in tokenspend-mini | 1707 | 1675 to 1904 | 393 | 15 | 0 |
| 2 | DeepSeek V4.1 Flash in Claude Code | 1423 | 1204 to 1936 | 328 | 60 | 1 |
| 3 | DeepSeek V4.1 Flash in mini-swe-agent | 1406 | 1232 to 1731 | 321 | 65 | 1 |
| 4 | Opus 5.5 in Pi | 1389 | 1373 to 1467 | 335 | 69 | 4 |
| 5 | Opus 5.5 in tokenspend-mini | 1381 | 1364 to 1479 | 332 | 70 | 6 |
| 6 | GPT-6 Sol in tokenspend-mini | 1368 | 1262 to 1535 | 317 | 73 | 3 |
| 7 | Opus 5.5 in mini-swe-agent | 1300 | 1204 to 1440 | 298 | 91 | 4 |
| 8 | Opus 5.5 in Claude Code | 1289 | 1264 to 1355 | 306 | 96 | 6 |
| 9 | DeepSeek V4.1 Flash in Hermes | 1287 | 1068 to 1627 | 280 | 94 | 0 |
| 10 | Opus 5.5 in Hermes | 1244 | 1219 to 1299 | 292 | 110 | 6 |
| 11 | Opus 5.5 in Cursor | 1212 | 1182 to 1273 | 282 | 121 | 5 |
| 12 | DeepSeek V4.1 Flash in Pi | 1211 | 952 to 1600 | 258 | 116 | 0 |
| 13 | GPT-6 Astra in tokenspend-mini | 1095 | 1042 to 1157 | 239 | 158 | 11 |
| 14 | GPT-6 Astra in Pi | 1059 | 990 to 1121 | 225 | 170 | 13 |
| 15 | GPT-6 Astra in Codex | 1022 | 942 to 1093 | 213 | 186 | 9 |
| 16 | GLM 5.3 in Pi | 1019 | 892 to 1119 | 201 | 181 | 11 |
| 17 | GPT-6 Astra in mini-swe-agent | 1011 | 897 to 1093 | 209 | 190 | 9 |
| 18 | GLM 5.3 in Claude Code | 949 | 874 to 1014 | 165 | 197 | 16 |
| 19 | Kimi K3 in Pi | 903 | 813 to 970 | 146 | 211 | 21 |
| 20 | Kimi K3 in Hermes | 895 | 758 to 989 | 150 | 223 | 14 |
| 21 | Grok 4.7 in tokenspend-mini | 857 | 720 to 953 | 140 | 237 | 16 |
| 22 | Grok 4.7 in Cursor | 842 | 753 to 905 | 128 | 236 | 14 |
| 23 | Kimi K3 in Cursor | 838 | 733 to 909 | 131 | 243 | 19 |
| 24 | Fable 5.1 in tokenspend-mini | 793 | 659 to 871 | 124 | 271 | 13 |
| 25 | Grok 4.7 in Claude Code | 763 | 572 to 882 | 105 | 273 | 7 |
| 26 | Grok 4.7 in Pi | 761 | 552 to 899 | 105 | 273 | 7 |
| 27 | GPT-6 Astra in Hermes | 755 | 625 to 838 | 109 | 284 | 15 |
| 28 | GLM 5.3 in mini-swe-agent | 753 | 484 to 926 | 92 | 264 | 4 |
| 29 | Kimi K3 in Claude Code | 724 | 584 to 802 | 87 | 280 | 18 |
| 30 | Grok 4.7 in mini-swe-agent | 712 | 518 to 822 | 87 | 289 | 4 |
| 31 | Grok 4.7 in Hermes | 655 | 465 to 768 | 65 | 293 | 9 |
| 32 | GLM 5.3 in tokenspend-mini | 649 | 429 to 758 | 59 | 290 | 8 |
| 33 | Kimi K3 in mini-swe-agent | 636 | 478 to 732 | 66 | 311 | 6 |
| 34 | Kimi K3 in tokenspend-mini | 613 | 401 to 737 | 56 | 309 | 6 |
| 35 | GLM 5.3 in Hermes | 476 | 216 to 593 | 26 | 321 | 4 |
Table 8. Arena rating, cost-aware. Hover a row for its record.
Based on 6,815 comparisons of setup pairs across the 12 tasks, first attempts only. Solving beats failing. When both solve a task the cheaper one wins, and costs within 5% are a draw. Two failures do not count. The average setup rates 1000, and 200 points is about a 76% chance of winning a comparison. This ranks value, so an expensive model that solves everything ranks below a cheap one that does too.
Methodology
- Each task is a merged pull request. We check out the repository at the commit before it. The model gets a description of the change and the code, but not the merged change or its tests.
- We kept a task only if the merged change passed the pull request's tests and an empty change failed them, in three runs out of three. One model completed each description from the tests, two models from other providers audited it, and a person reviewed it.
- Every model ran in our reference agent: five tools (shell, view file, replace text, create file, submit), one prompt, and limits of 60 turns, 30 minutes and a spend cap per attempt. The other harnesses ran as shipped, with the same limits. Containers had 4 CPUs, 5 GB of memory, no network access and no git history.
- To grade an attempt, we apply the model's change to a fresh copy, add the pull request's tests, rebuild the project and run the tests. An attempt is resolved when every test the pull request fixed passes and nothing that passed before breaks.
- Each request carries a tag for its run, task and model. Cost is priced from the token counts on the router's receipts for that tag.
Limitations
- A sample of 12 tasks is small. A difference of fewer than about 3 tasks between two models is not evidence that one is better.
- Completing each description from the tests makes the tasks fair but also easier, and several models solved every task. This set separates models on cost and time more than on ability.
- The arena rating weighs cost only when both setups solve a task. It does not credit code quality, speed or how close a failed attempt came.
- Results by model use the reference harness. For open models it is not the best one, since Kimi K3 and GLM 5.3 resolved more tasks in other harnesses.
- The tasks were merged between 2026-06-10 and 2026-09-27. Some may have been in a model's training data.
- Slow serving counts against a model. An attempt that hits the time limit fails, even when the delay came from the host.
Tasks
- #2213 [STG-2183] fix(cli): list full template catalog (send scope=all) Merged 2026-06-10, 19 lines changed, 2 target tests.
- #2220 STG-2196 Shadow DOM fix Merged 2026-06-10, 125 lines changed, 5 target tests.
- #2306 fix(core): declare CUA screenshot media type at capture boundary (#2300) Merged 2026-07-06, 139 lines changed, 3 target tests.
- #2335 [STG-2511] feat: add browse skills show and agent-facing --help header Merged 2026-07-09, 59 lines changed, 6 target tests.
- #2347 feat(core): support OpenAI Chat Completions via openaiEndpointFormat Merged 2026-07-21, 49 lines changed, 4 target tests.
- #2361 feat: warn and add opt-out flag for browse CLI .env auto-loading Merged 2026-07-14, 42 lines changed, 6 target tests.
- #2542 fix: verify cached local Chrome debug port before trusting it Merged 2026-09-24, 90 lines changed, 3 target tests.
- #2752 Allow SDKs to reattach to Stagehand runtimes Merged 2026-08-20, 17 lines changed, 3 target tests.
- #2787 ci: publish commit-addressed alpha releases of the Python SDK Merged 2026-08-24, 161 lines changed, 7 target tests.
- #2799 fix(cli): resolve template sources and align setup instructions Merged 2026-09-23, 73 lines changed, 8 target tests.
- #3034 feat: add internal PDF capture to the extension Merged 2026-09-27, 33 lines changed, 6 target tests.
- #3052 fix(extension): read text() from direct child text nodes (#2728) Merged 2026-09-26, 78 lines changed, 3 target tests.