What happened?
The Claude Code model picker uses a hard-coded fallback catalog that still recommends:
claude-opus-4-5
claude-sonnet-4-5
claude-haiku-4-5
This catalog is stale. Anthropic's current primary model lineup includes:
claude-fable-5
claude-opus-5
claude-sonnet-5
claude-haiku-4-5
The same stale list is present on the current main branch as of 2026-07-28:
https://github.com/nexu-io/open-design/blob/main/apps/daemon/src/runtimes/defs/claude.ts#L6-L14
Because Claude Code does not expose a machine-readable list-models subcommand, this fallback list becomes the primary set of explicit suggestions shown to users. Rolling aliases partially mitigate the problem, but the UI still prominently recommends obsolete pinned model IDs.
Open Design Cloud already recognizes claude-fable-5, making the two model catalogs inconsistent. Fable 5 should be an explicit first-class choice in the Claude Code picker, not only something advanced users can discover and type into the Custom field. It is a particularly important option for frontend/UI work and is likely to be a common user selection.
There is also a related transparency problem in the connection test. If a user selects opus (alias) and clicks Test, the success message only says that Claude Code replied in N milliseconds. It does not reveal which concrete model the alias resolved to, so the test cannot actually confirm the model selection.
This is not an upstream limitation: Open Design already parses the concrete model from Claude's system/init stream event in apps/daemon/src/runtimes/claude-stream.ts (obj.model). However, the connection-test sink ignores that status event, ConnectionTestResponse.model continues to contain the requested slot (opus), and the frontend success copy does not display any model.
Steps to reproduce
- Install and open Open Design 0.16.1 on macOS.
- Open Settings.
- Find the Claude Code agent card.
- Open the model picker.
- Observe that the explicit model list only contains Claude 4.5 models.
- Observe that Claude Fable 5, Opus 5, and Sonnet 5 are absent.
- Select
Opus (alias) and click Test.
- Observe that the success result reports only the agent name, latency, and sample (
OK), without the concrete model that answered.
Expected behavior
The built-in fallback list should reflect Anthropic's current model lineup, for example:
- Best available (alias)
- Sonnet (alias)
- Opus (alias)
- Haiku (alias)
claude-fable-5
claude-opus-5
claude-sonnet-5
claude-haiku-4-5
Fable 5 should be present as an explicit option because it is a major current model and a common choice for frontend/UI work.
When testing an alias or the CLI default, the result should display the concrete model reported by Claude Code, for example:
Claude Code replied in 812 ms — Model: claude-opus-5 — OK
The response contract should preserve both values rather than overloading one field:
model: requested selection, such as opus or default
resolvedModel (or reportedModel): concrete model reported by the CLI, such as claude-opus-5
Relevant Anthropic documentation:
https://platform.claude.com/docs/en/about-claude/models/choosing-a-model
Open Design version
0.16.1
Platform
macOS (Apple Silicon)
Additional context
Anthropic provides an authenticated Models API at GET /v1/models, even though Claude Code itself does not expose a machine-readable list-models subcommand:
https://platform.claude.com/docs/en/api/models/list
A more robust discovery and fallback strategy would be:
- Query
/v1/models when an Anthropic API key is available.
- Prefer rolling Claude Code aliases (
best, sonnet, opus, haiku) for subscription and CLI-only users.
- Maintain a small, current fallback catalog for explicit model IDs, including Fable 5.
- Keep Custom model ID support for gateways and third-party providers.
- Add a test or release checklist that prevents retired model generations from remaining the primary built-in suggestions.
Claude Code supports --model <alias|name>, and rolling aliases are safer fallback choices because they can resolve to provider-appropriate recommended versions:
https://code.claude.com/docs/en/model-config
A minimal implementation for resolved-model reporting appears to be:
- Capture
model from the existing Claude status/initializing event in createAgentSink() instead of discarding it.
- Add an optional
resolvedModel/reportedModel field to ConnectionTestResponse.
- Return it from successful local-agent tests.
- Append it to the existing localized success message, avoiding duplicate display when it equals the requested exact ID.
- Add a regression test covering
opus as the requested alias and claude-opus-5 as the reported concrete model.
Major Claude model releases are infrequent enough that retaining outdated Claude 4.5 entries across multiple generations appears to be a fallback-catalog maintenance failure rather than an unavoidable technical limitation.
Preflight
What happened?
The Claude Code model picker uses a hard-coded fallback catalog that still recommends:
claude-opus-4-5claude-sonnet-4-5claude-haiku-4-5This catalog is stale. Anthropic's current primary model lineup includes:
claude-fable-5claude-opus-5claude-sonnet-5claude-haiku-4-5The same stale list is present on the current
mainbranch as of 2026-07-28:https://github.com/nexu-io/open-design/blob/main/apps/daemon/src/runtimes/defs/claude.ts#L6-L14
Because Claude Code does not expose a machine-readable
list-modelssubcommand, this fallback list becomes the primary set of explicit suggestions shown to users. Rolling aliases partially mitigate the problem, but the UI still prominently recommends obsolete pinned model IDs.Open Design Cloud already recognizes
claude-fable-5, making the two model catalogs inconsistent. Fable 5 should be an explicit first-class choice in the Claude Code picker, not only something advanced users can discover and type into the Custom field. It is a particularly important option for frontend/UI work and is likely to be a common user selection.There is also a related transparency problem in the connection test. If a user selects
opus(alias) and clicks Test, the success message only says that Claude Code replied in N milliseconds. It does not reveal which concrete model the alias resolved to, so the test cannot actually confirm the model selection.This is not an upstream limitation: Open Design already parses the concrete model from Claude's
system/initstream event inapps/daemon/src/runtimes/claude-stream.ts(obj.model). However, the connection-test sink ignores that status event,ConnectionTestResponse.modelcontinues to contain the requested slot (opus), and the frontend success copy does not display any model.Steps to reproduce
Opus (alias)and click Test.OK), without the concrete model that answered.Expected behavior
The built-in fallback list should reflect Anthropic's current model lineup, for example:
claude-fable-5claude-opus-5claude-sonnet-5claude-haiku-4-5Fable 5 should be present as an explicit option because it is a major current model and a common choice for frontend/UI work.
When testing an alias or the CLI default, the result should display the concrete model reported by Claude Code, for example:
The response contract should preserve both values rather than overloading one field:
model: requested selection, such asopusordefaultresolvedModel(orreportedModel): concrete model reported by the CLI, such asclaude-opus-5Relevant Anthropic documentation:
https://platform.claude.com/docs/en/about-claude/models/choosing-a-model
Open Design version
0.16.1
Platform
macOS (Apple Silicon)
Additional context
Anthropic provides an authenticated Models API at
GET /v1/models, even though Claude Code itself does not expose a machine-readablelist-modelssubcommand:https://platform.claude.com/docs/en/api/models/list
A more robust discovery and fallback strategy would be:
/v1/modelswhen an Anthropic API key is available.best,sonnet,opus,haiku) for subscription and CLI-only users.Claude Code supports
--model <alias|name>, and rolling aliases are safer fallback choices because they can resolve to provider-appropriate recommended versions:https://code.claude.com/docs/en/model-config
A minimal implementation for resolved-model reporting appears to be:
modelfrom the existing Claudestatus/initializingevent increateAgentSink()instead of discarding it.resolvedModel/reportedModelfield toConnectionTestResponse.opusas the requested alias andclaude-opus-5as the reported concrete model.Major Claude model releases are infrequent enough that retaining outdated Claude 4.5 entries across multiple generations appears to be a fallback-catalog maintenance failure rather than an unavoidable technical limitation.
Preflight