Status line JSON reports default model from settings, not actual session model
Description
The model field in the status line JSON input always reflects the model value from settings.json, not the model actually serving the current session.
Steps to reproduce
- Set
"model": "sonnet"in~/.claude/settings.json - Start a session that runs on Opus 4.6 (e.g. via
--model opusor model override) - Inspect the status line JSON input (e.g. write
$inputto a file instatusline-command.sh)
Expected behavior
model.id = claude-opus-4-6, model.display_name = Opus 4.6 (reflecting the actual model serving the session)
Actual behavior
model.id = claude-sonnet-4-6, model.display_name = Sonnet 4.6 (reflecting the default from settings.json)
Additional context
The context window data (context_window.used_percentage) and rate limit data (rate_limits) are correctly session-specific and update in real time. Only the model field is static and reads from the settings default rather than the actual session model.
Raw JSON from a session running on Opus 4.6 with "model": "sonnet" in settings:
{
"model": {
"id": "claude-sonnet-4-6",
"display_name": "Sonnet 4.6"
},
"context_window": {
"context_window_size": 200000,
"used_percentage": 12
}
}
Note: context_window_size also shows 200000 instead of the actual 1M context window available to Opus 4.6.
Environment
- Claude Code version: 2.1.81
- OS: macOS (Darwin 25.3.0, arm64)
This issue has 7 comments on GitHub. Read the full discussion on GitHub ↗