mandrel 1.93.0 → 2.0.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 (463) hide show
  1. package/.agents/README.md +59 -73
  2. package/.agents/agents/acceptance-critic.md +129 -0
  3. package/.agents/agents/story-worker.md +161 -0
  4. package/.agents/docs/SDLC.md +489 -1285
  5. package/.agents/docs/agentrc-reference.json +177 -67
  6. package/.agents/docs/configuration.md +108 -136
  7. package/.agents/docs/execution-reference.md +44 -22
  8. package/.agents/docs/quality-gates.md +13 -19
  9. package/.agents/docs/workflows.md +3 -3
  10. package/.agents/instructions.md +107 -108
  11. package/.agents/rules/ci-remediation.md +8 -12
  12. package/.agents/rules/git-conventions-reference.md +224 -0
  13. package/.agents/rules/git-conventions.md +42 -223
  14. package/.agents/rules/security-baseline.md +5 -0
  15. package/.agents/rules/testing-standards.md +106 -13
  16. package/.agents/schemas/acceptance-eval-verdict.schema.json +1 -1
  17. package/.agents/schemas/agentrc.schema.json +71 -201
  18. package/.agents/schemas/lifecycle/ledger-record.schema.json +1 -1
  19. package/.agents/schemas/lifecycle/retro.end.schema.json +1 -1
  20. package/.agents/schemas/risk-verdict.schema.json +0 -13
  21. package/.agents/scripts/acceptance-eval.js +62 -18
  22. package/.agents/scripts/agents-bootstrap-github.js +1 -1
  23. package/.agents/scripts/analyze-execution.js +1 -1
  24. package/.agents/scripts/audit-to-stories.js +7 -7
  25. package/.agents/scripts/boot-sweep.js +1 -1
  26. package/.agents/scripts/check-context-budget.js +62 -5
  27. package/.agents/scripts/check-lifecycle-lint.js +6 -9
  28. package/.agents/scripts/check-prepush-recovery.js +1 -1
  29. package/.agents/scripts/cleanup-repo-test-temp.js +6 -1
  30. package/.agents/scripts/diagnose-friction.js +0 -6
  31. package/.agents/scripts/lib/Logger.js +6 -10
  32. package/.agents/scripts/lib/audit-suite/runner.js +2 -2
  33. package/.agents/scripts/lib/audit-suite/selector.js +5 -5
  34. package/.agents/scripts/lib/audit-to-stories/{seed-epic-from-findings.js → seed-from-findings.js} +9 -9
  35. package/.agents/scripts/lib/baselines/kernel.js +206 -18
  36. package/.agents/scripts/lib/baselines/kinds/maintainability.js +0 -4
  37. package/.agents/scripts/lib/baselines/reader.js +1 -6
  38. package/.agents/scripts/lib/bdd-runner-detect.js +5 -9
  39. package/.agents/scripts/lib/bootstrap/issue-forms-template.js +32 -33
  40. package/.agents/scripts/lib/bootstrap/project-bootstrap.js +56 -18
  41. package/.agents/scripts/lib/checks/core-bare-clean.js +2 -2
  42. package/.agents/scripts/lib/checks/index.js +2 -1
  43. package/.agents/scripts/lib/checks/story-init-not-backgrounded.js +23 -21
  44. package/.agents/scripts/lib/cli/standard-args.js +13 -22
  45. package/.agents/scripts/lib/cli-args.js +16 -7
  46. package/.agents/scripts/lib/close-validation/gates.js +160 -22
  47. package/.agents/scripts/lib/config/acceptance-eval.js +52 -5
  48. package/.agents/scripts/lib/config/ci.js +6 -31
  49. package/.agents/scripts/lib/config/delivery-routing.js +103 -0
  50. package/.agents/scripts/lib/config/explain.js +57 -36
  51. package/.agents/scripts/lib/config/limits.js +17 -58
  52. package/.agents/scripts/lib/config/paths.js +0 -2
  53. package/.agents/scripts/lib/config/quality.js +1 -1
  54. package/.agents/scripts/lib/config/runners.js +17 -50
  55. package/.agents/scripts/lib/config/temp-paths.js +19 -14
  56. package/.agents/scripts/lib/config/worktree-isolation.js +0 -5
  57. package/.agents/scripts/lib/config-resolver.js +3 -8
  58. package/.agents/scripts/lib/config-settings-schema-delivery.js +46 -136
  59. package/.agents/scripts/lib/config-settings-schema-quality.js +17 -14
  60. package/.agents/scripts/lib/config-settings-schema.js +52 -38
  61. package/.agents/scripts/lib/dependency-parser.js +3 -2
  62. package/.agents/scripts/lib/doc-tiers.js +39 -4
  63. package/.agents/scripts/lib/duplicate-search.js +211 -41
  64. package/.agents/scripts/lib/feedback-loop/retro-proposals-graduator.js +1 -1
  65. package/.agents/scripts/lib/findings/promote-finding.js +5 -5
  66. package/.agents/scripts/lib/framework-version.js +2 -3
  67. package/.agents/scripts/lib/git-branch-cleanup.js +1 -10
  68. package/.agents/scripts/lib/git-branch-lifecycle.js +17 -22
  69. package/.agents/scripts/lib/git-utils.js +32 -6
  70. package/.agents/scripts/lib/github/framework-repo.js +6 -0
  71. package/.agents/scripts/lib/label-constants.js +10 -23
  72. package/.agents/scripts/lib/label-taxonomy.js +9 -43
  73. package/.agents/scripts/lib/observability/active-story-env.js +112 -3
  74. package/.agents/scripts/lib/observability/hook-heartbeat.js +187 -0
  75. package/.agents/scripts/lib/observability/source-classifier.js +3 -3
  76. package/.agents/scripts/lib/observability/tool-trace-hook.js +15 -4
  77. package/.agents/scripts/lib/onboard/init-tail.js +1 -3
  78. package/.agents/scripts/lib/orchestration/acceptance-clusters.js +111 -0
  79. package/.agents/scripts/lib/orchestration/acceptance-eval-decision.js +32 -4
  80. package/.agents/scripts/lib/orchestration/audit-lens-routing.js +128 -0
  81. package/.agents/scripts/lib/orchestration/bookkeeping-outbox.js +273 -0
  82. package/.agents/scripts/lib/orchestration/ceremony-routing.js +204 -0
  83. package/.agents/scripts/lib/orchestration/code-review.js +20 -268
  84. package/.agents/scripts/lib/orchestration/column-sync.js +1 -1
  85. package/.agents/scripts/lib/orchestration/consolidation-precondition.js +1 -1
  86. package/.agents/scripts/lib/orchestration/context-envelope.js +2 -5
  87. package/.agents/scripts/lib/orchestration/docs-digest.js +8 -8
  88. package/.agents/scripts/lib/orchestration/file-assumptions.js +7 -13
  89. package/.agents/scripts/lib/orchestration/git-cleanup/phases/cli.js +1 -1
  90. package/.agents/scripts/lib/orchestration/lifecycle/emit-loop-tick.js +8 -8
  91. package/.agents/scripts/lib/orchestration/lifecycle/emit-story-heartbeat.js +2 -2
  92. package/.agents/scripts/lib/orchestration/lifecycle/ledger-writer.js +6 -3
  93. package/.agents/scripts/lib/orchestration/lifecycle/listeners/README.md +17 -43
  94. package/.agents/scripts/lib/orchestration/lint-baseline-service.js +4 -4
  95. package/.agents/scripts/lib/orchestration/merge-block-class.js +1 -1
  96. package/.agents/scripts/lib/orchestration/phase-runner.js +3 -2
  97. package/.agents/scripts/lib/orchestration/plan-context.js +248 -266
  98. package/.agents/scripts/lib/orchestration/plan-critic-conditions.js +3 -2
  99. package/.agents/scripts/lib/orchestration/plan-critics-evaluate.js +1 -1
  100. package/.agents/scripts/lib/orchestration/plan-navigation.js +92 -0
  101. package/.agents/scripts/lib/orchestration/plan-persist/fan-out-gate.js +61 -0
  102. package/.agents/scripts/lib/orchestration/plan-persist/persist-helpers.js +97 -0
  103. package/.agents/scripts/lib/orchestration/plan-persist/run-plan-persist.js +223 -854
  104. package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +361 -0
  105. package/.agents/scripts/lib/orchestration/plan-persist/summary.js +35 -108
  106. package/.agents/scripts/lib/orchestration/plan-reachability.js +9 -14
  107. package/.agents/scripts/lib/orchestration/plan-runner/worktree-sweep.js +1 -1
  108. package/.agents/scripts/lib/orchestration/{epic-plan-spec/phases → planning}/authoring-context.js +14 -14
  109. package/.agents/scripts/lib/orchestration/planning/decomposer-context.js +27 -0
  110. package/.agents/scripts/lib/orchestration/{epic-plan-spec/phases → planning}/risk-verdict.js +3 -4
  111. package/.agents/scripts/lib/orchestration/post-merge/phases/branch-cleanup.js +2 -2
  112. package/.agents/scripts/lib/orchestration/post-merge/phases/dashboard-refresh.js +8 -20
  113. package/.agents/scripts/lib/orchestration/post-merge/phases/worktree-reap.js +3 -2
  114. package/.agents/scripts/lib/orchestration/pr-base-guard.js +18 -28
  115. package/.agents/scripts/lib/orchestration/preflight-cache.js +5 -5
  116. package/.agents/scripts/lib/orchestration/remote-verifier.js +1 -1
  117. package/.agents/scripts/lib/orchestration/resolve-plan-run.js +155 -0
  118. package/.agents/scripts/lib/orchestration/resolves-token.js +1 -1
  119. package/.agents/scripts/lib/orchestration/retro-perf-heuristics.js +8 -8
  120. package/.agents/scripts/lib/orchestration/retro-proposals.js +140 -79
  121. package/.agents/scripts/lib/orchestration/review-depth.js +26 -12
  122. package/.agents/scripts/lib/orchestration/review-providers/codex.js +2 -2
  123. package/.agents/scripts/lib/orchestration/review-providers/review-provider-factory.js +21 -56
  124. package/.agents/scripts/lib/orchestration/run-epilogue.js +426 -0
  125. package/.agents/scripts/lib/orchestration/single-story-close/phases/auto-merge.js +1 -1
  126. package/.agents/scripts/lib/orchestration/single-story-close/phases/close-validation.js +1 -0
  127. package/.agents/scripts/lib/orchestration/single-story-close/phases/code-review.js +95 -41
  128. package/.agents/scripts/lib/orchestration/single-story-close/phases/options.js +16 -13
  129. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-block.js +40 -0
  130. package/.agents/scripts/lib/orchestration/single-story-close/runner.js +11 -3
  131. package/.agents/scripts/lib/orchestration/spec-freshness.js +14 -205
  132. package/.agents/scripts/lib/orchestration/spec-section-validator.js +4 -5
  133. package/.agents/scripts/lib/orchestration/spec-spill.js +60 -0
  134. package/.agents/scripts/lib/orchestration/split-policy-validator.js +188 -0
  135. package/.agents/scripts/lib/orchestration/story-close/emit-blocked.js +49 -0
  136. package/.agents/scripts/lib/orchestration/story-close/phases/code-review.js +15 -12
  137. package/.agents/scripts/lib/orchestration/story-follow-ups.js +237 -0
  138. package/.agents/scripts/lib/orchestration/story-init-remote.js +47 -0
  139. package/.agents/scripts/lib/orchestration/story-plan-state.js +48 -0
  140. package/.agents/scripts/lib/orchestration/{epic-runner → story-progress}/story-run-progress-writer.js +3 -3
  141. package/.agents/scripts/lib/orchestration/structured-comment-parser.js +1 -1
  142. package/.agents/scripts/lib/orchestration/task-body-validator.js +8 -18
  143. package/.agents/scripts/lib/orchestration/ticket-validator-conflicts.js +11 -61
  144. package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +189 -373
  145. package/.agents/scripts/lib/orchestration/ticket-validator.js +3 -8
  146. package/.agents/scripts/lib/orchestration/ticketing/bulk.js +0 -25
  147. package/.agents/scripts/lib/orchestration/ticketing/reads.js +29 -26
  148. package/.agents/scripts/lib/orchestration/ticketing/transition.js +5 -5
  149. package/.agents/scripts/lib/planning-corpus.js +16 -11
  150. package/.agents/scripts/lib/preflight-runner.js +2 -2
  151. package/.agents/scripts/lib/provider-factory.js +1 -1
  152. package/.agents/scripts/lib/qa/coverage-verdict.js +5 -5
  153. package/.agents/scripts/lib/single-story/confirm-merge-follow-ups.js +36 -0
  154. package/.agents/scripts/lib/single-story-sweep/protection-ctx.js +1 -1
  155. package/.agents/scripts/lib/story-adjacency.js +11 -14
  156. package/.agents/scripts/lib/story-body/story-body.js +124 -70
  157. package/.agents/scripts/lib/story-plan.js +2 -4
  158. package/.agents/scripts/lib/templates/decomposer-prompts.js +46 -45
  159. package/.agents/scripts/lib/templates/spec-author-prompts.js +47 -45
  160. package/.agents/scripts/lib/{epic-body-sections.js → ticket-body-sections.js} +26 -26
  161. package/.agents/scripts/lib/validation-evidence.js +1 -1
  162. package/.agents/scripts/lib/wave-runner/ready-set.js +6 -6
  163. package/.agents/scripts/lib/workspace-provisioner.js +1 -1
  164. package/.agents/scripts/lib/worktree/lifecycle/reap.js +5 -7
  165. package/.agents/scripts/lint-issue-body.js +71 -40
  166. package/.agents/scripts/mandrel-update-preflight.js +1 -1
  167. package/.agents/scripts/notify.js +4 -3
  168. package/.agents/scripts/plan-context.js +64 -74
  169. package/.agents/scripts/plan-persist.js +121 -280
  170. package/.agents/scripts/plan-run-epilogue.js +97 -0
  171. package/.agents/scripts/post-structured-comment.js +38 -0
  172. package/.agents/scripts/providers/github/issues.js +17 -33
  173. package/.agents/scripts/providers/github/mappers.js +0 -12
  174. package/.agents/scripts/providers/github/tickets.js +2 -5
  175. package/.agents/scripts/resolve-plan-run.js +117 -0
  176. package/.agents/scripts/signals-view.js +24 -19
  177. package/.agents/scripts/single-story-close.js +11 -14
  178. package/.agents/scripts/single-story-confirm-merge.js +39 -23
  179. package/.agents/scripts/single-story-init.js +29 -20
  180. package/.agents/scripts/stories-wave-tick.js +6 -6
  181. package/.agents/scripts/story-plan.js +26 -47
  182. package/.agents/scripts/sync-claude-agents.js +165 -0
  183. package/.agents/scripts/update-ticket-state.js +37 -15
  184. package/.agents/skills/core/analyze-execution/SKILL.md +21 -18
  185. package/.agents/skills/core/api-and-interface-design/SKILL.md +5 -3
  186. package/.agents/skills/core/code-review-and-quality/SKILL.md +63 -7
  187. package/.agents/skills/core/debugging-and-error-recovery/SKILL.md +1 -1
  188. package/.agents/skills/core/gates-and-baselines/SKILL.md +149 -0
  189. package/.agents/skills/core/idea-refinement/SKILL.md +8 -14
  190. package/.agents/skills/core/qa-coverage-mapping/SKILL.md +7 -7
  191. package/.agents/skills/core/scope-triage/SKILL.md +28 -172
  192. package/.agents/skills/skills.index.json +8 -418
  193. package/.agents/starter-agentrc.json +0 -5
  194. package/.agents/templates/agent-protocol.md +9 -10
  195. package/.agents/workflows/audit-architecture.md +3 -3
  196. package/.agents/workflows/audit-clean-code.md +3 -3
  197. package/.agents/workflows/audit-dependencies.md +3 -3
  198. package/.agents/workflows/audit-devops.md +3 -3
  199. package/.agents/workflows/audit-documentation.md +5 -5
  200. package/.agents/workflows/audit-lighthouse.md +3 -3
  201. package/.agents/workflows/audit-navigability.md +3 -2
  202. package/.agents/workflows/audit-performance.md +3 -3
  203. package/.agents/workflows/audit-privacy.md +3 -3
  204. package/.agents/workflows/audit-quality.md +3 -3
  205. package/.agents/workflows/audit-security.md +3 -3
  206. package/.agents/workflows/audit-seo.md +3 -3
  207. package/.agents/workflows/audit-sre.md +3 -3
  208. package/.agents/workflows/audit-to-stories.md +20 -20
  209. package/.agents/workflows/audit-ux-ui.md +3 -3
  210. package/.agents/workflows/deliver.md +122 -131
  211. package/.agents/workflows/git-cleanup.md +3 -4
  212. package/.agents/workflows/helpers/_merge-conflict-template.md +1 -1
  213. package/.agents/workflows/helpers/acceptance-self-eval.md +52 -40
  214. package/.agents/workflows/helpers/code-review.md +70 -193
  215. package/.agents/workflows/helpers/{single-story-deliver-reference.md → deliver-story-reference.md} +12 -14
  216. package/.agents/workflows/helpers/{single-story-deliver.md → deliver-story.md} +113 -139
  217. package/.agents/workflows/helpers/diagnose.md +10 -10
  218. package/.agents/workflows/helpers/mandrel-sync-config.md +1 -1
  219. package/.agents/workflows/helpers/parallel-tooling.md +1 -1
  220. package/.agents/workflows/helpers/signals.md +16 -16
  221. package/.agents/workflows/helpers/worktree-lifecycle.md +48 -64
  222. package/.agents/workflows/mandrel-update.md +3 -2
  223. package/.agents/workflows/plan.md +112 -145
  224. package/.agents/workflows/qa-assist.md +24 -30
  225. package/.agents/workflows/qa-explore.md +29 -38
  226. package/.agents/workflows/qa-run.md +2 -2
  227. package/README.md +9 -8
  228. package/docs/CHANGELOG.md +46 -0
  229. package/lib/cli/registry.js +95 -0
  230. package/lib/migrations/index.js +6 -5
  231. package/package.json +5 -3
  232. package/.agents/personas/architect.md +0 -113
  233. package/.agents/personas/devops-engineer.md +0 -38
  234. package/.agents/personas/engineer-mobile.md +0 -120
  235. package/.agents/personas/engineer-web.md +0 -111
  236. package/.agents/personas/engineer.md +0 -119
  237. package/.agents/personas/product.md +0 -94
  238. package/.agents/personas/project-manager.md +0 -114
  239. package/.agents/personas/qa-engineer.md +0 -95
  240. package/.agents/personas/refactorer.md +0 -113
  241. package/.agents/personas/security-engineer.md +0 -112
  242. package/.agents/personas/sre.md +0 -86
  243. package/.agents/personas/technical-writer.md +0 -101
  244. package/.agents/personas/ux-designer.md +0 -95
  245. package/.agents/schemas/dispatch-manifest.json +0 -232
  246. package/.agents/schemas/epic-spec.schema.json +0 -153
  247. package/.agents/scripts/acceptance-spec-reconciler.js +0 -642
  248. package/.agents/scripts/dispatcher.js +0 -295
  249. package/.agents/scripts/epic-audit-prepare.js +0 -497
  250. package/.agents/scripts/epic-audit-recheck.js +0 -274
  251. package/.agents/scripts/epic-deliver-note-intervention.js +0 -192
  252. package/.agents/scripts/epic-deliver-preflight.js +0 -462
  253. package/.agents/scripts/epic-deliver-prepare.js +0 -590
  254. package/.agents/scripts/epic-execute-record-wave.js +0 -449
  255. package/.agents/scripts/epic-plan-clarity.js +0 -211
  256. package/.agents/scripts/epic-plan-decompose.js +0 -54
  257. package/.agents/scripts/epic-plan-healthcheck.js +0 -581
  258. package/.agents/scripts/epic-plan-spec.js +0 -64
  259. package/.agents/scripts/epic-reconcile.js +0 -625
  260. package/.agents/scripts/lib/baseline-snapshot.js +0 -979
  261. package/.agents/scripts/lib/checks/epic-merge-lock-stale.js +0 -54
  262. package/.agents/scripts/lib/checks/stale-origin-epic.js +0 -49
  263. package/.agents/scripts/lib/config/lifecycle.js +0 -40
  264. package/.agents/scripts/lib/config/preflight.js +0 -58
  265. package/.agents/scripts/lib/config/retro.js +0 -77
  266. package/.agents/scripts/lib/epic-merge-lock.js +0 -322
  267. package/.agents/scripts/lib/epic-plan-clarity.js +0 -181
  268. package/.agents/scripts/lib/epic-plan-ideation.js +0 -261
  269. package/.agents/scripts/lib/orchestration/context-hydration-engine.js +0 -660
  270. package/.agents/scripts/lib/orchestration/dispatch-engine.js +0 -134
  271. package/.agents/scripts/lib/orchestration/dispatch-pipeline.js +0 -183
  272. package/.agents/scripts/lib/orchestration/epic-cleanup.js +0 -801
  273. package/.agents/scripts/lib/orchestration/epic-deliver-lease-guard.js +0 -310
  274. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/context.js +0 -163
  275. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/creation.js +0 -140
  276. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/dag.js +0 -64
  277. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/diagnostics.js +0 -72
  278. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/persist-helpers.js +0 -156
  279. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/persist.js +0 -345
  280. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/planning-artifacts.js +0 -41
  281. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/reconcile-spawn.js +0 -86
  282. package/.agents/scripts/lib/orchestration/epic-plan-lease-guard.js +0 -391
  283. package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/drain.js +0 -94
  284. package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/plan-epic.js +0 -236
  285. package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/run-spec-phase.js +0 -307
  286. package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/spec-freshness.js +0 -117
  287. package/.agents/scripts/lib/orchestration/epic-plan-state-store.js +0 -117
  288. package/.agents/scripts/lib/orchestration/epic-run-state-store.js +0 -388
  289. package/.agents/scripts/lib/orchestration/epic-runner/concurrency-gate.js +0 -186
  290. package/.agents/scripts/lib/orchestration/epic-runner/deliver-phases.js +0 -50
  291. package/.agents/scripts/lib/orchestration/epic-runner/phases/build-wave-dag.js +0 -129
  292. package/.agents/scripts/lib/orchestration/epic-runner/phases/snapshot.js +0 -103
  293. package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter/composition.js +0 -267
  294. package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter/signals.js +0 -210
  295. package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter/transport.js +0 -238
  296. package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/_bullet-format.js +0 -32
  297. package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/component-drift.js +0 -203
  298. package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/crap-drift.js +0 -227
  299. package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/maintainability-drift.js +0 -117
  300. package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/stalled-worktree.js +0 -37
  301. package/.agents/scripts/lib/orchestration/epic-runner/story-launcher.js +0 -127
  302. package/.agents/scripts/lib/orchestration/epic-runner/sub-agent-return.js +0 -276
  303. package/.agents/scripts/lib/orchestration/epic-runner/wave-scheduler.js +0 -66
  304. package/.agents/scripts/lib/orchestration/epic-spec-reconciler-apply.js +0 -789
  305. package/.agents/scripts/lib/orchestration/epic-spec-reconciler-diff.js +0 -676
  306. package/.agents/scripts/lib/orchestration/epic-spec-reconciler-discriminator.js +0 -389
  307. package/.agents/scripts/lib/orchestration/epic-spec-reconciler-format.js +0 -230
  308. package/.agents/scripts/lib/orchestration/epic-spec-reconciler-ops.js +0 -361
  309. package/.agents/scripts/lib/orchestration/finalize/open-or-locate-pr.js +0 -306
  310. package/.agents/scripts/lib/orchestration/finalize/post-handoff-comment.js +0 -489
  311. package/.agents/scripts/lib/orchestration/finalize/sanitize-skip-ci.js +0 -88
  312. package/.agents/scripts/lib/orchestration/lifecycle/emit-story-dispatch-end.js +0 -147
  313. package/.agents/scripts/lib/orchestration/lifecycle/listeners/acceptance-reconciler.js +0 -384
  314. package/.agents/scripts/lib/orchestration/lifecycle/listeners/automerge-armer.js +0 -501
  315. package/.agents/scripts/lib/orchestration/lifecycle/listeners/automerge-predicate.js +0 -984
  316. package/.agents/scripts/lib/orchestration/lifecycle/listeners/branch-cleaner.js +0 -264
  317. package/.agents/scripts/lib/orchestration/lifecycle/listeners/checkpoint-pointer-writer.js +0 -278
  318. package/.agents/scripts/lib/orchestration/lifecycle/listeners/cleaner.js +0 -355
  319. package/.agents/scripts/lib/orchestration/lifecycle/listeners/finalizer.js +0 -673
  320. package/.agents/scripts/lib/orchestration/lifecycle/listeners/index.js +0 -378
  321. package/.agents/scripts/lib/orchestration/lifecycle/listeners/intervention-recorder.js +0 -140
  322. package/.agents/scripts/lib/orchestration/lifecycle/listeners/label-transitioner.js +0 -144
  323. package/.agents/scripts/lib/orchestration/lifecycle/listeners/notify-dispatcher.js +0 -174
  324. package/.agents/scripts/lib/orchestration/manifest-builder.js +0 -222
  325. package/.agents/scripts/lib/orchestration/plan-persist/amend.js +0 -359
  326. package/.agents/scripts/lib/orchestration/plan-persist/delivery-mode.js +0 -127
  327. package/.agents/scripts/lib/orchestration/post-merge-pipeline.js +0 -205
  328. package/.agents/scripts/lib/orchestration/recurring-failure-detector.js +0 -152
  329. package/.agents/scripts/lib/orchestration/retro/phases/checks.js +0 -94
  330. package/.agents/scripts/lib/orchestration/retro/phases/compose-body.js +0 -571
  331. package/.agents/scripts/lib/orchestration/retro/phases/gather-signals.js +0 -450
  332. package/.agents/scripts/lib/orchestration/retro/phases/post-and-mirror.js +0 -191
  333. package/.agents/scripts/lib/orchestration/retro-heuristics.js +0 -57
  334. package/.agents/scripts/lib/orchestration/retro-runner.js +0 -197
  335. package/.agents/scripts/lib/orchestration/skill-capsule-loader.js +0 -109
  336. package/.agents/scripts/lib/orchestration/spec-renderer.js +0 -447
  337. package/.agents/scripts/lib/orchestration/story-close/auto-refresh-runner.js +0 -747
  338. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/gate-failure.js +0 -211
  339. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/pre-merge-attribution.js +0 -158
  340. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/refresh-commit.js +0 -446
  341. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/regression-projection.js +0 -297
  342. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/scope-discovery.js +0 -48
  343. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution-wiring.js +0 -67
  344. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution.js +0 -161
  345. package/.agents/scripts/lib/orchestration/story-close/baseline-friction-body.js +0 -117
  346. package/.agents/scripts/lib/orchestration/story-close/cd-out-guard.js +0 -86
  347. package/.agents/scripts/lib/orchestration/story-close/cleanup-reconciler.js +0 -147
  348. package/.agents/scripts/lib/orchestration/story-close/close-inputs.js +0 -142
  349. package/.agents/scripts/lib/orchestration/story-close/comment-bodies.js +0 -62
  350. package/.agents/scripts/lib/orchestration/story-close/merge-runner.js +0 -658
  351. package/.agents/scripts/lib/orchestration/story-close/merge-subject.js +0 -198
  352. package/.agents/scripts/lib/orchestration/story-close/phases/branch-restore.js +0 -105
  353. package/.agents/scripts/lib/orchestration/story-close/phases/close.js +0 -222
  354. package/.agents/scripts/lib/orchestration/story-close/phases/gates.js +0 -292
  355. package/.agents/scripts/lib/orchestration/story-close/phases/locked-pipeline.js +0 -270
  356. package/.agents/scripts/lib/orchestration/story-close/phases/preflight.js +0 -110
  357. package/.agents/scripts/lib/orchestration/story-close/phases/refresh.js +0 -86
  358. package/.agents/scripts/lib/orchestration/story-close/phases/timeout-blocked-emitter.js +0 -112
  359. package/.agents/scripts/lib/orchestration/story-close/phases/timeout-blocked.js +0 -157
  360. package/.agents/scripts/lib/orchestration/story-close/post-merge-close.js +0 -421
  361. package/.agents/scripts/lib/orchestration/story-close/pre-merge-validation.js +0 -301
  362. package/.agents/scripts/lib/orchestration/story-close/shared-checkout-guard.js +0 -163
  363. package/.agents/scripts/lib/orchestration/story-close-recovery.js +0 -690
  364. package/.agents/scripts/lib/orchestration/wave-marker.js +0 -28
  365. package/.agents/scripts/lib/orchestration/wave-record-io.js +0 -218
  366. package/.agents/scripts/lib/orchestration/wave-record-notifications.js +0 -145
  367. package/.agents/scripts/lib/orchestration/wave-record-projection.js +0 -212
  368. package/.agents/scripts/lib/presentation/dispatch-manifest-render.js +0 -111
  369. package/.agents/scripts/lib/presentation/manifest-builder.js +0 -239
  370. package/.agents/scripts/lib/presentation/manifest-formatter.js +0 -242
  371. package/.agents/scripts/lib/presentation/manifest-helpers.js +0 -213
  372. package/.agents/scripts/lib/presentation/manifest-persistence.js +0 -261
  373. package/.agents/scripts/lib/presentation/manifest-procedures.js +0 -55
  374. package/.agents/scripts/lib/presentation/manifest-render-waves.js +0 -306
  375. package/.agents/scripts/lib/presentation/manifest-renderer.js +0 -188
  376. package/.agents/scripts/lib/presentation/manifest-story-views.js +0 -110
  377. package/.agents/scripts/lib/push-epic-retry.js +0 -209
  378. package/.agents/scripts/lib/spec/index.js +0 -36
  379. package/.agents/scripts/lib/spec/loader.js +0 -425
  380. package/.agents/scripts/lib/spec/state.js +0 -208
  381. package/.agents/scripts/lib/story-init/blocker-validator.js +0 -68
  382. package/.agents/scripts/lib/story-init/branch-initializer.js +0 -408
  383. package/.agents/scripts/lib/story-init/context-resolver.js +0 -92
  384. package/.agents/scripts/lib/story-init/donor-precheck.js +0 -207
  385. package/.agents/scripts/lib/story-init/state-transitioner.js +0 -80
  386. package/.agents/scripts/lib/story-init/task-graph-builder.js +0 -124
  387. package/.agents/scripts/lib/story-init/transition-summary.js +0 -34
  388. package/.agents/scripts/lib/test-reserved-epic-temp-ids.js +0 -35
  389. package/.agents/scripts/lib/wave-runner/tick.js +0 -754
  390. package/.agents/scripts/lib/wave-runner/wave-runner-error.js +0 -20
  391. package/.agents/scripts/lifecycle-emit-story-dispatch.js +0 -194
  392. package/.agents/scripts/lifecycle-emit.js +0 -510
  393. package/.agents/scripts/plan-critics.js +0 -199
  394. package/.agents/scripts/retro-run.js +0 -218
  395. package/.agents/scripts/standalone-feedback-rollup.js +0 -188
  396. package/.agents/scripts/story-close.js +0 -294
  397. package/.agents/scripts/story-init.js +0 -599
  398. package/.agents/scripts/story-phase.js +0 -369
  399. package/.agents/scripts/wave-tick.js +0 -335
  400. package/.agents/skills/core/baseline-refresh/SKILL.md +0 -181
  401. package/.agents/skills/core/ci-cd-and-automation/SKILL.md +0 -274
  402. package/.agents/skills/core/ci-cd-and-automation/examples.md +0 -211
  403. package/.agents/skills/core/code-simplification/SKILL.md +0 -389
  404. package/.agents/skills/core/context-engineering/SKILL.md +0 -309
  405. package/.agents/skills/core/context-engineering/examples.md +0 -58
  406. package/.agents/skills/core/deprecation-and-migration/SKILL.md +0 -250
  407. package/.agents/skills/core/epic-plan-consolidate/SKILL.md +0 -172
  408. package/.agents/skills/core/epic-plan-consolidate/examples.md +0 -51
  409. package/.agents/skills/core/epic-plan-decompose-author/SKILL.md +0 -441
  410. package/.agents/skills/core/epic-plan-decompose-author/examples.md +0 -47
  411. package/.agents/skills/core/epic-plan-premortem/SKILL.md +0 -146
  412. package/.agents/skills/core/epic-plan-premortem/examples.md +0 -53
  413. package/.agents/skills/core/epic-plan-spec-author/SKILL.md +0 -413
  414. package/.agents/skills/core/epic-plan-spec-author/examples.md +0 -91
  415. package/.agents/skills/core/frontend-ui-engineering/SKILL.md +0 -357
  416. package/.agents/skills/core/hydrate-context/SKILL.md +0 -123
  417. package/.agents/skills/core/idea-refinement/examples.md +0 -437
  418. package/.agents/skills/core/idea-refinement/frameworks.md +0 -135
  419. package/.agents/skills/core/incremental-implementation/SKILL.md +0 -271
  420. package/.agents/skills/core/introducing-a-baseline-gate/SKILL.md +0 -213
  421. package/.agents/skills/core/knowledge-transfer/SKILL.md +0 -180
  422. package/.agents/skills/core/mutation-survivor-remediation/SKILL.md +0 -117
  423. package/.agents/skills/core/performance-optimization/SKILL.md +0 -314
  424. package/.agents/skills/core/planning-and-task-breakdown/SKILL.md +0 -277
  425. package/.agents/skills/core/property-based-testing/SKILL.md +0 -148
  426. package/.agents/skills/core/refactoring-discipline/SKILL.md +0 -111
  427. package/.agents/skills/core/shipping-and-launch/SKILL.md +0 -328
  428. package/.agents/skills/core/spec-driven-development/SKILL.md +0 -252
  429. package/.agents/skills/core/test-driven-development/SKILL.md +0 -475
  430. package/.agents/skills/core/using-agent-skills/SKILL.md +0 -232
  431. package/.agents/skills/stack/architecture/monorepo-path-strategist/SKILL.md +0 -31
  432. package/.agents/skills/stack/architecture/structured-output-zod/SKILL.md +0 -51
  433. package/.agents/skills/stack/architecture/subagent-orchestration/SKILL.md +0 -76
  434. package/.agents/skills/stack/backend/cloudflare-hono-architect/SKILL.md +0 -31
  435. package/.agents/skills/stack/backend/cloudflare-hono-architect/examples/route-template.ts +0 -33
  436. package/.agents/skills/stack/backend/cloudflare-queue-manager/SKILL.md +0 -31
  437. package/.agents/skills/stack/backend/cloudflare-workers/SKILL.md +0 -51
  438. package/.agents/skills/stack/backend/highlevel-crm/SKILL.md +0 -54
  439. package/.agents/skills/stack/backend/sqlite-drizzle-expert/SKILL.md +0 -29
  440. package/.agents/skills/stack/backend/sqlite-drizzle-expert/examples/schema-template.ts +0 -30
  441. package/.agents/skills/stack/backend/stripe-integration/SKILL.md +0 -57
  442. package/.agents/skills/stack/backend/stripe-integration/scripts/listen-stripe.sh +0 -9
  443. package/.agents/skills/stack/backend/turso-sqlite/SKILL.md +0 -48
  444. package/.agents/skills/stack/frontend/astro/SKILL.md +0 -62
  445. package/.agents/skills/stack/frontend/astro-react-island-strategist/SKILL.md +0 -30
  446. package/.agents/skills/stack/frontend/expo-react-native-developer/SKILL.md +0 -29
  447. package/.agents/skills/stack/frontend/google-analytics-v4/SKILL.md +0 -50
  448. package/.agents/skills/stack/frontend/tailwind-v4/SKILL.md +0 -58
  449. package/.agents/skills/stack/frontend/ui-accessibility-engineer/SKILL.md +0 -34
  450. package/.agents/skills/stack/qa/audit-accessibility/SKILL.md +0 -51
  451. package/.agents/skills/stack/qa/lighthouse-baseline/SKILL.md +0 -199
  452. package/.agents/skills/stack/security/backend-security-patterns/SKILL.md +0 -68
  453. package/.agents/workflows/helpers/deliver-epic-reference.md +0 -534
  454. package/.agents/workflows/helpers/deliver-epic.md +0 -955
  455. package/.agents/workflows/helpers/deliver-stories.md +0 -440
  456. package/.agents/workflows/helpers/epic-audit.md +0 -189
  457. package/.agents/workflows/helpers/epic-deliver-story.md +0 -427
  458. package/.agents/workflows/helpers/epic-testing.md +0 -125
  459. package/.agents/workflows/helpers/plan-epic-reference.md +0 -160
  460. package/.agents/workflows/helpers/plan-epic.md +0 -351
  461. package/.agents/workflows/helpers/plan-story.md +0 -251
  462. package/.agents/workflows/helpers/scope-triage-gate.md +0 -108
  463. /package/.agents/scripts/lib/orchestration/{epic-plan-spec/phases → planning}/spec-authoring-grounding.js +0 -0
@@ -7,16 +7,15 @@ description: >-
7
7
 
8
8
  # Worktree-per-Story Lifecycle
9
9
 
10
- Parallel epic execution can race when multiple story agents share one working
10
+ Parallel Story delivery can race when multiple agents share one working
11
11
  tree: rapid `git checkout` swaps cause `git add` to sweep another agent's WIP
12
- into the wrong commit. Epic #229 moves each dispatched story into its own
13
- `git worktree` at `.worktrees/story-<id>/` so branch swaps, staging, and reflog
14
- activity are isolated per-story. The main checkout stays quiet.
12
+ into the wrong commit. Each Story runs in its own `git worktree` at
13
+ `.worktrees/story-<id>/` so branch swaps, staging, and reflog activity are
14
+ isolated per-Story. The main checkout stays quiet.
15
15
 
16
16
  This document is the operator and reviewer reference. See
17
- [`epic-deliver`](deliver-epic.md) and [`story-deliver`](deliver-stories.md)
18
- for the broader execution flow and the Epic-229 Tech Spec for
19
- architectural rationale.
17
+ [`/deliver`](../deliver.md) and [`helpers/deliver-story`](deliver-story.md)
18
+ for the broader execution flow.
20
19
 
21
20
  ## Configuration
22
21
 
@@ -24,18 +23,22 @@ All knobs live under `delivery.worktreeIsolation` in `.agentrc.json`:
24
23
 
25
24
  ```jsonc
26
25
  {
27
- "orchestration": {
26
+ "delivery": {
28
27
  "worktreeIsolation": {
29
28
  "enabled": true, // master switch; false = single-tree (v5.5.1)
30
29
  "root": ".worktrees", // relative to repo root; must stay inside it
31
- "nodeModulesStrategy": "per-worktree", // per-worktree | symlink | pnpm-store
30
+ "nodeModulesStrategy": "clone", // clone | per-worktree | symlink | pnpm-store
32
31
  "primeFromPath": null, // required when strategy = "symlink"
33
32
  "allowSymlinkOnWindows": false, // explicit opt-in for symlink on win32
34
33
  "reapOnSuccess": true, // remove worktree after successful story merge
35
- "reapOnCancel": true, // remove worktree when story is cancelled
36
- "windowsPathLengthWarnThreshold": 240, // pre-flight warning threshold (MAX_PATH=260)
37
- },
38
- },
34
+ "bootstrapFiles": [
35
+ ".env",
36
+ ".mcp.json",
37
+ ".agentrc.local.json",
38
+ ".agents/instructions.local.md"
39
+ ]
40
+ }
41
+ }
39
42
  }
40
43
  ```
41
44
 
@@ -47,20 +50,20 @@ are all rejected at config-load time.
47
50
 
48
51
  | Phase | When | What happens |
49
52
  | --------------- | ----------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------- |
50
- | **Sweep** | Dispatch-manifest build (`/plan`) and `/deliver` | Stale `*.lock` files under `.git/` (older than 5 min) are removed before GC. |
51
- | **GC** | Dispatch-manifest build (`/plan`) and `/deliver` | Orphan `.worktrees/story-*` whose stories are closed are reaped if clean. |
52
- | **Force-drain** | `/plan` boot (`worktree-sweep.js` via `drainPendingCleanupAtBoot`), `story-close` post-merge (`forceDrainPendingCleanup`), `/deliver` Phase 7 | Retries `.worktrees/.pending-cleanup.json` (`git worktree remove` then `fs.rm`); Windows-only escalation enumerates user-mode handle holders and `taskkill`s them before re-trying. |
53
- | **Ensure** | `story-init` (entry for `/deliver`) | `git worktree add .worktrees/story-<id>/` on the `story-<id>` branch. |
54
- | **Run** | During story execution | Agent runs inside the worktree; HEAD/reflog activity is isolated. |
55
- | **Reap** | After successful story merge (in `story-close`) | `git worktree remove` — refuses to delete dirty trees or unmerged branches. |
53
+ | **Sweep** | Operator-driven (`WorktreeManager.sweepStaleLocks`) | Stale `*.lock` files under `.git/` (older than 5 min) are removed before GC. |
54
+ | **GC** | Operator-driven (`WorktreeManager.gc`) | Orphan `.worktrees/story-*` whose Stories are closed are reaped if clean. |
55
+ | **Force-drain** | Operator-driven (`drain-pending-cleanup.js`) | Retries `.worktrees/.pending-cleanup.json` (`git worktree remove` then `fs.rm`); Windows-only escalation enumerates user-mode handle holders and `taskkill`s them before re-trying. |
56
+ | **Ensure** | `single-story-init.js` (entry for `/deliver`) | `git worktree add .worktrees/story-<id>/` on the `story-<id>` branch. |
57
+ | **Run** | During Story execution | Agent runs inside the worktree; HEAD/reflog activity is isolated. |
58
+ | **Reap** | After successful Story merge (in `single-story-close`) | `git worktree remove` — refuses to delete dirty trees or unmerged branches. |
56
59
 
57
60
  The `WorktreeManager` (`.agents/scripts/lib/worktree-manager.js`) is the single
58
61
  authority for `ensure`, `reap`, `list`, `isSafeToRemove`, `gc`, `prune`, and
59
62
  `sweepStaleLocks`. No other script may call `git worktree` directly.
60
63
 
61
- Managed story worktrees are only eligible for `reap`/`gc` when the caller
62
- provides the expected Epic branch, so cleanup cannot silently skip the merge
63
- verification step.
64
+ Managed Story worktrees are only eligible for `reap`/`gc` when the Story is
65
+ merged (or otherwise confirmed closed) so cleanup cannot silently drop an
66
+ unlanded branch.
64
67
 
65
68
  ### Stale-lock sweep
66
69
 
@@ -78,34 +81,28 @@ entry points (see table below).
78
81
 
79
82
  ### Sweep & GC entry points
80
83
 
81
- Sweep and GC do **not** run at every Epic entry point — in particular,
82
- `story-init` (the entry for `/deliver`) does not invoke them. The full
83
- set of callers is:
84
-
85
- | Entry point | Script / caller | Runs sweep? | Runs GC? | Force-drain? | Notes |
86
- | --------------------------------------------------------------------- | --------------------------------------------------------- | ----------- | -------- | ------------ | --------------------------------------------------------------------------------------------------- |
87
- | Dispatch manifest build (`/plan` Phase 9) | `lib/orchestration/dispatch-pipeline.js::runWorktreeGc` | ✅ Yes | Yes | ✅ Yes | Called from `dispatch-engine.js::dispatch()`. Scoped to the epic being dispatched. |
88
- | Spec / decompose CLI boot (`/plan` helpers) | `drainPendingCleanupAtBoot` `worktree-sweep.js` | Yes* | No | Yes | \*Drains the pending ledger then reaps `git worktree list` entries for done/closed Stories (`--force`). |
89
- | Story merge (`/deliver` close) | `story-close.js` (`drainPendingCleanupAfterClose`) | No | No | Yes | Runs after the post-merge pipeline when worktree isolation is enabled. |
90
- | Story close | `epic-deliver runner` (invoked by `story-close.js`) | Yes | Yes | Yes | Runs before branch deletion so reaping cannot collide with `git branch -D`. |
91
- | Story init (`/deliver <storyId>`) | `story-init.js` | ❌ No | ❌ No | ❌ No | Story execution relies on the dispatch/close pair to clean up; it only creates its own worktree. |
92
- | Epic deliver wave loop (`/deliver`) | `/deliver` slash command + `lib/orchestration/epic-runner/*` | ❌ No | ❌ No | ❌ No | Does not call `sweepStaleLocks` or `gc` directly; cleanup still flows through dispatch + close. |
93
- | Drain pending-cleanup (operator-driven) | `drain-pending-cleanup.js` (run directly see below) | n/a | n/a | ✅ Yes | Manual escape hatch; same drain + Windows escalation as the `/plan` and `/deliver` paths. |
94
-
95
- Operator takeaway: if you need to force a sweep/GC without closing a story,
96
- the most direct path is re-running `/plan` (or rebuilding the dispatch
97
- manifest via `dispatcher.js`) against the active epic. Running
98
- `/deliver <storyId>` on its own does **not** clean up orphan worktrees
99
- or stale locks.
84
+ Under the v2 single-Story delivery loop, `sweepStaleLocks` and `gc`
85
+ remain `WorktreeManager` methods but have **no automatic caller** the
86
+ wave-era dispatch/close hooks that invoked them were deleted with the
87
+ epic-runner. The lifecycle surfaces that do run automatically are:
88
+
89
+ | Entry point | Script / caller | What it cleans |
90
+ | --------------------------------- | -------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------ |
91
+ | Story init (`/deliver <storyId>`) | `single-story-init.js` boot sweep (`sweepMergedStoryBranches`) | Merged/closed `story-*` branches (local + origin) from prior runs; it then creates only its own worktree. |
92
+ | Story close (`/deliver` close) | `single-story-close.js` worktree-reap phase (`WorktreeManager.reap`) | The per-Story worktree; on a Windows EBUSY-class lock the entry is deferred into `.worktrees/.pending-cleanup.json`. |
93
+ | Drain pending-cleanup (operator) | `drain-pending-cleanup.js` (run directly — see below) | The pending-cleanup ledger, with optional Windows handle-holder escalation. This is the only path that drains the ledger. |
94
+
95
+ Operator takeaway: if worktrees or stale locks accumulate, run
96
+ `node .agents/scripts/drain-pending-cleanup.js` — nothing in the
97
+ `/plan` → `/deliver` loop force-sweeps or GCs on your behalf.
100
98
 
101
99
  ## Draining the pending-cleanup ledger
102
100
 
103
101
  `.worktrees/.pending-cleanup.json` accumulates entries when
104
- `story-close.js` cannot remove a worktree on Windows because of an
105
- EBUSY-class lock. Plan boot ([`drainPendingCleanupAtBoot`](../../scripts/lib/orchestration/epic-plan-spec/phases/drain.js), run by `plan-persist.js` [`worktree-sweep.js`](../../scripts/lib/orchestration/plan-runner/worktree-sweep.js))
106
- retries the entries but if the holder
107
- is a long-lived user-mode process (a stranded test runner, a lingering
108
- biome/tsc, a node REPL), the lock never clears and the entry pins.
102
+ `single-story-close.js` cannot remove a worktree on Windows because of
103
+ an EBUSY-class lock. If the holder is a long-lived user-mode process (a
104
+ stranded test runner, a lingering biome/tsc, a node REPL), the lock
105
+ never clears and the entry pins.
109
106
 
110
107
  [`drain-pending-cleanup.js`](../../scripts/drain-pending-cleanup.js)
111
108
  runs the standard drain *and* enumerates handle holders via
@@ -116,23 +113,10 @@ PowerShell `Get-CimInstance Win32_Process`, terminating them with
116
113
  > `/drain-pending-cleanup` slash command — it was demoted to a
117
114
  > directly-runnable script (Story #3706, overturning the
118
115
  > `docs/decisions.md` matrix row that originally kept it as a command).
119
- > The three automatic callers `/deliver` runner Phase 7,
120
- > `story-close.js`, and `worktree-sweep.js` invoke
121
- > `drain-pending-cleanup.js` **directly**, so the demotion does not touch
122
- > them. The manual path survives unchanged as
116
+ > The wave-era automatic callers were deleted with the epic-runner in
117
+ > the v2 cutover, so the drain is now operator-driven:
123
118
  > `node .agents/scripts/drain-pending-cleanup.js`.
124
119
 
125
- ### When it runs automatically
126
-
127
- | Trigger | Caller |
128
- | ---------------- | ---------------------------------------------------------------------------- |
129
- | `/deliver` | [`Cleaner` lifecycle listener](../../scripts/lib/orchestration/lifecycle/listeners/cleaner.js) at the close-tail cleanup phase (before `wm.gc()`) |
130
- | `/plan` | [`drainPendingCleanupAtBoot`](../../scripts/lib/orchestration/epic-plan-spec/phases/drain.js) (run by `plan-persist.js`) → [`worktree-sweep.js`](../../scripts/lib/orchestration/plan-runner/worktree-sweep.js) |
131
- | Story merge close | [`story-close.js`](../../scripts/story-close.js) (`drainPendingCleanupAfterClose`) |
132
-
133
- All automatic paths call `forceDrainPendingCleanup()` (or are folded into
134
- `sweepStaleStoryWorktrees`, which calls it first).
135
-
136
120
  ### When to run it manually
137
121
 
138
122
  - The end-of-epic banner reports `pending-cleanup persistent-lock: story-N, ...`.
@@ -242,9 +226,9 @@ Symlink strategy:
242
226
  content-addressable store at `~/.local/share/pnpm/store` (or the platform
243
227
  equivalent) — reused packages are hard-linked into the worktree instead of
244
228
  re-downloaded and re-extracted. First-run on a cold store is no faster than
245
- `per-worktree`, and the plan healthcheck (`epic-plan-healthcheck.js
246
- --prime-install`, an opt-in manual run) primes the store in the
247
- main checkout to avoid paying that cost in parallel story windows.
229
+ `per-worktree`. Operators can prime the store once in the main
230
+ checkout (`pnpm install --frozen-lockfile`) to avoid paying first-run
231
+ cost in parallel story windows.
248
232
 
249
233
  ## Windows notes
250
234
 
@@ -32,7 +32,7 @@ generated `.claude/commands/` tree is
32
32
  the CLI's sync step.
33
33
 
34
34
  > **Persona**: `devops-engineer` · **Skills**:
35
- > `core/ci-cd-and-automation`, `core/documentation-and-adrs`
35
+ > `core/gates-and-baselines`, `core/documentation-and-adrs`
36
36
 
37
37
  ## Step 0 — Detect the install state and pick the invocation form
38
38
 
@@ -167,7 +167,8 @@ the action is `custom-hook-skip` and the helper returns the snippet to
167
167
  append by hand), **scripts** (backfill `quality:preview` /
168
168
  `quality:watch` only when absent), **config** (seed missing
169
169
  `delivery.quality.*` defaults — operator overrides survive). The baselines
170
- step relocates per-Epic snapshots under `temp/epic/<id>/baselines/`; the
170
+ step migrates legacy per-Epic snapshot layouts into the ephemeral
171
+ `temp/epic/<id>/baselines/` namespace when upgrading from pre-v2 shapes; the
171
172
  main-tracked root baselines are never touched. A second run reports
172
173
  `no-change` on every path — the idempotence contract this workflow
173
174
  requires.
@@ -1,171 +1,138 @@
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. |
41
+ | `--force-review` | Force gate #2 operator review even when risk routing would skip it. |
42
+ | `--allow-over-budget` | Permit a plan that exceeds `maxTickets` (rare N>1). |
43
+ | `--yes` | Non-interactive: auto-proceed gate #1 and gate #2 HITL waits. |
44
+ | `--dry-run` | Author + validate without GitHub writes. |
45
+
46
+ ## Default-single split policy
47
+
48
+ Author **one Story** unless:
49
+
50
+ 1. the pieces have **near-zero overlap** (genuinely independent capabilities), or
51
+ 2. there is an **architectural seam** (different deployables, migration vs consumer).
52
+
53
+ Coupled work stays one Story decompose it inside `## Slicing` as
54
+ intra-session checkpoints, not sibling tickets. When N>1, every acceptance
55
+ criterion must belong to exactly one Story; `plan-persist` runs
56
+ `assertAcceptancePartition` and refuses coupled splits.
57
+
58
+ **N=1 is the lean path:** one authoring prompt, folded `## Spec` in the
59
+ Story body, light risk/critic profile. Do not run Epic-scale decompose,
60
+ clarity, or reconciler ceremony for a single Story.
126
61
 
127
62
  ## Procedure
128
63
 
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.
64
+ ### 1. Interrogate
65
+
66
+ ```bash
67
+ node .agents/scripts/plan-context.js --seed "<seed>"
68
+ # or: --seed-file <path>
69
+ # or: --tickets 123,456
70
+ ```
71
+
72
+ The envelope carries docs context, codebase snapshot, BDD probe, risk
73
+ heuristics, the story-author system prompt, and `duplicates[]` (open
74
+ **Stories** whose title/body overlap the seed never Epics). Under
75
+ `--yes`, do not ask free-form operator questions — unresolved unknowns
76
+ land in Key Assumptions.
77
+
78
+ **Gate #1** STOP to confirm the sharpened plan intent and any
79
+ duplicate-candidate review. Under `--yes`, auto-proceed.
80
+
81
+ ### 2. Author
82
+
83
+ Write artifacts under `temp/plan-<slug>/`:
84
+
85
+ - `stories.json` array of Story tickets (**length 1 by default**). Each
86
+ body uses the canonical `story-body` shape (`## Goal`, optional
87
+ `## Slicing`, optional `## Spec`, `## Changes`, `## Acceptance`,
88
+ `## Verify`, …). The Story is the single executable document: put lean
89
+ approach prose in `## Spec`, binding criteria in top-level
90
+ `acceptance[]` / `verify[]` (persist syncs them into the body). Do not
91
+ restate Goal/Acceptance inside Spec. Over-budget Specs fail closed —
92
+ split the Story or tighten Spec; never write Specs under `docs/`.
93
+ - `risk-verdict.json` — axes + summary only (**no `deliveryShape`**).
94
+ - optional `techspec.md` — **N===1 only** convenience when Spec was authored
95
+ outside the Story JSON; persist folds it into that Story's `## Spec`.
96
+ Forbidden for N>1 (each Story must carry its own Spec).
97
+ - optional `acceptance-manifest.json` — plan-level AC list for partition
98
+ coverage when N>1.
99
+
100
+ For N=1, use the envelope `systemPrompts.story` and emit one cohesive
101
+ Story. Split only under the policy above.
102
+
103
+ ### 3. Persist
104
+
105
+ **Gate #2** — when risk routing requires review (or `--force-review`), STOP
106
+ for operator approval of the assembled plan before persist. Under `--yes`, auto-proceed.
107
+ N=1 low-risk plans typically skip this gate.
108
+
109
+ ```bash
110
+ node .agents/scripts/plan-persist.js \
111
+ --stories temp/plan-<slug>/stories.json \
112
+ --risk-verdict temp/plan-<slug>/risk-verdict.json \
113
+ [--tech-spec temp/plan-<slug>/techspec.md] \
114
+ [--plan-dir temp/plan-<slug>] \
115
+ [--dry-run] \
116
+ [--force-review] \
117
+ [--allow-over-budget]
118
+ ```
119
+
120
+ Persist creates Story issue(s) with `type::story` + `agent::ready`. When
121
+ N>1 it also applies a shared `plan-run::<id>` label. Ends by naming
122
+ `/deliver <storyId>` (or `/deliver --run <planRunId>` for N>1).
153
123
 
154
124
  ## Constraints
155
125
 
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.
126
+ - `/plan` never starts delivery.
127
+ - No Epic ticket is opened. No reconciler. No `delivery::single` marker.
128
+ - Duplicate search targets open Stories (`type::story`), not Epics.
129
+ - Deterministic gates (ticket validator, split policy, reachability, budget)
130
+ still fail closed under `--yes`.
164
131
 
165
132
  ## See also
166
133
 
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.
134
+ - [`/deliver`](deliver.md) — delivery entry point (`/deliver <storyId>`).
135
+ - [`/audit-to-stories`](audit-to-stories.md) audit findings plan seed
136
+ `/plan --seed-file`.
137
+ - [`core/scope-triage`](../skills/core/scope-triage/SKILL.md) — optional
138
+ split-advisory notes only (no routing verdict).
@@ -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
@@ -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
+ createEpic, // 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
+ `createEpic`. 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` / `createEpic` (`/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.