Subagents default to claude-fable-5 while session model is Opus — silent, more-expensive default, ignores session model (no config selects it)
Summary
With the session model pinned to Opus, subagents spawned via the Agent/Task tool that don't pass an explicit model are resolved to claude-fable-5 — they neither inherit the session model nor a cheaper tier. CLAUDE_CODE_SUBAGENT_MODEL was unset in our environment, and nothing in settings/env/project config/skills selects Fable, yet the unset default resolved to Fable. On our account Fable is billed higher than Opus, so the silent default produced large, unexpected spend (~$106.80 / ~1.1M output tokens in one day, essentially all from unpinned subagents in a single automated session).
Environment
- Claude Code / ccd-cli 2.1.217 (
AI_AGENT=claude-code_2-1-217_agent), Agent SDK 0.3.217 - Entrypoint
claude-desktopdriving a long-running headlessssh-session (agent-fleet orchestrator) - Linux 6.8 (Ubuntu 24.04)
~/.claude/settings.json→"model": "opus[1m]"- No model-selecting env vars set:
CLAUDE_CODE_SUBAGENT_MODELunset, noANTHROPIC_MODEL, no small/fast override; stockANTHROPIC_BASE_URL
Expected
A session pinned to opus[1m] should spawn subagents on Opus (inherit), or on a documented default that isn't more expensive than the explicitly-selected session model — and the effective subagent model should be discoverable without auditing raw transcripts.
Actual
- Main loop ran on
claude-opus-4-8(correct). - Every unpinned subagent spawn ran on
claude-fable-5. - No config/env/settings/skill on the machine selects Fable (grepped
~/.claude/{settings.json,settings.local.json,skills,agents}, fleet config, app dirs). Skills that pin a model pinsonnet.
Reproduction
~/.claude/settings.json→"model": "opus[1m]"; leaveCLAUDE_CODE_SUBAGENT_MODELunset.- Start a (headless) session; confirm main loop is
claude-opus-4-8. - Spawn a subagent via the Agent/Task tool without a
modelargument. - Inspect the subagent transcript (
~/.claude/projects/*/*.jsonl, assistant messages'modelfield). - Observed: subagent
model=claude-fable-5, notclaude-opus-4-8.
Evidence (per-role model audit of this account's transcripts)
- One orchestrator session: 3984 assistant messages on
claude-fable-5vs 657 onclaude-opus-4-8— Opus = main loop, Fable = its spawned subagents. - Multiple full subagent task-sessions (plan edits, review-follow-ups) ran 100% Fable (e.g. 69/0, 178/0, 120/0 Fable/Opus).
- Day's cost report: ~$106.80 Fable / ~1.1M output tokens, almost all unpinned subagents.
Impact
- Surprise cost / cost inversion: an operator who deliberately selected Opus is billed at a more expensive tier for all subagent work, with no signal in config.
- Not centrally enforceable today: the only reliable mitigation we found is passing
modelat every spawn site; for fleets/automation that fan out heavily this is easy to miss.
Asks
- Subagents should inherit the session
modelby default, or the unset-CLAUDE_CODE_SUBAGENT_MODELdefault should never be more expensive than the session model. - Document
CLAUDE_CODE_SUBAGENT_MODEL(accepted values incl.inherit/ concrete model IDs) in the settings docs — it's currently undiscoverable except via the issue tracker. - Surface the effective subagent model (startup banner /
/status/ per-model cost breakdown) so an expensive default is visible before it costs $100+.
Related
- #74171, #78994 — subagents inherit the session model with no tiering (opposite default from what we see; suggests the default is environment/plan-dependent and inconsistent).
- #68392 —
CLAUDE_CODE_SUBAGENT_MODEL=inheritignores the per-callTaskmodel param. - #66023 — fan-out spawning many subagents with no cost confirmation.
Workaround
Pin model: "opus" on every Agent/Task spawn, and encode it as a hard rule so automated workers/coordinators never fall back to the default.