Problem
setup-pstack writes one global model sheet per harness, so every repository gets the same role assignments. A repository cannot choose its own models. For example, you cannot keep a client repository on subscription lanes while a personal repository uses gateway lanes such as OpenRouter.
Upstream does not support this either. Cursor pstack writes one global rule, ~/.cursor/rules/pstack-models.mdc. open-pstack writes to the harness config home (CLAUDE_CONFIG_DIR or CODEX_HOME, else ~/.claude or ~/.codex) and never reads a sheet from the repository. Project sheets are a pstack-flex divergence and need an entry in UPSTREAM-FLEX.md.
Change
A project sheet, when present, replaces the global sheet for that project. Without one, the global sheet applies.
| Parent |
Global sheet |
Project sheet |
| Claude Code |
~/.claude/pstack-models.md |
<project root>/.claude/pstack-models.md |
| Codex |
~/.codex/pstack-models.md |
<project root>/.codex/pstack-models.md |
| OpenCode |
~/.config/opencode/pstack-models.md |
<project root>/.opencode/pstack-models.md |
- The project root is the parent directory of
git rev-parse --path-format=absolute --git-common-dir, so all worktrees of a repository share one project sheet. Outside a git repository there is no project sheet.
- The parent harness checks for the project sheet once, before the first configured role launches. If the file exists, it is the sheet for the whole run, even when the global sheet is already loaded into context. Children never look for a sheet themselves.
- The sheets are never merged role by role. Every sheet carries every documented role, so the one in use always has an answer.
- When reporting a panel, the parent says which sheet it used.
setup-pstack asks on each run whether to write the global sheet or the project sheet. A new project sheet starts from the current global assignments, and every choice is probed before it is written, the same as the global sheet.
- A project sheet stays on the machine.
setup-pstack adds it to .git/info/exclude and never commits it. Deleting the file returns the project to the global sheet.
Out of scope
Model matrix changes and role defaults. #29 bundles the sheet scope with GPT-6.1 Sol and an architect default; this issue covers the sheet scope only. PR #30 implements it for Claude Code and Codex. OpenCode depends on #33.
Done when
bash scripts/check.sh passes, and the static invariants cover the three project sheet paths and the replace-not-merge rule.
- From the installed candidate in Claude Code, Codex, and OpenCode, each of these passes live:
- The scope question appears.
- A project sheet is written and listed in
.git/info/exclude.
- A role assigned differently in the two sheets dispatches from the project sheet.
- After the project sheet is deleted, the same role dispatches from the global sheet.
Problem
setup-pstackwrites one global model sheet per harness, so every repository gets the same role assignments. A repository cannot choose its own models. For example, you cannot keep a client repository on subscription lanes while a personal repository uses gateway lanes such as OpenRouter.Upstream does not support this either. Cursor pstack writes one global rule,
~/.cursor/rules/pstack-models.mdc. open-pstack writes to the harness config home (CLAUDE_CONFIG_DIRorCODEX_HOME, else~/.claudeor~/.codex) and never reads a sheet from the repository. Project sheets are a pstack-flex divergence and need an entry inUPSTREAM-FLEX.md.Change
A project sheet, when present, replaces the global sheet for that project. Without one, the global sheet applies.
~/.claude/pstack-models.md<project root>/.claude/pstack-models.md~/.codex/pstack-models.md<project root>/.codex/pstack-models.md~/.config/opencode/pstack-models.md<project root>/.opencode/pstack-models.mdgit rev-parse --path-format=absolute --git-common-dir, so all worktrees of a repository share one project sheet. Outside a git repository there is no project sheet.setup-pstackasks on each run whether to write the global sheet or the project sheet. A new project sheet starts from the current global assignments, and every choice is probed before it is written, the same as the global sheet.setup-pstackadds it to.git/info/excludeand never commits it. Deleting the file returns the project to the global sheet.Out of scope
Model matrix changes and role defaults. #29 bundles the sheet scope with GPT-6.1 Sol and an architect default; this issue covers the sheet scope only. PR #30 implements it for Claude Code and Codex. OpenCode depends on #33.
Done when
bash scripts/check.shpasses, and the static invariants cover the three project sheet paths and the replace-not-merge rule..git/info/exclude.