Casual Developer

Reasoning effort vs quality: xhigh cost more and built no better goose

Claude (Opus 5.5)

Written by Claude (Opus 5.5) and checked by Claude (Fable 5.2), from the celworld repo, its plans and the session transcripts. Earlier Claude sessions ran the bake-offs and built the tooling; dested wrote the briefs, made the calls and edited. The first person below is dested's voice.

An agent-made 3D goose cost me $8.66 and 31 minutes. After I fixed the agent's loop, the same goose cost $1.85 and 7.4 minutes. Then I ran that brief at xhigh, the top reasoning effort: $2.30, 17.3 minutes, and a goose no better than the cheaper one.

Four agent-made geese from the same brief, three-quarter view on top and the honk state below, with each run's model, effort, cost and time.
Four agent-made geese from the same brief, three-quarter view on top and the honk state below, with each run's model, effort, cost and time.

The geese come from celworld, my procedural cel-shaded 3D engine. Claude Code agents write each model as a .cel script, render it, look at it, fix it and save it. My rule had been that assets always run on xhigh.

Half of the $8.66 goose was thinking

I priced every run from its Claude Code transcript at Opus 5.5 rates.

Driver Cost Share
xhigh thinking: 127k output tokens, re-read on every later call $4.45 52%
Context loaded before any work: Claude Code's 50k baseline, docs, engine source, another agent's model $3.27 38%
The 48 images it looked at $0.65 8%

Thinking was also the clock. 127k tokens at about 95 tokens a second is 22 of the 31 minutes.

The first number I was given was wrong too. The lead agent's table said $13.87: it priced Opus 5.5 at Opus 4.x rates, and it read output from a transcript field that holds the message_start snapshot, 2 to 16 tokens on most calls. That field misses about 80% of the thinking.

Fixing the loop saved more than the dial

Most of the drop came from what the agent read and how it reviewed:

  • One author pack of about 10k tokens holds the whole DSL, the look rules and two exemplars. Agents read that file only: no docs, no engine source.
  • cel iterate runs the check, the lint and a labelled sheet of angles, seeds and states in one call. A review is one image read, not ten.
  • A "bar before you save" section: spend 60 to 90% of the budget, a chibi head, caricatured states, effects on loud states.
Run Effort Calls Peak context Minutes Cost Result
Old path xhigh 98 333k 31.3 $8.66 the reference
Pack v1 high 22 109k 5.3 $1.34 small head, paddle wings, no effects, 56% of the triangle budget
Pack v2 high 29 126k 7.4 $1.85 on par
Pack v2 xhigh 20 130k 17.3 $2.30 on par, teal particles in the honk

The $1.34 run is the trap. It was cheap because it quit early, and a run that stops at 56% of the budget is unfinished, not efficient.

On the same pack, xhigh cost 1.2× as much and took 2.3× as long. Its long thinks outlasted the 5-minute prompt cache, so it re-wrote 197k tokens of cache.

Effort barely moved the bill once the loop was good

Next, one river-otter brief on every model and effort level, all on the new loop.

What one otter cost on each model and effort level, with how it read on the render sheet.
What one otter cost on each model and effort level, with how it read on the render sheet.

Opus low, medium and high landed between $1.15 and $1.41. High was the cheapest Opus run and the most finished otter. Sonnet cost about half, but every Sonnet run stopped under the budget bar, and its xhigh was no better than its medium.

Haiku cost 10 to 20 times less than Opus, and its quality didn't track effort at all. Low was good. Medium was broken.

At the API, xhigh built nothing

Two days earlier I had asked the same question one level down: one prompt to celgen, which calls the API and returns a .cel script. A kaiju at the top complexity, with four animated states:

Model · effort Result Output tokens (thinking) Cost Wall
Opus medium clean 34.1k (24.1k) $0.98 345 s
Opus high clean, best 45.8k (39.8k) $1.24 475 s
Sonnet high clean 68.8k (52.8k) $1.20 555 s
Opus xhigh no output 32k, then 64k, all thinking $2.59 + $1.69 1037 s + 689 s
Sonnet xhigh no output 32k, then 64k, all thinking $1.50 + $1.01 841 s + 578 s
The kaiju each model built from one prompt, with cost and wall time. Opus xhigh spent two attempts thinking and wrote no script.
The kaiju each model built from one prompt, with cost and wall time. Opus xhigh spent two attempts thinking and wrote no script.

xhigh thought past a 64k output budget and never wrote the script: $6.79 for nothing. Commit 710dc36 sets a 64k budget at high effort and up, and stops the run on an empty script instead of paying for repair rounds.

Scenes run fine on a small model

A scene is mostly placement from a kit of existing models. The old scenes averaged $4.31, 56 calls and 15+ minutes each. On the new scene path, one riverbank brief:

Model · effort Calls Minutes Cost Read
Opus high 22 4.1 $1.00 most complete, walker on the bridge
Sonnet medium 12 2.3 $0.45 lively pond view
Sonnet xhigh 14 2.5 $0.44 lamp post blocks the bridge view, no walker
Haiku high 17 3.4 $0.074 dock, lily and otter at the pond, walker on the bridge
The bridge view of the same riverbank scene from three runs, with what each cost.
The bridge view of the same riverbank scene from three runs, with what each cost.

Haiku scenes reached about Sonnet's level for a seventh of Sonnet's cost. Every scene run finished with 0 errors.

The rule I use now

Work Model · effort Measured
Creatures, main characters, hero scenes Opus high otter $1.15, scene $1.00
Props, tiles, kit pieces Opus medium not in these bake-offs
Filler and background scenes Haiku high scene $0.074
Creatures on Haiku never low good, medium broken
Assets at xhigh never goose $2.30 vs $1.85, kaiju: no output

xhigh keeps one job: a problem whose solution nobody knows yet. An xhigh agent built the new scene path, and my brief for the cost diagnosis said: "Use opus-xhigh thinking for the diagnosis. Implementation can run lower."

What I'd do now

Fix the loop before touching the dial: what the agent reads before it starts, how many calls one review takes, and a bar the output has to clear before it saves.

Then run one brief on each model and effort level, each into its own slug, and put the renders side by side. Price each run from its transcript: dedupe the assistant lines by message.id and take the max of each usage field. If your output tokens look tiny next to the wall time, you're reading the message_start snapshot, and the thinking isn't in your number.