Every backend has its own catalog. The office just asks it.
/model picks the boss's model. /submodel picks a model for one native agent type. Both now work natively on OpenCode, Claude Code, and Codex — not just the one backend that used to have it — and each backend's own catalog, defaults, and limits drive what you see.
Two commands
The boss model, and a model per agent type.
/model opens the active backend's native main-model catalog. If discovery is unavailable for some reason, hand it a native reference directly: /model <native-ref>. /submodel is the same idea one level down — pick a native agent type, then pick (or set) that type's model, where the backend supports it. Native agent names come from the backend itself; they are not the same list as the floor roster's roles.
/model
→ the boss (main) model picker
/model <native-ref>
→ set the boss model manually
/submodel
→ pick an agent type, then its model
/submodel <agent>
→ open the picker for that agent type
/submodel <agent> <native-ref>
→ set that agent/model pair manually
Manual commands still go through native validation — typing a reference by hand is not a way around an unsupported capability. A rejected choice is never saved, and it is never silently swapped for a default.

How the picker behaves
Type to filter, arrows to move, Enter to apply — then it saves.
Every row in the catalog carries a description straight from the native client, plus badges where they apply: unavailable for an entry the backend won't currently honor, current for the office's saved override, and backend default for the native client's own default — which describes the catalog, not the effective model of a session you've already resumed.
Typing filters the list live. Esc cancels — including a catalog that's still loading — and once you've picked a row, input waits for the backend to acknowledge before doing anything else. The order is always the same: the choice is applied to the running backend first; only once that adapter accepts it does the office save the preference for next time. If the save itself fails after a successful apply, that's reported as its own, separate message — the runtime change has already happened either way.
Saved per backend
Switching backends never clobbers another backend's choice.
Accepted choices land in ~/.theboringfloor/configs/brain.json under modelPreferences, keyed by backend name — opencode, codex, or claudecode. Each backend gets its own boss reference and its own agents map keyed by native agent name. Pick a model on Claude Code, swap to Codex with /backend, swap back — your Claude Code choice is still exactly where you left it.
{
"modelPreferences": {
"opencode": {"boss": "anthropic/claude-sonnet-4",
"agents": {"explore": "anthropic/claude-sonnet-4"}},
"codex": {"boss": "gpt-5.4"},
"claudecode": {"boss": "opus[1m]",
"agents": {"Explore": "sonnet"}}
}
}
If OpenCode has no scoped choice saved, the boss model falls back to backend.bossModel, then boss.model, and a missing native agent choice falls back to the legacy agentModels map — that fallback chain is OpenCode-only; Claude Code and Codex don't inherit it. An explicit empty scoped value masks the legacy fallback rather than falling through it.
Three backends, three different deals
The limits are the useful part. Read them before you rely on per-agent models.
OpenCode
Main-model references are provider/model, e.g. anthropic/claude-sonnet-4. Native subagents are selectable too, and an agent model change preserves the project's existing agent prompts, tools, and every other unrelated config field. It requires every session in the project to be idle first — a busy or retrying session gets the change rejected.
The honest limit: a saved model OpenCode rejects fails the send outright — the office does not silently retry the turn without it.
Codex
/model works for the boss — /model gpt-5.4 is a valid example token, not a guarantee for your account. There is no universal reset-to-default for a resumed thread; pick an explicit model if you want to change one.
The honest limit: per-agent switching is unavailable. Codex's native role model settings override an explicit dispatch model, so /submodel refuses a per-agent choice with an explicit error rather than accepting a setting it can't honor — configure Codex roles directly, or inherit models, instead.
Claude Code
Native aliases only — sonnet or opus[1m] for the main session. An Opus agent alias derived from opus[1m] is labeled as an agent alias and drops the [1m] context modifier. A saved agent choice only fills in a dispatch that's missing a model — an explicit dispatch model is left alone, and a fork agent always inherits its parent's model.
How it actually lands: a PreToolUse hook fires when a sub-agent is dispatched, and that hook is what injects the saved per-agent model — a dispatch with no native agent type has nothing to key a type-specific preference off of, so it uses the boss model. The hook must be acknowledged by Claude Code for the turn to proceed.
The full key and slash-command tables, including /model's filter keys, live in keys & slash commands. Backend setup, authentication, and how /backend swaps live are covered in backends.