[Bug] Subagents silently fall back to Sonnet 5 when a credit-billed model (fable) is requested via Agent tool or agent frontmatter

Status Open
Reported on v2.1.220
Maintainer reply None cached
Activity 1 comment · opened Jul 31, 2026

Claude Code version: 2.1.220

Description:
When a subagent is invoked with a model that requires usage-credit billing (Fable 5, shown in /model as "Requires usage credits"), the actual API call silently falls back to Sonnet 5 instead of using the requested model or raising an error. Plan-billed models (opus, sonnet) resolve correctly in the same contexts.

Repro steps:

  1. Agent definition frontmatter (.claude/agents/sdd-design.md) has model: fable. Invoking it via the Agent tool with subagent_type: sdd-design (no model param, relying on frontmatter) produces a subagent transcript (~/.claude/projects/<project>/subagents/agent-<id>.jsonl) showing "model":"claude-sonnet-5" for every turn.
  2. Isolated further with a direct override: Agent(subagent_type: "general-purpose", model: "fable") with a trivial one-word prompt. The subagent transcript again shows "model":"claude-sonnet-5", not "claude-fable-5".
  3. Meanwhile, in the same session, a different agent (sdd-spec.md, model: opus) correctly produced "model":"claude-opus-5" in its transcript — ruling out a general "frontmatter/override is ignored" bug.
  4. /model confirms Fable 5 is available and selectable for this account ("3. Fable — Fable 5 · Most capable... · Requires usage credits"), and the account has a $100 API credit balance intended for it plus an active Pro subscription.

Expected: subagent runs on Fable 5, or the call fails loudly if credit-billed models aren't supported for subagent dispatch.

Actual: silent fallback to Sonnet 5, no warning, no error — only detectable by manually grepping the subagent's own transcript JSONL for the model field.

Impact: anyone assigning model: fable to a phase-specific agent (e.g., for higher-effort design work) gets billed/behaves as Sonnet 5 without knowing it, since usage looks identical from the calling side (only the transcript reveals it).

View original on GitHub ↗

This issue has 1 comment on GitHub. Read the full discussion on GitHub ↗