Fan-out research skills (deep-research) inherit the session model for all subagents — no model tiering — burning premium-model quota in a single run

Open 💬 3 comments Opened Jul 4, 2026 by Engccer

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 every workflow_agent entry; 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 unless opts.model is passed.
  • The built-in deep-research workflow script passes no model (and no effort) on any of its agent() callsscope, search, fetch, verify, synthesize all 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)

  1. Ship the built-in deep-research (and similar fan-out skills) with per-phase model set on their agent() 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.)
  2. 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).
  3. 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=inherit ignores 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).

View original on GitHub ↗

This issue has 3 comments on GitHub. Read the full discussion on GitHub ↗