History

pstack: honor inherit-parent / auto (omit Task model) (#163)

<!-- CURSOR_AGENT_PR_BODY_BEGIN --> ## Summary - make `inherit-parent` and `auto` valid `/setup-pstack` values that omit the Task `model` field - resolve configured role values across pstack, including Arena's cross-judge pool - keep Interrogate's closest-slug fallback limited to resolved real slugs - document Auto-plan behavior in the setup skill and bump pstack to 0.11.5 ## Testing - `node scripts/validate-plugins.mjs` - `git diff HEAD^ --check` <!-- CURSOR_AGENT_PR_BODY_END --> <div><a href="https://cursor.com/agents/bc-9f0d7476-4f3c-411e-ad89-2745b0017905"><picture><source media="(prefers-color-scheme: dark)" srcset="https://cursor.com/assets/images/open-in-web-dark.png"><source media="(prefers-color-scheme: light)" srcset="https://cursor.com/assets/images/open-in-web-light.png"><img alt="Open in Web" width="114" height="28" src="https://cursor.com/assets/images/open-in-web-dark.png"></picture></a>&nbsp;<a href="https://cursor.com/background-agent?bcId=bc-9f0d7476-4f3c-411e-ad89-2745b0017905"><picture><source media="(prefers-color-scheme: dark)" srcset="https://cursor.com/assets/images/open-in-cursor-dark.png"><source media="(prefers-color-scheme: light)" srcset="https://cursor.com/assets/images/open-in-cursor-light.png"><img alt="Open in Cursor" width="131" height="28" src="https://cursor.com/assets/images/open-in-cursor-dark.png"></picture></a>&nbsp;</div>

lauren committed 3 months ago

Commit ce5e7941 parent c7a985e9 files · +34 −23Browse files

Unified · Split

9 files
  1. .cursor-plugin/plugin.json +1 −1
  2. skills/architect/SKILL.md +1 −1
  3. skills/arena/SKILL.md +4 −2
  4. skills/how/SKILL.md +5 −5
  5. skills/interrogate/SKILL.md +3 −3
  6. skills/poteto-mode/SKILL.md +1 −1
  7. skills/reflect/SKILL.md +7 −5
  8. skills/setup-pstack/SKILL.md +10 −3
  9. skills/why/SKILL.md +2 −2
.cursor-plugin/plugin.json+1−1
@@ -1,7 +1,7 @@
1{1{
2 "name": "pstack",2 "name": "pstack",
3 "displayName": "pstack",3 "displayName": "pstack",
4 "version": "0.11.4",4 "version": "0.11.5",
5 "description": "if you want to go fast, go deep first. pstack helps you write less, but higher quality code. rigorous agent workflows you can parallelize with confidence.",5 "description": "if you want to go fast, go deep first. pstack helps you write less, but higher quality code. rigorous agent workflows you can parallelize with confidence.",
6 "author": {6 "author": {
7 "name": "Lauren Tan"7 "name": "Lauren Tan"
skills/architect/SKILL.md+1−1
@@ -30,7 +30,7 @@ Skip Phase A only when the work is genuinely greenfield with no surrounding syst · 29 unmodified lines
30 30
31Run the **arena** skill with the design-sketch task and the Phase A grounding artifacts. Pass `references/runner-prompt.md` as each runner's prompt. Each candidate produces a design package shaped per `references/rationale-template.md`: the caller's usage written first, then the type sketch, function signatures, module map, and prose rationale derived from it.31Run the **arena** skill with the design-sketch task and the Phase A grounding artifacts. Pass `references/runner-prompt.md` as each runner's prompt. Each candidate produces a design package shaped per `references/rationale-template.md`: the caller's usage written first, then the type sketch, function signatures, module map, and prose rationale derived from it.
32 32
33Use your configured architect runners (defaults `claude-opus-4-8-thinking-xhigh`, `gpt-5.5-high-fast`, `grok-4.5-fast-xhigh`).33Use your configured `architect runners`. The routed **how** and **arena** skills resolve model values per `~/.cursor/rules/pstack-models.mdc`, including omitting Task `model` for `inherit-parent`/`auto`. If the role line is absent, use defaults `claude-opus-4-8-thinking-xhigh`, `gpt-5.5-high-fast`, `grok-4.5-fast-xhigh`.
34 34
35This is the **exhaust-the-design-space** principle skill made concrete. Whole-shape alternatives, not point fixes inside one shape.35This is the **exhaust-the-design-space** principle skill made concrete. Whole-shape alternatives, not point fixes inside one shape.
36 36
skills/arena/SKILL.md+4−2
@@ -25,7 +25,7 @@ The N candidates will receive the same prompt, so the prompt is the contract. Ge · 24 unmodified lines
25 25
261. State the artifact each candidate is producing.261. State the artifact each candidate is producing.
272. Derive the rubric. State what success looks like for *this* task, then turn it into 3-6 concrete gradeable criteria. Concrete: `Adds a --dry-run flag that skips writes`. Vague: `code is correct`. The rubric is the picker's tool in Phase D; candidates only see the task.272. Derive the rubric. State what success looks like for *this* task, then turn it into 3-6 concrete gradeable criteria. Concrete: `Adds a --dry-run flag that skips writes`. Vague: `code is correct`. The rubric is the picker's tool in Phase D; candidates only see the task.
283. Pick the runners. Default runners are your configured arena list (defaults `claude-opus-4-8-thinking-xhigh`, `gpt-5.5-high-fast`, `grok-4.5-fast-xhigh`). Spawn more when the arena covers multiple design directions. Same model N times when the work is generation-bound rather than judgment-sensitive.283. Pick the runners. Resolve each entry in your configured `arena runners` list per `~/.cursor/rules/pstack-models.mdc`. Pass a real slug as `model`. Omit `model` for `inherit-parent`/`auto`. If the role line is absent, use defaults `claude-opus-4-8-thinking-xhigh`, `gpt-5.5-high-fast`, `grok-4.5-fast-xhigh`. If every entry is `inherit-parent`/`auto`, keep the same fan-out count and omit `model` for every runner. Spawn more when the arena covers multiple design directions. Same model N times when the work is generation-bound rather than judgment-sensitive.
294. Assign output paths. Each candidate writes to its own location (a git worktree where possible, otherwise `/tmp/arena-<slug>/candidate-<n>/`). N candidates writing to the same path is shared mutable state and fails the the **separate-before-serializing-shared-state** principle skill test.294. Assign output paths. Each candidate writes to its own location (a git worktree where possible, otherwise `/tmp/arena-<slug>/candidate-<n>/`). N candidates writing to the same path is shared mutable state and fails the the **separate-before-serializing-shared-state** principle skill test.
30 30
31## Phase B: Fan out31## Phase B: Fan out
@@ -38,7 +38,9 @@ If a candidate fails to produce output, proceed with N-1 and note the dropout in · 6 unmodified lines
38 38
39## Phase C: Cross-judge39## Phase C: Cross-judge
40 40
41After all Phase B candidates complete, spawn one readonly judge subagent on a different model family from the parent's. It sees the rubric and the candidates by path label, scores each criterion, and recommends a base with rationale. It runs in parallel with the parent's reading in Phase D, not with the candidates themselves. Spawning while candidates are still writing means the judge sees partial or empty outputs and reports them as dropouts.41After all Phase B candidates complete, choose one value from the configured `arena cross-judge pool` in `~/.cursor/rules/pstack-models.mdc`. If the role line is absent, choose from defaults `claude-opus-4-8-thinking-xhigh`, `gpt-5.5-high-fast`, `grok-4.5-fast-xhigh`. Prefer a model family different from the parent's when possible. Pass a selected real slug as Task `model`. For selected `inherit-parent`/`auto`, omit `model`. A pool containing only `inherit-parent`/`auto` cannot provide a different family; still spawn the judge with `model` omitted.
42
43Spawn one readonly judge subagent with the resolved value. It sees the rubric and the candidates by path label, scores each criterion, and recommends a base with rationale. It runs in parallel with the parent's reading in Phase D, not with the candidates themselves. Spawning while candidates are still writing means the judge sees partial or empty outputs and reports them as dropouts.
42 44
43## Phase D: Pick a base45## Phase D: Pick a base
44 46
skills/how/SKILL.md+5−5
@@ -45,7 +45,7 @@ The right decomposition depends on the question. Use your judgment. Narrow quest · 44 unmodified lines
45Spawn all explorers in a single message:45Spawn all explorers in a single message:
46 46
47- `subagent_type`: `generalPurpose`47- `subagent_type`: `generalPurpose`
48- `model`: your configured how-explorer model (default `grok-4.5-fast-xhigh`)48- `model`: resolve the configured `how explorer` role per `~/.cursor/rules/pstack-models.mdc`. Pass a real slug as `model`. Omit `model` for `inherit-parent`/`auto`. If the role line is absent, default to `grok-4.5-fast-xhigh`.
49- `readonly`: `true`49- `readonly`: `true`
50 50
51Each explorer gets the same base prompt from `references/explorer-prompt.md` plus a specific exploration angle naming its slice. Each explorer should:51Each explorer gets the same base prompt from `references/explorer-prompt.md` plus a specific exploration angle naming its slice. Each explorer should:
@@ -64,7 +64,7 @@ Then proceed to Step 3. · 12 unmodified lines
64Spawn a single Task subagent that explores and explains in one pass:64Spawn a single Task subagent that explores and explains in one pass:
65 65
66- `subagent_type`: `generalPurpose`66- `subagent_type`: `generalPurpose`
67- `model`: your configured how-explainer model (default `claude-opus-4-8-thinking-xhigh`)67- `model`: resolve the configured `how explainer` role per `~/.cursor/rules/pstack-models.mdc`. Pass a real slug as `model`. Omit `model` for `inherit-parent`/`auto`. If the role line is absent, default to `claude-opus-4-8-thinking-xhigh`.
68- `readonly`: `true`68- `readonly`: `true`
69 69
70The agent does its own exploration (Glob, Grep, Read) and writes the explanation directly. Read `references/explainer-prompt.md` for the communication style and output format. Same structure, just no explorer findings as input.70The agent does its own exploration (Glob, Grep, Read) and writes the explanation directly. Read `references/explainer-prompt.md` for the communication style and output format. Same structure, just no explorer findings as input.
@@ -76,7 +76,7 @@ Proceed to Step 4. · 5 unmodified lines
76Once all explorers return, spawn a single Task subagent to synthesize their findings into one coherent explanation:76Once all explorers return, spawn a single Task subagent to synthesize their findings into one coherent explanation:
77 77
78- `subagent_type`: `generalPurpose`78- `subagent_type`: `generalPurpose`
79- `model`: your configured how-explainer model (default `claude-opus-4-8-thinking-xhigh`)79- `model`: resolve the configured `how explainer` role per `~/.cursor/rules/pstack-models.mdc`. Pass a real slug as `model`. Omit `model` for `inherit-parent`/`auto`. If the role line is absent, default to `claude-opus-4-8-thinking-xhigh`.
80- `readonly`: `true`80- `readonly`: `true`
81 81
82The explainer gets all explorers' findings and writes the human-facing explanation (output format below). Read `references/explainer-prompt.md` for the full prompt template. The explainer reconciles overlapping findings, resolves contradictions, and weaves the slices into a unified picture.82The explainer gets all explorers' findings and writes the human-facing explanation (output format below). Read `references/explainer-prompt.md` for the full prompt template. The explainer reconciles overlapping findings, resolves contradictions, and weaves the slices into a unified picture.
@@ -109,11 +109,11 @@ Run the full explain flow above (Steps 1-4). You must understand the architectur · 26 unmodified lines
109 109
110### Step 2. Spawn Critics110### Step 2. Spawn Critics
111 111
112After the explanation is complete, spawn one architectural critic per model in your configured how-critics list (defaults `claude-opus-4-8-thinking-xhigh`, `gpt-5.5-high-fast`, `grok-4.5-fast-xhigh`), all in a single message.112After the explanation is complete, spawn one architectural critic per entry in your configured `how critics` list, all in a single message. If the role line is absent, use defaults `claude-opus-4-8-thinking-xhigh`, `gpt-5.5-high-fast`, `grok-4.5-fast-xhigh`.
113 113
114For each critic:114For each critic:
115- `subagent_type`: `generalPurpose`115- `subagent_type`: `generalPurpose`
116- `model`: one model from the configured how-critics list. These are minimum reasoning levels. The lead should escalate any model when the architecture warrants deeper analysis.116- `model`: resolve that `how critics` entry per `~/.cursor/rules/pstack-models.mdc`. Pass a real slug as `model`. Omit `model` for `inherit-parent`/`auto`. Real slugs are minimum reasoning levels, and the lead should escalate them when the architecture warrants deeper analysis.
117- `readonly`: `true`117- `readonly`: `true`
118 118
119Read `references/critic-prompt.md` for the prompt template. Each critic gets:119Read `references/critic-prompt.md` for the prompt template. Each critic gets:
skills/interrogate/SKILL.md+3−3
@@ -33,14 +33,14 @@ Write one clear paragraph. Reviewers challenge whether the work achieves the int · 32 unmodified lines
33 33
34## Step 3, Spawn Reviewers34## Step 3, Spawn Reviewers
35 35
36Launch one reviewer per model in your configured interrogate list (defaults `claude-opus-4-8-thinking-xhigh`, `gpt-5.5-high-fast`, `grok-4.5-fast-xhigh`), all in a single message.36Launch one reviewer per entry in your configured `interrogate reviewers` list, all in a single message. If the role line is absent, use defaults `claude-opus-4-8-thinking-xhigh`, `gpt-5.5-high-fast`, `grok-4.5-fast-xhigh`.
37 37
38For each reviewer:38For each reviewer:
39- `subagent_type`: `generalPurpose`39- `subagent_type`: `generalPurpose`
40- `model`: one model from the configured interrogate list40- `model`: resolve that `interrogate reviewers` entry per `~/.cursor/rules/pstack-models.mdc`. Pass a real slug as `model`. Omit `model` for `inherit-parent`/`auto`.
41- `readonly`: `true`41- `readonly`: `true`
42 42
43If a configured model slug is rejected as unresolvable when you try to spawn the subagent, check the valid slugs in the Task tool's error message, pick the closest equivalent (prefer the highest-reasoning tier of the same family), spawn with the valid slug, and open a separate PR to update the configured defaults. Do not block the review on the slug issue.43If a resolved real model slug is rejected as unresolvable when you try to spawn the subagent, check the valid slugs in the Task tool's error message, pick the closest equivalent (prefer the highest-reasoning tier of the same family), spawn with the valid slug, and open a separate PR to update the configured defaults. Do not block the review on the slug issue. If the configured value is `inherit-parent` or `auto`, omit `model` instead. Never treat those aliases as slugs or enter this fallback for them.
44 44
45Read `references/reviewer-prompt.md` and fill in the template with:45Read `references/reviewer-prompt.md` and fill in the template with:
461. The stated intent461. The stated intent
skills/poteto-mode/SKILL.md+1−1
@@ -84,7 +84,7 @@ Read the leaf skill in full for any principle you apply. Each entry names when i · 83 unmodified lines
84 84
85**Use `subagent_type: "poteto-agent"` for any subagent you spawn inside a playbook step** (code-writing delegates, ad-hoc helpers). `/poteto-mode` and `poteto-agent` route through the same wrapper. Routed workflow skills (`how`, `why`, `interrogate`, `reflect`) set their own `subagent_type` for diverse-model review; respect what the skill prescribes, don't override to `poteto-agent`.85**Use `subagent_type: "poteto-agent"` for any subagent you spawn inside a playbook step** (code-writing delegates, ad-hoc helpers). `/poteto-mode` and `poteto-agent` route through the same wrapper. Routed workflow skills (`how`, `why`, `interrogate`, `reflect`) set their own `subagent_type` for diverse-model review; respect what the skill prescribes, don't override to `poteto-agent`.
86 86
87**Defaults for every `Task` call.** `run_in_background: true`, agent mode (readonly strips MCP), file pointers not inlined context, explicit model per role (configurable via `/setup-pstack`; defaults `grok-4.5-fast-xhigh` for code, `claude-opus-4-8-thinking-xhigh` for prose and judgment). Code delegates tier by difficulty. The hardest changes (cross-cutting design, gnarly concurrency, subtle algorithms) go to your strongest judgment model (`claude-fable-5-thinking-max`) when the task needs judgment or the intent is vague, and to your strongest instruction-following model when the work is a precisely specified sequence of steps to execute to the letter; trivial mechanical edits go to your fast code model. Per-role lines in the `/setup-pstack` rule override these defaults and the model choices in the routed skills (`how`, `why`, `arena`, `architect`, `interrogate`, `reflect`); a role with no line keeps its default.87**Defaults for every `Task` call.** `run_in_background: true`, agent mode (readonly strips MCP), file pointers not inlined context, and a per-role model from the `/setup-pstack` rule. Pass a real slug as `model`. For `inherit-parent`/`auto`, omit `model` so the subagent inherits the parent chat model. If a role line is absent, default to `grok-4.5-fast-xhigh` for code and `claude-opus-4-8-thinking-xhigh` for prose and judgment. Code delegates tier by difficulty. The hardest changes (cross-cutting design, gnarly concurrency, subtle algorithms) go to your strongest judgment model (`claude-fable-5-thinking-max`) when the task needs judgment or the intent is vague, and to your strongest instruction-following model when the work is a precisely specified sequence of steps to execute to the letter; trivial mechanical edits go to your fast code model. Per-role lines in the `/setup-pstack` rule override these defaults and the model choices in the routed skills (`how`, `why`, `arena`, `architect`, `interrogate`, `reflect`); a role with no line keeps its default.
88 88
89You own every subagent's work. Review the diff and write your own summary, don't pass through what it said. Interrupt-chained resumes silently drop directives, so fire a fresh subagent with consolidated scope rather than trusting a "done" summary. A second opinion is the same prompt against a different model. Agreement is high-signal.89You own every subagent's work. Review the diff and write your own summary, don't pass through what it said. Interrupt-chained resumes silently drop directives, so fire a fresh subagent with consolidated scope rather than trusting a "done" summary. A second opinion is the same prompt against a different model. Agreement is high-signal.
90 90
skills/reflect/SKILL.md+7−5
@@ -34,19 +34,21 @@ For each candidate, read the first JSONL line and check that `message.content[0] · 33 unmodified lines
34 34
35### 2. Spawn three reviewers in parallel35### 2. Spawn three reviewers in parallel
36 36
37One message, three `Task` calls, `subagent_type: generalPurpose`, explicit `model:` on each, agent mode (`readonly: false`). Reviewers need MCP access for context lookups (tickets, chat threads, observability traces referenced in the transcript); readonly strips MCPs. The prompt forbids file writes; the parent applies edits.37One message, three `Task` calls, `subagent_type: generalPurpose`, model resolved per role, agent mode (`readonly: false`). Reviewers need MCP access for context lookups (tickets, chat threads, observability traces referenced in the transcript); readonly strips MCPs. The prompt forbids file writes; the parent applies edits.
38
39Resolve each role in the table per `~/.cursor/rules/pstack-models.mdc`. Pass a real slug as `model`. Omit `model` for `inherit-parent`/`auto`. If the role line is absent, use the listed default.
38 40
39| Lens | `model` | Prompt template |41| Lens | `model` | Prompt template |
40|---|---|---|42|---|---|---|
41| Judgment | your configured reflect-judgment model (default `claude-opus-4-8-thinking-xhigh`) | `references/judgment-reviewer.md` |43| Judgment | `reflect judgment, divergent, synthesizer` (default `claude-opus-4-8-thinking-xhigh`) | `references/judgment-reviewer.md` |
42| Tooling | your configured reflect-tooling model (default `grok-4.5-fast-xhigh`) | `references/tooling-reviewer.md` |44| Tooling | `reflect tooling` (default `grok-4.5-fast-xhigh`) | `references/tooling-reviewer.md` |
43| Divergent | your configured reflect-judgment model (default `claude-opus-4-8-thinking-xhigh`) | `references/divergent-reviewer.md` |45| Divergent | `reflect judgment, divergent, synthesizer` (default `claude-opus-4-8-thinking-xhigh`) | `references/divergent-reviewer.md` |
44 46
45Pass each template verbatim, substituting the transcript path or digest where marked. Reviewers return findings in the `Task` response body.47Pass each template verbatim, substituting the transcript path or digest where marked. Reviewers return findings in the `Task` response body.
46 48
47### 3. Synthesize49### 3. Synthesize
48 50
49One `Task` call, `subagent_type: generalPurpose`, using your configured reflect-judgment model (default `claude-opus-4-8-thinking-xhigh`), agent mode (`readonly: false`). The synthesizer's quality check includes spot-verifying citations, which can require MCP access; readonly strips MCPs. Use `references/synthesizer.md` verbatim, with each reviewer's full output inlined where marked. The synthesizer returns a structured Accepted / Rejected / Backlog list.51One `Task` call, `subagent_type: generalPurpose`, using the configured `reflect judgment, divergent, synthesizer` role. Resolve it per `~/.cursor/rules/pstack-models.mdc`. Pass a real slug as `model`. Omit `model` for `inherit-parent`/`auto`. If the role line is absent, default to `claude-opus-4-8-thinking-xhigh`. Use agent mode (`readonly: false`). The synthesizer's quality check includes spot-verifying citations, which can require MCP access; readonly strips MCPs. Use `references/synthesizer.md` verbatim, with each reviewer's full output inlined where marked. The synthesizer returns a structured Accepted / Rejected / Backlog list.
50 52
51### 4. Structural enforcement check53### 4. Structural enforcement check
52 54
skills/setup-pstack/SKILL.md+10−3
@@ -7,11 +7,13 @@ description: Configure which models pstack uses per role. Detects your available · 6 unmodified lines
7 7
8Write `~/.cursor/rules/pstack-models.mdc`, an always-applied rule that sets pstack's model per role. The skills read it and fall back to their inline defaults when a line is absent, so this is an override layer, not a requirement.8Write `~/.cursor/rules/pstack-models.mdc`, an always-applied rule that sets pstack's model per role. The skills read it and fall back to their inline defaults when a line is absent, so this is an override layer, not a requirement.
9 9
10`inherit-parent` and `auto` are aliases. Either value means omit `model` from the Task call so the subagent inherits the parent chat model. Auto-plan users can use either value to stay on Auto. Do not invent an Auto Task slug.
11
10## Steps12## Steps
11 13
12### 1. Detect available models14### 1. Detect available models
13 15
14Enumerate the model slugs you can pass to a `Task` subagent in this session; that is the dependable source. If Cursor also exposes a models API or CLI that lists the user's entitled models, prefer it for completeness. If you cannot detect any, ask the user to paste the slugs they have access to. Never write a slug you have not confirmed is available.16Enumerate the model slugs you can pass to a `Task` subagent in this session; that is the dependable source. If Cursor also exposes a models API or CLI that lists the user's entitled models, prefer it for completeness. If you cannot detect any real slugs, still offer `inherit-parent` / `auto` and ask the user to paste any real slugs they want to use. The aliases are always valid and do not need to appear in the detected slug set. Never write a real slug you have not confirmed is available.
15 17
16### 2. Load current state18### 2. Load current state
17 19
@@ -19,11 +21,11 @@ The default role-to-model mapping is the rule shape shown in step 5 below. If `~ · 1 unmodified line
19 21
20### 3. Map and confirm22### 3. Map and confirm
21 23
22Show every role with its current model, marking any whose model is not in the detected set as needing a choice. Ask whether to accept as-is or change specific roles, offering the detected models as the options. Prefer AskQuestion over free text. For panel roles (how critics, arena runners, architect runners, interrogate reviewers) the value is a list, and one subagent runs per model, so the list length sets the count. `arena cross-judge pool` is also a list, but Arena selects one model from it whose family differs from the parent's when possible.24Show every role with its current model, marking any real slug that is not in the detected set as needing a choice. Ask whether to accept as-is or change specific roles, offering the detected models plus `inherit-parent` / `auto` as options. Label the aliases as "inherit parent chat model (Auto)." Prefer AskQuestion over free text. For panel roles (how critics, arena runners, architect runners, interrogate reviewers) the value is a list, and one subagent runs per entry, so the list length sets the count. `arena cross-judge pool` is also a list, but Arena selects one entry from it whose family differs from the parent's when possible.
23 25
24### 4. Validate26### 4. Validate
25 27
26Every slug written must be in the detected set. If a chosen slug is not available, stop and ask again. A rule pointing at a model the user cannot use breaks every delegation that reads it.28Require detected-set membership only for real slugs. `inherit-parent` and `auto` always pass validation. If a chosen real slug is not available, stop and ask again. A rule pointing at a model the user cannot use breaks every delegation that reads it.
27 29
28### 5. Write the rule30### 5. Write the rule
29 31
@@ -34,6 +36,11 @@ Write `~/.cursor/rules/pstack-models.mdc` with `alwaysApply: true` and one line · 4 unmodified lines
34description: pstack per-role model choices (overrides skill defaults)36description: pstack per-role model choices (overrides skill defaults)
35alwaysApply: true37alwaysApply: true
36---38---
39# Resolve each role value before every Task spawn:
40# - a real model slug → pass it as Task `model`
41# - `inherit-parent` or `auto` → OMIT the `model` field entirely so the subagent inherits the parent chat model
42# - never substitute a skill's inline default when the role line is set to inherit-parent/auto
43# Panel roles (lists): inherit-parent/auto on every entry keeps fan-out count but loses model diversity (all runners share the parent model). That is intentional for Auto-only users.
37# pstack model configuration. One line per role. Delete a line to fall back to the skill default.44# pstack model configuration. One line per role. Delete a line to fall back to the skill default.
38feature, refactoring: grok-4.5-fast-xhigh45feature, refactoring: grok-4.5-fast-xhigh
39bug-fix: gpt-5.5-high-fast46bug-fix: gpt-5.5-high-fast
skills/why/SKILL.md+2−2
@@ -117,7 +117,7 @@ Launch all matching investigators in a single message so they run concurrently. · 116 unmodified lines
117 117
118Subagent config (each):118Subagent config (each):
119- `subagent_type`: `generalPurpose`119- `subagent_type`: `generalPurpose`
120- `model`: your configured why-investigators model (default `grok-4.5-fast-xhigh`)120- `model`: resolve the configured `why investigators` role per `~/.cursor/rules/pstack-models.mdc`. Pass a real slug as `model`. Omit `model` for `inherit-parent`/`auto`. If the role line is absent, default to `grok-4.5-fast-xhigh`.
121- `readonly`: `false` (agent mode). **Do not use readonly/Ask mode.** It strips MCP access, which disables MCP-backed investigators entirely. The source control investigator would be safe in readonly, but keep modes uniform. Investigators still shouldn't write anything. That's a posture, not a sandbox.121- `readonly`: `false` (agent mode). **Do not use readonly/Ask mode.** It strips MCP access, which disables MCP-backed investigators entirely. The source control investigator would be safe in readonly, but keep modes uniform. Investigators still shouldn't write anything. That's a posture, not a sandbox.
122 122
123Each investigator gets:123Each investigator gets:
@@ -163,7 +163,7 @@ If your scope assessment suggests a single-commit trivial target where the PR de · 39 unmodified lines
163Spawn one synthesizer subagent:163Spawn one synthesizer subagent:
164 164
165- `subagent_type`: `generalPurpose`165- `subagent_type`: `generalPurpose`
166- `model`: your configured why-synthesizer model (default `claude-opus-4-8-thinking-xhigh`)166- `model`: resolve the configured `why synthesizer` role per `~/.cursor/rules/pstack-models.mdc`. Pass a real slug as `model`. Omit `model` for `inherit-parent`/`auto`. If the role line is absent, default to `claude-opus-4-8-thinking-xhigh`.
167- `readonly`: `false` (agent mode). The synthesizer's quality check spot-verifies citations, which can require MCP access. Readonly/Ask mode strips MCPs and defeats that.167- `readonly`: `false` (agent mode). The synthesizer's quality check spot-verifies citations, which can require MCP access. Readonly/Ask mode strips MCPs and defeats that.
168 168
169The synthesizer gets:169The synthesizer gets: