Refresh Models
The update leg of the choosing-models freshness loop. Detection compares data
sources already in the session; this command does the reasoning — reading
release notes and deciding what, if anything, the tier table should say
differently. Never auto-apply threshold or doctrine edits; propose, then let
the user approve.
The data file lives in the sibling choosing-models skill of this plugin —
resolve it as ${CLAUDE_PLUGIN_ROOT}/skills/choosing-models/models.toml (fall
back to the path relative to this file if the variable isn't set). Project
overrides of that file are refreshed the same way, in their own location.
Workflow
Detect. Run the check rather than performing it by hand:
uv run --no-project -- python \
"${CLAUDE_PLUGIN_ROOT}/skills/choosing-models/scripts/lineup_check.py" <session model id>
It exits 1 and names the absent model when the session is running on
something the tier data does not list — the environment tripwire, as a
command. Then compare models.toml against the platform's model reference
(the claude-api skill's table, or the published models page via WebFetch) for
the drift a single id cannot show: a current model missing from the table, a
listed model no longer current, or review_by in the past. No drift and not
past review_by → report "lineup current" and stop.
Read the changes. For each drifted entry, read the vendor's release
notes or model documentation for what actually changed — capability tier,
pricing shape, tokenizer, knobs. Do not guess from the model name alone.
Classify each delta:
- lineup-only — a new model slots into an existing tier, an alias or
availability changed. Action: edit the
[[models]] rows.
- guidance-affecting — a tier assignment or threshold should move, or a
cost caveat changed. Action: propose the edit plus the calibration it
needs — threshold moves ride observed-run evidence from a registered
eval harness when one is installed (e.g. fathom's recalibration
playbook), never a release note alone.
- needs-human — a judgment call (a new tier, a pricing regime change).
Flag it; do not decide.
Present a reviewable changeset, grouped: the mechanical models.toml
diff, the proposed guidance edits with cited rationale, the needs-human
list.
On approval: apply the mechanical edits (and only explicitly approved
guidance edits). Stamp last_reviewed and advance review_by (quarterly by
default). scripts/emit_lineup.py then prints the block authoring pastes
into an artefact, carrying that stamp.
Walk the mirror sites — run it, do not perform it:
uv run --no-project -- python \
"${CLAUDE_PLUGIN_ROOT}/skills/refresh-models/scripts/mirror_check.py"
It reads the bindings file ($MODEL_MIRRORS_FILE, else
~/.claude/model-mirrors.toml), holds each site's stamp against
[meta].last_reviewed, and greps the registered roots for [[retired]]
strings — the catch-all for a mirror nobody wrote down.
Report its closing line verbatim, the SKIPPED case included: an absent
registry is fine, but then nothing was checked, and that must never read as
all-clean. Then do the part only you can — decide what each finding means in
its own repository, honour its vocabulary (a family-named copy is
translated, not substituted), and propose the edit in that repo's process.
Fields and the rule the registry enforces: references/mirrors-file.md.
Guardrails
- All change is intentional and traceable: a reviewed diff with cited
rationale, never a silent edit.
- Threshold and tier-assignment changes without calibration evidence are
needs-human by definition.
- Leave the plugin
version bump and commit to the user.
1---2name: refresh-models3description: Review and update the choosing-models tier data. Run /refresh-models to detect lineup drift against the platform's current model list, read the release notes, and produce a reviewable changeset (models.toml lineup edits plus any guidance edits) for approval. Mechanical lineup changes are applied on approval; threshold and doctrine edits are never auto-applied without calibration evidence. Manual-only.4---56# Refresh Models78The update leg of the choosing-models freshness loop. Detection compares data9sources already in the session; **this command does the reasoning** — reading10release notes and deciding what, if anything, the tier table should say11differently. Never auto-apply threshold or doctrine edits; propose, then let12the user approve.1314The data file lives in the sibling `choosing-models` skill of this plugin —15resolve it as `${CLAUDE_PLUGIN_ROOT}/skills/choosing-models/models.toml` (fall16back to the path relative to this file if the variable isn't set). Project17overrides of that file are refreshed the same way, in their own location.1819## Workflow20211. **Detect.** Run the check rather than performing it by hand:2223 ```bash24 uv run --no-project -- python \25 "${CLAUDE_PLUGIN_ROOT}/skills/choosing-models/scripts/lineup_check.py" <session model id>26 ```2728 It exits 1 and names the absent model when the session is running on29 something the tier data does not list — the environment tripwire, as a30 command. Then compare `models.toml` against the platform's model reference31 (the claude-api skill's table, or the published models page via WebFetch) for32 the drift a single id cannot show: a current model missing from the table, a33 listed model no longer current, or `review_by` in the past. No drift and not34 past `review_by` → report "lineup current" and stop.35362. **Read the changes.** For each drifted entry, read the vendor's release37 notes or model documentation for what actually changed — capability tier,38 pricing shape, tokenizer, knobs. Do not guess from the model name alone.39403. **Classify each delta:**41 - **lineup-only** — a new model slots into an existing tier, an alias or42 availability changed. Action: edit the `[[models]]` rows.43 - **guidance-affecting** — a tier assignment or threshold should move, or a44 cost caveat changed. Action: propose the edit *plus* the calibration it45 needs — threshold moves ride observed-run evidence from a registered46 eval harness when one is installed (e.g. fathom's recalibration47 playbook), never a release note alone.48 - **needs-human** — a judgment call (a new tier, a pricing regime change).49 Flag it; do not decide.50514. **Present a reviewable changeset**, grouped: the mechanical `models.toml`52 diff, the proposed guidance edits with cited rationale, the needs-human53 list.54555. **On approval:** apply the mechanical edits (and only explicitly approved56 guidance edits). Stamp `last_reviewed` and advance `review_by` (quarterly by57 default). `scripts/emit_lineup.py` then prints the block authoring pastes58 into an artefact, carrying that stamp.59606. **Walk the mirror sites** — run it, do not perform it:6162 ```bash63 uv run --no-project -- python \64 "${CLAUDE_PLUGIN_ROOT}/skills/refresh-models/scripts/mirror_check.py"65 ```6667 It reads the bindings file (`$MODEL_MIRRORS_FILE`, else68 `~/.claude/model-mirrors.toml`), holds each site's stamp against69 `[meta].last_reviewed`, and greps the registered roots for `[[retired]]`70 strings — the catch-all for a mirror nobody wrote down.7172 **Report its closing line verbatim, the SKIPPED case included**: an absent73 registry is fine, but then nothing was checked, and that must never read as74 all-clean. Then do the part only you can — decide what each finding means in75 its own repository, honour its `vocabulary` (a family-named copy is76 translated, not substituted), and propose the edit in that repo's process.77 Fields and the rule the registry enforces: `references/mirrors-file.md`.7879## Guardrails8081- *All change is intentional and traceable*: a reviewed diff with cited82 rationale, never a silent edit.83- Threshold and tier-assignment changes without calibration evidence are84 needs-human by definition.85- Leave the plugin `version` bump and commit to the user.