Subagent self-corrects from stale model id (claude-opus-4-8) to current (claude-opus-5) mid-execution, no local config to blame
Summary
A local watcher we run against Claude Code session transcripts flagged 18 occurrences in 24h of sessions/subagent runs that started on model id claude-opus-4-8 and self-corrected to claude-opus-5 partway through the same run, without any user action or config change on our side.
We root-caused one concrete instance: testador-e2e subagent, agentId a75b6aa08802b272e, launched on claude-opus-4-8, switched to claude-opus-5 mid-execution. We audited our own settings/hooks/model config and found nothing in our environment that would cause or explain this — it looks like an internal SDK/CLI model-resolution behavior, not a local misconfiguration.
This looks related to (but distinct from) already-filed model-resolution reports:
- #83956 (subagent Task launches with one model resolved but served as another)
- #82252 (subagent model override silently served by a different model, self-report doesn't match)
- #82466 (default model in settings.json not honored at session start)
What's different here: it's not "wrong model served the whole time" — it's a mid-execution switch away from an already-stale/deprecated model id, happening repeatedly (18x/24h) across otherwise-unrelated sessions, suggesting some background model-alias/version resolution kicking in inconsistently rather than a one-time settings read.
Impact
- Makes local telemetry/cost-attribution by model unreliable (a single run reports two different models).
- Makes "which model actually did this work" unanswerable from the transcript alone.
- Silent and undocumented, so users have no way to distinguish this from an actual bug in their own config.
Ask
- Confirm whether this is expected/intended background model-alias resolution.
- If expected, document it (so watchers/telemetry can account for it instead of flagging it as an anomaly).
- If not expected, treat as a bug alongside #83956 / #82252.
Happy to share more transcript excerpts (with any account-identifying info stripped) if useful.