# Compatibility

The compatibility registry in `src/registry.ts` assigns one support tier to every skill in the
certified pstack revision. Generation reads it, the wrapper frontmatter publishes it, and
`/pistack-status` reports it.

Certified revision: pstack `0.15.36` at `c742dd61706fbacc1b95f1a20b7b988cf096ce6c` in
`https://github.com/cursor/plugins`.

## Platforms

| platform | status | shell the skills run in |
| --- | --- | --- |
| Linux, including Pi inside WSL | supported | Bash |
| macOS | supported | Bash |
| Windows, native | supported | Git Bash, Pi's default `bash` tool shell |
| anything else | experimental | whatever Pi resolves |

The tiers below apply on every supported platform. `/pistack-check` looks for per-skill
executables in the shell the skills run in, with Pi's `shellCommandPrefix` applied. On Windows
that matters most, because Git Bash adds `/usr/bin` and `/mingw64/bin` to the `PATH` Pi
started with. A shell that is missing, inactive, or cannot run a command blocks every workflow.

pstack `0.15.36` was certified on Linux. No skill or agent was added or removed. The skills
changed only in text, and the Orchestrate playbook's `orch` scripts were deleted; no adapter
gate named them. `0.15.36` has not been checked on native Windows. The statechart scripts did
not change, so the `0.15.34` Windows findings below still describe them.

Ten skills then ran end to end in two isolated installs built from the packed package, on
Pi 1.4.0 with the CLIProxyAPI provider extension. The parent model was Claude Opus 5.5, with the
`judgment` role on Claude and the `general` role on GPT 6.1. One install had no delegation or
question tool. The other added pi-subagents 0.83.0, and later pi-ask-user 0.17.0, as Pi
packages, so their children loaded the same provider. Each skill ran in a throwaway copy of a
small Git repository holding a token-bucket rate limiter with two marked bugs.

- Without delegation, `sharpen` handed back a rewritten prompt and did not do the task, so it
  rises to `native`. `statechart` found the uncapped refill as the shortest path to a broken
  rule. With only an older Node on PATH, its launcher named the versions it needs and exited
  127. `ketchup-video` drew five slides and rendered a subtitled 35-second mp4 with `ffmpeg`.
- With pi-subagents, `interrogate`, `arena`, and `show-me-your-work` completed every delegation
  step against a real provider, on two model families, so each rises to `adapted`.
  `interrogate`'s two adversaries proved the same two bugs in their own worktrees. `arena`'s
  judge came from the family other than the parent's. `show-me-your-work`'s reviewer read the
  parent's Pi session file.
- The transcript mapping held. `recall`, `reflect`, `automate-me`, and the `show-me-your-work`
  reviewer read this workspace's Pi session files and nothing else in the session folder.
  `recall` rises to `dependency-gated`, because the transcript was its only Cursor-specific
  step. In a fresh session it read the two earlier chats itself, so its fan-out did not run. An
  earlier fresh run looked in the default session folder, which the sandbox had moved, so the
  host mapping now says to find the folder from `$PI_SESSION_FILE` first. `reflect` copied the upstream skill
  to a Pi skill location before editing it, but its create-skill route did not run, and
  `automate-me` found nothing to draft, so both stay `experimental`.
- `poteto-mode`'s Orchestrate playbook ran a two-unit program in a linked worktree. Each unit had
  an owner on its own branch and worktree, and a verifier from another model family checked the
  owner's head before a new agent merged it. The tracker and store went in a folder it added to
  the exclude file that `git rev-parse --git-path info/exclude` names, which lives in the main
  repository's Git directory. That run led to the host mapping rule that a substitute is not a
  skip. `poteto-mode` stays `experimental`: its other playbooks and sticky mode were not rerun.
- `ketchup-video` stays `experimental`, because whether a Pi client plays its embedded video is
  still unverified.
- Upstream does not name a `/goal` command at `0.15.36`. Its `/loop` now has a host mapping row,
  and the vocabulary scan finds it.

pstack `0.15.34` was certified on Linux, then checked on native Windows 11 (build 26200) with
Git for Windows, Node 22.23.2, and mise, over SSH from Git Bash. On Windows:

- The type check passes. The unit suite runs 189 tests: 186 pass, none fail, and 3 skip. All ten
  integration tests pass with no skips. The probe on an LF export of the certified commit
  matches Linux: 59 skills, two agents, no diagnostics, 57 bodies byte-identical, `setup-pstack`
  replaced, and none mismatched.
- The isolated install passes with the CLIProxyAPI scratch copy described below: 59 skills, no
  `subagent` or `ask_user` with the provider extension loaded, and cache reuse without bootstrap
  permission. `/pistack-check pistack-statechart` clears.
- The `0.15.34` statechart scripts crash. On upstream's own `MediaPlayer` corpus model, the
  launcher exits 1 with an unhandled `spawn /bin/sh ENOENT`, before TLC runs. It writes no
  output folder and leaves an empty hidden staging folder beside it and an empty `statechart-`
  folder in the temporary folder. No worker or TLC process is left running. This reproduction
  lowers `statechart` to `experimental`.

The Windows statechart findings further below describe the `0.15.32` scripts. The other skills
that changed in `0.15.34` changed only in text. Linux evidence for the `0.15.34` statechart
scripts, gathered on Node 26.12.1, Bun, Deno 2.9.8, and mise 2026.10.17:

- `/pistack-check pistack-statechart` clears in the isolated install, and `statechart` ran there
  against a checkout fixture whose 5-second timeout shows "Try again" while the first charge is
  still in flight. From the code, it wrote a TLA+ model and a `--view` module. TLC found the rule
  "the shopper is never charged twice for one cart" broken (21 model states), and the report gave
  the five-step path. A replay test drove the real module with a fake gateway and clock and
  reproduced two charges, and the regenerate command rebuilt the same chart into a fresh folder.
  The fixture repository stayed clean.
- A cold run installed TLC 1.7.4 and Java temurin-25 with `mise`. The `TLA2TOOLS` path, with
  `JAVA` set and with `java` from PATH, gave the same report and chart. The scripts also ran
  under Bun and Deno. A rerun into a folder that is not empty exits 2 and writes nothing.
- Upstream's own suite passes on Linux with `TLA2TOOLS` set: 367 tests, none failed or skipped.
- `pele@1.9.0`, installed with `--ignore-scripts`, rendered the fixture's `chart.mmd` to SVG with
  the options that `references/render.md` gives.

Earlier Windows evidence, gathered at pstack `0.15.32` on Windows 11 Pro with Git for Windows
2.53.0, Node 22.23.2, npm 10.9.8, Pi 1.3.0, mise 2026.10.8, and ffmpeg 8.1. No JDK was on
PATH and `TLA2TOOLS` was unset, so statechart took the `mise` path:

- The type check and unit suite pass: 189 tests, 185 passed, none failed, and the four symlink
  tests skipped. All ten integration tests pass with no skips, including the Windows 8.3
  short-path case and the `plugins/cache/` host-mapping regression.
- The probe on an LF export of the certified commit reports 59 skills, two agents, no
  diagnostics, 57 bodies byte-identical, `setup-pstack` replaced, and none mismatched. That
  matches the Linux probe.
- The isolated install passes from Git Bash with the CLIProxyAPI scratch copy described below:
  59 skills, no `subagent` or `ask_user` with the provider extension loaded, and cache reuse
  without bootstrap permission. `/pistack-check` clears `pistack-statechart`, with `node` and
  `npm` on PATH, and `pistack-ketchup-video`.
- The 0.15.32 statechart scripts run on native Windows from a cold machine. `from-chart` on
  upstream's own `upload.mmd` with `--png` installed `pele` and `@resvg/resvg-js` with `npm`
  under `~/.cache/statechart/`, installed TLC 1.7.4 and Java temurin-25 with `mise`, drew the
  chart back unchanged, and rendered the PNG. The `npx` defect from `0.15.30` is gone. A rerun
  into the same `--out` folder still fails with `EPERM` and exit code 2. It leaves the old folder
  unchanged, and it names the temporary folder that holds the new files.
- `statechart` ran in the isolated install against a checkout fixture whose 5-second timeout
  shows "Try again" while the first charge is still in flight. From the code, it wrote a TLA+
  model and a mapping. TLC found the rule "The customer is charged at most once for one cart"
  broken, and also found that a declined charge leaves the screen on "Paying" (19 model states
  and 33 steps, drawn as 10 chart states and 15 arrows). The PNGs rendered through `--png` with
  no workaround, and the numbered five-step double-charge path read correctly. A replay test
  drove the real module with a fake gateway and clock and reproduced both bugs, and the
  regenerate script it wrote rebuilt every chart into a fresh folder. The fixture repository
  stayed clean. This supports `dependency-gated` for the 0.15.32 scripts.
- Upstream's own `scripts/test/statechart.test.mjs` still does not pass on Windows. Of its 150
  tests, the first 126 ran: 99 pass, 3 skip for missing fonts, and 24 fail. The 127th, which
  kills a run during TLC, waits for TLC to write into `TMPDIR`, which Node ignores on Windows,
  and hangs. The remaining tests were not run. Ten failures are the `EPERM` rename. Six fake
  `mise` with a shell script, which Windows cannot start. Five expect the temporary folder that
  `TMPDIR` names, and three expect `/` in paths that Windows prints with `\`.
- `ketchup-video` ran in the isolated install after a session that fixed a pricing bug and
  committed the fix. It drew four slides with `ffmpeg` and the Windows Arial font, rendered a
  16-second 1280x720 mp4 outside the repository, and left the repository unchanged. The slides
  read correctly. Its reply embedded the video as an HTML `video` tag. Whether a Pi client plays
  it inline was not checked, so the skill stays `experimental`.

Earlier Windows evidence, gathered at pstack `0.15.30` on Windows 11 Pro with Git for Windows
2.53.0, Node 22.23.2, Bun 1.3.14, Pi 1.3.0, and a portable Temurin JDK 21.0.12 with the latest
`tla2tools.jar`. Its statechart findings describe the scripts that `0.15.32` replaced:

- The type check and unit suite pass: 187 tests, 183 passed, none failed, and the four symlink
  tests skipped. All nine integration tests pass with no skips, including the Windows 8.3
  short-path case and the statechart wrapper regression with its nested support files.
- The isolated install passes from Git Bash with the CLIProxyAPI scratch copy described below:
  58 skills, no `subagent` or `ask_user` with the provider extension loaded, and cache reuse
  without bootstrap permission. The installed checkout's 184 files match an LF export of the
  pinned tree byte for byte. The probe reports 58 skills, two agents, no diagnostics, 56 bodies
  byte-identical, `setup-pstack` replaced, and none mismatched. The 11 statechart support files
  sit beside the generated wrapper and match upstream.
- The installed status report shows `tested` trust at the certified commit. `/pistack-check`
  ran for all 58 skills. Each delegating skill names the missing `delegation` capability,
  `benchmark-checklist` still names `uptime`, and every other skill clears.
  `/pistack-check pistack-statechart` names `java` until a JDK is on PATH, then clears.
  Git Bash rewrites a leading `/` in a `pi -p` argument into a Windows path, so pass
  `MSYS2_ARG_CONV_EXCL='/pistack;/skill'` when scripting these commands.
- `statechart` ran in the isolated install against a checkout fixture whose 5-second timeout
  shows "Try again" while the first charge is still in flight. From the code, it wrote a TLA+
  model and a mapping, and TLC found the rule "A customer is never charged twice for one cart"
  broken (20 model states, 9 chart states). It rendered both charts to PNG, and the numbered
  five-step bug path read correctly. A replay script drove the real module with a fake gateway
  and clock and reproduced two charges. The fixture repository stayed clean. Two upstream
  defects needed workarounds. `--png` calls `spawnSync("npx")`, which cannot start `npx.cmd`
  on Windows, so the PNGs were rendered by running `npx` directly. Renaming a directory onto an
  existing one fails with `EPERM` on Windows, not `ENOTEMPTY` or `EEXIST`, so every rerun
  into an existing output folder fails and leaves it unchanged until the folder is deleted.
  This supports `dependency-gated` with those workarounds in its note.
- Upstream's own `scripts/test/statechart.test.mjs` does not pass on Windows: of 58 tests, 41
  pass, 2 skip, 12 fail, and 3 hang. The two defects above cause eight failures. Three expect
  `/` in paths that Windows prints with `\`, and one of those also sets `TMPDIR`, which Node
  ignores on Windows. One runs a fake `java` shell script, which Windows cannot start. The three
  hangs wait for TLC to write into `TMPDIR`, which Node ignores on Windows, so they never see
  it start.
- `poteto-help` routed a request to show a PM a double-charge path to
  `/skill:pistack-statechart`. It named the `pistack-` prefix and listed the missing `java` and
  `TLA2TOOLS` prerequisites.

Earlier Windows evidence, gathered at pstack `0.15.28` with the same toolchain:

- The type check and unit suite pass: 183 tests, 179 passed, none failed, and the four symlink
  tests skipped. All eight integration tests pass with no skips, including the Windows 8.3
  short-path case and both formal-verification wrapper regressions.
- The isolated install passes from Git Bash with the same CLIProxyAPI scratch copy as below: 57
  skills, no `subagent` or `ask_user` with the provider extension loaded, and cache reuse without
  bootstrap permission. The installed checkout's 172 files match an LF export of the pinned tree
  byte for byte. The probe reports 57 skills, two agents, no diagnostics, 55 bodies
  byte-identical, `setup-pstack` replaced, and none mismatched.
- The installed status report shows `tested` trust at the certified commit, and
  `/pistack-check pistack-maintain-formal-verification-skill` clears the workflow. `git` is
  its only executable, and Git for Windows bundles it.
- `maintain-formal-verification-skill` ran in the isolated install against a fixture whose
  `.pi/skills/` verify skill recorded a sync commit, followed by a rename of a covered function
  and a new batch function that wrote the guarded state without its duplicate-ID guard. It
  found the skill, ran the stale check (it crashed on the rename), read all three commits since
  the sync commit, renamed the call, extended the harness to the new function, and reported the
  bug with the commit that introduced it and a two-step counterexample. It proved the updated
  check could pass and fail by temporarily fixing and then breaking the product file, restored
  it, moved the sync commit, and committed only the verification and verify-skill changes.
  This supports `dependency-gated` on `git`.
- The changed `create-formal-verification-skill` reran in the isolated install. It generated
  `.pi/skills/verify-inventory-ledger/SKILL.md` with the coverage record and sync commit new in
  `0.15.28`, plus a dependency-free Node verifier over the real functions (28 states, 168 calls).
  The check caught six deliberate breaks, and the product file's content was unchanged after
  each restore. `adapted` still holds.

Earlier Windows evidence, gathered at pstack `0.15.26` with the same toolchain:

- The type check and unit suite pass: 173 tests passed, none failed, and four symlink tests
  skipped because Windows requires Developer Mode or administrator rights. The seven scheduled
  integration tests pass with no skips: six cache-containment cases, including a Windows 8.3
  short-path case, and a formal-verification wrapper regression.
  Run these separately with `npm run test:integration`; their CI lane is daily and manually
  dispatchable, not per PR. The existing unit-suite CI matrix still covers all three platforms.
- The isolated install passes from Git Bash: the cold run registers no skills without bootstrap
  permission, the permitted run registers all 56 skills, and a later run reuses the cache
  without bootstrap permission. The local CLIProxyAPI provider requires its extension, config,
  and model catalog in the sandbox; a scratch copy of the install script supplies them. Its
  tool probe still reports no `subagent` or `ask_user`. Sandbox credentials are removed on exit.
- The certification probe passes on an LF export of the pinned tree: 56 skills, two agents,
  no diagnostics, 54 bodies byte-identical, `setup-pstack` replaced, and none mismatched.
  All 171 files in the isolated installed cache match the LF export byte for byte.
- `create-formal-verification-skill` completed in the isolated install without `subagent` or
  `ask_user`. It generated `.pi/skills/verify-inventory-reservations/SKILL.md` and a dependency-free
  Node 22 explicit-state verifier that imports the fixture's actual reserve/release functions.
  It checked 49 reachable states and 490 transitions for stock 0–3 and five request IDs, caught
  six mutant copies, then caught a removed retry guard in the actual product file. Restoring
  that file restored the passing result and its original hash. This supports `adapted`: the
  generated skill path is mapped to Pi. It does not certify TLA+, proof assistants, installation
  of other verifiers, unbounded inputs, or real database/async concurrency.
- The revised `ketchup` ran read-only in a separate fixture. It listed both supplied product
  choices (CSV versus JSON and seven versus thirty days of history), drew a Mermaid sequence
  diagram for a late-retry edge case it reproduced, and left the fixture unchanged. It did not
  contact GitHub for this fixture-only task.
- Installed status reports show native Windows plugin and generated-skill paths and `tested`
  trust at the certified commit. `/pistack-check` clears the formal-verification workflow and
  `ketchup`, but still names `uptime` as missing for `benchmark-checklist`. Delegation and
  structured questions remain unavailable in the isolated install; no delegating tier changed.
- A cache inside a Git worktree must own its worktree, Git directory, and common directory before
  bootstrap or reuse can change Git state. The Windows run exposed ancestor discovery from an
  empty nested cache; this is fixed. Regressions also cover incomplete metadata, a foreign Git
  file, foreign worktree/common directory settings, and short paths, while checking that the
  enclosing repository's HEAD, config, index, and tracked bytes stay unchanged.

Historical coverage below has not been rerun at `0.15.26` unless stated otherwise:

- At `0.15.23`, `in-your-own-words`, `ketchup`, and `poteto-help` ran end to end in the isolated install, with
  no `subagent` or `ask_user` tool. `ketchup` reported a commit and a pending decision with
  Mermaid diagrams and changed nothing. `poteto-help` answered with `/pistack-mode on` and read
  the guide from the `plugin directory` row, whose Windows path it resolved.
- The status report's `plugin directory` and `generated skills` rows give native Windows paths.
  `/pistack-check` clears `ketchup`, and still reports `uptime` missing for `benchmark-checklist`.
- The helpers changed in `0.15.23` ran in Git Bash. `worktree-audit.sh` handled `-b <ref>`,
  `--help`, an unknown base, and the `origin/HEAD` fallback, and classified a linked worktree.
  `check-plan.mjs` ran on Node. Upstream's helper suite passed 61 of 63 tests under Bun. The two
  failures fake the Graphite `gt` CLI with a shell script, which Bun cannot spawn on Windows.
  Both fail at `0.15.9` too, and the adapter does not gate on `gt`.
- At `0.15.25`, `orch.ts` resolves the stack frontier through `gh`, or `origin` with
  `--forge origin`, instead of `gt`. `poteto-mode` already requires `gh`. `worktree-audit.sh`
  reads PR state through `origin` when it is installed, otherwise `gh`, and reports no PR state
  when neither works. Neither helper has run on Windows at `0.15.25`. `orch.ts` was deleted at
  `0.15.36`.
- At pstack `0.15.9`, `show-me-your-work/scripts/log.sh`, `watch-pr`, and `orch.ts` also ran
  in Git Bash. None of them changed in a way that adds an executable or a path assumption.
- Git for Windows bundles `git`, `curl`, `nproc`, and the POSIX tools the skill bodies call,
  but not `uptime`, so `benchmark-checklist` reports it missing. `gh`, `tailscale`, and `sudo`
  are separate installs on Windows, as on the other platforms.
- The adapter checks out upstream with `core.autocrlf=false`. Git for Windows enables
  `autocrlf` system-wide, which would otherwise rewrite every upstream file to CRLF. A cache
  written before that setting existed is repaired on the next start, or refused with a recovery
  step when it cannot be written. `git archive` follows the same setting, so a certification
  export on Windows needs `-c core.autocrlf=false`. Without it, 155 upstream text files at
  `0.15.23` come out as CRLF and no longer match what Pi loads.

A session that replaces the `bash` tool with `powershell` cannot run the skills.
`/pistack-status` reports it, and `/pistack-check` refuses to clear any workflow.

## Tiers

| tier | meaning |
| --- | --- |
| `native` | adapter-owned content, or a body with no host-specific machinery at all |
| `adapted` | works once the reader applies the host mapping the wrapper links to |
| `dependency-gated` | needs a host capability or an executable that may be absent |
| `experimental` | depends on host behavior with no clean Pi equivalent, may partly work |
| `unsupported` | needs something Pi cannot provide, so the workflow cannot reach its purpose |

## Changing a tier

A tier is a claim about what was verified, so raising one needs evidence, not optimism.

1. Run the workflow end to end in Pi against the certified revision.
2. Record what the workflow produced, not that it started. A `dependency-gated` skill rises to
   `adapted` only when its delegation or question steps completed against a real provider.
3. An `experimental` skill rises only when every Cursor-specific step has a Pi equivalent that
   was exercised, not merely described in the host mapping.
4. An `unsupported` skill rises only when the missing host feature exists in Pi.
5. Add or update a test that fails if the claim regresses.

Lowering a tier needs one reproduction of the failure and a note saying what broke.

## Registry

### native (32)

| upstream skill | Pi skill | capabilities | executables | why |
| --- | --- | --- | --- | --- |
| `bro` | `/skill:pistack-bro` | - | - | - |
| `in-your-own-words` | `/skill:pistack-in-your-own-words` | - | - | - |
| `principle-attack-the-premise` | `/skill:pistack-principle-attack-the-premise` | - | - | - |
| `principle-boundary-discipline` | `/skill:pistack-principle-boundary-discipline` | - | - | - |
| `principle-build-the-lever` | `/skill:pistack-principle-build-the-lever` | - | - | - |
| `principle-encode-lessons-in-structure` | `/skill:pistack-principle-encode-lessons-in-structure` | - | - | - |
| `principle-exhaust-the-design-space` | `/skill:pistack-principle-exhaust-the-design-space` | - | - | - |
| `principle-experience-first` | `/skill:pistack-principle-experience-first` | - | - | - |
| `principle-explain-the-number` | `/skill:pistack-principle-explain-the-number` | - | - | For a performance number it hands off to benchmark-checklist, which needs uptime and nproc. Check that skill first. |
| `principle-fix-root-causes` | `/skill:pistack-principle-fix-root-causes` | - | - | - |
| `principle-foundational-thinking` | `/skill:pistack-principle-foundational-thinking` | - | - | - |
| `principle-guard-the-context-window` | `/skill:pistack-principle-guard-the-context-window` | - | - | - |
| `principle-laziness-protocol` | `/skill:pistack-principle-laziness-protocol` | - | - | - |
| `principle-make-operations-idempotent` | `/skill:pistack-principle-make-operations-idempotent` | - | - | - |
| `principle-migrate-callers-then-delete-legacy-apis` | `/skill:pistack-principle-migrate-callers-then-delete-legacy-apis` | - | - | - |
| `principle-minimize-reader-load` | `/skill:pistack-principle-minimize-reader-load` | - | - | - |
| `principle-model-the-domain` | `/skill:pistack-principle-model-the-domain` | - | - | - |
| `principle-never-block-on-the-human` | `/skill:pistack-principle-never-block-on-the-human` | - | - | - |
| `principle-outcome-oriented-execution` | `/skill:pistack-principle-outcome-oriented-execution` | - | - | - |
| `principle-prove-it-works` | `/skill:pistack-principle-prove-it-works` | - | - | - |
| `principle-redesign-from-first-principles` | `/skill:pistack-principle-redesign-from-first-principles` | - | - | - |
| `principle-separate-before-serializing-shared-state` | `/skill:pistack-principle-separate-before-serializing-shared-state` | - | - | - |
| `principle-sequence-verifiable-units` | `/skill:pistack-principle-sequence-verifiable-units` | - | - | - |
| `principle-subtract-before-you-add` | `/skill:pistack-principle-subtract-before-you-add` | - | - | - |
| `principle-test-behavior-not-implementation` | `/skill:pistack-principle-test-behavior-not-implementation` | - | - | - |
| `principle-type-system-discipline` | `/skill:pistack-principle-type-system-discipline` | - | - | - |
| `setup-pstack` | `/skill:pistack-setup` | - | - | The upstream body only writes a Cursor .mdc rule, so the adapter replaces it with a Pi setup workflow. |
| `sharpen` | `/skill:pistack-sharpen` | - | - | Verified end to end in Pi on Linux at pstack 0.15.36: it handed back four short sections and a rewritten prompt for a vague gateway task, left the decisions that were the user's open, and did not start the task. Since pstack 0.15.29 it hands back a rewritten prompt and does not do the task. Its body is prompt-only, with no tool, delegation, or executable, and it runs only when you type it. |
| `tdd` | `/skill:pistack-tdd` | - | - | - |
| `technical-writing` | `/skill:pistack-technical-writing` | - | - | - |
| `typescript-best-practices` | `/skill:pistack-typescript-best-practices` | - | - | - |
| `unslop` | `/skill:pistack-unslop` | - | - | - |

### adapted (6)

| upstream skill | Pi skill | capabilities | executables | why |
| --- | --- | --- | --- | --- |
| `arena` | `/skill:pistack-arena` | `delegation` | `git` | The whole skill is spawning N candidate subagents plus a judge. Since pstack 0.15.36 the judge must come from a model family other than the parent's. The adapter maps the cross-judge pool to the `arena-cross-judge-pool` panel role, which uses `judgment`, then `general` while unset, so when the parent knows its model, the judge runs only when one of its entries is on another family. The status report and `check` warn when that pool is on one model. Otherwise arena skips the judge, picks the base alone, and says so. When the parent does not know its model, arena tries the pool in order anyway and says the family check did not run. Verified end to end in Pi on Linux at pstack 0.15.36 with pi-subagents: two candidates on the `judgment` and `general` roles, then a judge from the family other than the parent's, which scored them. The parent picked a base, took the fixes for two bugs from the other candidate, fixed a third that both shared, and finished with passing tests. It left the candidate worktrees for comparison. |
| `create-formal-verification-skill` | `/skill:pistack-create-formal-verification-skill` | - | - | Manual invocation only; no delegation. It installs or runs the verification tool it chooses and temporarily breaks product code to prove the check. Generated skills belong under `.pi/skills/` in Pi. Verified on a Windows Node finite-state fixture; other toolchains need their own prerequisites. Since pstack 0.15.32, a generated TLA+ check tells the next agent to read its results with statechart, which has its own prerequisites. |
| `create-verification-skill` | `/skill:pistack-create-verification-skill` | - | - | Only the generated skill's output path needs remapping to Pi's skill directory. |
| `interrogate` | `/skill:pistack-interrogate` | `delegation` | `git` | Multi-model adversarial review is entirely one subagent per configured model. Since pstack 0.15.36 it picks adversaries the way arena picks runners, from the `interrogate reviewers` line, and gives each one its own worktree with the scope's uncommitted changes. Each adversary must prove a finding with a run, and the skill keeps only findings whose command it reruns and sees fail. It reports findings and applies no fixes, but adversaries write and run repro commands, and the skill reruns them, all with your permissions. A worktree is not a sandbox, so read each repro before it reruns, especially on code you do not trust. The rubric, the lead's judgment, and the code-quality lens are gone. Verified end to end in Pi on Linux at pstack 0.15.36 with pi-subagents: two adversaries on the `judgment` and `general` roles, from two model families, each in its own worktree, proved the same two real bugs, and the skill reran both repros before it reported them. It left the adversary worktrees in the temporary folder and named the commands that remove them. |
| `ketchup` | `/skill:pistack-ketchup` | - | - | Read-only. Pi has no `/visualize` skill or image generation, so its visuals are Mermaid diagrams and screenshots that already exist. It checks PR and CI state only for work the chat touched. |
| `show-me-your-work` | `/skill:pistack-show-me-your-work` | `delegation` | - | The mandatory cross-model review of the trail requires spawning a different-family subagent. Verified end to end in Pi on Linux at pstack 0.15.36 with pi-subagents: it kept a decision log the repository ignores, and its reviewer on another model family read the parent's Pi session file and checked each row against it. Its own scripts ran unchanged. |

### dependency-gated (12)

| upstream skill | Pi skill | capabilities | executables | why |
| --- | --- | --- | --- | --- |
| `architect` | `/skill:pistack-architect` | `delegation` | - | Phase B delegates to arena runners, so it cannot run without parallel subagents. |
| `benchmark-checklist` | `/skill:pistack-benchmark-checklist` | - | `uptime`, `nproc` | Its setup step checks load with `uptime` and cores with `nproc`. macOS has no `nproc` without GNU coreutils, and Git Bash on Windows has no `uptime`. |
| `blast-radius` | `/skill:pistack-blast-radius` | - | `git`, `gh` | Needs git and gh to read the diff, commits, and PR before any analysis. |
| `correct` | `/skill:pistack-correct` | - | `git` | Mines commit history, then commits fixes and edits lint, CI, and agent instruction files. Run it on a branch you will review. |
| `figure-it-out` | `/skill:pistack-figure-it-out` | `delegation` | - | Phase B fan-out and the architect/arena routing require parallel subagents. |
| `how` | `/skill:pistack-how` | `delegation` | - | Every path spawns explorer or explainer subagents; nothing runs inline. |
| `maintain-formal-verification-skill` | `/skill:pistack-maintain-formal-verification-skill` | - | `git` | Verified end to end on a Windows Node finite-state fixture at pstack 0.15.28. Manual invocation only; no delegation. It diffs the covered code with git from the verify skill's sync commit, edits only the verification and the verify skill, and temporarily breaks product code to prove an updated check can still fail. In Pi, look for the verify skill under `.pi/skills/`; the verification tool needs its own prerequisites. |
| `maintain-verification-skill` | `/skill:pistack-maintain-verification-skill` | `delegation` | - | Source wave launches one read-only subagent per feature file. |
| `no-comments` | `/skill:pistack-no-comments` | `delegation` | `git` | Step 1 must spawn the comment-sicko agent; the skill only triages its report. |
| `recall` | `/skill:pistack-recall` | `delegation` | `git`, `gh` | Its core corpus is Cursor's on-disk transcript JSONL. The host mapping points it at this workspace's Pi session files instead. Verified end to end in Pi on Linux at pstack 0.15.36: in a fresh session it found the two earlier chats in the folder that holds `$PI_SESSION_FILE`, read their user messages, checked their claims against git and the code, and rebuilt the threads, problems, and next move. With two chats to read, it read them itself, so it did not fan out to subagents, and that step has not run in Pi. A run before the host mapping said to start from `$PI_SESSION_FILE` looked in the default folder instead, which a custom `PI_CODING_AGENT_DIR` had moved, and found nothing. |
| `teach` | `/skill:pistack-teach` | `delegation` | - | It runs the how and why skills, both of which need subagents. |
| `why` | `/skill:pistack-why` | `delegation` | `git`, `gh` | Default posture spawns one investigator subagent per evidence category plus a synthesizer. |

### experimental (7)

| upstream skill | Pi skill | capabilities | executables | why |
| --- | --- | --- | --- | --- |
| `automate-me` | `/skill:pistack-automate-me` | `delegation`, `structured-question` | `git`, `gh` | Its mining step reads this workspace's transcripts. The host mapping points it at this workspace's Pi session files, which use a different format. Verified end to end in Pi on Linux at pstack 0.15.36: it read only this workspace's sessions, told the parent chat from its subagents' files, found no stated preference there, and changed nothing. The built-in create-skill skill it drafts with has no Pi equivalent, and that step has not run in Pi. |
| `ketchup-video` | `/skill:pistack-ketchup-video` | - | - | New in pstack 0.15.32. One end-to-end Pi run on native Windows drew its slides and rendered an mp4 with `ffmpeg` alone, before pstack 0.15.36 added subtitles. Verified end to end in Pi on Linux at pstack 0.15.36: it drew five slides as SVG, rendered a 35-second 1280x720 mp4 with `ffmpeg`, with each subtitle burned into a strip below its slide, and checked frames from the file. Manual invocation only; no delegation or structured question. It follows ketchup, read-only, but shows what happened as a short slide video with no audio, rendered outside the repository, with the waiting calls as text under it. Since pstack 0.15.36 it burns a one-line subtitle into each slide's frames, in a strip below the slide, and measures each slide's hold by matching the rendered frames to the slide. Its body names no renderer, so it needs whatever video tool the session has, such as `ffmpeg`, and Pi has no image generation. Its reply embedded the video as an HTML `video` tag with the file path, and whether a Pi client plays it inline is unverified. When the render fails, it says so in one line and gives only the calls. |
| `poteto-help` | `/skill:pistack-poteto-help` | - | - | Its answers describe Cursor setup, the slash menu, and Custom Modes. A request for work runs poteto-mode, which is experimental. It asks a multiple-choice question only when the need is unclear. Its README and guide links resolve under the status report's plugin directory. |
| `poteto-mode` | `/skill:pistack-poteto-mode` | `delegation`, `structured-question` | `git`, `gh` | Sticky-mode hosting plus references to Cursor built-in and plugin skills only partially map to Pi. Since pstack 0.15.36 the Orchestrate playbook calls no scripts, because the `orch` helpers are gone, and watches PRs through event subscriptions only when the harness has them. Pi has none. Its Project tracker and Project store, and forking a worker with its built state, have no Pi equivalent; the host mapping says what to do instead. Verified end to end in Pi on Linux at pstack 0.15.36 with pi-subagents and a question tool: Orchestrate ran a two-unit program in a linked worktree, with an owner per unit on its own branch and worktree, a verifier from another model family at the owner's head, and local merges. It kept the tracker and store in a folder it added to the exclude file Git resolved for the worktree, and handed state to new agents instead of messaging old ones. Its other playbooks and sticky mode were not rerun. |
| `reflect` | `/skill:pistack-reflect` | `delegation` | - | Its reviewers read the active transcript, and the host mapping points them at the current Pi session file. Verified end to end in Pi on Linux at pstack 0.15.36 with pi-subagents: three reviewers on two model families and a synthesizer read the session file, and the run found a regression the earlier review missed. When told to apply two edits, it copied the upstream skill from the plugin directory to a Pi skill location under a new name and edited only the copy. Its create-skill routing for a new skill is Cursor-specific and has not run in Pi. It never opens a PR or pushes. |
| `statechart` | `/skill:pistack-statechart` | - | `node`, `sh`, `dirname`, `sed` | Lowered from dependency-gated at pstack 0.15.34, because its new scripts crash on native Windows, a certified platform. There, the launcher starts `/bin/sh` by that path to stop TLC's process group, Node cannot start it even when `sh` is on PATH, and with no error handler the run exits 1 with `spawn /bin/sh ENOENT`. It writes no output and leaves an empty hidden staging folder beside the output folder and an empty `statechart-` folder in the temporary folder, so delete those by hand. `/pistack-check` still clears it there, because the gates are found. Use it from Linux, macOS, or WSL. Verified end to end on a Linux checkout fixture at pstack 0.15.34, and again at pstack 0.15.36, where it found the uncapped refill in a token bucket as the shortest path to a broken rule. The Windows end-to-end evidence from pstack 0.15.32 and 0.15.30 describes the scripts it replaced. Manual invocation only; no delegation or structured question. `scripts/statechart` is a POSIX `sh` launcher for TypeScript scripts, and it runs `dirname` and `sed` on every start. It runs the scripts under Node 22.18 to 22.x or Node 23.6 or later, then Bun 1.1.5 or later, then Deno 2.0 or later, and exits with code 127 when none is found. The prerequisite check gates on `node` but cannot check its version. The launcher does: with only an older Node on PATH, it names the versions it needs and exits 127. The command checks a TLA+ spec with TLC and writes `report.md` and TLC output to a new or empty `--out` folder, `SPEC-chart` beside the spec by default, and refuses a folder that is not empty. It also writes `chart.mmd`, except when TLC finds more than 500 states and no rule breaks. It stages its work in a hidden folder beside the output folder and in the system temporary folder, and deletes both. TLC runs from `TLA2TOOLS`, the path to a downloaded `tla2tools.jar`, with the binary in `JAVA` or `java` from PATH. Without `TLA2TOOLS`, it uses TLC 1.7.4 and Java temurin-25 from `mise`, and installs whichever is missing with `mise`, which needs the network. `JAVA` then changes only the binary that runs TLC, and does not skip the `mise` lookup or install of Java. Either `mise` or `TLA2TOOLS` with Java works, so neither is gated, and the script names what is missing when neither is set up. It imports the `--view` module as JavaScript with full process permissions, so review an existing view before you run it. Since pstack 0.15.34 the scripts render no images and do not run `npm`. For an image, the body has the agent install `pele@1.9.0` with `npm` once, outside the repository, which needs `npm` and the network, and render SVG with it. The body does not ask for `--ignore-scripts`, so pass it, and rendering still imports Pele with full process permissions. Run it in a scratch folder outside the repository. Git for Windows bundles `sh`, `dirname`, and `sed`, but not `node`, `mise`, or Java. |
| `swarm` | `/skill:pistack-swarm` | `delegation` | - | Cloud background workers and cloud_base_branch have no Pi mapping; only local fan-out approximates it. |

### unsupported (1)

| upstream skill | Pi skill | capabilities | executables | why |
| --- | --- | --- | --- | --- |
| `make-bot-ui` | `/skill:pistack-make-bot-ui` | - | `curl`, `tailscale`, `sudo` | Built entirely on Cursor Automations webhook routines and the secret-request card. |

## Agents

| upstream agent | Pi agent | notes |
| --- | --- | --- |
| `comment-sicko` | `pistack-comment-sicko` | Upstream names it `comment-sicko` since pstack 0.15.23, so the registered description starts with that name. Needs `git` to scope a diff. |
| `poteto-agent` | `pistack-poteto-agent` | Upstream `is_background: true` has no runtime equivalent; the caller chooses `async: true` on `subagent`, or `mode: "async"` on `delegate_task`. Upstream tells it to search `~/.cursor/plugins/` when its parent gives no path. The adapter puts the generated `pistack-poteto-mode/SKILL.md` path in every agent prompt and forbids that search, which would load content outside the certified revision. |

T3 Code's `delegate_task` has no named agents. Generation writes each agent's prompt to
`adapter/agents/<pi-name>.md`, with skill paths relative to that file. The parent begins the
child's task by telling it to read that file as its system prompt.

Both agents also register through the `pi-subagents:runtime-agent-register:v1` contract. Without an owner for
that event, the status report says so rather than dropping them silently.

## Delegation providers

The `delegation` capability is satisfied by T3 Code's `mcp__t3-code__delegate_task` or by
`pi-subagents`' `subagent`, in the order the `delegation` setting gives, T3 first by default.
A hidden registration does not count. A T3 tool counts only when the extension at
`T3_PI_MCP_EXTENSION_PATH`, the bridge T3 Code launches, registered it, and only when it accepts
`task`, `target`, and `mode`. Status and activation share that resolution, so the report always
names the backend a workflow gets. The adapter activates only that backend. For T3 it also
activates `task_status` and `orchestrator_capabilities` when the bridge registered them.
A delegating wrapper tells the model to read the tool from `/pistack-check` and to use no other,
so a rejected tool that is still in the session is not used. The check also names the companion
tools the model may call, and forbids any companion it could not trace to T3 Code.

An agent prompt file wraps the upstream body in the same markers as a skill wrapper, with host
precedence before and after it. The closing note says that everything after the opening notes is
upstream content, even text that imitates a marker. An upstream skill or agent body that contains
marker text is reported as a warning, with its bytes unchanged. An agent whose Pi name breaks the
skill name rules is skipped with an error, before its name reaches a file name or any generated
text.

Unit tests cover detection, activation order, and the generated instructions for both providers.
No tier changed when T3 support arrived, because no delegating workflow has yet run end to end
through `delegate_task`. That run is the evidence the tier rules above require.

## Skills the adapter replaces

`setup-pstack` writes a Cursor `.mdc` rule, so the adapter substitutes its own body and
publishes it as `/skill:pistack-setup`. Upstream's optional closing offers to run
`create-verification-skill` and `create-formal-verification-skill` are left out of the Pi body;
both skills stay available by name. The upstream skill stays represented, and the
wrapper frontmatter records `pistack-upstream-skill: setup-pstack`.

## Unknown skills

A skill present upstream but absent from the registry is generated as `experimental` and reported
in diagnostics. A skill in the registry but absent upstream is reported as removed. Neither case
is silent.
