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,269 @@
1
+ import {
2
+ type Answers,
3
+ type Bug,
4
+ type Graph,
5
+ type Hidden,
6
+ isRecord,
7
+ key,
8
+ type Labels,
9
+ list,
10
+ loopOf,
11
+ must,
12
+ type Rule,
13
+ type Shape,
14
+ sortBy,
15
+ stateText,
16
+ type Step,
17
+ type Story,
18
+ tupleKey,
19
+ type Vars,
20
+ type View,
21
+ type Walk,
22
+ } from "../ir.ts";
23
+
24
+ const isLabel = (l: unknown): l is string =>
25
+ typeof l === "string" && l !== "" && !/\bundefined\b|\bNaN\b|\[object Object\]/.test(l);
26
+
27
+ const shapeOf = (shape: unknown, vars: Vars): Shape => {
28
+ function fail(): never {
29
+ throw new Error(
30
+ `The view's state() returned ${JSON.stringify(shape) ?? "undefined"} for the state ${stateText(vars)}. Return a string, an array of strings, or an object of those.`,
31
+ );
32
+ }
33
+ const path = (p: unknown) => {
34
+ const labels: string[] = [];
35
+ for (const l of [p].flat()) {
36
+ if (!isLabel(l)) fail();
37
+ labels.push(l);
38
+ }
39
+ if (!labels.length) fail();
40
+ return labels;
41
+ };
42
+ const regions: [string, unknown][] = isRecord(shape) ? Object.entries(shape) : [["", shape]];
43
+ const pairs: [string, string[]][] = [];
44
+ for (const [k, v] of regions) pairs.push([k, path(v)]);
45
+ return pairs.length ? Object.fromEntries(pairs) : fail();
46
+ };
47
+
48
+ const stepOf = (view: View) => (action: string, from: Vars, to: Vars) => {
49
+ const label = (view.step ?? ((a: string) => a))(action, from, to);
50
+ if (label === null || isLabel(label)) return label;
51
+ throw new Error(
52
+ `The view's step() returned ${JSON.stringify(label) ?? "undefined"} for the step ${action}.`,
53
+ );
54
+ };
55
+
56
+ function unlabeled(
57
+ action: string,
58
+ before: Vars,
59
+ after: Vars,
60
+ bug: { rule: Rule; loop?: number },
61
+ ): never {
62
+ const changed: string[] = [];
63
+ for (const k of Object.keys(after)) if (key(before[k]) !== key(after[k])) changed.push(k);
64
+ throw new Error(
65
+ `The view's step() returned null for the step ${action} that changes ${changed.join(", ") || "nothing"}. It is on the path to the ${bug.rule.name} bug${bug.loop === undefined ? "" : " or leaves its loop"}, so label it.`,
66
+ );
67
+ }
68
+
69
+ export function ask(graph: Graph, { states: tla, nameOf, from, to }: Walk, view: View): Answers {
70
+ const n = nameOf.length;
71
+ const m = from.length;
72
+ const state = view.state;
73
+ const shapes = new Array<Shape>(n);
74
+ for (let i = 0; i < n; i++)
75
+ shapes[i] = shapeOf(state ? state(tla[i].vars) : nameOf[i], tla[i].vars);
76
+ const names = Object.keys(shapes[0] ?? { "": [] });
77
+ const regionsKey = tupleKey(names);
78
+ for (let i = 0; i < n; i++)
79
+ if (tupleKey(Object.keys(shapes[i])) !== regionsKey)
80
+ throw new Error(
81
+ `The view's state() returned the regions ${names.join(", ")} for one state and ${Object.keys(shapes[i]).join(", ")} for the state ${stateText(tla[i].vars)}. Return the same regions for every state.`,
82
+ );
83
+ const step = stepOf(view);
84
+ const labels = new Array<string | Hidden>(m);
85
+ for (let j = 0; j < m; j++)
86
+ labels[j] = step(graph.steps[j].action, tla[from[j]].vars, tla[to[j]].vars);
87
+ const groups = new Array<unknown>(n);
88
+ const asked = new Uint8Array(n);
89
+ const group = (i: number) => {
90
+ if (view.group && !asked[i]) {
91
+ groups[i] = view.group(tla[i].vars);
92
+ asked[i] = 1;
93
+ }
94
+ return groups[i];
95
+ };
96
+ return { names, shapes, labels, group };
97
+ }
98
+
99
+ export function asParents(
100
+ { states: tla }: Walk,
101
+ { names, shapes, labels, group }: Answers,
102
+ ): Answers {
103
+ const parents = new Array<Shape>(shapes.length);
104
+ for (let i = 0; i < shapes.length; i++) {
105
+ const path: string[] = [];
106
+ for (const n of names) for (const p of shapes[i][n]) path.push(`${n} ${p}`);
107
+ parents[i] = shapeOf(path, tla[i].vars);
108
+ }
109
+ return { names: [""], shapes: parents, labels, group };
110
+ }
111
+
112
+ export function labelGraph(
113
+ graph: Graph,
114
+ { index, from, to, action }: Walk,
115
+ answers: Answers,
116
+ rank: Int32Array,
117
+ found: Bug[],
118
+ ): Labels {
119
+ const { names, shapes, labels: stepLabels } = answers;
120
+ const n = shapes.length;
121
+ const m = stepLabels.length;
122
+ const onPath = new Set<Step>();
123
+ for (const b of found) for (const p of b.path) onPath.add(p.step);
124
+ const pathStepIndex = new Map<Step, number>();
125
+ if (onPath.size)
126
+ for (let j = 0; j < m; j++)
127
+ if (onPath.has(graph.steps[j])) pathStepIndex.set(graph.steps[j], j);
128
+ const R = names.length;
129
+ const keys: string[][] = [];
130
+ const kinds: Int32Array[] = [];
131
+ const sizes: number[] = [];
132
+ for (const name of names) {
133
+ const key = new Array<string>(n);
134
+ const kind = new Int32Array(n);
135
+ const tops = new Map<string, number>();
136
+ const nested = new Map<string, number>();
137
+ const keyOf: string[] = [];
138
+ for (let i = 0; i < n; i++) {
139
+ const path = shapes[i][name];
140
+ const top = path.length === 1;
141
+ const seen = top ? tops : nested;
142
+ const k = top ? path[0] : tupleKey(path);
143
+ let c = seen.get(k);
144
+ if (c === undefined) {
145
+ seen.set(k, (c = keyOf.length));
146
+ keyOf.push(top ? tupleKey(path) : k);
147
+ }
148
+ key[i] = keyOf[c];
149
+ kind[i] = c;
150
+ }
151
+ keys.push(key);
152
+ kinds.push(kind);
153
+ sizes.push(keyOf.length);
154
+ }
155
+ for (const b of found) {
156
+ let t: Step | undefined;
157
+ for (const p of b.path)
158
+ if (stepLabels[must(pathStepIndex, p.step)] === null) {
159
+ t = p.step;
160
+ break;
161
+ }
162
+ if (!t) {
163
+ const inLoop = loopOf(b, index);
164
+ if (inLoop.size)
165
+ for (let j = 0; j < m; j++)
166
+ if (inLoop.has(from[j]) && !inLoop.has(to[j]) && stepLabels[j] === null) {
167
+ t = graph.steps[j];
168
+ break;
169
+ }
170
+ }
171
+ if (t) unlabeled(t.action, must(graph.states, t.from).vars, must(graph.states, t.to).vars, b);
172
+ }
173
+ const drawn: number[] = [];
174
+ const drawnLabels = new Array<string>(m);
175
+ for (let j = 0; j < m; j++) {
176
+ const label = stepLabels[j];
177
+ if (label === null) continue;
178
+ drawn.push(j);
179
+ drawnLabels[j] = label;
180
+ }
181
+ const fromRank = new Int32Array(m);
182
+ const toRank = new Int32Array(m);
183
+ for (let j = 0; j < m; j++) {
184
+ fromRank[j] = rank[from[j]];
185
+ toRank[j] = rank[to[j]];
186
+ }
187
+ const sorted = sortBy(Int32Array.from(drawn), [fromRank, toRank, action]);
188
+ const pathSteps = new Uint8Array(m);
189
+ for (const j of pathStepIndex.values()) pathSteps[j] = 1;
190
+ const byLabel = new Map<string, { changed: Uint8Array; sets: Set<string> }>();
191
+ if (R > 1)
192
+ for (const j of sorted) {
193
+ let entry = byLabel.get(drawnLabels[j]);
194
+ if (!entry)
195
+ byLabel.set(drawnLabels[j], (entry = { changed: new Uint8Array(R), sets: new Set() }));
196
+ const changed: string[] = [];
197
+ for (let r = 0; r < R; r++)
198
+ if (kinds[r][from[j]] !== kinds[r][to[j]]) {
199
+ changed.push(names[r]);
200
+ entry.changed[r] = 1;
201
+ }
202
+ if (changed.length > 1) entry.sets.add(list(changed));
203
+ }
204
+ const together = new Set<string>();
205
+ for (const [text, { sets }] of byLabel) if (sets.size) together.add(text);
206
+ const notes: string[] = [];
207
+ for (const [text, entry] of byLabel) {
208
+ const changed: string[] = [];
209
+ for (let r = 0; r < R; r++) if (entry.changed[r]) changed.push(names[r]);
210
+ if (changed.length < 2) continue;
211
+ if (!together.has(text)) {
212
+ notes.push(`The step ${text} changes only one of ${list(changed)} at a time.`);
213
+ continue;
214
+ }
215
+ const sets = [...entry.sets];
216
+ notes.push(
217
+ `The step ${text} changes ${sets.length > 1 ? `${sets.join(", or ")},` : sets[0]} at the same time.`,
218
+ );
219
+ }
220
+ return {
221
+ ...answers,
222
+ drawnLabels,
223
+ keys,
224
+ kinds,
225
+ sizes,
226
+ sorted,
227
+ pathStepIndex,
228
+ pathSteps,
229
+ together,
230
+ notes,
231
+ };
232
+ }
233
+
234
+ type Told<Id> = { rule: Rule; start: Id; path: { action: string; state: Id }[]; loop?: number };
235
+
236
+ function tell<Id, B extends Told<Id>>(
237
+ states: ReadonlyMap<Id, { vars: Vars }>,
238
+ found: B[],
239
+ shapeAt: (id: Id) => Shape,
240
+ labelAt: (bug: B, k: number, from: Id) => string | Hidden,
241
+ ) {
242
+ const vars = (id: Id) => must(states, id).vars;
243
+ const stories = new Map<B, Story>();
244
+ for (const bug of found) {
245
+ const story: Story = [{ state: shapeAt(bug.start) }];
246
+ let from: Id = bug.start;
247
+ for (const [k, p] of bug.path.entries()) {
248
+ const step = labelAt(bug, k, from);
249
+ if (step === null) unlabeled(p.action, vars(from), vars(p.state), bug);
250
+ story.push({ step, state: shapeAt(p.state) });
251
+ from = p.state;
252
+ }
253
+ stories.set(bug, story);
254
+ }
255
+ return stories;
256
+ }
257
+
258
+ export const storiesOf = (
259
+ graph: Graph,
260
+ found: Bug[],
261
+ { index }: Walk,
262
+ { shapes, drawnLabels, pathStepIndex }: Labels,
263
+ ) =>
264
+ tell(
265
+ graph.states,
266
+ found,
267
+ (id) => shapes[must(index, id)],
268
+ (bug, k) => drawnLabels[must(pathStepIndex, bug.path[k].step)],
269
+ );
@@ -0,0 +1,85 @@
1
+ import {
2
+ append,
3
+ type Chart,
4
+ type ChartState,
5
+ type ChartStep,
6
+ must,
7
+ type Region,
8
+ tupleKey,
9
+ unkey,
10
+ } from "../ir.ts";
11
+
12
+ export function liftToParents(states: ChartState[], steps: ChartStep[]) {
13
+ const depths = new Map<string, number>();
14
+ const leaves = new Map<string, number>();
15
+ for (const s of states.values())
16
+ for (let i = 1; i < s.path.length; i++) {
17
+ const prefix = tupleKey(s.path.slice(0, i));
18
+ depths.set(prefix, i);
19
+ leaves.set(prefix, (leaves.get(prefix) ?? 0) + 1);
20
+ }
21
+ if (!depths.size) return steps;
22
+ const leaving = new Map<string, ChartStep[]>();
23
+ for (const s of steps) {
24
+ let same = 0;
25
+ while (same < s.from.length && s.from[same] === s.to[same]) same++;
26
+ for (let i = 1; i < s.from.length; i++) {
27
+ if (i <= same && i < s.to.length) continue;
28
+ const prefix = tupleKey(s.from.slice(0, i));
29
+ if (depths.has(prefix)) append(leaving, prefix, s);
30
+ }
31
+ }
32
+ const removed = new Set<ChartStep>();
33
+ const lifted: ChartStep[] = [];
34
+ for (const [prefix] of [...depths].sort((a, b) => a[1] - b[1])) {
35
+ const groups = new Map<string, ChartStep[]>();
36
+ for (const s of leaving.get(prefix) ?? [])
37
+ if (!removed.has(s)) append(groups, tupleKey([s.label, s.when, s.to]), s);
38
+ const under = must(leaves, prefix);
39
+ for (const group of groups.values()) {
40
+ if (under < 2 || group.length < under) continue;
41
+ for (const s of group) removed.add(s);
42
+ lifted.push({ ...group[0], from: unkey(prefix) });
43
+ }
44
+ }
45
+ const kept: ChartStep[] = [];
46
+ for (const s of steps) if (!removed.has(s)) kept.push(s);
47
+ for (const s of lifted) kept.push(s);
48
+ return kept;
49
+ }
50
+
51
+ export function lift(chart: Chart): Chart {
52
+ const regions: Region[] = [];
53
+ for (const r of chart.regions) {
54
+ const known = new Map<string[], number>();
55
+ for (const s of r.states) known.set(s.path, known.size);
56
+ let numbers: Map<string, number> | undefined;
57
+ const pathIndex = (path: string[]) => {
58
+ let i = known.get(path);
59
+ if (i !== undefined) return i;
60
+ if (!numbers) {
61
+ numbers = new Map();
62
+ for (const s of r.states) numbers.set(tupleKey(s.path), numbers.size);
63
+ }
64
+ const k = tupleKey(path);
65
+ i = numbers.get(k);
66
+ if (i === undefined) numbers.set(k, (i = numbers.size));
67
+ known.set(path, i);
68
+ return i;
69
+ };
70
+ const merged = new Map<number | string, ChartStep>();
71
+ for (const s of liftToParents(r.states, r.steps)) {
72
+ const f = pathIndex(s.from);
73
+ const t = pathIndex(s.to);
74
+ const k =
75
+ s.when === undefined && f < 2 ** 26 && t < 2 ** 26
76
+ ? f * 2 ** 26 + t
77
+ : `${f},${t}:${s.when}`;
78
+ const prior = merged.get(k);
79
+ if (prior) prior.label += ` or ${s.label}`;
80
+ else merged.set(k, { ...s });
81
+ }
82
+ regions.push({ ...r, steps: [...merged.values()] });
83
+ }
84
+ return { ...chart, regions };
85
+ }
@@ -0,0 +1,68 @@
1
+ import {
2
+ append,
3
+ type Arrow,
4
+ type Bug,
5
+ type Chart,
6
+ holds,
7
+ type Labels,
8
+ loopOf,
9
+ must,
10
+ tupleKey,
11
+ unkey,
12
+ type Walk,
13
+ } from "../ir.ts";
14
+
15
+ export function loopCheck(
16
+ { regions, loops }: Chart,
17
+ { names, keys, drawnLabels, sorted }: Labels,
18
+ { index, from, to }: Walk,
19
+ found: Bug[],
20
+ ) {
21
+ const R = names.length;
22
+ const combo = (i: number) => {
23
+ const parts: string[] = [];
24
+ for (let r = 0; r < R; r++) parts.push(keys[r][i]);
25
+ return tupleKey(parts);
26
+ };
27
+ const stepsFrom = new Map<number, number[]>();
28
+ const arrowsFrom: Map<string, Arrow[]>[] = [];
29
+ if (loops.length) {
30
+ for (const j of sorted) append(stepsFrom, from[j], j);
31
+ for (const { arrows } of regions) {
32
+ const out = new Map<string, Arrow[]>();
33
+ for (const a of arrows) append(out, a.from, a);
34
+ arrowsFrom.push(out);
35
+ }
36
+ }
37
+ for (const b of found) {
38
+ if (b.loop === undefined) continue;
39
+ const inLoop = new Set<string>();
40
+ const twinsOf = new Map<string, number[]>();
41
+ for (const i of loopOf(b, index)) {
42
+ inLoop.add(combo(i));
43
+ append(twinsOf, combo(i), i);
44
+ }
45
+ for (const i of loopOf(b, index)) {
46
+ const twins = must(twinsOf, combo(i));
47
+ for (const [r, name] of names.entries()) {
48
+ const takes = (a: Arrow) => {
49
+ for (const s of twins)
50
+ for (const j of stepsFrom.get(s) ?? [])
51
+ if (drawnLabels[j] === a.label && keys[r][to[j]] === a.to) return true;
52
+ return false;
53
+ };
54
+ const rest: string[] = [];
55
+ for (let o = 0; o < R; o++) if (o !== r) rest.push(keys[o][i]);
56
+ for (const a of arrowsFrom[r].get(keys[r][i]) ?? []) {
57
+ if (!holds(a.condition, rest)) continue;
58
+ const next: string[] = [];
59
+ for (let o = 0; o < R; o++) next.push(o === r ? a.to : keys[o][i]);
60
+ if (!inLoop.has(tupleKey(next)) && !takes(a))
61
+ throw new Error(
62
+ `The chart draws the step ${a.label} out of ${name ? `${name} ` : ""}${unkey(a.from).join(" / ")}, but the ${b.rule.name} loop cannot take it there. Show in a label what stops it.`,
63
+ );
64
+ }
65
+ }
66
+ }
67
+ }
68
+ }
@@ -0,0 +1,60 @@
1
+ import {
2
+ type Bug,
3
+ type Graph,
4
+ hasRule,
5
+ type Lasso,
6
+ must,
7
+ type PathStep,
8
+ type Rule,
9
+ stateKey,
10
+ type Step,
11
+ type Trace,
12
+ type TraceState,
13
+ type Vars,
14
+ } from "../ir.ts";
15
+
16
+ export function pathGraph(names: string[]) {
17
+ const graph: Graph = { states: new Map(), steps: [] };
18
+ const ids = new Map<string, string>();
19
+ const taken = new Map<string, Step>();
20
+ const idOf = (vars: Vars | undefined, start: boolean) => {
21
+ if (!vars) throw new Error("TLC's trace has a state with no values.");
22
+ const k = stateKey(names.map((name) => vars[name]));
23
+ let id = ids.get(k);
24
+ if (id === undefined) {
25
+ ids.set(k, (id = String(ids.size)));
26
+ graph.states.set(id, { vars, start, breaks: [] });
27
+ } else if (start) must(graph.states, id).start = true;
28
+ return id;
29
+ };
30
+ const route = (seq: { action: string; vars: Vars | undefined }[]) => {
31
+ const start = idOf(seq[0].vars, true);
32
+ const path: PathStep[] = [];
33
+ let from = start;
34
+ for (let i = 1; i < seq.length; i++) {
35
+ const { action } = seq[i];
36
+ const to = idOf(seq[i].vars, false);
37
+ const k = `${from} ${to} ${action}`;
38
+ let step = taken.get(k);
39
+ if (!step) {
40
+ taken.set(k, (step = { from, to, action }));
41
+ graph.steps.push(step);
42
+ }
43
+ path.push({ action, state: to, step });
44
+ from = to;
45
+ }
46
+ return { start, path };
47
+ };
48
+ return {
49
+ graph,
50
+ bug: (rule: Rule, trace: TraceState[]): Bug => {
51
+ if (!trace.length) throw new Error(`TLC's trace for ${rule.name} has no states.`);
52
+ const bug = { rule, ...route(trace) };
53
+ const end = must(graph.states, bug.path.at(-1)?.state ?? bug.start);
54
+ if (!hasRule(end.breaks, rule)) end.breaks.push(rule);
55
+ return bug;
56
+ },
57
+ lasso: ({ seq, loop }: Trace): Lasso | undefined =>
58
+ seq.length ? { ...route(seq), loop, stutters: loop === seq.length - 1 } : undefined,
59
+ };
60
+ }
@@ -0,0 +1,135 @@
1
+ import {
2
+ type Bug,
3
+ byText,
4
+ count,
5
+ defaultState,
6
+ type Graph,
7
+ must,
8
+ type PathStep,
9
+ type Rule,
10
+ ruleKey,
11
+ sortBy,
12
+ type State,
13
+ type Walk,
14
+ } from "../ir.ts";
15
+
16
+ export function walk(graph: Graph): Walk {
17
+ const ids: string[] = [];
18
+ const states: State[] = [];
19
+ const nameOf: string[] = [];
20
+ const starts: number[] = [];
21
+ const unique = new Set<string>();
22
+ for (const [id, s] of graph.states) {
23
+ const name = defaultState(s.vars);
24
+ if (s.start) starts.push(ids.length);
25
+ ids.push(id);
26
+ states.push(s);
27
+ nameOf.push(name);
28
+ unique.add(name);
29
+ }
30
+ const names = Array.from(unique).sort(byText);
31
+ const rankOf = new Map<string, number>();
32
+ for (let i = 0; i < names.length; i++) rankOf.set(names[i], i);
33
+ const n = ids.length;
34
+ const index = new Map<string, number>();
35
+ const nameRank = new Int32Array(n);
36
+ for (let i = 0; i < n; i++) {
37
+ index.set(ids[i], i);
38
+ nameRank[i] = must(rankOf, nameOf[i]);
39
+ }
40
+ const m = graph.steps.length;
41
+ const from = new Int32Array(m);
42
+ const to = new Int32Array(m);
43
+ const action = new Int32Array(m);
44
+ const actions = new Map<string, number>();
45
+ for (let j = 0; j < m; j++) {
46
+ const t = graph.steps[j];
47
+ from[j] = must(index, t.from);
48
+ to[j] = must(index, t.to);
49
+ let a = actions.get(t.action);
50
+ if (a === undefined) actions.set(t.action, (a = actions.size));
51
+ action[j] = a;
52
+ }
53
+ const actionRank = new Int32Array(actions.size);
54
+ for (const [i, a] of [...actions.keys()].sort(byText).entries()) actionRank[must(actions, a)] = i;
55
+ const toName = new Int32Array(m);
56
+ for (let j = 0; j < m; j++) {
57
+ action[j] = actionRank[action[j]];
58
+ toName[j] = nameRank[to[j]];
59
+ }
60
+ const first = new Int32Array(n + 1);
61
+ for (let j = 0; j < m; j++) first[from[j] + 1]++;
62
+ for (let i = 0; i < n; i++) first[i + 1] += first[i];
63
+ const fill = first.slice(0, n);
64
+ const next = new Int32Array(m);
65
+ for (const j of sortBy(count(m), [action, toName])) next[fill[from[j]]++] = j;
66
+ starts.sort((a, b) => nameRank[a] - nameRank[b]);
67
+ const depth = new Int32Array(n).fill(-1);
68
+ const via = new Int32Array(n).fill(-1);
69
+ const reached = new Int32Array(n);
70
+ let size = 0;
71
+ for (const s of starts) {
72
+ depth[s] = 0;
73
+ reached[size++] = s;
74
+ }
75
+ for (let q = 0; q < size; q++) {
76
+ const s = reached[q];
77
+ for (let e = first[s]; e < first[s + 1]; e++) {
78
+ const t = to[next[e]];
79
+ if (depth[t] >= 0) continue;
80
+ depth[t] = depth[s] + 1;
81
+ via[t] = next[e];
82
+ reached[size++] = t;
83
+ }
84
+ }
85
+ return {
86
+ ids,
87
+ states,
88
+ index,
89
+ nameOf,
90
+ nameRank,
91
+ from,
92
+ to,
93
+ action,
94
+ depth,
95
+ via,
96
+ reached: reached.subarray(0, size),
97
+ starts,
98
+ };
99
+ }
100
+
101
+ export function drawOrder({ depth, nameRank }: Walk) {
102
+ const n = depth.length;
103
+ let deepest = 0;
104
+ for (let i = 0; i < n; i++) if (depth[i] > deepest) deepest = depth[i];
105
+ const level = new Int32Array(n);
106
+ for (let i = 0; i < n; i++) level[i] = depth[i] < 0 ? deepest + 1 : depth[i];
107
+ const order = sortBy(count(n), [level, nameRank]);
108
+ const rank = new Int32Array(n);
109
+ for (let p = 0; p < n; p++) rank[order[p]] = p;
110
+ return { order, rank };
111
+ }
112
+
113
+ export function bugs(graph: Graph, { ids, from, via, reached }: Walk = walk(graph)) {
114
+ const ends = new Map<string, string>();
115
+ for (const [id, s] of graph.states) for (const rule of s.ends ?? []) ends.set(ruleKey(rule), id);
116
+ const first = new Map<string, { rule: Rule; i: number }>();
117
+ for (const i of reached) {
118
+ const s = must(graph.states, ids[i]);
119
+ for (const rule of s.past ? s.ends : s.breaks) {
120
+ const k = ruleKey(rule);
121
+ if (!first.has(k) && (ends.get(k) ?? ids[i]) === ids[i]) first.set(k, { rule, i });
122
+ }
123
+ }
124
+ const found: Bug[] = [];
125
+ for (const { rule, i } of first.values()) {
126
+ const path: PathStep[] = [];
127
+ let start = i;
128
+ for (let j: number; (j = via[start]) >= 0; start = from[j]) {
129
+ const step = graph.steps[j];
130
+ path.unshift({ action: step.action, state: step.to, step });
131
+ }
132
+ found.push({ rule, start: ids[start], path });
133
+ }
134
+ return found;
135
+ }