Skip to content
Automation
Skill

/model-switch

Change the core's model without the CLI: send /model to the live core's pane through the shared sender, wait for the CLI to accept it (answering its confirm dialog only under --confirm), record only once accepted; persistence is the CLI's own.

From plugin
sutando
39470 skills13 hooks
Install
$ npx -y skills add sonichi/sutando --skill model-switch --agent claude-code

How it fires

How this skill gets triggered: by you, by Claude, or both.

  • Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
  • You can call itInvoke it directly when you want it.
  • Slash command/model-switch

Context preview

The summary Claude sees to decide when to auto-load this skill.

Change the core's model without the CLI: send /model to the live core's pane through the shared sender, wait for the CLI to accept it (answering its confirm dialog only under --confirm), record only once accepted; persistence is the CLI's own.

SKILL.md

model-switch.SKILL.md
name: model-switch
description: "Change the core's model without the CLI: send /model to the live core's pane through the shared sender, wait for the CLI to accept it (answering its confirm dialog only under --confirm), record only once accepted; persistence is the CLI's own."
user-invocable: true

model-switch

`scripts/switch-model.sh <model> [--dry-run] [--confirm] [--accept-timeout S]` — `<model>` is one of the CLI's aliases (`default|opus|sonnet|haiku|fable`) or a `claude-*` id with an optional `[1m]` tag; anything else is refused before any write (exit 2).

Order, under one lock per brain (`<workspace>/state/.model-switch.lock`, held across preflight, send, observation and record so overlapping switches linearize): (1) preflight through the shared sender (`scripts/tmux-send-line.sh --dry-run --refuse-if-pending`) — refuse on a Codex runtime (exit 4) or when the core's input box carries text (exit 5), nothing written; exit 3 when no live pane exists; (2) count the `Set model to` lines already on screen (`scripts/pane-observe.sh --count`), so a stale acceptance from an earlier switch cannot pass as this one; (3) `/model <model>` + Enter through the shared sender; (4) **wait for the CLI to accept**: a NEW `Set model to` line is the switch. A warm core (cached conversation) first shows *"Yes, switch / No, go back"*; with `--confirm` — pass it on an owner instruction, the flag is the authorization — the helper answers Enter once and waits again; without it the dialog is cancelled (Escape) and the script exits 6 with nothing recorded. No acceptance within `--accept-timeout` (default 20 s) is exit 8, nothing recorded. (5) Only then record `<workspace>/state/model-switch.json` `{model, previous, previous_source, accepted, confirmed, ts, by, settings_read}` — `previous` from the runtime's `settings.json`, else the last record (the CLI does not persist every `/model` pick, so the file can lag the live session), else null. **The script never writes `settings.json`: Claude Code's own `/model` persists the choice there** (measured 2026-09-04: the key changed hours into a session with no repo writer). Measured the same day on a live core: the send alone exited 0 while the CLI sat at the confirm dialog and the model had not changed — which is why the send is treated as initiation and the record follows acceptance.

Defaults come from the runtime descriptor (`sutando-config.sh runtime`: `brain`, `socket`, `session`); `--brain/--socket/--session/--descriptor-file` and `SUTANDO_TMUX_*` are explicit overrides.

Python comes from `sutando-config.sh python-bin`, never bare `python3`. The core-side entry `scripts/switch-model.sh` only execs this script. An owner message like "switch model to opus" is handled by running it; the dashboard's Quota tile shows the model the proxy then sees.

Read more
Ships withsutando

My AI Stand — Realtime by Day, Rewriting Itself by Night. Summon my AI superpower. Voice, vision, screen, meetings, calls when I'm engaged. Learns my patterns, ships its own code when I'm not. Runs across my Macs, interacts with people & their Stands.

Get the whole plugin

Other skills on sutando.