mandrel 1.94.0 → 2.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 (560) hide show
  1. package/.agents/README.md +116 -99
  2. package/.agents/agents/acceptance-critic.md +9 -7
  3. package/.agents/agents/story-worker.md +45 -51
  4. package/.agents/audit-checklists/performance.md +1 -1
  5. package/.agents/docs/SDLC.md +498 -1287
  6. package/.agents/docs/agentrc-reference.json +185 -80
  7. package/.agents/docs/configuration.md +132 -190
  8. package/.agents/docs/execution-reference.md +51 -25
  9. package/.agents/docs/quality-gates.md +25 -33
  10. package/.agents/docs/workflows.md +8 -8
  11. package/.agents/instructions.md +113 -139
  12. package/.agents/rules/ci-remediation.md +11 -15
  13. package/.agents/rules/git-conventions-reference.md +48 -58
  14. package/.agents/rules/git-conventions.md +16 -22
  15. package/.agents/schemas/acceptance-eval-verdict.schema.json +1 -1
  16. package/.agents/schemas/agentrc.schema.json +83 -254
  17. package/.agents/schemas/audit-rules.json +59 -1
  18. package/.agents/schemas/audit-rules.schema.json +33 -1
  19. package/.agents/schemas/lifecycle/README.md +1 -2
  20. package/.agents/schemas/lifecycle/ledger-record.schema.json +1 -1
  21. package/.agents/schemas/lifecycle/merge.flip-failed.schema.json +33 -0
  22. package/.agents/schemas/lifecycle/merge.unlanded.schema.json +1 -0
  23. package/.agents/schemas/lifecycle/retro.end.schema.json +1 -1
  24. package/.agents/schemas/lifecycle/story.merged.schema.json +1 -1
  25. package/.agents/schemas/signal-event.schema.json +3 -3
  26. package/.agents/schemas/story-deliver-terminal.schema.json +152 -0
  27. package/.agents/schemas/validation-evidence.schema.json +1 -1
  28. package/.agents/scripts/acceptance-eval.js +22 -66
  29. package/.agents/scripts/agents-bootstrap-github.js +1 -1
  30. package/.agents/scripts/audit-to-stories.js +7 -7
  31. package/.agents/scripts/boot-sweep.js +1 -1
  32. package/.agents/scripts/bootstrap.js +3 -3
  33. package/.agents/scripts/check-dead-exports.js +43 -104
  34. package/.agents/scripts/check-doc-links.js +2 -2
  35. package/.agents/scripts/check-lifecycle-lint.js +7 -10
  36. package/.agents/scripts/check-workflow-cli-lint.js +91 -0
  37. package/.agents/scripts/cleanup-repo-test-temp.js +6 -1
  38. package/.agents/scripts/deliver-recover.js +122 -0
  39. package/.agents/scripts/drain-pending-cleanup.js +1 -1
  40. package/.agents/scripts/evidence-gate.js +20 -50
  41. package/.agents/scripts/generate-skills-index.js +17 -1
  42. package/.agents/scripts/generate-workflows-doc.js +4 -4
  43. package/.agents/scripts/lib/ITicketingProvider.js +1 -19
  44. package/.agents/scripts/lib/Logger.js +6 -10
  45. package/.agents/scripts/lib/audit-suite/runner.js +2 -2
  46. package/.agents/scripts/lib/audit-suite/selector.js +328 -28
  47. package/.agents/scripts/lib/audit-to-stories/{seed-epic-from-findings.js → seed-from-findings.js} +9 -9
  48. package/.agents/scripts/lib/baselines/kernel.js +206 -18
  49. package/.agents/scripts/lib/baselines/kinds/maintainability.js +0 -15
  50. package/.agents/scripts/lib/baselines/reader.js +1 -6
  51. package/.agents/scripts/lib/bdd-runner-detect.js +5 -9
  52. package/.agents/scripts/lib/bootstrap/ci-workflow-template.js +28 -33
  53. package/.agents/scripts/lib/bootstrap/issue-forms-template.js +32 -33
  54. package/.agents/scripts/lib/bootstrap/manifest.js +8 -11
  55. package/.agents/scripts/lib/bootstrap/project-bootstrap.js +30 -53
  56. package/.agents/scripts/lib/bootstrap/quality-bootstrap.js +0 -2
  57. package/.agents/scripts/lib/checks/core-bare-clean.js +6 -3
  58. package/.agents/scripts/lib/checks/index.js +3 -2
  59. package/.agents/scripts/lib/checks/loop-health.js +12 -11
  60. package/.agents/scripts/lib/checks/state.js +17 -248
  61. package/.agents/scripts/lib/checks/story-init-not-backgrounded.js +26 -24
  62. package/.agents/scripts/lib/checks/subagent-agent-tool-required.js +3 -4
  63. package/.agents/scripts/lib/checks/worktree-bootstrap-env.js +2 -2
  64. package/.agents/scripts/lib/checks/worktree-residue-biome.js +3 -3
  65. package/.agents/scripts/lib/cli/standard-args.js +13 -22
  66. package/.agents/scripts/lib/cli-args.js +39 -9
  67. package/.agents/scripts/lib/close-validation/gates.js +15 -15
  68. package/.agents/scripts/lib/close-validation/projections/inputs.js +7 -7
  69. package/.agents/scripts/lib/close-validation/projections/maintainability.js +12 -12
  70. package/.agents/scripts/lib/close-validation/runner.js +13 -21
  71. package/.agents/scripts/lib/close-validation/telemetry.js +17 -8
  72. package/.agents/scripts/lib/config/ci.js +6 -31
  73. package/.agents/scripts/lib/config/delivery-routing.js +52 -35
  74. package/.agents/scripts/lib/config/explain.js +61 -48
  75. package/.agents/scripts/lib/config/github.js +7 -5
  76. package/.agents/scripts/lib/config/limits.js +29 -80
  77. package/.agents/scripts/lib/config/paths.js +0 -2
  78. package/.agents/scripts/lib/config/quality.js +12 -15
  79. package/.agents/scripts/lib/config/runners.js +20 -66
  80. package/.agents/scripts/lib/config/temp-paths.js +30 -63
  81. package/.agents/scripts/lib/config/worktree-isolation.js +0 -5
  82. package/.agents/scripts/lib/config-resolver.js +2 -7
  83. package/.agents/scripts/lib/config-settings-schema-delivery.js +55 -161
  84. package/.agents/scripts/lib/config-settings-schema-quality.js +17 -16
  85. package/.agents/scripts/lib/config-settings-schema.js +100 -60
  86. package/.agents/scripts/lib/dead-exports-knip.js +105 -0
  87. package/.agents/scripts/lib/dead-exports-mode.js +51 -0
  88. package/.agents/scripts/lib/dependency-parser.js +3 -2
  89. package/.agents/scripts/lib/doc-tiers.js +2 -2
  90. package/.agents/scripts/lib/duplicate-search.js +242 -41
  91. package/.agents/scripts/lib/feedback-loop/retro-proposals-graduator.js +1 -1
  92. package/.agents/scripts/lib/findings/promote-finding.js +23 -14
  93. package/.agents/scripts/lib/format-generated-json.js +97 -0
  94. package/.agents/scripts/lib/framework-version.js +19 -190
  95. package/.agents/scripts/lib/gh-exec.js +8 -0
  96. package/.agents/scripts/lib/git-branch-cleanup.js +1 -10
  97. package/.agents/scripts/lib/git-branch-lifecycle.js +17 -180
  98. package/.agents/scripts/lib/git-utils.js +32 -20
  99. package/.agents/scripts/lib/github/framework-repo.js +6 -0
  100. package/.agents/scripts/lib/json-utils.js +1 -2
  101. package/.agents/scripts/lib/label-constants.js +10 -38
  102. package/.agents/scripts/lib/label-taxonomy.js +10 -55
  103. package/.agents/scripts/lib/observability/active-story-env.js +44 -165
  104. package/.agents/scripts/lib/observability/runtime-friction.js +243 -0
  105. package/.agents/scripts/lib/observability/signal-validator.js +4 -4
  106. package/.agents/scripts/lib/observability/signals-writer.js +6 -82
  107. package/.agents/scripts/lib/observability/source-classifier.js +5 -5
  108. package/.agents/scripts/lib/observability/tool-trace-hook.js +2 -12
  109. package/.agents/scripts/lib/onboard/init-tail.js +1 -3
  110. package/.agents/scripts/lib/orchestration/acceptance-clusters.js +1 -1
  111. package/.agents/scripts/lib/orchestration/acceptance-eval-decision.js +2 -2
  112. package/.agents/scripts/lib/orchestration/ceremony-routing.js +105 -44
  113. package/.agents/scripts/lib/orchestration/code-review.js +78 -436
  114. package/.agents/scripts/lib/orchestration/column-sync.js +1 -1
  115. package/.agents/scripts/lib/orchestration/consolidation-precondition.js +4 -4
  116. package/.agents/scripts/lib/orchestration/context-envelope.js +2 -5
  117. package/.agents/scripts/lib/orchestration/deliver-recover.js +328 -0
  118. package/.agents/scripts/lib/orchestration/detectors-phase.js +12 -6
  119. package/.agents/scripts/lib/orchestration/docs-digest.js +8 -8
  120. package/.agents/scripts/lib/orchestration/file-assumptions.js +7 -13
  121. package/.agents/scripts/lib/orchestration/git-cleanup/phases/cli.js +1 -1
  122. package/.agents/scripts/lib/orchestration/git-cleanup/phases/fast-forward.js +34 -0
  123. package/.agents/scripts/lib/orchestration/lease-guard-shared.js +3 -2
  124. package/.agents/scripts/lib/orchestration/lifecycle/emit-ledger-event.js +142 -0
  125. package/.agents/scripts/lib/orchestration/lifecycle/emit-loop-tick.js +17 -19
  126. package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-flip-failed.js +86 -0
  127. package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-unlanded.js +37 -103
  128. package/.agents/scripts/lib/orchestration/lifecycle/ledger-writer.js +6 -3
  129. package/.agents/scripts/lib/orchestration/lifecycle/listeners/README.md +21 -43
  130. package/.agents/scripts/lib/orchestration/lifecycle/listeners/watcher.js +50 -85
  131. package/.agents/scripts/lib/orchestration/lifecycle/trace-logger.js +3 -14
  132. package/.agents/scripts/lib/orchestration/lint-baseline-service.js +4 -4
  133. package/.agents/scripts/lib/orchestration/merge-block-class.js +77 -21
  134. package/.agents/scripts/lib/orchestration/merge-poll.js +104 -0
  135. package/.agents/scripts/lib/orchestration/phase-runner.js +3 -2
  136. package/.agents/scripts/lib/orchestration/plan-context.js +354 -282
  137. package/.agents/scripts/lib/orchestration/plan-critic-conditions.js +11 -22
  138. package/.agents/scripts/lib/orchestration/plan-critics-evaluate.js +4 -8
  139. package/.agents/scripts/lib/orchestration/plan-metrics.js +38 -6
  140. package/.agents/scripts/lib/orchestration/plan-navigation.js +92 -0
  141. package/.agents/scripts/lib/orchestration/plan-persist/fan-out-gate.js +71 -0
  142. package/.agents/scripts/lib/orchestration/plan-persist/persist-helpers.js +245 -0
  143. package/.agents/scripts/lib/orchestration/plan-persist/plan-context-source.js +116 -0
  144. package/.agents/scripts/lib/orchestration/plan-persist/run-plan-persist.js +432 -858
  145. package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +778 -0
  146. package/.agents/scripts/lib/orchestration/plan-persist/summary.js +47 -115
  147. package/.agents/scripts/lib/orchestration/plan-persist/supersede-ops.js +509 -0
  148. package/.agents/scripts/lib/orchestration/plan-reachability.js +9 -14
  149. package/.agents/scripts/lib/orchestration/plan-runner/worktree-sweep.js +1 -1
  150. package/.agents/scripts/lib/orchestration/{epic-plan-spec/phases → planning}/authoring-context.js +52 -51
  151. package/.agents/scripts/lib/orchestration/planning/decomposer-context.js +27 -0
  152. package/.agents/scripts/lib/orchestration/{epic-plan-spec/phases → planning}/spec-authoring-grounding.js +1 -1
  153. package/.agents/scripts/lib/orchestration/pr-base-guard.js +18 -28
  154. package/.agents/scripts/lib/orchestration/remote-verifier.js +1 -1
  155. package/.agents/scripts/lib/orchestration/resolve-stories.js +344 -0
  156. package/.agents/scripts/lib/orchestration/resolves-token.js +1 -1
  157. package/.agents/scripts/lib/orchestration/retro-proposals.js +140 -79
  158. package/.agents/scripts/lib/orchestration/review-depth.js +126 -47
  159. package/.agents/scripts/lib/orchestration/review-providers/codex.js +2 -2
  160. package/.agents/scripts/lib/orchestration/review-providers/findings-renderer.js +3 -13
  161. package/.agents/scripts/lib/orchestration/review-providers/native.js +1 -154
  162. package/.agents/scripts/lib/orchestration/review-providers/review-depth.js +3 -2
  163. package/.agents/scripts/lib/orchestration/review-providers/review-provider-factory.js +21 -56
  164. package/.agents/scripts/lib/orchestration/review-providers/security-review.js +1 -1
  165. package/.agents/scripts/lib/orchestration/review-providers/types.js +5 -4
  166. package/.agents/scripts/lib/orchestration/review-providers/ultrareview.js +1 -1
  167. package/.agents/scripts/lib/orchestration/run-epilogue.js +784 -0
  168. package/.agents/scripts/lib/orchestration/single-story-close/phases/auto-merge.js +25 -1
  169. package/.agents/scripts/lib/orchestration/single-story-close/phases/base-sync.js +11 -9
  170. package/.agents/scripts/lib/orchestration/single-story-close/phases/close-validation.js +4 -4
  171. package/.agents/scripts/lib/orchestration/single-story-close/phases/code-review.js +86 -41
  172. package/.agents/scripts/lib/orchestration/single-story-close/phases/confirm-merge.js +608 -152
  173. package/.agents/scripts/lib/orchestration/single-story-close/phases/options.js +77 -32
  174. package/.agents/scripts/lib/orchestration/single-story-close/phases/post-land.js +305 -0
  175. package/.agents/scripts/lib/orchestration/single-story-close/phases/pull-request.js +1 -1
  176. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-block.js +44 -0
  177. package/.agents/scripts/lib/orchestration/single-story-close/phases/worktree-reap.js +37 -4
  178. package/.agents/scripts/lib/orchestration/single-story-close/phases/wrong-tree-guard.js +2 -2
  179. package/.agents/scripts/lib/orchestration/single-story-close/runner.js +275 -46
  180. package/.agents/scripts/lib/orchestration/single-story-lease-guard.js +1 -1
  181. package/.agents/scripts/lib/orchestration/spec-freshness.js +14 -205
  182. package/.agents/scripts/lib/orchestration/spec-section-validator.js +4 -5
  183. package/.agents/scripts/lib/orchestration/spec-spill.js +60 -0
  184. package/.agents/scripts/lib/orchestration/split-policy-validator.js +188 -0
  185. package/.agents/scripts/lib/orchestration/story-close/emit-blocked.js +49 -0
  186. package/.agents/scripts/lib/orchestration/story-close/format-autofix.js +10 -10
  187. package/.agents/scripts/lib/orchestration/story-close/phases/code-review.js +28 -42
  188. package/.agents/scripts/lib/orchestration/story-deliver-terminal.js +360 -0
  189. package/.agents/scripts/lib/orchestration/story-follow-ups.js +298 -0
  190. package/.agents/scripts/lib/orchestration/story-init-remote.js +51 -0
  191. package/.agents/scripts/lib/orchestration/story-plan-state.js +33 -0
  192. package/.agents/scripts/lib/orchestration/structured-comment-parser.js +1 -1
  193. package/.agents/scripts/lib/orchestration/task-body-validator.js +60 -25
  194. package/.agents/scripts/lib/orchestration/ticket-lease.js +27 -74
  195. package/.agents/scripts/lib/orchestration/ticket-validator-conflicts.js +130 -75
  196. package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +192 -377
  197. package/.agents/scripts/lib/orchestration/ticket-validator.js +123 -25
  198. package/.agents/scripts/lib/orchestration/ticketing/bulk.js +14 -72
  199. package/.agents/scripts/lib/orchestration/ticketing/reads.js +45 -55
  200. package/.agents/scripts/lib/orchestration/ticketing/transition.js +66 -6
  201. package/.agents/scripts/lib/orchestration/ticketing.js +0 -1
  202. package/.agents/scripts/lib/plan-phase-cleanup.js +12 -14
  203. package/.agents/scripts/lib/planning-corpus.js +12 -281
  204. package/.agents/scripts/lib/preflight-runner.js +4 -4
  205. package/.agents/scripts/lib/qa/coverage-verdict.js +5 -5
  206. package/.agents/scripts/lib/qa/qa-context-hydrator.js +5 -5
  207. package/.agents/scripts/lib/signals/index.js +4 -17
  208. package/.agents/scripts/lib/signals/read.js +35 -35
  209. package/.agents/scripts/lib/signals/schema.js +8 -11
  210. package/.agents/scripts/lib/signals/span-tree.js +7 -7
  211. package/.agents/scripts/lib/signals/write.js +0 -1
  212. package/.agents/scripts/lib/single-story/story-merged-notify.js +13 -2
  213. package/.agents/scripts/lib/single-story-sweep/protection-ctx.js +1 -1
  214. package/.agents/scripts/lib/skills/parse-skill.js +16 -3
  215. package/.agents/scripts/lib/story-adjacency.js +17 -19
  216. package/.agents/scripts/lib/story-body/story-body.js +130 -75
  217. package/.agents/scripts/lib/story-plan.js +2 -4
  218. package/.agents/scripts/lib/templates/decomposer-prompts.js +51 -46
  219. package/.agents/scripts/lib/templates/spec-author-prompts.js +47 -45
  220. package/.agents/scripts/lib/test-env.js +14 -1
  221. package/.agents/scripts/lib/test-tiers.js +0 -3
  222. package/.agents/scripts/lib/{epic-body-sections.js → ticket-body-sections.js} +25 -39
  223. package/.agents/scripts/lib/validation-evidence.js +32 -60
  224. package/.agents/scripts/lib/wave-runner/ready-set.js +38 -12
  225. package/.agents/scripts/lib/workspace-provisioner.js +1 -1
  226. package/.agents/scripts/lib/worktree/lifecycle/pending-cleanup.js +1 -1
  227. package/.agents/scripts/lib/worktree/lifecycle/reap.js +72 -25
  228. package/.agents/scripts/lib/worktree/lifecycle-manager.js +1 -2
  229. package/.agents/scripts/lint-issue-body.js +71 -40
  230. package/.agents/scripts/mandrel-update-preflight.js +1 -1
  231. package/.agents/scripts/notify.js +4 -3
  232. package/.agents/scripts/plan-context.js +102 -80
  233. package/.agents/scripts/plan-persist.js +230 -279
  234. package/.agents/scripts/plan-run-epilogue.js +142 -0
  235. package/.agents/scripts/post-structured-comment.js +0 -38
  236. package/.agents/scripts/pr-watch-with-update.js +43 -22
  237. package/.agents/scripts/providers/github/compose.js +0 -1
  238. package/.agents/scripts/providers/github/errors.js +0 -19
  239. package/.agents/scripts/providers/github/issues.js +13 -39
  240. package/.agents/scripts/providers/github/mappers.js +5 -12
  241. package/.agents/scripts/providers/github/sub-issues.js +0 -47
  242. package/.agents/scripts/providers/github/tickets.js +33 -156
  243. package/.agents/scripts/providers/github.js +17 -6
  244. package/.agents/scripts/resolve-stories.js +236 -0
  245. package/.agents/scripts/run-coverage.js +4 -1
  246. package/.agents/scripts/run-lint.js +2 -2
  247. package/.agents/scripts/run-verify.js +31 -2
  248. package/.agents/scripts/signals-view.js +25 -21
  249. package/.agents/scripts/single-story-close.js +178 -26
  250. package/.agents/scripts/single-story-confirm-merge.js +313 -24
  251. package/.agents/scripts/single-story-init.js +35 -30
  252. package/.agents/scripts/stories-wave-tick.js +85 -10
  253. package/.agents/scripts/story-plan.js +28 -49
  254. package/.agents/scripts/update-ticket-state.js +14 -65
  255. package/.agents/skills/core/code-review-and-quality/SKILL.md +28 -450
  256. package/.agents/skills/core/code-review-and-quality/reference.md +458 -0
  257. package/.agents/skills/core/debugging-and-error-recovery/SKILL.md +22 -315
  258. package/.agents/skills/core/debugging-and-error-recovery/reference.md +323 -0
  259. package/.agents/skills/core/diagnose-friction/SKILL.md +14 -18
  260. package/.agents/skills/core/documentation-and-adrs/SKILL.md +25 -397
  261. package/.agents/skills/core/documentation-and-adrs/reference.md +403 -0
  262. package/.agents/skills/core/gates-and-baselines/SKILL.md +12 -12
  263. package/.agents/skills/core/idea-refinement/SKILL.md +9 -9
  264. package/.agents/skills/core/scope-triage/SKILL.md +31 -172
  265. package/.agents/skills/core/security-and-hardening/SKILL.md +22 -367
  266. package/.agents/skills/core/security-and-hardening/reference.md +375 -0
  267. package/.agents/skills/skills.index.json +3 -53
  268. package/.agents/skills/stack/qa/playwright-bdd/SKILL.md +2 -4
  269. package/.agents/skills/stack/qa/qa-explore-driving/SKILL.md +1 -1
  270. package/.agents/skills/stack/qa/qa-harness/SKILL.md +1 -3
  271. package/.agents/starter-agentrc.json +0 -5
  272. package/.agents/templates/agent-protocol.md +9 -10
  273. package/.agents/workflows/audit-architecture.md +6 -7
  274. package/.agents/workflows/audit-clean-code.md +7 -7
  275. package/.agents/workflows/audit-dependencies.md +3 -3
  276. package/.agents/workflows/audit-devops.md +3 -3
  277. package/.agents/workflows/audit-documentation.md +9 -10
  278. package/.agents/workflows/audit-lighthouse.md +11 -3
  279. package/.agents/workflows/audit-navigability.md +13 -2
  280. package/.agents/workflows/audit-performance.md +5 -6
  281. package/.agents/workflows/audit-privacy.md +3 -3
  282. package/.agents/workflows/audit-quality.md +11 -12
  283. package/.agents/workflows/audit-security.md +4 -5
  284. package/.agents/workflows/audit-seo.md +13 -3
  285. package/.agents/workflows/audit-sre.md +3 -3
  286. package/.agents/workflows/audit-to-stories.md +20 -20
  287. package/.agents/workflows/audit-ux-ui.md +10 -3
  288. package/.agents/workflows/deliver.md +177 -176
  289. package/.agents/workflows/git-cleanup.md +5 -6
  290. package/.agents/workflows/git-deliver.md +1 -1
  291. package/.agents/workflows/helpers/_merge-conflict-template.md +1 -1
  292. package/.agents/workflows/helpers/acceptance-self-eval.md +35 -40
  293. package/.agents/workflows/helpers/code-quality-guardrails.md +7 -7
  294. package/.agents/workflows/helpers/code-review.md +75 -196
  295. package/.agents/workflows/helpers/{single-story-deliver-reference.md → deliver-story-reference.md} +83 -44
  296. package/.agents/workflows/helpers/deliver-story.md +606 -0
  297. package/.agents/workflows/helpers/diagnose.md +10 -10
  298. package/.agents/workflows/helpers/parallel-tooling.md +3 -3
  299. package/.agents/workflows/helpers/signals.md +16 -16
  300. package/.agents/workflows/helpers/worktree-lifecycle.md +66 -86
  301. package/.agents/workflows/mandrel-update.md +2 -1
  302. package/.agents/workflows/plan.md +277 -145
  303. package/.agents/workflows/qa-assist.md +27 -33
  304. package/.agents/workflows/qa-explore.md +29 -38
  305. package/.agents/workflows/qa-run.md +2 -6
  306. package/README.md +9 -8
  307. package/bin/mandrel.js +12 -1
  308. package/docs/CHANGELOG.md +70 -0
  309. package/lib/cli/registry.js +262 -19
  310. package/lib/cli/sync-agents.js +157 -0
  311. package/lib/cli/sync-commands.js +115 -6
  312. package/lib/cli/sync.js +168 -6
  313. package/lib/cli/update.js +105 -8
  314. package/lib/cli/version-helpers.js +131 -0
  315. package/lib/migrations/README.md +7 -5
  316. package/lib/migrations/index.js +12 -8
  317. package/lib/migrations/steps/2.1.0-retire-mi-drop-knobs.js +100 -0
  318. package/lib/migrations/steps/2.1.0-retire-verify-concurrency-cap.js +101 -0
  319. package/package.json +2 -2
  320. package/.agents/agents/retro.md +0 -42
  321. package/.agents/personas/architect.md +0 -113
  322. package/.agents/personas/devops-engineer.md +0 -38
  323. package/.agents/personas/engineer.md +0 -33
  324. package/.agents/personas/project-manager.md +0 -114
  325. package/.agents/personas/qa-engineer.md +0 -95
  326. package/.agents/personas/security-engineer.md +0 -111
  327. package/.agents/personas/technical-writer.md +0 -101
  328. package/.agents/schemas/dispatch-manifest.json +0 -232
  329. package/.agents/schemas/epic-perf-report.schema.json +0 -89
  330. package/.agents/schemas/epic-spec.schema.json +0 -153
  331. package/.agents/schemas/lifecycle/acceptance.reconcile.failed.schema.json +0 -13
  332. package/.agents/schemas/lifecycle/acceptance.reconcile.ok.schema.json +0 -13
  333. package/.agents/schemas/lifecycle/acceptance.reconcile.skipped.schema.json +0 -13
  334. package/.agents/schemas/lifecycle/acceptance.reconcile.start.schema.json +0 -12
  335. package/.agents/schemas/lifecycle/acceptance.reconcile.waived.schema.json +0 -13
  336. package/.agents/schemas/lifecycle/epic.automerge.end.schema.json +0 -15
  337. package/.agents/schemas/lifecycle/epic.automerge.start.schema.json +0 -13
  338. package/.agents/schemas/lifecycle/epic.blocked.schema.json +0 -13
  339. package/.agents/schemas/lifecycle/epic.cleanup.end.schema.json +0 -12
  340. package/.agents/schemas/lifecycle/epic.cleanup.start.schema.json +0 -12
  341. package/.agents/schemas/lifecycle/epic.close.end.schema.json +0 -12
  342. package/.agents/schemas/lifecycle/epic.complete.schema.json +0 -13
  343. package/.agents/schemas/lifecycle/epic.finalize.end.schema.json +0 -13
  344. package/.agents/schemas/lifecycle/epic.finalize.start.schema.json +0 -12
  345. package/.agents/schemas/lifecycle/epic.merge.armed.schema.json +0 -13
  346. package/.agents/schemas/lifecycle/epic.merge.blocked.schema.json +0 -14
  347. package/.agents/schemas/lifecycle/epic.merge.confirmed.schema.json +0 -17
  348. package/.agents/schemas/lifecycle/epic.merge.ready.schema.json +0 -15
  349. package/.agents/schemas/lifecycle/epic.plan.end.schema.json +0 -18
  350. package/.agents/schemas/lifecycle/epic.plan.start.schema.json +0 -12
  351. package/.agents/schemas/lifecycle/epic.snapshot.end.schema.json +0 -16
  352. package/.agents/schemas/lifecycle/epic.snapshot.start.schema.json +0 -12
  353. package/.agents/schemas/lifecycle/epic.watch.end.schema.json +0 -29
  354. package/.agents/schemas/lifecycle/epic.watch.start.schema.json +0 -16
  355. package/.agents/schemas/lifecycle/slice.end.schema.json +0 -21
  356. package/.agents/schemas/lifecycle/slice.heartbeat.schema.json +0 -20
  357. package/.agents/schemas/lifecycle/slice.start.schema.json +0 -17
  358. package/.agents/schemas/lifecycle/story.heartbeat.schema.json +0 -20
  359. package/.agents/schemas/risk-verdict.schema.json +0 -66
  360. package/.agents/schemas/story-perf-summary.schema.json +0 -73
  361. package/.agents/scripts/acceptance-spec-reconciler.js +0 -642
  362. package/.agents/scripts/analyze-execution.js +0 -444
  363. package/.agents/scripts/bookkeeping-reconcile.js +0 -117
  364. package/.agents/scripts/check-prepush-recovery.js +0 -90
  365. package/.agents/scripts/dispatcher.js +0 -295
  366. package/.agents/scripts/epic-audit-prepare.js +0 -497
  367. package/.agents/scripts/epic-audit-recheck.js +0 -274
  368. package/.agents/scripts/epic-deliver-note-intervention.js +0 -192
  369. package/.agents/scripts/epic-deliver-preflight.js +0 -462
  370. package/.agents/scripts/epic-deliver-prepare.js +0 -852
  371. package/.agents/scripts/epic-execute-record-wave.js +0 -449
  372. package/.agents/scripts/epic-plan-clarity.js +0 -211
  373. package/.agents/scripts/epic-plan-healthcheck.js +0 -581
  374. package/.agents/scripts/epic-reconcile.js +0 -625
  375. package/.agents/scripts/lib/baseline-snapshot.js +0 -979
  376. package/.agents/scripts/lib/checks/epic-merge-lock-stale.js +0 -54
  377. package/.agents/scripts/lib/checks/stale-origin-epic.js +0 -49
  378. package/.agents/scripts/lib/config/lifecycle.js +0 -40
  379. package/.agents/scripts/lib/config/preflight.js +0 -58
  380. package/.agents/scripts/lib/config/retro.js +0 -77
  381. package/.agents/scripts/lib/epic-merge-lock.js +0 -322
  382. package/.agents/scripts/lib/epic-plan-clarity.js +0 -181
  383. package/.agents/scripts/lib/epic-plan-ideation.js +0 -261
  384. package/.agents/scripts/lib/git-merge-orchestrator.js +0 -261
  385. package/.agents/scripts/lib/observability/baseline-refresh-rate.js +0 -221
  386. package/.agents/scripts/lib/observability/hook-heartbeat.js +0 -219
  387. package/.agents/scripts/lib/observability/perf-aggregator.js +0 -813
  388. package/.agents/scripts/lib/observability/perf-report-readers.js +0 -328
  389. package/.agents/scripts/lib/observability/perf-report-render.js +0 -182
  390. package/.agents/scripts/lib/orchestration/bookkeeping-outbox.js +0 -270
  391. package/.agents/scripts/lib/orchestration/context-hydration-engine.js +0 -539
  392. package/.agents/scripts/lib/orchestration/deliver-route.js +0 -173
  393. package/.agents/scripts/lib/orchestration/dispatch-engine.js +0 -134
  394. package/.agents/scripts/lib/orchestration/dispatch-pipeline.js +0 -183
  395. package/.agents/scripts/lib/orchestration/epic-cleanup.js +0 -801
  396. package/.agents/scripts/lib/orchestration/epic-deliver-lease-guard.js +0 -310
  397. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/context.js +0 -163
  398. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/creation.js +0 -140
  399. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/dag.js +0 -64
  400. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/diagnostics.js +0 -72
  401. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/persist-helpers.js +0 -156
  402. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/persist.js +0 -345
  403. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/planning-artifacts.js +0 -41
  404. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/reconcile-spawn.js +0 -86
  405. package/.agents/scripts/lib/orchestration/epic-plan-lease-guard.js +0 -391
  406. package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/drain.js +0 -94
  407. package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/plan-epic.js +0 -236
  408. package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/risk-verdict.js +0 -105
  409. package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/run-spec-phase.js +0 -307
  410. package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/spec-freshness.js +0 -117
  411. package/.agents/scripts/lib/orchestration/epic-plan-state-store.js +0 -117
  412. package/.agents/scripts/lib/orchestration/epic-run-state-store.js +0 -621
  413. package/.agents/scripts/lib/orchestration/epic-runner/concurrency-gate.js +0 -186
  414. package/.agents/scripts/lib/orchestration/epic-runner/deliver-phases.js +0 -50
  415. package/.agents/scripts/lib/orchestration/epic-runner/phases/build-wave-dag.js +0 -129
  416. package/.agents/scripts/lib/orchestration/epic-runner/phases/snapshot.js +0 -103
  417. package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter/composition.js +0 -267
  418. package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter/signals.js +0 -210
  419. package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter/transport.js +0 -238
  420. package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/_bullet-format.js +0 -32
  421. package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/component-drift.js +0 -203
  422. package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/crap-drift.js +0 -227
  423. package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/maintainability-drift.js +0 -117
  424. package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/stalled-worktree.js +0 -37
  425. package/.agents/scripts/lib/orchestration/epic-runner/story-launcher.js +0 -127
  426. package/.agents/scripts/lib/orchestration/epic-runner/story-run-progress-writer.js +0 -400
  427. package/.agents/scripts/lib/orchestration/epic-runner/sub-agent-return.js +0 -276
  428. package/.agents/scripts/lib/orchestration/epic-runner/wave-scheduler.js +0 -66
  429. package/.agents/scripts/lib/orchestration/epic-spec-reconciler-apply.js +0 -789
  430. package/.agents/scripts/lib/orchestration/epic-spec-reconciler-diff.js +0 -676
  431. package/.agents/scripts/lib/orchestration/epic-spec-reconciler-discriminator.js +0 -389
  432. package/.agents/scripts/lib/orchestration/epic-spec-reconciler-format.js +0 -230
  433. package/.agents/scripts/lib/orchestration/epic-spec-reconciler-ops.js +0 -361
  434. package/.agents/scripts/lib/orchestration/error-journal.js +0 -139
  435. package/.agents/scripts/lib/orchestration/finalize/open-or-locate-pr.js +0 -306
  436. package/.agents/scripts/lib/orchestration/finalize/post-handoff-comment.js +0 -489
  437. package/.agents/scripts/lib/orchestration/finalize/sanitize-skip-ci.js +0 -88
  438. package/.agents/scripts/lib/orchestration/lifecycle/emit-slice-lifecycle.js +0 -270
  439. package/.agents/scripts/lib/orchestration/lifecycle/emit-story-dispatch-end.js +0 -147
  440. package/.agents/scripts/lib/orchestration/lifecycle/emit-story-heartbeat.js +0 -155
  441. package/.agents/scripts/lib/orchestration/lifecycle/ledger-diff.js +0 -140
  442. package/.agents/scripts/lib/orchestration/lifecycle/listeners/acceptance-reconciler.js +0 -465
  443. package/.agents/scripts/lib/orchestration/lifecycle/listeners/automerge-armer.js +0 -501
  444. package/.agents/scripts/lib/orchestration/lifecycle/listeners/automerge-predicate.js +0 -984
  445. package/.agents/scripts/lib/orchestration/lifecycle/listeners/branch-cleaner.js +0 -264
  446. package/.agents/scripts/lib/orchestration/lifecycle/listeners/checkpoint-pointer-writer.js +0 -284
  447. package/.agents/scripts/lib/orchestration/lifecycle/listeners/cleaner.js +0 -355
  448. package/.agents/scripts/lib/orchestration/lifecycle/listeners/finalizer.js +0 -673
  449. package/.agents/scripts/lib/orchestration/lifecycle/listeners/index.js +0 -378
  450. package/.agents/scripts/lib/orchestration/lifecycle/listeners/intervention-recorder.js +0 -140
  451. package/.agents/scripts/lib/orchestration/lifecycle/listeners/label-transitioner.js +0 -144
  452. package/.agents/scripts/lib/orchestration/lifecycle/listeners/merge-watcher.js +0 -665
  453. package/.agents/scripts/lib/orchestration/lifecycle/listeners/notify-dispatcher.js +0 -174
  454. package/.agents/scripts/lib/orchestration/manifest-builder.js +0 -222
  455. package/.agents/scripts/lib/orchestration/plan-persist/amend.js +0 -359
  456. package/.agents/scripts/lib/orchestration/plan-persist/delivery-mode.js +0 -127
  457. package/.agents/scripts/lib/orchestration/plan-review-routing.js +0 -63
  458. package/.agents/scripts/lib/orchestration/planning-context-budget.js +0 -213
  459. package/.agents/scripts/lib/orchestration/planning-risk.js +0 -194
  460. package/.agents/scripts/lib/orchestration/post-merge/phases/branch-cleanup.js +0 -56
  461. package/.agents/scripts/lib/orchestration/post-merge/phases/dashboard-refresh.js +0 -33
  462. package/.agents/scripts/lib/orchestration/post-merge/phases/notification.js +0 -78
  463. package/.agents/scripts/lib/orchestration/post-merge/phases/temp-cleanup.js +0 -68
  464. package/.agents/scripts/lib/orchestration/post-merge/phases/ticket-closure.js +0 -118
  465. package/.agents/scripts/lib/orchestration/post-merge/phases/worktree-reap.js +0 -396
  466. package/.agents/scripts/lib/orchestration/post-merge-pipeline.js +0 -205
  467. package/.agents/scripts/lib/orchestration/preflight-cache.js +0 -187
  468. package/.agents/scripts/lib/orchestration/recurring-failure-detector.js +0 -152
  469. package/.agents/scripts/lib/orchestration/retro/phases/checks.js +0 -94
  470. package/.agents/scripts/lib/orchestration/retro/phases/compose-body.js +0 -571
  471. package/.agents/scripts/lib/orchestration/retro/phases/gather-signals.js +0 -450
  472. package/.agents/scripts/lib/orchestration/retro/phases/post-and-mirror.js +0 -191
  473. package/.agents/scripts/lib/orchestration/retro-heuristics.js +0 -57
  474. package/.agents/scripts/lib/orchestration/retro-perf-heuristics.js +0 -275
  475. package/.agents/scripts/lib/orchestration/retro-runner.js +0 -197
  476. package/.agents/scripts/lib/orchestration/spec-renderer.js +0 -447
  477. package/.agents/scripts/lib/orchestration/story-close/auto-refresh-runner.js +0 -747
  478. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/gate-failure.js +0 -211
  479. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/pre-merge-attribution.js +0 -158
  480. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/refresh-commit.js +0 -446
  481. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/regression-projection.js +0 -297
  482. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/scope-discovery.js +0 -48
  483. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution-wiring.js +0 -67
  484. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution.js +0 -161
  485. package/.agents/scripts/lib/orchestration/story-close/baseline-friction-body.js +0 -117
  486. package/.agents/scripts/lib/orchestration/story-close/cd-out-guard.js +0 -86
  487. package/.agents/scripts/lib/orchestration/story-close/cleanup-reconciler.js +0 -147
  488. package/.agents/scripts/lib/orchestration/story-close/close-inputs.js +0 -142
  489. package/.agents/scripts/lib/orchestration/story-close/comment-bodies.js +0 -62
  490. package/.agents/scripts/lib/orchestration/story-close/merge-runner.js +0 -658
  491. package/.agents/scripts/lib/orchestration/story-close/merge-subject.js +0 -198
  492. package/.agents/scripts/lib/orchestration/story-close/phases/branch-restore.js +0 -105
  493. package/.agents/scripts/lib/orchestration/story-close/phases/close.js +0 -222
  494. package/.agents/scripts/lib/orchestration/story-close/phases/gates.js +0 -292
  495. package/.agents/scripts/lib/orchestration/story-close/phases/locked-pipeline.js +0 -270
  496. package/.agents/scripts/lib/orchestration/story-close/phases/preflight.js +0 -110
  497. package/.agents/scripts/lib/orchestration/story-close/phases/refresh.js +0 -86
  498. package/.agents/scripts/lib/orchestration/story-close/phases/timeout-blocked-emitter.js +0 -112
  499. package/.agents/scripts/lib/orchestration/story-close/phases/timeout-blocked.js +0 -157
  500. package/.agents/scripts/lib/orchestration/story-close/post-merge-close.js +0 -421
  501. package/.agents/scripts/lib/orchestration/story-close/pre-merge-validation.js +0 -302
  502. package/.agents/scripts/lib/orchestration/story-close/shared-checkout-guard.js +0 -163
  503. package/.agents/scripts/lib/orchestration/story-close-recovery.js +0 -690
  504. package/.agents/scripts/lib/orchestration/wave-marker.js +0 -28
  505. package/.agents/scripts/lib/orchestration/wave-record-io.js +0 -218
  506. package/.agents/scripts/lib/orchestration/wave-record-notifications.js +0 -145
  507. package/.agents/scripts/lib/orchestration/wave-record-projection.js +0 -212
  508. package/.agents/scripts/lib/presentation/dispatch-manifest-render.js +0 -111
  509. package/.agents/scripts/lib/presentation/manifest-builder.js +0 -239
  510. package/.agents/scripts/lib/presentation/manifest-formatter.js +0 -242
  511. package/.agents/scripts/lib/presentation/manifest-helpers.js +0 -213
  512. package/.agents/scripts/lib/presentation/manifest-persistence.js +0 -261
  513. package/.agents/scripts/lib/presentation/manifest-procedures.js +0 -55
  514. package/.agents/scripts/lib/presentation/manifest-render-waves.js +0 -306
  515. package/.agents/scripts/lib/presentation/manifest-renderer.js +0 -188
  516. package/.agents/scripts/lib/presentation/manifest-story-views.js +0 -110
  517. package/.agents/scripts/lib/push-epic-retry.js +0 -209
  518. package/.agents/scripts/lib/spec/index.js +0 -36
  519. package/.agents/scripts/lib/spec/loader.js +0 -425
  520. package/.agents/scripts/lib/spec/state.js +0 -208
  521. package/.agents/scripts/lib/story-init/blocker-validator.js +0 -68
  522. package/.agents/scripts/lib/story-init/branch-initializer.js +0 -408
  523. package/.agents/scripts/lib/story-init/context-resolver.js +0 -92
  524. package/.agents/scripts/lib/story-init/donor-precheck.js +0 -207
  525. package/.agents/scripts/lib/story-init/state-transitioner.js +0 -80
  526. package/.agents/scripts/lib/story-init/task-graph-builder.js +0 -124
  527. package/.agents/scripts/lib/story-init/transition-summary.js +0 -34
  528. package/.agents/scripts/lib/test-reserved-epic-temp-ids.js +0 -35
  529. package/.agents/scripts/lib/wave-runner/tick.js +0 -754
  530. package/.agents/scripts/lib/wave-runner/wave-runner-error.js +0 -20
  531. package/.agents/scripts/lifecycle-emit-story-dispatch.js +0 -194
  532. package/.agents/scripts/lifecycle-emit.js +0 -510
  533. package/.agents/scripts/retro-run.js +0 -218
  534. package/.agents/scripts/slice-phase.js +0 -361
  535. package/.agents/scripts/standalone-feedback-rollup.js +0 -188
  536. package/.agents/scripts/story-close.js +0 -294
  537. package/.agents/scripts/story-init.js +0 -599
  538. package/.agents/scripts/story-phase.js +0 -369
  539. package/.agents/scripts/wave-tick.js +0 -464
  540. package/.agents/skills/core/analyze-execution/SKILL.md +0 -98
  541. package/.agents/skills/core/epic-plan-consolidate/SKILL.md +0 -172
  542. package/.agents/skills/core/epic-plan-consolidate/examples.md +0 -51
  543. package/.agents/skills/core/epic-plan-decompose-author/SKILL.md +0 -441
  544. package/.agents/skills/core/epic-plan-decompose-author/examples.md +0 -47
  545. package/.agents/skills/core/epic-plan-premortem/SKILL.md +0 -146
  546. package/.agents/skills/core/epic-plan-premortem/examples.md +0 -53
  547. package/.agents/skills/core/epic-plan-spec-author/SKILL.md +0 -383
  548. package/.agents/skills/core/epic-plan-spec-author/examples.md +0 -91
  549. package/.agents/workflows/helpers/deliver-epic-reference.md +0 -547
  550. package/.agents/workflows/helpers/deliver-epic-single.md +0 -331
  551. package/.agents/workflows/helpers/deliver-epic.md +0 -998
  552. package/.agents/workflows/helpers/deliver-stories.md +0 -450
  553. package/.agents/workflows/helpers/epic-audit.md +0 -189
  554. package/.agents/workflows/helpers/epic-deliver-story.md +0 -436
  555. package/.agents/workflows/helpers/epic-testing.md +0 -125
  556. package/.agents/workflows/helpers/plan-epic-reference.md +0 -160
  557. package/.agents/workflows/helpers/plan-epic.md +0 -353
  558. package/.agents/workflows/helpers/plan-story.md +0 -251
  559. package/.agents/workflows/helpers/scope-triage-gate.md +0 -108
  560. package/.agents/workflows/helpers/single-story-deliver.md +0 -557
@@ -1,171 +1,303 @@
1
1
  ---
2
2
  description:
3
- Unified planning entry point. Routes a seed idea (via scope triage) or an
4
- existing Epic ID to the right planning path the 3-step Epic path
5
- (interrogate author → persist) or the standalone-Story authoring path —
6
- and absorbs every planning flag.
3
+ Unified planning entry point. Interrogate author persist. Emits one
4
+ Story by default (folded Tech Spec in the Story body); splits into N>1
5
+ only under the default-single split policy.
7
6
  ---
8
7
 
9
- # /plan [Epic ID] | --idea "<seed>" | --from-notes <path>
8
+ # /plan --seed "<text>" | --seed-file <path> | --tickets <ids>
10
9
 
11
10
  ## Role
12
11
 
13
- Router. `/plan` owns argument parsing and path selection only — all step
14
- content lives in the two path helpers:
12
+ Single planning path. `/plan` owns the full ceremony there is no
13
+ Epic/Story router, no scope-triage `epic|story` verdict, and no
14
+ `deliveryShape`. Two operator modes only:
15
15
 
16
- - [`helpers/plan-epic.md`](helpers/plan-epic.md)the 3-step Epic planning
17
- path (interrogate author persist; Tech Spec + Acceptance Table folded
18
- into the Epic body, then the Story backlog or a single-delivery marker).
19
- - [`helpers/plan-story.md`](helpers/plan-story.md) — the standalone-Story
20
- authoring path (context envelope → host-LLM draft → HITL → issue create).
16
+ 1. **Text** seed from chat or a file.
17
+ 2. **Tickets** analyze existing issue(s) into proper Stories.
21
18
 
22
- The existing **scope-triage skill**
23
- ([`core/scope-triage`](../skills/core/scope-triage/SKILL.md), verdicts
24
- `epic | story | borderline`) is the router's classifier on the `--idea`
25
- path; no new classification machinery exists.
19
+ Audit findings become Stories via [`/audit-to-stories`](audit-to-stories.md)
20
+ (separate workflow), which hands off with `--emit-plan-seed` →
21
+ `/plan --seed-file <path>`.
26
22
 
27
23
  ## Inputs
28
24
 
29
25
  | Invocation | Behavior |
30
26
  | --- | --- |
31
- | `/plan --idea "<seed>"` | Ideation → **scope triage**. Verdict `epic` → run [`helpers/plan-epic.md`](helpers/plan-epic.md) from its ideation entry. Verdict `story` run [`helpers/plan-story.md`](helpers/plan-story.md) Phases 1–3. Verdict `borderline` present both options and let the operator choose. |
32
- | `/plan <epicId>` | Existing-Epic path — run [`helpers/plan-epic.md`](helpers/plan-epic.md) from its existing-Epic entry. When the helper's story-sized advisory fires (the Epic is really one Story), convert **internally** by switching to [`helpers/plan-story.md`](helpers/plan-story.md) — do not re-triage and do not hop commands. |
33
- | `/plan --from-notes <path>` | Internal handoff target (e.g. from `/audit-to-stories`). The notes file already encodes the path decision; do **not** re-run scope triage. Route per the notes' declared shape. |
27
+ | `/plan --seed "<text>"` | Ideation from chat text: interrogateauthor **one Story by default**persist. |
28
+ | `/plan --seed-file <path>` | Author from on-disk notes / plan seed (e.g. audit-to-stories handoff). |
29
+ | `/plan --tickets 123[,456…]` | Fetch issue(s), analyze into proper Stories (prefer N=1 rewrite). |
30
+
31
+ `--body` is **not** a `/plan` entry. Persist always goes through
32
+ `plan-persist.js --stories …`.
34
33
 
35
34
  ## Flags
36
35
 
37
- `/plan` absorbs every planning flag and forwards it to the active path
38
- helper:
39
-
40
- | Flag | Path | Meaning |
41
- | --- | --- | --- |
42
- | `--idea "<seed>"` | both | Seed text; triggers scope triage. |
43
- | `--from-notes <path>` | both | Pre-triaged handoff notes; skips triage. |
44
- | `--force` | Epic | Re-plan: overwrite managed sections in place and close + recreate the ticket tree. |
45
- | `--amend` | Epic | Change-request delta persist: tickets carry `op: add\|modify\|keep\|close`; close ops require `--explicit-delete` after the dry-run diff. |
46
- | `--force-review` | Epic | Force the gate #2 operator review even when risk routing would skip it. |
47
- | `--allow-over-budget` | Epic | Permit a decomposition that exceeds the framework `maxTickets` reviewability budget. |
48
- | `--yes` | both | **Non-interactive / headless mode.** Deterministically auto-proceeds the two `/plan` HITL STOP gates — gate #1 (exit of interrogate) and gate #2 (risk-routed pre-persist review) — without waiting for operator input. Parallel to [`/deliver --yes`](deliver.md). Composes with `--allow-over-budget` and with the risk-routed gate #2 skip (it forces a proceed where those do not apply). Default (flag absent) behavior is unchanged: both gates still STOP for interactive use. |
49
- | `--steal` | Epic | Forcibly transfer a foreign Epic-lease. |
50
- | `--resume` | Epic | Continue a partial persist (rate-limit / crash recovery). |
51
- | `--dry-run` | Story | Author + validate without GitHub writes (`story-plan.js --dry-run`). |
52
- | `--body <path>` | Story | Pre-authored Story body file; validate (and create, unless `--dry-run`) without re-authoring. |
53
- | `--persona <name>` | Story | Override the persona label on the drafted Story. |
54
- | `--refine` / `--no-refine` | Story | Toggle the draft refinement loop. |
55
-
56
- **Cross-path flags are no-ops with a warning.** An Epic-only flag passed on
57
- the story path (or vice versa) is reported once
58
- (`[plan] --force has no effect on the story path`) and ignored never an
59
- error. The historical bidirectional escalation between the two planning
60
- commands (story-sized Epic Story; epic-sized Story draft Epic) is an
61
- **internal branch switch** inside this router: same skills, same helpers, no
62
- command hop and no operator re-entry.
63
-
64
- ### Headless / non-interactive mode (`--yes`)
65
-
66
- `--yes` is the headless escape hatch for an unattended driver (CI, a
67
- benchmark harness, or any `claude -p` run with no human at the keyboard). It
68
- is the `/plan`-side parallel of [`/deliver --yes`](deliver.md). `/plan` has
69
- exactly **two** HITL STOP gates, and `--yes` deterministically auto-proceeds
70
- **both** without waiting for operator input:
71
-
72
- 1. **Gate #1 — the exit of the interrogate step.** One conceptual gate with
73
- a face per entry form, and `--yes` auto-proceeds all of them:
74
- - On the `--idea` Epic path, the interrogate step of
75
- [`helpers/plan-epic.md`](helpers/plan-epic.md) STOPs to confirm the
76
- sharpened one-pager, folding in the scope-triage verdict and the
77
- duplicate-candidate review.
78
- - On the `--idea` Story path,
79
- [`helpers/plan-story.md`](helpers/plan-story.md) Phase 2 STOPs to
80
- confirm the drafted Story body.
81
- - On the existing-Epic (`/plan <epicId>`) path, the interrogate step
82
- STOPs to confirm the folded re-plan / clarity-refinement / advisory
83
- outcomes (the Clarity Gate's refined-body diff among them).
84
-
85
- Under `--yes` each resolves as **approved**, and a `story` /
86
- `borderline` triage verdict resolves to its **Recommended** branch rather
87
- than prompting the three-way choice. **The interrogation itself runs
88
- exactly one bounded pass**: no operator questions are asked — facts come
89
- from the codebase, and every unresolved unknown lands in the one-pager's
90
- **Key Assumptions** section instead of a question, so a headless driver
91
- can never hang inside a free-form interrogation. On the `--idea` Epic
92
- path this bounded pass IS the seed entry (#4496): `plan-context.js
93
- --seed` replaces the idea-refinement prelude, and the one-pager is
94
- authored in the same batched write as the spec artifacts. The verdict / clarity
95
- scoring is still recorded in chat (one line); only the *wait* is
96
- suppressed — the deterministic clarity *scoring* inside the
97
- `plan-context.js` envelope always runs.
98
- 2. **Gate #2 — the risk-routed pre-persist review.** When the authored risk
99
- verdict routes to review (high risk, or the operator also passed
100
- `--force-review`), [`helpers/plan-epic.md`](helpers/plan-epic.md) step 3
101
- STOPs for operator approval of the assembled plan (spec, tickets, risk,
102
- and `deliveryShape` in one view) before the persist CLI runs. Under
103
- `--yes` this review auto-proceeds straight to the persist call, exactly
104
- as on the low-risk auto-proceed branch.
105
-
106
- **Composition.** `--yes` is orthogonal to the other planning flags and
107
- composes cleanly:
108
-
109
- - With **`--allow-over-budget`**: `--yes` suppresses the gate *waits* while
110
- `--allow-over-budget` still governs the `maxTickets` over-budget persist —
111
- passing `--yes` alone does **not** waive the budget gate.
112
- - With the **risk-routed gate #2 skip**: when risk routing already
113
- auto-proceeds the review (low-risk, no `--force-review`), `--yes` is a
114
- no-op for that gate — it only *forces a proceed where the gate would
115
- otherwise STOP*, it never *adds* a stop or relaxes any non-HITL validator.
116
-
117
- **`--yes` suppresses only the HITL operator *waits* above.** It does **not**
118
- relax any deterministic gate — the clarity scoring, the Tech Spec section
119
- gate, the ticket validator / file-assumption / DAG / budget gates, the
120
- inline readiness healthcheck, and the `agent::blocked` runtime pause all
121
- behave exactly as without the flag; it is an operator-input suppressor, not
122
- a validation override. A `--yes` run that hits one of those still fails
123
- closed. The smaller operator-input waits folded into the two gates — the
124
- duplicate-candidate review, the clarity refinement-diff confirm, and the
125
- advisory critic diffs — auto-proceed for the same headless reason.
36
+ | Flag | Meaning |
37
+ | --- | --- |
38
+ | `--seed "<text>"` | Seed text for ideation. |
39
+ | `--seed-file <path>` | Pre-authored notes / plan-seed path. |
40
+ | `--tickets <ids>` | Comma-separated issue ids to analyze. Closed as superseded at persist (see below). |
41
+ | `--no-close-superseded` | Keep the `--tickets` source issues open — no supersede comment, no close. |
42
+ | `--force-review` | STOP at gate #2 for operator review of the assembled plan. The only thing that gates review — there is no risk-derived routing (Story #4542). |
43
+ | `--allow-over-budget` | Permit a plan that exceeds `maxTickets` (rare N>1). |
44
+ | `--yes` | Non-interactive: auto-proceed gate #1 and gate #2 HITL waits. |
45
+ | `--dry-run` | Author + validate without GitHub writes. Run it as a pre-pass before every real persist (see below). |
46
+
47
+ ## Default-single split policy
48
+
49
+ Author **one Story** unless:
50
+
51
+ 1. the pieces have **near-zero overlap** (genuinely independent capabilities), or
52
+ 2. there is an **architectural seam** (different deployables, migration vs consumer).
53
+
54
+ Coupled work stays one Story — decompose it inside `## Slicing` as
55
+ intra-session checkpoints, not sibling tickets. When N>1, every acceptance
56
+ criterion must belong to exactly one Story; `plan-persist` runs
57
+ `assertAcceptancePartition` and refuses coupled splits.
58
+
59
+ **N=1 is the lean path:** one authoring prompt, folded `## Spec` in the
60
+ Story body, light risk/critic profile. Do not run Epic-scale decompose,
61
+ clarity, or reconciler ceremony for a single Story.
126
62
 
127
63
  ## Procedure
128
64
 
129
- 1. **Parse args.** Exactly one of `<epicId>`, `--idea`, `--from-notes`, or
130
- `--body` must be present; anything else is a usage error naming the four
131
- forms. A `--body` invocation routes to the story path (no triage).
132
- 2. **Triage (idea path only).** Attended: run the
133
- [`core/scope-triage`](../skills/core/scope-triage/SKILL.md) skill on the
134
- seed. Record the verdict in chat (one line). **Under `--yes`, do not
135
- Read the skill**: delegate straight to
136
- [`helpers/plan-epic.md`](helpers/plan-epic.md)'s ideation entry — its
137
- `plan-context.js --seed` envelope carries the rubric's verdict applied
138
- CLI-side (`scopeTriage`), and a `story` / `borderline` verdict resolves
139
- to the Recommended handoff from inside the helper (see
140
- [`helpers/scope-triage-gate.md`](helpers/scope-triage-gate.md)).
141
- 3. **Delegate.** Read the selected path helper **in full** and execute it
142
- from its entry, forwarding the absorbed flags (including `--yes`). The
143
- helper's steps, HITL gates, and scripts are the procedure — this router
144
- adds no step content. When `--yes` is present, the two HITL STOP gates
145
- auto-proceed per [Headless / non-interactive mode](#headless--non-interactive-mode---yes)
146
- above; every deterministic gate still runs. **Under `--yes`, when the
147
- helper content is already injected or present in context, execute it
148
- directly do not spend a separate read-in-full turn re-reading content
149
- you already hold.**
150
- 4. **Internal returns.** When a path helper would historically have handed
151
- off to the other planning command, switch helpers in-place and continue;
152
- surface the switch to the operator as a one-line note.
65
+ ### 1. Interrogate
66
+
67
+ ```bash
68
+ node .agents/scripts/plan-context.js --seed "<seed>" \
69
+ --out temp/plan-<slug>/plan-context.json
70
+ # or: --seed-file <path>
71
+ # or: --tickets 123,456
72
+ ```
73
+
74
+ **Always pass `--out temp/plan-<slug>/plan-context.json`.** The CLI writes the
75
+ envelope there (creating parent dirs); persist auto-discovers that file from
76
+ `--plan-dir` and derives the `--tickets` source ids from its `sourceTickets[]`.
77
+ That is what makes superseding work without anyone re-typing ids
78
+ (Story #4554). The envelope still goes to stdout too, so piping is unaffected.
79
+
80
+ The envelope carries docs context, codebase snapshot, BDD probe, risk
81
+ heuristics, the story-author system prompt, `sourceTickets[]` (`--tickets`
82
+ mode), and `duplicates[]` (open **Stories** whose title/body overlap the
83
+ seed never Epics).
84
+ Under `--yes`, do not ask free-form operator questions unresolved
85
+ unknowns land in Key Assumptions.
86
+
87
+ **Gate #1** STOP to confirm the sharpened plan intent and any
88
+ duplicate-candidate review. Under `--yes`, auto-proceed.
89
+
90
+ ### 2. Author
91
+
92
+ Write artifacts under `temp/plan-<slug>/`:
93
+
94
+ - `stories.json` — array of Story tickets (**length 1 by default**). Each
95
+ body uses the canonical `story-body` shape (`## Goal`, optional
96
+ `## Slicing`, optional `## Spec`, `## Changes`, `## Acceptance`,
97
+ `## Verify`, …). The Story is the single executable document: put lean
98
+ approach prose in `## Spec`, binding criteria in top-level
99
+ `acceptance[]` / `verify[]` (persist syncs them into the body). Do not
100
+ restate Goal/Acceptance inside Spec. Over-budget Specs fail closed —
101
+ split the Story or tighten Spec; never write Specs under `docs/`.
102
+ - optional `techspec.md` — **N===1 only** convenience when Spec was authored
103
+ outside the Story JSON; persist folds it into that Story's `## Spec`.
104
+ Forbidden for N>1 (each Story must carry its own Spec).
105
+ - optional `acceptance-manifest.json` — plan-level AC list (a JSON
106
+ `string[]`) for partition coverage when N>1. Pass it to persist as
107
+ `--plan-acceptance` or it is not read.
108
+
109
+ For N=1, use the envelope `systemPrompts.story` and emit one cohesive
110
+ Story. Split only under the policy above.
111
+
112
+ **Tickets mode — author `supersedes[]` on every Story.** In `--tickets`
113
+ mode each Story carries a top-level `supersedes` array claiming the source
114
+ issues it replaces. It is bookkeeping, not part of the Story body, so it is
115
+ never serialized into the markdown:
116
+
117
+ ```jsonc
118
+ {
119
+ "slug": "close-superseded",
120
+ "supersedes": [
121
+ 4525,
122
+ { "id": 4529, "note": "The filed `--changed-only` fix is provably inert; the correction is recorded here." }
123
+ ]
124
+ }
125
+ ```
126
+
127
+ Entries are bare issue numbers, or `{ id, note }` when the plan has
128
+ something to say about *that* source issue — a correction to its analysis,
129
+ or why it was folded in with others. The optional `note` is rendered into
130
+ that issue's supersede comment, so planning that materially corrects a
131
+ source issue records the correction on the ticket rather than emitting
132
+ template-only prose.
133
+
134
+ ### Supersede-map partition
135
+
136
+ `plan-persist` refuses a partial supersede map **before** it creates any
137
+ Story (mirroring `assertAcceptancePartition`): every id passed to
138
+ `--tickets` must be claimed by **exactly one** Story, and no Story may
139
+ claim an id that was not a source ticket. With N>1 the mapping is not
140
+ total by default — an authored map is the only thing that can say
141
+ `#4525-#4528 → #4530` while `#4529 → #4531`, which a blanket "superseded by
142
+ this plan-run" reference could not.
143
+
144
+ ### 3. Persist
145
+
146
+ **Gate #2** — when the operator passed `--force-review`, STOP for approval of
147
+ the assembled plan before persist. Under `--yes`, auto-proceed.
148
+
149
+ `--force-review` is the **only** thing that raises this gate. Story #4542
150
+ retired the risk-derived alternative: the planner authored its own risk verdict,
151
+ persist computed a `requiresStop` from it *after* `createStoryIssues` had already
152
+ run, and nothing read the result — the STOP was prose executed by the same
153
+ session that wrote the verdict. A gate a plan can lower for itself is not a gate.
154
+
155
+ #### Dry-run pre-pass (always)
156
+
157
+ Run persist with `--dry-run` **before** the real one. It is the same command
158
+ with the same flags — only the GitHub writes are suppressed:
159
+
160
+ ```bash
161
+ node .agents/scripts/plan-persist.js \
162
+ --stories temp/plan-<slug>/stories.json \
163
+ [--plan-acceptance temp/plan-<slug>/acceptance-manifest.json] \
164
+ [--tech-spec temp/plan-<slug>/techspec.md] \
165
+ --plan-dir temp/plan-<slug> \
166
+ --dry-run
167
+ ```
168
+
169
+ Every gate — ticket validator, body parse, subject-prefix, DAG, capacity,
170
+ budget, reachability, split-policy and supersede partitions, Spec fold —
171
+ runs **before** the first `createIssue`, so a dry-run exercises all of them
172
+ write-free. An authoring mistake surfaces here, where the fix costs one
173
+ re-author, instead of after `k` of `N` Stories are already live.
174
+
175
+ #### The real persist
176
+
177
+ ```bash
178
+ node .agents/scripts/plan-persist.js \
179
+ --stories temp/plan-<slug>/stories.json \
180
+ [--plan-acceptance temp/plan-<slug>/acceptance-manifest.json] \
181
+ [--tech-spec temp/plan-<slug>/techspec.md] \
182
+ [--plan-dir temp/plan-<slug>] \
183
+ [--plan-context temp/plan-<slug>/plan-context.json] \
184
+ [--source-tickets 123,456] \
185
+ [--no-close-superseded] \
186
+ [--force-review] \
187
+ [--allow-over-budget]
188
+ ```
189
+
190
+ Pass `--plan-acceptance` whenever step 2 wrote an `acceptance-manifest.json`
191
+ — it is what `assertAcceptancePartition` checks the N>1 split against.
192
+
193
+ Persist creates Story issue(s) with `type::story` (plus any sanitized
194
+ authored `labels[]`) and, when N>1, writes each authored `depends_on` edge
195
+ into the sibling's body as a `blocked by #<id>` footer — the ordering
196
+ `/deliver` resolves from. No batch label is applied (Story #4540 retired
197
+ `plan-run::<id>`). Ends by naming the exact command:
198
+ `/deliver <storyId> [<storyId> ...]`.
199
+
200
+ stdout is a pure JSON result; all log lines go to stderr, so a headless
201
+ driver can `JSON.parse` the stdout stream directly.
202
+
203
+ #### Ready means fully persisted
204
+
205
+ `agent::ready` is the **terminal** step, not part of the creating POST
206
+ (Story #4541). The order is: create unlabelled → upsert `story-plan-state` on
207
+ every Story → upsert `plan-summary` on the primary → flip every Story to
208
+ `agent::ready`.
209
+
210
+ This is what lets `/deliver` trust the label: a Story carrying
211
+ `agent::ready` always has its persist receipt on the ticket, so nothing can
212
+ pick it up mid-write and read a half-persisted plan.
213
+
214
+ #### Resuming a failed persist
215
+
216
+ Persist is **idempotent over the same authored artifacts**. Each created body
217
+ carries an invisible plan fingerprint (derived from the Story's slug +
218
+ title), and persist indexes the open `type::story` backlog by it before
219
+ creating anything.
220
+
221
+ So if a transient GitHub failure strands the run at Story `k` of `N`:
222
+
223
+ | | Behaviour |
224
+ | --- | --- |
225
+ | The `1..k-1` Stories | Live, but **not** `agent::ready` — invisible to `/deliver`, not half-delivered. |
226
+ | Re-running persist | Adopts them by fingerprint, creates only the missing ones, then flips the whole cohort ready. |
227
+ | Editing `stories.json` first | Changing a slug or title changes the fingerprint — the old issue is orphaned rather than adopted. Close it by hand. |
228
+
229
+ Just re-run the same command. Do not hand-delete the stranded issues first.
230
+
231
+ #### Temp hygiene
232
+
233
+ A terminal-success run deletes its own `--plan-dir`. Every persist also reaps
234
+ abandoned `temp/plan-*` directories older than 7 days, so dry-runs, failed
235
+ gates, and abandoned authoring sessions do not accumulate under `temp/`.
236
+
237
+ ### How the source ids reach persist
238
+
239
+ In `--tickets` mode persist needs to know which ids were fetched. It resolves
240
+ them **envelope-first** (Story #4554):
241
+
242
+ | Channel | When it wins |
243
+ | --- | --- |
244
+ | Envelope `sourceTickets[]` | **The normal path.** Written by step 1's `--out`, then read from `--plan-context <file>` or auto-discovered at `<plan-dir>/plan-context.json`. No ids to re-type. |
245
+ | `--source-tickets <ids>` | Explicit **override** for hand-driven runs (no captured envelope, or deliberately narrowing the set). Wins over the envelope; a disagreement is warned about, not silently reconciled. |
246
+
247
+ The result envelope's `supersede.sourceTicketOrigin` reports which channel was
248
+ used (`envelope` \| `flag` \| `none`).
249
+
250
+ Every path with no envelope is **audible** — persist cannot tell a legitimate
251
+ `--seed` run from a `--tickets` run whose envelope was never captured, so it
252
+ says so rather than deciding silently:
253
+
254
+ | Situation | Behaviour |
255
+ | --- | --- |
256
+ | Neither `--plan-dir` nor `--plan-context` | **Warn** — nothing was read; only `--source-tickets` can supply ids. |
257
+ | Auto-discovered `<plan-dir>/plan-context.json` absent | **Warn** — degrade to `--source-tickets`; a `--seed` run legitimately has none. |
258
+ | Explicit `--plan-context` missing | **Fatal** — the operator named a file and meant it. |
259
+ | Envelope present but unparseable | **Fatal** — a corrupt envelope is not "no source tickets"; treating it as such is how a `--tickets` run used to report success having superseded nothing. |
260
+
261
+ Whichever channel supplies them, the supersede-map partition above still
262
+ fail-closes: a `--tickets` run whose Stories forgot `supersedes[]` is now
263
+ **caught** (`source ticket #N is not claimed by any Story`) instead of
264
+ partitioning an empty set and passing vacuously.
265
+
266
+ ### Closing superseded source tickets
267
+
268
+ **Default on.** After the Stories exist, persist comments on each source
269
+ issue naming the specific Story that claims it — plus that Story's optional
270
+ per-supersede `note` — and closes it with reason **`not_planned`**
271
+ (`state_reason`). Nothing has shipped at persist time and the issue will not
272
+ be actioned in its own right, so `not_planned` is the honest reason;
273
+ `completed` would be a lie. This is what keeps the tracker from asserting
274
+ that already-planned work is still unowned, and it writes down the supersede
275
+ link that makes the history readable.
276
+
277
+ | Behaviour | Contract |
278
+ | --- | --- |
279
+ | Default | Comment + close every source ticket as `not_planned`. |
280
+ | `--no-close-superseded` | Skips all commenting and closing. Story creation is unchanged. Use it for a genuinely partial supersede — when the plan folded in only *part* of an issue and the remainder must stay open. |
281
+ | `--dry-run` | Posts no comment and closes nothing; reports what it would have done. |
282
+ | Re-run | Idempotent — the comment is keyed off a `superseded-by` structured-comment marker, and an already-closed source is skipped. |
283
+ | Already closed / deleted / inaccessible | Skipped and reported. Never throws. |
284
+ | Close-phase failure | **Never fails the run.** Stories stay created; the result envelope's `supersede` report names which tickets were and were not closed so the operator can finish by hand. |
285
+
286
+ `--seed` / `--seed-file` modes have no source tickets, so no close phase
287
+ runs at all.
153
288
 
154
289
  ## Constraints
155
290
 
156
- - The plan→deliver boundary stays a hard stop: `/plan` never starts
157
- delivery. It ends by naming the follow-up `/deliver <epicId>` for a
158
- planned Epic, `/deliver <storyId>` for a standalone Story.
159
- - The router never calls planning scripts directly; the path helpers own
160
- every script invocation.
161
- - Checkout hygiene (branch sweep) and day-0 doc readiness are owned by
162
- [`/git-cleanup`](git-cleanup.md) and `mandrel doctor` respectively —
163
- `/plan` runs no boot sweep and no first-run preflight.
291
+ - `/plan` never starts delivery.
292
+ - No Epic ticket is opened. No reconciler. No `delivery::single` marker.
293
+ - Duplicate search targets open Stories (`type::story`), not Epics.
294
+ - Deterministic gates (ticket validator, split policy, reachability, budget)
295
+ still fail closed under `--yes`.
164
296
 
165
297
  ## See also
166
298
 
167
- - [`/deliver`](deliver.md) — the unified delivery entry point. Accepts a
168
- single Epic, one or more standalone Stories, or any mix of ≥1 Epics and
169
- standalone Stories — mixed sets compose a sequential segment plan.
170
- - [`helpers/plan-epic.md`](helpers/plan-epic.md) /
171
- [`helpers/plan-story.md`](helpers/plan-story.md) the path helpers.
299
+ - [`/deliver`](deliver.md) — delivery entry point (`/deliver <storyId>`).
300
+ - [`/audit-to-stories`](audit-to-stories.md) audit findings plan seed
301
+ `/plan --seed-file`.
302
+ - [`core/scope-triage`](../skills/core/scope-triage/SKILL.md) — optional
303
+ split-advisory notes only (no routing verdict).
@@ -21,7 +21,7 @@ high-quality, triage-ready ledger. The session has four movements:
21
21
  a final review of the **entire** ledger and asks any last clarifying
22
22
  questions.
23
23
  4. **Triage & Plan** (Phase 4) — only then does the agent route the full ledger
24
- into [`/plan`](plan.md) to generate Epics and/or Stories.
24
+ into [`/plan`](plan.md) to generate Stories.
25
25
 
26
26
  Unlike [`/qa-explore`](qa-explore.md) (where the *agent* drives open-ended
27
27
  exploration of a named surface), `/qa-assist` is **human-led**: the human owns
@@ -45,16 +45,14 @@ never reimplements those decisions in prose.**
45
45
  > triage-ready finding without breaking stride — then, when the testing pass is
46
46
  > done, turned into a plan in one batch.
47
47
  >
48
- > **Persona**: `qa-engineer` · **Skills**: `core/qa-coverage-mapping`
48
+ > **Skills**: `core/qa-coverage-mapping`
49
49
 
50
- ## Persona
50
+ ## Role framing
51
51
 
52
- Adopt the **`qa-engineer`** persona
53
- ([`.agents/personas/qa-engineer.md`](../personas/qa-engineer.md)) for the whole
54
- run. You are the quality gatekeeper: you value coverage, hermetic
55
- environments, deterministic results, and — per that persona's Golden Rule —
56
- you **never invent the signal**. The human owns what was observed; you enrich
57
- it. Re-read that persona file as your first action.
52
+ You are the quality gatekeeper for this run: value coverage, hermetic
53
+ environments, and deterministic results. **Never invent the signal** — the
54
+ human owns what was observed; you enrich it. Apply the QA skills; there is
55
+ no separate persona pack.
58
56
 
59
57
  ## Slash Command
60
58
 
@@ -69,7 +67,7 @@ it. Re-read that persona file as your first action.
69
67
  | `observation` | no | `"sync-commands wipes .claude on a reused name"` | An optional first observation, or a brain dump of several. **Usually omitted** — the normal launch is a bare `/qa-assist`, which does Setup and then waits. If supplied, run Setup first, then feed it in as the first intake (splitting it if it carries multiple observations). |
70
68
 
71
69
  A bare `/qa-assist` is the expected entry point. **Do not** demand an
72
- observation up front and **do not** synthesize one — the `qa-engineer` Golden
70
+ observation up front and **do not** synthesize one — the QA Golden
73
71
  Rule forbids inventing the signal. Set up, announce ready, and wait.
74
72
 
75
73
  ## Project contract
@@ -140,7 +138,7 @@ ledger is hard-gated.**
140
138
 
141
139
  Goal: become the operator's QA assistant before any observation arrives.
142
140
 
143
- 1. Re-read the `qa-engineer` persona.
141
+ 1. Re-read the QA role framing and `core/qa-coverage-mapping` skill.
144
142
  2. **Load codebase context.** Read the files in `project.docsContextFiles`
145
143
  (architecture, decisions, patterns) and, when the testing touches UI/routing,
146
144
  `docs/style-guide.md` / `docs/web-routes.md`. This is the context you will
@@ -226,13 +224,13 @@ every decision to the shared core helpers; never re-derive them in prose.
226
224
 
227
225
  3. **Hydrate the QA context** to locate code precisely, via
228
226
  [`qa-context-hydrator.js`](../scripts/lib/qa/qa-context-hydrator.js) — it
229
- resolves the Epic (whose body carries the planning sections), the
227
+ resolves the source ticket body, the
230
228
  feature-file set, the surface
231
229
  map, and recent git log:
232
230
 
233
231
  ```js
234
232
  import { hydrateQaContext } from '../scripts/lib/qa/qa-context-hydrator.js';
235
- const context = await hydrateQaContext({ epicNumber, githubPort, gitPort, surfaceMap });
233
+ const context = await hydrateQaContext({ ticketNumber, githubPort, gitPort, surfaceMap });
236
234
  ```
237
235
 
238
236
  4. **Compute the coverage verdict** for the surface the observation points at,
@@ -321,32 +319,28 @@ its transition is **explicitly operator-gated**.
321
319
  import { promoteFindings } from '../scripts/lib/findings/promote-finding.js';
322
320
  const { promotions } = await promoteFindings(ledgerItems, {
323
321
  searchIssues, // GitHub provider, open + closed
324
- createStory, // tight cluster (≤2 surfaces): render seed → /plan --from-notes
325
- createEpic, // broad cluster (>2 surfaces): render seed /plan --idea
322
+ createStory, // tight cluster (≤2 surfaces): seed → /plan --seed-file
323
+ createPlanSeed, // broad cluster (>2 surfaces): same /plan --seed-file path (may N>1)
326
324
  });
327
325
  ```
328
326
 
329
327
  - **Sizing is delegated, not decided in prose.** `promoteFindings` runs
330
328
  `clusterLedgerItems` + `targetForCluster`: a cluster spanning **≤2**
331
329
  distinct coverage surfaces routes to `createStory`; **>2** routes to
332
- `createEpic`. Do not re-cluster, re-size, or re-dedup in the workflow —
330
+ `createPlanSeed`. Neither port opens an Epic ticket both chain
331
+ `/plan --seed-file`. Do not re-cluster, re-size, or re-dedup in the
332
+ workflow —
333
333
  [`route-finding.js`](../scripts/lib/findings/route-finding.js) /
334
334
  [`promote-finding.js`](../scripts/lib/findings/promote-finding.js) are the
335
335
  single implementation.
336
- - **`createStory` (`/plan --from-notes`)** — render a **redacted**
337
- `--from-notes` seed from the cluster (reuse the `/audit-to-stories`
338
- Phase 5b notes shape; redaction already ran in Phase 2), **stamp the
336
+ - **`createStory` / `createPlanSeed` (`/plan --seed-file`)** — render a
337
+ **redacted** plan seed from the cluster (reuse the `/audit-to-stories`
338
+ Phase 5a seed shape; redaction already ran in Phase 2), **stamp the
339
339
  cluster's `fingerprintFooter(sha)` verbatim into the seed body**, then
340
- chain `/plan --from-notes <seed>`. The footer must survive into the issue
341
- body the Story create path writes it round-trips through
342
- `story-plan.js --body <file> --dry-run` unchanged (asserted by the
343
- deterministic round-trip test under `tests/`) so a later `routeFinding`
344
- dedups the same finding instead of re-filing it.
345
- - **`createEpic` (`/plan --idea`)** — carry the cluster's
346
- `fingerprintFooter(sha)` into the `/plan --idea` seed, then chain
347
- `/plan --idea <seed>`. **Known limitation (not solved here):**
348
- per-child-Story fingerprint propagation through full Epic decomposition is
349
- *not* guaranteed — the fingerprint is carried in the Epic seed only.
340
+ chain `/plan --seed-file <seed>`. Prefer one Story; split only under
341
+ the default-single policy. The footer must survive into the issue body
342
+ so a later `routeFinding` dedups the same finding instead of re-filing
343
+ it.
350
344
  - **A `file` disposition never opens a raw GitHub Issue.** Every `file`
351
345
  finding flows through `promoteFindings` → `/plan`; only `defer` (carry
352
346
  forward as backlog) and `dismiss` (non-actionable) skip the handoff.
@@ -359,8 +353,8 @@ its transition is **explicitly operator-gated**.
359
353
 
360
354
  After planning, summarize: the findings recorded, the route/promotion decisions
361
355
  (`new`/`update-existing`/`duplicate`/`regression-of-closed`), whether each
362
- cluster became a Story (`/plan --from-notes`) or Epic (`/plan --idea`), and any
363
- `defer` backlog a resumed session will pick up.
356
+ cluster became a Story via `/plan --seed-file`, and any `defer` backlog a
357
+ resumed session will pick up.
364
358
 
365
359
  ---
366
360
 
@@ -404,7 +398,7 @@ cluster became a Story (`/plan --from-notes`) or Epic (`/plan --idea`), and any
404
398
  are deterministic — never re-derive them in prose.
405
399
  - **Promote through `/plan`, never a raw Issue.** A `file`-dispositioned
406
400
  finding is promoted via `promoteFindings`, which chains into
407
- [`/plan`](plan.md) (`--from-notes` for a tight cluster, `--idea` for a broad
401
+ [`/plan`](plan.md) (`--seed-file` for a tight cluster, `--seed` for a broad
408
402
  one) — mirroring [`/audit-to-stories`](audit-to-stories.md). `/qa-assist`
409
403
  never opens a bare GitHub Issue for a `file` finding. The cluster's
410
404
  `fingerprintFooter(sha)` is stamped verbatim into the seed so a future
@@ -413,7 +407,7 @@ cluster became a Story (`/plan --from-notes`) or Epic (`/plan --idea`), and any
413
407
  ## See also
414
408
 
415
409
  - [`/plan`](plan.md) — the planning pipeline `/qa-assist` chains into in
416
- Phase 4 (`--from-notes` for a Story, `--idea` for an Epic). The plan→deliver
410
+ Phase 4 (`--seed-file` / `--seed`). The plan→deliver
417
411
  hard stop is preserved across the handoff.
418
412
  - [`/qa-explore`](qa-explore.md) — the agent-led sibling that drives a named
419
413
  surface and triages through the same `/plan` handoff.