Claude Opus 5.5 vs Claude Sonnet 5: baseline coding comparison
| Prepared | 2026-10-12 |
| Models | claude-opus-5-5 and claude-sonnet-5, both through Claude Code 2.1.282 |
| Runs | Sonnet 5: 59 runs (L01–L12 on 2026-10-08, L13–L20 on 2026-10-12). Opus 5.5: 60 runs on 2026-10-09 |
| Setup | No skills or plugins, no web access, each run in a fresh isolated container |
1. Summary
Overall. On the 12 easier tasks the models are close: both are correct, and Opus is faster but only somewhat cheaper. On the 8 harder tasks Opus is clearly ahead on every measure except code quality, where the two are level. Opus passed every hidden test in all 60 of its runs; Sonnet did so in 52 of 59.
On the 12 easier tasks (L01–L12):
- Correctness. Both models produced working code on every task. Opus passed every hidden test in all 36 of its runs. Sonnet did so in 33 of 35. Its other two runs (both on L01) each failed 2 of 270 tests.
- Cost and speed. Opus used fewer tokens and finished faster on every one of the 12 tasks. Summed over the per-task medians, Opus used 67% fewer tokens (1.35 M against 4.16 M) and 59% less time (15 min 6 s against 36 min 55 s).
- Dollar cost at API list prices. Opus was about 24% cheaper in total ($2.92 against $3.83, summed over the per-task median cost of a run). That’s much less than its 67% token saving, for two reasons. Opus charges twice Sonnet’s rate for input, cache writes and output. And most of the tokens it saves are cache reads, which cost the same $0.20 per million on both models. Task by task, Opus was cheaper on 5 of the 12 and more expensive on 7. The two longest tasks, L07 and L10, account for more than the whole saving: Sonnet cost 2.7× and 2.5× as much on them.
- Subscription usage. The two models used about the same share of the five-hour usage allowance per run: 2.2 points per run for Opus and 2.3 for Sonnet. Opus’s lower token count did not make it cheaper to run on a subscription.
- Consistency of solution size. The two are about equal. The average spread in lines of code between repeat runs was 7.8% for Opus and 7.6% for Sonnet.
- Consistency of growth class. Sonnet was more consistent. The growth class is how a solution’s work grows with input size, such as n or n². Across repeat runs, Sonnet landed in the same class on 7 of 9 measured tasks and Opus on 5 of 9. The cases where Opus varied are mixed: it was sometimes better than Sonnet and once worse (§3.3).
- Readability. Both models met the readability floor equally often: 16 of 35 Sonnet runs and 16 of 36 Opus runs.
On the 8 harder tasks (L13–L20, §4):
- Correctness separates the models. Opus passed every hidden test in all 24 runs. Sonnet did so in 19 of 24. On L13 no Sonnet run passed every test (best: 66% as stored, 70% on regrading, §4.1). On L16 one of three did; the other two were stopped at the 20-minute time limit with 55% and 47% passing.
- Cost and speed. Opus used fewer tokens and finished faster on all 8 tasks. Summed over the per-task medians, Opus used 86% fewer tokens (1.18 M against 8.64 M) and 79% less time (16 min 54 s against 81 min 25 s).
- Dollar cost at API list prices. Opus was 58% cheaper ($2.64 against $6.32, summed over per-task medians). It was cheaper on 7 of the 8 tasks; on L16 the two are within 2%.
- Subscription usage. Sonnet used about 3× as much of the five-hour allowance per run: 7.3 points against Opus’s 2.3.
- Consistency of solution size. Opus was slightly more consistent: an average spread of 13.4% against Sonnet’s 15.8%. Sonnet wrote the larger solution on all 8 tasks by median.
- Growth class. Identical. On all 6 measured tasks, both models’ runs had the same average growth class.
- Readability. No run from either model met the readability floor on these tasks.
These figures come from 2–3 runs per task per model. As more runs from both models are added, the averages will firm up, and some figures in this report may change slightly.
2. How the comparison was run
Tasks. Eurystheus is a benchmark harness. It gives a model a fixed ladder of coding tasks, called labours, in five tiers of difficulty:
- L01–L04 are tier 1, L05–L08 tier 2 and L09–L12 tier 3. These are, in order, everyday fixes and parsers, algorithms and refactors, and performance work and interpreters.
- L13–L16 are tier 4: a collaborative-text data structure, a bytecode VM, a stiff ODE solver and robust Delaunay triangulation.
- L17–L20 are tier 5: mathematical tasks.
Each run gets a freshly generated variant of its task, from a random seed. Repeat runs are therefore similar problems, not identical ones, and some of the variation reported here comes from the tasks themselves.
Conditions. Each run took place in its own Docker container with:
- a blank Claude Code configuration (no personal skills, plugins or connectors);
- only the Anthropic API reachable on the network;
- permission mode
auto.
The hidden tests, reference solutions and grading run in a separate container after the agent’s container has exited, so the model never sees them.
What was measured, per run:
| Measure | Meaning |
|---|---|
| Pass rate | Share of the hidden tests that passed (8–2,001 tests per task, depending on the task) |
| Lines added | Lines of code the solution added to the starting files |
| Growth class | How the solution’s operation count grows with input size, such as n, n log n or n², fitted from exact bytecode operation counts at several input sizes. This is measured for 9 of the 12 shared tasks and 6 of the 8 harder ones. |
| Readability floor | Pass or fail. Every function must have cyclomatic complexity ≤ 15, length ≤ 80 lines and nesting ≤ 4, and no single-letter names except agreed mathematical symbols |
| Tokens | Input + output + cache-read + cache-write tokens, as Claude Code reports them. Cache reads make up most of this total |
| Output tokens | Tokens the model generated |
| Time | Wall-clock time of the agent run |
| Usage | Change in the account’s five-hour usage figure, as Claude Code’s live rate-limit events report it |
| Cost | What the run’s tokens would cost at Anthropic’s published API list prices (§3.2) |
Trials. 3 runs per task per model, except Sonnet L12, which has 2 because its session stopped at the usage limit after two runs. A run is stopped if it reaches 1,200 s (20 minutes), and graded on whatever it had written by then.
3. Head-to-head results, L01–L12
3.1 Correctness
| Sonnet 5 | Opus 5.5 | |
|---|---|---|
| Runs | 35 | 36 |
| Runs that finished normally | 35 | 36 |
| Runs passing every hidden test | 33 | 36 |
| Lowest pass rate in any run | 99.26% (L01, 268 of 270) | 100% |
The tasks don’t separate the two models on correctness: both are effectively at the ceiling.
3.2 Cost and speed
Per-task medians:
| Labour | Tokens, Sonnet | Tokens, Opus | Output tokens, Sonnet | Output tokens, Opus | Time, Sonnet | Time, Opus | Turns, Sonnet | Turns, Opus | Cost, Sonnet | Cost, Opus |
|---|---|---|---|---|---|---|---|---|---|---|
| L01 | 91k | 53k | 2.6k | 2.7k | 25 s | 23 s | 3 | 3 | $0.083 | $0.123 |
| L02 | 115k | 48k | 0.5k | 0.7k | 10 s | 9 s | 5 | 3 | $0.035 | $0.034 |
| L03 | 95k | 52k | 3.9k | 2.3k | 41 s | 21 s | 3 | 3 | $0.088 | $0.101 |
| L04 | 260k | 75k | 4.3k | 3.1k | 56 s | 33 s | 12 | 4 | $0.138 | $0.144 |
| L05 | 99k | 55k | 4.5k | 3.7k | 57 s | 38 s | 3 | 3 | $0.102 | $0.138 |
| L06 | 286k | 100k | 13.2k | 5.2k | 130 s | 65 s | 7 | 5 | $0.269 | $0.200 |
| L07 | 734k | 106k | 30.5k | 6.7k | 341 s | 69 s | 12 | 6 | $0.622 | $0.232 |
| L08 | 231k | 92k | 6.2k | 3.7k | 64 s | 33 s | 7 | 5 | $0.145 | $0.158 |
| L09 | 223k | 113k | 5.7k | 5.5k | 71 s | 68 s | 7 | 6 | $0.125 | $0.172 |
| L10 | 941k | 157k | 54.9k | 11.4k | 642 s | 115 s | 14 | 6 | $0.959 | $0.382 |
| L11 | 540k | 293k | 32.8k | 12.5k | 364 s | 232 s | 10 | 9 | $0.562 | $0.528 |
| L12 | 547k | 210k | 41.6k | 23.1k | 412 s | 201 s | 9 | 6 | $0.699 | $0.706 |
| Sum of medians | 4.16 M | 1.35 M | 201k | 81k | 2,215 s | 906 s | $3.83 | $2.92 |
-
Tokens: Opus used fewer on all 12 tasks. The largest gaps are on the longest tasks: L10 took 6.0× as many tokens with Sonnet, and L07 7.0×.
-
Output tokens: Opus generated fewer on 10 of 12 tasks. On L01 and L02, the two smallest, it generated slightly more.
-
Time: Opus was faster on all 12 tasks by median. The gap is small on L01, L02 and L09 (within 3 s) and large on L07 (5.0×) and L10 (5.6×).
-
Turns: Opus used the same number of turns or fewer on every task.
-
Cost: the cost columns show the median cost of one run, priced at Anthropic’s API list prices on 2026-10-11 (platform.claude.com/docs/en/about-claude/pricing):
Per million tokens Input Cache write (1 hour) Cache read Output Opus 5.5 $4.00 $8.00 $0.20 $20.00 Sonnet 5 $2.00 $4.00 $0.20 $10.00 - How the figures were checked. Every cost is calculated at the 1-hour cache-write rate, which Claude Code uses. Claude Code also records a list-price figure for each run that finishes, which gives a check. Of the 119 runs in this report, 114 recorded that figure, and the calculated cost matches it to the cent for 113 of them. The exception is one Sonnet L16 run, where Claude Code recorded $1.075 against $1.180 calculated, probably because part of that run’s cache was written at the cheaper 5-minute rate. It doesn’t change any median. The 5 runs stopped at the time limit (§4) recorded no figure, and their cost is calculated the same way.
- Where each model is cheaper. Opus is cheaper on L02, L06, L07, L10 and L11. Sonnet is cheaper on L01, L03, L04, L05, L08, L09 and L12. On L02, L04 and L12 the two are within 5%.
- What these figures are and aren’t. They are what the same work would cost through the API at list price. A Claude Pro or Max subscription, which these runs used, charges a flat fee, not per token.
Subscription usage per run:
| Session | Runs | Usage figure at start → end | Points per run |
|---|---|---|---|
| Sonnet, L01–L12 | 35 | 6% → 88% | 2.34 |
| Opus, L01–L12 | 35 | 10% → 87% | 2.20 |
| Opus, L13–L20 | 24 | 4% → 60% | 2.33 |
The usage figure is reported in whole percent. It also counts any other use of the same account during the session, so these are approximate. Within that precision, the two models cost the same per run in subscription usage on these tasks, even though Opus used a third of the tokens. That suggests Opus uses up the allowance faster per token. This report doesn’t measure that directly. On the harder tasks, Sonnet’s much larger token use outweighs this, and it used about 3× as much allowance per run (§4.2).
3.3 Consistency across repeat runs
Correctness: Opus passed every test in all 36 runs. Sonnet’s runs were consistent except L01, where 2 of 3 runs each missed 2 of 270 tests.
Solution size (lines added, one value per run):
| Labour | Sonnet | Opus |
|---|---|---|
| L01 | 89, 92, 107 | 97, 93, 91 |
| L02 | 1, 1, 1 | 1, 1, 1 |
| L03 | 89, 69, 73 | 82, 72, 77 |
| L04 | 36, 36, 35 | 27, 34, 39 |
| L05 | 60, 66, 72 | 102, 81, 84 |
| L06 | 147, 159, 136 | 124, 127, 114 |
| L07 | 111, 168, 168 | 141, 142, 155 |
| L08 | 155, 137, 143 | 186, 180, 175 |
| L09 | 16, 13, 18 | 60, 37, 31 |
| L10 | 253, 210, 246 | 240, 235, 242 |
| L11 | 430, 554, 497 | 546, 385, 437 |
| L12 | 793, 829 | 1096, 1115, 1020 |
| Average spread (coefficient of variation) | 7.6% | 7.8% |
- Spread: the average spread between repeat runs is about the same for both models.
- Most variable: Sonnet on L07 (111–168 lines) and Opus on L09 (31–60 lines).
- Size: neither model consistently writes larger solutions. Opus’s median is larger on 6 tasks, smaller on 5 and equal on 1. The clear exceptions are L12, where Opus wrote 1,020–1,115 lines against Sonnet’s 793–829, and L09, where it wrote 31–60 against 13–18.
Growth class (one value per run; the 9 tasks where it’s measured):
| Labour | Sonnet | Opus |
|---|---|---|
| L01 | n log n ×3 | n log n ×3 |
| L03 | n² ×3 | n², n log n, n² |
| L05 | n ×3 | n ×3 |
| L07 | n² log n, n², n² | n², n³, n² |
| L08 | n² ×3 | n², n, n |
| L09 | n log n ×3 | n log n ×3 |
| L10 | n², n log n, n | n, n, n² |
| L11 | n ×3 | n ×3 |
| L12 | n ×2 | n ×3 |
| Same class in every run | 7 of 9 | 5 of 9 |
Opus is less consistent here, but its variation goes both ways:
- Better than Sonnet: on L08, two Opus runs reached
n, a better class than Sonnet reached in any run. On L03, one Opus run reachedn log n. - Worse than Sonnet: on L07, one Opus run landed at
n³, the worst class either model produced on any task. - Both varied: on L10, both models varied; Opus reached
nin two runs and Sonnet in one.
This report doesn’t say whether a change of class reflects a genuinely different algorithm or a borderline fit between two classes. The solutions have not been inspected individually.
Did either model consistently write faster-scaling code? No, not consistently, though Opus has a slight edge. To average growth classes, each class gets its rank on the harness’s own scale, from best to worst: 1, log n, n^½, n^¾, n = 4, n log n = 5, n² = 6, n² log n = 7, n³ = 8, 2ⁿ = 9. Lower ranks mean the code’s work grows more slowly as inputs get bigger.
| Sonnet 5 | Opus 5.5 | |
|---|---|---|
| Average rank (mean per task, averaged over the 9 tasks) | 5.04 | 4.85 |
| Tasks with the lower (better) average rank | 1 (L07) | 3 (L03, L08, L10) |
| Tasks with the same average rank | 5 | 5 |
- The overall gap is small. Opus averages 0.19 of a rank lower, about a fifth of one class, with both models just above n log n.
- Head to head, most comparisons tie. Pairing every Sonnet run with every Opus run on the same task gives 78 comparisons. 58 are ties (74%), Opus is in the better class in 15 (19%), and Sonnet in 5 (6%).
- The edge comes from a few tasks. Most of it is L08, where two of the three Opus runs reached n and every Sonnet run stayed at n². It’s partly offset by Opus’s single n³ run on L07.
- Neither model was ever worse on every run. On no task was every run of one model in a worse class than every run of the other.
- What this does and doesn’t show. With 2–3 runs per task, this difference is not statistically significant. Growth class measures how the number of operations grows with input size, not measured run time.
- Across all 20 tasks. On the harder tasks the two models’ average ranks are identical (§4.3). Over all 15 measured tasks, the average rank is 4.78 for Sonnet and 4.67 for Opus.
3.4 Readability floor
| Labour | Sonnet: runs passing | Opus: runs passing | Sonnet: violations per run | Opus: violations per run |
|---|---|---|---|---|
| L01 | 0/3 | 0/3 | 3, 2, 2 | 3, 3, 3 |
| L02 | 3/3 | 3/3 | 0, 0, 0 | 0, 0, 0 |
| L03 | 0/3 | 0/3 | 3, 3, 2 | 3, 2, 2 |
| L04 | 3/3 | 3/3 | 0, 0, 0 | 0, 0, 0 |
| L05 | 2/3 | 1/3 | 1, 0, 0 | 0, 1, 1 |
| L06 | 3/3 | 3/3 | 0, 0, 0 | 0, 0, 0 |
| L07 | 1/3 | 1/3 | 2, 1, 0 | 0, 2, 3 |
| L08 | 0/3 | 0/3 | 4, 5, 6 | 8, 4, 4 |
| L09 | 3/3 | 3/3 | 0, 0, 0 | 0, 0, 0 |
| L10 | 1/3 | 2/3 | 1, 0, 4 | 0, 0, 1 |
| L11 | 0/3 | 0/3 | 14, 14, 13 | 16, 12, 13 |
| L12 | 0/2 | 0/3 | 12, 13 | 52, 57, 52 |
| Total | 16/35 | 16/36 |
- Same tasks pass and fail for both models. Both models passed in every run on the same 4 tasks (L02, L04, L06, L09) and failed in every run on the same 5 (L01, L03, L08, L11, L12). Both were mixed on the remaining 3. The one large difference is L12, where Opus had about 4× as many violations as Sonnet, in line with its larger solutions there.
- Small violation counts on easier tasks: on L01 and L03, both models fail the floor on just 2–3 violations. Single-letter names, such as
aandbin comparison functions, account for all 16 of the L01 violations and 8 of the 15 on L03. The rest of L03’s are complexity, nesting and length.
4. Head-to-head results, L13–L20
Both models’ L13–L20 runs used the same container images and the same harness commit (43710b0).
4.1 Correctness
| Labour | Hidden tests | Sonnet: pass rate per run | Opus: pass rate per run |
|---|---|---|---|
| L13 | 300 | 0%, 0%*‡ (70% regraded), 66% | 100% ×3 |
| L14 | 161 | 100% ×3 | 100% ×3 |
| L15 | 60 | 100% ×3 (one stopped*) | 100% ×3 |
| L16 | 201 | 100%, 55%, 47% | 100% ×3 (one stopped*) |
| L17 | 12 | 100% ×3 | 100% ×3 |
| L18 | 8 | 100% ×3 | 100% ×3 |
| L19 | 24 | 100% ×3 | 100% ×3 |
| L20 | 40 | 100% ×3 | 100% ×3 |
| Sonnet 5 | Opus 5.5 | |
|---|---|---|
| Runs | 24 | 24 |
| Runs that finished normally | 20 | 23 |
| Runs stopped at the 1,200 s time limit | 4 | 1 |
| Runs passing every hidden test | 19 | 24 |
* A run marked * reached the 1,200 s time limit and was stopped. It is graded on whatever solution it had written by then. Two stopped runs, Sonnet’s on L15 and Opus’s on L16, had already written solutions that pass every test.
‡ This run’s stored grade is 0%, caused by a defect in the harness, not the solution (limitation 4). Regraded with the defect corrected, it passes 210 of 300 tests (70%). The stored evidence is unchanged.
- L13 (a collaborative-text data structure) is where the models differ most. Every Opus run passed all 300 tests, in about 97 s each. No Sonnet run did:
- one finished at 0% because its solution lacks a
text()method that the task’s specification requires, so every test errors; - one was stopped at the time limit, and scores 70% on regrading;
- one finished with 198 of 300 tests passing (66%).
- one finished at 0% because its solution lacks a
- L16 (robust Delaunay triangulation): one Sonnet run passed every test. The other two were stopped at the time limit, with 111 and 94 of 201 tests passing.
- This report doesn’t analyse why the remaining tests failed.
4.2 Cost and speed
Per-task medians:
| Labour | Tokens, Sonnet | Tokens, Opus | Output tokens, Sonnet | Output tokens, Opus | Time, Sonnet | Time, Opus | Turns, Sonnet | Turns, Opus | Cost, Sonnet | Cost, Opus |
|---|---|---|---|---|---|---|---|---|---|---|
| L13 | 825k† | 109k | 66.6k† | 9.4k | 884 s | 97 s | 9 | 5 | $1.109† | $0.279 |
| L14 | 729k | 200k | 56.3k | 17.2k | 575 s | 150 s | 11 | 7 | $0.934 | $0.548 |
| L15 | 3.63 M† | 142k | 57.7k† | 10.2k | 1,164 s | 221 s | 42 | 6 | $1.685† | $0.309 |
| L16 | 1.54 M† | 412k | n/a† | 29.6k† | 1,200 s | 382 s | 14 | 10 | $0.906† | $0.922† |
| L17 | 447k | 56k | 15.9k | 3.9k | 196 s | 41 s | 9 | 3 | $0.355 | $0.143 |
| L18 | 344k | 75k | 30.0k | 4.1k | 350 s | 42 s | 7 | 4 | $0.480 | $0.154 |
| L19 | 411k | 107k | 19.4k | 4.0k | 214 s | 43 s | 10 | 6 | $0.348 | $0.134 |
| L20 | 713k | 76k | 24.8k | 3.7k | 303 s | 39 s | 15 | 4 | $0.501 | $0.153 |
| Sum of medians | 8.64 M | 1.18 M | 271k (excl. L16) | 52k (excl. L16) | 4,885 s | 1,014 s | $6.32 | $2.64 |
† The median includes a run stopped at the time limit. A stopped run never sends Claude Code’s final summary, so the harness counts its tokens from the messages streamed before the stop. That count is a lower bound, and output tokens in particular are badly undercounted (37–224 output tokens per stopped run). Medians marked † may therefore be low. Sonnet’s L16 output median isn’t shown because two of its three runs were stopped, which makes it meaningless.
- Tokens: Opus used fewer on all 8 tasks. The largest gap is L15, at 25.5× as many tokens with Sonnet: every Sonnet run took 38–42 turns, against 3–23 for Opus.
- Time: Opus was faster on all 8 tasks by median, by 3.1× (L16, where Sonnet’s median is the time limit) to 9.1× (L13).
- Turns: Opus used fewer turns on all 8 tasks.
- Cost: Opus was cheaper on 7 of 8 tasks, by 1.7× (L14) to 5.5× (L15). On L16 the two are within 2%, but two of Sonnet’s three L16 costs are lower bounds. Rates are as in §3.2.
- Total spent. Adding every run rather than medians, the 24 runs cost $18.58 for Sonnet and $8.58 for Opus.
Subscription usage per run:
| Session | Runs | Usage figure at start → end | Points per run |
|---|---|---|---|
| Sonnet, L13–L15 | 7 | 15% → 87% | 10.3 |
| Sonnet, L15–L19 | 12 | 0% → 86% | 7.2 |
| Sonnet, L19–L20 | 5 | 0% → 17% | 3.4 |
| Sonnet, all L13–L20 | 24 | 7.3 | |
| Opus, L13–L20 | 24 | 4% → 60% | 2.3 |
Sonnet’s L13–L20 runs needed three five-hour windows; Opus’s fit in one. The heaviest single run was a Sonnet L15 run, which used 20 points (67% → 87%) on its own.
4.3 Consistency across repeat runs
Solution size (lines added, one value per run):
| Labour | Sonnet | Opus |
|---|---|---|
| L13 | 362, 277, 282 | 300, 224, 246 |
| L14 | 979, 946, 936 | 732, 1002, 903 |
| L15 | 278, 175, 256 | 279, 210, 202 |
| L16 | 348, 504, 228 | 372, 277, 289 |
| L17 | 81, 83, 77 | 54, 57, 69 |
| L18 | 270, 137, 248 | 122, 58, 114 |
| L19 | 104, 113, 164 | 62, 66, 54 |
| L20 | 153, 157, 193 | 104, 99, 91 |
| Average spread (coefficient of variation) | 15.8% | 13.4% |
- Spread: Opus was slightly more consistent. Both spread more than on L01–L12, where both were under 8%. Over all 20 tasks, the average spread is 10.9% for Sonnet and 10.0% for Opus.
- Size: Sonnet wrote the larger solution on all 8 tasks by median, most clearly on L18 (248 lines against 114) and L19 (113 against 62). This is the reverse of L12, Opus’s largest gap the other way.
Growth class (one value per run; the 6 tasks where it’s measured):
| Labour | Sonnet | Opus |
|---|---|---|
| L13 | n log n (1 run measured§) | n log n ×3 |
| L14 | n ×3 | n ×3 |
| L16 | n log n, n², n log n | n², n log n, n log n |
| L17 | n^¾ ×3 | n^¾ ×3 |
| L18 | log n ×3 | log n ×3 |
| L19 | n³ ×3 | n³ ×3 |
| Same class in every run | 4 of 5 (L13 excluded) | 5 of 6 |
§ A growth class is measured only for a solution that runs. The two Sonnet L13 runs graded 0% have none.
- Identical averages. On every one of the 6 tasks, the two models’ average growth rank is the same. On L16 each model had one n² run and two n log n runs. Neither model wrote faster-scaling code on these tasks.
4.4 Readability floor
This many failures is indicative of bad grading rather than actually bad code. We will have to look at the code itself written and see if it’s actually this illegible or if our testing is bad.
| Labour | Sonnet: violations per run | Opus: violations per run |
|---|---|---|
| L13 | 14, 6, 8 | 11, 10, 5 |
| L14 | 18, 18, 20 | 25, 33, 29 |
| L15 | 9, 2, 6 | 7, 6, 6 |
| L16 | 18, 12, 6 | 6, 5, 4 |
| L17 | 2, 3, 2 | 2, 2, 2 |
| L18 | 6, 4, 7 | 4, 1, 2 |
| L19 | 7, 2, 2 | 3, 3, 2 |
| L20 | 6, 7, 5 | 4, 2, 3 |
| Total | 190 | 177 |
- No run met the floor. All 48 runs failed it.
- Violation counts are similar. Opus had fewer violations in total on 6 of 8 tasks. It had more on L15 (19 against 17) and on L14, where its runs had 25–33 violations each against Sonnet’s 18–20.
- Over all 20 tasks, each model met the floor in 16 runs: 16 of 59 for Sonnet and 16 of 60 for Opus.
4.5 Scaling with task difficulty and fix length
The five tiers are the benchmark’s own difficulty ladder (§2). Fix length is the number of non-blank lines the task’s reference solution adds to the starting code: a measure of how much code the task needs, independent of either model. Each figure below is a mean over the tier’s 4 tasks of each task’s median run. Ratios are Sonnet’s tier mean divided by Opus’s.
| Tier | Task types | Fix length, lines (mean; range) | Tokens, Sonnet | Tokens, Opus | Token ratio | Time, Sonnet | Time, Opus | Cost, Sonnet | Cost, Opus | Cost ratio | Runs passing every test, Sonnet | Runs passing every test, Opus |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | Everyday fixes and parsers (L01–L04) | 29; 3–46 | 140k | 57k | 2.5× | 33 s | 21 s | $0.086 | $0.100 | 0.86× | 10/12 | 12/12 |
| 2 | Algorithms and refactors (L05–L08) | 78; 59–116 | 338k | 88k | 3.8× | 148 s | 51 s | $0.285 | $0.182 | 1.56× | 12/12 | 12/12 |
| 3 | Performance work and interpreters (L09–L12) | 175; 20–329 | 563k | 193k | 2.9× | 373 s | 154 s | $0.586 | $0.447 | 1.31× | 11/11§ | 12/12 |
| 4 | Data structures, VMs, numerics, geometry (L13–L16) | 199; 79–464 | 1.68 M† | 216k | 7.8× | 956 s | 212 s | $1.159† | $0.514† | 2.25× | 7/12 | 12/12 |
| 5 | Mathematical (L17–L20) | 131; 120–140 | 479k | 78k | 6.1× | 266 s | 41 s | $0.421 | $0.146 | 2.88× | 12/12 | 12/12 |
† Includes runs stopped at the time limit, whose token counts are lower bounds (§4.2). § Counts Sonnet’s two L12 runs as passing, after their regrade (limitation 3).
- Sonnet’s token use grows much faster with difficulty. From tier 1 to tier 4, Opus’s tokens per task grew 3.8× (57k to 216k) and Sonnet’s 12× (140k to 1.68 M). Median turns grew from 3.2 to 7 for Opus and from 5.8 to 19 for Sonnet. The time ratio widens the same way, from 1.6× in tier 1 to 6.5× in tier 5.
- Correctness falls off only at tier 4. Below that, both models are at or near the ceiling.
Per task, by fix length:
| Labour | Task | Fix length, lines | Cost ratio (Sonnet ÷ Opus) | Token ratio |
|---|---|---|---|---|
| L02 | Off-by-one in pagination | 3 | 1.02× | 2.4× |
| L09 | Make a log analyser ≥ 50× faster | 20 | 0.73× | 2.0× |
| L04 | Tags for a bundled todo CLI | 22 | 0.96× | 3.5× |
| L03 | RFC 4180 CSV parser | 44 | 0.87× | 1.8× |
| L01 | Semver parse and compare | 46 | 0.68× | 1.7× |
| L05 | Thread-safe LRU cache with TTL | 59 | 0.74× | 1.8× |
| L06 | Behaviour-preserving refactor | 65 | 1.35× | 2.9× |
| L07 | Myers diff to unified format | 71 | 2.68× | 7.0× |
| L15 | Adaptive solver for stiff ODEs | 79 | 5.46× | 25.5× |
| L16 | Robust Delaunay triangulation | 114 | 0.98׆ | 3.7׆ |
| L08 | JSON Schema subset validator | 116 | 0.92× | 2.5× |
| L17 | Prime power sums | 120 | 2.48× | 8.0× |
| L20 | 40 digits of a slow series | 123 | 3.28× | 9.4× |
| L10 | Async job scheduler | 130 | 2.51× | 6.0× |
| L13 | Sequence CRDT (RGA) | 138 | 3.98׆ | 7.6׆ |
| L18 | Constrained grid colourings | 140 | 3.11× | 4.6× |
| L19 | Fading choirs | 140 | 2.60× | 3.8× |
| L11 | Regex engine with linear time | 220 | 1.06× | 1.8× |
| L12 | Mini SQL over CSV | 329 | 0.99× | 2.6× |
| L14 | Bytecode compiler and VM with GC | 464 | 1.71× | 3.7× |
-
Short fixes are where Sonnet pays off. On every task whose fix is 60 lines or fewer (6 tasks, 3–59 lines), Sonnet was cheaper or level: 0.68× to 1.02× Opus’s cost. Above 60 lines, Sonnet cost more than 1.1× as much on 10 of 14 tasks.
-
Past about 60 lines, length stops predicting the gap. The three longest fixes (220–464 lines) are close to level, at 0.99× to 1.71×. The worst ratios are on medium-length fixes: 2.5× to 3.3× on the mathematical tasks (120–140 lines), and 5.5× on the stiff ODE solver (79 lines).
-
Which measure predicts the gap best. Rank correlation with the cost ratio across all 20 tasks:
Measure Rank correlation with cost ratio Difficulty tier 0.67 Fix length (reference solution) 0.52 Lines Sonnet added (median) 0.49 Lines Opus added (median) 0.29 Tokens Opus used (median) 0.27 With 20 tasks, a correlation of 0.52 is only borderline meaningful. The 60-line threshold is the firmer finding, because it holds on every task.
-
What makes the long-fix tasks expensive. Above 60 lines, Sonnet cost more than 2.4× as much as Opus on 8 tasks: L07, L10, L13, L15 and L17–L20. Most of these turn on finding a specific algorithm or a piece of mathematics, rather than writing a lot of code. Sonnet spent much longer iterating on them; on L15, for example, it took 38–42 turns against Opus’s 3–23. L11 is an exception to that reading: a linear-time regex engine also needs a specific algorithm, yet the two models cost about the same on it.
Where Sonnet makes sense. In this benchmark, only narrowly.
- On a Pro or Max subscription, Opus is the better choice for every task tier. It used the same allowance per run as Sonnet on L01–L12 (2.2 against 2.3 points) and a third as much on L13–L20. It was also faster on all 20 tasks and passed every test in all 60 runs.
- Billed per token through the API, Sonnet is cheaper only on short fixes, of about 60 lines or fewer.
- How much it saves: on those 6 tasks, Sonnet’s median cost summed to $0.571 against Opus’s $0.712, about 20% less, or roughly 2 cents a task.
- What it gives up there: it was slower on all 6, and 2 of its 18 runs on them missed tests.
- What happens when it loses: the extra cost is large, as on L15 ($1.69 against $0.31).
- A mixed workload favours Opus. It’s rarely clear in advance which tasks will turn out hard. Over all 20 tasks, the per-task medians sum to $5.56 for Opus and $10.15 for Sonnet, so Opus is 45% cheaper.
- When Sonnet is still reasonable: a high volume of short, well-specified fixes, where a test suite catches mistakes cheaply and speed doesn’t matter.
- This is a no-skill baseline with Sonnet 5. A skill that guides Sonnet’s approach, or a newer Sonnet, could narrow the gap. That is what Eurystheus is built to measure next.
5. Limitations
- Small samples. There are 2–3 runs per task per model, so this report gives ranges, not significance tests. A single run can move a median, and as more runs from both models are added, the averages will firm up and some figures here may change slightly.
- Different task variants. Each run gets a newly generated variant of its task, so differences between runs mix the model’s own variability with differences between task variants.
- The Sonnet L12 results were regraded. The original grading of Sonnet’s two L12 runs had a harness defect: the hidden tests’ setup step didn’t run, so every test errored for every solution, including the reference. That defect has been fixed. Sonnet’s stored L12 solutions were then regraded with the corrected grader, and both passed all 500 tests. All Opus runs were graded with the corrected grader from the start. The defect affected only L12, the only task whose tests use that setup step.
- One Sonnet L13 run was regraded. Each task’s hidden tests load the solution in a way that breaks one valid Python pattern: postponed annotations (
from __future__ import annotations) combined with data classes. A solution written that way fails to load, so every test errors. One stored run is affected, a Sonnet L13 run stopped at the time limit. It is graded 0% in the vault, and passes 210 of 300 tests (70%) when regraded with the loader corrected. Every other run of both models was checked, and none is affected. The regrade was done offline and didn’t change the stored evidence. - The container image and harness changed between sessions. This affects only L01–L12: both models’ L13–L20 runs used identical images and harness code. For L01–L12, the agent container image was rebuilt from the same Dockerfile between the Sonnet and Opus sessions, so its digest differs. 59 of the 60 Opus runs used the rebuilt image; the first Opus run (L01) used the same image as Sonnet’s L01–L12 runs. The Dockerfile pins the base image by digest and Claude Code at 2.1.282. Operating-system packages installed at build time, such as git and Node.js, may differ in patch version. The harness code also moved forward between the sessions (from commit
9e0ed94to5f22561, then43710b0). The three changes were the grader fix in limitation 3, an option to choose the model, and reuse of stored runs. None of them changes the task, the prompt or the agent’s container. - Different days. Sonnet ran L01–L12 on 2026-10-08 and L13–L20 on 2026-10-12; Opus ran all 20 on 2026-10-09. Any change in the service between those days is uncontrolled.
- Token counts for stopped runs are lower bounds. A run stopped at the time limit doesn’t send Claude Code’s final usage summary, so its tokens are counted from the messages streamed before the stop, which undercounts output tokens most. This affects 5 runs: four Sonnet runs (L13, L15 and two on L16) and one Opus run (L16). Their tokens and costs, and the medians marked † in §4.2, may be low. Since four of the five are Sonnet’s, the true gap in Opus’s favour is, if anything, wider than shown.
- Approximate usage figures. The usage figure is reported in whole percent, and it also counts any other use of the same account during a session.
- Correctness is at the ceiling on L01–L12. Without any skill, both models solve the easier tasks, so correctness can’t tell the models apart there. It does on L13 and L16.
6. Data sources
Every run’s manifest, run record, measurements, solution archive and diff are kept, unchanged, in the private evidence vault. A separate check recomputed every figure in this report from that evidence.
| Model | Session | Labours | Runs |
|---|---|---|---|
| Sonnet 5 | suite 0cf632a5da6e4d0d99ff641f78093a96 |
L01–L12 | 35 |
| Opus 5.5 | suite b0dc8a487ab1… (single test run) |
L01 | 1 |
| Opus 5.5 | suite bf7fb7773530… |
L01–L12 | 35 |
| Opus 5.5 | suite c554bf2ea70f… |
L13–L20 | 24 |
| Sonnet 5 | suite 8e07ccb07d6d… |
L13–L15 | 7 |
| Sonnet 5 | suite d2966090345e… |
L15–L19 | 12 |
| Sonnet 5 | suite d7ec988340e0… |
L19–L20 | 5 |
- Regrading: the Sonnet L12 regrade (runs
b61312d4…andea926772…) and the Sonnet L13 regrade (run3b68b565…) were done offline and didn’t change the stored evidence. - Excluded runs: 12 earlier Sonnet runs from 2026-09-28 are left out. They were recorded by an older harness version, which carries no
runner_versionstamp and refused the agent’s file edits, so they contain no real work.