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).
This issue has 3 comments on GitHub. Read the full discussion on GitHub ↗