Skip to content

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.