@justjoshn/pi-pstack 0.0.0-stage → 0.15.36-pi.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +95 -2
- package/agents/comment-sicko.md +32 -0
- package/agents/poteto-agent.md +9 -0
- package/automations/benny/FOR_AGENTS.md +82 -0
- package/automations/benny/README.md +20 -0
- package/automations/benny/skills/reproduce-and-fix-issues/SKILL.md +310 -0
- package/automations/benny/skills/reproduce-and-fix-issues/references/control-adapter.md +169 -0
- package/automations/benny/skills/reproduce-and-fix-issues/references/feature-map.example.md +205 -0
- package/automations/benny/skills/reproduce-and-fix-issues/references/verify-existing-fix.md +93 -0
- package/automations/benny/skills/setup-benny/SKILL.md +253 -0
- package/automations/benny/skills/triage-issue-reports/SKILL.md +240 -0
- package/automations/benny/skills/triage-issue-reports/references/routing.example.md +61 -0
- package/automations/benny/templates/configuration.example.yaml +113 -0
- package/automations/benny/templates/reproduce-automation-prompt.md +49 -0
- package/automations/benny/templates/triage-automation-prompt.md +53 -0
- package/docs/guide/01-setup.md +67 -0
- package/docs/guide/02-poteto-mode.md +139 -0
- package/docs/guide/03-understand.md +79 -0
- package/docs/guide/04-design.md +133 -0
- package/docs/guide/05-build-and-clean.md +83 -0
- package/docs/guide/06-verify-and-ship.md +162 -0
- package/docs/guide/07-overnight.md +122 -0
- package/docs/guide/08-principles.md +72 -0
- package/docs/guide/09-make-it-yours.md +100 -0
- package/docs/guide/10-recipes-and-pitfalls.md +182 -0
- package/docs/guide/README.md +38 -0
- package/docs/guide/images/design.jpg +0 -0
- package/docs/guide/images/overnight.jpg +0 -0
- package/docs/guide/images/recipes.jpg +0 -0
- package/docs/guide/images/router.jpg +0 -0
- package/docs/guide/images/understanding.jpg +0 -0
- package/docs/guide/images/verification.jpg +0 -0
- package/docs/native-gaps.md +67 -0
- package/licenses/cursor-team-kit.LICENSE +21 -0
- package/licenses/pstack.LICENSE +21 -0
- package/package.json +51 -4
- package/scripts/live-e2e.mjs +257 -0
- package/skills/architect/SKILL.md +79 -0
- package/skills/architect/references/design-red-flags.md +57 -0
- package/skills/architect/references/rationale-template.md +35 -0
- package/skills/architect/references/runner-prompt.md +20 -0
- package/skills/arena/SKILL.md +48 -0
- package/skills/automate-me/SKILL.md +104 -0
- package/skills/benchmark-checklist/SKILL.md +39 -0
- package/skills/blast-radius/SKILL.md +50 -0
- package/skills/bro/SKILL.md +7 -0
- package/skills/control-cli/SKILL.md +109 -0
- package/skills/control-ui/SKILL.md +109 -0
- package/skills/correct/SKILL.md +32 -0
- package/skills/create-formal-verification-skill/SKILL.md +43 -0
- package/skills/create-skill/SKILL.md +62 -0
- package/skills/create-verification-skill/SKILL.md +44 -0
- package/skills/create-verification-skill/references/feature-map-example/README.md +47 -0
- package/skills/create-verification-skill/references/feature-map-example/create-note.md +39 -0
- package/skills/create-verification-skill/references/feature-map-example/search.md +45 -0
- package/skills/deslop/SKILL.md +22 -0
- package/skills/figure-it-out/SKILL.md +52 -0
- package/skills/how/SKILL.md +36 -0
- package/skills/how/references/explainer-prompt.md +55 -0
- package/skills/how/references/explorer-prompt.md +35 -0
- package/skills/in-your-own-words/SKILL.md +7 -0
- package/skills/interrogate/SKILL.md +31 -0
- package/skills/ketchup/SKILL.md +43 -0
- package/skills/ketchup-video/SKILL.md +29 -0
- package/skills/maintain-formal-verification-skill/SKILL.md +58 -0
- package/skills/maintain-verification-skill/SKILL.md +39 -0
- package/skills/make-bot-ui/SKILL.md +104 -0
- package/skills/no-comments/SKILL.md +24 -0
- package/skills/poteto-help/SKILL.md +161 -0
- package/skills/poteto-help/references/prompting.md +51 -0
- package/skills/poteto-help/references/recipes.md +51 -0
- package/skills/poteto-mode/SKILL.md +151 -0
- package/skills/poteto-mode/playbooks/authoring-a-skill.md +12 -0
- package/skills/poteto-mode/playbooks/autonomous-run.md +13 -0
- package/skills/poteto-mode/playbooks/autopilot-full.md +25 -0
- package/skills/poteto-mode/playbooks/autopilot-stack.md +8 -0
- package/skills/poteto-mode/playbooks/babysit.md +23 -0
- package/skills/poteto-mode/playbooks/bug-fix.md +15 -0
- package/skills/poteto-mode/playbooks/eval.md +25 -0
- package/skills/poteto-mode/playbooks/feature.md +21 -0
- package/skills/poteto-mode/playbooks/hillclimb.md +21 -0
- package/skills/poteto-mode/playbooks/investigation.md +14 -0
- package/skills/poteto-mode/playbooks/multi-phase-plan.md +155 -0
- package/skills/poteto-mode/playbooks/opening-a-pr.md +34 -0
- package/skills/poteto-mode/playbooks/orchestrate.md +25 -0
- package/skills/poteto-mode/playbooks/pause-safely.md +10 -0
- package/skills/poteto-mode/playbooks/perf-issue.md +25 -0
- package/skills/poteto-mode/playbooks/prototype.md +14 -0
- package/skills/poteto-mode/playbooks/refactoring.md +16 -0
- package/skills/poteto-mode/playbooks/runtime-forensics.md +11 -0
- package/skills/poteto-mode/playbooks/session-pickup.md +11 -0
- package/skills/poteto-mode/playbooks/shipping.md +12 -0
- package/skills/poteto-mode/playbooks/trace-forensics.md +14 -0
- package/skills/poteto-mode/playbooks/visual-parity.md +11 -0
- package/skills/poteto-mode/playbooks/worktree-cleanup.md +12 -0
- package/skills/poteto-mode/references/bugbot-triage.md +142 -0
- package/skills/poteto-mode/scripts/bootstrap.ts +62 -0
- package/skills/poteto-mode/scripts/bun.lock +67 -0
- package/skills/poteto-mode/scripts/check-plan.mjs +205 -0
- package/skills/poteto-mode/scripts/check-plan.test.ts +110 -0
- package/skills/poteto-mode/scripts/package.json +16 -0
- package/skills/poteto-mode/scripts/watch-pr/cli.test.ts +224 -0
- package/skills/poteto-mode/scripts/watch-pr/cli.ts +223 -0
- package/skills/poteto-mode/scripts/watch-pr/fakes.test-helper.ts +129 -0
- package/skills/poteto-mode/scripts/watch-pr/github.test.ts +498 -0
- package/skills/poteto-mode/scripts/watch-pr/github.ts +726 -0
- package/skills/poteto-mode/scripts/watch-pr/policy.test.ts +482 -0
- package/skills/poteto-mode/scripts/watch-pr/policy.ts +842 -0
- package/skills/poteto-mode/scripts/watch-pr/render.ts +169 -0
- package/skills/poteto-mode/scripts/watch-pr/tsconfig.json +13 -0
- package/skills/poteto-mode/scripts/watch-pr/types.compile.ts +93 -0
- package/skills/poteto-mode/scripts/watch-pr/types.ts +414 -0
- package/skills/poteto-mode/scripts/watch-pr/watch-pr +6 -0
- package/skills/poteto-mode/scripts/worktree-audit.sh +156 -0
- package/skills/principle-attack-the-premise/SKILL.md +21 -0
- package/skills/principle-boundary-discipline/SKILL.md +34 -0
- package/skills/principle-build-the-lever/SKILL.md +23 -0
- package/skills/principle-encode-lessons-in-structure/SKILL.md +11 -0
- package/skills/principle-exhaust-the-design-space/SKILL.md +9 -0
- package/skills/principle-experience-first/SKILL.md +19 -0
- package/skills/principle-explain-the-number/SKILL.md +18 -0
- package/skills/principle-fix-root-causes/SKILL.md +21 -0
- package/skills/principle-foundational-thinking/SKILL.md +21 -0
- package/skills/principle-guard-the-context-window/SKILL.md +12 -0
- package/skills/principle-laziness-protocol/SKILL.md +10 -0
- package/skills/principle-make-operations-idempotent/SKILL.md +22 -0
- package/skills/principle-migrate-callers-then-delete-legacy-apis/SKILL.md +14 -0
- package/skills/principle-minimize-reader-load/SKILL.md +18 -0
- package/skills/principle-model-the-domain/SKILL.md +24 -0
- package/skills/principle-never-block-on-the-human/SKILL.md +15 -0
- package/skills/principle-outcome-oriented-execution/SKILL.md +21 -0
- package/skills/principle-prove-it-works/SKILL.md +22 -0
- package/skills/principle-redesign-from-first-principles/SKILL.md +16 -0
- package/skills/principle-separate-before-serializing-shared-state/SKILL.md +16 -0
- package/skills/principle-sequence-verifiable-units/SKILL.md +17 -0
- package/skills/principle-subtract-before-you-add/SKILL.md +18 -0
- package/skills/principle-test-behavior-not-implementation/SKILL.md +20 -0
- package/skills/principle-type-system-discipline/SKILL.md +13 -0
- package/skills/recall/SKILL.md +35 -0
- package/skills/reflect/SKILL.md +69 -0
- package/skills/reflect/references/divergent-reviewer.md +38 -0
- package/skills/reflect/references/judgment-reviewer.md +37 -0
- package/skills/reflect/references/synthesizer.md +56 -0
- package/skills/reflect/references/tooling-reviewer.md +48 -0
- package/skills/setup-pstack/SKILL.md +74 -0
- package/skills/sharpen/SKILL.md +16 -0
- package/skills/show-me-your-work/SKILL.md +82 -0
- package/skills/show-me-your-work/references/decision-log-template.tsv +1 -0
- package/skills/show-me-your-work/scripts/log.sh +42 -0
- package/skills/statechart/SKILL.md +82 -0
- package/skills/statechart/references/render.md +93 -0
- package/skills/statechart/scripts/backends/cfg.ts +33 -0
- package/skills/statechart/scripts/backends/mermaid.ts +201 -0
- package/skills/statechart/scripts/backends/plain-text.ts +72 -0
- package/skills/statechart/scripts/backends/report.ts +177 -0
- package/skills/statechart/scripts/frontends/config.ts +276 -0
- package/skills/statechart/scripts/frontends/dot.ts +74 -0
- package/skills/statechart/scripts/frontends/marks.ts +93 -0
- package/skills/statechart/scripts/frontends/messages.ts +52 -0
- package/skills/statechart/scripts/frontends/spec.ts +114 -0
- package/skills/statechart/scripts/frontends/trace.ts +24 -0
- package/skills/statechart/scripts/frontends/value.ts +166 -0
- package/skills/statechart/scripts/frontends/verdict.ts +40 -0
- package/skills/statechart/scripts/frontends/view.ts +119 -0
- package/skills/statechart/scripts/ir.ts +547 -0
- package/skills/statechart/scripts/package.json +11 -0
- package/skills/statechart/scripts/passes/annotate.ts +128 -0
- package/skills/statechart/scripts/passes/label.ts +269 -0
- package/skills/statechart/scripts/passes/lift.ts +85 -0
- package/skills/statechart/scripts/passes/loop-check.ts +68 -0
- package/skills/statechart/scripts/passes/paths.ts +60 -0
- package/skills/statechart/scripts/passes/reach.ts +135 -0
- package/skills/statechart/scripts/passes/region-check.ts +97 -0
- package/skills/statechart/scripts/passes/regions.ts +295 -0
- package/skills/statechart/scripts/pipeline.ts +76 -0
- package/skills/statechart/scripts/run.ts +481 -0
- package/skills/statechart/scripts/statechart +29 -0
- package/skills/statechart/scripts/statechart.ts +164 -0
- package/skills/statechart/scripts/test/ConfigOracle.java +63 -0
- package/skills/statechart/scripts/test/chart.test.ts +1210 -0
- package/skills/statechart/scripts/test/charts/Braces.mmd +7 -0
- package/skills/statechart/scripts/test/charts/Escapes.mmd +11 -0
- package/skills/statechart/scripts/test/charts/Phases.mmd +29 -0
- package/skills/statechart/scripts/test/cli.test.ts +1314 -0
- package/skills/statechart/scripts/test/config-fuzz.test.ts +263 -0
- package/skills/statechart/scripts/test/corpus/Counter/ChartRun.out +57 -0
- package/skills/statechart/scripts/test/corpus/Counter/Counter.cfg +3 -0
- package/skills/statechart/scripts/test/corpus/Counter/Counter.tla +10 -0
- package/skills/statechart/scripts/test/corpus/Counter/chart.mmd +9 -0
- package/skills/statechart/scripts/test/corpus/Counter/graph.dot +16 -0
- package/skills/statechart/scripts/test/corpus/Counter/report.md +7 -0
- package/skills/statechart/scripts/test/corpus/Counter/sany.out +2 -0
- package/skills/statechart/scripts/test/corpus/Counter/verdict-1.out +49 -0
- package/skills/statechart/scripts/test/corpus/CounterAction/ChartRun.out +60 -0
- package/skills/statechart/scripts/test/corpus/CounterAction/CounterAction.cfg +4 -0
- package/skills/statechart/scripts/test/corpus/CounterAction/CounterAction.tla +22 -0
- package/skills/statechart/scripts/test/corpus/CounterAction/chart.mmd +26 -0
- package/skills/statechart/scripts/test/corpus/CounterAction/graph.dot +19 -0
- package/skills/statechart/scripts/test/corpus/CounterAction/report.md +20 -0
- package/skills/statechart/scripts/test/corpus/CounterAction/sany.out +2 -0
- package/skills/statechart/scripts/test/corpus/CounterAction/verdict-1.exit +1 -0
- package/skills/statechart/scripts/test/corpus/CounterAction/verdict-1.out +56 -0
- package/skills/statechart/scripts/test/corpus/CounterAction/verdict-2.exit +1 -0
- package/skills/statechart/scripts/test/corpus/CounterAction/verdict-2.out +82 -0
- package/skills/statechart/scripts/test/corpus/CounterAction/verdict-3.out +57 -0
- package/skills/statechart/scripts/test/corpus/CounterDeadlock/ChartRun.out +59 -0
- package/skills/statechart/scripts/test/corpus/CounterDeadlock/CounterDeadlock.cfg +3 -0
- package/skills/statechart/scripts/test/corpus/CounterDeadlock/CounterDeadlock.tla +11 -0
- package/skills/statechart/scripts/test/corpus/CounterDeadlock/chart.mmd +22 -0
- package/skills/statechart/scripts/test/corpus/CounterDeadlock/graph.dot +16 -0
- package/skills/statechart/scripts/test/corpus/CounterDeadlock/report.md +17 -0
- package/skills/statechart/scripts/test/corpus/CounterDeadlock/sany.out +2 -0
- package/skills/statechart/scripts/test/corpus/CounterDeadlock/verdict-1.exit +1 -0
- package/skills/statechart/scripts/test/corpus/CounterDeadlock/verdict-1.out +56 -0
- package/skills/statechart/scripts/test/corpus/CounterDeadlock/verdict-2.exit +1 -0
- package/skills/statechart/scripts/test/corpus/CounterDeadlock/verdict-2.out +77 -0
- package/skills/statechart/scripts/test/corpus/CounterFan/ChartRun.out +69 -0
- package/skills/statechart/scripts/test/corpus/CounterFan/CounterFan.cfg +2 -0
- package/skills/statechart/scripts/test/corpus/CounterFan/CounterFan.tla +11 -0
- package/skills/statechart/scripts/test/corpus/CounterFan/chart.mmd +85 -0
- package/skills/statechart/scripts/test/corpus/CounterFan/graph.dot +70 -0
- package/skills/statechart/scripts/test/corpus/CounterFan/report.md +12 -0
- package/skills/statechart/scripts/test/corpus/CounterFan/sany.out +2 -0
- package/skills/statechart/scripts/test/corpus/CounterFan/verdict-1.exit +1 -0
- package/skills/statechart/scripts/test/corpus/CounterFan/verdict-1.out +67 -0
- package/skills/statechart/scripts/test/corpus/CounterFan/verdict-2.out +57 -0
- package/skills/statechart/scripts/test/corpus/CounterGuard/ChartRun.exit +1 -0
- package/skills/statechart/scripts/test/corpus/CounterGuard/ChartRun.out +85 -0
- package/skills/statechart/scripts/test/corpus/CounterGuard/CounterGuard.cfg +6 -0
- package/skills/statechart/scripts/test/corpus/CounterGuard/CounterGuard.tla +13 -0
- package/skills/statechart/scripts/test/corpus/CounterGuard/chart.mmd +5 -0
- package/skills/statechart/scripts/test/corpus/CounterGuard/graph.dot +10 -0
- package/skills/statechart/scripts/test/corpus/CounterGuard/report.md +31 -0
- package/skills/statechart/scripts/test/corpus/CounterGuard/sany.out +2 -0
- package/skills/statechart/scripts/test/corpus/CounterGuard/verdict-1.exit +1 -0
- package/skills/statechart/scripts/test/corpus/CounterGuard/verdict-1.out +64 -0
- package/skills/statechart/scripts/test/corpus/CounterGuard/verdict-2.exit +1 -0
- package/skills/statechart/scripts/test/corpus/CounterGuard/verdict-2.out +77 -0
- package/skills/statechart/scripts/test/corpus/CounterInitPast/ChartRun.out +55 -0
- package/skills/statechart/scripts/test/corpus/CounterInitPast/CounterInitPast.cfg +3 -0
- package/skills/statechart/scripts/test/corpus/CounterInitPast/CounterInitPast.tla +10 -0
- package/skills/statechart/scripts/test/corpus/CounterInitPast/chart.mmd +12 -0
- package/skills/statechart/scripts/test/corpus/CounterInitPast/graph.dot +6 -0
- package/skills/statechart/scripts/test/corpus/CounterInitPast/report.md +12 -0
- package/skills/statechart/scripts/test/corpus/CounterInitPast/sany.out +2 -0
- package/skills/statechart/scripts/test/corpus/CounterInitPast/verdict-1.exit +1 -0
- package/skills/statechart/scripts/test/corpus/CounterInitPast/verdict-1.out +33 -0
- package/skills/statechart/scripts/test/corpus/CounterInitPast/verdict-2.out +54 -0
- package/skills/statechart/scripts/test/corpus/CounterInitPastHolds/ChartRun.out +54 -0
- package/skills/statechart/scripts/test/corpus/CounterInitPastHolds/CounterInitPastHolds.cfg +3 -0
- package/skills/statechart/scripts/test/corpus/CounterInitPastHolds/CounterInitPastHolds.tla +10 -0
- package/skills/statechart/scripts/test/corpus/CounterInitPastHolds/chart.mmd +1 -0
- package/skills/statechart/scripts/test/corpus/CounterInitPastHolds/graph.dot +6 -0
- package/skills/statechart/scripts/test/corpus/CounterInitPastHolds/report.md +7 -0
- package/skills/statechart/scripts/test/corpus/CounterInitPastHolds/sany.out +2 -0
- package/skills/statechart/scripts/test/corpus/CounterInitPastHolds/verdict-1.out +46 -0
- package/skills/statechart/scripts/test/corpus/CounterInstance/ChartRun.out +59 -0
- package/skills/statechart/scripts/test/corpus/CounterInstance/CounterInstance.cfg +2 -0
- package/skills/statechart/scripts/test/corpus/CounterInstance/CounterInstance.tla +10 -0
- package/skills/statechart/scripts/test/corpus/CounterInstance/CounterSteps.tla +6 -0
- package/skills/statechart/scripts/test/corpus/CounterInstance/chart.mmd +17 -0
- package/skills/statechart/scripts/test/corpus/CounterInstance/graph.dot +15 -0
- package/skills/statechart/scripts/test/corpus/CounterInstance/report.md +14 -0
- package/skills/statechart/scripts/test/corpus/CounterInstance/sany.out +3 -0
- package/skills/statechart/scripts/test/corpus/CounterInstance/verdict-1.exit +1 -0
- package/skills/statechart/scripts/test/corpus/CounterInstance/verdict-1.out +78 -0
- package/skills/statechart/scripts/test/corpus/CounterJump/ChartRun.out +59 -0
- package/skills/statechart/scripts/test/corpus/CounterJump/CounterJump.cfg +3 -0
- package/skills/statechart/scripts/test/corpus/CounterJump/CounterJump.tla +19 -0
- package/skills/statechart/scripts/test/corpus/CounterJump/chart.mmd +26 -0
- package/skills/statechart/scripts/test/corpus/CounterJump/graph.dot +22 -0
- package/skills/statechart/scripts/test/corpus/CounterJump/report.md +12 -0
- package/skills/statechart/scripts/test/corpus/CounterJump/sany.out +2 -0
- package/skills/statechart/scripts/test/corpus/CounterJump/verdict-1.exit +1 -0
- package/skills/statechart/scripts/test/corpus/CounterJump/verdict-1.out +58 -0
- package/skills/statechart/scripts/test/corpus/CounterJump/verdict-2.out +57 -0
- package/skills/statechart/scripts/test/corpus/CounterLoop/ChartRun.out +57 -0
- package/skills/statechart/scripts/test/corpus/CounterLoop/CounterLoop.cfg +2 -0
- package/skills/statechart/scripts/test/corpus/CounterLoop/CounterLoop.tla +11 -0
- package/skills/statechart/scripts/test/corpus/CounterLoop/chart.mmd +17 -0
- package/skills/statechart/scripts/test/corpus/CounterLoop/graph.dot +15 -0
- package/skills/statechart/scripts/test/corpus/CounterLoop/report.md +14 -0
- package/skills/statechart/scripts/test/corpus/CounterLoop/sany.out +2 -0
- package/skills/statechart/scripts/test/corpus/CounterLoop/verdict-1.exit +1 -0
- package/skills/statechart/scripts/test/corpus/CounterLoop/verdict-1.out +76 -0
- package/skills/statechart/scripts/test/corpus/CounterOrder/ChartRun.out +59 -0
- package/skills/statechart/scripts/test/corpus/CounterOrder/CounterOrder.cfg +3 -0
- package/skills/statechart/scripts/test/corpus/CounterOrder/CounterOrder.tla +11 -0
- package/skills/statechart/scripts/test/corpus/CounterOrder/chart.mmd +19 -0
- package/skills/statechart/scripts/test/corpus/CounterOrder/graph.dot +10 -0
- package/skills/statechart/scripts/test/corpus/CounterOrder/report.md +15 -0
- package/skills/statechart/scripts/test/corpus/CounterOrder/sany.out +2 -0
- package/skills/statechart/scripts/test/corpus/CounterOrder/verdict-1.exit +1 -0
- package/skills/statechart/scripts/test/corpus/CounterOrder/verdict-1.out +56 -0
- package/skills/statechart/scripts/test/corpus/CounterOrder/verdict-2.exit +1 -0
- package/skills/statechart/scripts/test/corpus/CounterOrder/verdict-2.out +67 -0
- package/skills/statechart/scripts/test/corpus/CounterRules/ChartRun.out +62 -0
- package/skills/statechart/scripts/test/corpus/CounterRules/CounterRules.cfg +6 -0
- package/skills/statechart/scripts/test/corpus/CounterRules/CounterRules.tla +24 -0
- package/skills/statechart/scripts/test/corpus/CounterRules/Moves.tla +5 -0
- package/skills/statechart/scripts/test/corpus/CounterRules/chart.mmd +22 -0
- package/skills/statechart/scripts/test/corpus/CounterRules/graph.dot +10 -0
- package/skills/statechart/scripts/test/corpus/CounterRules/report.md +23 -0
- package/skills/statechart/scripts/test/corpus/CounterRules/sany.out +3 -0
- package/skills/statechart/scripts/test/corpus/CounterRules/verdict-1.exit +1 -0
- package/skills/statechart/scripts/test/corpus/CounterRules/verdict-1.out +58 -0
- package/skills/statechart/scripts/test/corpus/CounterRules/verdict-2.exit +1 -0
- package/skills/statechart/scripts/test/corpus/CounterRules/verdict-2.out +66 -0
- package/skills/statechart/scripts/test/corpus/CounterRules/verdict-3.exit +1 -0
- package/skills/statechart/scripts/test/corpus/CounterRules/verdict-3.out +74 -0
- package/skills/statechart/scripts/test/corpus/CounterRules/verdict-4.out +59 -0
- package/skills/statechart/scripts/test/corpus/CounterStart/ChartRun.out +58 -0
- package/skills/statechart/scripts/test/corpus/CounterStart/CounterStart.cfg +3 -0
- package/skills/statechart/scripts/test/corpus/CounterStart/CounterStart.tla +15 -0
- package/skills/statechart/scripts/test/corpus/CounterStart/chart.mmd +18 -0
- package/skills/statechart/scripts/test/corpus/CounterStart/graph.dot +13 -0
- package/skills/statechart/scripts/test/corpus/CounterStart/report.md +11 -0
- package/skills/statechart/scripts/test/corpus/CounterStart/sany.out +2 -0
- package/skills/statechart/scripts/test/corpus/CounterStart/verdict-1.exit +1 -0
- package/skills/statechart/scripts/test/corpus/CounterStart/verdict-1.out +33 -0
- package/skills/statechart/scripts/test/corpus/CounterStart/verdict-2.out +57 -0
- package/skills/statechart/scripts/test/corpus/CounterStop/ChartRun.out +57 -0
- package/skills/statechart/scripts/test/corpus/CounterStop/CounterStop.cfg +3 -0
- package/skills/statechart/scripts/test/corpus/CounterStop/CounterStop.tla +15 -0
- package/skills/statechart/scripts/test/corpus/CounterStop/chart.mmd +7 -0
- package/skills/statechart/scripts/test/corpus/CounterStop/graph.dot +13 -0
- package/skills/statechart/scripts/test/corpus/CounterStop/report.md +6 -0
- package/skills/statechart/scripts/test/corpus/CounterStop/sany.out +2 -0
- package/skills/statechart/scripts/test/corpus/CounterStop/verdict-1.out +49 -0
- package/skills/statechart/scripts/test/corpus/CounterTie/ChartRun.out +61 -0
- package/skills/statechart/scripts/test/corpus/CounterTie/CounterTie.cfg +4 -0
- package/skills/statechart/scripts/test/corpus/CounterTie/CounterTie.tla +14 -0
- package/skills/statechart/scripts/test/corpus/CounterTie/chart.mmd +30 -0
- package/skills/statechart/scripts/test/corpus/CounterTie/graph.dot +19 -0
- package/skills/statechart/scripts/test/corpus/CounterTie/report.md +27 -0
- package/skills/statechart/scripts/test/corpus/CounterTie/sany.out +2 -0
- package/skills/statechart/scripts/test/corpus/CounterTie/verdict-1.exit +1 -0
- package/skills/statechart/scripts/test/corpus/CounterTie/verdict-1.out +56 -0
- package/skills/statechart/scripts/test/corpus/CounterTie/verdict-2.exit +1 -0
- package/skills/statechart/scripts/test/corpus/CounterTie/verdict-2.out +64 -0
- package/skills/statechart/scripts/test/corpus/CounterTie/verdict-3.exit +1 -0
- package/skills/statechart/scripts/test/corpus/CounterTie/verdict-3.out +87 -0
- package/skills/statechart/scripts/test/corpus/CounterTie/verdict-4.out +57 -0
- package/skills/statechart/scripts/test/corpus/CounterTieInGraph/ChartRun.out +60 -0
- package/skills/statechart/scripts/test/corpus/CounterTieInGraph/CounterTieInGraph.cfg +3 -0
- package/skills/statechart/scripts/test/corpus/CounterTieInGraph/CounterTieInGraph.tla +12 -0
- package/skills/statechart/scripts/test/corpus/CounterTieInGraph/chart.mmd +23 -0
- package/skills/statechart/scripts/test/corpus/CounterTieInGraph/graph.dot +19 -0
- package/skills/statechart/scripts/test/corpus/CounterTieInGraph/report.md +11 -0
- package/skills/statechart/scripts/test/corpus/CounterTieInGraph/sany.out +2 -0
- package/skills/statechart/scripts/test/corpus/CounterTieInGraph/verdict-1.exit +1 -0
- package/skills/statechart/scripts/test/corpus/CounterTieInGraph/verdict-1.out +56 -0
- package/skills/statechart/scripts/test/corpus/CounterTieInGraph/verdict-2.out +57 -0
- package/skills/statechart/scripts/test/corpus/CounterView/ChartRun.out +61 -0
- package/skills/statechart/scripts/test/corpus/CounterView/CounterView.cfg +4 -0
- package/skills/statechart/scripts/test/corpus/CounterView/CounterView.tla +14 -0
- package/skills/statechart/scripts/test/corpus/CounterView/chart.mmd +23 -0
- package/skills/statechart/scripts/test/corpus/CounterView/graph.dot +19 -0
- package/skills/statechart/scripts/test/corpus/CounterView/report.md +27 -0
- package/skills/statechart/scripts/test/corpus/CounterView/sany.out +2 -0
- package/skills/statechart/scripts/test/corpus/CounterView/verdict-1.exit +1 -0
- package/skills/statechart/scripts/test/corpus/CounterView/verdict-1.out +56 -0
- package/skills/statechart/scripts/test/corpus/CounterView/verdict-2.exit +1 -0
- package/skills/statechart/scripts/test/corpus/CounterView/verdict-2.out +64 -0
- package/skills/statechart/scripts/test/corpus/CounterView/verdict-3.exit +1 -0
- package/skills/statechart/scripts/test/corpus/CounterView/verdict-3.out +87 -0
- package/skills/statechart/scripts/test/corpus/CounterView/verdict-4.out +57 -0
- package/skills/statechart/scripts/test/corpus/CounterView/view.mjs +1 -0
- package/skills/statechart/scripts/test/corpus/DieHard/ChartRun.out +59 -0
- package/skills/statechart/scripts/test/corpus/DieHard/DieHard.cfg +4 -0
- package/skills/statechart/scripts/test/corpus/DieHard/DieHard.tla +38 -0
- package/skills/statechart/scripts/test/corpus/DieHard/chart.mmd +92 -0
- package/skills/statechart/scripts/test/corpus/DieHard/graph.dot +126 -0
- package/skills/statechart/scripts/test/corpus/DieHard/report.md +17 -0
- package/skills/statechart/scripts/test/corpus/DieHard/sany.out +2 -0
- package/skills/statechart/scripts/test/corpus/DieHard/verdict-1.exit +1 -0
- package/skills/statechart/scripts/test/corpus/DieHard/verdict-1.out +91 -0
- package/skills/statechart/scripts/test/corpus/DieHard/verdict-2.out +57 -0
- package/skills/statechart/scripts/test/corpus/FirstRule/ChartRun.out +61 -0
- package/skills/statechart/scripts/test/corpus/FirstRule/FirstRule.cfg +6 -0
- package/skills/statechart/scripts/test/corpus/FirstRule/FirstRule.tla +11 -0
- package/skills/statechart/scripts/test/corpus/FirstRule/chart.mmd +22 -0
- package/skills/statechart/scripts/test/corpus/FirstRule/graph.dot +16 -0
- package/skills/statechart/scripts/test/corpus/FirstRule/report.md +25 -0
- package/skills/statechart/scripts/test/corpus/FirstRule/sany.out +2 -0
- package/skills/statechart/scripts/test/corpus/FirstRule/verdict-1.exit +1 -0
- package/skills/statechart/scripts/test/corpus/FirstRule/verdict-1.out +56 -0
- package/skills/statechart/scripts/test/corpus/FirstRule/verdict-2.exit +1 -0
- package/skills/statechart/scripts/test/corpus/FirstRule/verdict-2.out +64 -0
- package/skills/statechart/scripts/test/corpus/FirstRule/verdict-3.exit +1 -0
- package/skills/statechart/scripts/test/corpus/FirstRule/verdict-3.out +64 -0
- package/skills/statechart/scripts/test/corpus/FirstRule/verdict-4.exit +1 -0
- package/skills/statechart/scripts/test/corpus/FirstRule/verdict-4.out +77 -0
- package/skills/statechart/scripts/test/corpus/HiddenClock/ChartRun.out +57 -0
- package/skills/statechart/scripts/test/corpus/HiddenClock/HiddenClock.cfg +4 -0
- package/skills/statechart/scripts/test/corpus/HiddenClock/HiddenClock.tla +11 -0
- package/skills/statechart/scripts/test/corpus/HiddenClock/chart.mmd +13 -0
- package/skills/statechart/scripts/test/corpus/HiddenClock/graph.dot +12 -0
- package/skills/statechart/scripts/test/corpus/HiddenClock/report.md +11 -0
- package/skills/statechart/scripts/test/corpus/HiddenClock/sany.out +2 -0
- package/skills/statechart/scripts/test/corpus/HiddenClock/verdict-1.exit +1 -0
- package/skills/statechart/scripts/test/corpus/HiddenClock/verdict-1.out +72 -0
- package/skills/statechart/scripts/test/corpus/Login/ChartRun.out +57 -0
- package/skills/statechart/scripts/test/corpus/Login/Login.cfg +3 -0
- package/skills/statechart/scripts/test/corpus/Login/Login.tla +62 -0
- package/skills/statechart/scripts/test/corpus/Login/chart.mmd +27 -0
- package/skills/statechart/scripts/test/corpus/Login/graph.dot +40 -0
- package/skills/statechart/scripts/test/corpus/Login/report.md +7 -0
- package/skills/statechart/scripts/test/corpus/Login/sany.out +1 -0
- package/skills/statechart/scripts/test/corpus/Login/verdict-1.out +47 -0
- package/skills/statechart/scripts/test/corpus/Login/view.mjs +1 -0
- package/skills/statechart/scripts/test/corpus/LoginGuarded/ChartRun.out +57 -0
- package/skills/statechart/scripts/test/corpus/LoginGuarded/LoginGuarded.cfg +2 -0
- package/skills/statechart/scripts/test/corpus/LoginGuarded/LoginGuarded.tla +64 -0
- package/skills/statechart/scripts/test/corpus/LoginGuarded/chart.mmd +28 -0
- package/skills/statechart/scripts/test/corpus/LoginGuarded/graph.dot +37 -0
- package/skills/statechart/scripts/test/corpus/LoginGuarded/report.md +8 -0
- package/skills/statechart/scripts/test/corpus/LoginGuarded/sany.out +1 -0
- package/skills/statechart/scripts/test/corpus/LoginGuarded/verdict-1.out +47 -0
- package/skills/statechart/scripts/test/corpus/LoginGuarded/view.mjs +1 -0
- package/skills/statechart/scripts/test/corpus/LoginParallel/ChartRun.out +60 -0
- package/skills/statechart/scripts/test/corpus/LoginParallel/LoginParallel.cfg +3 -0
- package/skills/statechart/scripts/test/corpus/LoginParallel/LoginParallel.tla +64 -0
- package/skills/statechart/scripts/test/corpus/LoginParallel/chart.mmd +44 -0
- package/skills/statechart/scripts/test/corpus/LoginParallel/graph.dot +58 -0
- package/skills/statechart/scripts/test/corpus/LoginParallel/report.md +17 -0
- package/skills/statechart/scripts/test/corpus/LoginParallel/sany.out +1 -0
- package/skills/statechart/scripts/test/corpus/LoginParallel/verdict-1.exit +1 -0
- package/skills/statechart/scripts/test/corpus/LoginParallel/verdict-1.out +83 -0
- package/skills/statechart/scripts/test/corpus/LoginParallel/verdict-2.out +57 -0
- package/skills/statechart/scripts/test/corpus/LoginParallel/view.mjs +1 -0
- package/skills/statechart/scripts/test/corpus/MediaPlayer/ChartRun.out +60 -0
- package/skills/statechart/scripts/test/corpus/MediaPlayer/MediaPlayer.cfg +3 -0
- package/skills/statechart/scripts/test/corpus/MediaPlayer/MediaPlayer.tla +103 -0
- package/skills/statechart/scripts/test/corpus/MediaPlayer/chart.mmd +43 -0
- package/skills/statechart/scripts/test/corpus/MediaPlayer/graph.dot +93 -0
- package/skills/statechart/scripts/test/corpus/MediaPlayer/report.md +14 -0
- package/skills/statechart/scripts/test/corpus/MediaPlayer/sany.out +1 -0
- package/skills/statechart/scripts/test/corpus/MediaPlayer/verdict-1.exit +1 -0
- package/skills/statechart/scripts/test/corpus/MediaPlayer/verdict-1.out +59 -0
- package/skills/statechart/scripts/test/corpus/MediaPlayer/verdict-2.out +72 -0
- package/skills/statechart/scripts/test/corpus/MediaPlayer/view.mjs +3 -0
- package/skills/statechart/scripts/test/corpus/MediaPlayerFixed/ChartRun.out +57 -0
- package/skills/statechart/scripts/test/corpus/MediaPlayerFixed/MediaPlayerFixed.cfg +2 -0
- package/skills/statechart/scripts/test/corpus/MediaPlayerFixed/MediaPlayerFixed.tla +100 -0
- package/skills/statechart/scripts/test/corpus/MediaPlayerFixed/chart.mmd +31 -0
- package/skills/statechart/scripts/test/corpus/MediaPlayerFixed/graph.dot +85 -0
- package/skills/statechart/scripts/test/corpus/MediaPlayerFixed/report.md +9 -0
- package/skills/statechart/scripts/test/corpus/MediaPlayerFixed/sany.out +1 -0
- package/skills/statechart/scripts/test/corpus/MediaPlayerFixed/verdict-1.out +47 -0
- package/skills/statechart/scripts/test/corpus/MediaPlayerFixed/view.mjs +3 -0
- package/skills/statechart/scripts/test/corpus/MediaPlayerProps/ChartRun.out +59 -0
- package/skills/statechart/scripts/test/corpus/MediaPlayerProps/MediaPlayer.tla +103 -0
- package/skills/statechart/scripts/test/corpus/MediaPlayerProps/MediaPlayerProps.cfg +3 -0
- package/skills/statechart/scripts/test/corpus/MediaPlayerProps/MediaPlayerProps.tla +6 -0
- package/skills/statechart/scripts/test/corpus/MediaPlayerProps/chart.mmd +42 -0
- package/skills/statechart/scripts/test/corpus/MediaPlayerProps/graph.dot +93 -0
- package/skills/statechart/scripts/test/corpus/MediaPlayerProps/report.md +19 -0
- package/skills/statechart/scripts/test/corpus/MediaPlayerProps/sany.out +2 -0
- package/skills/statechart/scripts/test/corpus/MediaPlayerProps/verdict-1.exit +1 -0
- package/skills/statechart/scripts/test/corpus/MediaPlayerProps/verdict-1.out +61 -0
- package/skills/statechart/scripts/test/corpus/MediaPlayerProps/verdict-2.out +59 -0
- package/skills/statechart/scripts/test/corpus/MediaPlayerProps/verdict-3.out +61 -0
- package/skills/statechart/scripts/test/corpus/MediaPlayerProps/verdict-4.exit +1 -0
- package/skills/statechart/scripts/test/corpus/MediaPlayerProps/verdict-4.out +66 -0
- package/skills/statechart/scripts/test/corpus/MediaPlayerProps/verdict-5.exit +1 -0
- package/skills/statechart/scripts/test/corpus/MediaPlayerProps/verdict-5.out +58 -0
- package/skills/statechart/scripts/test/corpus/MediaPlayerProps/verdict-6.out +49 -0
- package/skills/statechart/scripts/test/corpus/MediaPlayerProps/view.mjs +3 -0
- package/skills/statechart/scripts/test/corpus/PickWorker/ChartRun.out +57 -0
- package/skills/statechart/scripts/test/corpus/PickWorker/PickWorker.cfg +6 -0
- package/skills/statechart/scripts/test/corpus/PickWorker/PickWorker.tla +11 -0
- package/skills/statechart/scripts/test/corpus/PickWorker/chart.mmd +5 -0
- package/skills/statechart/scripts/test/corpus/PickWorker/graph.dot +11 -0
- package/skills/statechart/scripts/test/corpus/PickWorker/report.md +7 -0
- package/skills/statechart/scripts/test/corpus/PickWorker/sany.out +5 -0
- package/skills/statechart/scripts/test/corpus/PickWorker/verdict-1.out +70 -0
- package/skills/statechart/scripts/test/corpus/Shadow/ChartRun.out +61 -0
- package/skills/statechart/scripts/test/corpus/Shadow/Shadow.cfg +4 -0
- package/skills/statechart/scripts/test/corpus/Shadow/Shadow.tla +11 -0
- package/skills/statechart/scripts/test/corpus/Shadow/ShadowLib.tla +6 -0
- package/skills/statechart/scripts/test/corpus/Shadow/ShadowSub.tla +3 -0
- package/skills/statechart/scripts/test/corpus/Shadow/chart.mmd +9 -0
- package/skills/statechart/scripts/test/corpus/Shadow/graph.dot +16 -0
- package/skills/statechart/scripts/test/corpus/Shadow/report.md +8 -0
- package/skills/statechart/scripts/test/corpus/Shadow/sany.out +4 -0
- package/skills/statechart/scripts/test/corpus/Shadow/verdict-1.out +65 -0
- package/skills/statechart/scripts/test/corpus/SpacedNames/ChartRun.out +59 -0
- package/skills/statechart/scripts/test/corpus/SpacedNames/SpacedNames.cfg +2 -0
- package/skills/statechart/scripts/test/corpus/SpacedNames/SpacedNames.tla +9 -0
- package/skills/statechart/scripts/test/corpus/SpacedNames/chart.mmd +23 -0
- package/skills/statechart/scripts/test/corpus/SpacedNames/graph.dot +17 -0
- package/skills/statechart/scripts/test/corpus/SpacedNames/report.md +15 -0
- package/skills/statechart/scripts/test/corpus/SpacedNames/sany.out +1 -0
- package/skills/statechart/scripts/test/corpus/SpacedNames/verdict-1.exit +1 -0
- package/skills/statechart/scripts/test/corpus/SpacedNames/verdict-1.out +65 -0
- package/skills/statechart/scripts/test/corpus/SpacedNames/verdict-2.exit +1 -0
- package/skills/statechart/scripts/test/corpus/SpacedNames/verdict-2.out +75 -0
- package/skills/statechart/scripts/test/corpus/TwoPhase/ChartRun.out +69 -0
- package/skills/statechart/scripts/test/corpus/TwoPhase/TwoPhase.cfg +3 -0
- package/skills/statechart/scripts/test/corpus/TwoPhase/TwoPhase.tla +75 -0
- package/skills/statechart/scripts/test/corpus/TwoPhase/chart.mmd +60 -0
- package/skills/statechart/scripts/test/corpus/TwoPhase/graph.dot +297 -0
- package/skills/statechart/scripts/test/corpus/TwoPhase/report.md +20 -0
- package/skills/statechart/scripts/test/corpus/TwoPhase/sany.out +1 -0
- package/skills/statechart/scripts/test/corpus/TwoPhase/verdict-1.exit +1 -0
- package/skills/statechart/scripts/test/corpus/TwoPhase/verdict-1.out +95 -0
- package/skills/statechart/scripts/test/corpus/TwoPhase/verdict-2.out +57 -0
- package/skills/statechart/scripts/test/corpus/TwoPhase/view.mjs +1 -0
- package/skills/statechart/scripts/test/corpus/TwoPhaseFixed/ChartRun.out +57 -0
- package/skills/statechart/scripts/test/corpus/TwoPhaseFixed/TwoPhaseFixed.cfg +3 -0
- package/skills/statechart/scripts/test/corpus/TwoPhaseFixed/TwoPhaseFixed.tla +75 -0
- package/skills/statechart/scripts/test/corpus/TwoPhaseFixed/chart.mmd +37 -0
- package/skills/statechart/scripts/test/corpus/TwoPhaseFixed/graph.dot +223 -0
- package/skills/statechart/scripts/test/corpus/TwoPhaseFixed/report.md +11 -0
- package/skills/statechart/scripts/test/corpus/TwoPhaseFixed/sany.out +1 -0
- package/skills/statechart/scripts/test/corpus/TwoPhaseFixed/verdict-1.out +47 -0
- package/skills/statechart/scripts/test/corpus/TwoPhaseFixed/view.mjs +1 -0
- package/skills/statechart/scripts/test/corpus/TypeGuard/ChartRun.exit +1 -0
- package/skills/statechart/scripts/test/corpus/TypeGuard/ChartRun.out +75 -0
- package/skills/statechart/scripts/test/corpus/TypeGuard/TypeGuard.cfg +5 -0
- package/skills/statechart/scripts/test/corpus/TypeGuard/TypeGuard.tla +11 -0
- package/skills/statechart/scripts/test/corpus/TypeGuard/chart.mmd +18 -0
- package/skills/statechart/scripts/test/corpus/TypeGuard/graph.dot +14 -0
- package/skills/statechart/scripts/test/corpus/TypeGuard/report.md +29 -0
- package/skills/statechart/scripts/test/corpus/TypeGuard/sany.out +2 -0
- package/skills/statechart/scripts/test/corpus/TypeGuard/verdict-1.exit +1 -0
- package/skills/statechart/scripts/test/corpus/TypeGuard/verdict-1.out +64 -0
- package/skills/statechart/scripts/test/corpus/TypeGuard/verdict-2.exit +1 -0
- package/skills/statechart/scripts/test/corpus/TypeGuard/verdict-2.out +75 -0
- package/skills/statechart/scripts/test/corpus/UserNoDeadlock/ChartRun.out +58 -0
- package/skills/statechart/scripts/test/corpus/UserNoDeadlock/UserNoDeadlock.cfg +2 -0
- package/skills/statechart/scripts/test/corpus/UserNoDeadlock/UserNoDeadlock.tla +8 -0
- package/skills/statechart/scripts/test/corpus/UserNoDeadlock/chart.mmd +22 -0
- package/skills/statechart/scripts/test/corpus/UserNoDeadlock/graph.dot +16 -0
- package/skills/statechart/scripts/test/corpus/UserNoDeadlock/report.md +15 -0
- package/skills/statechart/scripts/test/corpus/UserNoDeadlock/sany.out +2 -0
- package/skills/statechart/scripts/test/corpus/UserNoDeadlock/verdict-1.exit +1 -0
- package/skills/statechart/scripts/test/corpus/UserNoDeadlock/verdict-1.out +56 -0
- package/skills/statechart/scripts/test/corpus/UserNoDeadlock/verdict-2.exit +1 -0
- package/skills/statechart/scripts/test/corpus/UserNoDeadlock/verdict-2.out +77 -0
- package/skills/statechart/scripts/test/corpus.test.ts +403 -0
- package/skills/statechart/scripts/test/differential.test.ts +565 -0
- package/skills/statechart/scripts/test/grid/Grid.cfg +2 -0
- package/skills/statechart/scripts/test/grid/Grid.tla +9 -0
- package/skills/statechart/scripts/test/grid/sany.out +2 -0
- package/skills/statechart/scripts/test/java.ts +63 -0
- package/skills/statechart/scripts/test/labels.ts +643 -0
- package/skills/statechart/scripts/test/messages.test.ts +212 -0
- package/skills/statechart/scripts/test/pipeline.test.ts +270 -0
- package/skills/statechart/scripts/test/plain-tlc.test.ts +255 -0
- package/skills/statechart/scripts/test/render.test.ts +81 -0
- package/skills/statechart/scripts/test/tlc-out.test.ts +90 -0
- package/skills/statechart/scripts/test/tlc.ts +158 -0
- package/skills/statechart/scripts/tsconfig.json +11 -0
- package/skills/statechart/scripts/worker.ts +35 -0
- package/skills/swarm/SKILL.md +41 -0
- package/skills/tdd/SKILL.md +42 -0
- package/skills/teach/SKILL.md +21 -0
- package/skills/technical-writing/SKILL.md +106 -0
- package/skills/typescript-best-practices/SKILL.md +32 -0
- package/skills/typescript-best-practices/references/patterns.md +328 -0
- package/skills/unslop/SKILL.md +62 -0
- package/skills/why/SKILL.md +98 -0
- package/skills/why/references/epistemics.md +71 -0
- package/skills/why/references/investigator-prompt.md +84 -0
- package/skills/why/references/source-playbook.md +17 -0
- package/skills/why/references/sources/code-archaeology.md +51 -0
- package/skills/why/references/sources/databricks.md +70 -0
- package/skills/why/references/sources/datadog.md +97 -0
- package/skills/why/references/sources/incident-postmortem.md +5 -0
- package/skills/why/references/sources/linear.md +48 -0
- package/skills/why/references/sources/notion.md +55 -0
- package/skills/why/references/sources/sentry.md +66 -0
- package/skills/why/references/sources/slack.md +17 -0
- package/skills/why/references/synthesizer-prompt.md +129 -0
- package/src/aliases.ts +64 -0
- package/src/ask.ts +131 -0
- package/src/autocomplete.ts +21 -0
- package/src/child-env.ts +44 -0
- package/src/index.ts +123 -0
- package/src/loop.ts +189 -0
- package/src/mode.ts +156 -0
- package/src/modes.ts +8 -0
- package/src/paths.ts +72 -0
- package/src/plan.ts +141 -0
- package/src/readonly-shell.ts +107 -0
- package/src/rule.ts +56 -0
- package/src/sections.ts +117 -0
- package/src/subscriptions/cron.ts +75 -0
- package/src/subscriptions/github.ts +149 -0
- package/src/subscriptions/index.ts +547 -0
- package/src/subscriptions/webhook.ts +209 -0
- package/src/task/agents.ts +55 -0
- package/src/task/card.ts +32 -0
- package/src/task/format.ts +88 -0
- package/src/task/models.ts +140 -0
- package/src/task/records.ts +232 -0
- package/src/task/registry.ts +77 -0
- package/src/task/runner.ts +370 -0
- package/src/task/status.ts +170 -0
- package/src/task/stop.ts +100 -0
- package/src/task/tool.ts +491 -0
- package/src/task/worktree.ts +67 -0
- package/src/todo.ts +122 -0
- package/src/visualize.ts +244 -0
- package/test/aliases.test.ts +57 -0
- package/test/ask.test.ts +85 -0
- package/test/autocomplete.test.ts +39 -0
- package/test/e2e/aliases.e2e.test.ts +81 -0
- package/test/e2e/ask.e2e.test.ts +135 -0
- package/test/e2e/harness.ts +179 -0
- package/test/e2e/host.e2e.test.ts +193 -0
- package/test/e2e/lifecycle.e2e.test.ts +99 -0
- package/test/e2e/mode.e2e.test.ts +160 -0
- package/test/e2e/package.e2e.test.ts +67 -0
- package/test/e2e/task.e2e.test.ts +734 -0
- package/test/e2e/todo.e2e.test.ts +59 -0
- package/test/fixtures/cursor-askquestion-calls.json +806 -0
- package/test/fixtures/fake-pi.mjs +96 -0
- package/test/fixtures/image-model.ts +16 -0
- package/test/fixtures/list-models.ts +15 -0
- package/test/fixtures/readonly-shell-exit.ts +17 -0
- package/test/fixtures/scripted-model.ts +113 -0
- package/test/loop.test.ts +209 -0
- package/test/mode.test.ts +143 -0
- package/test/plan.test.ts +126 -0
- package/test/readonly-shell-security.test.ts +84 -0
- package/test/readonly-shell.test.ts +44 -0
- package/test/records.test.ts +143 -0
- package/test/registry.test.ts +18 -0
- package/test/resources.test.ts +162 -0
- package/test/rule.test.ts +92 -0
- package/test/scripts.test.ts +182 -0
- package/test/sections.test.ts +56 -0
- package/test/subscriptions-cron.test.ts +60 -0
- package/test/subscriptions.test.ts +598 -0
- package/test/task-agents.test.ts +49 -0
- package/test/task-card.test.ts +34 -0
- package/test/task-fork.test.ts +233 -0
- package/test/task-format.test.ts +65 -0
- package/test/task-model.test.ts +141 -0
- package/test/task-runner.test.ts +259 -0
- package/test/task-schema.test.ts +50 -0
- package/test/task-status.test.ts +155 -0
- package/test/task-worktree.test.ts +106 -0
- package/test/todo.test.ts +74 -0
- package/test/visualize.test.ts +152 -0
- package/tsconfig.json +5 -0
- package/vitest.config.ts +16 -0
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: setup-benny
|
|
3
|
+
description: Configure Benny and prepare its triage and repro automations. Use when installing Benny or changing its Slack, tracker, repository, routing, control, model, trigger, memory, or budget settings.
|
|
4
|
+
disable-model-invocation: true
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Set up Benny
|
|
8
|
+
|
|
9
|
+
Benny ships as a dormant automation pack inside pi-pstack. Pi discovers only pi-pstack's normal skill root; this file and the two operational files are not slash skills.
|
|
10
|
+
|
|
11
|
+
The human enters setup by pointing Pi at the pack's `FOR_AGENTS.md`. The bootstrap flow copies the whole pack into the target repository, then reads this file directly at `.pi/automations/benny/skills/setup-benny/SKILL.md`.
|
|
12
|
+
|
|
13
|
+
Benny needs external configuration and two live automations. Each automation is a pi-pstack subscription owned by a long-running Pi session rooted in the target repository:
|
|
14
|
+
|
|
15
|
+
- Timer mode (default): `subscribe_timer` with a 5-field `cron`. Each fire wakes the owning session, which sweeps the source channel, claims one report, and hands it to one background `Task` on the automation's configured model. The run's result arrives as a Task notification.
|
|
16
|
+
- Webhook mode: `subscribe_webhook`. Each POST to the local routine URL wakes the owning session with a `[routine]` turn, and the prompt hands the event to one background `Task` on the automation's configured model.
|
|
17
|
+
|
|
18
|
+
Subscriptions live in the Pi process. They stop when that session exits, return when it is resumed, and expire (default seven days). Tell the user this before creating anything.
|
|
19
|
+
|
|
20
|
+
Do not create or update a subscription until the user explicitly asks. Never put a secret value in pack files, prompts, memory, or committed configuration.
|
|
21
|
+
|
|
22
|
+
## 1. Copy the pack and check shared pi-pstack skills
|
|
23
|
+
|
|
24
|
+
Do this before asking for Benny configuration and before creating any subscription.
|
|
25
|
+
|
|
26
|
+
Ask which repository will run the automations. The source pack is the directory containing `FOR_AGENTS.md`. The destination is `<target-repository>/.pi/automations/benny/`.
|
|
27
|
+
|
|
28
|
+
Merge the entire source pack into the destination:
|
|
29
|
+
|
|
30
|
+
1. Create the destination when it is absent.
|
|
31
|
+
2. Copy every source file to the same relative path.
|
|
32
|
+
3. Preserve destination-only files. Never delete unrelated files during install or refresh.
|
|
33
|
+
4. Keep user-owned configuration, feature maps, routing maps, and memory outside the destination. Never overwrite them.
|
|
34
|
+
5. When an existing source-managed file differs, inspect the diff and merge without discarding local edits. If ownership is ambiguous, stop and ask before replacing it.
|
|
35
|
+
6. Verify that the destination contains `FOR_AGENTS.md`, this setup file, both operational files, their references, and the templates.
|
|
36
|
+
|
|
37
|
+
If this file is already being read from the target destination, treat the copy as complete and run the same verification before continuing.
|
|
38
|
+
|
|
39
|
+
Confirm that pi-pstack is installed in Pi. A personal install (`pi install <path-to-pi-pstack>`) serves every repository on this machine. A project install (`pi install -l <path-to-pi-pstack>`) writes the target repository's `.pi/settings.json`; preserve every unrelated setting and package entry when that file exists, and validate it after editing.
|
|
40
|
+
|
|
41
|
+
This setup session must run in the target repository, because a `Task` subagent starts in its parent's working directory. If it does not, stop and tell the user to start Pi in the target repository and point it at `FOR_AGENTS.md` again. Start a fresh `Task` subagent with `readonly: true`. Ask it which of these skills its system prompt lists as installed:
|
|
42
|
+
|
|
43
|
+
- `how`
|
|
44
|
+
- `why`
|
|
45
|
+
- `tdd`
|
|
46
|
+
- `unslop`
|
|
47
|
+
- `principle-separate-before-serializing-shared-state`
|
|
48
|
+
- `principle-minimize-reader-load`
|
|
49
|
+
- `principle-guard-the-context-window`
|
|
50
|
+
- `principle-sequence-verifiable-units`
|
|
51
|
+
- `principle-fix-root-causes`
|
|
52
|
+
- `principle-prove-it-works`
|
|
53
|
+
|
|
54
|
+
Do not count a skill this session read by hand. The check must show that a fresh subagent in the target repository receives pi-pstack.
|
|
55
|
+
|
|
56
|
+
If pi-pstack or any shared dependency does not resolve, stop and explain the failure.
|
|
57
|
+
|
|
58
|
+
Confirm that `pi mcp list` shows the Slack MCP server the user names, and that it exposes thread read, thread reply, and, when needed, file download and message edit tools. If it does not, stop and explain what is missing.
|
|
59
|
+
|
|
60
|
+
The Benny files are read directly from `<target-repository>/.pi/automations/benny/`. Do not move that directory into `.pi/skills/` or expect its `SKILL.md` files to appear in the slash-skill list.
|
|
61
|
+
|
|
62
|
+
Tell the user to commit `.pi/automations/benny/` and any referenced secret-free configuration, so pack refreshes stay reviewable. Do not commit them unless the user asks.
|
|
63
|
+
|
|
64
|
+
Once this check passes, subscription prompts read the operational files by their absolute paths in the target checkout. They must not embed a pi-pstack package path or copy the file contents.
|
|
65
|
+
|
|
66
|
+
## 2. Adapt the configuration
|
|
67
|
+
|
|
68
|
+
Open these copied examples:
|
|
69
|
+
|
|
70
|
+
- `../../templates/configuration.example.yaml`
|
|
71
|
+
- `../reproduce-and-fix-issues/references/feature-map.example.md`
|
|
72
|
+
|
|
73
|
+
Create user-owned copies outside `.pi/automations/benny/`. These are configuration files, not pack files. Example locations:
|
|
74
|
+
|
|
75
|
+
- Project config, such as `.pi/benny/configuration.yaml`
|
|
76
|
+
- Project feature map, such as `.pi/benny/feature-map.md`
|
|
77
|
+
- Project routing map, such as `.pi/benny/routing.md`
|
|
78
|
+
- User config, such as `~/.config/benny/configuration.yaml`
|
|
79
|
+
- User feature map, such as `~/.config/benny/feature-map.md`
|
|
80
|
+
|
|
81
|
+
Fill one feature-map section for every user-facing feature the automation may reproduce. Keep it at the user point of view. Do not freeze implementation details or current code paths in the map.
|
|
82
|
+
|
|
83
|
+
Do not edit the copied examples. Pack refreshes may update source-managed files after conflict review, but they must never touch the user-owned copies.
|
|
84
|
+
|
|
85
|
+
Create the memory directory named by `memory.directory`, such as `<pstack dir>/automations/benny/memories/`, where `<pstack dir>` is the directory of the model rule the system prompt names (`~/.pi/agent/pstack` by default), with an empty `ledger.tsv` and a `MEMORIES.md`. Write into `MEMORIES.md` only operating notes a run needs: the target repository path, the configuration path, the subscription names, and, in webhook mode, each routine's URL and credential file path. Never write a key, a token, or report text into memory. Keep the directory out of the repository.
|
|
86
|
+
|
|
87
|
+
Use absolute paths for the pack, configuration, and memory in subscription prompts. Never reference the pi-pstack package directory from a subscription prompt.
|
|
88
|
+
|
|
89
|
+
## 3. Fill the required choices
|
|
90
|
+
|
|
91
|
+
Ask for or confirm:
|
|
92
|
+
|
|
93
|
+
- Source Slack channel ID
|
|
94
|
+
- Optional operations or status channel ID
|
|
95
|
+
- Repository URL and default branch
|
|
96
|
+
- Absolute path of the target repository checkout
|
|
97
|
+
- Triage identity or Slack user ID
|
|
98
|
+
- Slack MCP server name and the exact tool for each Slack action
|
|
99
|
+
- Issue tracker type, team, project, labels, and intake status
|
|
100
|
+
- Tracker adapter skill or MCP actions
|
|
101
|
+
- Optional routing map path
|
|
102
|
+
- Required control skill name
|
|
103
|
+
- Required user-facing feature-map path
|
|
104
|
+
- Status emoji strings
|
|
105
|
+
- Pull request URL format
|
|
106
|
+
- Trigger mode, and the cron schedules for timer mode
|
|
107
|
+
- Memory directory
|
|
108
|
+
- Polling and effort budgets
|
|
109
|
+
- Model for triage, repro, code work, and media review
|
|
110
|
+
|
|
111
|
+
Use only model specs that `pi --list-models` shows, with a thinking level that model lists, such as `provider/model:high`. Do not guess a model and do not carry over a private default.
|
|
112
|
+
|
|
113
|
+
The source channel, triage identity, repository, Slack MCP tools, tracker adapter, control skill, and feature map must be explicit. Fail setup if any required value stays ambiguous.
|
|
114
|
+
|
|
115
|
+
Use pi-pstack's `unslop` skill on the final subscription names and prompts before creating them.
|
|
116
|
+
|
|
117
|
+
## 4. Check integration capabilities
|
|
118
|
+
|
|
119
|
+
The triage automation needs:
|
|
120
|
+
|
|
121
|
+
- Read access to the configured source Slack channel and its threads
|
|
122
|
+
- Thread-reply access in that channel
|
|
123
|
+
- Attachment metadata and file download access when reports include media
|
|
124
|
+
- Search, read, create, and update access through the configured issue-tracker adapter
|
|
125
|
+
|
|
126
|
+
The repro automation needs:
|
|
127
|
+
|
|
128
|
+
- Read access to the source thread
|
|
129
|
+
- Thread-reply access in the source channel
|
|
130
|
+
- Optional post and edit access in the configured operations channel
|
|
131
|
+
- Repository read and history access
|
|
132
|
+
- `gh` authenticated for the repository, so `gh pr create --draft` can open a draft pull request
|
|
133
|
+
- The configured control-adapter skill
|
|
134
|
+
|
|
135
|
+
Prefer the configured Slack MCP tools for reads and posts. The optional `BENNY_SLACK_BOT_TOKEN` may fill a narrow gap such as editing one operations status message or downloading an attachment. Store the value in a secret manager or the owning session's environment, not in YAML. A writable subagent inherits that environment, which is one reason Benny's workers run readonly.
|
|
136
|
+
|
|
137
|
+
Do not use undocumented integration endpoints.
|
|
138
|
+
|
|
139
|
+
## 5. Prepare the routing map
|
|
140
|
+
|
|
141
|
+
If the user wants reroutes or owner pings:
|
|
142
|
+
|
|
143
|
+
1. Copy `../triage-issue-reports/references/routing.example.md` outside `.pi/automations/benny/`.
|
|
144
|
+
2. Replace every placeholder with public or organization-local values.
|
|
145
|
+
3. Keep owner pings off by default.
|
|
146
|
+
4. Allow a ping only for a configured feature owner or a confirmed likely regression author.
|
|
147
|
+
|
|
148
|
+
If no routing map is configured, triage may classify a report but must not guess a destination or owner.
|
|
149
|
+
|
|
150
|
+
## 6. Verify the control adapter
|
|
151
|
+
|
|
152
|
+
Read `../reproduce-and-fix-issues/references/control-adapter.md` and the user's completed feature map.
|
|
153
|
+
|
|
154
|
+
Confirm that the named skill can:
|
|
155
|
+
|
|
156
|
+
- Bring up the target app
|
|
157
|
+
- Navigate every mapped feature through the real UI
|
|
158
|
+
- Exercise mapped states through declared adapter actions
|
|
159
|
+
- Inspect state without forcing the result
|
|
160
|
+
- Capture screenshots
|
|
161
|
+
- Start and stop a recording
|
|
162
|
+
- Clean up its processes and temporary data
|
|
163
|
+
|
|
164
|
+
If any capability is missing, do not create the repro subscription. It must fail closed rather than claim a reproduction it did not perform.
|
|
165
|
+
|
|
166
|
+
## 7. Prepare the live automations
|
|
167
|
+
|
|
168
|
+
Ask whether this is first-time creation or configuration of existing subscriptions.
|
|
169
|
+
|
|
170
|
+
Read `../../FOR_AGENTS.md` from the copied pack as the primary user-intent source for either path. Use it to understand the two triggers, tools, instructions, outcomes, and shared rules.
|
|
171
|
+
|
|
172
|
+
The owning session must be interactive or RPC, rooted in the target repository, and expected to keep running. A print or JSON run cannot own a subscription. Suggest a dedicated tmux window, such as `tmux new -s benny 'cd <target-repository> && pi'`. In both trigger modes, each fire hands its report to one background `Task` with the automation's configured `model`, so one owning session serves both automations, whatever model that session runs on.
|
|
173
|
+
|
|
174
|
+
### First-time creation
|
|
175
|
+
|
|
176
|
+
Create one subscription at a time.
|
|
177
|
+
|
|
178
|
+
For each automation:
|
|
179
|
+
|
|
180
|
+
1. Read the matching copied prompt template.
|
|
181
|
+
2. Fill every `{{...}}` value from the finished configuration. Keep only the trigger block for the chosen mode.
|
|
182
|
+
3. Check that the prompt reads its exact operational file under `<target-repository>/.pi/automations/benny/`, by absolute path. Do not copy the operational file contents into the prompt.
|
|
183
|
+
4. Show the user the subscription name, mode, schedule, and full prompt, and get approval.
|
|
184
|
+
5. Create the subscription:
|
|
185
|
+
- Timer mode: `subscribe_timer` with `name`, `prompt`, and `cron`. Keep the default `sessionStrategy`, `wake_self`, so each fire reaches the owning session, which starts the `Task` on the configured model.
|
|
186
|
+
- Webhook mode: `subscribe_webhook` with `name` and `prompt`. It returns the local URL (`http://127.0.0.1:<port>/routines/<slug>`, where the slug is the kebab-case form of the name) and the credential file path. The key stays in that file. Never print it, paste it into chat, or copy it into the configuration.
|
|
187
|
+
6. Run `list_subscriptions`. Confirm the subscription appears with the expected name, schedule or URL, and `expiresAt`. A result of `created: false` means a subscription with that name already exists and kept its old prompt; follow the existing-subscription path instead.
|
|
188
|
+
7. Finish the thread-safety checks that apply to this automation before creating the next one.
|
|
189
|
+
|
|
190
|
+
The triage subscription must:
|
|
191
|
+
|
|
192
|
+
- Be named `benny-triage`.
|
|
193
|
+
- Read and follow `<target-repository>/.pi/automations/benny/skills/triage-issue-reports/SKILL.md` for every run.
|
|
194
|
+
- Start on each new top-level report in the configured source Slack channel, one report per run, claimed in the ledger.
|
|
195
|
+
- Read the triggering thread and reply only inside it.
|
|
196
|
+
- Use the configured issue-tracker integration.
|
|
197
|
+
- Classify, inspect evidence, trace cause, dedupe, and create only clear new bugs.
|
|
198
|
+
- End one thread-only verdict with the configured `[benny:bug]`, `[benny:performance]`, or `[benny:other]` marker and optional tracker URL.
|
|
199
|
+
- Never post a source-channel root message.
|
|
200
|
+
|
|
201
|
+
After the triage subscription passes its checks, the repro subscription must:
|
|
202
|
+
|
|
203
|
+
- Be named `benny-reproduce`.
|
|
204
|
+
- Read and follow `<target-repository>/.pi/automations/benny/skills/reproduce-and-fix-issues/SKILL.md` for every run.
|
|
205
|
+
- Start on the same new top-level reports in the configured source Slack channel, one report per run, claimed in the ledger.
|
|
206
|
+
- Use the configured repository and default branch, in a fresh worktree from the default branch.
|
|
207
|
+
- Read the source thread and reply only inside it.
|
|
208
|
+
- Include draft pull request creation and the configured tracker, control-adapter, and feature-map requirements.
|
|
209
|
+
- Wait for a trusted triage marker before acting.
|
|
210
|
+
- Reproduce the exact symptom twice through the mapped real UI and capture evidence.
|
|
211
|
+
- Verify an existing fix without authoring over it.
|
|
212
|
+
- Attempt an optional bounded fix only after confirmed repro, then open a draft pull request when proof and checks pass.
|
|
213
|
+
- Never post a source-channel root message.
|
|
214
|
+
|
|
215
|
+
In webhook mode, Benny ships no relay. Slack cannot reach `127.0.0.1`, so the user runs a Slack app or relay that receives Slack events, verifies them, keeps only new top-level messages in the source channel, and POSTs `{"source_channel_id", "message_ts", "thread_ts"}` as JSON to both routine URLs, with `Authorization: Bearer <key>` read from each credential file. `/routines` lists each routine with its URL, credential file, and status.
|
|
216
|
+
|
|
217
|
+
### Existing subscriptions
|
|
218
|
+
|
|
219
|
+
Run `list_subscriptions` to find them. Subscribing again with an existing name does not update it.
|
|
220
|
+
|
|
221
|
+
Finish configuration, routing, control-adapter, and feature-map validation. Then, for each subscription that must change:
|
|
222
|
+
|
|
223
|
+
1. Fill the new prompt from the template, as in first-time creation, and get approval.
|
|
224
|
+
2. `unsubscribe` the old subscription.
|
|
225
|
+
3. Create it again with the same name and the new prompt. A webhook routine keeps its slug, so check whether its URL or credential file changed and tell the user to update the relay.
|
|
226
|
+
4. Run `list_subscriptions` and confirm exactly one subscription per name.
|
|
227
|
+
|
|
228
|
+
To renew an expiring subscription, do the same with the unchanged prompt. Do not create replacements under new names.
|
|
229
|
+
|
|
230
|
+
### Creation boundary
|
|
231
|
+
|
|
232
|
+
Create Benny's automations only with pi-pstack's `subscribe_timer` and `subscribe_webhook` tools in the owning session. Never start a scheduler outside Pi, such as `cron` or `launchd`, and never expose the routine listener beyond `127.0.0.1` from this setup.
|
|
233
|
+
|
|
234
|
+
Do not let either automation handle normal traffic until the thread-safety test passes.
|
|
235
|
+
|
|
236
|
+
## 8. Test thread safety
|
|
237
|
+
|
|
238
|
+
Create both subscriptions with a test channel as the source channel, or test with a harmless report.
|
|
239
|
+
|
|
240
|
+
Before testing, confirm that both subscription prompts point at their exact operational files in the target checkout, that the memory directory exists, and that `list_subscriptions` shows both subscriptions. If any check fails, stop. Tell the user that the automation cannot handle traffic yet.
|
|
241
|
+
|
|
242
|
+
Verify:
|
|
243
|
+
|
|
244
|
+
1. Triage stores the root `thread_ts` and posts exactly one verdict as a reply.
|
|
245
|
+
2. The verdict contains one configured marker.
|
|
246
|
+
3. Repro accepts the marker only from the configured triage identity.
|
|
247
|
+
4. Repro keeps the same immutable source coordinates.
|
|
248
|
+
5. No source-channel root message appears.
|
|
249
|
+
6. A delegated worker cannot use any Slack write action: it runs as a `readonly` `Task`, so it has no MCP tools.
|
|
250
|
+
7. Missing coordinates, a deleted parent, or a failed preflight produces no post and no tracker issue.
|
|
251
|
+
8. A second fire, or a repeated webhook POST, for the same report does no work, because the ledger already lists it.
|
|
252
|
+
|
|
253
|
+
Handle normal traffic only after all eight checks pass. If the checks ran against a test channel, set the real source channel in the configuration and recreate both subscriptions through the existing-subscription path.
|
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: triage-issue-reports
|
|
3
|
+
description: Triage Slack issue reports with one thread-only verdict, evidence review, cause-aware routing, tracker dedupe, and fail-closed ticket creation. Use only from the configured Benny triage automation.
|
|
4
|
+
disable-model-invocation: true
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Triage issue reports
|
|
8
|
+
|
|
9
|
+
Classify one Slack report and post one useful verdict in its source thread. Create a tracker issue only for a clear, new bug. Do not reproduce or fix it here.
|
|
10
|
+
|
|
11
|
+
Load the external Benny configuration supplied by the automation. If the config is missing, malformed, or incomplete, stop without posting or writing to the tracker.
|
|
12
|
+
|
|
13
|
+
## Hard safety rules
|
|
14
|
+
|
|
15
|
+
- The source channel and root thread coordinates are immutable.
|
|
16
|
+
- Never post a root message in the source channel.
|
|
17
|
+
- Never post to another channel, broadcast a reply, send a DM, or start a replacement thread.
|
|
18
|
+
- Preflight the source parent before any tracker write and immediately before the verdict post.
|
|
19
|
+
- If the parent is missing, deleted, inaccessible, or uncertain, stop with no writes.
|
|
20
|
+
- Post one substantive verdict. Do not narrate progress.
|
|
21
|
+
- The coordinator is the only Slack poster.
|
|
22
|
+
- Delegated workers return findings only. They must be read-only and receive no Slack credentials or write actions. In Pi, start each one with `Task` and `readonly: true`: a readonly subagent gets no MCP servers, and its shell can neither write files nor reach the network.
|
|
23
|
+
- Every child prompt must forbid every Slack MCP write tool (`mcp__<slack-server>__*` tools that post, edit, react, or upload), `chat.postMessage`, and every other Slack write.
|
|
24
|
+
- If worker isolation cannot enforce those limits, do the work in the coordinator.
|
|
25
|
+
- Never create an issue that cannot link back to the source thread.
|
|
26
|
+
- Prefer no ticket over a guessed or duplicate ticket.
|
|
27
|
+
- Apply pstack's `principle-separate-before-serializing-shared-state` to source coordinates.
|
|
28
|
+
- Apply pstack's `principle-minimize-reader-load` and `unslop` skills to the final verdict.
|
|
29
|
+
|
|
30
|
+
## 1. Freeze source coordinates
|
|
31
|
+
|
|
32
|
+
Before making a work list or delegating:
|
|
33
|
+
|
|
34
|
+
1. Read `source_channel_id` from the trigger.
|
|
35
|
+
2. Require it to equal the configured source channel.
|
|
36
|
+
3. Set `SOURCE_THREAD_TS` to `trigger.thread_ts` when present. Otherwise use `trigger.ts`.
|
|
37
|
+
4. Require a nonempty `SOURCE_THREAD_TS`.
|
|
38
|
+
5. Store `SOURCE_CHANNEL_ID` and `SOURCE_THREAD_TS` as immutable values.
|
|
39
|
+
6. Read the thread and verify that its root has exactly those coordinates.
|
|
40
|
+
7. Fetch a stable source permalink.
|
|
41
|
+
|
|
42
|
+
Every later source read and post must use those stored values. Never replace them with a reply timestamp or an operations-thread timestamp.
|
|
43
|
+
|
|
44
|
+
## 2. Read the whole report
|
|
45
|
+
|
|
46
|
+
Read the root and current replies before deciding.
|
|
47
|
+
|
|
48
|
+
Capture:
|
|
49
|
+
|
|
50
|
+
- Reporter wording
|
|
51
|
+
- Product version, app build, environment, and platform when present
|
|
52
|
+
- Expected behavior
|
|
53
|
+
- Observed behavior
|
|
54
|
+
- Frequency and trigger
|
|
55
|
+
- Error text or stack signature
|
|
56
|
+
- Existing issue, commit, or pull request links
|
|
57
|
+
- Any explicit statement that someone is already fixing it
|
|
58
|
+
|
|
59
|
+
Inspect every relevant attachment.
|
|
60
|
+
|
|
61
|
+
- Read screenshots at full useful resolution.
|
|
62
|
+
- Review video for the state transition that separates correct and broken behavior.
|
|
63
|
+
- Read logs, traces, and crash text for concrete signatures.
|
|
64
|
+
- If media needs specialist review, use a read-only media worker and ask a narrow question. The worker returns findings only.
|
|
65
|
+
- If an attachment cannot be read, say so in the verdict. Do not invent what it shows.
|
|
66
|
+
|
|
67
|
+
Use evidence already in the thread before asking the reporter for more.
|
|
68
|
+
|
|
69
|
+
## 3. Trace cause before routing
|
|
70
|
+
|
|
71
|
+
Do a bounded source and history pass before choosing an owner or destination. Use pstack's `how` skill to trace the path from the reported action to the observed result. Use `why` when the report looks like a regression or touches defensive code.
|
|
72
|
+
|
|
73
|
+
1. Identify the likely code path from the reported action to the observed result.
|
|
74
|
+
2. Check whether the visible symptom belongs to that code path or a dependency below it.
|
|
75
|
+
3. Check recent changes when the report looks like a regression.
|
|
76
|
+
4. Check whether a merged commit or open pull request already addresses the same symptom.
|
|
77
|
+
5. Separate confirmed facts from hypotheses.
|
|
78
|
+
|
|
79
|
+
This pass does not need a complete root cause. It must be strong enough to avoid routing a visible symptom to the wrong owner.
|
|
80
|
+
|
|
81
|
+
If the repository cannot be read, do not guess a code owner. Continue with a conservative classification and say that cause tracing was unavailable.
|
|
82
|
+
|
|
83
|
+
## 4. Classify
|
|
84
|
+
|
|
85
|
+
Choose one category.
|
|
86
|
+
|
|
87
|
+
### Bug
|
|
88
|
+
|
|
89
|
+
Something violates intended behavior. Examples include wrong output, broken state, an error, a crash, a hang, a silent no-op, or a regression.
|
|
90
|
+
|
|
91
|
+
### Performance
|
|
92
|
+
|
|
93
|
+
The report describes measurable slowness, excess memory, battery drain, jank, or another resource problem. Treat it as a bug, but preserve measurements and profiles.
|
|
94
|
+
|
|
95
|
+
### Feature request
|
|
96
|
+
|
|
97
|
+
The current behavior appears intentional and the reporter wants a different behavior or affordance.
|
|
98
|
+
|
|
99
|
+
### Question or feedback
|
|
100
|
+
|
|
101
|
+
The report asks how something works, expresses a preference without a concrete defect, or gives general feedback.
|
|
102
|
+
|
|
103
|
+
### Reroute
|
|
104
|
+
|
|
105
|
+
Cause tracing shows that another configured destination owns the issue.
|
|
106
|
+
|
|
107
|
+
When the bug versus feature line is unclear, do not file. The one verdict may ask one focused question and use the `other` marker.
|
|
108
|
+
|
|
109
|
+
## 5. Apply configured routing
|
|
110
|
+
|
|
111
|
+
Read the optional routing map from `routing.map_path`.
|
|
112
|
+
|
|
113
|
+
- Match on confirmed product area, code path, or error signature.
|
|
114
|
+
- A visible symptom alone is not enough when cause tracing points elsewhere.
|
|
115
|
+
- If no route matches, say the owner is unclear. Do not guess.
|
|
116
|
+
- Do not cross-post. Tell the reporter where to take the issue in the source thread.
|
|
117
|
+
|
|
118
|
+
Owner pings are off by default. A ping is allowed only when all of these hold:
|
|
119
|
+
|
|
120
|
+
1. The routing map explicitly names the owner.
|
|
121
|
+
2. The config allows that ping type.
|
|
122
|
+
3. The item is a feature request that needs owner input, or recent history identifies a likely regression author with strong evidence.
|
|
123
|
+
4. The owner is not a broad on-call group.
|
|
124
|
+
|
|
125
|
+
No other case gets a ping.
|
|
126
|
+
|
|
127
|
+
## 6. Use the issue-tracker adapter
|
|
128
|
+
|
|
129
|
+
The tracker is an adapter, not a required vendor. A Linear adapter is one valid example. A GitHub Issues adapter or another tracker may implement the same contract.
|
|
130
|
+
|
|
131
|
+
The configured adapter must provide:
|
|
132
|
+
|
|
133
|
+
- Search issues by text, state, label, source URL, and date range
|
|
134
|
+
- Read one issue and its links
|
|
135
|
+
- Create an issue with title, body, status, labels, and source URL
|
|
136
|
+
- Update an existing issue without replacing unrelated fields
|
|
137
|
+
- Add a source link and recurrence note
|
|
138
|
+
- Cancel, close, or delete an issue created by this run if the Slack handoff fails
|
|
139
|
+
|
|
140
|
+
If a required operation is unavailable, fail closed for that write.
|
|
141
|
+
|
|
142
|
+
Resolve configured team, project, status, and labels at runtime. Do not invent IDs, create labels, assign owners, or set priority unless the config explicitly requires it.
|
|
143
|
+
|
|
144
|
+
## 7. Dedupe
|
|
145
|
+
|
|
146
|
+
Always check whether this source permalink is already linked to a tracker issue or a prior triage reply. If so, do not post or create a duplicate.
|
|
147
|
+
|
|
148
|
+
For bugs and performance reports, search the tracker using:
|
|
149
|
+
|
|
150
|
+
- Exact error or crash signature
|
|
151
|
+
- Product area
|
|
152
|
+
- Trigger
|
|
153
|
+
- Symptom
|
|
154
|
+
- Version or date window
|
|
155
|
+
- Suspected regression commit
|
|
156
|
+
- Source permalink
|
|
157
|
+
|
|
158
|
+
Choose one outcome:
|
|
159
|
+
|
|
160
|
+
- Confident duplicate: same signature, or the same area, trigger, and symptom, or a confirmed shared cause.
|
|
161
|
+
- Possibly related: a shared cause is plausible but not proven.
|
|
162
|
+
- Weak resemblance: similarity is superficial.
|
|
163
|
+
- No match.
|
|
164
|
+
|
|
165
|
+
For a confident duplicate, update the existing issue with the source permalink and one short recurrence note. Do not reopen, relabel, or reassign it unless the config says to.
|
|
166
|
+
|
|
167
|
+
For a possible match, link it in the verdict as uncertain and create nothing.
|
|
168
|
+
|
|
169
|
+
A long-closed issue is a regression lead, not automatically a live duplicate.
|
|
170
|
+
|
|
171
|
+
## 8. Decide whether to create
|
|
172
|
+
|
|
173
|
+
Create only when all of these are true:
|
|
174
|
+
|
|
175
|
+
1. The classification is bug or performance.
|
|
176
|
+
2. The behavior is clearly broken.
|
|
177
|
+
3. The issue is still live or not known to be fixed.
|
|
178
|
+
4. Dedupe found no confident or plausible live match.
|
|
179
|
+
5. The source parent and permalink passed preflight.
|
|
180
|
+
6. The tracker target fields resolved.
|
|
181
|
+
7. The adapter can compensate if the verdict post fails.
|
|
182
|
+
|
|
183
|
+
Never create for a feature request, question, feedback item, reroute, possible duplicate, confident duplicate, or already-fixed issue.
|
|
184
|
+
|
|
185
|
+
The new issue must be self-contained:
|
|
186
|
+
|
|
187
|
+
- Plain title that names the area and symptom
|
|
188
|
+
- Reporter quote
|
|
189
|
+
- Expected and observed behavior
|
|
190
|
+
- Version and environment, or `unknown`
|
|
191
|
+
- Trigger and frequency
|
|
192
|
+
- Source thread permalink
|
|
193
|
+
- Short cause-tracing findings with hypotheses labeled as hypotheses
|
|
194
|
+
- Inline screenshot or representative video frame when supported
|
|
195
|
+
- Links to remaining artifacts
|
|
196
|
+
- Configured intake status and labels
|
|
197
|
+
|
|
198
|
+
Do not put a guessed root cause in the title.
|
|
199
|
+
|
|
200
|
+
## 9. Post one verdict
|
|
201
|
+
|
|
202
|
+
Run a fresh source-parent preflight. Then post exactly one reply with `channel=SOURCE_CHANNEL_ID` and `thread_ts=SOURCE_THREAD_TS`.
|
|
203
|
+
|
|
204
|
+
Never call a source-channel posting action without a nonempty `thread_ts`.
|
|
205
|
+
|
|
206
|
+
Keep the reply short:
|
|
207
|
+
|
|
208
|
+
- Lead with the outcome.
|
|
209
|
+
- Link the existing or new tracker issue when there is one.
|
|
210
|
+
- Mention a reroute or one missing fact when needed.
|
|
211
|
+
- Include at most one allowed owner ping.
|
|
212
|
+
- End with exactly one marker line.
|
|
213
|
+
|
|
214
|
+
Marker contract:
|
|
215
|
+
|
|
216
|
+
```text
|
|
217
|
+
[benny:bug]
|
|
218
|
+
[benny:bug] tracker=https://tracker.example/issue/123
|
|
219
|
+
[benny:performance]
|
|
220
|
+
[benny:performance] tracker=https://tracker.example/issue/123
|
|
221
|
+
[benny:other]
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
Use only the configured marker strings. The repro automation trusts the marker only when it comes from the configured triage identity in this source thread.
|
|
225
|
+
|
|
226
|
+
After posting, read the same source thread and verify the verdict appears under `SOURCE_THREAD_TS`. If it does not, never retry at the root.
|
|
227
|
+
|
|
228
|
+
If this run created a tracker issue and the verdict did not land, use the adapter's compensation action. Verify that the issue is canceled, closed, or deleted. If compensation cannot be verified, report the failure only in the run's final message (its Task notification).
|
|
229
|
+
|
|
230
|
+
## 10. Watch one follow-up window
|
|
231
|
+
|
|
232
|
+
Watch the source thread for the configured follow-up window, then stop.
|
|
233
|
+
|
|
234
|
+
- Answer only a direct question to the triage identity.
|
|
235
|
+
- Apply a concrete correction to the tracker issue when safe.
|
|
236
|
+
- Do not emit a second marker in the same run.
|
|
237
|
+
- Stay out of human coordination and side chatter.
|
|
238
|
+
- Stop early if someone asks the automation to stop.
|
|
239
|
+
|
|
240
|
+
Do not extend the window more than once. A new report should start a new run.
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# Routing map example
|
|
2
|
+
|
|
3
|
+
Copy this file outside `.pi/automations/benny/`, for example to `.pi/benny/routing.md`, and replace every placeholder. Point `routing.map_path` at the copy. Pack refreshes must not overwrite it.
|
|
4
|
+
|
|
5
|
+
The triage skill treats this as data. A route needs evidence from the report or cause trace. A keyword match alone is not enough.
|
|
6
|
+
|
|
7
|
+
```yaml
|
|
8
|
+
routes:
|
|
9
|
+
- name: "billing-example"
|
|
10
|
+
match:
|
|
11
|
+
product_areas:
|
|
12
|
+
- "billing-area-placeholder"
|
|
13
|
+
code_paths:
|
|
14
|
+
- "billing-code-path-placeholder"
|
|
15
|
+
error_signatures:
|
|
16
|
+
- "billing-error-placeholder"
|
|
17
|
+
destination:
|
|
18
|
+
slack_channel: "billing-channel-placeholder"
|
|
19
|
+
tracker_team: "billing-team-placeholder"
|
|
20
|
+
owners:
|
|
21
|
+
- "billing-owner-placeholder"
|
|
22
|
+
allow_feature_owner_ping: false
|
|
23
|
+
|
|
24
|
+
- name: "desktop-example"
|
|
25
|
+
match:
|
|
26
|
+
product_areas:
|
|
27
|
+
- "desktop-area-placeholder"
|
|
28
|
+
code_paths:
|
|
29
|
+
- "desktop-code-path-placeholder"
|
|
30
|
+
error_signatures:
|
|
31
|
+
- "desktop-error-placeholder"
|
|
32
|
+
destination:
|
|
33
|
+
slack_channel: "desktop-channel-placeholder"
|
|
34
|
+
tracker_team: "desktop-team-placeholder"
|
|
35
|
+
owners:
|
|
36
|
+
- "desktop-owner-placeholder"
|
|
37
|
+
allow_feature_owner_ping: false
|
|
38
|
+
|
|
39
|
+
fallback:
|
|
40
|
+
destination: ""
|
|
41
|
+
owners: []
|
|
42
|
+
allow_feature_owner_ping: false
|
|
43
|
+
|
|
44
|
+
ping_policy:
|
|
45
|
+
default: "off"
|
|
46
|
+
allow:
|
|
47
|
+
- "configured-feature-owner"
|
|
48
|
+
- "confirmed-regression-author"
|
|
49
|
+
deny:
|
|
50
|
+
- "broad-on-call-group"
|
|
51
|
+
- "unverified-owner"
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
## Rules
|
|
55
|
+
|
|
56
|
+
- Leave `fallback.destination` empty unless one team accepts all unmatched reports.
|
|
57
|
+
- Use stable product areas, code paths, and error signatures.
|
|
58
|
+
- Do not include private data in a public copy.
|
|
59
|
+
- Do not paste raw user or channel IDs into an example that will be published.
|
|
60
|
+
- Keep feature-owner pings off until the target team agrees to them.
|
|
61
|
+
- A reroute tells the reporter where to go. The automation never cross-posts.
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
schema_version: 1
|
|
2
|
+
|
|
3
|
+
# Each Benny automation is a pi-pstack subscription in a long-running Pi session rooted in the target repository.
|
|
4
|
+
automations:
|
|
5
|
+
# The `name` of each subscription (subscribe_timer or subscribe_webhook). A webhook routine's URL slug is the kebab-case form of this name.
|
|
6
|
+
triage_name: "benny-triage"
|
|
7
|
+
reproduce_name: "benny-reproduce"
|
|
8
|
+
# Absolute path of the target repository checkout. The owning Pi session runs here, and prompts read the pack from
|
|
9
|
+
# <target_repository_path>/.pi/automations/benny/.
|
|
10
|
+
target_repository_path: "/path/to/target-repository"
|
|
11
|
+
|
|
12
|
+
# How runs start for each new top-level report in the source channel.
|
|
13
|
+
trigger:
|
|
14
|
+
# timer: subscribe_timer with `cron`. Each fire wakes the owning session, which sweeps the source channel, claims at
|
|
15
|
+
# most one report, and hands it to a background Task on the automation's model below.
|
|
16
|
+
# webhook: subscribe_webhook. A Slack app or relay you run POSTs each new top-level report to the local routine URL.
|
|
17
|
+
mode: "timer"
|
|
18
|
+
triage_cron: "*/2 * * * *"
|
|
19
|
+
reproduce_cron: "*/5 * * * *"
|
|
20
|
+
# How far back a sweep reads the source channel for reports that the ledger has not claimed.
|
|
21
|
+
sweep_lookback_minutes: 180
|
|
22
|
+
|
|
23
|
+
# Durable memory. Plain files that every run reads and writes. Never commit them.
|
|
24
|
+
memory:
|
|
25
|
+
directory: "~/.pi/agent/pstack/automations/benny/memories"
|
|
26
|
+
# One tab-separated line per claim: automation, channel, root ts, state (claimed | done | skipped), time, note.
|
|
27
|
+
ledger_file: "ledger.tsv"
|
|
28
|
+
# Operating notes from setup and verified lessons from runs. Never copy report text into it.
|
|
29
|
+
notes_file: "MEMORIES.md"
|
|
30
|
+
|
|
31
|
+
slack:
|
|
32
|
+
source_channel_id: "SOURCE_CHANNEL_ID"
|
|
33
|
+
operations_channel_id: ""
|
|
34
|
+
triage_identity_user_id: "TRIAGE_IDENTITY_USER_ID"
|
|
35
|
+
# Server name from `pi mcp list`. Each action below is an exact Pi MCP tool name, mcp__<server>__<tool>.
|
|
36
|
+
mcp_server: "slack"
|
|
37
|
+
read_action: "mcp__slack__read-tool-placeholder"
|
|
38
|
+
thread_post_action: "mcp__slack__thread-post-tool-placeholder"
|
|
39
|
+
file_download_action: "mcp__slack__file-download-tool-placeholder"
|
|
40
|
+
operations_edit_action: "mcp__slack__edit-tool-placeholder"
|
|
41
|
+
# Use the Slack MCP tools before the optional bot token.
|
|
42
|
+
prefer_mcp_actions: true
|
|
43
|
+
optional_bot_token_env: "BENNY_SLACK_BOT_TOKEN"
|
|
44
|
+
allow_source_root_posts: false
|
|
45
|
+
allow_worker_slack_writes: false
|
|
46
|
+
|
|
47
|
+
repository:
|
|
48
|
+
url: "https://github.com/example-org/example-repo"
|
|
49
|
+
default_branch: "main"
|
|
50
|
+
pull_request_action: "gh pr create --draft"
|
|
51
|
+
pull_request_url_format: "https://github.com/{owner}/{repo}/pull/{number}"
|
|
52
|
+
draft_only: true
|
|
53
|
+
|
|
54
|
+
tracker:
|
|
55
|
+
type: "linear"
|
|
56
|
+
adapter_skill_name: "issue-tracker-adapter-placeholder"
|
|
57
|
+
team: "team-placeholder"
|
|
58
|
+
project: "project-placeholder"
|
|
59
|
+
labels:
|
|
60
|
+
bug: "bug-label-placeholder"
|
|
61
|
+
performance: "performance-label-placeholder"
|
|
62
|
+
intake: "intake-label-placeholder"
|
|
63
|
+
needs_repro: "needs-repro-label-placeholder"
|
|
64
|
+
status: "intake-status-placeholder"
|
|
65
|
+
source_link_title: "Slack report"
|
|
66
|
+
require_compensation_action: true
|
|
67
|
+
|
|
68
|
+
routing:
|
|
69
|
+
map_path: ".pi/benny/routing.md"
|
|
70
|
+
owner_pings_default: false
|
|
71
|
+
allow_feature_owner_ping: false
|
|
72
|
+
allow_confirmed_regression_author_ping: false
|
|
73
|
+
|
|
74
|
+
control:
|
|
75
|
+
skill_name: "control-target-app"
|
|
76
|
+
feature_map_path: ".pi/benny/feature-map.md"
|
|
77
|
+
environment: "safe-test-environment-placeholder"
|
|
78
|
+
artifact_directory: "/tmp/benny-artifacts"
|
|
79
|
+
artifact_retention_hours: 24
|
|
80
|
+
|
|
81
|
+
verdict_markers:
|
|
82
|
+
bug: "[benny:bug]"
|
|
83
|
+
performance: "[benny:performance]"
|
|
84
|
+
other: "[benny:other]"
|
|
85
|
+
tracker_attribute: "tracker"
|
|
86
|
+
|
|
87
|
+
status_emoji:
|
|
88
|
+
seen: "👀"
|
|
89
|
+
reproducing: "🔎"
|
|
90
|
+
reproduced: "✅"
|
|
91
|
+
could_not_reproduce: "⚪"
|
|
92
|
+
blocked: "⛔"
|
|
93
|
+
fixing: "🛠️"
|
|
94
|
+
fix_failed: "❌"
|
|
95
|
+
pull_request_opened: "🔗"
|
|
96
|
+
|
|
97
|
+
budgets:
|
|
98
|
+
poll_seconds: 45
|
|
99
|
+
verdict_wait_minutes: 45
|
|
100
|
+
triage_follow_up_minutes: 10
|
|
101
|
+
triage_total_minutes: 30
|
|
102
|
+
repro_minutes: 60
|
|
103
|
+
rejection_window_minutes: 10
|
|
104
|
+
fix_minutes: 90
|
|
105
|
+
operations_follow_up_minutes: 45
|
|
106
|
+
|
|
107
|
+
# Pi model specs from `pi --list-models`, such as provider/model:level. In both trigger modes, each fire's Task runs on
|
|
108
|
+
# its automation's model: triage for benny-triage, reproduce for benny-reproduce.
|
|
109
|
+
models:
|
|
110
|
+
triage: "choose-a-model-from-pi-list-models"
|
|
111
|
+
reproduce: "choose-a-model-from-pi-list-models"
|
|
112
|
+
code: "choose-a-model-from-pi-list-models"
|
|
113
|
+
media_review: "choose-a-model-from-pi-list-models"
|