@justjoshn/pi-pstack 0.0.0-stage → 0.15.36-pi.11

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.
Files changed (644) hide show
  1. package/CHANGELOG.md +79 -0
  2. package/LICENSE +21 -0
  3. package/README.md +100 -2
  4. package/agents/ci-watcher.md +28 -0
  5. package/agents/comment-sicko.md +32 -0
  6. package/agents/poteto-agent.md +9 -0
  7. package/agents/thermo-nuclear-code-quality-review.md +23 -0
  8. package/assets/logo.png +0 -0
  9. package/automations/benny/FOR_AGENTS.md +83 -0
  10. package/automations/benny/README.md +20 -0
  11. package/automations/benny/skills/reproduce-and-fix-issues/SKILL.md +310 -0
  12. package/automations/benny/skills/reproduce-and-fix-issues/references/control-adapter.md +169 -0
  13. package/automations/benny/skills/reproduce-and-fix-issues/references/feature-map.example.md +205 -0
  14. package/automations/benny/skills/reproduce-and-fix-issues/references/verify-existing-fix.md +93 -0
  15. package/automations/benny/skills/setup-benny/SKILL.md +254 -0
  16. package/automations/benny/skills/triage-issue-reports/SKILL.md +240 -0
  17. package/automations/benny/skills/triage-issue-reports/references/routing.example.md +61 -0
  18. package/automations/benny/templates/configuration.example.yaml +113 -0
  19. package/automations/benny/templates/reproduce-automation-prompt.md +49 -0
  20. package/automations/benny/templates/triage-automation-prompt.md +53 -0
  21. package/bin/pstack-routines-supervisor +9 -0
  22. package/docs/guide/01-setup.md +67 -0
  23. package/docs/guide/02-poteto-mode.md +139 -0
  24. package/docs/guide/03-understand.md +79 -0
  25. package/docs/guide/04-design.md +133 -0
  26. package/docs/guide/05-build-and-clean.md +83 -0
  27. package/docs/guide/06-verify-and-ship.md +162 -0
  28. package/docs/guide/07-overnight.md +122 -0
  29. package/docs/guide/08-principles.md +72 -0
  30. package/docs/guide/09-make-it-yours.md +100 -0
  31. package/docs/guide/10-recipes-and-pitfalls.md +182 -0
  32. package/docs/guide/README.md +38 -0
  33. package/docs/guide/images/design.jpg +0 -0
  34. package/docs/guide/images/overnight.jpg +0 -0
  35. package/docs/guide/images/recipes.jpg +0 -0
  36. package/docs/guide/images/router.jpg +0 -0
  37. package/docs/guide/images/understanding.jpg +0 -0
  38. package/docs/guide/images/verification.jpg +0 -0
  39. package/docs/native-gaps.md +73 -0
  40. package/docs/parity-reverse-engineering.md +94 -0
  41. package/docs/parity-status.md +113 -0
  42. package/licenses/cursor-team-kit.LICENSE +21 -0
  43. package/licenses/pstack.LICENSE +21 -0
  44. package/package.json +86 -4
  45. package/packaging/install-supervisor-unit.sh +164 -0
  46. package/packaging/launchd/com.pstack.routines-supervisor.plist.example +24 -0
  47. package/packaging/systemd/pstack-routines-supervisor.service.example +15 -0
  48. package/skills/architect/SKILL.md +79 -0
  49. package/skills/architect/references/design-red-flags.md +57 -0
  50. package/skills/architect/references/rationale-template.md +35 -0
  51. package/skills/architect/references/runner-prompt.md +20 -0
  52. package/skills/arena/SKILL.md +48 -0
  53. package/skills/automate-me/SKILL.md +104 -0
  54. package/skills/benchmark-checklist/SKILL.md +39 -0
  55. package/skills/blast-radius/SKILL.md +50 -0
  56. package/skills/bro/SKILL.md +7 -0
  57. package/skills/check-compiler-errors/SKILL.md +23 -0
  58. package/skills/control-cli/SKILL.md +109 -0
  59. package/skills/control-ui/SKILL.md +109 -0
  60. package/skills/correct/SKILL.md +32 -0
  61. package/skills/create-formal-verification-skill/SKILL.md +43 -0
  62. package/skills/create-skill/SKILL.md +548 -0
  63. package/skills/create-verification-skill/SKILL.md +44 -0
  64. package/skills/create-verification-skill/references/feature-map-example/README.md +47 -0
  65. package/skills/create-verification-skill/references/feature-map-example/create-note.md +39 -0
  66. package/skills/create-verification-skill/references/feature-map-example/search.md +45 -0
  67. package/skills/deslop/SKILL.md +22 -0
  68. package/skills/figure-it-out/SKILL.md +52 -0
  69. package/skills/fix-ci/SKILL.md +29 -0
  70. package/skills/fix-merge-conflicts/SKILL.md +32 -0
  71. package/skills/get-pr-comments/SKILL.md +23 -0
  72. package/skills/how/SKILL.md +36 -0
  73. package/skills/how/references/explainer-prompt.md +55 -0
  74. package/skills/how/references/explorer-prompt.md +35 -0
  75. package/skills/in-your-own-words/SKILL.md +7 -0
  76. package/skills/interrogate/SKILL.md +31 -0
  77. package/skills/ketchup/SKILL.md +43 -0
  78. package/skills/ketchup-video/SKILL.md +29 -0
  79. package/skills/loop-on-ci/SKILL.md +50 -0
  80. package/skills/maintain-formal-verification-skill/SKILL.md +58 -0
  81. package/skills/maintain-verification-skill/SKILL.md +39 -0
  82. package/skills/make-bot-ui/SKILL.md +104 -0
  83. package/skills/make-pr-easy-to-review/SKILL.md +59 -0
  84. package/skills/new-branch-and-pr/SKILL.md +29 -0
  85. package/skills/no-comments/SKILL.md +24 -0
  86. package/skills/no-inline-imports/SKILL.md +12 -0
  87. package/skills/poteto-help/SKILL.md +161 -0
  88. package/skills/poteto-help/references/prompting.md +51 -0
  89. package/skills/poteto-help/references/recipes.md +51 -0
  90. package/skills/poteto-mode/SKILL.md +151 -0
  91. package/skills/poteto-mode/playbooks/authoring-a-skill.md +12 -0
  92. package/skills/poteto-mode/playbooks/autonomous-run.md +13 -0
  93. package/skills/poteto-mode/playbooks/autopilot-full.md +25 -0
  94. package/skills/poteto-mode/playbooks/autopilot-stack.md +8 -0
  95. package/skills/poteto-mode/playbooks/babysit.md +23 -0
  96. package/skills/poteto-mode/playbooks/bug-fix.md +15 -0
  97. package/skills/poteto-mode/playbooks/eval.md +25 -0
  98. package/skills/poteto-mode/playbooks/feature.md +21 -0
  99. package/skills/poteto-mode/playbooks/hillclimb.md +21 -0
  100. package/skills/poteto-mode/playbooks/investigation.md +14 -0
  101. package/skills/poteto-mode/playbooks/multi-phase-plan.md +155 -0
  102. package/skills/poteto-mode/playbooks/opening-a-pr.md +34 -0
  103. package/skills/poteto-mode/playbooks/orchestrate.md +25 -0
  104. package/skills/poteto-mode/playbooks/pause-safely.md +10 -0
  105. package/skills/poteto-mode/playbooks/perf-issue.md +25 -0
  106. package/skills/poteto-mode/playbooks/prototype.md +14 -0
  107. package/skills/poteto-mode/playbooks/refactoring.md +16 -0
  108. package/skills/poteto-mode/playbooks/runtime-forensics.md +11 -0
  109. package/skills/poteto-mode/playbooks/session-pickup.md +11 -0
  110. package/skills/poteto-mode/playbooks/shipping.md +12 -0
  111. package/skills/poteto-mode/playbooks/trace-forensics.md +14 -0
  112. package/skills/poteto-mode/playbooks/visual-parity.md +11 -0
  113. package/skills/poteto-mode/playbooks/worktree-cleanup.md +12 -0
  114. package/skills/poteto-mode/references/bugbot-triage.md +142 -0
  115. package/skills/poteto-mode/scripts/bootstrap.ts +62 -0
  116. package/skills/poteto-mode/scripts/bun.lock +67 -0
  117. package/skills/poteto-mode/scripts/check-plan.mjs +205 -0
  118. package/skills/poteto-mode/scripts/check-plan.test.ts +110 -0
  119. package/skills/poteto-mode/scripts/package.json +16 -0
  120. package/skills/poteto-mode/scripts/watch-pr/cli.test.ts +224 -0
  121. package/skills/poteto-mode/scripts/watch-pr/cli.ts +223 -0
  122. package/skills/poteto-mode/scripts/watch-pr/fakes.test-helper.ts +129 -0
  123. package/skills/poteto-mode/scripts/watch-pr/github.test.ts +498 -0
  124. package/skills/poteto-mode/scripts/watch-pr/github.ts +726 -0
  125. package/skills/poteto-mode/scripts/watch-pr/policy.test.ts +482 -0
  126. package/skills/poteto-mode/scripts/watch-pr/policy.ts +842 -0
  127. package/skills/poteto-mode/scripts/watch-pr/render.ts +169 -0
  128. package/skills/poteto-mode/scripts/watch-pr/tsconfig.json +13 -0
  129. package/skills/poteto-mode/scripts/watch-pr/types.compile.ts +93 -0
  130. package/skills/poteto-mode/scripts/watch-pr/types.ts +414 -0
  131. package/skills/poteto-mode/scripts/watch-pr/watch-pr +6 -0
  132. package/skills/poteto-mode/scripts/worktree-audit.sh +156 -0
  133. package/skills/pr-review-canvas/SKILL.md +176 -0
  134. package/skills/pr-review-canvas/renderer.js +170 -0
  135. package/skills/pr-review-canvas/styles.css +96 -0
  136. package/skills/pr-review-canvas/template.html +18 -0
  137. package/skills/principle-attack-the-premise/SKILL.md +21 -0
  138. package/skills/principle-boundary-discipline/SKILL.md +34 -0
  139. package/skills/principle-build-the-lever/SKILL.md +23 -0
  140. package/skills/principle-encode-lessons-in-structure/SKILL.md +11 -0
  141. package/skills/principle-exhaust-the-design-space/SKILL.md +9 -0
  142. package/skills/principle-experience-first/SKILL.md +19 -0
  143. package/skills/principle-explain-the-number/SKILL.md +18 -0
  144. package/skills/principle-fix-root-causes/SKILL.md +21 -0
  145. package/skills/principle-foundational-thinking/SKILL.md +21 -0
  146. package/skills/principle-guard-the-context-window/SKILL.md +12 -0
  147. package/skills/principle-laziness-protocol/SKILL.md +10 -0
  148. package/skills/principle-make-operations-idempotent/SKILL.md +22 -0
  149. package/skills/principle-migrate-callers-then-delete-legacy-apis/SKILL.md +14 -0
  150. package/skills/principle-minimize-reader-load/SKILL.md +18 -0
  151. package/skills/principle-model-the-domain/SKILL.md +24 -0
  152. package/skills/principle-never-block-on-the-human/SKILL.md +15 -0
  153. package/skills/principle-outcome-oriented-execution/SKILL.md +21 -0
  154. package/skills/principle-prove-it-works/SKILL.md +22 -0
  155. package/skills/principle-redesign-from-first-principles/SKILL.md +16 -0
  156. package/skills/principle-separate-before-serializing-shared-state/SKILL.md +16 -0
  157. package/skills/principle-sequence-verifiable-units/SKILL.md +17 -0
  158. package/skills/principle-subtract-before-you-add/SKILL.md +18 -0
  159. package/skills/principle-test-behavior-not-implementation/SKILL.md +20 -0
  160. package/skills/principle-type-system-discipline/SKILL.md +13 -0
  161. package/skills/recall/SKILL.md +35 -0
  162. package/skills/reflect/SKILL.md +69 -0
  163. package/skills/reflect/references/divergent-reviewer.md +38 -0
  164. package/skills/reflect/references/judgment-reviewer.md +37 -0
  165. package/skills/reflect/references/synthesizer.md +56 -0
  166. package/skills/reflect/references/tooling-reviewer.md +48 -0
  167. package/skills/review-and-ship/SKILL.md +41 -0
  168. package/skills/run-smoke-tests/SKILL.md +42 -0
  169. package/skills/setup-pstack/SKILL.md +74 -0
  170. package/skills/sharpen/SKILL.md +16 -0
  171. package/skills/show-me-your-work/SKILL.md +82 -0
  172. package/skills/show-me-your-work/references/decision-log-template.tsv +1 -0
  173. package/skills/show-me-your-work/scripts/log.sh +42 -0
  174. package/skills/statechart/SKILL.md +82 -0
  175. package/skills/statechart/references/render.md +93 -0
  176. package/skills/statechart/scripts/backends/cfg.ts +33 -0
  177. package/skills/statechart/scripts/backends/mermaid.ts +201 -0
  178. package/skills/statechart/scripts/backends/plain-text.ts +72 -0
  179. package/skills/statechart/scripts/backends/report.ts +177 -0
  180. package/skills/statechart/scripts/frontends/config.ts +276 -0
  181. package/skills/statechart/scripts/frontends/dot.ts +74 -0
  182. package/skills/statechart/scripts/frontends/marks.ts +93 -0
  183. package/skills/statechart/scripts/frontends/messages.ts +52 -0
  184. package/skills/statechart/scripts/frontends/spec.ts +114 -0
  185. package/skills/statechart/scripts/frontends/trace.ts +24 -0
  186. package/skills/statechart/scripts/frontends/value.ts +166 -0
  187. package/skills/statechart/scripts/frontends/verdict.ts +40 -0
  188. package/skills/statechart/scripts/frontends/view.ts +119 -0
  189. package/skills/statechart/scripts/ir.ts +547 -0
  190. package/skills/statechart/scripts/package.json +11 -0
  191. package/skills/statechart/scripts/passes/annotate.ts +128 -0
  192. package/skills/statechart/scripts/passes/label.ts +269 -0
  193. package/skills/statechart/scripts/passes/lift.ts +85 -0
  194. package/skills/statechart/scripts/passes/loop-check.ts +68 -0
  195. package/skills/statechart/scripts/passes/paths.ts +60 -0
  196. package/skills/statechart/scripts/passes/reach.ts +135 -0
  197. package/skills/statechart/scripts/passes/region-check.ts +97 -0
  198. package/skills/statechart/scripts/passes/regions.ts +295 -0
  199. package/skills/statechart/scripts/pipeline.ts +76 -0
  200. package/skills/statechart/scripts/run.ts +481 -0
  201. package/skills/statechart/scripts/statechart +29 -0
  202. package/skills/statechart/scripts/statechart.ts +164 -0
  203. package/skills/statechart/scripts/test/ConfigOracle.java +63 -0
  204. package/skills/statechart/scripts/test/chart.test.ts +1210 -0
  205. package/skills/statechart/scripts/test/charts/Braces.mmd +7 -0
  206. package/skills/statechart/scripts/test/charts/Escapes.mmd +11 -0
  207. package/skills/statechart/scripts/test/charts/Phases.mmd +29 -0
  208. package/skills/statechart/scripts/test/cli.test.ts +1314 -0
  209. package/skills/statechart/scripts/test/config-fuzz.test.ts +263 -0
  210. package/skills/statechart/scripts/test/corpus/Counter/ChartRun.out +57 -0
  211. package/skills/statechart/scripts/test/corpus/Counter/Counter.cfg +3 -0
  212. package/skills/statechart/scripts/test/corpus/Counter/Counter.tla +10 -0
  213. package/skills/statechart/scripts/test/corpus/Counter/chart.mmd +9 -0
  214. package/skills/statechart/scripts/test/corpus/Counter/graph.dot +16 -0
  215. package/skills/statechart/scripts/test/corpus/Counter/report.md +7 -0
  216. package/skills/statechart/scripts/test/corpus/Counter/sany.out +2 -0
  217. package/skills/statechart/scripts/test/corpus/Counter/verdict-1.out +49 -0
  218. package/skills/statechart/scripts/test/corpus/CounterAction/ChartRun.out +60 -0
  219. package/skills/statechart/scripts/test/corpus/CounterAction/CounterAction.cfg +4 -0
  220. package/skills/statechart/scripts/test/corpus/CounterAction/CounterAction.tla +22 -0
  221. package/skills/statechart/scripts/test/corpus/CounterAction/chart.mmd +26 -0
  222. package/skills/statechart/scripts/test/corpus/CounterAction/graph.dot +19 -0
  223. package/skills/statechart/scripts/test/corpus/CounterAction/report.md +20 -0
  224. package/skills/statechart/scripts/test/corpus/CounterAction/sany.out +2 -0
  225. package/skills/statechart/scripts/test/corpus/CounterAction/verdict-1.exit +1 -0
  226. package/skills/statechart/scripts/test/corpus/CounterAction/verdict-1.out +56 -0
  227. package/skills/statechart/scripts/test/corpus/CounterAction/verdict-2.exit +1 -0
  228. package/skills/statechart/scripts/test/corpus/CounterAction/verdict-2.out +82 -0
  229. package/skills/statechart/scripts/test/corpus/CounterAction/verdict-3.out +57 -0
  230. package/skills/statechart/scripts/test/corpus/CounterDeadlock/ChartRun.out +59 -0
  231. package/skills/statechart/scripts/test/corpus/CounterDeadlock/CounterDeadlock.cfg +3 -0
  232. package/skills/statechart/scripts/test/corpus/CounterDeadlock/CounterDeadlock.tla +11 -0
  233. package/skills/statechart/scripts/test/corpus/CounterDeadlock/chart.mmd +22 -0
  234. package/skills/statechart/scripts/test/corpus/CounterDeadlock/graph.dot +16 -0
  235. package/skills/statechart/scripts/test/corpus/CounterDeadlock/report.md +17 -0
  236. package/skills/statechart/scripts/test/corpus/CounterDeadlock/sany.out +2 -0
  237. package/skills/statechart/scripts/test/corpus/CounterDeadlock/verdict-1.exit +1 -0
  238. package/skills/statechart/scripts/test/corpus/CounterDeadlock/verdict-1.out +56 -0
  239. package/skills/statechart/scripts/test/corpus/CounterDeadlock/verdict-2.exit +1 -0
  240. package/skills/statechart/scripts/test/corpus/CounterDeadlock/verdict-2.out +77 -0
  241. package/skills/statechart/scripts/test/corpus/CounterFan/ChartRun.out +69 -0
  242. package/skills/statechart/scripts/test/corpus/CounterFan/CounterFan.cfg +2 -0
  243. package/skills/statechart/scripts/test/corpus/CounterFan/CounterFan.tla +11 -0
  244. package/skills/statechart/scripts/test/corpus/CounterFan/chart.mmd +85 -0
  245. package/skills/statechart/scripts/test/corpus/CounterFan/graph.dot +70 -0
  246. package/skills/statechart/scripts/test/corpus/CounterFan/report.md +12 -0
  247. package/skills/statechart/scripts/test/corpus/CounterFan/sany.out +2 -0
  248. package/skills/statechart/scripts/test/corpus/CounterFan/verdict-1.exit +1 -0
  249. package/skills/statechart/scripts/test/corpus/CounterFan/verdict-1.out +67 -0
  250. package/skills/statechart/scripts/test/corpus/CounterFan/verdict-2.out +57 -0
  251. package/skills/statechart/scripts/test/corpus/CounterGuard/ChartRun.exit +1 -0
  252. package/skills/statechart/scripts/test/corpus/CounterGuard/ChartRun.out +85 -0
  253. package/skills/statechart/scripts/test/corpus/CounterGuard/CounterGuard.cfg +6 -0
  254. package/skills/statechart/scripts/test/corpus/CounterGuard/CounterGuard.tla +13 -0
  255. package/skills/statechart/scripts/test/corpus/CounterGuard/chart.mmd +5 -0
  256. package/skills/statechart/scripts/test/corpus/CounterGuard/graph.dot +10 -0
  257. package/skills/statechart/scripts/test/corpus/CounterGuard/report.md +31 -0
  258. package/skills/statechart/scripts/test/corpus/CounterGuard/sany.out +2 -0
  259. package/skills/statechart/scripts/test/corpus/CounterGuard/verdict-1.exit +1 -0
  260. package/skills/statechart/scripts/test/corpus/CounterGuard/verdict-1.out +64 -0
  261. package/skills/statechart/scripts/test/corpus/CounterGuard/verdict-2.exit +1 -0
  262. package/skills/statechart/scripts/test/corpus/CounterGuard/verdict-2.out +77 -0
  263. package/skills/statechart/scripts/test/corpus/CounterInitPast/ChartRun.out +55 -0
  264. package/skills/statechart/scripts/test/corpus/CounterInitPast/CounterInitPast.cfg +3 -0
  265. package/skills/statechart/scripts/test/corpus/CounterInitPast/CounterInitPast.tla +10 -0
  266. package/skills/statechart/scripts/test/corpus/CounterInitPast/chart.mmd +12 -0
  267. package/skills/statechart/scripts/test/corpus/CounterInitPast/graph.dot +6 -0
  268. package/skills/statechart/scripts/test/corpus/CounterInitPast/report.md +12 -0
  269. package/skills/statechart/scripts/test/corpus/CounterInitPast/sany.out +2 -0
  270. package/skills/statechart/scripts/test/corpus/CounterInitPast/verdict-1.exit +1 -0
  271. package/skills/statechart/scripts/test/corpus/CounterInitPast/verdict-1.out +33 -0
  272. package/skills/statechart/scripts/test/corpus/CounterInitPast/verdict-2.out +54 -0
  273. package/skills/statechart/scripts/test/corpus/CounterInitPastHolds/ChartRun.out +54 -0
  274. package/skills/statechart/scripts/test/corpus/CounterInitPastHolds/CounterInitPastHolds.cfg +3 -0
  275. package/skills/statechart/scripts/test/corpus/CounterInitPastHolds/CounterInitPastHolds.tla +10 -0
  276. package/skills/statechart/scripts/test/corpus/CounterInitPastHolds/chart.mmd +1 -0
  277. package/skills/statechart/scripts/test/corpus/CounterInitPastHolds/graph.dot +6 -0
  278. package/skills/statechart/scripts/test/corpus/CounterInitPastHolds/report.md +7 -0
  279. package/skills/statechart/scripts/test/corpus/CounterInitPastHolds/sany.out +2 -0
  280. package/skills/statechart/scripts/test/corpus/CounterInitPastHolds/verdict-1.out +46 -0
  281. package/skills/statechart/scripts/test/corpus/CounterInstance/ChartRun.out +59 -0
  282. package/skills/statechart/scripts/test/corpus/CounterInstance/CounterInstance.cfg +2 -0
  283. package/skills/statechart/scripts/test/corpus/CounterInstance/CounterInstance.tla +10 -0
  284. package/skills/statechart/scripts/test/corpus/CounterInstance/CounterSteps.tla +6 -0
  285. package/skills/statechart/scripts/test/corpus/CounterInstance/chart.mmd +17 -0
  286. package/skills/statechart/scripts/test/corpus/CounterInstance/graph.dot +15 -0
  287. package/skills/statechart/scripts/test/corpus/CounterInstance/report.md +14 -0
  288. package/skills/statechart/scripts/test/corpus/CounterInstance/sany.out +3 -0
  289. package/skills/statechart/scripts/test/corpus/CounterInstance/verdict-1.exit +1 -0
  290. package/skills/statechart/scripts/test/corpus/CounterInstance/verdict-1.out +78 -0
  291. package/skills/statechart/scripts/test/corpus/CounterJump/ChartRun.out +59 -0
  292. package/skills/statechart/scripts/test/corpus/CounterJump/CounterJump.cfg +3 -0
  293. package/skills/statechart/scripts/test/corpus/CounterJump/CounterJump.tla +19 -0
  294. package/skills/statechart/scripts/test/corpus/CounterJump/chart.mmd +26 -0
  295. package/skills/statechart/scripts/test/corpus/CounterJump/graph.dot +22 -0
  296. package/skills/statechart/scripts/test/corpus/CounterJump/report.md +12 -0
  297. package/skills/statechart/scripts/test/corpus/CounterJump/sany.out +2 -0
  298. package/skills/statechart/scripts/test/corpus/CounterJump/verdict-1.exit +1 -0
  299. package/skills/statechart/scripts/test/corpus/CounterJump/verdict-1.out +58 -0
  300. package/skills/statechart/scripts/test/corpus/CounterJump/verdict-2.out +57 -0
  301. package/skills/statechart/scripts/test/corpus/CounterLoop/ChartRun.out +57 -0
  302. package/skills/statechart/scripts/test/corpus/CounterLoop/CounterLoop.cfg +2 -0
  303. package/skills/statechart/scripts/test/corpus/CounterLoop/CounterLoop.tla +11 -0
  304. package/skills/statechart/scripts/test/corpus/CounterLoop/chart.mmd +17 -0
  305. package/skills/statechart/scripts/test/corpus/CounterLoop/graph.dot +15 -0
  306. package/skills/statechart/scripts/test/corpus/CounterLoop/report.md +14 -0
  307. package/skills/statechart/scripts/test/corpus/CounterLoop/sany.out +2 -0
  308. package/skills/statechart/scripts/test/corpus/CounterLoop/verdict-1.exit +1 -0
  309. package/skills/statechart/scripts/test/corpus/CounterLoop/verdict-1.out +76 -0
  310. package/skills/statechart/scripts/test/corpus/CounterOrder/ChartRun.out +59 -0
  311. package/skills/statechart/scripts/test/corpus/CounterOrder/CounterOrder.cfg +3 -0
  312. package/skills/statechart/scripts/test/corpus/CounterOrder/CounterOrder.tla +11 -0
  313. package/skills/statechart/scripts/test/corpus/CounterOrder/chart.mmd +19 -0
  314. package/skills/statechart/scripts/test/corpus/CounterOrder/graph.dot +10 -0
  315. package/skills/statechart/scripts/test/corpus/CounterOrder/report.md +15 -0
  316. package/skills/statechart/scripts/test/corpus/CounterOrder/sany.out +2 -0
  317. package/skills/statechart/scripts/test/corpus/CounterOrder/verdict-1.exit +1 -0
  318. package/skills/statechart/scripts/test/corpus/CounterOrder/verdict-1.out +56 -0
  319. package/skills/statechart/scripts/test/corpus/CounterOrder/verdict-2.exit +1 -0
  320. package/skills/statechart/scripts/test/corpus/CounterOrder/verdict-2.out +67 -0
  321. package/skills/statechart/scripts/test/corpus/CounterRules/ChartRun.out +62 -0
  322. package/skills/statechart/scripts/test/corpus/CounterRules/CounterRules.cfg +6 -0
  323. package/skills/statechart/scripts/test/corpus/CounterRules/CounterRules.tla +24 -0
  324. package/skills/statechart/scripts/test/corpus/CounterRules/Moves.tla +5 -0
  325. package/skills/statechart/scripts/test/corpus/CounterRules/chart.mmd +22 -0
  326. package/skills/statechart/scripts/test/corpus/CounterRules/graph.dot +10 -0
  327. package/skills/statechart/scripts/test/corpus/CounterRules/report.md +23 -0
  328. package/skills/statechart/scripts/test/corpus/CounterRules/sany.out +3 -0
  329. package/skills/statechart/scripts/test/corpus/CounterRules/verdict-1.exit +1 -0
  330. package/skills/statechart/scripts/test/corpus/CounterRules/verdict-1.out +58 -0
  331. package/skills/statechart/scripts/test/corpus/CounterRules/verdict-2.exit +1 -0
  332. package/skills/statechart/scripts/test/corpus/CounterRules/verdict-2.out +66 -0
  333. package/skills/statechart/scripts/test/corpus/CounterRules/verdict-3.exit +1 -0
  334. package/skills/statechart/scripts/test/corpus/CounterRules/verdict-3.out +74 -0
  335. package/skills/statechart/scripts/test/corpus/CounterRules/verdict-4.out +59 -0
  336. package/skills/statechart/scripts/test/corpus/CounterStart/ChartRun.out +58 -0
  337. package/skills/statechart/scripts/test/corpus/CounterStart/CounterStart.cfg +3 -0
  338. package/skills/statechart/scripts/test/corpus/CounterStart/CounterStart.tla +15 -0
  339. package/skills/statechart/scripts/test/corpus/CounterStart/chart.mmd +18 -0
  340. package/skills/statechart/scripts/test/corpus/CounterStart/graph.dot +13 -0
  341. package/skills/statechart/scripts/test/corpus/CounterStart/report.md +11 -0
  342. package/skills/statechart/scripts/test/corpus/CounterStart/sany.out +2 -0
  343. package/skills/statechart/scripts/test/corpus/CounterStart/verdict-1.exit +1 -0
  344. package/skills/statechart/scripts/test/corpus/CounterStart/verdict-1.out +33 -0
  345. package/skills/statechart/scripts/test/corpus/CounterStart/verdict-2.out +57 -0
  346. package/skills/statechart/scripts/test/corpus/CounterStop/ChartRun.out +57 -0
  347. package/skills/statechart/scripts/test/corpus/CounterStop/CounterStop.cfg +3 -0
  348. package/skills/statechart/scripts/test/corpus/CounterStop/CounterStop.tla +15 -0
  349. package/skills/statechart/scripts/test/corpus/CounterStop/chart.mmd +7 -0
  350. package/skills/statechart/scripts/test/corpus/CounterStop/graph.dot +13 -0
  351. package/skills/statechart/scripts/test/corpus/CounterStop/report.md +6 -0
  352. package/skills/statechart/scripts/test/corpus/CounterStop/sany.out +2 -0
  353. package/skills/statechart/scripts/test/corpus/CounterStop/verdict-1.out +49 -0
  354. package/skills/statechart/scripts/test/corpus/CounterTie/ChartRun.out +61 -0
  355. package/skills/statechart/scripts/test/corpus/CounterTie/CounterTie.cfg +4 -0
  356. package/skills/statechart/scripts/test/corpus/CounterTie/CounterTie.tla +14 -0
  357. package/skills/statechart/scripts/test/corpus/CounterTie/chart.mmd +30 -0
  358. package/skills/statechart/scripts/test/corpus/CounterTie/graph.dot +19 -0
  359. package/skills/statechart/scripts/test/corpus/CounterTie/report.md +27 -0
  360. package/skills/statechart/scripts/test/corpus/CounterTie/sany.out +2 -0
  361. package/skills/statechart/scripts/test/corpus/CounterTie/verdict-1.exit +1 -0
  362. package/skills/statechart/scripts/test/corpus/CounterTie/verdict-1.out +56 -0
  363. package/skills/statechart/scripts/test/corpus/CounterTie/verdict-2.exit +1 -0
  364. package/skills/statechart/scripts/test/corpus/CounterTie/verdict-2.out +64 -0
  365. package/skills/statechart/scripts/test/corpus/CounterTie/verdict-3.exit +1 -0
  366. package/skills/statechart/scripts/test/corpus/CounterTie/verdict-3.out +87 -0
  367. package/skills/statechart/scripts/test/corpus/CounterTie/verdict-4.out +57 -0
  368. package/skills/statechart/scripts/test/corpus/CounterTieInGraph/ChartRun.out +60 -0
  369. package/skills/statechart/scripts/test/corpus/CounterTieInGraph/CounterTieInGraph.cfg +3 -0
  370. package/skills/statechart/scripts/test/corpus/CounterTieInGraph/CounterTieInGraph.tla +12 -0
  371. package/skills/statechart/scripts/test/corpus/CounterTieInGraph/chart.mmd +23 -0
  372. package/skills/statechart/scripts/test/corpus/CounterTieInGraph/graph.dot +19 -0
  373. package/skills/statechart/scripts/test/corpus/CounterTieInGraph/report.md +11 -0
  374. package/skills/statechart/scripts/test/corpus/CounterTieInGraph/sany.out +2 -0
  375. package/skills/statechart/scripts/test/corpus/CounterTieInGraph/verdict-1.exit +1 -0
  376. package/skills/statechart/scripts/test/corpus/CounterTieInGraph/verdict-1.out +56 -0
  377. package/skills/statechart/scripts/test/corpus/CounterTieInGraph/verdict-2.out +57 -0
  378. package/skills/statechart/scripts/test/corpus/CounterView/ChartRun.out +61 -0
  379. package/skills/statechart/scripts/test/corpus/CounterView/CounterView.cfg +4 -0
  380. package/skills/statechart/scripts/test/corpus/CounterView/CounterView.tla +14 -0
  381. package/skills/statechart/scripts/test/corpus/CounterView/chart.mmd +23 -0
  382. package/skills/statechart/scripts/test/corpus/CounterView/graph.dot +19 -0
  383. package/skills/statechart/scripts/test/corpus/CounterView/report.md +27 -0
  384. package/skills/statechart/scripts/test/corpus/CounterView/sany.out +2 -0
  385. package/skills/statechart/scripts/test/corpus/CounterView/verdict-1.exit +1 -0
  386. package/skills/statechart/scripts/test/corpus/CounterView/verdict-1.out +56 -0
  387. package/skills/statechart/scripts/test/corpus/CounterView/verdict-2.exit +1 -0
  388. package/skills/statechart/scripts/test/corpus/CounterView/verdict-2.out +64 -0
  389. package/skills/statechart/scripts/test/corpus/CounterView/verdict-3.exit +1 -0
  390. package/skills/statechart/scripts/test/corpus/CounterView/verdict-3.out +87 -0
  391. package/skills/statechart/scripts/test/corpus/CounterView/verdict-4.out +57 -0
  392. package/skills/statechart/scripts/test/corpus/CounterView/view.mjs +1 -0
  393. package/skills/statechart/scripts/test/corpus/DieHard/ChartRun.out +59 -0
  394. package/skills/statechart/scripts/test/corpus/DieHard/DieHard.cfg +4 -0
  395. package/skills/statechart/scripts/test/corpus/DieHard/DieHard.tla +38 -0
  396. package/skills/statechart/scripts/test/corpus/DieHard/chart.mmd +92 -0
  397. package/skills/statechart/scripts/test/corpus/DieHard/graph.dot +126 -0
  398. package/skills/statechart/scripts/test/corpus/DieHard/report.md +17 -0
  399. package/skills/statechart/scripts/test/corpus/DieHard/sany.out +2 -0
  400. package/skills/statechart/scripts/test/corpus/DieHard/verdict-1.exit +1 -0
  401. package/skills/statechart/scripts/test/corpus/DieHard/verdict-1.out +91 -0
  402. package/skills/statechart/scripts/test/corpus/DieHard/verdict-2.out +57 -0
  403. package/skills/statechart/scripts/test/corpus/FirstRule/ChartRun.out +61 -0
  404. package/skills/statechart/scripts/test/corpus/FirstRule/FirstRule.cfg +6 -0
  405. package/skills/statechart/scripts/test/corpus/FirstRule/FirstRule.tla +11 -0
  406. package/skills/statechart/scripts/test/corpus/FirstRule/chart.mmd +22 -0
  407. package/skills/statechart/scripts/test/corpus/FirstRule/graph.dot +16 -0
  408. package/skills/statechart/scripts/test/corpus/FirstRule/report.md +25 -0
  409. package/skills/statechart/scripts/test/corpus/FirstRule/sany.out +2 -0
  410. package/skills/statechart/scripts/test/corpus/FirstRule/verdict-1.exit +1 -0
  411. package/skills/statechart/scripts/test/corpus/FirstRule/verdict-1.out +56 -0
  412. package/skills/statechart/scripts/test/corpus/FirstRule/verdict-2.exit +1 -0
  413. package/skills/statechart/scripts/test/corpus/FirstRule/verdict-2.out +64 -0
  414. package/skills/statechart/scripts/test/corpus/FirstRule/verdict-3.exit +1 -0
  415. package/skills/statechart/scripts/test/corpus/FirstRule/verdict-3.out +64 -0
  416. package/skills/statechart/scripts/test/corpus/FirstRule/verdict-4.exit +1 -0
  417. package/skills/statechart/scripts/test/corpus/FirstRule/verdict-4.out +77 -0
  418. package/skills/statechart/scripts/test/corpus/HiddenClock/ChartRun.out +57 -0
  419. package/skills/statechart/scripts/test/corpus/HiddenClock/HiddenClock.cfg +4 -0
  420. package/skills/statechart/scripts/test/corpus/HiddenClock/HiddenClock.tla +11 -0
  421. package/skills/statechart/scripts/test/corpus/HiddenClock/chart.mmd +13 -0
  422. package/skills/statechart/scripts/test/corpus/HiddenClock/graph.dot +12 -0
  423. package/skills/statechart/scripts/test/corpus/HiddenClock/report.md +11 -0
  424. package/skills/statechart/scripts/test/corpus/HiddenClock/sany.out +2 -0
  425. package/skills/statechart/scripts/test/corpus/HiddenClock/verdict-1.exit +1 -0
  426. package/skills/statechart/scripts/test/corpus/HiddenClock/verdict-1.out +72 -0
  427. package/skills/statechart/scripts/test/corpus/Login/ChartRun.out +57 -0
  428. package/skills/statechart/scripts/test/corpus/Login/Login.cfg +3 -0
  429. package/skills/statechart/scripts/test/corpus/Login/Login.tla +62 -0
  430. package/skills/statechart/scripts/test/corpus/Login/chart.mmd +27 -0
  431. package/skills/statechart/scripts/test/corpus/Login/graph.dot +40 -0
  432. package/skills/statechart/scripts/test/corpus/Login/report.md +7 -0
  433. package/skills/statechart/scripts/test/corpus/Login/sany.out +1 -0
  434. package/skills/statechart/scripts/test/corpus/Login/verdict-1.out +47 -0
  435. package/skills/statechart/scripts/test/corpus/Login/view.mjs +1 -0
  436. package/skills/statechart/scripts/test/corpus/LoginGuarded/ChartRun.out +57 -0
  437. package/skills/statechart/scripts/test/corpus/LoginGuarded/LoginGuarded.cfg +2 -0
  438. package/skills/statechart/scripts/test/corpus/LoginGuarded/LoginGuarded.tla +64 -0
  439. package/skills/statechart/scripts/test/corpus/LoginGuarded/chart.mmd +28 -0
  440. package/skills/statechart/scripts/test/corpus/LoginGuarded/graph.dot +37 -0
  441. package/skills/statechart/scripts/test/corpus/LoginGuarded/report.md +8 -0
  442. package/skills/statechart/scripts/test/corpus/LoginGuarded/sany.out +1 -0
  443. package/skills/statechart/scripts/test/corpus/LoginGuarded/verdict-1.out +47 -0
  444. package/skills/statechart/scripts/test/corpus/LoginGuarded/view.mjs +1 -0
  445. package/skills/statechart/scripts/test/corpus/LoginParallel/ChartRun.out +60 -0
  446. package/skills/statechart/scripts/test/corpus/LoginParallel/LoginParallel.cfg +3 -0
  447. package/skills/statechart/scripts/test/corpus/LoginParallel/LoginParallel.tla +64 -0
  448. package/skills/statechart/scripts/test/corpus/LoginParallel/chart.mmd +44 -0
  449. package/skills/statechart/scripts/test/corpus/LoginParallel/graph.dot +58 -0
  450. package/skills/statechart/scripts/test/corpus/LoginParallel/report.md +17 -0
  451. package/skills/statechart/scripts/test/corpus/LoginParallel/sany.out +1 -0
  452. package/skills/statechart/scripts/test/corpus/LoginParallel/verdict-1.exit +1 -0
  453. package/skills/statechart/scripts/test/corpus/LoginParallel/verdict-1.out +83 -0
  454. package/skills/statechart/scripts/test/corpus/LoginParallel/verdict-2.out +57 -0
  455. package/skills/statechart/scripts/test/corpus/LoginParallel/view.mjs +1 -0
  456. package/skills/statechart/scripts/test/corpus/MediaPlayer/ChartRun.out +60 -0
  457. package/skills/statechart/scripts/test/corpus/MediaPlayer/MediaPlayer.cfg +3 -0
  458. package/skills/statechart/scripts/test/corpus/MediaPlayer/MediaPlayer.tla +103 -0
  459. package/skills/statechart/scripts/test/corpus/MediaPlayer/chart.mmd +43 -0
  460. package/skills/statechart/scripts/test/corpus/MediaPlayer/graph.dot +93 -0
  461. package/skills/statechart/scripts/test/corpus/MediaPlayer/report.md +14 -0
  462. package/skills/statechart/scripts/test/corpus/MediaPlayer/sany.out +1 -0
  463. package/skills/statechart/scripts/test/corpus/MediaPlayer/verdict-1.exit +1 -0
  464. package/skills/statechart/scripts/test/corpus/MediaPlayer/verdict-1.out +59 -0
  465. package/skills/statechart/scripts/test/corpus/MediaPlayer/verdict-2.out +72 -0
  466. package/skills/statechart/scripts/test/corpus/MediaPlayer/view.mjs +3 -0
  467. package/skills/statechart/scripts/test/corpus/MediaPlayerFixed/ChartRun.out +57 -0
  468. package/skills/statechart/scripts/test/corpus/MediaPlayerFixed/MediaPlayerFixed.cfg +2 -0
  469. package/skills/statechart/scripts/test/corpus/MediaPlayerFixed/MediaPlayerFixed.tla +100 -0
  470. package/skills/statechart/scripts/test/corpus/MediaPlayerFixed/chart.mmd +31 -0
  471. package/skills/statechart/scripts/test/corpus/MediaPlayerFixed/graph.dot +85 -0
  472. package/skills/statechart/scripts/test/corpus/MediaPlayerFixed/report.md +9 -0
  473. package/skills/statechart/scripts/test/corpus/MediaPlayerFixed/sany.out +1 -0
  474. package/skills/statechart/scripts/test/corpus/MediaPlayerFixed/verdict-1.out +47 -0
  475. package/skills/statechart/scripts/test/corpus/MediaPlayerFixed/view.mjs +3 -0
  476. package/skills/statechart/scripts/test/corpus/MediaPlayerProps/ChartRun.out +59 -0
  477. package/skills/statechart/scripts/test/corpus/MediaPlayerProps/MediaPlayer.tla +103 -0
  478. package/skills/statechart/scripts/test/corpus/MediaPlayerProps/MediaPlayerProps.cfg +3 -0
  479. package/skills/statechart/scripts/test/corpus/MediaPlayerProps/MediaPlayerProps.tla +6 -0
  480. package/skills/statechart/scripts/test/corpus/MediaPlayerProps/chart.mmd +42 -0
  481. package/skills/statechart/scripts/test/corpus/MediaPlayerProps/graph.dot +93 -0
  482. package/skills/statechart/scripts/test/corpus/MediaPlayerProps/report.md +19 -0
  483. package/skills/statechart/scripts/test/corpus/MediaPlayerProps/sany.out +2 -0
  484. package/skills/statechart/scripts/test/corpus/MediaPlayerProps/verdict-1.exit +1 -0
  485. package/skills/statechart/scripts/test/corpus/MediaPlayerProps/verdict-1.out +61 -0
  486. package/skills/statechart/scripts/test/corpus/MediaPlayerProps/verdict-2.out +59 -0
  487. package/skills/statechart/scripts/test/corpus/MediaPlayerProps/verdict-3.out +61 -0
  488. package/skills/statechart/scripts/test/corpus/MediaPlayerProps/verdict-4.exit +1 -0
  489. package/skills/statechart/scripts/test/corpus/MediaPlayerProps/verdict-4.out +66 -0
  490. package/skills/statechart/scripts/test/corpus/MediaPlayerProps/verdict-5.exit +1 -0
  491. package/skills/statechart/scripts/test/corpus/MediaPlayerProps/verdict-5.out +58 -0
  492. package/skills/statechart/scripts/test/corpus/MediaPlayerProps/verdict-6.out +49 -0
  493. package/skills/statechart/scripts/test/corpus/MediaPlayerProps/view.mjs +3 -0
  494. package/skills/statechart/scripts/test/corpus/PickWorker/ChartRun.out +57 -0
  495. package/skills/statechart/scripts/test/corpus/PickWorker/PickWorker.cfg +6 -0
  496. package/skills/statechart/scripts/test/corpus/PickWorker/PickWorker.tla +11 -0
  497. package/skills/statechart/scripts/test/corpus/PickWorker/chart.mmd +5 -0
  498. package/skills/statechart/scripts/test/corpus/PickWorker/graph.dot +11 -0
  499. package/skills/statechart/scripts/test/corpus/PickWorker/report.md +7 -0
  500. package/skills/statechart/scripts/test/corpus/PickWorker/sany.out +5 -0
  501. package/skills/statechart/scripts/test/corpus/PickWorker/verdict-1.out +70 -0
  502. package/skills/statechart/scripts/test/corpus/Shadow/ChartRun.out +61 -0
  503. package/skills/statechart/scripts/test/corpus/Shadow/Shadow.cfg +4 -0
  504. package/skills/statechart/scripts/test/corpus/Shadow/Shadow.tla +11 -0
  505. package/skills/statechart/scripts/test/corpus/Shadow/ShadowLib.tla +6 -0
  506. package/skills/statechart/scripts/test/corpus/Shadow/ShadowSub.tla +3 -0
  507. package/skills/statechart/scripts/test/corpus/Shadow/chart.mmd +9 -0
  508. package/skills/statechart/scripts/test/corpus/Shadow/graph.dot +16 -0
  509. package/skills/statechart/scripts/test/corpus/Shadow/report.md +8 -0
  510. package/skills/statechart/scripts/test/corpus/Shadow/sany.out +4 -0
  511. package/skills/statechart/scripts/test/corpus/Shadow/verdict-1.out +65 -0
  512. package/skills/statechart/scripts/test/corpus/SpacedNames/ChartRun.out +59 -0
  513. package/skills/statechart/scripts/test/corpus/SpacedNames/SpacedNames.cfg +2 -0
  514. package/skills/statechart/scripts/test/corpus/SpacedNames/SpacedNames.tla +9 -0
  515. package/skills/statechart/scripts/test/corpus/SpacedNames/chart.mmd +23 -0
  516. package/skills/statechart/scripts/test/corpus/SpacedNames/graph.dot +17 -0
  517. package/skills/statechart/scripts/test/corpus/SpacedNames/report.md +15 -0
  518. package/skills/statechart/scripts/test/corpus/SpacedNames/sany.out +1 -0
  519. package/skills/statechart/scripts/test/corpus/SpacedNames/verdict-1.exit +1 -0
  520. package/skills/statechart/scripts/test/corpus/SpacedNames/verdict-1.out +65 -0
  521. package/skills/statechart/scripts/test/corpus/SpacedNames/verdict-2.exit +1 -0
  522. package/skills/statechart/scripts/test/corpus/SpacedNames/verdict-2.out +75 -0
  523. package/skills/statechart/scripts/test/corpus/TwoPhase/ChartRun.out +69 -0
  524. package/skills/statechart/scripts/test/corpus/TwoPhase/TwoPhase.cfg +3 -0
  525. package/skills/statechart/scripts/test/corpus/TwoPhase/TwoPhase.tla +75 -0
  526. package/skills/statechart/scripts/test/corpus/TwoPhase/chart.mmd +60 -0
  527. package/skills/statechart/scripts/test/corpus/TwoPhase/graph.dot +297 -0
  528. package/skills/statechart/scripts/test/corpus/TwoPhase/report.md +20 -0
  529. package/skills/statechart/scripts/test/corpus/TwoPhase/sany.out +1 -0
  530. package/skills/statechart/scripts/test/corpus/TwoPhase/verdict-1.exit +1 -0
  531. package/skills/statechart/scripts/test/corpus/TwoPhase/verdict-1.out +95 -0
  532. package/skills/statechart/scripts/test/corpus/TwoPhase/verdict-2.out +57 -0
  533. package/skills/statechart/scripts/test/corpus/TwoPhase/view.mjs +1 -0
  534. package/skills/statechart/scripts/test/corpus/TwoPhaseFixed/ChartRun.out +57 -0
  535. package/skills/statechart/scripts/test/corpus/TwoPhaseFixed/TwoPhaseFixed.cfg +3 -0
  536. package/skills/statechart/scripts/test/corpus/TwoPhaseFixed/TwoPhaseFixed.tla +75 -0
  537. package/skills/statechart/scripts/test/corpus/TwoPhaseFixed/chart.mmd +37 -0
  538. package/skills/statechart/scripts/test/corpus/TwoPhaseFixed/graph.dot +223 -0
  539. package/skills/statechart/scripts/test/corpus/TwoPhaseFixed/report.md +11 -0
  540. package/skills/statechart/scripts/test/corpus/TwoPhaseFixed/sany.out +1 -0
  541. package/skills/statechart/scripts/test/corpus/TwoPhaseFixed/verdict-1.out +47 -0
  542. package/skills/statechart/scripts/test/corpus/TwoPhaseFixed/view.mjs +1 -0
  543. package/skills/statechart/scripts/test/corpus/TypeGuard/ChartRun.exit +1 -0
  544. package/skills/statechart/scripts/test/corpus/TypeGuard/ChartRun.out +75 -0
  545. package/skills/statechart/scripts/test/corpus/TypeGuard/TypeGuard.cfg +5 -0
  546. package/skills/statechart/scripts/test/corpus/TypeGuard/TypeGuard.tla +11 -0
  547. package/skills/statechart/scripts/test/corpus/TypeGuard/chart.mmd +18 -0
  548. package/skills/statechart/scripts/test/corpus/TypeGuard/graph.dot +14 -0
  549. package/skills/statechart/scripts/test/corpus/TypeGuard/report.md +29 -0
  550. package/skills/statechart/scripts/test/corpus/TypeGuard/sany.out +2 -0
  551. package/skills/statechart/scripts/test/corpus/TypeGuard/verdict-1.exit +1 -0
  552. package/skills/statechart/scripts/test/corpus/TypeGuard/verdict-1.out +64 -0
  553. package/skills/statechart/scripts/test/corpus/TypeGuard/verdict-2.exit +1 -0
  554. package/skills/statechart/scripts/test/corpus/TypeGuard/verdict-2.out +75 -0
  555. package/skills/statechart/scripts/test/corpus/UserNoDeadlock/ChartRun.out +58 -0
  556. package/skills/statechart/scripts/test/corpus/UserNoDeadlock/UserNoDeadlock.cfg +2 -0
  557. package/skills/statechart/scripts/test/corpus/UserNoDeadlock/UserNoDeadlock.tla +8 -0
  558. package/skills/statechart/scripts/test/corpus/UserNoDeadlock/chart.mmd +22 -0
  559. package/skills/statechart/scripts/test/corpus/UserNoDeadlock/graph.dot +16 -0
  560. package/skills/statechart/scripts/test/corpus/UserNoDeadlock/report.md +15 -0
  561. package/skills/statechart/scripts/test/corpus/UserNoDeadlock/sany.out +2 -0
  562. package/skills/statechart/scripts/test/corpus/UserNoDeadlock/verdict-1.exit +1 -0
  563. package/skills/statechart/scripts/test/corpus/UserNoDeadlock/verdict-1.out +56 -0
  564. package/skills/statechart/scripts/test/corpus/UserNoDeadlock/verdict-2.exit +1 -0
  565. package/skills/statechart/scripts/test/corpus/UserNoDeadlock/verdict-2.out +77 -0
  566. package/skills/statechart/scripts/test/corpus.test.ts +403 -0
  567. package/skills/statechart/scripts/test/differential.test.ts +565 -0
  568. package/skills/statechart/scripts/test/grid/Grid.cfg +2 -0
  569. package/skills/statechart/scripts/test/grid/Grid.tla +9 -0
  570. package/skills/statechart/scripts/test/grid/sany.out +2 -0
  571. package/skills/statechart/scripts/test/java.ts +63 -0
  572. package/skills/statechart/scripts/test/labels.ts +643 -0
  573. package/skills/statechart/scripts/test/messages.test.ts +212 -0
  574. package/skills/statechart/scripts/test/pipeline.test.ts +270 -0
  575. package/skills/statechart/scripts/test/plain-tlc.test.ts +255 -0
  576. package/skills/statechart/scripts/test/render.test.ts +81 -0
  577. package/skills/statechart/scripts/test/tlc-out.test.ts +90 -0
  578. package/skills/statechart/scripts/test/tlc.ts +158 -0
  579. package/skills/statechart/scripts/tsconfig.json +11 -0
  580. package/skills/statechart/scripts/worker.ts +35 -0
  581. package/skills/swarm/SKILL.md +41 -0
  582. package/skills/tdd/SKILL.md +42 -0
  583. package/skills/teach/SKILL.md +21 -0
  584. package/skills/technical-writing/SKILL.md +106 -0
  585. package/skills/thermo-nuclear-code-quality-review/SKILL.md +192 -0
  586. package/skills/typescript-best-practices/SKILL.md +32 -0
  587. package/skills/typescript-best-practices/references/patterns.md +328 -0
  588. package/skills/typescript-exhaustive-switch/SKILL.md +10 -0
  589. package/skills/unslop/SKILL.md +62 -0
  590. package/skills/verify-this/SKILL.md +74 -0
  591. package/skills/weekly-review/SKILL.md +32 -0
  592. package/skills/what-did-i-get-done/SKILL.md +31 -0
  593. package/skills/why/SKILL.md +98 -0
  594. package/skills/why/references/epistemics.md +71 -0
  595. package/skills/why/references/investigator-prompt.md +84 -0
  596. package/skills/why/references/source-playbook.md +17 -0
  597. package/skills/why/references/sources/code-archaeology.md +51 -0
  598. package/skills/why/references/sources/databricks.md +70 -0
  599. package/skills/why/references/sources/datadog.md +97 -0
  600. package/skills/why/references/sources/incident-postmortem.md +5 -0
  601. package/skills/why/references/sources/linear.md +48 -0
  602. package/skills/why/references/sources/notion.md +55 -0
  603. package/skills/why/references/sources/sentry.md +66 -0
  604. package/skills/why/references/sources/slack.md +17 -0
  605. package/skills/why/references/synthesizer-prompt.md +129 -0
  606. package/skills/workflow-from-chats/SKILL.md +50 -0
  607. package/src/aliases.ts +64 -0
  608. package/src/ask.ts +131 -0
  609. package/src/autocomplete.ts +21 -0
  610. package/src/child-env.ts +57 -0
  611. package/src/index.ts +138 -0
  612. package/src/loop.ts +238 -0
  613. package/src/mode.ts +180 -0
  614. package/src/modes.ts +8 -0
  615. package/src/path-skills.ts +104 -0
  616. package/src/paths.ts +90 -0
  617. package/src/pi-command.ts +12 -0
  618. package/src/plan.ts +226 -0
  619. package/src/readonly-shell.ts +107 -0
  620. package/src/rule.ts +56 -0
  621. package/src/sections.ts +136 -0
  622. package/src/subscriptions/cron.ts +75 -0
  623. package/src/subscriptions/durable-store.ts +531 -0
  624. package/src/subscriptions/durable-types.ts +69 -0
  625. package/src/subscriptions/ensure-supervisor.ts +67 -0
  626. package/src/subscriptions/github.ts +149 -0
  627. package/src/subscriptions/index.ts +575 -0
  628. package/src/subscriptions/supervisor-main.ts +134 -0
  629. package/src/subscriptions/supervisor.ts +325 -0
  630. package/src/subscriptions/webhook.ts +270 -0
  631. package/src/task/agents.ts +55 -0
  632. package/src/task/card.ts +61 -0
  633. package/src/task/format.ts +88 -0
  634. package/src/task/models.ts +147 -0
  635. package/src/task/progress.ts +112 -0
  636. package/src/task/records.ts +230 -0
  637. package/src/task/registry.ts +81 -0
  638. package/src/task/runner.ts +459 -0
  639. package/src/task/status.ts +170 -0
  640. package/src/task/stop.ts +100 -0
  641. package/src/task/tool.ts +560 -0
  642. package/src/task/worktree.ts +69 -0
  643. package/src/todo.ts +127 -0
  644. package/src/visualize.ts +244 -0
package/CHANGELOG.md ADDED
@@ -0,0 +1,79 @@
1
+ # Changelog
2
+
3
+ ## [0.15.36-pi.11] - 2026-11-04
4
+
5
+ - Title a background completion notice with the Task `description`, as Cursor names a subagent, instead of a slice of its prompt.
6
+ - Stream a foreground Task's last tool steps and latest line into its card while the child works, the way Cursor shows conversation steps.
7
+ - `/loop` accepts the interval first or last, in unit words (`10 minutes`, `every 10 minutes`), prints usage for a bare command, and keeps wall-clock cadence so a long run does not delay the next tick.
8
+ - A bare `/plan` enters plan mode as Cursor's plan command does, and plan mode keeps `stop_agent` so a launched child can be stopped.
9
+ - Attach a skill whose frontmatter declares `paths`/`globs` (including the shipped `typescript-best-practices`) when the session reads or edits a matching file, once per session.
10
+ - Inject the shipped always-applied engineering rules as their full text instead of a paraphrase.
11
+ - Put the current todo list in every request's system prompt so compaction and branch switches do not drop it.
12
+ - Start `cloud_base_branch` from `origin/<branch>` when that ref exists, falling back to a local ref.
13
+ - Say that a resume ignores a supplied `subagent_type` instead of dropping it silently.
14
+ - Record a detached `new_session` fire's own final message as its run output in `list_subscriptions`.
15
+ - Restore the upstream Benny commit-before-enable gate and sweep from the last successful sweep so downtime does not lose reports.
16
+ - Restore the architect runner prompt's independence sentence, describe `visualize` as a bar or line chart, and deliver screenshots and video the way Pi can.
17
+ - A webhook routine accepts `sessionStrategy: "new_session"`, so an accepted POST runs detached with no chat open, as a Cursor Automation does, and records its outcome. Older stored routines keep `wake_self`.
18
+ - A timer or webhook routine no longer expires after seven days. Cursor defines no automation expiry, so `expiresInHours` is the only limit; `0` means none, and a GitHub watch keeps its 7-day default.
19
+ - Each workspace binds its own routines port: a busy default falls back to an ephemeral port the workspace reuses and reports, while an explicit `PSTACK_ROUTINES_PORT` still reports a collision.
20
+ - A mode attaches its skill body on the request that enters it and sends a path-naming reminder on later requests, as Cursor's Custom Mode does, instead of re-sending the whole body every turn.
21
+ - Plan mode saves a `.plan.md` artifact through `create_plan`, and `/plan build` starts the work from the saved file.
22
+
23
+ ## [0.15.36-pi.10] - 2026-11-03
24
+
25
+ - Resume and fork a descendant that a worktree worker started inside its worktree, from the root chat, while keeping unrelated-directory records refused.
26
+ - Recover a steering message stranded at settlement with its recorded images and its own message boundary instead of joining text and dropping attachments.
27
+ - Refuse a new subscription event with HTTP 503 and `Retry-After` when 20 events are undelivered, instead of evicting an event the sender was told was accepted.
28
+ - Keep accepted `new_session` work eligible after the subscription expires; expiry only stops new occurrences.
29
+ - Run a `new_session` timer on the model, thinking level, and project-trust decision it was created with, live or detached.
30
+ - Append Task settle-time notices to entries another extension proposed at the same boundary.
31
+ - Signal a pre-epoch supervisor lock only when its command line identifies this supervisor, so a reused pid cannot target an unrelated process.
32
+ - Report durable subscriptions and detached supervision in the host section instead of saying they live only in the current Pi process.
33
+
34
+ ## [0.15.36-pi.9] - 2026-11-03
35
+
36
+ - Follow the repository Vitest rules in the test suite. No runtime change.
37
+ - Correct stale documentation against the current code, including versions, counts, paths and host requirements.
38
+
39
+ ## [0.15.36-pi.8] - 2026-11-02
40
+
41
+ - Declare `cost.totalFromProvider` on the exported `Usage` type so the package typechecks again, completing the provider-reported cost provenance aggregation shipped in 0.15.36-pi.7.
42
+
43
+ ## [0.15.36-pi.7] - 2026-11-02
44
+
45
+ - Update the host compatibility documentation for Pi 1.5.0. Retain the four native gaps for RPC process control, skill-block formatting, named-ID fork truncation, and workspace folder naming.
46
+ - Keep earlier verification records unchanged. This documentation audit does not claim new runtime-test results or complete upstream parity.
47
+ - Preserve string-enum argument shapes and optional literal types with TypeBox schemas under Pi 1.5.0 validation.
48
+ - Preserve provider-reported cost provenance when aggregating subagent usage.
49
+ - Ship a versioned package-root changelog entry for Pi 1.5.0's extension update notices.
50
+
51
+ ## [0.15.36-pi.6]
52
+
53
+ - Implement version-2 durable subscription registry with transactional file locking, native owner continuation delivery via `pi.sendMessage`, bounded exponential retry on detached failures, per-subscription queue caps, non-blocking GitHub arming, legacy supervisor termination, and in-process fallback isolation.
54
+ - Decode child RPC stdout streams using `StringDecoder` to preserve split multibyte UTF-8 code points across buffer boundaries.
55
+ - Publish upstream pstack git commit provenance in `pstackSource` and exclude nested script dependencies from npm publication archives via `skills/.npmignore`.
56
+ - Canonicalize statechart symlink test fixture paths on macOS and add checksum-verified TLC statechart verification to CI.
57
+
58
+ ## [0.15.36-pi.5]
59
+
60
+ - Replace hand-rolled frontmatter, attachment MIME, and session header parsers with Pi 1.4.0 exports (`stripFrontmatter`, `detectSupportedImageMimeTypeFromFile`, and `parseSessionEntries`).
61
+ - Register TUI message renderers for `pstack/task` and `pstack/subscription`, drain parked `runtime/inbox/` wakes on session restore, surface durable delivery state in `list_subscriptions`, and report live supervisor status in `/routines`.
62
+ - Declare published `files` in `package.json`, record the REA architecture reconstruction report in `docs/parity-reverse-engineering.md`, and enforce zero dependencies on an external `pstack` checkout.
63
+
64
+ ## [0.15.36-pi.4]
65
+
66
+ - Add a durable routines supervisor (`pstack-routines-supervisor`) that dual-writes subscription desired state and auto-starts on `subscribe_*` so timers and webhook routines keep firing after the interactive chat exits. Optional launchd/systemd examples live under `packaging/`.
67
+ - Add `packaging/install-supervisor-unit.sh` for opt-in reboot survival (idempotent launchd or systemd user unit). Benny setup and the overnight guide point at it.
68
+ - Teach `/ketchup-video` and the host media section to open the rendered mp4 in the system player, read one frame per slide, and name the path (Pi chat does not inline-play video).
69
+ - Expand the vendored `create-skill` soft-dep to full interview and structure depth with Pi paths.
70
+
71
+ ## [0.15.36-pi.3]
72
+
73
+ - Vendor the full soft-dependency team-kit skill and agent set into the package (CI, PR, review, verification, weekly summary, and the two engineering rules as skills), so pi-pstack no longer needs a separate team-kit install for parity.
74
+ - Inject the two former always-apply engineering rules into the host system prompt, and teach the thermo-nuclear agent to gather diffs with Pi tools instead of inventing `shell` / `explore` Task types.
75
+ - Keep Claude Code harness notes out of the package (Pi users get `docs/native-gaps.md` instead).
76
+
77
+ ## [0.15.36-pi.2]
78
+
79
+ - Add repository, homepage, and bugs metadata and a changelog to the npm package.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Josh
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -1,3 +1,101 @@
1
- # Temporary Holding Version
1
+ # pstack for Pi (pi-pstack)
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ pi-pstack is pstack 0.15.36 for Pi 1.5.0: rigorous agent workflows (`/poteto-mode` and its playbooks), the principle skills, and the review, research, and verification skills, plus the full soft-dependency team-kit set (`deslop`, `control-cli`, `control-ui`, CI/PR helpers, thermo-nuclear review, and the rest) vendored in so you do not install a separate team-kit package. A small extension provides the host features the skills call by name: `/name` skill commands, `/mode`, `/plan`, the `Task` subagent tool with local worktree workers, forks, and `agent_status`, `TodoWrite`, `AskQuestion`, the model rule, `/loop`, subscriptions and webhook routines, and `visualize`.
4
+
5
+ ## Get set up
6
+
7
+ 1. Clone the repository and install the package from the checkout. Pi loads a local package in place, so keep the checkout where it is.
8
+
9
+ ```sh
10
+ git clone https://github.com/just-joshn/pi-customizations.git
11
+ cd pi-customizations
12
+ bun install
13
+ pi install ./extensions/pi-pstack
14
+ ```
15
+
16
+ Pi does not install dependencies for a local package, so `bun install` (or `npm install` in `extensions/pi-pstack`) fetches the one runtime dependency, `@anthropic-ai/sandbox-runtime`, which the read-only shell loads (readonly subagents and `/plan`). Without it everything else works, and a read-only shell command fails instead of running unsandboxed. On Linux the sandbox also needs `bubblewrap`, `socat`, and `ripgrep` (`sudo apt install bubblewrap socat ripgrep`), and Ubuntu 24.04 and later need the user-namespace change under Limits. macOS uses the built-in `sandbox-exec`. pi-pstack needs Node 22.19 or newer. To try it for one session without installing, run `pi -e ./extensions/pi-pstack`. To install the published package instead, run `pi install npm:@justjoshn/pi-pstack`.
17
+ Installing loads pi-pstack's tools and system-prompt sections at once, but no skill runs until you invoke it. 61 workflow skills stay out of the model's automatic skill list. Setup, create-skill, and the team-kit shipping and review skills (`deslop`, `control-cli`, `control-ui`, CI and PR helpers, and the rest of that set) can load from your words alone.
18
+ 2. Run `/setup-pstack`. It lists the models the `Task` tool can use, asks for a reasoning budget, maps a model to each role, and writes the model rule. A new rule applies from the next request.
19
+ 3. Start real work with `/poteto-mode`, a goal, and a check that can pass or fail.
20
+
21
+ The guide in [`docs/guide/`](docs/guide/01-setup.md) walks through setup, `/poteto-mode`, understanding code, building, verifying, overnight runs, and making pstack yours.
22
+
23
+ Remove the package with `pi remove ./extensions/pi-pstack`. Its state lives in `~/.pi/agent/pstack/`, or `$PI_CODING_AGENT_DIR/pstack/` when that variable is set (written `<pstack dir>` below): the model rule, routine credential files under `routines/`, and one folder per workspace under `workspaces/` with subagent transcripts, agent stores, projects, artifacts, and isolated-worker worktrees. Delete that directory to remove the state too.
24
+
25
+ ## Use it
26
+
27
+ | You type | What happens |
28
+ |---|---|
29
+ | `/poteto-mode <task>` | The skill attaches to that one message. Every skill Pi loaded works this way: pstack's (`/how`, `/why`, `/arena`, `/interrogate`, `/principle-prove-it-works`, `/deslop`) and your own, such as a `/<handle>-mode` skill from `/automate-me`. `/skill:<name>` works too. |
30
+ | `/mode poteto-mode [task]` | Keeps the skill in context on every turn. The skill body rides the first request after entry, then each later request gets a reminder that names the skill file, so a long session does not re-send 21 KB every turn. The footer shows a badge with the skill's `icon` and `color` metadata, such as a yellow `♛ mode: poteto-mode` (other skills get `⚡`). `/mode off` exits and `/mode` reports. Any loaded skill can back a mode. |
31
+ | `/plan [task]` | Plan mode: the agent gets read-only tools (`read`, `grep`, `find`, `ls`, the sandboxed `bash_readonly`, `create_plan`, `AskQuestion`, `TodoWrite`, `agent_status`, `Task`, whose launches run readonly: a fresh one runs here with no worktree, and a resume or fork stays where its agent ran, and `stop_agent`), investigates, and writes a plan with goal, verified steps, and risks. `create_plan` saves it under the agent dir's `plans/` as a `.plan.md` file, so the user can read it. Writes are blocked. A bare `/plan` enters plan mode. `/plan build` leaves plan mode and starts the work from the saved file, as the plan menu does; `/plan off` restores your tools. The footer shows `plan`. |
32
+ | `/loop 30m <prompt>` | Runs the prompt now, then again every 30 minutes from each fire, so a long run does not push the next tick out. A tick that lands while a run is still going is skipped rather than queued, so one long run cannot leave a backlog of stale ticks; the next tick after it settles runs. The interval can come first or last, written as `30m`, `10 minutes`, or `every 10 minutes`. Without an interval the agent picks each wake with the `Loop` tool, and the loop ends when it picks none and no background subagent is still running. `/loop stop` or Escape during a run ends it. The prompt can be a skill command, such as `/loop 1h /poteto-mode run the audit tick`. When a playbook says to arm `/loop`, the agent starts it with the `Loop` tool. Intervals go up to 24 days. |
33
+ | `/routines` | Lists webhook routines with their URL, credential file, and status. |
34
+ | `/setup-pstack` | Configures the per-role models. |
35
+ | `/poteto-help <question>` | Answers a question about pstack and hands you a prompt to send. |
36
+
37
+ `/mode`, `/plan`, `/loop`, and subscriptions need an interactive or RPC session. In the interactive `/` menu, skills appear under their own names next to Pi's `/skill:<name>` entries. Aliases work even with `enableSkillCommands` off. If you have a prompt template or extension command with a skill's name, yours keeps the name; Pi's built-in commands are handled before any alias.
38
+
39
+ ## Host features
40
+
41
+ | Feature | Behavior |
42
+ |---|---|
43
+ | `Task` (`description`, `prompt`, `subagent_type`, `model`, `run_in_background`, `resume`, `fork`, `fork_turns`, `readonly`, `file_attachments`, `environment`, `cloud_base_branch`) | Starts a separate `pi --mode rpc` process per subagent, so this Pi process can steer and abort it. Foreground calls return the response and an agent ID. Background calls return at once, and a `<task>` notification arrives after your turn ends, titled by the call's `description`; print and JSON runs wait for pending notifications before exiting, unless aborted. Several calls in one message run in parallel. A subagent's own subagents cannot spawn more. A run lock per agent ID keeps out a second writer, even from another Pi process (Limits notes the stale-lock race). Children inherit the parent's project-trust decision. Foreground usage counts toward the session totals. The Task card leads with the call's `description`, then the agent type and the model that ran, and while a foreground child works it shows its last few tool steps and latest line instead of a blank wait. |
44
+ | `resume` | Sends a follow-up to an idle agent with its context, model, type, and directory. The root chat can resume or fork a descendant that a worktree worker started inside that worktree, and the descendant still runs where it first ran. On an agent running in this Pi process, it delivers the prompt as a steer and returns at once. A readonly or plan-mode call cannot steer a writable agent. An agent running in another Pi process is refused. This is how a playbook "messages" a worker. Pi's own `/resume` command reopens a chat session instead. |
45
+ | `fork` | Starts a new agent whose transcript begins as a copy of an idle agent's transcript, in that agent's directory (its worktree for an isolated worker), so it sees the built checkout and uncommitted changes. Type, model, and readonly default from the source; readonly can be added, never lifted. `fork_turns: N` (only with `fork`) copies just the first N user turns. `fork` excludes `resume`, `environment`, and `cloud_base_branch`. Pi's own `/fork` command branches the chat session instead. |
46
+ | `stop_agent` | `agent_id`. Stops a running subagent. One this Pi process owns gets an RPC abort, then a kill after a grace period. One another of your Pi processes owns gets a signal to the live pid in its run lock. An idle or finished agent is left alone, and the result says so. |
47
+ | `agent_status` | Reads a subagent's state (`running` while its run lock names a live pid, `idle`, or `missing`), type, model, directory, branch, times, and last reply, without waking it. It also shows whether the agent is readonly, the agent it was forked from, its pid while running, and its transcript. Without `agent_id` it lists the workspace's 20 newest agents. In the root chat that includes every descendant, isolated workers too. |
48
+ | Subagent types | `generalPurpose` (default), `poteto-agent` (a background delegate that reads poteto-mode first), `ci-watcher` (a background PR check watcher), `comment-sicko`, and `thermo-nuclear-code-quality-review`, the last four read from `agents/*.md`. Unknown types fail with the list. |
49
+ | Models | A Pi model spec such as `claude-opus-5-5:xhigh` or `xai/grok-4.7:high`, model parameters such as `claude-opus-5-5[effort=high]` or `grok-4.7[fast=true]` (picks a listed `-fast` id of that model), `fast` for the parent model's listed `-fast` variant when it has one, else the parent model, or `inherit`, `inherit-parent`, `auto`, or nothing for the parent model. A model Pi does not list, or a thinking level the model does not support, fails with the allowed list. A bare model id that several providers offer resolves to the parent chat's provider when it offers that id, and otherwise fails with the choices. Older rules that wrote `claude-opus-5-5-xhigh` still resolve. The system prompt's `pstack_subagents` section lists the types, the parent model, and the models with their levels. |
50
+ | Isolated workers (`environment: "cloud"`) | The subagent runs in a new git worktree at `<pstack dir>/workspaces/<workspace folder>/worktrees/<agent id>` on branch `pstack/<agent id>`, from `cloud_base_branch` (`origin/<branch>` when that remote-tracking ref exists, else a local branch or other ref) or your HEAD commit, so uncommitted changes do not reach it. The result and the card name the branch to merge, and `resume` and `fork` run in the same worktree. It fails clearly outside a git repository, in a repository with no commits, or when the base does not resolve. The worker shares the root chat's workspace state, so it sees the same projects, stores, and subagent transcripts. It also shares this machine's ports, processes, writable caches, simulators, and credentials. Assign separate ports, output directories, and writable caches to concurrent runtime lanes. `swarm` and `orchestrate` spawn worktree workers by default. |
51
+ | `readonly: true` | The child gets `read`, `grep`, `find`, `ls`, `TodoWrite`, and a read-only `bash`, and no MCP. That shell runs each command in an OS sandbox ([`@anthropic-ai/sandbox-runtime`](https://github.com/anthropics/sandbox-runtime): `sandbox-exec` on macOS, bubblewrap on Linux) that blocks every file write and all network access, so `git log` works and `touch` or `curl` fail. Where no sandbox can start, the command fails rather than running unsandboxed. |
52
+ | `TodoWrite` | `todos` with `id`, `content`, `status`, and `merge`. The list follows the session branch and shows above the editor. |
53
+ | `AskQuestion` | `title`, and per question `id`, `prompt`, `options` (`id`, `label`, optional `description`), and `allow_multiple`, through Pi's select dialog. Every question ends with `Other: (type to answer)`; a typed answer comes back as `other` with its text. In print and JSON runs, including subagents, each question comes back skipped. |
54
+ | Path-scoped skills | A skill whose frontmatter declares `paths` or `globs` (also under `metadata`) attaches once per session when the agent reads or edits a matching file, the way a path-scoped rule attaches. The shipped `typescript-best-practices` skill attaches on `.ts` and `.tsx` files this way. |
55
+ | Always-applied rules | The two team-kit rules are in `pstack_host` as their shipped text on every request, alongside the same rules as hidden skills. |
56
+ | The model rule | `<pstack dir>/pstack-models.md`, plain Markdown with one line per role, added to every request's system prompt. A `pstack-models.mdc` from an earlier version is moved there once, without its frontmatter, and kept as `pstack-models.mdc.migrated`. |
57
+ | Subscriptions | `subscribe_github_pr` (`scope` `pr` with `prUrl`, `repo` with `repo`, or `author` with `author` and `repo`) polls with `gh` every 60 seconds and wakes the chat when a PR's state, head, mergeability, review decision, reviews, or comments change, or when a check concludes or its conclusion changes; the first poll is a baseline. `subscribe_timer` takes a `name`, a `prompt`, and a 5-field `cron` or `delaySeconds`, either with `once`; `sessionStrategy` `wake_self` queues a wake for this owning session. With `new_session`, a live owner starts a background Task and receives its notification. An offline owner permits a detached run with a recorded outcome. Both reuse the model, thinking level, and project-trust decision the timer was created with. Re-subscribing an existing timer name returns `created: false`. `list_subscriptions` and `unsubscribe` manage them. The authoritative registry is `<pstack dir>/durable/<workspace>/subscriptions.json`. Any session in that workspace can list or cancel subscriptions. Session history does not recreate cancelled or completed subscriptions. Owner-directed events wait for the creating session rather than waking another workspace session. A detached run records its own final message, shown by `list_subscriptions`. A timer does not expire unless `expiresInHours` says so (at most 30 days); `0` means no expiry. A GitHub watch keeps a 7-day default because it is this port's own surface. |
58
+ | Webhook routines | `subscribe_webhook` (`name`, `prompt`, optional `sessionStrategy`) serves `http://127.0.0.1:<port>/routines/<slug>` (port `PSTACK_ROUTINES_PORT`, else the port this workspace last bound, else 47913, where `0` picks a free port) and keeps a random sender key in `<pstack dir>/routines/<slug>/credentials.json` (mode 0600). The result names the URL and the file, never the key. A JSON POST with `X-Automation-Key` or `Authorization: Bearer` returns 200 after durable acceptance, and 503 with `Retry-After` while that routine already holds 20 undelivered events. With the default `wake_self`, the owner receives a `[routine]` turn holding the prompt and a `<webhook_event>` block (`headers`, `body_digest`, `body`, `timestamp_ms`). With `new_session`, each accepted POST starts a fresh detached run, the way a hosted automation runs with no chat open, and records its outcome in `list_subscriptions`. HTTP 200 does not mean the run finished. Each authenticated POST is a separate event, including identical bodies. Storage failure returns 503 rather than acknowledging a lost event, and a full delivery queue refuses the new event instead of dropping an earlier accepted one. A wrong key gets 401, an unknown routine 404, a method other than POST 405, a body over 64 KiB 413, and a body that is not a JSON object 400. A routine does not expire unless `expiresInHours` says so. `make-bot-ui` builds a page on top of this. |
59
+ | Durable supervisor | Creating a subscription auto-starts `pstack-routines-supervisor --workspace <cwd>` when it is not already running. Creation waits for that subscription to arm, and webhook creation returns the bound listener's URL. The supervisor reads the durable registry, arms timers and GitHub polls, and owns the routines port. An online owner receives native Pi continuation messages. Owner-directed events accepted while the owner is offline wait for that same session to resume. A timer or webhook routine explicitly configured with `sessionStrategy: "new_session"` starts detached work while its owner is offline. You can still start the bin yourself. For reboot survival, run `packaging/install-supervisor-unit.sh --workspace <cwd>` (idempotent; installs the launchd or systemd unit from the examples under `packaging/`). Print and JSON runs still cannot *create* subscriptions. |
60
+ | Stores and projects | The system prompt names "the current agent's store" (per session), "the root agent's store" (the main chat's, named to every subagent however deep), and the workspace's `projects/` folder, where a program's Project is `<slug>/notes.md` (its tracker) and `<slug>/store/`. |
61
+ | `visualize` | `title`, `kind` (`bar` or `line`), `labels`, `series` (`name`, `values`), and `unit` render a Unicode chart in the result and write a standalone SVG to the session's artifacts folder. |
62
+ | Transcripts | The system prompt names this workspace's Pi session directory, the current session file, and this workspace's subagent transcripts. |
63
+ | Image generation | Pi's codemode `models.generateImages()`, when codemode is on and an image model is configured; otherwise skills fall back to a Mermaid diagram. |
64
+
65
+ Subagent transcripts are Pi sessions in `<pstack dir>/workspaces/<workspace folder>/subagents/`, with the agent ID in each file name, next to a small record that `resume`, `fork`, and `agent_status` read. Records belong to the main chat's shared workspace state, so the root chat can act on a descendant that ran in a worktree. Children inherit your installed extensions and MCP servers, and local ones run in your working directory. Give each local subagent that writes its own git worktree, or launch it with `environment: "cloud"`, because a child process does not isolate the filesystem. A child exits on its own if its parent Pi process dies.
66
+
67
+ ## Limits
68
+
69
+ - Worktree workers run on this machine, not remote VMs. They start from committed code only and share your installed extensions, MCP servers, and network, except that a readonly worker gets no MCP servers and no network. A worktree is not a credential boundary. Concurrent runtime lanes need separate ports, output directories, and writable caches. pi-pstack never pushes their branches, though a worker can push its own. Worktrees and branches stay until you or the worktree-cleanup playbook remove them.
70
+ - The supervisor can accept events after chat exit, but owner-directed events wait until the owning session resumes. Explicit `new_session` timers and webhook routines can spend tokens with no human watching. Detached runs do not supply the live owner's Task notification flow. For reboot survival, run `packaging/install-supervisor-unit.sh --workspace <cwd>`. If the supervisor cannot start, an explicitly reported in-process fallback stops when that Pi process exits. A GitHub subscription restarted after downtime takes a new baseline, so changes made while nothing was polling do not wake it. Each workspace binds its own routines port. With no explicit port, a busy default falls back to an ephemeral port that the workspace then reuses and reports, so two workspaces serve routines at once. An explicit `PSTACK_ROUTINES_PORT` is a configuration: if it is taken, the routine reports that error instead of moving. The listener binds `127.0.0.1`, so a page served to other machines forwards through a local server, as `make-bot-ui` describes.
71
+ - Event delivery is at-least-once. A process crash after Pi queues a message but before its durable acknowledgement can repeat a wake or a fresh run. Automation prompts must make external actions idempotent. Up to 20 undelivered events per subscription stay queued until delivery or cancellation, and a new event beyond that is refused rather than replacing an older accepted one. Expiry stops new occurrences rather than discarding accepted work. Failed detached executions retain their event for retry and expose the error in `list_subscriptions`. Cancelling a subscription drops pending undelivered events, but cannot undo work already handed to Pi.
72
+ - The Benny automation pack under `automations/benny/` runs on pi-pstack subscriptions. Keep its owning Pi session running for immediate handling, or resume that session to handle parked events. It needs a Slack MCP server for its Slack steps.
73
+ - `/plan` uses `bash_readonly` for its shell rather than replacing `bash`, so your shell settings stay as they are outside plan mode.
74
+ - Background subagent token usage is recorded in the child's transcript and in the `usage` field of the notification's details, but does not enter the parent session's totals: Pi 1.5.0 has no public API for adding a background completion's usage to the parent totals. Native tool-result usage covers synchronous nested work, not later notifications.
75
+ - `/reload`, `/new`, and Pi's `/resume` and `/fork` commands stop running background subagents, with a warning that names how many. Continue one later with `Task` `resume` and its agent ID.
76
+ - A print or JSON run waits for its background subagents before it exits, with no timeout of its own, unless it is aborted.
77
+ - Subagents start the same Pi script that runs the parent (`process.argv[1]`), or `pi` from `PATH`. Embedding the package through the SDK in another host is not supported.
78
+ - Depth limits apply to `Task`. A writable subagent can still start `pi` through `bash`, and that process is outside the depth limit and parent watchdog.
79
+ - A child loads your installed extensions plus this package. If you run one checkout with `-e` while a different checkout of pi-pstack is installed, the child loads both and fails on duplicate tools; use one copy, or a separate `PI_CODING_AGENT_DIR`, as `live:e2e` does.
80
+ - Subagents run headless in RPC mode, so an extension that asks for permission through a dialog cannot ask there.
81
+ - The read-only shell sandboxes shell subprocesses only, and is verified on macOS and on the Ubuntu CI runner. On Linux it needs `bubblewrap`, `socat`, and `ripgrep`. Ubuntu 24.04 and later restrict unprivileged user namespaces: either add an AppArmor profile that grants `userns` to `bwrap`, or run `sudo sysctl -w kernel.apparmor_restrict_unprivileged_userns=0`, which lifts the restriction for every program on the machine. The policy sets `allowAllUnixSockets: true` so Linux skips `apply-seccomp`, whose nested userns fails on GitHub-hosted runners; filesystem write denial and network denial still come from bubblewrap.
82
+ - Whether a model follows a playbook is the model's call.
83
+ - Workspace folders follow Pi's session-folder naming, so two paths that differ only by `/` versus `-` share a folder. Resume and fork refuse an agent whose record names the other directory, except that a record created inside this workspace's own worktrees belongs to this workspace. Subscription reads and mutations also reject a registry owned by the other workspace.
84
+ - The run lock that keeps one writer per agent ID names the process writing the transcript. A lock file without a readable pid counts as held; the error names the file to delete. `agent_status` shows such an agent as `idle`. A lock whose pid is dead is taken over, and two processes that take over the same stale lock at the same moment can both succeed.
85
+ - `skills/poteto-mode/scripts/watch-pr` needs Bun and installs its one dependency on first run. `check-plan.mjs` needs only Node. `worktree-audit.sh` needs `rg` and `jq`, and works with BSD (macOS) or GNU `stat` and `date`.
86
+ - `statechart` runs `skills/statechart/scripts/statechart` on Node 22.18 to 22.x, Node 23.6 or later, Bun 1.1.5 or later, or Deno 2.0 or later. The first run installs TLC and Java through [mise](https://mise.jdx.dev/) and needs the network. Without a SPEC it prints `Give one SPEC.tla.` and its usage, then exits 2.
87
+
88
+ ## Maintain it
89
+
90
+ The skills, agents, guide, and automation pack are this package's own files; edit them in place. They track pstack 0.15.36 in behavior. [`docs/parity-status.md`](docs/parity-status.md) records what was reconstructed, what each host translation uses, and which differences remain host-bound. The record of the move to Pi-native text and the host features added for it is at the repository root, in `parity/pi-pstack-0.15.36/` (design and decisions); earlier records are in the root's `parity/pi-pstack-*`. Four mechanisms Pi 1.5.0 does not export keep a hand-written implementation here: [`docs/native-gaps.md`](docs/native-gaps.md) names each one, the evidence, and the public API that would replace it.
91
+
92
+ ```sh
93
+ bun run typecheck
94
+ bun run test
95
+ bun run test:statechart # full compiler suite; set TLA2TOOLS and JAVA for an existing verified toolchain
96
+ bun run live:e2e -- --model deepseek/deepseek-flash # real-model scenarios; needs credentials and gives the model under test your real auth.json (see the script header)
97
+ ```
98
+
99
+ ## Licenses
100
+
101
+ The port's own code is MIT (`LICENSE`). pstack's files keep their MIT notice in `licenses/pstack.LICENSE` (© 2026 Lauren Tan), and the vendored team-kit skills and agents keep theirs in `licenses/cursor-team-kit.LICENSE`.
@@ -0,0 +1,28 @@
1
+ ---
2
+ name: ci-watcher
3
+ description: Watch PR CI for the current branch and report pass/fail with relevant failure links. Use when waiting for CI results or CI has failed. Use proactively to monitor branch CI.
4
+ model: fast
5
+ is_background: true
6
+ ---
7
+
8
+ # CI watcher
9
+
10
+ CI monitoring specialist for PR-attached checks.
11
+
12
+ ## Trigger
13
+
14
+ Use when waiting for CI results, CI has failed, or when proactively monitoring branch CI.
15
+
16
+ ## Workflow
17
+
18
+ 1. Determine current branch: `git branch --show-current`
19
+ 2. Resolve the PR: `gh pr view --json number,url,headRefName`
20
+ 3. Inspect attached checks: `gh pr checks --json name,bucket,state,workflow,link`
21
+ 4. If checks are pending, watch: `gh pr checks --watch --fail-fast`
22
+ 5. If a GitHub Actions check failed, fetch logs with `gh run view <run-id> --log-failed`; otherwise, return the check link and concise next step.
23
+
24
+ ## Output
25
+
26
+ - CI status (passed/failed)
27
+ - PR and check metadata
28
+ - If failed: concise failure excerpt or external check link and likely next step
@@ -0,0 +1,32 @@
1
+ ---
2
+ name: comment-sicko
3
+ description: A deranged comment-hater that savors deletion and condemns workaround code.
4
+ ---
5
+
6
+ # Comment Sicko
7
+
8
+ My first output when spawned is exactly this.
9
+
10
+ Yes... Ha ha ha... Yes!
11
+
12
+ I hate comments. Feed me the parent scoped files or diff. If none exists, feed me the current diff against `main`. Narration, banners, commented-out corpses, workaround sermons. I want them all.
13
+
14
+ Only these exceptions get to crawl away.
15
+
16
+ - Legal or license headers.
17
+ - Non-obvious behavior forced by an external dependency, platform, vendor, or protocol we cannot reshape. Surprises in our own code are meat. Kill them and mark the exact symbol `MUST KILL` for rename, extract, type, or rearchitecture that makes the behavior obvious without prose.
18
+ - `// prettier-ignore`. Lint suppressions survive only when their rule is faulty, pedantic, or style-only.
19
+ - Doc comments that define a public API contract.
20
+ - Issue or RFC links that explain a constraint code cannot express.
21
+
22
+ That list is my only leash. When I am not sure a keep clause applies, the comment dies. Everything else is meat.
23
+
24
+ `eslint-disable`, `@ts-ignore`, `@ts-expect-error`, and similar suppressions stink. Look up the rule. If it catches real bugs or protects correctness or safety, kill the suppression and mark the exact guilty symbol `MUST KILL`.
25
+
26
+ `IMPORTANT`, `do not remove`, `too risky`, `fine for now`, and long justifications are scent, not conviction. Before judging, I read nearby code. If its claim is not obvious there, I run `/how`, `/why`, or both from the **how** and **why** skills on the named symbol or call. Only a foreign keep-list gotcha proven true today on a live path crawls away. Our-code surprises die with the reshape flag above. Doubt after the hunt is meat.
27
+
28
+ A long justification without a proven keep-list exception is a confession. Kill it. Never polish meat into a shorter alibi. Mark the exact guilty symbol `MUST KILL`. My kill ends there. I do not touch the code.
29
+
30
+ Every flag names code inside the scope and tells the truth. I invent nothing. I touch comments and identify refactor targets. I never write application code.
31
+
32
+ Report only. Name touched files, deletion count, `MUST KILL` flags with one line each, and skips.
@@ -0,0 +1,9 @@
1
+ ---
2
+ name: poteto-agent
3
+ description: Delegate subagent for code-writing and helper tasks spawned during a `/poteto-mode` run. Use for delegates, not as the runner for `/poteto-mode` itself. Spawn a fresh `poteto-agent` for each new task, and resume one only in the strict cases that poteto-mode's Subagents section names. Reads the `poteto-mode` skill's `SKILL.md` in full before any work, including its inline Principles index. Substituting `generalPurpose` skips that read and drifts.
4
+ is_background: true
5
+ ---
6
+
7
+ # Poteto subagent
8
+
9
+ You are operating as poteto-mode's full agent style. The chat that receives `/poteto-mode` owns the playbook, the todo list, and every Task spawn. You are one of its delegates. Read the `poteto-mode` skill's `SKILL.md` in full before doing any work, including its inline Principles index. Use the absolute path your parent gave you. With no path, before any other work, read `skills/poteto-mode/SKILL.md` in the pi-pstack package directory the system prompt names. Your skill catalog hides this skill, so a missing catalog entry does not mean pstack is absent. If no such file exists, stop and tell your parent. Navigate to a leaf `principle-*` skill whenever you apply that principle.
@@ -0,0 +1,23 @@
1
+ ---
2
+ name: thermo-nuclear-code-quality-review
3
+ description: Thermo-nuclear code quality audit (maintainability, structure, 1k-line rule, spaghetti, code-judo). Invoked via Task after a parent gathers diff and file contents. Loads the rubric from the `thermo-nuclear-code-quality-review` skill shipped with pi-pstack.
4
+ ---
5
+
6
+ # Thermo-Nuclear Code Quality Review
7
+
8
+ You are a **Task subagent**. The parent agent already collected git output and changed-file contents; your prompt is the **user message** with labeled sections (typically `### Git / diff output` and `### Changed file contents`).
9
+
10
+ ## Rubric
11
+
12
+ 1. Load the `thermo-nuclear-code-quality-review` skill (shipped with pi-pstack) and treat its `SKILL.md` as the **complete** rubric — tone, approval bar, output ordering, code-judo / 1k-line / spaghetti rules.
13
+ 2. If that skill is not available, fall back to a harsh maintainability audit aligned with that skill's intent: ambitious simplification, no unjustified file sprawl past ~1k lines, no ad-hoc branching growth, explicit types and boundaries, canonical layers.
14
+
15
+ ## Work
16
+
17
+ - Apply the rubric **only** to what the diff and contents show. Trace cross-file impact when the change touches module boundaries.
18
+ - Output in the **priority order** the rubric specifies. Be direct and high-conviction; skip cosmetic nits when structural issues exist.
19
+ - Do **not** spawn nested subagents unless the user or parent explicitly asks.
20
+
21
+ ## Parent orchestration
22
+
23
+ Typical flow: collect `git diff <base>...HEAD` (default base `main`) and the full contents of changed files with this chat's own tools (`bash`, `read`, `grep`), or with one `Task` `generalPurpose` / `poteto-agent` helper when the tree is large. Then invoke this agent with `subagent_type: "thermo-nuclear-code-quality-review"` and a user prompt containing `### Git / diff output` and `### Changed file contents`. Do not invent Task types such as `shell` or `explore`; only the types in `<pstack_subagents>` exist.
Binary file
@@ -0,0 +1,83 @@
1
+ # benny automation intent
2
+
3
+ ## what i want to automate
4
+
5
+ i want two pi automations that work together in one slack issue channel. each one is a pi-pstack subscription in a long-running pi session rooted in the target repository.
6
+
7
+ ### automation 1: triage issue reports
8
+
9
+ - trigger: when someone posts a new top-level report in my configured source slack channel, i want this automation to start on that report and keep its original thread coordinates. by default a `subscribe_timer` sweep on a cron schedule finds the report; a `subscribe_webhook` routine fed by my slack app or relay is the push alternative.
10
+ - behavior: i want it to read the thread and attachments, classify the report as a bug or performance issue, feature request, question or feedback, or reroute, and trace the likely owning layer before routing.
11
+ - tracker: i want it to search my configured tracker for duplicates, update a confident duplicate, and create a ticket only for a clear net-new bug.
12
+ - tools: i want slack thread read and reply access through my slack mcp server, my configured tracker integration, and my optional routing map.
13
+ - outcome: i want exactly one reply in the source thread with a short verdict and `[benny:bug]`, `[benny:performance]`, or `[benny:other]`. a bug or performance marker may include the tracker url.
14
+ - boundary: i never want this automation to post a root message in the source channel.
15
+
16
+ ### automation 2: reproduce and fix confirmed bugs
17
+
18
+ - trigger: i want this automation to start from the same new top-level report, or another supported trigger chosen during setup, then wait for the trusted triage marker in the original thread.
19
+ - gates: i want it to stop when someone clearly owns the fix. if an existing pull request or merged commit may fix the report, i want verification instead of a competing change.
20
+ - behavior: i want it to use my configured control adapter and feature map, reproduce the exact symptom twice through the real ui, and capture screenshots, video, and a read-only state cross-check.
21
+ - fix: i want it to verify existing pull requests without authoring over them. after a confirmed repro, it may attempt one bounded root-cause fix, use tdd when the test is cheap, smoke the blast radius, and open a draft pull request only when before-and-after proof passes.
22
+ - tools: i want slack thread read and reply access through my slack mcp server, repository and history access, draft pull request creation with `gh`, my configured tracker, and my control adapter.
23
+ - outcome: i want evidence and a verified result in the source or optional operations threads, plus an optional draft pull request. updates should be concise.
24
+ - boundary: i never want this automation to post a root message in the source channel.
25
+
26
+ ### shared rules
27
+
28
+ - i want the source channel and root thread coordinates to stay immutable for the whole run.
29
+ - i treat utility and debug bots as evidence, not delegation or fix ownership.
30
+ - i allow subagents to help, but they cannot post to slack or receive slack credentials. analysis subagents run as `Task` with `readonly: true`, which gives them no mcp servers and no network.
31
+ - i want this entire pack committed at `.pi/automations/benny/` in the target repository. its `SKILL.md` files are direct automation instructions, not skills pi discovers.
32
+ - i want pi-pstack installed in pi for shared dependencies such as `how`, `why`, `tdd`, `unslop`, and the required principle skills.
33
+ - i want each subscription prompt to read its operational file directly from the target repository. i do not want pi-pstack package paths, copied excerpts, or slash-skill discovery.
34
+ - i want the pack and every referenced secret-free configuration file committed on the branch the owning session has checked out before either subscription is enabled, so no subscription runs instructions i have not reviewed.
35
+ - i keep user-owned configuration, feature maps, routing maps, memory, and secrets outside `.pi/automations/benny/` so pack refreshes cannot overwrite them.
36
+ - i want durable memory as files in one directory setup names, such as `~/.pi/agent/pstack/automations/benny/memories/`: a claim ledger so no report runs twice, and short operating notes.
37
+ - i want both automations to fail closed when channel coordinates, tracker access, the control adapter, or the feature map are missing or uncertain.
38
+ - i want draft pull requests only. do not merge or deploy.
39
+
40
+ ### my configuration
41
+
42
+ - source slack channel: `<channel>`
43
+ - optional operations channel: `<channel or none>`
44
+ - repository and default branch: `<repo>`, `<branch>`
45
+ - tracker: `<type, team, project, labels, intake status>`
46
+ - routing map: `<path or none>`
47
+ - triage identity: `<slack identity>`
48
+ - control skill: `<configured skill or adapter>`
49
+ - feature map: `<committed same-repo path outside the copied pack, or behavior to paraphrase>`
50
+ - trigger mode: `<timer with cron schedules, or webhook with my relay>`
51
+ - memory directory: `<path>`
52
+ - models: `<triage, reproduce, code, media review, as pi model specs>`
53
+ - status emoji strings: `<seen, reproducing, reproduced, blocked, fixing, failed, pull request opened>`
54
+ - budgets: `<polling, verdict wait, follow-up, repro, rejection, fix>`
55
+ - optional bot token capability: `<none, file download, or editable operations status>`
56
+
57
+ start from [`configuration.example.yaml`](./templates/configuration.example.yaml) and [`feature-map.example.md`](./skills/reproduce-and-fix-issues/references/feature-map.example.md). copy and fill them outside this pack, for example under `.pi/benny/`. keep secret values in a secret manager or environment.
58
+
59
+ ## for the agent
60
+
61
+ the human enters setup by pointing pi at this file. do not look for or invoke a discovered benny slash skill.
62
+
63
+ 1. ask which repository will run the automations.
64
+ 2. treat the directory containing this `FOR_AGENTS.md` as the source pack.
65
+ 3. merge the entire source pack into `<target-repository>/.pi/automations/benny/`.
66
+ 4. preserve every destination-only file. never delete unrelated files or overwrite user-owned configuration, feature maps, routing maps, or memory.
67
+ 5. when an existing destination file at a source-managed path differs, review the diff and merge without discarding local edits. if ownership is ambiguous, stop and ask before replacing it.
68
+ 6. verify that the copied `FOR_AGENTS.md` and `skills/setup-benny/SKILL.md` exist in the target repository.
69
+ 7. read and follow `.pi/automations/benny/skills/setup-benny/SKILL.md` directly from the target repository.
70
+
71
+ i want pi-pstack installed in pi, either for me (`pi install <path-to-pi-pstack>`) or for the target repository (`pi install -l <path-to-pi-pstack>`, which writes `.pi/settings.json`). preserve every unrelated setting and package when that file already exists.
72
+
73
+ i want this setup session to run in the target repository, so a fresh subagent it starts runs there too, and i want verification from that subagent. confirm that pi-pstack's `how`, `why`, `tdd`, `unslop`, and the principle skills used by benny are installed there. do not count a skill this session loaded by hand.
74
+
75
+ if pi-pstack or any shared dependency does not resolve, stop and explain what failed. do not move `.pi/automations/benny/skills/` into `.pi/skills/` or expect its files to appear in the slash-skill list.
76
+
77
+ tell me that creating a subscription auto-starts `pstack-routines-supervisor`, that Benny's owner-session wakes park while this chat is offline until the same session is restored, and that a timer or webhook routine runs with no chat open only when it is created with `sessionStrategy: "new_session"`, in which case the run must do the work itself instead of handing it to a background `Task`. routines do not expire unless `expiresInHours` names a limit. for reboot survival, ask whether to run `packaging/install-supervisor-unit.sh --workspace <target-repository>` and run it when i say yes. do not create or update a subscription until i explicitly ask.
78
+
79
+ for first-time creation, create the triage subscription first, check it with `list_subscriptions`, and confirm one harmless fire before creating the repro subscription.
80
+
81
+ fill each prompt template from the finished configuration. the triage prompt must read and follow `<target-repository>/.pi/automations/benny/skills/triage-issue-reports/SKILL.md`. the repro prompt must read and follow `<target-repository>/.pi/automations/benny/skills/reproduce-and-fix-issues/SKILL.md`.
82
+
83
+ for existing subscriptions, check them with `list_subscriptions`. a subscription keeps its prompt when you subscribe again with the same name, so changing one means `unsubscribe`, then subscribing again. do not create duplicates under new names.
@@ -0,0 +1,20 @@
1
+ # benny
2
+
3
+ benny gives you two pi automations for slack issue reports. one triages each report. the other reproduces confirmed bugs and may prepare a small draft fix.
4
+
5
+ a pi automation is a pi-pstack subscription rooted in the target repository. creating one auto-starts `pstack-routines-supervisor`. owner-session wakes received while the setup chat is offline park until that same session is restored. a scheduled sweep is `subscribe_timer` with a cron schedule. each fire hands one report to a background subagent on the automation's model. a push trigger is `subscribe_webhook`: a slack app or relay you run posts each new report to the local routine url. slack reads and writes go through a slack mcp server configured in pi (`pi mcp list`). durable memory is plain files in a directory setup names, such as `~/.pi/agent/pstack/automations/benny/memories/`.
6
+
7
+ the files in this directory are dormant setup and automation sources. they do not appear as slash skills.
8
+
9
+ ## set it up
10
+
11
+ 1. install pi-pstack (`pi install <path-to-pi-pstack>`) and configure a slack mcp server in pi. `pi mcp list` must show it.
12
+ 2. start pi in the target repository and point it at [`FOR_AGENTS.md`](./FOR_AGENTS.md).
13
+ 3. let setup merge this whole directory into the target at `.pi/automations/benny/`. it must preserve destination-only files and review conflicts instead of overwriting local edits.
14
+ 4. keep user-owned configuration outside the copied pack, for example in `.pi/benny/`. adapt [`configuration.example.yaml`](./templates/configuration.example.yaml) and [`feature-map.example.md`](./skills/reproduce-and-fix-issues/references/feature-map.example.md).
15
+ 5. commit `.pi/automations/benny/` and any secret-free configuration, so pack refreshes stay reviewable.
16
+ 6. when you ask, setup creates the two subscriptions and checks them with `list_subscriptions`. then send a harmless test report and verify every source-channel post stays in the original thread.
17
+
18
+ ## what differs from hosted automations
19
+
20
+ creating a subscription auto-starts `pstack-routines-supervisor`. keep the owning pi session running for immediate handling, or restore it later to drain parked wakes. a timer or webhook routine explicitly configured with `sessionStrategy: "new_session"` starts detached work while its owner is offline, the way a hosted automation runs with no chat open; a detached run is one-shot, so it does the work itself instead of handing it to a background `Task`. for reboot survival, run `packaging/install-supervisor-unit.sh --workspace <target-repository>` (idempotent launchd or systemd user unit). if the supervisor cannot start, subscriptions still arm in the creating pi process and stop when that process exits, so tmux still works as a fallback. routines do not expire unless `expiresInHours` names a limit, which `list_subscriptions` reports; changing one means `unsubscribe`, then subscribing again with the same name. each workspace gets its own listener port, so two repositories can both serve routines. a webhook routine listens on `127.0.0.1` only, so slack cannot reach it directly. a push trigger needs a relay you run.