Three things about the model field, found together while trying to answer one question: can you pin a model to a specific version?
1. You can already pin a version, but nothing shows you that
The model field is free text with a datalist, not a picker, and claude --model takes an alias or a full model name — its own help says so: "Provide an alias for the latest model (e.g. 'fable', 'opus', or 'sonnet') or a model's full name (e.g. 'claude-fable-5')" (measured on claude 2.1.259). So typing claude-opus-4-8 works today. The suggestion list only ever offers aliases, so you have to already know that it is possible and how the name is spelled.
Those names cannot come from the CLI: claude has no models subcommand (claude models is taken as a prompt, exit 0), and there is no catalogue on disk — it lives inside the binary.
A baked-in list in the source is what #92 deliberately removed, because it goes stale on every model release. So: a models.json in the config folder, per agent, re-read every time the suggestion list is filled — a file you can edit or hand out without rebuilding Taurus, and whatever you type yourself is appended after a successful start.
2. agy models is parsed wrong, and it fails silently
Piped output of agy models is now two tab-separated columns:
gemini-3.8-flash-high<TAB>Gemini 3.8 Flash (High)
parse_model_list keeps the whole line, so the datalist value — and therefore --model — contains a tab and the label. When #92 was written, piped output was a bare slug per line; agy changed since.
This is invisible: agy accepts an unknown --model without an error and quietly falls back to its default, which is exactly the gap #92 warned about in its own comment. You end up on the wrong model with nothing saying so.
3. Grok Build is not offered as an agent
grok (Grok Build, xAI) sits much closer to claude than agy does. Measured on grok 1.0.13:
|
claude |
agy |
grok |
| new session |
--session-id <uuid> |
no session ids |
--session-id <uuid> |
| resume |
--resume <uuid> |
--continue |
--resume <uuid> |
| tab title |
-n <name> |
— |
— |
| mode |
--permission-mode (six values) |
--sandbox / --dangerously-skip-permissions |
--permission-mode (the same six) |
| full paths |
--append-system-prompt |
— |
--rules |
| list models |
— |
agy models |
grok models |
grok models prints prose with bullets rather than columns, so the parser has to know which shape it is reading per agent:
Default model: grok-4.6
Available models:
* grok-4.6 (default)
- grok-4.5
Its transcript cannot be found by rebuilding a path: grok groups sessions by working directory but URL-encodes the name, and above 255 bytes falls back to a slug plus a hash (its own session documentation). Looking the session up by its UUID — which Taurus minted itself — avoids guessing either shape.
Proposed change
One change, because all three touch the same code path:
model_from_line knows per agent which shape the list command prints; agy takes the first column, grok takes the bulleted lines only.
models.json in the config folder holds exact model names per agent. Seeded once when it does not exist, never touched by the code afterwards, re-read on every fill so an edit counts during a running session.
grok as a third agent: its own branch in build_command, the --permission-mode whitelist shared with claude rather than copied, and grok_session_file for session_state.
Three things about the model field, found together while trying to answer one question: can you pin a model to a specific version?
1. You can already pin a version, but nothing shows you that
The model field is free text with a datalist, not a picker, and
claude --modeltakes an alias or a full model name — its own help says so: "Provide an alias for the latest model (e.g. 'fable', 'opus', or 'sonnet') or a model's full name (e.g. 'claude-fable-5')" (measured on claude 2.1.259). So typingclaude-opus-4-8works today. The suggestion list only ever offers aliases, so you have to already know that it is possible and how the name is spelled.Those names cannot come from the CLI:
claudehas nomodelssubcommand (claude modelsis taken as a prompt, exit 0), and there is no catalogue on disk — it lives inside the binary.A baked-in list in the source is what #92 deliberately removed, because it goes stale on every model release. So: a
models.jsonin the config folder, per agent, re-read every time the suggestion list is filled — a file you can edit or hand out without rebuilding Taurus, and whatever you type yourself is appended after a successful start.2.
agy modelsis parsed wrong, and it fails silentlyPiped output of
agy modelsis now two tab-separated columns:parse_model_listkeeps the whole line, so the datalist value — and therefore--model— contains a tab and the label. When #92 was written, piped output was a bare slug per line; agy changed since.This is invisible: agy accepts an unknown
--modelwithout an error and quietly falls back to its default, which is exactly the gap #92 warned about in its own comment. You end up on the wrong model with nothing saying so.3. Grok Build is not offered as an agent
grok(Grok Build, xAI) sits much closer toclaudethanagydoes. Measured on grok 1.0.13:--session-id <uuid>--session-id <uuid>--resume <uuid>--continue--resume <uuid>-n <name>--permission-mode(six values)--sandbox/--dangerously-skip-permissions--permission-mode(the same six)--append-system-prompt--rulesagy modelsgrok modelsgrok modelsprints prose with bullets rather than columns, so the parser has to know which shape it is reading per agent:Its transcript cannot be found by rebuilding a path: grok groups sessions by working directory but URL-encodes the name, and above 255 bytes falls back to a slug plus a hash (its own session documentation). Looking the session up by its UUID — which Taurus minted itself — avoids guessing either shape.
Proposed change
One change, because all three touch the same code path:
model_from_lineknows per agent which shape the list command prints;agytakes the first column,groktakes the bulleted lines only.models.jsonin the config folder holds exact model names per agent. Seeded once when it does not exist, never touched by the code afterwards, re-read on every fill so an edit counts during a running session.grokas a third agent: its own branch inbuild_command, the--permission-modewhitelist shared with claude rather than copied, andgrok_session_fileforsession_state.