Subagents default to claude-fable-5 while session model is Opus — silent, more-expensive default, ignores session model (no config selects it)

Status Open
Reported on v2.1.217
Maintainer reply None cached
Activity 0 comments · opened Jul 24, 2026

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-desktop driving a long-running headless ssh- 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_MODEL unset, no ANTHROPIC_MODEL, no small/fast override; stock ANTHROPIC_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 pin sonnet.

Reproduction

  1. ~/.claude/settings.json"model": "opus[1m]"; leave CLAUDE_CODE_SUBAGENT_MODEL unset.
  2. Start a (headless) session; confirm main loop is claude-opus-4-8.
  3. Spawn a subagent via the Agent/Task tool without a model argument.
  4. Inspect the subagent transcript (~/.claude/projects/*/*.jsonl, assistant messages' model field).
  5. Observed: subagent model = claude-fable-5, not claude-opus-4-8.

Evidence (per-role model audit of this account's transcripts)

  • One orchestrator session: 3984 assistant messages on claude-fable-5 vs 657 on claude-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 model at every spawn site; for fleets/automation that fan out heavily this is easy to miss.

Asks

  1. Subagents should inherit the session model by default, or the unset-CLAUDE_CODE_SUBAGENT_MODEL default should never be more expensive than the session model.
  2. 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.
  3. 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=inherit ignores the per-call Task model 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.

View original on GitHub ↗