pi-pstack-adapter 0.6.0 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -2,6 +2,28 @@
2
2
 
3
3
  All notable changes to this project are documented here. release-please writes new entries from Conventional Commit PR titles.
4
4
 
5
+ ## [0.8.0](https://github.com/elderfo/pi-pstack-adapter/compare/v0.7.0...v0.8.0) (2026-11-01)
6
+
7
+
8
+ ### Features
9
+
10
+ * **host-mapping:** scan for unmapped Cursor terms and port upstream's Claude Code harness lessons ([#27](https://github.com/elderfo/pi-pstack-adapter/issues/27)) ([5a787f0](https://github.com/elderfo/pi-pstack-adapter/commit/5a787f064b61d8cdf3dd100b10bb97c6b1435805))
11
+ * **models:** add upstream's panel roles and warn when a panel runs on one model ([#28](https://github.com/elderfo/pi-pstack-adapter/issues/28)) ([dcf1684](https://github.com/elderfo/pi-pstack-adapter/commit/dcf1684d5c48fe91f433e04da6a4ef315985bbaf))
12
+ * **pstack:** certify pstack 0.15.29 ([#21](https://github.com/elderfo/pi-pstack-adapter/issues/21)) ([5cb1ba9](https://github.com/elderfo/pi-pstack-adapter/commit/5cb1ba96e89c5926b451984ddb53d84dfc3f7ab1))
13
+ * **pstack:** certify pstack 0.15.30 with statechart ([#23](https://github.com/elderfo/pi-pstack-adapter/issues/23)) ([8fc2e93](https://github.com/elderfo/pi-pstack-adapter/commit/8fc2e9370dab422870e3661dd18f8bf4d4a400f5))
14
+ * **pstack:** certify pstack 0.15.32 with ketchup-video ([#24](https://github.com/elderfo/pi-pstack-adapter/issues/24)) ([4272d99](https://github.com/elderfo/pi-pstack-adapter/commit/4272d9998ed7c904b8c5ba57f578dbbb739f07e1))
15
+ * **pstack:** certify pstack 0.15.34, with statechart experimental after a Windows crash ([#25](https://github.com/elderfo/pi-pstack-adapter/issues/25)) ([5c569fe](https://github.com/elderfo/pi-pstack-adapter/commit/5c569fe9330a99fb4a46388e96664a2522b043b3))
16
+ * **pstack:** certify pstack 0.15.36 ([#26](https://github.com/elderfo/pi-pstack-adapter/issues/26)) ([8491d49](https://github.com/elderfo/pi-pstack-adapter/commit/8491d49e9e7f7797a3203515b6c68ea1dec7de4c))
17
+
18
+ ## [0.7.0](https://github.com/elderfo/pi-pstack-adapter/compare/v0.6.0...v0.7.0) (2026-10-19)
19
+
20
+
21
+ ### Features
22
+
23
+ * **pstack:** certify pstack 0.15.26 with create-formal-verification-skill ([#17](https://github.com/elderfo/pi-pstack-adapter/issues/17)) ([82367d9](https://github.com/elderfo/pi-pstack-adapter/commit/82367d93e372fc49c603f56e79469197a77814a2))
24
+ * **pstack:** certify pstack 0.15.28 with maintain-formal-verification-skill ([#20](https://github.com/elderfo/pi-pstack-adapter/issues/20)) ([0dee303](https://github.com/elderfo/pi-pstack-adapter/commit/0dee303dbd349dfd9726ff6e3c17a8d96ecf95a2))
25
+ * **roles:** add a general role and cap delegate thinking at the configured level ([#19](https://github.com/elderfo/pi-pstack-adapter/issues/19)) ([df1db04](https://github.com/elderfo/pi-pstack-adapter/commit/df1db045c49907665b7a2ef504b3ab52da287502))
26
+
5
27
  ## [0.6.0](https://github.com/elderfo/pi-pstack-adapter/compare/v0.5.0...v0.6.0) (2026-10-17)
6
28
 
7
29
 
package/README.md CHANGED
@@ -135,8 +135,10 @@ skill.
135
135
 
136
136
  ## Choose models for pstack roles
137
137
 
138
- pstack assigns work to named model roles such as `feature`, `bug-fix`, and `judgment`. A role you
139
- leave unset uses the current Pi session model.
138
+ pstack assigns work to named model roles such as `feature`, `bug-fix`, and `judgment`. The
139
+ `general` role covers every other delegate, such as explorers, swarm workers, and ad-hoc helpers.
140
+ A role you leave unset uses `general`, and uses the model of the agent that starts it only when
141
+ `general` is unset too.
140
142
 
141
143
  To list the models in your Pi installation and assign them to roles, run the setup skill:
142
144
 
@@ -157,11 +159,27 @@ Add a thinking level to a role with a `:level` suffix. The levels are `off`, `mi
157
159
  PISTACK_MODELS='feature=provider/model:medium,judgment=provider/other-model:high' pi
158
160
  ```
159
161
 
162
+ Panels such as `arena`'s runners and judge, `architect`'s runners, and `interrogate`'s adversaries
163
+ use the panel roles `arena-runners`, `arena-cross-judge-pool`, `architect-runners`, and
164
+ `interrogate-reviewers`. A panel holds a list of models, one seat each, separated by spaces.
165
+ An `inherit` entry uses the model and thinking of the agent that starts the panel, which is
166
+ your session unless a delegate runs the workflow:
167
+
168
+ ```bash
169
+ PISTACK_MODELS='arena-runners=provider/model:high other-provider/other-model:high' pi
170
+ ```
171
+
172
+ Upstream pstack defaults each panel to two model families. A panel you leave unset uses
173
+ `judgment`, then `general`, so it covers two families only when those roles do. The status
174
+ report warns when a panel's seats all run on one model.
175
+
160
176
  Role names are lowercase letters, digits, and hyphens. A model value is printable ASCII with no spaces or markup characters, at most 128 characters. A config entry that breaks these rules stops the adapter at startup with an error that names the file, so fix the key there and restart Pi.
161
177
 
162
- A role without a level passes none, so the delegation backend applies its own default. A role you leave unset inherits the
163
- session model and the session thinking level, so a session at high thinking makes every
164
- inheriting delegate expensive. The `pstack_adapter` tool's `set_model` action takes the same
178
+ A role without a level passes none, so the delegation backend applies its own default. A role's
179
+ level is a ceiling: a delegate may lower it for routine work but never raises it. A role you leave
180
+ unset, with `general` unset too, inherits the model and thinking level of the agent that starts
181
+ it. A `strongest-judgment` delegate at `xhigh` would then start every helper at `xhigh`, so set
182
+ `general` to keep helpers at a cheaper level. The `pstack_adapter` tool's `set_model` action takes the same
165
183
  level in its `thinking` parameter. A level the model does not offer is clamped by Pi at run time.
166
184
 
167
185
  ## Run Pi noninteractively
@@ -202,7 +220,7 @@ settings to `.pi/pi-pstack-adapter.json`. Environment variables override both fi
202
220
  | `PISTACK_UPSTREAM_PLUGIN_PATH` | Selects the plugin directory inside the checkout. |
203
221
  | `PISTACK_ALLOW_BOOTSTRAP` | Allows a noninteractive first download. |
204
222
  | `PISTACK_CACHE_DIR` | Changes the cache directory. |
205
- | `PISTACK_MODELS` | Assigns models as comma-separated `role=provider/model[:thinking]` pairs. |
223
+ | `PISTACK_MODELS` | Assigns models as comma-separated `role=provider/model[:thinking]` pairs. A panel role takes its entries separated by spaces. |
206
224
  | `PISTACK_DELEGATION` | Sets the delegation provider to try first: `t3` (default) or `pi-subagents`. The config file key is `delegation`. |
207
225
 
208
226
  ## Security and trust
package/VERSION CHANGED
@@ -1 +1 @@
1
- 0.6.0
1
+ 0.8.0
@@ -9,8 +9,9 @@ Three things are configurable. Model roles, the upstream source, and the delegat
9
9
  ## Model roles
10
10
 
11
11
  pstack skills name a model per role. In Pi those names mean nothing, so each role maps to a
12
- model in your own catalogue. A role you never configure inherits the parent session model,
13
- which is a working default, not a failure.
12
+ model in your own catalogue. A role you never configure uses the `general` role. When `general` is
13
+ unconfigured too, the role inherits the model of whichever agent starts it, which is a working
14
+ default, not a failure.
14
15
 
15
16
  Roles used by pstack workflows.
16
17
 
@@ -23,6 +24,27 @@ Roles used by pstack workflows.
23
24
  | `hillclimb` | sustained metric improvement |
24
25
  | `judgment` | prose, review, and judgment delegates |
25
26
  | `strongest-judgment` | the hardest cross-cutting changes |
27
+ | `general` | every other delegate: explorers, investigators, swarm and verification workers, ad-hoc helpers, and any unconfigured role |
28
+
29
+ Upstream also has panel lines, which hold a list of models with one seat per entry. The adapter
30
+ keeps them as panel roles.
31
+
32
+ | panel role | used by |
33
+ | --- | --- |
34
+ | `arena-runners` | `arena`'s candidates |
35
+ | `arena-cross-judge-pool` | `arena`'s one judge, which `architect` uses too |
36
+ | `architect-runners` | `architect`'s design candidates |
37
+ | `interrogate-reviewers` | `interrogate`'s adversaries |
38
+
39
+ Upstream defaults each panel to two model families, one Claude model and one Grok model. A panel
40
+ left unset uses `judgment`, then `general`, so it spans two families only when those roles do.
41
+ `arena` takes its judge from the pool only when the model is from a family other than the
42
+ session's model, so a pool on the session's family skips the judge. The status report warns when
43
+ a panel's seats all land on one model.
44
+
45
+ A panel value lists entries in order. An entry is a model id, optionally with a thinking level,
46
+ or `inherit` for the model and thinking of the agent that starts the panel, which is the
47
+ session unless a delegate runs the workflow. An `inherit` entry never judges.
26
48
 
27
49
  The status report lists the same roles, so read it back rather than trusting this table if the
28
50
  adapter has been upgraded.
@@ -30,9 +52,11 @@ adapter has been upgraded.
30
52
  Each role also has a thinking level: `off`, `minimal`, `low`, `medium`, `high`, `xhigh`, or
31
53
  `max`. Upstream pstack calls this a reasoning budget and encodes it in the model slug. A role with
32
54
  no thinking level passes none, so the delegation backend applies its own default. A role left on
33
- `inherit` uses the parent session's model and thinking level, so a parent at high thinking makes
34
- every inheriting child expensive. Model choice often affects cost more than thinking level does,
35
- so consider a cheaper model for the bulk roles as well.
55
+ `inherit` with `general` also on `inherit` uses the model and thinking level of the agent that
56
+ starts it. A `strongest-judgment` delegate at `xhigh` would then start every helper at `xhigh`, so
57
+ configure `general` to stop that. A role's level is a ceiling: delegates may lower it for routine
58
+ work, but never raise it. Model choice often affects cost more than thinking level does, so
59
+ consider a cheaper model for the bulk roles as well.
36
60
 
37
61
  Steps.
38
62
 
@@ -45,10 +69,10 @@ Steps.
45
69
  role is on `inherit`. It applies to every role that got a model in step 2. A role on
46
70
  `inherit` cannot have a level, so tell the user that and say that those roles follow the
47
71
  parent session's level. Ask one single-select question first. Put the whole choice in each option
48
- title so the user can pick without opening anything else, for example "Balanced: code roles
72
+ title so the user can pick without opening anything else, for example "Balanced: code and general roles
49
73
  medium, judgment high, strongest-judgment xhigh (suggested)".
50
74
 
51
- | choice | code roles (`feature`, `refactoring`, `bug-fix`, `perf-issue`, `hillclimb`) | `judgment` | `strongest-judgment` |
75
+ | choice | code and general roles (`feature`, `refactoring`, `bug-fix`, `perf-issue`, `hillclimb`, `general`) | `judgment` | `strongest-judgment` |
52
76
  | --- | --- | --- | --- |
53
77
  | Balanced (suggest this first) | `medium` | `high` | `xhigh` |
54
78
  | Low cost | `low` | `medium` | `high` |
@@ -58,7 +82,7 @@ Steps.
58
82
 
59
83
  These are starting points, not measurements. They keep the heaviest reasoning on the roles
60
84
  that make the hardest calls. Offer Custom for a user who wants different levels. Ask once for
61
- the code roles, once for `judgment`, and once for `strongest-judgment`. Ask a role on its own
85
+ the code and general roles, once for `judgment`, and once for `strongest-judgment`. Ask a role on its own
62
86
  only when the user says it should differ from its group. Backend default passes no level and
63
87
  leaves the choice to the delegation backend. A Custom user who wants thinking disabled picks
64
88
  `off`.
@@ -69,12 +93,21 @@ Steps.
69
93
  `provider/model` id, and `thinking` when step 3 picked a level. Pass `scope: "project"` when
70
94
  the user wants the choice to apply only to this repository. Calling `set_model` for a role
71
95
  again without `thinking` clears a level set earlier, so always pass it again.
72
- 5. Read back `action: "status"` and show the user what was written, including the thinking
73
- column.
96
+ 5. Set the panels. Read the `panel roles` table of `action: "status"` and show the user each
97
+ panel's seats. When a panel's seats share one model, or one family, say so and suggest two
98
+ families from step 1, as upstream's defaults do. Never say a family is missing unless the
99
+ step 1 list shows it. Ask whether to keep each panel or set it. For each panel the user sets,
100
+ call `set_model` with the panel role and its entries in `model`, separated by commas, for
101
+ example `model: "provider/model-a, provider/model-b"`. Pass `thinking` for the level of the
102
+ `judgment` column in step 3, unless the user picked another. An entry with its own `:level`
103
+ keeps it. Pass `model: "inherit"` to unset a panel.
104
+ 6. Read back `action: "status"` and show the user what was written, including the thinking
105
+ column and the panel roles.
74
106
 
75
107
  For a scripted environment, set `PISTACK_MODELS` instead, for example
76
108
  `PISTACK_MODELS=feature=anthropic/claude-sonnet-4-5:medium,bug-fix=openai/gpt-5:high`. The
77
- optional `:level` suffix sets the thinking level. The environment wins
109
+ optional `:level` suffix sets the thinking level. A panel's entries are separated by spaces, as
110
+ in `PISTACK_MODELS='arena-runners=anthropic/claude-sonnet-4-5:high openai/gpt-5:high'`. The environment wins
78
111
  over both config files, so CI never needs this dialog.
79
112
 
80
113
  ## Upstream source
@@ -4,7 +4,7 @@ The compatibility registry in `src/registry.ts` assigns one support tier to ever
4
4
  certified pstack revision. Generation reads it, the wrapper frontmatter publishes it, and
5
5
  `/pistack-status` reports it.
6
6
 
7
- Certified revision: pstack `0.15.25` at `101b274dd991f694e1f7024be2157e5f3adf07de` in
7
+ Certified revision: pstack `0.15.36` at `c742dd61706fbacc1b95f1a20b7b988cf096ce6c` in
8
8
  `https://github.com/cursor/plugins`.
9
9
 
10
10
  ## Platforms
@@ -21,17 +21,230 @@ executables in the shell the skills run in, with Pi's `shellCommandPrefix` appli
21
21
  that matters most, because Git Bash adds `/usr/bin` and `/mingw64/bin` to the `PATH` Pi
22
22
  started with. A shell that is missing, inactive, or cannot run a command blocks every workflow.
23
23
 
24
- Windows evidence was last gathered at pstack `0.15.23`, on Windows 11 with Git for Windows 2.53,
25
- Node 22, Bun 1.3, and Pi 1.2.0. CI runs the unit suite on Windows at `0.15.25`; the rest of this
26
- list has not been rerun there:
27
-
28
- - The unit suite and the type check pass. `npm run test:isolated` passes from Git Bash: Pi
29
- registers all 54 skills, and a later run reuses the cache without the network. CI runs the
30
- unit suite on Windows for every change.
31
- - The certification probe passes on an LF export of the tree: no diagnostics, 52 bodies
32
- byte-identical, and none mismatched. The adapter's cache checkout matches that export byte for
33
- byte.
34
- - `in-your-own-words`, `ketchup`, and `poteto-help` ran end to end in the isolated install, with
24
+ pstack `0.15.36` was certified on Linux. No skill or agent was added or removed. The skills
25
+ changed only in text, and the Orchestrate playbook's `orch` scripts were deleted; no adapter
26
+ gate named them. `0.15.36` has not been checked on native Windows. The statechart scripts did
27
+ not change, so the `0.15.34` Windows findings below still describe them.
28
+
29
+ Ten skills then ran end to end in two isolated installs built from the packed package, on
30
+ Pi 1.4.0 with the CLIProxyAPI provider extension. The parent model was Claude Opus 5.5, with the
31
+ `judgment` role on Claude and the `general` role on GPT 6.1. One install had no delegation or
32
+ question tool. The other added pi-subagents 0.83.0, and later pi-ask-user 0.17.0, as Pi
33
+ packages, so their children loaded the same provider. Each skill ran in a throwaway copy of a
34
+ small Git repository holding a token-bucket rate limiter with two marked bugs.
35
+
36
+ - Without delegation, `sharpen` handed back a rewritten prompt and did not do the task, so it
37
+ rises to `native`. `statechart` found the uncapped refill as the shortest path to a broken
38
+ rule. With only an older Node on PATH, its launcher named the versions it needs and exited
39
+ 127. `ketchup-video` drew five slides and rendered a subtitled 35-second mp4 with `ffmpeg`.
40
+ - With pi-subagents, `interrogate`, `arena`, and `show-me-your-work` completed every delegation
41
+ step against a real provider, on two model families, so each rises to `adapted`.
42
+ `interrogate`'s two adversaries proved the same two bugs in their own worktrees. `arena`'s
43
+ judge came from the family other than the parent's. `show-me-your-work`'s reviewer read the
44
+ parent's Pi session file.
45
+ - The transcript mapping held. `recall`, `reflect`, `automate-me`, and the `show-me-your-work`
46
+ reviewer read this workspace's Pi session files and nothing else in the session folder.
47
+ `recall` rises to `dependency-gated`, because the transcript was its only Cursor-specific
48
+ step. In a fresh session it read the two earlier chats itself, so its fan-out did not run. An
49
+ earlier fresh run looked in the default session folder, which the sandbox had moved, so the
50
+ host mapping now says to find the folder from `$PI_SESSION_FILE` first. `reflect` copied the upstream skill
51
+ to a Pi skill location before editing it, but its create-skill route did not run, and
52
+ `automate-me` found nothing to draft, so both stay `experimental`.
53
+ - `poteto-mode`'s Orchestrate playbook ran a two-unit program in a linked worktree. Each unit had
54
+ an owner on its own branch and worktree, and a verifier from another model family checked the
55
+ owner's head before a new agent merged it. The tracker and store went in a folder it added to
56
+ the exclude file that `git rev-parse --git-path info/exclude` names, which lives in the main
57
+ repository's Git directory. That run led to the host mapping rule that a substitute is not a
58
+ skip. `poteto-mode` stays `experimental`: its other playbooks and sticky mode were not rerun.
59
+ - `ketchup-video` stays `experimental`, because whether a Pi client plays its embedded video is
60
+ still unverified.
61
+ - Upstream does not name a `/goal` command at `0.15.36`. Its `/loop` now has a host mapping row,
62
+ and the vocabulary scan finds it.
63
+
64
+ pstack `0.15.34` was certified on Linux, then checked on native Windows 11 (build 26200) with
65
+ Git for Windows, Node 22.23.2, and mise, over SSH from Git Bash. On Windows:
66
+
67
+ - The type check passes. The unit suite runs 189 tests: 186 pass, none fail, and 3 skip. All ten
68
+ integration tests pass with no skips. The probe on an LF export of the certified commit
69
+ matches Linux: 59 skills, two agents, no diagnostics, 57 bodies byte-identical, `setup-pstack`
70
+ replaced, and none mismatched.
71
+ - The isolated install passes with the CLIProxyAPI scratch copy described below: 59 skills, no
72
+ `subagent` or `ask_user` with the provider extension loaded, and cache reuse without bootstrap
73
+ permission. `/pistack-check pistack-statechart` clears.
74
+ - The `0.15.34` statechart scripts crash. On upstream's own `MediaPlayer` corpus model, the
75
+ launcher exits 1 with an unhandled `spawn /bin/sh ENOENT`, before TLC runs. It writes no
76
+ output folder and leaves an empty hidden staging folder beside it and an empty `statechart-`
77
+ folder in the temporary folder. No worker or TLC process is left running. This reproduction
78
+ lowers `statechart` to `experimental`.
79
+
80
+ The Windows statechart findings further below describe the `0.15.32` scripts. The other skills
81
+ that changed in `0.15.34` changed only in text. Linux evidence for the `0.15.34` statechart
82
+ scripts, gathered on Node 26.12.1, Bun, Deno 2.9.8, and mise 2026.10.17:
83
+
84
+ - `/pistack-check pistack-statechart` clears in the isolated install, and `statechart` ran there
85
+ against a checkout fixture whose 5-second timeout shows "Try again" while the first charge is
86
+ still in flight. From the code, it wrote a TLA+ model and a `--view` module. TLC found the rule
87
+ "the shopper is never charged twice for one cart" broken (21 model states), and the report gave
88
+ the five-step path. A replay test drove the real module with a fake gateway and clock and
89
+ reproduced two charges, and the regenerate command rebuilt the same chart into a fresh folder.
90
+ The fixture repository stayed clean.
91
+ - A cold run installed TLC 1.7.4 and Java temurin-25 with `mise`. The `TLA2TOOLS` path, with
92
+ `JAVA` set and with `java` from PATH, gave the same report and chart. The scripts also ran
93
+ under Bun and Deno. A rerun into a folder that is not empty exits 2 and writes nothing.
94
+ - Upstream's own suite passes on Linux with `TLA2TOOLS` set: 367 tests, none failed or skipped.
95
+ - `pele@1.9.0`, installed with `--ignore-scripts`, rendered the fixture's `chart.mmd` to SVG with
96
+ the options that `references/render.md` gives.
97
+
98
+ Earlier Windows evidence, gathered at pstack `0.15.32` on Windows 11 Pro with Git for Windows
99
+ 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
100
+ PATH and `TLA2TOOLS` was unset, so statechart took the `mise` path:
101
+
102
+ - The type check and unit suite pass: 189 tests, 185 passed, none failed, and the four symlink
103
+ tests skipped. All ten integration tests pass with no skips, including the Windows 8.3
104
+ short-path case and the `plugins/cache/` host-mapping regression.
105
+ - The probe on an LF export of the certified commit reports 59 skills, two agents, no
106
+ diagnostics, 57 bodies byte-identical, `setup-pstack` replaced, and none mismatched. That
107
+ matches the Linux probe.
108
+ - The isolated install passes from Git Bash with the CLIProxyAPI scratch copy described below:
109
+ 59 skills, no `subagent` or `ask_user` with the provider extension loaded, and cache reuse
110
+ without bootstrap permission. `/pistack-check` clears `pistack-statechart`, with `node` and
111
+ `npm` on PATH, and `pistack-ketchup-video`.
112
+ - The 0.15.32 statechart scripts run on native Windows from a cold machine. `from-chart` on
113
+ upstream's own `upload.mmd` with `--png` installed `pele` and `@resvg/resvg-js` with `npm`
114
+ under `~/.cache/statechart/`, installed TLC 1.7.4 and Java temurin-25 with `mise`, drew the
115
+ chart back unchanged, and rendered the PNG. The `npx` defect from `0.15.30` is gone. A rerun
116
+ into the same `--out` folder still fails with `EPERM` and exit code 2. It leaves the old folder
117
+ unchanged, and it names the temporary folder that holds the new files.
118
+ - `statechart` ran in the isolated install against a checkout fixture whose 5-second timeout
119
+ shows "Try again" while the first charge is still in flight. From the code, it wrote a TLA+
120
+ model and a mapping. TLC found the rule "The customer is charged at most once for one cart"
121
+ broken, and also found that a declined charge leaves the screen on "Paying" (19 model states
122
+ and 33 steps, drawn as 10 chart states and 15 arrows). The PNGs rendered through `--png` with
123
+ no workaround, and the numbered five-step double-charge path read correctly. A replay test
124
+ drove the real module with a fake gateway and clock and reproduced both bugs, and the
125
+ regenerate script it wrote rebuilt every chart into a fresh folder. The fixture repository
126
+ stayed clean. This supports `dependency-gated` for the 0.15.32 scripts.
127
+ - Upstream's own `scripts/test/statechart.test.mjs` still does not pass on Windows. Of its 150
128
+ tests, the first 126 ran: 99 pass, 3 skip for missing fonts, and 24 fail. The 127th, which
129
+ kills a run during TLC, waits for TLC to write into `TMPDIR`, which Node ignores on Windows,
130
+ and hangs. The remaining tests were not run. Ten failures are the `EPERM` rename. Six fake
131
+ `mise` with a shell script, which Windows cannot start. Five expect the temporary folder that
132
+ `TMPDIR` names, and three expect `/` in paths that Windows prints with `\`.
133
+ - `ketchup-video` ran in the isolated install after a session that fixed a pricing bug and
134
+ committed the fix. It drew four slides with `ffmpeg` and the Windows Arial font, rendered a
135
+ 16-second 1280x720 mp4 outside the repository, and left the repository unchanged. The slides
136
+ read correctly. Its reply embedded the video as an HTML `video` tag. Whether a Pi client plays
137
+ it inline was not checked, so the skill stays `experimental`.
138
+
139
+ Earlier Windows evidence, gathered at pstack `0.15.30` on Windows 11 Pro with Git for Windows
140
+ 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
141
+ `tla2tools.jar`. Its statechart findings describe the scripts that `0.15.32` replaced:
142
+
143
+ - The type check and unit suite pass: 187 tests, 183 passed, none failed, and the four symlink
144
+ tests skipped. All nine integration tests pass with no skips, including the Windows 8.3
145
+ short-path case and the statechart wrapper regression with its nested support files.
146
+ - The isolated install passes from Git Bash with the CLIProxyAPI scratch copy described below:
147
+ 58 skills, no `subagent` or `ask_user` with the provider extension loaded, and cache reuse
148
+ without bootstrap permission. The installed checkout's 184 files match an LF export of the
149
+ pinned tree byte for byte. The probe reports 58 skills, two agents, no diagnostics, 56 bodies
150
+ byte-identical, `setup-pstack` replaced, and none mismatched. The 11 statechart support files
151
+ sit beside the generated wrapper and match upstream.
152
+ - The installed status report shows `tested` trust at the certified commit. `/pistack-check`
153
+ ran for all 58 skills. Each delegating skill names the missing `delegation` capability,
154
+ `benchmark-checklist` still names `uptime`, and every other skill clears.
155
+ `/pistack-check pistack-statechart` names `java` until a JDK is on PATH, then clears.
156
+ Git Bash rewrites a leading `/` in a `pi -p` argument into a Windows path, so pass
157
+ `MSYS2_ARG_CONV_EXCL='/pistack;/skill'` when scripting these commands.
158
+ - `statechart` ran in the isolated install against a checkout fixture whose 5-second timeout
159
+ shows "Try again" while the first charge is still in flight. From the code, it wrote a TLA+
160
+ model and a mapping, and TLC found the rule "A customer is never charged twice for one cart"
161
+ broken (20 model states, 9 chart states). It rendered both charts to PNG, and the numbered
162
+ five-step bug path read correctly. A replay script drove the real module with a fake gateway
163
+ and clock and reproduced two charges. The fixture repository stayed clean. Two upstream
164
+ defects needed workarounds. `--png` calls `spawnSync("npx")`, which cannot start `npx.cmd`
165
+ on Windows, so the PNGs were rendered by running `npx` directly. Renaming a directory onto an
166
+ existing one fails with `EPERM` on Windows, not `ENOTEMPTY` or `EEXIST`, so every rerun
167
+ into an existing output folder fails and leaves it unchanged until the folder is deleted.
168
+ This supports `dependency-gated` with those workarounds in its note.
169
+ - Upstream's own `scripts/test/statechart.test.mjs` does not pass on Windows: of 58 tests, 41
170
+ pass, 2 skip, 12 fail, and 3 hang. The two defects above cause eight failures. Three expect
171
+ `/` in paths that Windows prints with `\`, and one of those also sets `TMPDIR`, which Node
172
+ ignores on Windows. One runs a fake `java` shell script, which Windows cannot start. The three
173
+ hangs wait for TLC to write into `TMPDIR`, which Node ignores on Windows, so they never see
174
+ it start.
175
+ - `poteto-help` routed a request to show a PM a double-charge path to
176
+ `/skill:pistack-statechart`. It named the `pistack-` prefix and listed the missing `java` and
177
+ `TLA2TOOLS` prerequisites.
178
+
179
+ Earlier Windows evidence, gathered at pstack `0.15.28` with the same toolchain:
180
+
181
+ - The type check and unit suite pass: 183 tests, 179 passed, none failed, and the four symlink
182
+ tests skipped. All eight integration tests pass with no skips, including the Windows 8.3
183
+ short-path case and both formal-verification wrapper regressions.
184
+ - The isolated install passes from Git Bash with the same CLIProxyAPI scratch copy as below: 57
185
+ skills, no `subagent` or `ask_user` with the provider extension loaded, and cache reuse without
186
+ bootstrap permission. The installed checkout's 172 files match an LF export of the pinned tree
187
+ byte for byte. The probe reports 57 skills, two agents, no diagnostics, 55 bodies
188
+ byte-identical, `setup-pstack` replaced, and none mismatched.
189
+ - The installed status report shows `tested` trust at the certified commit, and
190
+ `/pistack-check pistack-maintain-formal-verification-skill` clears the workflow. `git` is
191
+ its only executable, and Git for Windows bundles it.
192
+ - `maintain-formal-verification-skill` ran in the isolated install against a fixture whose
193
+ `.pi/skills/` verify skill recorded a sync commit, followed by a rename of a covered function
194
+ and a new batch function that wrote the guarded state without its duplicate-ID guard. It
195
+ found the skill, ran the stale check (it crashed on the rename), read all three commits since
196
+ the sync commit, renamed the call, extended the harness to the new function, and reported the
197
+ bug with the commit that introduced it and a two-step counterexample. It proved the updated
198
+ check could pass and fail by temporarily fixing and then breaking the product file, restored
199
+ it, moved the sync commit, and committed only the verification and verify-skill changes.
200
+ This supports `dependency-gated` on `git`.
201
+ - The changed `create-formal-verification-skill` reran in the isolated install. It generated
202
+ `.pi/skills/verify-inventory-ledger/SKILL.md` with the coverage record and sync commit new in
203
+ `0.15.28`, plus a dependency-free Node verifier over the real functions (28 states, 168 calls).
204
+ The check caught six deliberate breaks, and the product file's content was unchanged after
205
+ each restore. `adapted` still holds.
206
+
207
+ Earlier Windows evidence, gathered at pstack `0.15.26` with the same toolchain:
208
+
209
+ - The type check and unit suite pass: 173 tests passed, none failed, and four symlink tests
210
+ skipped because Windows requires Developer Mode or administrator rights. The seven scheduled
211
+ integration tests pass with no skips: six cache-containment cases, including a Windows 8.3
212
+ short-path case, and a formal-verification wrapper regression.
213
+ Run these separately with `npm run test:integration`; their CI lane is daily and manually
214
+ dispatchable, not per PR. The existing unit-suite CI matrix still covers all three platforms.
215
+ - The isolated install passes from Git Bash: the cold run registers no skills without bootstrap
216
+ permission, the permitted run registers all 56 skills, and a later run reuses the cache
217
+ without bootstrap permission. The local CLIProxyAPI provider requires its extension, config,
218
+ and model catalog in the sandbox; a scratch copy of the install script supplies them. Its
219
+ tool probe still reports no `subagent` or `ask_user`. Sandbox credentials are removed on exit.
220
+ - The certification probe passes on an LF export of the pinned tree: 56 skills, two agents,
221
+ no diagnostics, 54 bodies byte-identical, `setup-pstack` replaced, and none mismatched.
222
+ All 171 files in the isolated installed cache match the LF export byte for byte.
223
+ - `create-formal-verification-skill` completed in the isolated install without `subagent` or
224
+ `ask_user`. It generated `.pi/skills/verify-inventory-reservations/SKILL.md` and a dependency-free
225
+ Node 22 explicit-state verifier that imports the fixture's actual reserve/release functions.
226
+ It checked 49 reachable states and 490 transitions for stock 0–3 and five request IDs, caught
227
+ six mutant copies, then caught a removed retry guard in the actual product file. Restoring
228
+ that file restored the passing result and its original hash. This supports `adapted`: the
229
+ generated skill path is mapped to Pi. It does not certify TLA+, proof assistants, installation
230
+ of other verifiers, unbounded inputs, or real database/async concurrency.
231
+ - The revised `ketchup` ran read-only in a separate fixture. It listed both supplied product
232
+ choices (CSV versus JSON and seven versus thirty days of history), drew a Mermaid sequence
233
+ diagram for a late-retry edge case it reproduced, and left the fixture unchanged. It did not
234
+ contact GitHub for this fixture-only task.
235
+ - Installed status reports show native Windows plugin and generated-skill paths and `tested`
236
+ trust at the certified commit. `/pistack-check` clears the formal-verification workflow and
237
+ `ketchup`, but still names `uptime` as missing for `benchmark-checklist`. Delegation and
238
+ structured questions remain unavailable in the isolated install; no delegating tier changed.
239
+ - A cache inside a Git worktree must own its worktree, Git directory, and common directory before
240
+ bootstrap or reuse can change Git state. The Windows run exposed ancestor discovery from an
241
+ empty nested cache; this is fixed. Regressions also cover incomplete metadata, a foreign Git
242
+ file, foreign worktree/common directory settings, and short paths, while checking that the
243
+ enclosing repository's HEAD, config, index, and tracked bytes stay unchanged.
244
+
245
+ Historical coverage below has not been rerun at `0.15.26` unless stated otherwise:
246
+
247
+ - At `0.15.23`, `in-your-own-words`, `ketchup`, and `poteto-help` ran end to end in the isolated install, with
35
248
  no `subagent` or `ask_user` tool. `ketchup` reported a commit and a pending decision with
36
249
  Mermaid diagrams and changed nothing. `poteto-help` answered with `/pistack-mode on` and read
37
250
  the guide from the `plugin directory` row, whose Windows path it resolved.
@@ -45,7 +258,8 @@ list has not been rerun there:
45
258
  - At `0.15.25`, `orch.ts` resolves the stack frontier through `gh`, or `origin` with
46
259
  `--forge origin`, instead of `gt`. `poteto-mode` already requires `gh`. `worktree-audit.sh`
47
260
  reads PR state through `origin` when it is installed, otherwise `gh`, and reports no PR state
48
- when neither works. Neither helper has run on Windows at `0.15.25`.
261
+ when neither works. Neither helper has run on Windows at `0.15.25`. `orch.ts` was deleted at
262
+ `0.15.36`.
49
263
  - At pstack `0.15.9`, `show-me-your-work/scripts/log.sh`, `watch-pr`, and `orch.ts` also ran
50
264
  in Git Bash. None of them changed in a way that adds an executable or a path assumption.
51
265
  - Git for Windows bundles `git`, `curl`, `nproc`, and the POSIX tools the skill bodies call,
@@ -87,7 +301,7 @@ Lowering a tier needs one reproduction of the failure and a note saying what bro
87
301
 
88
302
  ## Registry
89
303
 
90
- ### native (31)
304
+ ### native (32)
91
305
 
92
306
  | upstream skill | Pi skill | capabilities | executables | why |
93
307
  | --- | --- | --- | --- | --- |
@@ -118,33 +332,37 @@ Lowering a tier needs one reproduction of the failure and a note saying what bro
118
332
  | `principle-test-behavior-not-implementation` | `/skill:pistack-principle-test-behavior-not-implementation` | - | - | - |
119
333
  | `principle-type-system-discipline` | `/skill:pistack-principle-type-system-discipline` | - | - | - |
120
334
  | `setup-pstack` | `/skill:pistack-setup` | - | - | The upstream body only writes a Cursor .mdc rule, so the adapter replaces it with a Pi setup workflow. |
335
+ | `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. |
121
336
  | `tdd` | `/skill:pistack-tdd` | - | - | - |
122
337
  | `technical-writing` | `/skill:pistack-technical-writing` | - | - | - |
123
338
  | `typescript-best-practices` | `/skill:pistack-typescript-best-practices` | - | - | - |
124
339
  | `unslop` | `/skill:pistack-unslop` | - | - | - |
125
340
 
126
- ### adapted (2)
341
+ ### adapted (6)
127
342
 
128
343
  | upstream skill | Pi skill | capabilities | executables | why |
129
344
  | --- | --- | --- | --- | --- |
345
+ | `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. |
346
+ | `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. |
130
347
  | `create-verification-skill` | `/skill:pistack-create-verification-skill` | - | - | Only the generated skill's output path needs remapping to Pi's skill directory. |
348
+ | `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. |
131
349
  | `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. |
350
+ | `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. |
132
351
 
133
- ### dependency-gated (13)
352
+ ### dependency-gated (12)
134
353
 
135
354
  | upstream skill | Pi skill | capabilities | executables | why |
136
355
  | --- | --- | --- | --- | --- |
137
356
  | `architect` | `/skill:pistack-architect` | `delegation` | - | Phase B delegates to arena runners, so it cannot run without parallel subagents. |
138
- | `arena` | `/skill:pistack-arena` | `delegation` | `git` | The whole skill is spawning N candidate subagents plus a judge. |
139
357
  | `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`. |
140
358
  | `blast-radius` | `/skill:pistack-blast-radius` | - | `git`, `gh` | Needs git and gh to read the diff, commits, and PR before any analysis. |
141
359
  | `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. |
142
360
  | `figure-it-out` | `/skill:pistack-figure-it-out` | `delegation` | - | Phase B fan-out and the architect/arena routing require parallel subagents. |
143
361
  | `how` | `/skill:pistack-how` | `delegation` | - | Every path spawns explorer or explainer subagents; nothing runs inline. |
144
- | `interrogate` | `/skill:pistack-interrogate` | `delegation` | `git` | Multi-model adversarial review is entirely one subagent per configured model. |
362
+ | `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. |
145
363
  | `maintain-verification-skill` | `/skill:pistack-maintain-verification-skill` | `delegation` | - | Source wave launches one read-only subagent per feature file. |
146
364
  | `no-comments` | `/skill:pistack-no-comments` | `delegation` | `git` | Step 1 must spawn the comment-sicko agent; the skill only triages its report. |
147
- | `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. |
365
+ | `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. |
148
366
  | `teach` | `/skill:pistack-teach` | `delegation` | - | It runs the how and why skills, both of which need subagents. |
149
367
  | `why` | `/skill:pistack-why` | `delegation` | `git`, `gh` | Default posture spawns one investigator subagent per evidence category plus a synthesizer. |
150
368
 
@@ -152,12 +370,12 @@ Lowering a tier needs one reproduction of the failure and a note saying what bro
152
370
 
153
371
  | upstream skill | Pi skill | capabilities | executables | why |
154
372
  | --- | --- | --- | --- | --- |
155
- | `automate-me` | `/skill:pistack-automate-me` | `delegation`, `structured-question` | `git`, `gh` | Mining step depends on Cursor transcript files and the built-in create-skill skill, with no Pi equivalent. |
373
+ | `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. |
374
+ | `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. |
156
375
  | `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. |
157
- | `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. |
158
- | `recall` | `/skill:pistack-recall` | `delegation` | `git`, `gh` | Core corpus is Cursor's on-disk transcript JSONL, so only the git/gh and shared-record half survives. |
159
- | `reflect` | `/skill:pistack-reflect` | `delegation` | - | Transcript mining and create-skill routing are Cursor-specific, though the digest fallback partly works. |
160
- | `sharpen` | `/skill:pistack-sharpen` | - | - | New in pstack 0.15.25 and not yet run end to end in Pi. Its body is prompt-only, with no tool, delegation, or executable, and it runs only when you type it. |
376
+ | `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. |
377
+ | `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. |
378
+ | `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. |
161
379
  | `swarm` | `/skill:pistack-swarm` | `delegation` | - | Cloud background workers and cloud_base_branch have no Pi mapping; only local fan-out approximates it. |
162
380
 
163
381
  ### unsupported (1)
@@ -206,8 +424,10 @@ through `delegate_task`. That run is the evidence the tier rules above require.
206
424
 
207
425
  ## Skills the adapter replaces
208
426
 
209
- `setup-pstack` writes a Cursor `.mdc` rule and nothing else, so the adapter substitutes its own
210
- body and publishes it as `/skill:pistack-setup`. The upstream skill stays represented, and the
427
+ `setup-pstack` writes a Cursor `.mdc` rule, so the adapter substitutes its own body and
428
+ publishes it as `/skill:pistack-setup`. Upstream's optional closing offers to run
429
+ `create-verification-skill` and `create-formal-verification-skill` are left out of the Pi body;
430
+ both skills stay available by name. The upstream skill stays represented, and the
211
431
  wrapper frontmatter records `pistack-upstream-skill: setup-pstack`.
212
432
 
213
433
  ## Unknown skills