Appearance
Model choice is per-task, per-role — hardcoding one model starves the hard jobs or burns cash on the cheap ones.
Principle
Cost-Quality Is a Knob
The whole point
Quality and cost are a dial — not a deployment constant.
A single default is wrong in two different directions.
always opus
per-task default + upgrade lever
always sonnet
burn cashthe knobstarve quality
Too far left
Opus on everything.
Classification at Opus costs 5–10× Sonnet and the answer is the same. The bill is the only place you'll see it.
The knob
Sonnet by default. Opus by exception.
Most work is cheap. The upgrade path exists for the 10% of issues where it matters — and only for them.
Too far right
Sonnet on everything.
The planner reasons about a gnarly feature, produces a plan with a key step missing, and you find out at review.
Pick one global model and you are wrong for at least two orders of magnitude of work.
What the knob actually is
A table from slash-command to model — not a call-site argument.
Each row encodes a prior about where heavy reasoning pays back.
Slash command
Model
Why
/classify_issue
sonnet
JSON extraction. Heavy is pure waste.
/feature · /bug · /chore
sonnet|opus
Upgrade when planning is gnarly.
/implement
sonnet
Spec is explicit. Heavy rarely helps.
/resolve_failed_test
sonnet|opus
Upgrade when the bug is subtle.
/review
sonnet
Visual diffing, structured output.
/document
sonnet|opus
Opus for narrative, sonnet for updates.
The map lives in one table in agent.py. Callers name the task; the table picks the model.
What breaks if you violate it
Two failure modes. One is visible in the bill, one in the output.
always-sonnet
Quality left on the table
The planner tries to reason about a hard feature and ships a plan with a key step missing. The rest of the pipeline faithfully executes the incomplete plan.
hard-planning tasks: under-served
downstream: implements gap
detection: at review — too late
Shows up in: shipped features that don't match intent.
always-opus
Cost incinerated
Classification at Opus costs 5–10× Sonnet. The answer is identical. You can run like this for months before anyone notices.
classify: 10× cost, 1× quality
implement: 5× cost, 1× quality
habit: "Opus everywhere" becomes load-bearing
Shows up in: the bill, not the quality metrics.
The invisible failure is worse — by the time you notice the cost, you've trained the team to think "Opus everywhere" is how the system works.
Where the knob lives
At the agent layer. Not the infrastructure layer.
Model choice varies by role and task — not by deployment environment.
✗ Wrong Infrastructure decision
prod envopus
staging envsonnet
<-- decided herefrozen
every agentsame model
every tasksame model
✓ Right Planning decision
prod env—
staging env—
agent.py tablemap
<-- decided hereper-role
per-issue levermodel_set=heavy
The operator lever: drop model_set heavy in the issue comment.
The dual-path rows flip to Opus for that issue only.
If model choice is frozen at deploy time, the knob doesn't exist — and every task pays the same price regardless of its actual difficulty.
The discipline
Default cheap. Upgrade on evidence.
A system with no per-task model knob is leaving quality on the floor or money in the fire — and usually both. The lever belongs at the agent, exposed to the operator, flipped per issue.