[Bug] `opusplan` silently falls back to Sonnet during plan mode (no signal)
Open 💬 4 comments Opened Jul 5, 2026 by mannism
Environment
- Product: Claude Code (CLI)
- Model configuration:
~/.claude/settings.json→"model": "opusplan"(persistent global config, not a session-only/modeloverride) - Platform: macOS (Darwin 25.5.0)
- Observed across multiple sessions over several weeks
Symptom
opusplan is intended so that plan mode runs on Opus and execution mode automatically switches to Sonnet. In practice, plan-mode turns have been observed running on Sonnet even though settings.json was verified (by reading the file, not by assertion) to contain "opusplan" at the time. There is no error, warning, or status-line signal when this happens — the only tell is behavioral (an agent reasoning at Sonnet-level depth on a plan-mode turn), or session inspection after the fact.
Expected behavior
When settings.json .model is "opusplan":
- Every plan-mode turn executes on Opus.
- Every execution-mode turn (post plan-approval) executes on Sonnet.
- If the runtime cannot honor this (availability, rate limit, internal fallback), it should surface a visible signal — not silently downgrade a turn the user believes is running on Opus.
Actual behavior
- Plan-mode turns have executed on Sonnet despite a verified-correct
"opusplan"setting, with no error or status-line indication of the fallback. - In one session the
settings.json.modelvalue itself was found silently rewritten to"sonnet"outside of an explicit user action — cause unconfirmed, but noted as a related data point since it compounds the trust problem (a user can no longer assume "I set opusplan and it stayed set"). This may be a separate config-integrity bug.
Impact
- Silent model downgrade during plan mode undermines the entire reason
opusplanexists (Opus-quality planning, cost-optimized Sonnet execution). - Because there is no error signal, the only detection mechanism is behavioral suspicion + manual file re-verification. A local SessionStart hook can warn on config drift at session start, but cannot detect a silent per-turn fallback.
What we've ruled out
- Not a one-time typo: verified in multiple independent sessions.
- Not solely a stale
/modeloverride, since the underlying file was read and confirmed correct at the time of at least one occurrence.
Ask
- Confirm whether
opusplanis intended to guarantee Opus for every plan-mode turn, or whether silent fallback-to-Sonnet is expected under some condition (rate limiting, availability). - If fallback is by design, add a visible signal (status-line marker, transcript annotation) when a plan-mode turn executes on a model other than Opus.
- Separately investigate whether
settings.json.modelcan be silently overwritten by a/modelsession override — if confirmed, that is an independent config-integrity bug.
This issue has 4 comments on GitHub. Read the full discussion on GitHub ↗