railcall set anthropic-model is silently ineffective — stored, echoed, "restart to apply" promised, but never read
railcall set anthropic-model <model> validates your choice, saves it, echoes
it back in the settings list, and tells you to restart Studio to apply it — but
no code path ever reads the value. The builder's model is chosen by cost/tier
routing that never looks at the setting, so railcall set anthropic-model opus
does nothing.
Reproduction (station-v0.93)
railcall set anthropic-model opus
Output:
anthropic-model → opus
Restart Studio for the builder to pick it up.
railcall set (no args) then lists it back as a current setting:
anthropic-model opus
Restart Studio — the builder's model is unchanged.
(Behavior traced from source below, not run live.)
Observed
cmd_set handles the write side fully (railcall_cli.py):
# documented (L3101-3102)
railcall set anthropic-model <model> haiku | sonnet | opus | full-model-id
railcall set anthropic-model auto let local Qwen decide per-request
# validated + persisted (L3213-3218)
_vault_write("anthropic", "ANTHROPIC_MODEL", model_val)
# confirmed with a promise (L3224-3226)
anthropic-model → <label>
Restart Studio for the builder to pick it up.
# echoed in the settings display (L3113)
ant_model = _vault_read("anthropic", "ANTHROPIC_MODEL") or "auto (sonnet default)"
But nothing reads it. A grep for ANTHROPIC_MODEL across the whole install
returns exactly three hits — the write (L3218), the display (L3113), and an
unrelated key DEFAULT_ANTHROPIC_MODEL that itself only appears in a
display list (studio_server.py L1615) with no functional reader. No code path
consults keys.local.json["anthropic"]["ANTHROPIC_MODEL"] to choose a model.
The model is actually selected by cost_router — a tier→model map that ignores
the setting (cost_router.py L51-52):
"anthropic": {0: "claude-haiku-4-5-20251001", 1: "claude-haiku-4-5-20251001",
2: "claude-sonnet-4-6", 3: "claude-opus-4-7"},
Why it matters
Set anthropic-model opus to force Opus (or auto for the documented "Qwen
picks per-request") and nothing changes. The confirmation message, the "restart
to apply" instruction, and the settings display all reinforce the belief that
it took effect — while the builder keeps using whatever the tier router picks.
It's a setting the CLI documents, validates, persists, and echoes, but never
consults.
Suggested fix
Either make the builder's model selection consult ANTHROPIC_MODEL (honor an
explicit choice, fall back to the tier router when unset/auto), or — if
tier-based auto-routing is intentionally the only model policy — removeanthropic-model from railcall set and its display so the CLI stops
promising a setting it ignores.
---
Environment: station-v0.93. Verified by reading cmd_set in railcall_cli.py
and grepping the full install for ANTHROPIC_MODEL; the "no reader" result and
the tier-based selection are traced from source, not run live.