--- name: setup-pstack description: Configure which models pstack uses per role. Detects available models and writes the current runtime's override sheet. Use for /setup-pstack, "configure pstack models", changing pstack's model choices, or turning the SessionStart hook on or off. --- # Setup pstack On Codex, read the [platform mapping](../poteto-mode/references/codex-tools.md), including its per-skill notes, before following this skill. On GitHub Copilot, read the [platform mapping](../poteto-mode/references/copilot-tools.md), including its per-skill notes, before following this skill. For a request that changes only automatic routing, resolve the current runtime's sheet using [Other runtimes](#other-runtimes), read it if present, and update only the `session hook` line to the requested on/off value. Preserve all model rows, verify the saved choice, report the path and host trust requirement, then stop. Model detection and role confirmation apply to model configuration requests. On GitHub Copilot, follow [the Copilot setup](copilot.md) in place of steps 1, 3, 4, and 7 and step 6's header. On another runtime, read [Other runtimes](#other-runtimes) below for where the sheet lives and how it loads; the steps are the same. Write the current runtime's per-role model override sheet, using the path in [Other runtimes](#other-runtimes). Each pstack skill names a default model inline; the override sheet adapts those defaults to the models you actually have access to. Claude Code has no auto-applied "rules" mechanism like Cursor's `.mdc`. The Claude Code config directory is `$CLAUDE_CONFIG_DIR` when that variable is set and `~/.claude` otherwise. This skill calls it ``. Inclusion is explicit: the user adds a line to `/CLAUDE.md` (or their project `CLAUDE.md`) such as: ```text @/pstack-mod-models.md ``` with `` written as the resolved path, so the file is loaded as context for every session. The Codex home directory is `$CODEX_HOME` when that variable is set and `~/.codex` otherwise. This skill calls it ``. ## Steps ### 1. Detect available models Enumerate the model names the `Agent` tool's `model` parameter accepts in this session. That is the dependable source. On Claude Code they are the family names listed in [Models](#models) below, each running that family's current model, and a full model ID is rejected. The default panel is listed there too. The panel is chosen for cross-family diversity. Ask the user to confirm or paste any additional slugs they want available. Never write a real slug you have not confirmed is available. The aliases `inherit-parent` and `auto` are always valid even though they are not detected slugs. Both mean the role runs on the parent session's model, which the `Agent` call expresses by omitting `model`. ### 2. Load current state The default role-to-model mapping is the rule shape shown in the Write the override sheet step below. If the current runtime's sheet already exists, read it and treat its values as the current choices. Otherwise start from those defaults. Preserve a single valid `session hook: on` or `session hook: off` as the existing hook choice. Missing, invalid, or duplicate entries default to off. Read only this plugin's sheet. Import an older plugin's sheet only when the user requests migration, and ask separately before enabling routing. A line whose role is not in that shape, such as `how critics`, is from a retired role. Drop it. On Claude Code, an older sheet may name full model IDs that start with `claude-`, which the `Agent` tool rejects. Replace each with its family name, the word after `claude-`. On Codex, retain only available OpenAI model slugs or parent aliases. ### 3. Map and confirm Show every role with its current model, marking any real slug not in the detected set as needing a choice. Also list each line step 2 dropped or rewrote. Ask whether to accept as-is or change specific roles, offering the detected models plus `inherit-parent` and `auto` as the options. Prefer `AskUserQuestion` over free text. For panel roles (arena runners, architect runners, interrogate reviewers) the value is a list, and one subagent runs per entry, alias entries included, so the list length sets the count. `arena cross-judge pool` is also a list, but Arena selects one value from it whose model family differs from the parent's when possible. `swarm workers` is the default model for every worker unless a race or comparison assigns another model per arm. Then ask for the default reasoning effort, the `default effort` line. It is `session`, which keeps the parent session's effort, or one of the levels in [Models](#models). Start from the default listed there. Every role value without a suffix runs at it. Then ask whether any role should run at another level. On Claude Code a role value may carry one after its slug, as in ` @xhigh`; panel entries take their own, as in ` @xhigh, @max`. Each level dispatches through the plugin's effort agent of that level, so the choice holds without changing the session. Leave the suffix off for the default effort. ### 4. Choose whether the session hook routes tasks On Claude Code and Codex, the plugin's optional `SessionStart` hook injects the poteto-mode mandate on startup, resume, clear, and compact. It requires Node.js 18 or later on PATH. Codex asks the user to trust plugin hooks through `/hooks` before running them. The default is off. Enable it only when the user chooses automatic routing. Preserve an existing valid choice during model-only updates. Record `session hook: on` or `session hook: off` in the current runtime's sheet. Only a single explicit on line enables injection. The line is inert on other runtimes. Host trust and hook disable controls still apply when the sheet says on. Explicit namespaced skill invocation works with routing off. ### 5. Validate Every real slug written must be in the detected set. `inherit-parent` and `auto` always pass. Validate the slug without any `@` suffix, and the level against the effort levels in [Models](#models). The `default effort` value is one of those levels or `session`. On Codex, the levels are the `reasoning_effort` values your Codex models accept instead. If a chosen real slug or level is not available, stop and ask again. ### 6. Write the override sheet Write the current runtime's sheet with the shape below, substituting the user's existing or newly chosen hook value for the template's off. Overwrite the whole file so re-runs stay idempotent. Verify that the saved hook line matches the selected value. For a hook-only request, update only that line, preserve all model rows, and skip model detection and role confirmation. ```markdown # pstack model configuration Per-role model overrides for pstack skills. Each pstack SKILL.md names its defaults in a Models section; the values here override those defaults. Delete a line to fall back to the skill default. A value of `inherit-parent` or `auto` runs that role on the parent session's model (the `Agent` call omits `model`); an alias entry in a panel list still counts toward that panel's fan-out. A model may carry a reasoning effort, as in `opus @xhigh` (levels: low, medium, high, xhigh, max); the role then runs through the pstack effort agent of that level, each entry of a panel list on its own. `default effort` sets the level for a value without one; `session` keeps the parent session's effort. Only a single explicit `session hook: on` enables the Claude Code or Codex SessionStart hook. Off, missing, invalid, or duplicate settings leave routing disabled. Preserve the existing valid choice when updating models. feature, refactoring: opus bug-fix: fable perf-issue: fable hillclimb: fable judgment and prose: opus strongest judgment: fable how explorer: opus how explainer: opus why investigators: opus why synthesizer: opus reflect tooling: opus reflect judgment, divergent, synthesizer: opus arena runners: opus, fable, sonnet, haiku arena cross-judge pool: opus, fable, sonnet, haiku swarm workers: opus architect runners: opus, fable, sonnet, haiku interrogate reviewers: opus, fable, sonnet, haiku default effort: session session hook: off ``` ### 7. Wire it in On Claude Code, if `/CLAUDE.md` does not already include `/pstack-mod-models.md`, append an `@` line naming the sheet's resolved path, such as `@~/.claude/pstack-mod-models.md`, so the model rows load on every session. If the user prefers project scope, add the include to the project's `CLAUDE.md` instead. On Codex, keep all role values and `default effort` in the sheet as the single source of truth. Add or update one pointer block in `/AGENTS.md`, using the sheet's resolved absolute path. The instruction must require reading the sheet before selecting role models or spawning subagents for pstack-mod, and applying the model and reasoning effort from it. This is an instruction to read a file, not an automatic `@` include. Preserve other user instructions. When migrating an older pstack-mod block containing copied model rows, replace only that block with the pointer. Keep model values in the sheet; AGENTS.md contains only the pointer. The plugin hook continues reading `session hook` directly from the sheet. ### 8. Confirm Tell the user where the override was written, how its model rows load, and whether the plugin hook is on. Re-running this skill updates the override sheet. ### 9. Offer a verification skill (optional) Check whether the project has a way to drive the real app for proof (a project `verify` or `verify-*` skill, or an existing harness). If not, offer once: "want a project-local verification skill, so agents can drive the app the way a user does and prove changes work? I can generate one with /create-verification-skill." On yes, invoke [`/create-verification-skill`](../create-verification-skill/SKILL.md). On no, move on without pushing. ## Other runtimes The role lines are the same everywhere. What differs is the sheet path, how the runtime loads it, and how you list models. Detect models with the runtime's own tool and never write a slug you have not seen listed. A runtime whose subagent call has no model parameter still gets the sheet, as the record of the user's choice, and applies it where it can. The `session hook` line applies to the Claude Code, Codex, and GitHub Copilot plugins and to the pstack Pi extension. | Runtime | Sheet | Load | List models | Status | | --- | --- | --- | --- | --- | | Claude Code | `/pstack-mod-models.md` | `@/pstack-mod-models.md` in `/CLAUDE.md` | the `Agent` tool's model parameter | manifest and exec launcher checked; pstack-mod interactive setup pending | | Codex | `/pstack-mod-models.md` | pointer in `/AGENTS.md` requires reading the sheet before role dispatch; hook setting: read by the plugin | your configured Codex models, see [codex-tools.md](../poteto-mode/references/codex-tools.md#model-names) | launcher and isolated CLI install checked; pstack-mod interactive setup and discovery pending | | opencode | `~/.config/opencode/pstack-mod-models.md` | add the path to the `instructions` array in `opencode.json` | the `models` slash command in the session | from published docs, no live session | | Gemini CLI | `~/.gemini/pstack-mod-models.md` | `@~/.gemini/pstack-mod-models.md` in `~/.gemini/GEMINI.md` | the `model` slash command in the session | from published docs, no live session | | Pi | `pstack-mod-models.md` in the Pi agent directory, `$PI_CODING_AGENT_DIR` or `~/.pi/agent` | read by the pstack Pi extension, model rows and hook setting both; no include line | `pi --list-models`, see [pi-tools.md](../poteto-mode/references/pi-tools.md#model-names) and its `setup-pstack` note | extension contract tested offline; live results in the repository's `docs/pi-equivalence.md` | | GitHub Copilot (CLI and app) | `${COPILOT_HOME:-~/.copilot}/pstack-mod-models.md` | the plugin hook checks it and injects its role lines at session start; skills-only installs read it with `view` | the `task` tool's `model` enum, see [copilot-tools.md](../poteto-mode/references/copilot-tools.md#model-names) | hook contract tested; CLI install smoke-tested | | Prime Agent | no documented sheet path; Prime's configuration chooses models | | | no live session | ## Models Stamped from `plugins/pstack/models.json` (edit there, rerun `tools/generate.mjs`). - Available Claude models: `opus`, `fable`, `sonnet`, `haiku` - Default panel: `opus`, `fable`, `sonnet`, `haiku` - Reasoning effort levels: `low`, `medium`, `high`, `xhigh`, `max` - Default reasoning effort: `session` - Single-role default: `opus`