▶ Watch this course as a narrated video playlist (8 lessons, about 28 min)
Sonnet 5.5 or Opus 5.5? Which effort level? What does a task really cost? An opinionated course built on four Anthropic playbooks — and on the places their own numbers don’t support their own advice.
Spine texts (claude.dev): Building with Claude Sonnet 5.5 · What a task costs on Opus 5.5 · Spending your effort · Getting the most out of Opus 5.5
These four posts are written by Anthropic about Anthropic’s own products. They are unusually useful — they publish prices, benchmarks and failure breakdowns — and they are also marketing for a pricing ladder. So every module separates what the source says, where it is incomplete, version-specific or self-serving, and arithmetic I re-checked from the posts’ own numbers.
Modules 2 and 4 make you commit to an answer before the reveal. Do them before reading the explanations around them — the skill is the judgment, not the recall.
| Per million tokens | Sonnet 5.5 | Opus 5.5 | Ratio |
|---|---|---|---|
| Input | $2 | $4 | 2.0× |
| Output (incl. thinking) | $10 | $20 | 2.0× |
| Cache write, 5 min | $2.50 | $5 | 2.0× |
| Cache write, 1 hour | $4 | $8 | 2.0× |
| Cache read (since 7 Oct; $0.20 on both at launch) | $0.10 | $0.20 | 2.0× |
The Sonnet post says Opus costs “twice as much across all categories.” At launch that was not quite true: its own comparison table showed the cache-read price at $0.20 for both, and in a long agentic session most input tokens are cache reads. On the Opus post’s reference session (2.0M cached, 200K fresh input, 60K output) that made Opus 5.5 = $0.40 + $0.80 + $1.20 = $2.40 against Sonnet 5.5 = $0.40 + $0.40 + $0.60 = $1.40: 42% cheaper, not 50%, with the gap shrinking as sessions got longer. On 7 October Anthropic halved Sonnet 5.5 cache reads to $0.10/M; the pricing page, read 14 October, now prices cache hits on both 5.5 models at 0.05× base input. Re-run the session: Sonnet 5.5 = $0.20 + $0.40 + $0.60 = $1.20, exactly half of Opus at every session length. The 2× claim is now true across the board.
claude-sonnet-5-5; 1M context, 128K max output (300K on Batches with a beta header); thinking on by default; effort levels low/medium/high/xhigh/max; default high on the API, medium in Claude Code; minimum cacheable prompt dropped from 1,024 to 512 tokens.“Up to 30%” is a ceiling, not an estimate. The 20%/60% Opus price cuts are checkable facts (Opus 5 was $5/$25/$0.50: I reproduced the Opus post’s $3.50 → $2.40 session, a 31% drop from price alone). The further 9 points to reach “40% less” is an efficiency claim about token use that you cannot verify without your own tasks — which is exactly what Module 7 is for. Also note the vendor is telling you to choose by task type; the variable that actually decides is probability of finishing the task, which no price table shows.
Each turn re-sends the whole accumulated context. The Opus post’s example: 40 turns averaging 70K tokens of context processes 2.8M input tokens, even though the conversation never exceeds 120K. Cut to 25 turns and you process 1.75M. Three levers then decide the price: turn count, how much of that input is a cache read, and how many output tokens (thinking included) you pay for.
A task processes 2.8M input tokens on Opus 5.5 (input $4/M, cache read $0.20/M). Ignore output and cache-write costs. Type your estimate of the input cost in dollars at a 90% cache-hit rate, then commit.
At $20/M output versus $0.20/M cache read, an output token costs 100× a cached input token. The post’s figure: 60K output tokens = $1.20 = the price of reading 6M tokens from cache. “You pay for all of it, even when Claude Code only shows you a summary.” Thinking is billed output, which is why effort (Module 3) is a cost control as much as a quality control.
“Effort pays for itself if it prevents one failed attempt” is the post’s most self-serving line. The arithmetic is right in isolation (+20K thinking tokens × $20/M = $0.40, about one ten-turn retry loop) but the premise — that a retry costs $0.40 — is an assumption. A retry in a 150K context costs far more than an early-session retry; a retry at human level (you re-reading a diff) costs far more than either. The claim is probably true more often than not; the post gives no measurement that it is.
The $13 per developer-day baseline (90% under $30) is the more important number: at that level, model spend is noise next to engineer time. Optimize for finished tasks and review time first; tokens second.
The post admits “every way to spend fewer tokens can also cost you a finished task.” Its own benchmark: a customer-support eval cut 18% by moving to Opus 5.5 at low effort and another 9% by deleting ritual instructions. Note what made that safe — there was an eval. Cutting tokens without one is guessing.
Effort is “an approximation of how much compute you want it to spend on the task” — a 12-hour deadline versus a 1-hour deadline. Higher effort means “more independent action for judgement and verification.” Median tokens per attempt on Terminal-Bench 3.0 rise roughly 50K → 100K → 200K → 300K from low to max, and pass rate rises with them. His workflow: hand Claude a spec, have it interview you for gaps, implement on low, review the gist, iterate on low, then verify on high. The headline finding: “higher effort is best for tasks with lots of hidden edge cases.”
| Task (Fable 5.1) | Low | High / xhigh | What changed |
|---|---|---|---|
| html-js-filter sanitizer | 1/5 (~2 min) | 5/5 (~33 min) | Adversarial review, XSS suite, fuzzer |
| mvcc-lsm-compaction | 0/5 (1 min) | 4/5 (11 min) | Reproduced the crash, wrote randomized tests |
| cli-2ph-simplex | 0/5 | 5/5 | Tested against brute-force reference; timed larger inputs |
| gsea-proteomics | 0/5 | 4/5 | Tried two prep methods; investigated the disagreement |
Notice the pattern: the extra minutes were spent on tests and references. Effort buys verification behaviour. By domain, pass-rate gains from low to top: hardware +41 pts, security +23, science +20, ML +19, software +13, media +12, operations +10.
| Failure class (370 attempts) | Low | Max | Change |
|---|---|---|---|
| Passed | 140 (37.8%) | 214 (57.8%) | +74 |
| Missed edge cases | 59 | 24 | −59% |
| Wrong interpretive call | 38 | 25 | −34% |
| Misread requirements | 45 | 26 | −42% |
| Incomplete implementation | 31 | 10 | −68% |
| Median tokens | 73K | 222K | 3.0× |
1. The prose overstates the table. The post concludes effort “primarily addresses testing and edge-case gaps, not conceptual misunderstandings.” But misreading requirements fell 42% and incomplete work fell 68% — the largest relative drop. Edge cases are one beneficiary among several.
2. The categories don’t sum. Low: 140+59+38+45+31 = 313, not 370; Max: 214+24+25+26+10 = 299. About 57 and 71 attempts respectively sit in an unlabeled remainder. I can’t tell you what they are; neither can the post.
3. Price of the gain. +20 points of pass rate cost 3× the tokens — at max you pay for 370 runs of ~222K tokens (about 82M) versus ~27M at low, roughly 55M extra tokens, to buy 74 extra passes — about 0.74M tokens per additional pass. That’s fine for security review; it’s poor for renaming a variable.
4. Conditions. Results are Fable 5.1 with “production safety interventions off” and no internet; the Opus 5.5 run was three weeks later, 128K output cap, no GitHub/PyPI. Not comparable to a leaderboard — or to your repo. The three-build experiments are n=1 each.
On a highly specified build, max took 79 minutes and “Claude simplified implementation details.” More effort isn’t monotonic: with a full spec, extra compute can second-guess the spec. Low took 16 minutes, max 79 — for a spec-driven task the marginal value of effort is lowest, which is why Thariq’s own workflow front-loads the spec and implements on low.
Choose effort by hidden-edge-case density and autonomy, not by how much you care: low for sketches, renames and brainstorming; medium for routine features (the Claude Code default on both models); high for brownfield fixes and anything where a wrong answer looks plausible; xhigh/max for unsupervised work or security-critical review. On Sonnet 5.5, levels are recalibrated — the Sonnet post says a level “doesn’t produce the same amount of thinking” as on Sonnet 5, and the Opus post says Opus 5.5 thinks more per turn than Opus 5 at the same level, most at xhigh/max. Old settings do not transfer.
The dollar and success-rate figures in this simulator are illustrative. They are built from the posts’ published price ratios and effort findings, then rounded — they are not measurements of any real workload. What is real is the reasoning: expected cost to a finished task = cost per attempt ÷ probability of success. The cheapest configuration per attempt is often not the cheapest per result.
“Think carefully” advice is version-specific. It applies to models that reason by default. If you route anything to a model with thinking off, or via thinking: between_tools (Module 6), the trade reverses. Treat it as a per-model fact, not a principle.
“Negation” beats positive direction is demonstrated on one prompt. Plausible — constraints do narrow a default — but the post shows no eval. It is also mildly self-serving: it explains away a known weakness (samey defaults) as a prompting skill.
“Deliver the complete task upfront” conflicts with the effort post’s own workflow (interview → low-effort draft → iterate). The reconciliation: give complete intent and done-criteria up front, but iterate cheaply when the spec itself is underspecified. One-shotting an underspecified task at max took 67 minutes for a heat-chart nobody asked for.
A prompt that removes “verify twice” must add a real check. The Sonnet post supplies one (run a real test/build/type-check; a syntax check doesn’t count; install declared dependencies, never via sudo). That paragraph is the one piece of prompt text in the four posts I would copy verbatim — because it replaces a ritual with a verifiable action.
client.messages.create(
model="claude-sonnet-5-5",
max_tokens=16000,
thinking={"type": "between_tools"}, # was {"type": "disabled"}
output_config={"effort": "high"}, # between_tools: low/medium/high only
messages=[...],
)
| Change | Fails how? | Fix |
|---|---|---|
thinking: disabled gone; thinking on by default | Loud (400 on between_tools at xhigh/max) | Use between_tools at low/medium/high, or adaptive |
Forced tool_choice unsupported | Loud | tool_choice: auto, strict: true tools, say in the prompt to use the tool |
| Thinking blocks: other models can’t read 5.5’s | Silent on model-switching conversations | Keep threads append-only; don’t hand a 5.5 thread to another model |
Computer use: computer_toolset_20260801 replaces computer_20251124 | Loud | Drop beta header/namespace; update the loop for batch actions (Bedrock still accepts the old tool) |
Advisor tool: Opus 4.8/4.7 and Sonnet 5 rejected as advisors; advice returns as encrypted advisor_redacted_result | Loud; and you can’t log the advice text | Use Opus 5.5, Opus 5 or Sonnet 5.5 as advisor |
Text between tool calls now arrives as thinking blocks | Silent: progress notes vanish from your UI | Read blocks by type; thinking.display “summarized” or “updates” (beta) |
content[0].text | Loud in production, invisible in tests that disable thinking | Iterate blocks and branch on block.type |
Your app calls Sonnet 5 with thinking: disabled, a forced tool_choice on one tool, reads response.content[0].text, and streams progress text to a status bar between tool calls. You only change the model ID to claude-sonnet-5-5. Commit: what is the most dangerous failure — the one you’d ship to users?
Nearly all of this page will be stale within a model generation: beta headers, toolset names, advisor compatibility. The durable lessons are three: iterate response blocks by type; treat hidden model-to-model state (thinking blocks, encrypted advice) as a coupling you must version; remove workarounds before tuning. Also read the small print on images: Sonnet 5.5 uses the high-resolution tier, so a 2000×1500 image costs about 2.5× the tokens it did on Sonnet 4.6/4.5 or Haiku 4.5 — a silent cost regression for vision workloads; downscale unless you need the pixels. In Claude Code, the sonnet alias resolves to 5.5 from v2.1.284, defaults to medium effort, and thinking cannot be turned off.
The cost post ends: “your own numbers are the ones to trust.” Its protocol: pick realistic backlog tasks, alternate models with /model, note turns, output tokens and cost per run, and finish 3–4 tasks before concluding. That is directionally right and statistically thin.
Cheaper model S beats stronger model O when cost_S / p_S < cost_O / p_O, i.e. when p_S / p_O > cost_S / cost_O. With the reference session (Sonnet $1.40 vs Opus $2.40, ratio 0.58), Sonnet must finish at least 58% as often as Opus to win on tokens — before counting your review time, which almost always dominates.
Every recommendation in the four posts nudges spend up the ladder when things go wrong (raise effort; then Fable 5.1 at 2.5× price) and sideways for volume (Sonnet, Batch). None tells you to reduce scope, add a better test, or fix the spec — the cheapest fixes, and the ones that work on any model. Treat the ladder as the last lever, not the first.
medium for supervised multi-file work; Sonnet 5.5 at medium/low for repeatable, checkable jobs.All four source posts were read in full on 30 Sep 2026 at claude.dev. Prices, benchmarks and quoted phrases are from those posts; the arithmetic in the “re-checked” boxes is mine and reproducible from their published numbers. The simulator’s per-attempt costs and success rates are illustrative, not measurements. Model behaviour and pricing change quickly — re-check before you rely on any figure. Update, 14 Oct 2026: prices re-checked against the Claude Platform pricing page. Anthropic halved Sonnet 5.5 cache reads to $0.10/M on 7 October (cache hits on both 5.5 models are now 0.05× base input); the price table, the re-checked arithmetic, one quiz and one flashcard were updated accordingly. Everything else matches the launch posts.