pi-t3-pstack 0.0.0-stage → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (598) hide show
  1. package/LICENSE +23 -0
  2. package/index.ts +87 -0
  3. package/package.json +62 -4
  4. package/pstack/.claude-plugin/icon.png +0 -0
  5. package/pstack/.claude-plugin/plugin.json +35 -0
  6. package/pstack/.codex-plugin/plugin.json +50 -0
  7. package/pstack/README.md +26 -0
  8. package/pstack/agents/comment-sicko.md +32 -0
  9. package/pstack/agents/poteto-agent.md +8 -0
  10. package/pstack/agents/thermo-nuclear-code-quality-review-subagent.md +23 -0
  11. package/pstack/agents/thermo-nuclear-review-subagent.md +28 -0
  12. package/pstack/assets/pstack-icon.png +0 -0
  13. package/pstack/assets/pstack-icon.prompt.txt +8 -0
  14. package/pstack/hooks/codex-hooks.json +16 -0
  15. package/pstack/hooks/hooks.json +15 -0
  16. package/pstack/hooks/session-start-context.md +17 -0
  17. package/pstack/hooks/session-start.ps1 +33 -0
  18. package/pstack/hooks/session-start.sh +34 -0
  19. package/pstack/models.json +261 -0
  20. package/pstack/skills/architect/SKILL.md +85 -0
  21. package/pstack/skills/architect/references/design-red-flags.md +57 -0
  22. package/pstack/skills/architect/references/rationale-template.md +35 -0
  23. package/pstack/skills/architect/references/runner-prompt.md +20 -0
  24. package/pstack/skills/arena/SKILL.md +55 -0
  25. package/pstack/skills/automate-me/SKILL.md +104 -0
  26. package/pstack/skills/benchmark-checklist/SKILL.md +39 -0
  27. package/pstack/skills/blast-radius/SKILL.md +50 -0
  28. package/pstack/skills/bro/SKILL.md +7 -0
  29. package/pstack/skills/correct/SKILL.md +32 -0
  30. package/pstack/skills/create-formal-verification-skill/SKILL.md +43 -0
  31. package/pstack/skills/create-verification-skill/SKILL.md +44 -0
  32. package/pstack/skills/create-verification-skill/references/feature-map-example/README.md +47 -0
  33. package/pstack/skills/create-verification-skill/references/feature-map-example/create-note.md +39 -0
  34. package/pstack/skills/create-verification-skill/references/feature-map-example/search.md +45 -0
  35. package/pstack/skills/deslop/SKILL.md +22 -0
  36. package/pstack/skills/figure-it-out/SKILL.md +52 -0
  37. package/pstack/skills/fix-ci/SKILL.md +29 -0
  38. package/pstack/skills/fix-merge-conflicts/SKILL.md +32 -0
  39. package/pstack/skills/get-pr-comments/SKILL.md +23 -0
  40. package/pstack/skills/how/SKILL.md +43 -0
  41. package/pstack/skills/how/references/explainer-prompt.md +55 -0
  42. package/pstack/skills/how/references/explorer-prompt.md +35 -0
  43. package/pstack/skills/in-your-own-words/SKILL.md +7 -0
  44. package/pstack/skills/interrogate/SKILL.md +37 -0
  45. package/pstack/skills/ketchup/SKILL.md +43 -0
  46. package/pstack/skills/ketchup-video/SKILL.md +29 -0
  47. package/pstack/skills/maintain-formal-verification-skill/SKILL.md +58 -0
  48. package/pstack/skills/maintain-verification-skill/SKILL.md +39 -0
  49. package/pstack/skills/make-pr-easy-to-review/SKILL.md +59 -0
  50. package/pstack/skills/no-comments/SKILL.md +24 -0
  51. package/pstack/skills/poteto-help/SKILL.md +162 -0
  52. package/pstack/skills/poteto-help/references/prompting.md +51 -0
  53. package/pstack/skills/poteto-help/references/recipes.md +51 -0
  54. package/pstack/skills/poteto-mode/SKILL.md +186 -0
  55. package/pstack/skills/poteto-mode/brief.md +70 -0
  56. package/pstack/skills/poteto-mode/playbooks/authoring-a-skill.md +12 -0
  57. package/pstack/skills/poteto-mode/playbooks/autonomous-run.md +13 -0
  58. package/pstack/skills/poteto-mode/playbooks/autopilot-full.md +25 -0
  59. package/pstack/skills/poteto-mode/playbooks/autopilot-stack.md +8 -0
  60. package/pstack/skills/poteto-mode/playbooks/babysit.md +23 -0
  61. package/pstack/skills/poteto-mode/playbooks/bug-fix.md +15 -0
  62. package/pstack/skills/poteto-mode/playbooks/eval.md +25 -0
  63. package/pstack/skills/poteto-mode/playbooks/feature.md +21 -0
  64. package/pstack/skills/poteto-mode/playbooks/hillclimb.md +21 -0
  65. package/pstack/skills/poteto-mode/playbooks/investigation.md +14 -0
  66. package/pstack/skills/poteto-mode/playbooks/multi-phase-plan.md +155 -0
  67. package/pstack/skills/poteto-mode/playbooks/opening-a-pr.md +34 -0
  68. package/pstack/skills/poteto-mode/playbooks/orchestrate.md +25 -0
  69. package/pstack/skills/poteto-mode/playbooks/pause-safely.md +10 -0
  70. package/pstack/skills/poteto-mode/playbooks/perf-issue.md +25 -0
  71. package/pstack/skills/poteto-mode/playbooks/prototype.md +14 -0
  72. package/pstack/skills/poteto-mode/playbooks/refactoring.md +16 -0
  73. package/pstack/skills/poteto-mode/playbooks/runtime-forensics.md +11 -0
  74. package/pstack/skills/poteto-mode/playbooks/session-pickup.md +11 -0
  75. package/pstack/skills/poteto-mode/playbooks/shipping.md +12 -0
  76. package/pstack/skills/poteto-mode/playbooks/trace-forensics.md +14 -0
  77. package/pstack/skills/poteto-mode/playbooks/visual-parity.md +11 -0
  78. package/pstack/skills/poteto-mode/playbooks/worktree-cleanup.md +12 -0
  79. package/pstack/skills/poteto-mode/references/bugbot-triage.md +142 -0
  80. package/pstack/skills/poteto-mode/references/licenses/LICENSE +23 -0
  81. package/pstack/skills/poteto-mode/references/licenses/LICENSE-cursor-team-kit +21 -0
  82. package/pstack/skills/poteto-mode/references/licenses/LICENSE-thermos +21 -0
  83. package/pstack/skills/poteto-mode/references/licenses/NOTICE.md +14 -0
  84. package/pstack/skills/poteto-mode/scripts/.prettierrc.json +3 -0
  85. package/pstack/skills/poteto-mode/scripts/bootstrap.ts +62 -0
  86. package/pstack/skills/poteto-mode/scripts/bun.lock +67 -0
  87. package/pstack/skills/poteto-mode/scripts/check-plan.mjs +205 -0
  88. package/pstack/skills/poteto-mode/scripts/check-plan.test.ts +110 -0
  89. package/pstack/skills/poteto-mode/scripts/package.json +12 -0
  90. package/pstack/skills/poteto-mode/scripts/resolve-codex-transcript +4 -0
  91. package/pstack/skills/poteto-mode/scripts/resolve-codex-transcript.ts +314 -0
  92. package/pstack/skills/poteto-mode/scripts/test-utils/node-test.ts +204 -0
  93. package/pstack/skills/poteto-mode/scripts/watch-pr/cli.test.ts +225 -0
  94. package/pstack/skills/poteto-mode/scripts/watch-pr/cli.ts +231 -0
  95. package/pstack/skills/poteto-mode/scripts/watch-pr/fakes.test-helper.ts +142 -0
  96. package/pstack/skills/poteto-mode/scripts/watch-pr/github.test.ts +498 -0
  97. package/pstack/skills/poteto-mode/scripts/watch-pr/github.ts +760 -0
  98. package/pstack/skills/poteto-mode/scripts/watch-pr/policy.test.ts +483 -0
  99. package/pstack/skills/poteto-mode/scripts/watch-pr/policy.ts +1023 -0
  100. package/pstack/skills/poteto-mode/scripts/watch-pr/render.ts +188 -0
  101. package/pstack/skills/poteto-mode/scripts/watch-pr/settle.test.ts +552 -0
  102. package/pstack/skills/poteto-mode/scripts/watch-pr/settle.ts +406 -0
  103. package/pstack/skills/poteto-mode/scripts/watch-pr/tsconfig.json +18 -0
  104. package/pstack/skills/poteto-mode/scripts/watch-pr/types.compile.ts +93 -0
  105. package/pstack/skills/poteto-mode/scripts/watch-pr/types.ts +444 -0
  106. package/pstack/skills/poteto-mode/scripts/watch-pr/verdicts.test.ts +796 -0
  107. package/pstack/skills/poteto-mode/scripts/watch-pr/watch-pr +3 -0
  108. package/pstack/skills/poteto-mode/scripts/worktree-audit.sh +170 -0
  109. package/pstack/skills/principle-attack-the-premise/SKILL.md +21 -0
  110. package/pstack/skills/principle-boundary-discipline/SKILL.md +34 -0
  111. package/pstack/skills/principle-build-the-lever/SKILL.md +23 -0
  112. package/pstack/skills/principle-encode-lessons-in-structure/SKILL.md +11 -0
  113. package/pstack/skills/principle-exhaust-the-design-space/SKILL.md +9 -0
  114. package/pstack/skills/principle-experience-first/SKILL.md +19 -0
  115. package/pstack/skills/principle-explain-the-number/SKILL.md +18 -0
  116. package/pstack/skills/principle-fix-root-causes/SKILL.md +21 -0
  117. package/pstack/skills/principle-foundational-thinking/SKILL.md +21 -0
  118. package/pstack/skills/principle-guard-the-context-window/SKILL.md +12 -0
  119. package/pstack/skills/principle-laziness-protocol/SKILL.md +10 -0
  120. package/pstack/skills/principle-make-operations-idempotent/SKILL.md +22 -0
  121. package/pstack/skills/principle-migrate-callers-then-delete-legacy-apis/SKILL.md +14 -0
  122. package/pstack/skills/principle-minimize-reader-load/SKILL.md +18 -0
  123. package/pstack/skills/principle-model-the-domain/SKILL.md +24 -0
  124. package/pstack/skills/principle-never-block-on-the-human/SKILL.md +15 -0
  125. package/pstack/skills/principle-outcome-oriented-execution/SKILL.md +21 -0
  126. package/pstack/skills/principle-prove-it-works/SKILL.md +22 -0
  127. package/pstack/skills/principle-redesign-from-first-principles/SKILL.md +16 -0
  128. package/pstack/skills/principle-separate-before-serializing-shared-state/SKILL.md +16 -0
  129. package/pstack/skills/principle-sequence-verifiable-units/SKILL.md +17 -0
  130. package/pstack/skills/principle-subtract-before-you-add/SKILL.md +18 -0
  131. package/pstack/skills/principle-test-behavior-not-implementation/SKILL.md +20 -0
  132. package/pstack/skills/principle-type-system-discipline/SKILL.md +13 -0
  133. package/pstack/skills/recall/SKILL.md +35 -0
  134. package/pstack/skills/reflect/SKILL.md +86 -0
  135. package/pstack/skills/reflect/references/divergent-reviewer.md +38 -0
  136. package/pstack/skills/reflect/references/judgment-reviewer.md +37 -0
  137. package/pstack/skills/reflect/references/synthesizer.md +56 -0
  138. package/pstack/skills/reflect/references/tooling-reviewer.md +48 -0
  139. package/pstack/skills/reflect/scripts/find-transcript.mjs +245 -0
  140. package/pstack/skills/setup-pstack/SKILL.md +77 -0
  141. package/pstack/skills/setup-pstack/scripts/read-sheet.sh +14 -0
  142. package/pstack/skills/setup-pstack/scripts/t3-sheet.mjs +169 -0
  143. package/pstack/skills/sharpen/SKILL.md +16 -0
  144. package/pstack/skills/show-me-your-work/SKILL.md +82 -0
  145. package/pstack/skills/show-me-your-work/references/decision-log-template.tsv +1 -0
  146. package/pstack/skills/show-me-your-work/scripts/log.sh +42 -0
  147. package/pstack/skills/statechart/SKILL.md +82 -0
  148. package/pstack/skills/statechart/references/render.md +93 -0
  149. package/pstack/skills/statechart/scripts/backends/cfg.ts +33 -0
  150. package/pstack/skills/statechart/scripts/backends/mermaid.ts +201 -0
  151. package/pstack/skills/statechart/scripts/backends/plain-text.ts +72 -0
  152. package/pstack/skills/statechart/scripts/backends/report.ts +177 -0
  153. package/pstack/skills/statechart/scripts/frontends/config.ts +276 -0
  154. package/pstack/skills/statechart/scripts/frontends/dot.ts +74 -0
  155. package/pstack/skills/statechart/scripts/frontends/marks.ts +93 -0
  156. package/pstack/skills/statechart/scripts/frontends/messages.ts +52 -0
  157. package/pstack/skills/statechart/scripts/frontends/spec.ts +114 -0
  158. package/pstack/skills/statechart/scripts/frontends/trace.ts +24 -0
  159. package/pstack/skills/statechart/scripts/frontends/value.ts +166 -0
  160. package/pstack/skills/statechart/scripts/frontends/verdict.ts +40 -0
  161. package/pstack/skills/statechart/scripts/frontends/view.ts +119 -0
  162. package/pstack/skills/statechart/scripts/ir.ts +547 -0
  163. package/pstack/skills/statechart/scripts/package.json +11 -0
  164. package/pstack/skills/statechart/scripts/passes/annotate.ts +128 -0
  165. package/pstack/skills/statechart/scripts/passes/label.ts +269 -0
  166. package/pstack/skills/statechart/scripts/passes/lift.ts +85 -0
  167. package/pstack/skills/statechart/scripts/passes/loop-check.ts +68 -0
  168. package/pstack/skills/statechart/scripts/passes/paths.ts +60 -0
  169. package/pstack/skills/statechart/scripts/passes/reach.ts +135 -0
  170. package/pstack/skills/statechart/scripts/passes/region-check.ts +97 -0
  171. package/pstack/skills/statechart/scripts/passes/regions.ts +295 -0
  172. package/pstack/skills/statechart/scripts/pipeline.ts +76 -0
  173. package/pstack/skills/statechart/scripts/run.ts +481 -0
  174. package/pstack/skills/statechart/scripts/statechart +29 -0
  175. package/pstack/skills/statechart/scripts/statechart.ts +164 -0
  176. package/pstack/skills/statechart/scripts/test/ConfigOracle.java +63 -0
  177. package/pstack/skills/statechart/scripts/test/chart.test.ts +1210 -0
  178. package/pstack/skills/statechart/scripts/test/charts/Braces.mmd +7 -0
  179. package/pstack/skills/statechart/scripts/test/charts/Escapes.mmd +11 -0
  180. package/pstack/skills/statechart/scripts/test/charts/Phases.mmd +29 -0
  181. package/pstack/skills/statechart/scripts/test/cli.test.ts +1314 -0
  182. package/pstack/skills/statechart/scripts/test/config-fuzz.test.ts +263 -0
  183. package/pstack/skills/statechart/scripts/test/corpus/Counter/ChartRun.out +57 -0
  184. package/pstack/skills/statechart/scripts/test/corpus/Counter/Counter.cfg +3 -0
  185. package/pstack/skills/statechart/scripts/test/corpus/Counter/Counter.tla +10 -0
  186. package/pstack/skills/statechart/scripts/test/corpus/Counter/chart.mmd +9 -0
  187. package/pstack/skills/statechart/scripts/test/corpus/Counter/graph.dot +16 -0
  188. package/pstack/skills/statechart/scripts/test/corpus/Counter/report.md +7 -0
  189. package/pstack/skills/statechart/scripts/test/corpus/Counter/sany.out +2 -0
  190. package/pstack/skills/statechart/scripts/test/corpus/Counter/verdict-1.out +49 -0
  191. package/pstack/skills/statechart/scripts/test/corpus/CounterAction/ChartRun.out +60 -0
  192. package/pstack/skills/statechart/scripts/test/corpus/CounterAction/CounterAction.cfg +4 -0
  193. package/pstack/skills/statechart/scripts/test/corpus/CounterAction/CounterAction.tla +22 -0
  194. package/pstack/skills/statechart/scripts/test/corpus/CounterAction/chart.mmd +26 -0
  195. package/pstack/skills/statechart/scripts/test/corpus/CounterAction/graph.dot +19 -0
  196. package/pstack/skills/statechart/scripts/test/corpus/CounterAction/report.md +20 -0
  197. package/pstack/skills/statechart/scripts/test/corpus/CounterAction/sany.out +2 -0
  198. package/pstack/skills/statechart/scripts/test/corpus/CounterAction/verdict-1.exit +1 -0
  199. package/pstack/skills/statechart/scripts/test/corpus/CounterAction/verdict-1.out +56 -0
  200. package/pstack/skills/statechart/scripts/test/corpus/CounterAction/verdict-2.exit +1 -0
  201. package/pstack/skills/statechart/scripts/test/corpus/CounterAction/verdict-2.out +82 -0
  202. package/pstack/skills/statechart/scripts/test/corpus/CounterAction/verdict-3.out +57 -0
  203. package/pstack/skills/statechart/scripts/test/corpus/CounterDeadlock/ChartRun.out +59 -0
  204. package/pstack/skills/statechart/scripts/test/corpus/CounterDeadlock/CounterDeadlock.cfg +3 -0
  205. package/pstack/skills/statechart/scripts/test/corpus/CounterDeadlock/CounterDeadlock.tla +11 -0
  206. package/pstack/skills/statechart/scripts/test/corpus/CounterDeadlock/chart.mmd +22 -0
  207. package/pstack/skills/statechart/scripts/test/corpus/CounterDeadlock/graph.dot +16 -0
  208. package/pstack/skills/statechart/scripts/test/corpus/CounterDeadlock/report.md +17 -0
  209. package/pstack/skills/statechart/scripts/test/corpus/CounterDeadlock/sany.out +2 -0
  210. package/pstack/skills/statechart/scripts/test/corpus/CounterDeadlock/verdict-1.exit +1 -0
  211. package/pstack/skills/statechart/scripts/test/corpus/CounterDeadlock/verdict-1.out +56 -0
  212. package/pstack/skills/statechart/scripts/test/corpus/CounterDeadlock/verdict-2.exit +1 -0
  213. package/pstack/skills/statechart/scripts/test/corpus/CounterDeadlock/verdict-2.out +77 -0
  214. package/pstack/skills/statechart/scripts/test/corpus/CounterFan/ChartRun.out +69 -0
  215. package/pstack/skills/statechart/scripts/test/corpus/CounterFan/CounterFan.cfg +2 -0
  216. package/pstack/skills/statechart/scripts/test/corpus/CounterFan/CounterFan.tla +11 -0
  217. package/pstack/skills/statechart/scripts/test/corpus/CounterFan/chart.mmd +85 -0
  218. package/pstack/skills/statechart/scripts/test/corpus/CounterFan/graph.dot +70 -0
  219. package/pstack/skills/statechart/scripts/test/corpus/CounterFan/report.md +12 -0
  220. package/pstack/skills/statechart/scripts/test/corpus/CounterFan/sany.out +2 -0
  221. package/pstack/skills/statechart/scripts/test/corpus/CounterFan/verdict-1.exit +1 -0
  222. package/pstack/skills/statechart/scripts/test/corpus/CounterFan/verdict-1.out +67 -0
  223. package/pstack/skills/statechart/scripts/test/corpus/CounterFan/verdict-2.out +57 -0
  224. package/pstack/skills/statechart/scripts/test/corpus/CounterGuard/ChartRun.exit +1 -0
  225. package/pstack/skills/statechart/scripts/test/corpus/CounterGuard/ChartRun.out +85 -0
  226. package/pstack/skills/statechart/scripts/test/corpus/CounterGuard/CounterGuard.cfg +6 -0
  227. package/pstack/skills/statechart/scripts/test/corpus/CounterGuard/CounterGuard.tla +13 -0
  228. package/pstack/skills/statechart/scripts/test/corpus/CounterGuard/chart.mmd +5 -0
  229. package/pstack/skills/statechart/scripts/test/corpus/CounterGuard/graph.dot +10 -0
  230. package/pstack/skills/statechart/scripts/test/corpus/CounterGuard/report.md +31 -0
  231. package/pstack/skills/statechart/scripts/test/corpus/CounterGuard/sany.out +2 -0
  232. package/pstack/skills/statechart/scripts/test/corpus/CounterGuard/verdict-1.exit +1 -0
  233. package/pstack/skills/statechart/scripts/test/corpus/CounterGuard/verdict-1.out +64 -0
  234. package/pstack/skills/statechart/scripts/test/corpus/CounterGuard/verdict-2.exit +1 -0
  235. package/pstack/skills/statechart/scripts/test/corpus/CounterGuard/verdict-2.out +77 -0
  236. package/pstack/skills/statechart/scripts/test/corpus/CounterInitPast/ChartRun.out +55 -0
  237. package/pstack/skills/statechart/scripts/test/corpus/CounterInitPast/CounterInitPast.cfg +3 -0
  238. package/pstack/skills/statechart/scripts/test/corpus/CounterInitPast/CounterInitPast.tla +10 -0
  239. package/pstack/skills/statechart/scripts/test/corpus/CounterInitPast/chart.mmd +12 -0
  240. package/pstack/skills/statechart/scripts/test/corpus/CounterInitPast/graph.dot +6 -0
  241. package/pstack/skills/statechart/scripts/test/corpus/CounterInitPast/report.md +12 -0
  242. package/pstack/skills/statechart/scripts/test/corpus/CounterInitPast/sany.out +2 -0
  243. package/pstack/skills/statechart/scripts/test/corpus/CounterInitPast/verdict-1.exit +1 -0
  244. package/pstack/skills/statechart/scripts/test/corpus/CounterInitPast/verdict-1.out +33 -0
  245. package/pstack/skills/statechart/scripts/test/corpus/CounterInitPast/verdict-2.out +54 -0
  246. package/pstack/skills/statechart/scripts/test/corpus/CounterInitPastHolds/ChartRun.out +54 -0
  247. package/pstack/skills/statechart/scripts/test/corpus/CounterInitPastHolds/CounterInitPastHolds.cfg +3 -0
  248. package/pstack/skills/statechart/scripts/test/corpus/CounterInitPastHolds/CounterInitPastHolds.tla +10 -0
  249. package/pstack/skills/statechart/scripts/test/corpus/CounterInitPastHolds/chart.mmd +1 -0
  250. package/pstack/skills/statechart/scripts/test/corpus/CounterInitPastHolds/graph.dot +6 -0
  251. package/pstack/skills/statechart/scripts/test/corpus/CounterInitPastHolds/report.md +7 -0
  252. package/pstack/skills/statechart/scripts/test/corpus/CounterInitPastHolds/sany.out +2 -0
  253. package/pstack/skills/statechart/scripts/test/corpus/CounterInitPastHolds/verdict-1.out +46 -0
  254. package/pstack/skills/statechart/scripts/test/corpus/CounterInstance/ChartRun.out +59 -0
  255. package/pstack/skills/statechart/scripts/test/corpus/CounterInstance/CounterInstance.cfg +2 -0
  256. package/pstack/skills/statechart/scripts/test/corpus/CounterInstance/CounterInstance.tla +10 -0
  257. package/pstack/skills/statechart/scripts/test/corpus/CounterInstance/CounterSteps.tla +6 -0
  258. package/pstack/skills/statechart/scripts/test/corpus/CounterInstance/chart.mmd +17 -0
  259. package/pstack/skills/statechart/scripts/test/corpus/CounterInstance/graph.dot +15 -0
  260. package/pstack/skills/statechart/scripts/test/corpus/CounterInstance/report.md +14 -0
  261. package/pstack/skills/statechart/scripts/test/corpus/CounterInstance/sany.out +3 -0
  262. package/pstack/skills/statechart/scripts/test/corpus/CounterInstance/verdict-1.exit +1 -0
  263. package/pstack/skills/statechart/scripts/test/corpus/CounterInstance/verdict-1.out +78 -0
  264. package/pstack/skills/statechart/scripts/test/corpus/CounterJump/ChartRun.out +59 -0
  265. package/pstack/skills/statechart/scripts/test/corpus/CounterJump/CounterJump.cfg +3 -0
  266. package/pstack/skills/statechart/scripts/test/corpus/CounterJump/CounterJump.tla +19 -0
  267. package/pstack/skills/statechart/scripts/test/corpus/CounterJump/chart.mmd +26 -0
  268. package/pstack/skills/statechart/scripts/test/corpus/CounterJump/graph.dot +22 -0
  269. package/pstack/skills/statechart/scripts/test/corpus/CounterJump/report.md +12 -0
  270. package/pstack/skills/statechart/scripts/test/corpus/CounterJump/sany.out +2 -0
  271. package/pstack/skills/statechart/scripts/test/corpus/CounterJump/verdict-1.exit +1 -0
  272. package/pstack/skills/statechart/scripts/test/corpus/CounterJump/verdict-1.out +58 -0
  273. package/pstack/skills/statechart/scripts/test/corpus/CounterJump/verdict-2.out +57 -0
  274. package/pstack/skills/statechart/scripts/test/corpus/CounterLoop/ChartRun.out +57 -0
  275. package/pstack/skills/statechart/scripts/test/corpus/CounterLoop/CounterLoop.cfg +2 -0
  276. package/pstack/skills/statechart/scripts/test/corpus/CounterLoop/CounterLoop.tla +11 -0
  277. package/pstack/skills/statechart/scripts/test/corpus/CounterLoop/chart.mmd +17 -0
  278. package/pstack/skills/statechart/scripts/test/corpus/CounterLoop/graph.dot +15 -0
  279. package/pstack/skills/statechart/scripts/test/corpus/CounterLoop/report.md +14 -0
  280. package/pstack/skills/statechart/scripts/test/corpus/CounterLoop/sany.out +2 -0
  281. package/pstack/skills/statechart/scripts/test/corpus/CounterLoop/verdict-1.exit +1 -0
  282. package/pstack/skills/statechart/scripts/test/corpus/CounterLoop/verdict-1.out +76 -0
  283. package/pstack/skills/statechart/scripts/test/corpus/CounterOrder/ChartRun.out +59 -0
  284. package/pstack/skills/statechart/scripts/test/corpus/CounterOrder/CounterOrder.cfg +3 -0
  285. package/pstack/skills/statechart/scripts/test/corpus/CounterOrder/CounterOrder.tla +11 -0
  286. package/pstack/skills/statechart/scripts/test/corpus/CounterOrder/chart.mmd +19 -0
  287. package/pstack/skills/statechart/scripts/test/corpus/CounterOrder/graph.dot +10 -0
  288. package/pstack/skills/statechart/scripts/test/corpus/CounterOrder/report.md +15 -0
  289. package/pstack/skills/statechart/scripts/test/corpus/CounterOrder/sany.out +2 -0
  290. package/pstack/skills/statechart/scripts/test/corpus/CounterOrder/verdict-1.exit +1 -0
  291. package/pstack/skills/statechart/scripts/test/corpus/CounterOrder/verdict-1.out +56 -0
  292. package/pstack/skills/statechart/scripts/test/corpus/CounterOrder/verdict-2.exit +1 -0
  293. package/pstack/skills/statechart/scripts/test/corpus/CounterOrder/verdict-2.out +67 -0
  294. package/pstack/skills/statechart/scripts/test/corpus/CounterRules/ChartRun.out +62 -0
  295. package/pstack/skills/statechart/scripts/test/corpus/CounterRules/CounterRules.cfg +6 -0
  296. package/pstack/skills/statechart/scripts/test/corpus/CounterRules/CounterRules.tla +24 -0
  297. package/pstack/skills/statechart/scripts/test/corpus/CounterRules/Moves.tla +5 -0
  298. package/pstack/skills/statechart/scripts/test/corpus/CounterRules/chart.mmd +22 -0
  299. package/pstack/skills/statechart/scripts/test/corpus/CounterRules/graph.dot +10 -0
  300. package/pstack/skills/statechart/scripts/test/corpus/CounterRules/report.md +23 -0
  301. package/pstack/skills/statechart/scripts/test/corpus/CounterRules/sany.out +3 -0
  302. package/pstack/skills/statechart/scripts/test/corpus/CounterRules/verdict-1.exit +1 -0
  303. package/pstack/skills/statechart/scripts/test/corpus/CounterRules/verdict-1.out +58 -0
  304. package/pstack/skills/statechart/scripts/test/corpus/CounterRules/verdict-2.exit +1 -0
  305. package/pstack/skills/statechart/scripts/test/corpus/CounterRules/verdict-2.out +66 -0
  306. package/pstack/skills/statechart/scripts/test/corpus/CounterRules/verdict-3.exit +1 -0
  307. package/pstack/skills/statechart/scripts/test/corpus/CounterRules/verdict-3.out +74 -0
  308. package/pstack/skills/statechart/scripts/test/corpus/CounterRules/verdict-4.out +59 -0
  309. package/pstack/skills/statechart/scripts/test/corpus/CounterStart/ChartRun.out +58 -0
  310. package/pstack/skills/statechart/scripts/test/corpus/CounterStart/CounterStart.cfg +3 -0
  311. package/pstack/skills/statechart/scripts/test/corpus/CounterStart/CounterStart.tla +15 -0
  312. package/pstack/skills/statechart/scripts/test/corpus/CounterStart/chart.mmd +18 -0
  313. package/pstack/skills/statechart/scripts/test/corpus/CounterStart/graph.dot +13 -0
  314. package/pstack/skills/statechart/scripts/test/corpus/CounterStart/report.md +11 -0
  315. package/pstack/skills/statechart/scripts/test/corpus/CounterStart/sany.out +2 -0
  316. package/pstack/skills/statechart/scripts/test/corpus/CounterStart/verdict-1.exit +1 -0
  317. package/pstack/skills/statechart/scripts/test/corpus/CounterStart/verdict-1.out +33 -0
  318. package/pstack/skills/statechart/scripts/test/corpus/CounterStart/verdict-2.out +57 -0
  319. package/pstack/skills/statechart/scripts/test/corpus/CounterStop/ChartRun.out +57 -0
  320. package/pstack/skills/statechart/scripts/test/corpus/CounterStop/CounterStop.cfg +3 -0
  321. package/pstack/skills/statechart/scripts/test/corpus/CounterStop/CounterStop.tla +15 -0
  322. package/pstack/skills/statechart/scripts/test/corpus/CounterStop/chart.mmd +7 -0
  323. package/pstack/skills/statechart/scripts/test/corpus/CounterStop/graph.dot +13 -0
  324. package/pstack/skills/statechart/scripts/test/corpus/CounterStop/report.md +6 -0
  325. package/pstack/skills/statechart/scripts/test/corpus/CounterStop/sany.out +2 -0
  326. package/pstack/skills/statechart/scripts/test/corpus/CounterStop/verdict-1.out +49 -0
  327. package/pstack/skills/statechart/scripts/test/corpus/CounterTie/ChartRun.out +61 -0
  328. package/pstack/skills/statechart/scripts/test/corpus/CounterTie/CounterTie.cfg +4 -0
  329. package/pstack/skills/statechart/scripts/test/corpus/CounterTie/CounterTie.tla +14 -0
  330. package/pstack/skills/statechart/scripts/test/corpus/CounterTie/chart.mmd +30 -0
  331. package/pstack/skills/statechart/scripts/test/corpus/CounterTie/graph.dot +19 -0
  332. package/pstack/skills/statechart/scripts/test/corpus/CounterTie/report.md +27 -0
  333. package/pstack/skills/statechart/scripts/test/corpus/CounterTie/sany.out +2 -0
  334. package/pstack/skills/statechart/scripts/test/corpus/CounterTie/verdict-1.exit +1 -0
  335. package/pstack/skills/statechart/scripts/test/corpus/CounterTie/verdict-1.out +56 -0
  336. package/pstack/skills/statechart/scripts/test/corpus/CounterTie/verdict-2.exit +1 -0
  337. package/pstack/skills/statechart/scripts/test/corpus/CounterTie/verdict-2.out +64 -0
  338. package/pstack/skills/statechart/scripts/test/corpus/CounterTie/verdict-3.exit +1 -0
  339. package/pstack/skills/statechart/scripts/test/corpus/CounterTie/verdict-3.out +87 -0
  340. package/pstack/skills/statechart/scripts/test/corpus/CounterTie/verdict-4.out +57 -0
  341. package/pstack/skills/statechart/scripts/test/corpus/CounterTieInGraph/ChartRun.out +60 -0
  342. package/pstack/skills/statechart/scripts/test/corpus/CounterTieInGraph/CounterTieInGraph.cfg +3 -0
  343. package/pstack/skills/statechart/scripts/test/corpus/CounterTieInGraph/CounterTieInGraph.tla +12 -0
  344. package/pstack/skills/statechart/scripts/test/corpus/CounterTieInGraph/chart.mmd +23 -0
  345. package/pstack/skills/statechart/scripts/test/corpus/CounterTieInGraph/graph.dot +19 -0
  346. package/pstack/skills/statechart/scripts/test/corpus/CounterTieInGraph/report.md +11 -0
  347. package/pstack/skills/statechart/scripts/test/corpus/CounterTieInGraph/sany.out +2 -0
  348. package/pstack/skills/statechart/scripts/test/corpus/CounterTieInGraph/verdict-1.exit +1 -0
  349. package/pstack/skills/statechart/scripts/test/corpus/CounterTieInGraph/verdict-1.out +56 -0
  350. package/pstack/skills/statechart/scripts/test/corpus/CounterTieInGraph/verdict-2.out +57 -0
  351. package/pstack/skills/statechart/scripts/test/corpus/CounterView/ChartRun.out +61 -0
  352. package/pstack/skills/statechart/scripts/test/corpus/CounterView/CounterView.cfg +4 -0
  353. package/pstack/skills/statechart/scripts/test/corpus/CounterView/CounterView.tla +14 -0
  354. package/pstack/skills/statechart/scripts/test/corpus/CounterView/chart.mmd +23 -0
  355. package/pstack/skills/statechart/scripts/test/corpus/CounterView/graph.dot +19 -0
  356. package/pstack/skills/statechart/scripts/test/corpus/CounterView/report.md +27 -0
  357. package/pstack/skills/statechart/scripts/test/corpus/CounterView/sany.out +2 -0
  358. package/pstack/skills/statechart/scripts/test/corpus/CounterView/verdict-1.exit +1 -0
  359. package/pstack/skills/statechart/scripts/test/corpus/CounterView/verdict-1.out +56 -0
  360. package/pstack/skills/statechart/scripts/test/corpus/CounterView/verdict-2.exit +1 -0
  361. package/pstack/skills/statechart/scripts/test/corpus/CounterView/verdict-2.out +64 -0
  362. package/pstack/skills/statechart/scripts/test/corpus/CounterView/verdict-3.exit +1 -0
  363. package/pstack/skills/statechart/scripts/test/corpus/CounterView/verdict-3.out +87 -0
  364. package/pstack/skills/statechart/scripts/test/corpus/CounterView/verdict-4.out +57 -0
  365. package/pstack/skills/statechart/scripts/test/corpus/CounterView/view.mjs +1 -0
  366. package/pstack/skills/statechart/scripts/test/corpus/DieHard/ChartRun.out +59 -0
  367. package/pstack/skills/statechart/scripts/test/corpus/DieHard/DieHard.cfg +4 -0
  368. package/pstack/skills/statechart/scripts/test/corpus/DieHard/DieHard.tla +38 -0
  369. package/pstack/skills/statechart/scripts/test/corpus/DieHard/chart.mmd +92 -0
  370. package/pstack/skills/statechart/scripts/test/corpus/DieHard/graph.dot +126 -0
  371. package/pstack/skills/statechart/scripts/test/corpus/DieHard/report.md +17 -0
  372. package/pstack/skills/statechart/scripts/test/corpus/DieHard/sany.out +2 -0
  373. package/pstack/skills/statechart/scripts/test/corpus/DieHard/verdict-1.exit +1 -0
  374. package/pstack/skills/statechart/scripts/test/corpus/DieHard/verdict-1.out +91 -0
  375. package/pstack/skills/statechart/scripts/test/corpus/DieHard/verdict-2.out +57 -0
  376. package/pstack/skills/statechart/scripts/test/corpus/FirstRule/ChartRun.out +61 -0
  377. package/pstack/skills/statechart/scripts/test/corpus/FirstRule/FirstRule.cfg +6 -0
  378. package/pstack/skills/statechart/scripts/test/corpus/FirstRule/FirstRule.tla +11 -0
  379. package/pstack/skills/statechart/scripts/test/corpus/FirstRule/chart.mmd +22 -0
  380. package/pstack/skills/statechart/scripts/test/corpus/FirstRule/graph.dot +16 -0
  381. package/pstack/skills/statechart/scripts/test/corpus/FirstRule/report.md +25 -0
  382. package/pstack/skills/statechart/scripts/test/corpus/FirstRule/sany.out +2 -0
  383. package/pstack/skills/statechart/scripts/test/corpus/FirstRule/verdict-1.exit +1 -0
  384. package/pstack/skills/statechart/scripts/test/corpus/FirstRule/verdict-1.out +56 -0
  385. package/pstack/skills/statechart/scripts/test/corpus/FirstRule/verdict-2.exit +1 -0
  386. package/pstack/skills/statechart/scripts/test/corpus/FirstRule/verdict-2.out +64 -0
  387. package/pstack/skills/statechart/scripts/test/corpus/FirstRule/verdict-3.exit +1 -0
  388. package/pstack/skills/statechart/scripts/test/corpus/FirstRule/verdict-3.out +64 -0
  389. package/pstack/skills/statechart/scripts/test/corpus/FirstRule/verdict-4.exit +1 -0
  390. package/pstack/skills/statechart/scripts/test/corpus/FirstRule/verdict-4.out +77 -0
  391. package/pstack/skills/statechart/scripts/test/corpus/HiddenClock/ChartRun.out +57 -0
  392. package/pstack/skills/statechart/scripts/test/corpus/HiddenClock/HiddenClock.cfg +4 -0
  393. package/pstack/skills/statechart/scripts/test/corpus/HiddenClock/HiddenClock.tla +11 -0
  394. package/pstack/skills/statechart/scripts/test/corpus/HiddenClock/chart.mmd +13 -0
  395. package/pstack/skills/statechart/scripts/test/corpus/HiddenClock/graph.dot +12 -0
  396. package/pstack/skills/statechart/scripts/test/corpus/HiddenClock/report.md +11 -0
  397. package/pstack/skills/statechart/scripts/test/corpus/HiddenClock/sany.out +2 -0
  398. package/pstack/skills/statechart/scripts/test/corpus/HiddenClock/verdict-1.exit +1 -0
  399. package/pstack/skills/statechart/scripts/test/corpus/HiddenClock/verdict-1.out +72 -0
  400. package/pstack/skills/statechart/scripts/test/corpus/Login/ChartRun.out +57 -0
  401. package/pstack/skills/statechart/scripts/test/corpus/Login/Login.cfg +3 -0
  402. package/pstack/skills/statechart/scripts/test/corpus/Login/Login.tla +62 -0
  403. package/pstack/skills/statechart/scripts/test/corpus/Login/chart.mmd +27 -0
  404. package/pstack/skills/statechart/scripts/test/corpus/Login/graph.dot +40 -0
  405. package/pstack/skills/statechart/scripts/test/corpus/Login/report.md +7 -0
  406. package/pstack/skills/statechart/scripts/test/corpus/Login/sany.out +1 -0
  407. package/pstack/skills/statechart/scripts/test/corpus/Login/verdict-1.out +47 -0
  408. package/pstack/skills/statechart/scripts/test/corpus/Login/view.mjs +1 -0
  409. package/pstack/skills/statechart/scripts/test/corpus/LoginGuarded/ChartRun.out +57 -0
  410. package/pstack/skills/statechart/scripts/test/corpus/LoginGuarded/LoginGuarded.cfg +2 -0
  411. package/pstack/skills/statechart/scripts/test/corpus/LoginGuarded/LoginGuarded.tla +64 -0
  412. package/pstack/skills/statechart/scripts/test/corpus/LoginGuarded/chart.mmd +28 -0
  413. package/pstack/skills/statechart/scripts/test/corpus/LoginGuarded/graph.dot +37 -0
  414. package/pstack/skills/statechart/scripts/test/corpus/LoginGuarded/report.md +8 -0
  415. package/pstack/skills/statechart/scripts/test/corpus/LoginGuarded/sany.out +1 -0
  416. package/pstack/skills/statechart/scripts/test/corpus/LoginGuarded/verdict-1.out +47 -0
  417. package/pstack/skills/statechart/scripts/test/corpus/LoginGuarded/view.mjs +1 -0
  418. package/pstack/skills/statechart/scripts/test/corpus/LoginParallel/ChartRun.out +60 -0
  419. package/pstack/skills/statechart/scripts/test/corpus/LoginParallel/LoginParallel.cfg +3 -0
  420. package/pstack/skills/statechart/scripts/test/corpus/LoginParallel/LoginParallel.tla +64 -0
  421. package/pstack/skills/statechart/scripts/test/corpus/LoginParallel/chart.mmd +44 -0
  422. package/pstack/skills/statechart/scripts/test/corpus/LoginParallel/graph.dot +58 -0
  423. package/pstack/skills/statechart/scripts/test/corpus/LoginParallel/report.md +17 -0
  424. package/pstack/skills/statechart/scripts/test/corpus/LoginParallel/sany.out +1 -0
  425. package/pstack/skills/statechart/scripts/test/corpus/LoginParallel/verdict-1.exit +1 -0
  426. package/pstack/skills/statechart/scripts/test/corpus/LoginParallel/verdict-1.out +83 -0
  427. package/pstack/skills/statechart/scripts/test/corpus/LoginParallel/verdict-2.out +57 -0
  428. package/pstack/skills/statechart/scripts/test/corpus/LoginParallel/view.mjs +1 -0
  429. package/pstack/skills/statechart/scripts/test/corpus/MediaPlayer/ChartRun.out +60 -0
  430. package/pstack/skills/statechart/scripts/test/corpus/MediaPlayer/MediaPlayer.cfg +3 -0
  431. package/pstack/skills/statechart/scripts/test/corpus/MediaPlayer/MediaPlayer.tla +103 -0
  432. package/pstack/skills/statechart/scripts/test/corpus/MediaPlayer/chart.mmd +43 -0
  433. package/pstack/skills/statechart/scripts/test/corpus/MediaPlayer/graph.dot +93 -0
  434. package/pstack/skills/statechart/scripts/test/corpus/MediaPlayer/report.md +14 -0
  435. package/pstack/skills/statechart/scripts/test/corpus/MediaPlayer/sany.out +1 -0
  436. package/pstack/skills/statechart/scripts/test/corpus/MediaPlayer/verdict-1.exit +1 -0
  437. package/pstack/skills/statechart/scripts/test/corpus/MediaPlayer/verdict-1.out +59 -0
  438. package/pstack/skills/statechart/scripts/test/corpus/MediaPlayer/verdict-2.out +72 -0
  439. package/pstack/skills/statechart/scripts/test/corpus/MediaPlayer/view.mjs +3 -0
  440. package/pstack/skills/statechart/scripts/test/corpus/MediaPlayerFixed/ChartRun.out +57 -0
  441. package/pstack/skills/statechart/scripts/test/corpus/MediaPlayerFixed/MediaPlayerFixed.cfg +2 -0
  442. package/pstack/skills/statechart/scripts/test/corpus/MediaPlayerFixed/MediaPlayerFixed.tla +100 -0
  443. package/pstack/skills/statechart/scripts/test/corpus/MediaPlayerFixed/chart.mmd +31 -0
  444. package/pstack/skills/statechart/scripts/test/corpus/MediaPlayerFixed/graph.dot +85 -0
  445. package/pstack/skills/statechart/scripts/test/corpus/MediaPlayerFixed/report.md +9 -0
  446. package/pstack/skills/statechart/scripts/test/corpus/MediaPlayerFixed/sany.out +1 -0
  447. package/pstack/skills/statechart/scripts/test/corpus/MediaPlayerFixed/verdict-1.out +47 -0
  448. package/pstack/skills/statechart/scripts/test/corpus/MediaPlayerFixed/view.mjs +3 -0
  449. package/pstack/skills/statechart/scripts/test/corpus/MediaPlayerProps/ChartRun.out +59 -0
  450. package/pstack/skills/statechart/scripts/test/corpus/MediaPlayerProps/MediaPlayer.tla +103 -0
  451. package/pstack/skills/statechart/scripts/test/corpus/MediaPlayerProps/MediaPlayerProps.cfg +3 -0
  452. package/pstack/skills/statechart/scripts/test/corpus/MediaPlayerProps/MediaPlayerProps.tla +6 -0
  453. package/pstack/skills/statechart/scripts/test/corpus/MediaPlayerProps/chart.mmd +42 -0
  454. package/pstack/skills/statechart/scripts/test/corpus/MediaPlayerProps/graph.dot +93 -0
  455. package/pstack/skills/statechart/scripts/test/corpus/MediaPlayerProps/report.md +19 -0
  456. package/pstack/skills/statechart/scripts/test/corpus/MediaPlayerProps/sany.out +2 -0
  457. package/pstack/skills/statechart/scripts/test/corpus/MediaPlayerProps/verdict-1.exit +1 -0
  458. package/pstack/skills/statechart/scripts/test/corpus/MediaPlayerProps/verdict-1.out +61 -0
  459. package/pstack/skills/statechart/scripts/test/corpus/MediaPlayerProps/verdict-2.out +59 -0
  460. package/pstack/skills/statechart/scripts/test/corpus/MediaPlayerProps/verdict-3.out +61 -0
  461. package/pstack/skills/statechart/scripts/test/corpus/MediaPlayerProps/verdict-4.exit +1 -0
  462. package/pstack/skills/statechart/scripts/test/corpus/MediaPlayerProps/verdict-4.out +66 -0
  463. package/pstack/skills/statechart/scripts/test/corpus/MediaPlayerProps/verdict-5.exit +1 -0
  464. package/pstack/skills/statechart/scripts/test/corpus/MediaPlayerProps/verdict-5.out +58 -0
  465. package/pstack/skills/statechart/scripts/test/corpus/MediaPlayerProps/verdict-6.out +49 -0
  466. package/pstack/skills/statechart/scripts/test/corpus/MediaPlayerProps/view.mjs +3 -0
  467. package/pstack/skills/statechart/scripts/test/corpus/PickWorker/ChartRun.out +57 -0
  468. package/pstack/skills/statechart/scripts/test/corpus/PickWorker/PickWorker.cfg +6 -0
  469. package/pstack/skills/statechart/scripts/test/corpus/PickWorker/PickWorker.tla +11 -0
  470. package/pstack/skills/statechart/scripts/test/corpus/PickWorker/chart.mmd +5 -0
  471. package/pstack/skills/statechart/scripts/test/corpus/PickWorker/graph.dot +11 -0
  472. package/pstack/skills/statechart/scripts/test/corpus/PickWorker/report.md +7 -0
  473. package/pstack/skills/statechart/scripts/test/corpus/PickWorker/sany.out +5 -0
  474. package/pstack/skills/statechart/scripts/test/corpus/PickWorker/verdict-1.out +70 -0
  475. package/pstack/skills/statechart/scripts/test/corpus/Shadow/ChartRun.out +61 -0
  476. package/pstack/skills/statechart/scripts/test/corpus/Shadow/Shadow.cfg +4 -0
  477. package/pstack/skills/statechart/scripts/test/corpus/Shadow/Shadow.tla +11 -0
  478. package/pstack/skills/statechart/scripts/test/corpus/Shadow/ShadowLib.tla +6 -0
  479. package/pstack/skills/statechart/scripts/test/corpus/Shadow/ShadowSub.tla +3 -0
  480. package/pstack/skills/statechart/scripts/test/corpus/Shadow/chart.mmd +9 -0
  481. package/pstack/skills/statechart/scripts/test/corpus/Shadow/graph.dot +16 -0
  482. package/pstack/skills/statechart/scripts/test/corpus/Shadow/report.md +8 -0
  483. package/pstack/skills/statechart/scripts/test/corpus/Shadow/sany.out +4 -0
  484. package/pstack/skills/statechart/scripts/test/corpus/Shadow/verdict-1.out +65 -0
  485. package/pstack/skills/statechart/scripts/test/corpus/SpacedNames/ChartRun.out +59 -0
  486. package/pstack/skills/statechart/scripts/test/corpus/SpacedNames/SpacedNames.cfg +2 -0
  487. package/pstack/skills/statechart/scripts/test/corpus/SpacedNames/SpacedNames.tla +9 -0
  488. package/pstack/skills/statechart/scripts/test/corpus/SpacedNames/chart.mmd +23 -0
  489. package/pstack/skills/statechart/scripts/test/corpus/SpacedNames/graph.dot +17 -0
  490. package/pstack/skills/statechart/scripts/test/corpus/SpacedNames/report.md +15 -0
  491. package/pstack/skills/statechart/scripts/test/corpus/SpacedNames/sany.out +1 -0
  492. package/pstack/skills/statechart/scripts/test/corpus/SpacedNames/verdict-1.exit +1 -0
  493. package/pstack/skills/statechart/scripts/test/corpus/SpacedNames/verdict-1.out +65 -0
  494. package/pstack/skills/statechart/scripts/test/corpus/SpacedNames/verdict-2.exit +1 -0
  495. package/pstack/skills/statechart/scripts/test/corpus/SpacedNames/verdict-2.out +75 -0
  496. package/pstack/skills/statechart/scripts/test/corpus/TwoPhase/ChartRun.out +69 -0
  497. package/pstack/skills/statechart/scripts/test/corpus/TwoPhase/TwoPhase.cfg +3 -0
  498. package/pstack/skills/statechart/scripts/test/corpus/TwoPhase/TwoPhase.tla +75 -0
  499. package/pstack/skills/statechart/scripts/test/corpus/TwoPhase/chart.mmd +60 -0
  500. package/pstack/skills/statechart/scripts/test/corpus/TwoPhase/graph.dot +297 -0
  501. package/pstack/skills/statechart/scripts/test/corpus/TwoPhase/report.md +20 -0
  502. package/pstack/skills/statechart/scripts/test/corpus/TwoPhase/sany.out +1 -0
  503. package/pstack/skills/statechart/scripts/test/corpus/TwoPhase/verdict-1.exit +1 -0
  504. package/pstack/skills/statechart/scripts/test/corpus/TwoPhase/verdict-1.out +95 -0
  505. package/pstack/skills/statechart/scripts/test/corpus/TwoPhase/verdict-2.out +57 -0
  506. package/pstack/skills/statechart/scripts/test/corpus/TwoPhase/view.mjs +1 -0
  507. package/pstack/skills/statechart/scripts/test/corpus/TwoPhaseFixed/ChartRun.out +57 -0
  508. package/pstack/skills/statechart/scripts/test/corpus/TwoPhaseFixed/TwoPhaseFixed.cfg +3 -0
  509. package/pstack/skills/statechart/scripts/test/corpus/TwoPhaseFixed/TwoPhaseFixed.tla +75 -0
  510. package/pstack/skills/statechart/scripts/test/corpus/TwoPhaseFixed/chart.mmd +37 -0
  511. package/pstack/skills/statechart/scripts/test/corpus/TwoPhaseFixed/graph.dot +223 -0
  512. package/pstack/skills/statechart/scripts/test/corpus/TwoPhaseFixed/report.md +11 -0
  513. package/pstack/skills/statechart/scripts/test/corpus/TwoPhaseFixed/sany.out +1 -0
  514. package/pstack/skills/statechart/scripts/test/corpus/TwoPhaseFixed/verdict-1.out +47 -0
  515. package/pstack/skills/statechart/scripts/test/corpus/TwoPhaseFixed/view.mjs +1 -0
  516. package/pstack/skills/statechart/scripts/test/corpus/TypeGuard/ChartRun.exit +1 -0
  517. package/pstack/skills/statechart/scripts/test/corpus/TypeGuard/ChartRun.out +75 -0
  518. package/pstack/skills/statechart/scripts/test/corpus/TypeGuard/TypeGuard.cfg +5 -0
  519. package/pstack/skills/statechart/scripts/test/corpus/TypeGuard/TypeGuard.tla +11 -0
  520. package/pstack/skills/statechart/scripts/test/corpus/TypeGuard/chart.mmd +18 -0
  521. package/pstack/skills/statechart/scripts/test/corpus/TypeGuard/graph.dot +14 -0
  522. package/pstack/skills/statechart/scripts/test/corpus/TypeGuard/report.md +29 -0
  523. package/pstack/skills/statechart/scripts/test/corpus/TypeGuard/sany.out +2 -0
  524. package/pstack/skills/statechart/scripts/test/corpus/TypeGuard/verdict-1.exit +1 -0
  525. package/pstack/skills/statechart/scripts/test/corpus/TypeGuard/verdict-1.out +64 -0
  526. package/pstack/skills/statechart/scripts/test/corpus/TypeGuard/verdict-2.exit +1 -0
  527. package/pstack/skills/statechart/scripts/test/corpus/TypeGuard/verdict-2.out +75 -0
  528. package/pstack/skills/statechart/scripts/test/corpus/UserNoDeadlock/ChartRun.out +58 -0
  529. package/pstack/skills/statechart/scripts/test/corpus/UserNoDeadlock/UserNoDeadlock.cfg +2 -0
  530. package/pstack/skills/statechart/scripts/test/corpus/UserNoDeadlock/UserNoDeadlock.tla +8 -0
  531. package/pstack/skills/statechart/scripts/test/corpus/UserNoDeadlock/chart.mmd +22 -0
  532. package/pstack/skills/statechart/scripts/test/corpus/UserNoDeadlock/graph.dot +16 -0
  533. package/pstack/skills/statechart/scripts/test/corpus/UserNoDeadlock/report.md +15 -0
  534. package/pstack/skills/statechart/scripts/test/corpus/UserNoDeadlock/sany.out +2 -0
  535. package/pstack/skills/statechart/scripts/test/corpus/UserNoDeadlock/verdict-1.exit +1 -0
  536. package/pstack/skills/statechart/scripts/test/corpus/UserNoDeadlock/verdict-1.out +56 -0
  537. package/pstack/skills/statechart/scripts/test/corpus/UserNoDeadlock/verdict-2.exit +1 -0
  538. package/pstack/skills/statechart/scripts/test/corpus/UserNoDeadlock/verdict-2.out +77 -0
  539. package/pstack/skills/statechart/scripts/test/corpus.test.ts +403 -0
  540. package/pstack/skills/statechart/scripts/test/differential.test.ts +565 -0
  541. package/pstack/skills/statechart/scripts/test/grid/Grid.cfg +2 -0
  542. package/pstack/skills/statechart/scripts/test/grid/Grid.tla +9 -0
  543. package/pstack/skills/statechart/scripts/test/grid/sany.out +2 -0
  544. package/pstack/skills/statechart/scripts/test/java.ts +63 -0
  545. package/pstack/skills/statechart/scripts/test/labels.ts +643 -0
  546. package/pstack/skills/statechart/scripts/test/messages.test.ts +212 -0
  547. package/pstack/skills/statechart/scripts/test/pipeline.test.ts +270 -0
  548. package/pstack/skills/statechart/scripts/test/plain-tlc.test.ts +255 -0
  549. package/pstack/skills/statechart/scripts/test/render.test.ts +81 -0
  550. package/pstack/skills/statechart/scripts/test/tlc-out.test.ts +90 -0
  551. package/pstack/skills/statechart/scripts/test/tlc.ts +158 -0
  552. package/pstack/skills/statechart/scripts/tsconfig.json +11 -0
  553. package/pstack/skills/statechart/scripts/worker.ts +35 -0
  554. package/pstack/skills/swarm/SKILL.md +47 -0
  555. package/pstack/skills/tdd/SKILL.md +42 -0
  556. package/pstack/skills/teach/SKILL.md +21 -0
  557. package/pstack/skills/technical-writing/SKILL.md +106 -0
  558. package/pstack/skills/thermo-nuclear-code-quality-review/SKILL.md +192 -0
  559. package/pstack/skills/thermo-nuclear-review/SKILL.md +51 -0
  560. package/pstack/skills/thermos/SKILL.md +21 -0
  561. package/pstack/skills/typescript-best-practices/SKILL.md +31 -0
  562. package/pstack/skills/typescript-best-practices/references/patterns.md +328 -0
  563. package/pstack/skills/unslop/SKILL.md +62 -0
  564. package/pstack/skills/what-did-i-get-done/SKILL.md +31 -0
  565. package/pstack/skills/why/SKILL.md +105 -0
  566. package/pstack/skills/why/references/epistemics.md +71 -0
  567. package/pstack/skills/why/references/investigator-prompt.md +84 -0
  568. package/pstack/skills/why/references/source-playbook.md +17 -0
  569. package/pstack/skills/why/references/sources/code-archaeology.md +51 -0
  570. package/pstack/skills/why/references/sources/databricks.md +70 -0
  571. package/pstack/skills/why/references/sources/datadog.md +97 -0
  572. package/pstack/skills/why/references/sources/incident-postmortem.md +5 -0
  573. package/pstack/skills/why/references/sources/linear.md +48 -0
  574. package/pstack/skills/why/references/sources/notion.md +55 -0
  575. package/pstack/skills/why/references/sources/sentry.md +66 -0
  576. package/pstack/skills/why/references/sources/slack.md +17 -0
  577. package/pstack/skills/why/references/synthesizer-prompt.md +129 -0
  578. package/src/accounts.ts +527 -0
  579. package/src/bash-timeout.ts +63 -0
  580. package/src/bridge-trim.ts +109 -0
  581. package/src/brief.ts +280 -0
  582. package/src/cards.ts +65 -0
  583. package/src/child.ts +570 -0
  584. package/src/failures.ts +73 -0
  585. package/src/models.ts +1249 -0
  586. package/src/plan.ts +252 -0
  587. package/src/resources.ts +30 -0
  588. package/src/results.ts +92 -0
  589. package/src/resume.ts +143 -0
  590. package/src/session.ts +70 -0
  591. package/src/state.ts +124 -0
  592. package/src/t3-http.ts +140 -0
  593. package/src/t3-json.ts +50 -0
  594. package/src/t3-mcp.ts +188 -0
  595. package/src/tasks.ts +163 -0
  596. package/src/transcript.ts +17 -0
  597. package/src/usage.ts +145 -0
  598. package/README.md +0 -3
@@ -0,0 +1,255 @@
1
+ import assert from "node:assert/strict";
2
+ import { test } from "node:test";
3
+ import { agrees, skip } from "./tlc.ts";
4
+
5
+ const late = [
6
+ "---- MODULE Late ----",
7
+ "EXTENDS Naturals, TLC",
8
+ "CONSTANT Mode",
9
+ "VARIABLES x",
10
+ "f == [i \\in 0..2 |-> 0]",
11
+ "Init == x = 0",
12
+ "Grow == x < 5 /\\ x' = x + 1",
13
+ 'Bad == x = 3 /\\ \\/ Mode = "assert" /\\ Assert(FALSE, "late error") /\\ x\' = 0',
14
+ ' \\/ Mode = "div" /\\ x\' = 1 \\div 0',
15
+ "Next == Grow \\/ Bad",
16
+ "Small == x < 1",
17
+ "Below == x < 2",
18
+ "InDomain == f[x] = 0",
19
+ "====",
20
+ ];
21
+ const lateCfg = (mode: string, rules: string) =>
22
+ `CONSTANT Mode = "${mode}"\nINIT Init\nNEXT Next\nINVARIANTS ${rules}\n`;
23
+
24
+ test(
25
+ "a rule that breaks before another rule fails to evaluate breaks in either order",
26
+ { skip },
27
+ () => {
28
+ const first = agrees("Late", { Late: late }, lateCfg("none", "Below InDomain"));
29
+ const last = agrees("Late", { Late: late }, lateCfg("none", "InDomain Below"));
30
+ assert.equal(first.status, 1);
31
+ assert.deepEqual(first.breaks, new Map([["Below", 2]]));
32
+ assert.deepEqual(first.holds, []);
33
+ assert.deepEqual(first.unchecked, ["InDomain", "NoDeadlock"]);
34
+ assert.deepEqual(last, first);
35
+ },
36
+ );
37
+
38
+ test("a rule that breaks before a step fails to evaluate breaks", { skip }, () => {
39
+ for (const mode of ["div", "assert"]) {
40
+ const v = agrees("Late", { Late: late }, lateCfg(mode, "Small"));
41
+ assert.equal(v.status, 1);
42
+ assert.deepEqual(v.breaks, new Map([["Small", 1]]));
43
+ assert.deepEqual(v.unchecked, ["NoDeadlock"]);
44
+ }
45
+ });
46
+
47
+ const warnPath = (next: string) => [
48
+ "---- MODULE WarnPath ----",
49
+ "EXTENDS Naturals",
50
+ "VARIABLES x",
51
+ "f == [i \\in 0..1 |-> i]",
52
+ "Init == x = 0",
53
+ "One == x < 3 /\\ x' = x + 1",
54
+ "Two == x < 3 /\\ x' = x + 2",
55
+ `Next == ${next}`,
56
+ "Zero == f[x] = 0",
57
+ "====",
58
+ ];
59
+
60
+ test("a rule that breaks before it fails to evaluate breaks", { skip }, () => {
61
+ const v = agrees(
62
+ "WarnPath",
63
+ { WarnPath: warnPath("One \\/ Two") },
64
+ "INIT Init\nNEXT Next\nINVARIANT Zero\n",
65
+ );
66
+ assert.equal(v.status, 1);
67
+ assert.equal(v.breaks.get("Zero"), 1);
68
+ });
69
+
70
+ test("a rule that fails to evaluate before TLC reaches a break exits 2", { skip }, () => {
71
+ for (const deadlock of ["", "CHECK_DEADLOCK FALSE\n"]) {
72
+ const v = agrees(
73
+ "WarnPath",
74
+ { WarnPath: warnPath("Two \\/ One") },
75
+ `INIT Init\nNEXT Next\nINVARIANT Zero\n${deadlock}`,
76
+ );
77
+ assert.equal(v.status, 2);
78
+ assert.deepEqual(v.holds, []);
79
+ }
80
+ });
81
+
82
+ test("a rule that no verdict run checks stays not checked under a SYMMETRY", { skip }, () => {
83
+ const v = agrees(
84
+ "Hide",
85
+ {
86
+ Hide: [
87
+ "---- MODULE Hide ----",
88
+ "EXTENDS Naturals, TLC",
89
+ "CONSTANTS a, b, S",
90
+ "VARIABLES x, n",
91
+ "Perms == Permutations(S)",
92
+ "Init == x \\in S /\\ n = 0",
93
+ "Next == n < 4 /\\ n' = n + 1 /\\ UNCHANGED x",
94
+ "Early == n # 1",
95
+ "Bad == x = a",
96
+ 'Boom == n < 3 \\/ Assert(FALSE, "boom")',
97
+ "====",
98
+ ],
99
+ },
100
+ "CONSTANTS a = a b = b S = {a, b}\nSYMMETRY Perms\nINIT Init\nNEXT Next\nINVARIANTS Early Boom Bad\n",
101
+ );
102
+ assert.equal(v.status, 1);
103
+ assert.deepEqual(v.breaks, new Map([["Early", 1]]));
104
+ assert.deepEqual(v.holds, []);
105
+ assert.deepEqual(v.unchecked, ["Bad", "Boom", "NoDeadlock"]);
106
+ });
107
+
108
+ test("a deadlock breaks whatever shape the SPECIFICATION has", { skip }, () => {
109
+ const live = agrees(
110
+ "Live",
111
+ {
112
+ Live: [
113
+ "---- MODULE Live ----",
114
+ "EXTENDS Naturals",
115
+ "VARIABLE x",
116
+ "Init == x = 0",
117
+ "Next == x < 2 /\\ x' = x + 1",
118
+ "Spec == Init /\\ [][Next]_x",
119
+ "LiveSpec == Spec /\\ WF_x(Next)",
120
+ "TypeOK == x \\in 0..2",
121
+ "====",
122
+ ],
123
+ },
124
+ "SPECIFICATION LiveSpec\nINVARIANT TypeOK\n",
125
+ );
126
+ assert.deepEqual(live.breaks, new Map([["NoDeadlock", 2]]));
127
+ assert.deepEqual(live.holds, ["TypeOK"]);
128
+ for (const next of ["[][Next \\/ Tick]_vars", "[][\\E i \\in 1..2 : Step(i)]_vars"]) {
129
+ const v = agrees(
130
+ "Shape",
131
+ {
132
+ Shape: [
133
+ "---- MODULE Shape ----",
134
+ "EXTENDS Naturals",
135
+ "VARIABLES x, t",
136
+ "vars == <<x, t>>",
137
+ "Init == x = 0 /\\ t = 0",
138
+ "Step(i) == x < 2 /\\ x' = x + i /\\ UNCHANGED t",
139
+ "Next == Step(1)",
140
+ "Tick == t < 1 /\\ t' = 1 /\\ UNCHANGED x",
141
+ `Spec == Init /\\ ${next}`,
142
+ "====",
143
+ ],
144
+ },
145
+ "SPECIFICATION Spec\n",
146
+ );
147
+ assert.equal(v.status, 1);
148
+ assert.ok(v.breaks.has("NoDeadlock"));
149
+ }
150
+ });
151
+
152
+ test("a SPECIFICATION from an INSTANCE checks deadlock and finds none", { skip }, () => {
153
+ const v = agrees(
154
+ "Outer",
155
+ {
156
+ Inner: [
157
+ "---- MODULE Inner ----",
158
+ "EXTENDS Naturals",
159
+ "VARIABLE x",
160
+ "Spec == x = 0 /\\ [][x' = (x + 1) % 3]_x",
161
+ "====",
162
+ ],
163
+ Outer: [
164
+ "---- MODULE Outer ----",
165
+ "VARIABLE x",
166
+ "I == INSTANCE Inner",
167
+ "Spec == I!Spec",
168
+ "====",
169
+ ],
170
+ },
171
+ "SPECIFICATION Spec\n",
172
+ );
173
+ assert.equal(v.status, 0);
174
+ assert.deepEqual(v.holds, ["NoDeadlock"]);
175
+ });
176
+
177
+ test("a state at a CONSTRAINT bound is no deadlock", { skip }, () => {
178
+ const v = agrees(
179
+ "Bound",
180
+ {
181
+ Bound: [
182
+ "---- MODULE Bound ----",
183
+ "EXTENDS Naturals",
184
+ "VARIABLE x",
185
+ "Init == x = 0",
186
+ "Next == x' = x + 1",
187
+ "Small == x < 3",
188
+ "====",
189
+ ],
190
+ },
191
+ "INIT Init\nNEXT Next\nCONSTRAINT Small\n",
192
+ );
193
+ assert.equal(v.status, 0);
194
+ assert.deepEqual(v.holds, ["NoDeadlock"]);
195
+ assert.doesNotMatch(v.chart, /^ {2}class s\d+ breaks$/m);
196
+ });
197
+
198
+ test(
199
+ "a model with no initial state passes as it does in TLC, and the report says why",
200
+ { skip },
201
+ () => {
202
+ const v = agrees(
203
+ "NoInit",
204
+ {
205
+ NoInit: [
206
+ "---- MODULE NoInit ----",
207
+ "EXTENDS Naturals",
208
+ "VARIABLE x",
209
+ "Init == x = 0 /\\ x > 0",
210
+ "Next == x' = x + 1",
211
+ "Small == x < 3",
212
+ "====",
213
+ ],
214
+ },
215
+ "INIT Init\nNEXT Next\nINVARIANT Small\n",
216
+ );
217
+ assert.equal(v.status, 0);
218
+ assert.deepEqual(v.holds, ["NoDeadlock", "Small"]);
219
+ assert.match(
220
+ v.report,
221
+ /^TLC found no state that satisfies Init, so no state can break a rule\.$/m,
222
+ );
223
+ },
224
+ );
225
+
226
+ test(
227
+ "a run after a break stops at the state bound and leaves its rules not checked",
228
+ { skip },
229
+ () => {
230
+ const v = agrees(
231
+ "Cycle",
232
+ {
233
+ Cycle: [
234
+ "---- MODULE Cycle ----",
235
+ "EXTENDS Naturals",
236
+ "VARIABLE x",
237
+ "Next == x' = (x + 1) % 100005",
238
+ "Spec == x = 0 /\\ [][Next]_x /\\ WF_x(Next)",
239
+ "Early == x # 3",
240
+ "Back == []<>(x = 0)",
241
+ "====",
242
+ ],
243
+ },
244
+ "SPECIFICATION Spec\nINVARIANT Early\nPROPERTY Back\n",
245
+ );
246
+ assert.equal(v.status, 1);
247
+ assert.deepEqual(v.breaks, new Map([["Early", 3]]));
248
+ assert.deepEqual(v.holds, []);
249
+ assert.deepEqual(v.unchecked, ["Back", "NoDeadlock"]);
250
+ assert.match(
251
+ v.report,
252
+ /^After the first break, each TLC run stops at 100,000 distinct states\./m,
253
+ );
254
+ },
255
+ );
@@ -0,0 +1,81 @@
1
+ import assert from "node:assert/strict";
2
+ import { execFileSync } from "node:child_process";
3
+ import fs from "node:fs";
4
+ import { createRequire } from "node:module";
5
+ import os from "node:os";
6
+ import path from "node:path";
7
+ import { before, test } from "node:test";
8
+ import { fileURLToPath, pathToFileURL } from "node:url";
9
+ import { fuzz, type Html, type Mermaid, type Render } from "./labels.ts";
10
+
11
+ const here = path.dirname(fileURLToPath(import.meta.url));
12
+ const charts = [];
13
+ for (const f of fs.readdirSync(path.join(here, "charts")))
14
+ charts.push(path.join(here, "charts", f));
15
+ for (const d of fs.readdirSync(path.join(here, "corpus")))
16
+ charts.push(path.join(here, "corpus", d, "chart.mmd"));
17
+ const guide = fs.readFileSync(path.join(here, "../../references/render.md"), "utf8");
18
+ const css = guide.match(/```css\n([\s\S]*?)```/);
19
+ assert.ok(css, "references/render.md has no css block");
20
+ const theme = css[1];
21
+ const cache = path.join(
22
+ process.env.XDG_CACHE_HOME ?? path.join(os.homedir(), ".cache"),
23
+ "statechart",
24
+ );
25
+ const install = (name: string, ...packages: string[]) => {
26
+ const dir = path.join(cache, name);
27
+ execFileSync(
28
+ "npm",
29
+ ["install", "--prefix", dir, "--no-audit", "--no-fund", "--save-exact", ...packages],
30
+ { stdio: ["ignore", "pipe", "pipe"] },
31
+ );
32
+ return createRequire(path.join(dir, "package.json"));
33
+ };
34
+
35
+ let render: Render;
36
+ let mermaid: Mermaid;
37
+ let html: Html;
38
+ before(async () => {
39
+ const pele = install("test-pele-1.9.0", "pele@1.9.0");
40
+ ({ render } = await import(pathToFileURL(pele.resolve("pele")).href));
41
+
42
+ const parser = install("test-mermaid-11.16.0", "mermaid@11.16.0", "jsdom@26.1.0");
43
+ const { window } = new (parser("jsdom").JSDOM)("");
44
+ Object.assign(globalThis, { window, document: window.document, DOMParser: window.DOMParser });
45
+ mermaid = (await import(pathToFileURL(parser.resolve("mermaid")).href)).default;
46
+ html = (markup) => {
47
+ const t = window.document.createElement("template");
48
+ t.innerHTML = markup;
49
+ return t.content.textContent ?? "";
50
+ };
51
+ });
52
+
53
+ const classes = new Set<string>();
54
+ for (const chart of charts) {
55
+ const name = path.relative(here, chart);
56
+ const text = fs.readFileSync(chart, "utf8");
57
+ const marks = [...text.matchAll(/^ {2}class (\w+) (\w+)$/gm)];
58
+ for (const [, , mark] of marks) classes.add(mark);
59
+
60
+ test(`${name} renders in Pele 1.9.0 with each class on its node`, () => {
61
+ const { svg } = render(text);
62
+ assert.match(svg, /^<svg /);
63
+ for (const [, id, mark] of marks)
64
+ assert.match(svg, new RegExp(`class="pele-node[^"]* ${mark}\\b[^"]*" data-id="${id}"`), id);
65
+ });
66
+
67
+ test(`${name} parses in mermaid.js, which chat views use`, async () => {
68
+ await mermaid.parse(text);
69
+ });
70
+ }
71
+
72
+ test("random labels and colors keep their text and the chart's shape in Mermaid and Pele", async () => {
73
+ const { drawn, refused, failure } = await fuzz({ seed: 1, charts: 500, render, mermaid, html });
74
+ if (failure) assert.fail(failure);
75
+ assert.ok(drawn > 400 && refused > 20, `${drawn} charts drawn, ${refused} refused`);
76
+ });
77
+
78
+ test("the theme in references/render.md colors each class that the charts use", () => {
79
+ assert.ok(classes.size > 0);
80
+ for (const name of classes) assert.match(theme, new RegExp(`\\.pele \\.${name} rect \\{`), name);
81
+ });
@@ -0,0 +1,90 @@
1
+ import assert from "node:assert/strict";
2
+ import { spawn } from "node:child_process";
3
+ import { once } from "node:events";
4
+ import fs from "node:fs";
5
+ import os from "node:os";
6
+ import path from "node:path";
7
+ import { test } from "node:test";
8
+ import { fileURLToPath } from "node:url";
9
+ import { plainText } from "../backends/plain-text.ts";
10
+ import { readMessages } from "../frontends/messages.ts";
11
+
12
+ const here = path.dirname(fileURLToPath(import.meta.url));
13
+ const corpus = path.join(here, "corpus");
14
+ const skip = !process.env.TLA2TOOLS && "set TLA2TOOLS to the path of tla2tools.jar to run TLC";
15
+ const read = (file: string) => fs.readFileSync(file, "utf8");
16
+ const maybe = (file: string) => (fs.existsSync(file) ? read(file) : "");
17
+ const plain = (text: string) => [...plainText(readMessages(text))].join("");
18
+
19
+ const steady = (text: string) =>
20
+ text
21
+ .replace(/"chart-[0-9a-f]{32}"/g, '"chart"')
22
+ .replace(/\bfp \d+ and seed -?\d+/g, "fp _ and seed _")
23
+ .replace(/\[pid: \d+\]/g, "[pid: _]")
24
+ .replace(/\d{4}-\d\d-\d\d \d\d:\d\d:\d\d/g, "_")
25
+ .replace(/ \([\d,]+ d?s\/min\)/g, "")
26
+ .replace(/ in (?:\d+d \d\dh|\d\dh \d\dmin|\d\dmin \d\ds|\d\ds) at /g, " in _ at ");
27
+
28
+ test(
29
+ "each corpus spec's TLC output reads as plain TLC prints it at -workers 1",
30
+ { skip, concurrency: 4 },
31
+ async (t) => {
32
+ await Promise.all(
33
+ fs.readdirSync(corpus).map((name) =>
34
+ t.test(name, async () => {
35
+ const dir = path.join(corpus, name);
36
+ const tmp = fs.mkdtempSync(path.join(os.tmpdir(), "statechart-plain-"));
37
+ const [tool, twin, out] = ["tool", "plain", "out"].map((f) => path.join(tmp, f));
38
+ fs.mkdirSync(tool);
39
+ fs.mkdirSync(twin);
40
+ const view = path.join(dir, "view.mjs");
41
+ const child = spawn(
42
+ process.execPath,
43
+ [
44
+ path.join(here, "../statechart.ts"),
45
+ path.join(dir, `${name}.tla`),
46
+ ...(fs.existsSync(view) ? ["--view", view] : []),
47
+ "--out",
48
+ out,
49
+ ],
50
+ {
51
+ env: {
52
+ ...process.env,
53
+ JAVA: path.join(here, "java.ts"),
54
+ STATECHART_JAVA: process.env.JAVA ?? "java",
55
+ STATECHART_RECORD: tool,
56
+ STATECHART_PLAIN: twin,
57
+ },
58
+ stdio: ["ignore", "ignore", "pipe"],
59
+ },
60
+ );
61
+ let stderr = "";
62
+ child.stderr.on("data", (chunk: Buffer) => (stderr += chunk));
63
+ await once(child, "close");
64
+ assert.equal(stderr, "");
65
+ const runs = fs.readdirSync(twin).filter((f) => f.endsWith(".out"));
66
+ assert.ok(runs.includes("ChartRun.out"), "the drawing run has a plain twin");
67
+ for (const run of runs) {
68
+ const exit = run.replace(/\.out$/, ".exit");
69
+ assert.equal(maybe(path.join(tool, exit)), maybe(path.join(twin, exit)), exit);
70
+ assert.equal(
71
+ steady(plain(read(path.join(tool, run)))),
72
+ steady(read(path.join(twin, run))),
73
+ run,
74
+ );
75
+ }
76
+ assert.equal(
77
+ steady(read(path.join(out, "tlc.out"))),
78
+ steady(`${read(path.join(twin, "verdict-1.out"))}\n`),
79
+ );
80
+ const verdicts = new Set<string>();
81
+ for (const run of runs)
82
+ if (run.startsWith("verdict-")) verdicts.add(steady(`${read(path.join(twin, run))}\n`));
83
+ for (const f of fs.readdirSync(out))
84
+ if (/^tlc-\w+\.out$/.test(f))
85
+ assert.ok(verdicts.has(steady(read(path.join(out, f)))), f);
86
+ }),
87
+ ),
88
+ );
89
+ },
90
+ );
@@ -0,0 +1,158 @@
1
+ import assert from "node:assert/strict";
2
+ import { spawnSync } from "node:child_process";
3
+ import fs from "node:fs";
4
+ import os from "node:os";
5
+ import path from "node:path";
6
+ import { fileURLToPath } from "node:url";
7
+ import { PINNED_FLAGS } from "../run.ts";
8
+
9
+ const here = path.dirname(fileURLToPath(import.meta.url));
10
+ const jar = process.env.TLA2TOOLS;
11
+ export const skip = !jar && "set TLA2TOOLS to the path of tla2tools.jar to run TLC";
12
+
13
+ const RULES = /^(INVARIANTS?|PROPERTY|PROPERTIES|CHECK_DEADLOCK)$/;
14
+
15
+ const exitClass = (status: number | null) =>
16
+ status === 0 ? 0 : status === 11 || status === 12 || status === 13 ? 1 : 2;
17
+
18
+ const stepsIn = (text: string) =>
19
+ Math.max((text.match(/^State \d+: (?!Stuttering$)/gm)?.length ?? 0) - 1, 0) +
20
+ (text.match(/^Back to state \d+: </gm)?.length ?? 0);
21
+
22
+ function properties(cfg: string) {
23
+ const names: string[] = [];
24
+ let section = "";
25
+ for (const line of cfg.split("\n")) {
26
+ section = line.match(/^[A-Z_]+/)?.[0] ?? section;
27
+ if (/^PROPERT(Y|IES)$/.test(section))
28
+ for (const word of line.trim().split(/\s+/)) if (word && word !== section) names.push(word);
29
+ }
30
+ return names;
31
+ }
32
+
33
+ function tlc(dir: string, module: string, cfg: string) {
34
+ const run = `alone-${fs.readdirSync(dir).length}`;
35
+ const file = path.join(dir, `${run}.cfg`);
36
+ fs.writeFileSync(file, cfg);
37
+ const tmp = path.join(dir, `${run}-tmp`);
38
+ fs.mkdirSync(tmp);
39
+ const r = spawnSync(
40
+ process.env.JAVA ?? "java",
41
+ [
42
+ `-Djava.io.tmpdir=${tmp}`,
43
+ "-cp",
44
+ jar ?? "",
45
+ "tlc2.TLC",
46
+ ...PINNED_FLAGS,
47
+ "-config",
48
+ file,
49
+ "-metadir",
50
+ path.join(dir, `${run}-meta`),
51
+ module,
52
+ ],
53
+ { cwd: dir, encoding: "utf8" },
54
+ );
55
+ const out = r.stdout + r.stderr;
56
+ const temporal = properties(cfg);
57
+ const broke =
58
+ out.match(/^Error: (?:Invariant|Action property|Property) (\S+) is violated/m)?.[1] ??
59
+ (/^Error: Deadlock reached\./m.test(out) ? "NoDeadlock" : undefined) ??
60
+ (/^Error: Temporal properties were violated\./m.test(out) && temporal.length === 1
61
+ ? temporal[0]
62
+ : undefined);
63
+ return { status: r.status, out, broke, steps: stepsIn(out) };
64
+ }
65
+
66
+ function alone(cfg: string, rule: string) {
67
+ const lines: string[] = [];
68
+ let section = "";
69
+ for (const line of cfg.split("\n")) {
70
+ section = line.match(/^[A-Z_]+/)?.[0] ?? section;
71
+ if (!RULES.test(section)) lines.push(line);
72
+ }
73
+ if (rule !== "NoDeadlock")
74
+ lines.push(
75
+ `${properties(cfg).includes(rule) ? "PROPERTY" : "INVARIANT"} ${rule}`,
76
+ "CHECK_DEADLOCK FALSE",
77
+ );
78
+ return `${lines.join("\n")}\n`;
79
+ }
80
+
81
+ export type Verdict = {
82
+ status: number | null;
83
+ breaks: Map<string, number>;
84
+ holds: string[];
85
+ unchecked: string[];
86
+ chart: string;
87
+ report: string;
88
+ };
89
+
90
+ export function agrees(module: string, files: { [name: string]: string[] }, cfg: string): Verdict {
91
+ const dir = fs.mkdtempSync(path.join(os.tmpdir(), "statechart-plain-"));
92
+ try {
93
+ for (const [name, lines] of Object.entries(files))
94
+ fs.writeFileSync(path.join(dir, `${name}.tla`), `${lines.join("\n")}\n`);
95
+ fs.writeFileSync(path.join(dir, `${module}.cfg`), cfg);
96
+ const out = path.join(dir, "out");
97
+ const cli = spawnSync(
98
+ process.execPath,
99
+ [path.join(here, "../statechart.ts"), path.join(dir, `${module}.tla`), "--out", out],
100
+ { encoding: "utf8" },
101
+ );
102
+ const plain = tlc(dir, module, cfg);
103
+ const report = fs.existsSync(out) ? fs.readFileSync(path.join(out, "report.md"), "utf8") : "";
104
+ const shown = `${cli.stderr}${report}`;
105
+ assert.equal(
106
+ cli.status,
107
+ exitClass(plain.status),
108
+ `TLC says:\n${plain.out}\nThe command says:\n${shown}`,
109
+ );
110
+ assert.doesNotMatch(shown, /Chart\w*Mark/);
111
+ if (cli.status !== 2) assert.equal(cli.stderr, "");
112
+ if (!report) assert.match(cli.stderr, /TLC could not check/);
113
+ if (cli.status === 2) {
114
+ const error = plain.out.match(/^Error: .*$/m)?.[0];
115
+ assert.ok(
116
+ error && shown.includes(error),
117
+ `TLC says:\n${plain.out}\nThe command says:\n${shown}`,
118
+ );
119
+ }
120
+
121
+ const breaks = new Map<string, number>();
122
+ const bounded = new Set<string>();
123
+ for (const [, rule, body] of report.matchAll(/^## (\S+) breaks\n(.*)$/gm)) {
124
+ const said = body.match(/has (\d+) steps?:/)?.[1];
125
+ const file = body.match(/ is in (tlc-\S+\.out)\./)?.[1];
126
+ if (!file) {
127
+ breaks.set(rule, Number(said));
128
+ continue;
129
+ }
130
+ const text = fs.readFileSync(path.join(out, file), "utf8");
131
+ if (said) assert.equal(Number(said), stepsIn(text), rule);
132
+ if (/^Semantic processing of module ChartBound$/m.test(text)) bounded.add(rule);
133
+ breaks.set(rule, stepsIn(text));
134
+ }
135
+ const list = (title: string) =>
136
+ report
137
+ .match(new RegExp(`^## ${title}\\n(.*)$`, "m"))?.[1]
138
+ .split(", ")
139
+ .sort() ?? [];
140
+ const holds = list("Rules that hold");
141
+ const unchecked = list("Rules not checked");
142
+ const chartFile = path.join(out, "chart.mmd");
143
+ const chart = fs.existsSync(chartFile) ? fs.readFileSync(chartFile, "utf8") : "";
144
+ if (plain.broke) assert.equal(breaks.get(plain.broke), plain.steps, shown);
145
+ for (const rule of holds) {
146
+ const r = tlc(dir, module, alone(cfg, rule));
147
+ assert.equal(r.status, 0, `${rule} holds in the report, but TLC says:\n${r.out}`);
148
+ }
149
+ for (const [rule, steps] of breaks) {
150
+ const r = tlc(dir, module, alone(cfg, rule));
151
+ assert.equal(r.broke, rule, `${rule} breaks in the report, but TLC says:\n${r.out}`);
152
+ if (!bounded.has(rule)) assert.equal(steps, r.steps, rule);
153
+ }
154
+ return { status: cli.status, breaks, holds, unchecked, chart, report };
155
+ } finally {
156
+ fs.rmSync(dir, { recursive: true, force: true });
157
+ }
158
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "compilerOptions": {
3
+ "noEmit": true,
4
+ "strict": true,
5
+ "allowImportingTsExtensions": true,
6
+ "erasableSyntaxOnly": true,
7
+ "verbatimModuleSyntax": true,
8
+ "module": "nodenext",
9
+ "types": ["node"]
10
+ }
11
+ }
@@ -0,0 +1,35 @@
1
+ import { Buffer } from "node:buffer";
2
+ import fs from "node:fs";
3
+ import path from "node:path";
4
+ import { pathToFileURL } from "node:url";
5
+ import { inspect } from "node:util";
6
+ import { checkView } from "./frontends/view.ts";
7
+ import { compile } from "./pipeline.ts";
8
+ import { check, messageOf } from "./run.ts";
9
+
10
+ const [stage, specFile, configFile, viewFile] = process.argv.slice(2);
11
+
12
+ try {
13
+ const view = checkView(
14
+ viewFile ? await import(pathToFileURL(path.resolve(viewFile)).href) : {},
15
+ inspect,
16
+ );
17
+ const { files, exit } = compile(await check(specFile, configFile), view);
18
+ const draft = path.join(stage, "draft");
19
+ fs.mkdirSync(draft);
20
+ for (const [name, parts] of files) {
21
+ const fd = fs.openSync(path.join(draft, name), "wx");
22
+ try {
23
+ for (const part of parts)
24
+ fs.writeSync(fd, typeof part === "string" ? Buffer.from(part) : part);
25
+ fs.writeSync(fd, "\n");
26
+ } finally {
27
+ fs.closeSync(fd);
28
+ }
29
+ }
30
+ fs.renameSync(draft, path.join(stage, "done"));
31
+ process.exit(exit);
32
+ } catch (error) {
33
+ console.error(messageOf(error));
34
+ process.exit(2);
35
+ }
@@ -0,0 +1,47 @@
1
+ ---
2
+ name: swarm
3
+ description: "Fan out N parallel workers, drain them, and return one report. Use for /swarm, 'swarm this', or parallel coverage, races, gauntlets, and exploration."
4
+ disable-model-invocation: true
5
+ ---
6
+
7
+ # Swarm
8
+
9
+ ## Start
10
+
11
+ Open a todolist with one entry per phase before launching anything.
12
+
13
+ 1. Frame
14
+ 2. Fan out
15
+ 3. Aggregate
16
+ 4. Report
17
+
18
+ ## Phase A: Frame
19
+
20
+ 1. State the done predicate and the artifact or report the swarm must return.
21
+ 2. Choose the shape. Partition into slices, race N workers on identical briefs, or mix both. For a race or mixed shape, declare `first pass`, `rank all`, or `best-of` before spawning.
22
+ 3. Get the worker target from `pstack_model` with `swarm workers`. When it returns `inherit-parent`, omit `target` so the workers run on the parent model. For a model race, name each arm's model up front. Pick each subagent's reasoning level and fast or standard speed for the job, per the Subagents section of the **poteto-mode** skill.
23
+ 4. Give each worker its own writable output when it writes. When workers verify or measure commits, each brief names the exact SHAs. A measurement brief also names the method (sample count, what one sample is, order). The worker records both in its result.
24
+
25
+ ## Phase B: Fan out
26
+
27
+ Spawn all N workers in one response as `delegate_task` calls with `mode: "async"` and the step 3 `target`, left unset for `auto` or `inherit-parent`. Every worker runs on this machine, so a worker that writes gets its own git worktree, named by absolute path in its brief as the only place it writes.
28
+
29
+ When a worker must start from a non-default branch, create its worktree from that branch.
30
+
31
+ Every brief stands alone. Include the goal, scope, exact slice or race arm, how to verify, and what to report. Reports use `PASS`, `ISSUES`, or `BLOCKED` with evidence. A worker that can prove a defect reports `ISSUES` and lists every issue it can prove, not only the first.
32
+
33
+ If a worker drops out, proceed with N-1 and note it.
34
+
35
+ ## Phase C: Aggregate
36
+
37
+ Read the terminal results. Drop a result that does not record the SHAs and method its brief names, and respawn that worker once. After a second miss, record a gap. A gap does not count as a pass. For coverage, every required slice needs a result. For a race, apply the selection rule declared up front. Use first pass, rank all, or best-of. Do not paste raw worker dumps.
38
+
39
+ ## Phase D: Report
40
+
41
+ Return one consolidated in-chat report with a result table, issue one-liners, gaps or dropouts, and the race rule when used.
42
+
43
+ ## Models
44
+
45
+ Get every target from the `pstack_model` tool. Pass the role name plus the job type and size from the routing table in poteto-mode's Subagents section. This skill's spawns are `check` jobs for verification workers and `implement` or `mechanical` jobs for build workers. Write every brief from `<plugin root>/skills/poteto-mode/brief.md`: the extension refuses a `delegate_task` call whose brief is missing its sections or limits. Without a job, pass the complexity: `groundwork` for cheap mechanical work, `bounded` for involved but bounded work, `general` for work that needs substantial judgment. The tool reads the role's line in the model sheet (`~/.config/t3-pstack/models.md`, written by `/setup-pstack`). A line naming a model is used as written, moved to a provider T3 can run right now when needed. A role with no line, or `inherit-parent` or `auto`, is routed by this extension's `models.json`: the parent's model family, sized and reasoned by complexity, and for panels one seat per family. The extension blocks a `delegate_task` call that uses the reserved Fable model or fast mode unless the user named it, reasoning above what `pstack_model` returned, or reasoning above high unless the user's latest message is "allow xhigh". Pass each returned target as `delegate_task`'s `target`. `inherit-parent` means omit `target`. `blocked` means the panel cannot reach two model families on this T3, so record its reason.
46
+
47
+ - swarm workers: one target