Fan-out research skills (deep-research) inherit the session model for all subagents — no model tiering — burning premium-model quota in a single run
Summary
Built-in fan-out Workflow-based skills — most visibly deep-research — spawn their entire subagent fleet on the inherited main-session model, with no per-phase model tiering. When the session model is a premium tier (in my case Fable 5, but this applies equally to Opus), a single research run fans out ~200 subagent invocations and burns the premium-model quota all at once, exhausting it mid-run. There is no default tiering and the skill script sets no per-agent model, so mechanical high-volume steps (web search, page fetch) run on the most expensive model available.
This is, in effect, a cost/quota footgun that is on by default for the very skills whose whole purpose is massive parallelism.
Real-world case (measured)
Running the built-in deep-research skill on one question, with the session model set to Fable 5:
- 207 subagent invocations total across two runs (104 + 103 on resume), 100% on
claude-fable-5— confirmed from the workflow progress logs ("model":"claude-fable-5"on everyworkflow_agententry; 0 on any cheaper tier). - ~12.5M subagent output tokens (6.16M + 6.34M).
- The first run hit the session limit and died mid-way ("You've hit your session limit") — losing the synthesis step and ~18 verification agents — precisely because a premium model was used for every mechanical search/fetch/verify agent.
- Fable 5 is a premium model; having the search and fetch phases (the bulk of the fleet) run on it is pure waste.
The phases in deep-research are: Scope → Search → Fetch → Verify → Synthesize. Search + Fetch are the largest, most mechanical cohorts and are exactly where a cheap model belongs — yet they inherited the top-tier session model like everything else.
Root cause
- The Workflow runtime's
agent()calls inherit the main-loop (session) model unlessopts.modelis passed. - The built-in
deep-researchworkflow script passes nomodel(and noeffort) on any of itsagent()calls —scope,search,fetch,verify,synthesizeall run on the inherited session model. - So the more capable/expensive your session model, the more expensive every mechanical subagent becomes, and a breadth-first fan-out silently multiplies that across hundreds of calls.
Why this is serious
This contradicts Anthropic's own published guidance. Per How we built our multi-agent research system:
- The production research system uses a Claude Opus lead orchestrator + Claude Sonnet subagents, not one model inherited everywhere.
- "token usage by itself explains 80% of the variance" in performance, and multi-agent systems use ~15× more tokens than chat. That combination is exactly why the worker tier must be cheap by default — a top-tier worker model multiplied by a 15× fan-out is what exhausts quota.
General orchestrator-worker guidance likewise puts cheap models on the fan-out workers and reserves the top tier for planning/synthesis, cutting cost 40–60% with negligible quality loss.
Expected behavior
Built-in fan-out skills like deep-research should tier models by default, e.g.:
| Phase | Nature | Model |
|---|---|---|
| Scope | decomposition / strategy (lead) | opus |
| Search | mechanical, high-volume | haiku |
| Fetch | page fetch + claim extraction | haiku |
| Verify | adversarial judgment | sonnet |
| Synthesize | hardest reasoning / merge | opus |
At minimum: do not default the entire fan-out fleet to the inherited session model. The mechanical search/fetch cohort should default to the cheapest capable tier regardless of session model.
Proposed fixes (any of)
- Ship the built-in
deep-research(and similar fan-out skills) with per-phasemodelset on theiragent()calls — cheap for search/fetch, mid for verify, top for scope/synthesize. (I did exactly this in a local fork by adding{ model: 'haiku' | 'sonnet' | 'opus' }per phase — a ~5-line change — and it works.) - A documented per-phase / per-skill model config so users can tier without forking the built-in skill (which is compiled into the binary and not user-editable).
- A sane default policy for Workflow
agent(): mechanical/high-fan-out phases should not silently inherit a premium session model. Consider decoupling worker-tier default from the session model.
Workaround (for others hitting this)
The built-in skill can't be edited (it's baked into the claude binary and replaced on every update). What worked for me: extract the persisted workflow script, add per-agent() model tiering, save it under ~/.claude/workflows/, and invoke it via Workflow({ scriptPath }) / by name instead of the built-in skill.
Related
- #68392 —
CLAUDE_CODE_SUBAGENT_MODEL=inheritignores per-call Task model param (contradicts docs) - #5456 — sub-agents don't inherit model configuration in Task tool
- #19174 — ambiguity regarding default model behavior for subagents
These are all facets of the same underlying gap: subagent/workflow model selection is inconsistent and, for fan-out skills, defaults to the most expensive option available.
Environment
- Claude Code 2.1.201, macOS (arm64)
- Session model: Fable 5 (premium) — but the issue is model-agnostic; it bites any premium session model (Opus included).
3 Comments
This is a real problem and the cost shape is hard to reason about without per-phase attribution.
One pattern that helps: treat the orchestrator as a budget allocator, not just a task dispatcher. Before the fan-out starts, calculate the expected token envelope for each phase (scope, search, fetch, verify, synthesize) and set explicit model overrides for the mechanical phases. In practice that means passing
model: "claude-haiku-4"on the search and fetch agent() calls even if the session is running Fable 5 -- the quality difference on those phases is negligible and the cost difference is significant.The deeper issue is that deep-research inherits the session model because there is no documented way to express "this subagent should run on a cheaper tier by default." The skill ships without per-phase model config, so every invocation defaults to whatever the user has pinned -- which is often a premium model.
What would actually fix this: a
default_worker_modelfield in skill definitions that decouples the orchestrator model (where you want Opus-level reasoning for scope and synthesis) from the worker model (where Haiku is fine for web fetch and regex-style search). The Workflow tool has a similar implicit tiering problem.Happy to share the per-phase token budget approach in more detail if useful.
The model inheritance issue you're hitting is a real cost footgun. When deep-research spins up 200+ subagents and all of them inherit the session model, you end up burning premium quota on phases that don't need it -- search and fetch are entirely mechanical, they don't benefit from a larger model at all.
The pattern that works for externally-built harnesses right now is explicit model routing per phase: plan/synthesize on your premium model, search/fetch/verify on a cheaper one. The Anthropic guidance to use "Opus for orchestration, Sonnet for execution" is right but it requires the workflow script to actually wire it up per agent() call, and the built-in deep-research skill doesn't do that today.
One thing that helps even before model tiering lands natively: if you set a session model ceiling before invoking deep-research, it at least gives you a hard stop on per-invocation cost. Not a fix, but cuts the 12.5M token bleed somewhat.
Tracking this pattern for our own agent scheduler work -- the lack of default phase-aware model tiering is a consistent pain for anyone running fan-out workflows at scale.
Corroborating this with another case — same root cause.
Case: In a Fable 5 session I ran a Workflow to verify a plan: read 100+ DB migration files and classify which columns are sensitive. It fanned out 100+
agent()calls, all onclaude-fable-5. Each leaf task was trivially mechanical — open one migration file, list its columns, flag the sensitive ones — a Sonnet/Haiku task with zero deep reasoning. The only layers that warranted a stronger model were one step up: a join/verification pass that reconciles the per-file findings (Opus), and at most a single final synthesis check.The count wasn't the problem — 100+ leaf agents was appropriate for the task; the tier they all ran on was. This lands squarely on your fix #3: the worker-tier default shouldn't inherit the premium session model — mechanical/high-fan-out phases should default to the cheapest capable tier regardless of session model.
I filed #76514 before finding this — closing it as a duplicate in favor of this one.