mandrel 1.94.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 (393) hide show
  1. package/.agents/README.md +59 -73
  2. package/.agents/agents/story-worker.md +12 -13
  3. package/.agents/docs/SDLC.md +489 -1285
  4. package/.agents/docs/agentrc-reference.json +177 -67
  5. package/.agents/docs/configuration.md +104 -138
  6. package/.agents/docs/execution-reference.md +17 -20
  7. package/.agents/docs/quality-gates.md +13 -19
  8. package/.agents/docs/workflows.md +3 -3
  9. package/.agents/instructions.md +70 -81
  10. package/.agents/rules/ci-remediation.md +8 -12
  11. package/.agents/rules/git-conventions-reference.md +6 -7
  12. package/.agents/rules/git-conventions.md +16 -22
  13. package/.agents/schemas/acceptance-eval-verdict.schema.json +1 -1
  14. package/.agents/schemas/agentrc.schema.json +54 -214
  15. package/.agents/schemas/lifecycle/ledger-record.schema.json +1 -1
  16. package/.agents/schemas/lifecycle/retro.end.schema.json +1 -1
  17. package/.agents/schemas/risk-verdict.schema.json +0 -13
  18. package/.agents/scripts/analyze-execution.js +1 -1
  19. package/.agents/scripts/audit-to-stories.js +7 -7
  20. package/.agents/scripts/boot-sweep.js +1 -1
  21. package/.agents/scripts/check-lifecycle-lint.js +6 -9
  22. package/.agents/scripts/check-prepush-recovery.js +1 -1
  23. package/.agents/scripts/cleanup-repo-test-temp.js +6 -1
  24. package/.agents/scripts/lib/Logger.js +6 -10
  25. package/.agents/scripts/lib/audit-suite/runner.js +2 -2
  26. package/.agents/scripts/lib/audit-suite/selector.js +5 -5
  27. package/.agents/scripts/lib/audit-to-stories/{seed-epic-from-findings.js → seed-from-findings.js} +9 -9
  28. package/.agents/scripts/lib/baselines/kernel.js +206 -18
  29. package/.agents/scripts/lib/baselines/kinds/maintainability.js +0 -4
  30. package/.agents/scripts/lib/baselines/reader.js +1 -6
  31. package/.agents/scripts/lib/bdd-runner-detect.js +5 -9
  32. package/.agents/scripts/lib/bootstrap/issue-forms-template.js +32 -33
  33. package/.agents/scripts/lib/checks/core-bare-clean.js +2 -2
  34. package/.agents/scripts/lib/checks/index.js +2 -1
  35. package/.agents/scripts/lib/checks/story-init-not-backgrounded.js +23 -21
  36. package/.agents/scripts/lib/cli/standard-args.js +13 -22
  37. package/.agents/scripts/lib/cli-args.js +16 -7
  38. package/.agents/scripts/lib/close-validation/gates.js +2 -2
  39. package/.agents/scripts/lib/config/ci.js +6 -31
  40. package/.agents/scripts/lib/config/delivery-routing.js +45 -29
  41. package/.agents/scripts/lib/config/explain.js +55 -36
  42. package/.agents/scripts/lib/config/limits.js +17 -58
  43. package/.agents/scripts/lib/config/paths.js +0 -2
  44. package/.agents/scripts/lib/config/quality.js +1 -1
  45. package/.agents/scripts/lib/config/runners.js +17 -50
  46. package/.agents/scripts/lib/config/temp-paths.js +19 -14
  47. package/.agents/scripts/lib/config/worktree-isolation.js +0 -5
  48. package/.agents/scripts/lib/config-resolver.js +2 -7
  49. package/.agents/scripts/lib/config-settings-schema-delivery.js +24 -148
  50. package/.agents/scripts/lib/config-settings-schema-quality.js +8 -14
  51. package/.agents/scripts/lib/config-settings-schema.js +52 -38
  52. package/.agents/scripts/lib/dependency-parser.js +3 -2
  53. package/.agents/scripts/lib/doc-tiers.js +2 -2
  54. package/.agents/scripts/lib/duplicate-search.js +211 -41
  55. package/.agents/scripts/lib/feedback-loop/retro-proposals-graduator.js +1 -1
  56. package/.agents/scripts/lib/findings/promote-finding.js +5 -5
  57. package/.agents/scripts/lib/framework-version.js +2 -3
  58. package/.agents/scripts/lib/git-branch-cleanup.js +1 -10
  59. package/.agents/scripts/lib/git-branch-lifecycle.js +17 -22
  60. package/.agents/scripts/lib/git-utils.js +32 -6
  61. package/.agents/scripts/lib/github/framework-repo.js +6 -0
  62. package/.agents/scripts/lib/label-constants.js +10 -23
  63. package/.agents/scripts/lib/label-taxonomy.js +9 -43
  64. package/.agents/scripts/lib/observability/active-story-env.js +1 -1
  65. package/.agents/scripts/lib/observability/hook-heartbeat.js +20 -52
  66. package/.agents/scripts/lib/observability/source-classifier.js +3 -3
  67. package/.agents/scripts/lib/onboard/init-tail.js +1 -3
  68. package/.agents/scripts/lib/orchestration/audit-lens-routing.js +128 -0
  69. package/.agents/scripts/lib/orchestration/bookkeeping-outbox.js +8 -5
  70. package/.agents/scripts/lib/orchestration/ceremony-routing.js +83 -20
  71. package/.agents/scripts/lib/orchestration/code-review.js +20 -268
  72. package/.agents/scripts/lib/orchestration/column-sync.js +1 -1
  73. package/.agents/scripts/lib/orchestration/consolidation-precondition.js +1 -1
  74. package/.agents/scripts/lib/orchestration/context-envelope.js +2 -5
  75. package/.agents/scripts/lib/orchestration/docs-digest.js +8 -8
  76. package/.agents/scripts/lib/orchestration/file-assumptions.js +7 -13
  77. package/.agents/scripts/lib/orchestration/git-cleanup/phases/cli.js +1 -1
  78. package/.agents/scripts/lib/orchestration/lifecycle/emit-loop-tick.js +8 -8
  79. package/.agents/scripts/lib/orchestration/lifecycle/emit-story-heartbeat.js +2 -2
  80. package/.agents/scripts/lib/orchestration/lifecycle/ledger-writer.js +6 -3
  81. package/.agents/scripts/lib/orchestration/lifecycle/listeners/README.md +17 -43
  82. package/.agents/scripts/lib/orchestration/lint-baseline-service.js +4 -4
  83. package/.agents/scripts/lib/orchestration/merge-block-class.js +1 -1
  84. package/.agents/scripts/lib/orchestration/phase-runner.js +3 -2
  85. package/.agents/scripts/lib/orchestration/plan-context.js +248 -266
  86. package/.agents/scripts/lib/orchestration/plan-critics-evaluate.js +1 -1
  87. package/.agents/scripts/lib/orchestration/plan-navigation.js +92 -0
  88. package/.agents/scripts/lib/orchestration/plan-persist/fan-out-gate.js +61 -0
  89. package/.agents/scripts/lib/orchestration/plan-persist/persist-helpers.js +97 -0
  90. package/.agents/scripts/lib/orchestration/plan-persist/run-plan-persist.js +223 -854
  91. package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +361 -0
  92. package/.agents/scripts/lib/orchestration/plan-persist/summary.js +35 -108
  93. package/.agents/scripts/lib/orchestration/plan-reachability.js +9 -14
  94. package/.agents/scripts/lib/orchestration/plan-runner/worktree-sweep.js +1 -1
  95. package/.agents/scripts/lib/orchestration/{epic-plan-spec/phases → planning}/authoring-context.js +13 -13
  96. package/.agents/scripts/lib/orchestration/planning/decomposer-context.js +27 -0
  97. package/.agents/scripts/lib/orchestration/{epic-plan-spec/phases → planning}/risk-verdict.js +3 -4
  98. package/.agents/scripts/lib/orchestration/post-merge/phases/branch-cleanup.js +2 -2
  99. package/.agents/scripts/lib/orchestration/post-merge/phases/dashboard-refresh.js +8 -20
  100. package/.agents/scripts/lib/orchestration/post-merge/phases/worktree-reap.js +3 -2
  101. package/.agents/scripts/lib/orchestration/pr-base-guard.js +18 -28
  102. package/.agents/scripts/lib/orchestration/preflight-cache.js +5 -5
  103. package/.agents/scripts/lib/orchestration/remote-verifier.js +1 -1
  104. package/.agents/scripts/lib/orchestration/resolve-plan-run.js +155 -0
  105. package/.agents/scripts/lib/orchestration/resolves-token.js +1 -1
  106. package/.agents/scripts/lib/orchestration/retro-perf-heuristics.js +8 -8
  107. package/.agents/scripts/lib/orchestration/retro-proposals.js +140 -79
  108. package/.agents/scripts/lib/orchestration/review-depth.js +26 -12
  109. package/.agents/scripts/lib/orchestration/review-providers/codex.js +2 -2
  110. package/.agents/scripts/lib/orchestration/review-providers/review-provider-factory.js +21 -56
  111. package/.agents/scripts/lib/orchestration/run-epilogue.js +426 -0
  112. package/.agents/scripts/lib/orchestration/single-story-close/phases/auto-merge.js +1 -1
  113. package/.agents/scripts/lib/orchestration/single-story-close/phases/code-review.js +95 -41
  114. package/.agents/scripts/lib/orchestration/single-story-close/phases/options.js +16 -13
  115. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-block.js +40 -0
  116. package/.agents/scripts/lib/orchestration/single-story-close/runner.js +11 -3
  117. package/.agents/scripts/lib/orchestration/spec-freshness.js +14 -205
  118. package/.agents/scripts/lib/orchestration/spec-section-validator.js +4 -5
  119. package/.agents/scripts/lib/orchestration/spec-spill.js +60 -0
  120. package/.agents/scripts/lib/orchestration/split-policy-validator.js +188 -0
  121. package/.agents/scripts/lib/orchestration/story-close/emit-blocked.js +49 -0
  122. package/.agents/scripts/lib/orchestration/story-close/phases/code-review.js +15 -12
  123. package/.agents/scripts/lib/orchestration/story-follow-ups.js +237 -0
  124. package/.agents/scripts/lib/orchestration/story-init-remote.js +47 -0
  125. package/.agents/scripts/lib/orchestration/story-plan-state.js +48 -0
  126. package/.agents/scripts/lib/orchestration/{epic-runner → story-progress}/story-run-progress-writer.js +3 -3
  127. package/.agents/scripts/lib/orchestration/structured-comment-parser.js +1 -1
  128. package/.agents/scripts/lib/orchestration/task-body-validator.js +8 -18
  129. package/.agents/scripts/lib/orchestration/ticket-validator-conflicts.js +11 -61
  130. package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +189 -373
  131. package/.agents/scripts/lib/orchestration/ticket-validator.js +2 -7
  132. package/.agents/scripts/lib/orchestration/ticketing/bulk.js +0 -25
  133. package/.agents/scripts/lib/orchestration/ticketing/reads.js +29 -26
  134. package/.agents/scripts/lib/orchestration/ticketing/transition.js +5 -5
  135. package/.agents/scripts/lib/planning-corpus.js +16 -11
  136. package/.agents/scripts/lib/preflight-runner.js +2 -2
  137. package/.agents/scripts/lib/qa/coverage-verdict.js +5 -5
  138. package/.agents/scripts/lib/single-story/confirm-merge-follow-ups.js +36 -0
  139. package/.agents/scripts/lib/single-story-sweep/protection-ctx.js +1 -1
  140. package/.agents/scripts/lib/story-adjacency.js +11 -14
  141. package/.agents/scripts/lib/story-body/story-body.js +124 -70
  142. package/.agents/scripts/lib/story-plan.js +2 -4
  143. package/.agents/scripts/lib/templates/decomposer-prompts.js +46 -45
  144. package/.agents/scripts/lib/templates/spec-author-prompts.js +47 -45
  145. package/.agents/scripts/lib/{epic-body-sections.js → ticket-body-sections.js} +26 -26
  146. package/.agents/scripts/lib/validation-evidence.js +1 -1
  147. package/.agents/scripts/lib/wave-runner/ready-set.js +6 -6
  148. package/.agents/scripts/lib/workspace-provisioner.js +1 -1
  149. package/.agents/scripts/lib/worktree/lifecycle/reap.js +5 -7
  150. package/.agents/scripts/lint-issue-body.js +71 -40
  151. package/.agents/scripts/mandrel-update-preflight.js +1 -1
  152. package/.agents/scripts/notify.js +4 -3
  153. package/.agents/scripts/plan-context.js +64 -74
  154. package/.agents/scripts/plan-persist.js +121 -280
  155. package/.agents/scripts/plan-run-epilogue.js +97 -0
  156. package/.agents/scripts/providers/github/issues.js +17 -33
  157. package/.agents/scripts/providers/github/mappers.js +0 -12
  158. package/.agents/scripts/providers/github/tickets.js +2 -5
  159. package/.agents/scripts/resolve-plan-run.js +117 -0
  160. package/.agents/scripts/signals-view.js +24 -19
  161. package/.agents/scripts/single-story-close.js +11 -14
  162. package/.agents/scripts/single-story-confirm-merge.js +39 -23
  163. package/.agents/scripts/single-story-init.js +29 -20
  164. package/.agents/scripts/stories-wave-tick.js +6 -6
  165. package/.agents/scripts/story-plan.js +26 -47
  166. package/.agents/scripts/update-ticket-state.js +6 -15
  167. package/.agents/skills/core/analyze-execution/SKILL.md +21 -18
  168. package/.agents/skills/core/idea-refinement/SKILL.md +6 -6
  169. package/.agents/skills/core/scope-triage/SKILL.md +28 -172
  170. package/.agents/skills/skills.index.json +3 -43
  171. package/.agents/starter-agentrc.json +0 -5
  172. package/.agents/templates/agent-protocol.md +9 -10
  173. package/.agents/workflows/audit-architecture.md +3 -3
  174. package/.agents/workflows/audit-clean-code.md +3 -3
  175. package/.agents/workflows/audit-dependencies.md +3 -3
  176. package/.agents/workflows/audit-devops.md +3 -3
  177. package/.agents/workflows/audit-documentation.md +5 -5
  178. package/.agents/workflows/audit-lighthouse.md +3 -3
  179. package/.agents/workflows/audit-navigability.md +3 -2
  180. package/.agents/workflows/audit-performance.md +3 -3
  181. package/.agents/workflows/audit-privacy.md +3 -3
  182. package/.agents/workflows/audit-quality.md +3 -3
  183. package/.agents/workflows/audit-security.md +3 -3
  184. package/.agents/workflows/audit-seo.md +3 -3
  185. package/.agents/workflows/audit-sre.md +3 -3
  186. package/.agents/workflows/audit-to-stories.md +20 -20
  187. package/.agents/workflows/audit-ux-ui.md +3 -3
  188. package/.agents/workflows/deliver.md +122 -174
  189. package/.agents/workflows/git-cleanup.md +3 -4
  190. package/.agents/workflows/helpers/_merge-conflict-template.md +1 -1
  191. package/.agents/workflows/helpers/acceptance-self-eval.md +16 -29
  192. package/.agents/workflows/helpers/code-review.md +70 -193
  193. package/.agents/workflows/helpers/{single-story-deliver-reference.md → deliver-story-reference.md} +12 -14
  194. package/.agents/workflows/helpers/{single-story-deliver.md → deliver-story.md} +113 -139
  195. package/.agents/workflows/helpers/diagnose.md +10 -10
  196. package/.agents/workflows/helpers/parallel-tooling.md +1 -1
  197. package/.agents/workflows/helpers/signals.md +16 -16
  198. package/.agents/workflows/helpers/worktree-lifecycle.md +48 -64
  199. package/.agents/workflows/mandrel-update.md +2 -1
  200. package/.agents/workflows/plan.md +112 -145
  201. package/.agents/workflows/qa-assist.md +24 -30
  202. package/.agents/workflows/qa-explore.md +29 -38
  203. package/.agents/workflows/qa-run.md +2 -2
  204. package/README.md +9 -8
  205. package/docs/CHANGELOG.md +30 -0
  206. package/lib/migrations/index.js +6 -5
  207. package/package.json +2 -2
  208. package/.agents/agents/retro.md +0 -42
  209. package/.agents/personas/architect.md +0 -113
  210. package/.agents/personas/devops-engineer.md +0 -38
  211. package/.agents/personas/engineer.md +0 -33
  212. package/.agents/personas/project-manager.md +0 -114
  213. package/.agents/personas/qa-engineer.md +0 -95
  214. package/.agents/personas/security-engineer.md +0 -111
  215. package/.agents/personas/technical-writer.md +0 -101
  216. package/.agents/schemas/dispatch-manifest.json +0 -232
  217. package/.agents/schemas/epic-spec.schema.json +0 -153
  218. package/.agents/schemas/lifecycle/slice.end.schema.json +0 -21
  219. package/.agents/schemas/lifecycle/slice.heartbeat.schema.json +0 -20
  220. package/.agents/schemas/lifecycle/slice.start.schema.json +0 -17
  221. package/.agents/scripts/acceptance-spec-reconciler.js +0 -642
  222. package/.agents/scripts/bookkeeping-reconcile.js +0 -117
  223. package/.agents/scripts/dispatcher.js +0 -295
  224. package/.agents/scripts/epic-audit-prepare.js +0 -497
  225. package/.agents/scripts/epic-audit-recheck.js +0 -274
  226. package/.agents/scripts/epic-deliver-note-intervention.js +0 -192
  227. package/.agents/scripts/epic-deliver-preflight.js +0 -462
  228. package/.agents/scripts/epic-deliver-prepare.js +0 -852
  229. package/.agents/scripts/epic-execute-record-wave.js +0 -449
  230. package/.agents/scripts/epic-plan-clarity.js +0 -211
  231. package/.agents/scripts/epic-plan-healthcheck.js +0 -581
  232. package/.agents/scripts/epic-reconcile.js +0 -625
  233. package/.agents/scripts/lib/baseline-snapshot.js +0 -979
  234. package/.agents/scripts/lib/checks/epic-merge-lock-stale.js +0 -54
  235. package/.agents/scripts/lib/checks/stale-origin-epic.js +0 -49
  236. package/.agents/scripts/lib/config/lifecycle.js +0 -40
  237. package/.agents/scripts/lib/config/preflight.js +0 -58
  238. package/.agents/scripts/lib/config/retro.js +0 -77
  239. package/.agents/scripts/lib/epic-merge-lock.js +0 -322
  240. package/.agents/scripts/lib/epic-plan-clarity.js +0 -181
  241. package/.agents/scripts/lib/epic-plan-ideation.js +0 -261
  242. package/.agents/scripts/lib/orchestration/context-hydration-engine.js +0 -539
  243. package/.agents/scripts/lib/orchestration/deliver-route.js +0 -173
  244. package/.agents/scripts/lib/orchestration/dispatch-engine.js +0 -134
  245. package/.agents/scripts/lib/orchestration/dispatch-pipeline.js +0 -183
  246. package/.agents/scripts/lib/orchestration/epic-cleanup.js +0 -801
  247. package/.agents/scripts/lib/orchestration/epic-deliver-lease-guard.js +0 -310
  248. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/context.js +0 -163
  249. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/creation.js +0 -140
  250. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/dag.js +0 -64
  251. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/diagnostics.js +0 -72
  252. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/persist-helpers.js +0 -156
  253. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/persist.js +0 -345
  254. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/planning-artifacts.js +0 -41
  255. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/reconcile-spawn.js +0 -86
  256. package/.agents/scripts/lib/orchestration/epic-plan-lease-guard.js +0 -391
  257. package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/drain.js +0 -94
  258. package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/plan-epic.js +0 -236
  259. package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/run-spec-phase.js +0 -307
  260. package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/spec-freshness.js +0 -117
  261. package/.agents/scripts/lib/orchestration/epic-plan-state-store.js +0 -117
  262. package/.agents/scripts/lib/orchestration/epic-run-state-store.js +0 -621
  263. package/.agents/scripts/lib/orchestration/epic-runner/concurrency-gate.js +0 -186
  264. package/.agents/scripts/lib/orchestration/epic-runner/deliver-phases.js +0 -50
  265. package/.agents/scripts/lib/orchestration/epic-runner/phases/build-wave-dag.js +0 -129
  266. package/.agents/scripts/lib/orchestration/epic-runner/phases/snapshot.js +0 -103
  267. package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter/composition.js +0 -267
  268. package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter/signals.js +0 -210
  269. package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter/transport.js +0 -238
  270. package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/_bullet-format.js +0 -32
  271. package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/component-drift.js +0 -203
  272. package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/crap-drift.js +0 -227
  273. package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/maintainability-drift.js +0 -117
  274. package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/stalled-worktree.js +0 -37
  275. package/.agents/scripts/lib/orchestration/epic-runner/story-launcher.js +0 -127
  276. package/.agents/scripts/lib/orchestration/epic-runner/sub-agent-return.js +0 -276
  277. package/.agents/scripts/lib/orchestration/epic-runner/wave-scheduler.js +0 -66
  278. package/.agents/scripts/lib/orchestration/epic-spec-reconciler-apply.js +0 -789
  279. package/.agents/scripts/lib/orchestration/epic-spec-reconciler-diff.js +0 -676
  280. package/.agents/scripts/lib/orchestration/epic-spec-reconciler-discriminator.js +0 -389
  281. package/.agents/scripts/lib/orchestration/epic-spec-reconciler-format.js +0 -230
  282. package/.agents/scripts/lib/orchestration/epic-spec-reconciler-ops.js +0 -361
  283. package/.agents/scripts/lib/orchestration/finalize/open-or-locate-pr.js +0 -306
  284. package/.agents/scripts/lib/orchestration/finalize/post-handoff-comment.js +0 -489
  285. package/.agents/scripts/lib/orchestration/finalize/sanitize-skip-ci.js +0 -88
  286. package/.agents/scripts/lib/orchestration/lifecycle/emit-slice-lifecycle.js +0 -270
  287. package/.agents/scripts/lib/orchestration/lifecycle/emit-story-dispatch-end.js +0 -147
  288. package/.agents/scripts/lib/orchestration/lifecycle/listeners/acceptance-reconciler.js +0 -465
  289. package/.agents/scripts/lib/orchestration/lifecycle/listeners/automerge-armer.js +0 -501
  290. package/.agents/scripts/lib/orchestration/lifecycle/listeners/automerge-predicate.js +0 -984
  291. package/.agents/scripts/lib/orchestration/lifecycle/listeners/branch-cleaner.js +0 -264
  292. package/.agents/scripts/lib/orchestration/lifecycle/listeners/checkpoint-pointer-writer.js +0 -284
  293. package/.agents/scripts/lib/orchestration/lifecycle/listeners/cleaner.js +0 -355
  294. package/.agents/scripts/lib/orchestration/lifecycle/listeners/finalizer.js +0 -673
  295. package/.agents/scripts/lib/orchestration/lifecycle/listeners/index.js +0 -378
  296. package/.agents/scripts/lib/orchestration/lifecycle/listeners/intervention-recorder.js +0 -140
  297. package/.agents/scripts/lib/orchestration/lifecycle/listeners/label-transitioner.js +0 -144
  298. package/.agents/scripts/lib/orchestration/lifecycle/listeners/notify-dispatcher.js +0 -174
  299. package/.agents/scripts/lib/orchestration/manifest-builder.js +0 -222
  300. package/.agents/scripts/lib/orchestration/plan-persist/amend.js +0 -359
  301. package/.agents/scripts/lib/orchestration/plan-persist/delivery-mode.js +0 -127
  302. package/.agents/scripts/lib/orchestration/post-merge-pipeline.js +0 -205
  303. package/.agents/scripts/lib/orchestration/recurring-failure-detector.js +0 -152
  304. package/.agents/scripts/lib/orchestration/retro/phases/checks.js +0 -94
  305. package/.agents/scripts/lib/orchestration/retro/phases/compose-body.js +0 -571
  306. package/.agents/scripts/lib/orchestration/retro/phases/gather-signals.js +0 -450
  307. package/.agents/scripts/lib/orchestration/retro/phases/post-and-mirror.js +0 -191
  308. package/.agents/scripts/lib/orchestration/retro-heuristics.js +0 -57
  309. package/.agents/scripts/lib/orchestration/retro-runner.js +0 -197
  310. package/.agents/scripts/lib/orchestration/spec-renderer.js +0 -447
  311. package/.agents/scripts/lib/orchestration/story-close/auto-refresh-runner.js +0 -747
  312. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/gate-failure.js +0 -211
  313. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/pre-merge-attribution.js +0 -158
  314. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/refresh-commit.js +0 -446
  315. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/regression-projection.js +0 -297
  316. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/scope-discovery.js +0 -48
  317. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution-wiring.js +0 -67
  318. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution.js +0 -161
  319. package/.agents/scripts/lib/orchestration/story-close/baseline-friction-body.js +0 -117
  320. package/.agents/scripts/lib/orchestration/story-close/cd-out-guard.js +0 -86
  321. package/.agents/scripts/lib/orchestration/story-close/cleanup-reconciler.js +0 -147
  322. package/.agents/scripts/lib/orchestration/story-close/close-inputs.js +0 -142
  323. package/.agents/scripts/lib/orchestration/story-close/comment-bodies.js +0 -62
  324. package/.agents/scripts/lib/orchestration/story-close/merge-runner.js +0 -658
  325. package/.agents/scripts/lib/orchestration/story-close/merge-subject.js +0 -198
  326. package/.agents/scripts/lib/orchestration/story-close/phases/branch-restore.js +0 -105
  327. package/.agents/scripts/lib/orchestration/story-close/phases/close.js +0 -222
  328. package/.agents/scripts/lib/orchestration/story-close/phases/gates.js +0 -292
  329. package/.agents/scripts/lib/orchestration/story-close/phases/locked-pipeline.js +0 -270
  330. package/.agents/scripts/lib/orchestration/story-close/phases/preflight.js +0 -110
  331. package/.agents/scripts/lib/orchestration/story-close/phases/refresh.js +0 -86
  332. package/.agents/scripts/lib/orchestration/story-close/phases/timeout-blocked-emitter.js +0 -112
  333. package/.agents/scripts/lib/orchestration/story-close/phases/timeout-blocked.js +0 -157
  334. package/.agents/scripts/lib/orchestration/story-close/post-merge-close.js +0 -421
  335. package/.agents/scripts/lib/orchestration/story-close/pre-merge-validation.js +0 -302
  336. package/.agents/scripts/lib/orchestration/story-close/shared-checkout-guard.js +0 -163
  337. package/.agents/scripts/lib/orchestration/story-close-recovery.js +0 -690
  338. package/.agents/scripts/lib/orchestration/wave-marker.js +0 -28
  339. package/.agents/scripts/lib/orchestration/wave-record-io.js +0 -218
  340. package/.agents/scripts/lib/orchestration/wave-record-notifications.js +0 -145
  341. package/.agents/scripts/lib/orchestration/wave-record-projection.js +0 -212
  342. package/.agents/scripts/lib/presentation/dispatch-manifest-render.js +0 -111
  343. package/.agents/scripts/lib/presentation/manifest-builder.js +0 -239
  344. package/.agents/scripts/lib/presentation/manifest-formatter.js +0 -242
  345. package/.agents/scripts/lib/presentation/manifest-helpers.js +0 -213
  346. package/.agents/scripts/lib/presentation/manifest-persistence.js +0 -261
  347. package/.agents/scripts/lib/presentation/manifest-procedures.js +0 -55
  348. package/.agents/scripts/lib/presentation/manifest-render-waves.js +0 -306
  349. package/.agents/scripts/lib/presentation/manifest-renderer.js +0 -188
  350. package/.agents/scripts/lib/presentation/manifest-story-views.js +0 -110
  351. package/.agents/scripts/lib/push-epic-retry.js +0 -209
  352. package/.agents/scripts/lib/spec/index.js +0 -36
  353. package/.agents/scripts/lib/spec/loader.js +0 -425
  354. package/.agents/scripts/lib/spec/state.js +0 -208
  355. package/.agents/scripts/lib/story-init/blocker-validator.js +0 -68
  356. package/.agents/scripts/lib/story-init/branch-initializer.js +0 -408
  357. package/.agents/scripts/lib/story-init/context-resolver.js +0 -92
  358. package/.agents/scripts/lib/story-init/donor-precheck.js +0 -207
  359. package/.agents/scripts/lib/story-init/state-transitioner.js +0 -80
  360. package/.agents/scripts/lib/story-init/task-graph-builder.js +0 -124
  361. package/.agents/scripts/lib/story-init/transition-summary.js +0 -34
  362. package/.agents/scripts/lib/test-reserved-epic-temp-ids.js +0 -35
  363. package/.agents/scripts/lib/wave-runner/tick.js +0 -754
  364. package/.agents/scripts/lib/wave-runner/wave-runner-error.js +0 -20
  365. package/.agents/scripts/lifecycle-emit-story-dispatch.js +0 -194
  366. package/.agents/scripts/lifecycle-emit.js +0 -510
  367. package/.agents/scripts/retro-run.js +0 -218
  368. package/.agents/scripts/slice-phase.js +0 -361
  369. package/.agents/scripts/standalone-feedback-rollup.js +0 -188
  370. package/.agents/scripts/story-close.js +0 -294
  371. package/.agents/scripts/story-init.js +0 -599
  372. package/.agents/scripts/story-phase.js +0 -369
  373. package/.agents/scripts/wave-tick.js +0 -464
  374. package/.agents/skills/core/epic-plan-consolidate/SKILL.md +0 -172
  375. package/.agents/skills/core/epic-plan-consolidate/examples.md +0 -51
  376. package/.agents/skills/core/epic-plan-decompose-author/SKILL.md +0 -441
  377. package/.agents/skills/core/epic-plan-decompose-author/examples.md +0 -47
  378. package/.agents/skills/core/epic-plan-premortem/SKILL.md +0 -146
  379. package/.agents/skills/core/epic-plan-premortem/examples.md +0 -53
  380. package/.agents/skills/core/epic-plan-spec-author/SKILL.md +0 -383
  381. package/.agents/skills/core/epic-plan-spec-author/examples.md +0 -91
  382. package/.agents/workflows/helpers/deliver-epic-reference.md +0 -547
  383. package/.agents/workflows/helpers/deliver-epic-single.md +0 -331
  384. package/.agents/workflows/helpers/deliver-epic.md +0 -998
  385. package/.agents/workflows/helpers/deliver-stories.md +0 -450
  386. package/.agents/workflows/helpers/epic-audit.md +0 -189
  387. package/.agents/workflows/helpers/epic-deliver-story.md +0 -436
  388. package/.agents/workflows/helpers/epic-testing.md +0 -125
  389. package/.agents/workflows/helpers/plan-epic-reference.md +0 -160
  390. package/.agents/workflows/helpers/plan-epic.md +0 -353
  391. package/.agents/workflows/helpers/plan-story.md +0 -251
  392. package/.agents/workflows/helpers/scope-triage-gate.md +0 -108
  393. /package/.agents/scripts/lib/orchestration/{epic-plan-spec/phases → planning}/spec-authoring-grounding.js +0 -0
@@ -1,436 +0,0 @@
1
- ---
2
- description: >-
3
- Helper — not a slash command. Execute one Epic-attached Story end-to-end on
4
- behalf of `/deliver`. Calls `story-init.js`, `cd`s into the worktree,
5
- runs the Story-implementation phase against the inline acceptance[] /
6
- verify[] arrays, writes a `story-run-progress` snapshot per transition, and
7
- finally calls `story-close.js` to merge into the Epic branch and reap the
8
- worktree.
9
- caller: epic-deliver.md
10
- ---
11
-
12
- # helpers/epic-deliver-story — Epic-attached Story worker
13
-
14
- > **Not a slash command.** This file lives in `helpers/` and is not projected
15
- > into the mandrel plugin command tree. It is invoked exclusively by the
16
- > [`/deliver`](deliver-epic.md) per-wave fan-out via an `Agent` tool call —
17
- > `subagent_type: story-worker` when `delivery.routing.roleScopedAgents` is on
18
- > (the default), else `subagent_type: general-purpose` (Epic #4478, M7-B). Run
19
- > `/deliver <epicId>` from the operator surface, not this helper directly.
20
-
21
- ## Overview
22
-
23
- `epic-deliver-story` is the **single-Story worker** for Epic-attached Stories.
24
- It sits below [`/deliver`](deliver-epic.md) (which fans out one Story
25
- sub-agent per slot, per wave) and runs one Story from init to close in one
26
- invocation.
27
-
28
- ```text
29
- /deliver <epicId>
30
- → for each wave N:
31
- Agent tool × concurrencyCap parallel calls (one assistant turn):
32
- helpers/epic-deliver-story <storyId>
33
- → story-init.js
34
- → single Story-implementation phase using inline
35
- acceptance[] / verify[] from the Story body
36
- → story-close.js
37
- ```
38
-
39
- The argument is always a **Story ID** (`type::story`). Epic IDs go through
40
- [`/deliver`](deliver-epic.md).
41
-
42
- **Standalone Stories** (no `Epic: #N` in body) use
43
- [`/deliver`](deliver-stories.md) instead — that workflow's helper
44
- branches from `main`, opens its PR directly to `main`, and skips the
45
- Epic-scoped machinery (cascade, dispatch manifest, dashboard regen). This
46
- helper requires a parent Epic and will refuse to initialize a Story that lacks
47
- the `Epic: #N` reference.
48
-
49
- > **Worktree isolation.** When `delivery.worktreeIsolation.enabled` is
50
- > `true`, Step 0 creates a worktree at `.worktrees/story-<id>/` and prints
51
- > its absolute path as `workCwd`. You **must** `cd` into that path before
52
- > Step 1. The main checkout's HEAD is never moved. See
53
- > [`worktree-lifecycle.md`](worktree-lifecycle.md) for node_modules
54
- > strategies, Windows notes, and escape hatches.
55
-
56
- ---
57
-
58
- ## Non-interactive execution contract
59
-
60
- `epic-deliver-story` runs as a sub-agent of `/deliver`'s per-wave fan-out
61
- (common case) or interactively for a single Story. Sub-agent runs share
62
- the parent's permissions but have **no input channel** mid-run.
63
-
64
- - **Never** ask clarifying questions as a sub-agent. Pick the narrowest
65
- reasonable interpretation that satisfies the Story's AC. If you cannot
66
- proceed, transition to `agent::blocked`, post a `friction` comment with
67
- the decision needed and the default assumption, and exit non-zero.
68
- - **Never** assume tool-permission prompts will be auto-approved. Treat a
69
- blocking prompt as a harness condition and transition to `agent::blocked`.
70
- - **Always** write `story-run-progress` snapshots at every phase
71
- transition so the parent aggregator never falls back to label
72
- re-derivation.
73
-
74
- ---
75
-
76
- ## Step 0 — Initialize (`story-init.js`)
77
-
78
- Run from the **main checkout** (the worktree does not exist yet):
79
-
80
- ```bash
81
- node .agents/scripts/story-init.js --story <storyId>
82
- ```
83
-
84
- **No spec-ticket threading (Story #4324).** The Tech Spec lives as managed
85
- sections of the Epic body — there is no separate Tech-Spec issue, no
86
- `--tech-spec` flag, and no per-Story hierarchy trace to a spec ticket.
87
- Your hydrated prompt already embeds the Epic body (with the
88
- `## Acceptance Table` section stripped), which carries the folded Tech
89
- Spec sections; do not fetch a Tech Spec issue.
90
-
91
- > **Execution mode (sub-agents must read).** This command typically takes
92
- > 3–6 minutes when the worktree's per-tree install runs. Invoke it
93
- > **synchronously** with the Bash tool's maximum timeout
94
- > (`Bash(timeout: 600000)`). Do **not** use `run_in_background` + `Monitor`
95
- > here: `Monitor`'s return is not equivalent to script exit, and a sub-agent
96
- > that exits during a `Monitor` wait kills `story-init.js` mid-batch — the
97
- > worktree is left half-initialized (no `story-init` comment, no Story-level
98
- > `agent::*` label flip) and the parent
99
- > wave aggregator records the Story as failed. The script is idempotent on
100
- > partial state, so the recovery is to re-run it synchronously, but
101
- > prevention is cheaper: just give Bash the 10-minute timeout and block.
102
-
103
- The script validates `type::story`, checks blockers, resolves the parent
104
- Epic id, seeds `story-<id>` from the
105
- Epic branch, and (when worktree isolation is on) runs `git worktree add`
106
- at `.worktrees/story-<id>/`. The Story flips to `agent::executing`. A
107
- `story-init` structured comment is upserted with the Story's inline
108
- `acceptance[]` and `verify[]` arrays from the body.
109
-
110
- Capture `workCwd`, `dependenciesInstalled` (tri-state), and
111
- `context.parentId`. Add `--dry-run` to check
112
- status without git or ticket changes.
113
-
114
- ### Step 0.5 — `cd` into the workCwd
115
-
116
- ```bash
117
- cd "<workCwd from Step 0 result>"
118
- ```
119
-
120
- All subsequent commands run from this directory. The `dependenciesInstalled`
121
- tri-state carries one of three values:
122
-
123
- | Value | Meaning | Action |
124
- | --------- | ---------------------------------------------------------------------------------- | --------------------------------------------------- |
125
- | `true` | Per-worktree install ran and succeeded. | Proceed. |
126
- | `false` | Install was attempted and failed. | The next CLI runs the install before proceeding. |
127
- | `skipped` | No per-worktree install (single-tree, reused worktree, `symlink`, `pnpm-store`). | Trust the strategy. |
128
-
129
- ### Step 0.6 — Initial `story-run-progress` snapshot
130
-
131
- Story #4017 inlined the former standalone prepare CLI into
132
- `story-init.js`: Step 0's init run already applied the install tri-state
133
- in-process (retrying the install command when
134
- `dependenciesInstalled === 'false'`, default `npm ci`) and rendered the
135
- initial snapshot (`phase: "init"`). There is no separate command to run.
136
-
137
- Step 0's init run already upserted the initial `story-run-progress`
138
- snapshot (`phase: "init"`) as a structured comment on the Story — that
139
- comment, refreshed by `story-phase.js` at each transition, is the
140
- authoritative Story-level rollup the parent `/deliver` aggregator reads.
141
- You do **not** relay `prepare.renderedBody` verbatim to chat. Instead,
142
- relay **one line per phase transition** (e.g. `Story #<id>: init →
143
- implementing`), and do the same after every transition in Step 1 / Step 3.
144
- The snapshot CLI carries the full body; the chat line is a terse progress
145
- delta, not a body dump.
146
-
147
- ---
148
-
149
- ## Step 1 — Story implementation
150
-
151
- Run a single Story-implementation phase against the inline `acceptance[]`
152
- / `verify[]` arrays on the Story body.
153
-
154
- 1. Flip the snapshot to the `implementing` phase. Pass `--epic <epicId>`
155
- and `--branch story-<storyId>` from the Step 0 envelope so the render
156
- skips the `readEpicIdFromStory` / `resolveStoryBranch` GitHub reads
157
- (pass these same flags to **every** `story-phase.js` call below):
158
-
159
- ```bash
160
- node .agents/scripts/story-phase.js \
161
- --story <storyId> --epic <epicId> --branch story-<storyId> \
162
- --phase implementing
163
- ```
164
-
165
- > **Liveness between transitions is free (Epic #4476).** These
166
- > `story-phase.js` calls fire only at genuine phase transitions (a few per
167
- > Story) and each renders the snapshot + stamps an operator-bearing
168
- > `story.heartbeat`. You do **not** add extra `story-phase.js` calls
169
- > mid-`implementing` just to prove you are alive: the PostToolUse hook emits
170
- > a throttled `story.heartbeat` off the token stream on every tool call, so
171
- > the §2e Idle Watchdog sees continuous forward progress for free.
172
-
173
- 2. Read the Story body's inline `acceptance[]` and `verify[]` arrays
174
- from the `story-init` structured comment (`context.acceptance`,
175
- `context.verify`). Treat the acceptance items as the contract and
176
- the verify items as the canonical at-keyboard checks.
177
-
178
- **Docs context — read the digest, not the full set.** Do **not**
179
- re-read every file in `project.docsContextFiles`. The parent prompt
180
- passes a `docsDigestPath` (the per-Epic docs digest at
181
- `temp/epic-<epicId>/docs-digest.md`, written by
182
- `epic-deliver-prepare.js`). Read that digest — a compact per-file
183
- outline (path, size, heading outline with line numbers, first
184
- paragraph under each `##`) — to decide which docs bear on this Story,
185
- then **pull the full file on demand** (jump to the section at the line
186
- number the digest names) only when relevant. When `docsDigestPath` is
187
- null (the project configured no `docsContextFiles`), there is no
188
- digest and no per-Story docs mandate — read a full doc only if the
189
- Story's own context points you at one. See
190
- [`.agents/instructions.md` § 3](../../instructions.md).
191
-
192
- **Write-time audit checklists — read the threaded `checklistPath`.**
193
- When the parent prompt passes a `checklistPath` (Story #4410 — the
194
- repo-relative path to this Story's footprint-matched **local**-lens
195
- authoring checklists at
196
- `temp/epic-<epicId>/checklists/story-<storyId>.md`), read it before you
197
- write and self-check your change against each listed concern as you
198
- author it. These are the local audit lenses whose `filePatterns` matched
199
- the Story's predicted footprint, distilled to a short checklist and
200
- capped at a hard token budget by `epic-deliver-prepare.js` (matched via
201
- `resolveLensTier(lens) === 'local'` + `matchesAnyFilePattern`, never
202
- `selectAudits` — no provider or git diff runs on that path). When
203
- `checklistPath` is null or absent, the Story's footprint matched no local
204
- lens and there is nothing extra to read.
205
-
206
- 3. Implement the work as one or more commits on `story-<storyId>`.
207
- Author commits directly with the project's editor / `git commit`,
208
- following
209
- [`.agents/rules/git-conventions.md`](../../rules/git-conventions.md):
210
- - Conventional Commit subject (`feat:`, `fix:`, …).
211
- - Reference the parent Story via `(refs #<storyId>)` in the subject
212
- or body.
213
- - The `commit-msg` Husky hook enforces commitlint locally.
214
-
215
- 4. After the final commit lands, run the **bounded acceptance self-eval
216
- loop** (Step 1a below) **before** flipping to `closing`. The
217
- `verify[]` commands are consumed inside that loop as **required
218
- evidence** — they are no longer optional advisory pre-flight.
219
-
220
- 5. Once the eval loop returns `proceed`, flip the snapshot to `closing`
221
- and proceed to Step 3 (Step 3 invokes close directly — it no longer
222
- re-renders the `closing` snapshot, so this is the single `closing`
223
- render):
224
-
225
- ```bash
226
- node .agents/scripts/story-phase.js \
227
- --story <storyId> --epic <epicId> --branch story-<storyId> \
228
- --phase closing
229
- ```
230
-
231
- 6. If blocked (including by the eval loop reaching its round cap with
232
- criteria still unmet — Step 1a), flip the snapshot to `blocked`,
233
- transition the Story to `agent::blocked`, post a `friction` comment,
234
- and exit non-zero:
235
-
236
- ```bash
237
- node .agents/scripts/story-phase.js \
238
- --story <storyId> --epic <epicId> --branch story-<storyId> \
239
- --phase blocked
240
- ```
241
-
242
- ### Step 1a — Bounded acceptance self-eval loop (**required, not optional**)
243
-
244
- After the implementation commits land and **before** the snapshot flips to
245
- `closing`, run the bounded acceptance self-eval loop. The per-round critic
246
- mechanic (fresh-context critic, `verify[]`-as-evidence, the verdict schema, and
247
- the proceed / redraft / block decision) is the single-homed include
248
- [`acceptance-self-eval.md`](acceptance-self-eval.md) — read it and follow it.
249
- The critic reads the Story's inline `acceptance[]` / `verify[]` arrays from the
250
- `story-init` comment (`context.acceptance` / `context.verify`).
251
-
252
- Epic-attached specifics for this path:
253
-
254
- - **Critic evidence-share** (Story #4250). When the critic runs a `verify[]`
255
- command that is byte-identical to a close gate (`lint` / `typecheck`), it
256
- records the pass into the Epic-keyed evidence keyspace via `--epic-id
257
- <epicId>` so `story-close.js` short-circuits the gate at unchanged HEAD.
258
- Run it in the **Story worktree** (`.worktrees/story-<storyId>`):
259
-
260
- ```bash
261
- node .agents/scripts/evidence-gate.js \
262
- --epic-id <epicId> --scope-id <storyId> --gate lint \
263
- --worktree .worktrees/story-<storyId> -- npm run lint
264
- ```
265
-
266
- - **Gate invocation** (pass `--epic <epicId>` so the per-criterion signal lands
267
- on the Epic-scoped stream):
268
-
269
- ```bash
270
- node .agents/scripts/acceptance-eval.js \
271
- --story <storyId> --epic <epicId> --verdict <verdict-path>
272
- ```
273
-
274
- - **On `decision: "proceed"`** → flip the snapshot to `closing` (item 5 above).
275
- - **On `decision: "block"`** → take the blocked path (item 6 above): post a
276
- `friction` comment naming the unmet criteria and their evidence, flip the
277
- snapshot to `blocked`, and exit non-zero. Never silently proceed to close.
278
-
279
- The resume guard is expressed at the Story level: re-entering a
280
- partially-implemented Story picks up from whatever commits are already
281
- on `story-<storyId>`; the agent inspects `git log` to decide what work
282
- remains.
283
-
284
- After each `story-phase.js` call, relay **one line naming the phase
285
- transition** (e.g. `Story #<id>: implementing → closing`) as the Story's
286
- progress update — not the envelope's `renderedBody` verbatim. The
287
- `story-phase.js` CLI has already upserted the full body into the
288
- `story-run-progress` snapshot; that comment is the authoritative rollup
289
- the parent `/deliver` aggregator reads. Skip chat relay entirely when
290
- running in a non-interactive sub-agent context where the parent will
291
- aggregate.
292
-
293
- > Rebase pauses on conflicts → follow
294
- > [`_merge-conflict-template.md`](_merge-conflict-template.md).
295
-
296
- ---
297
-
298
- ## Step 2 — Validate (deferred to close)
299
-
300
- `story-close.js` runs the canonical close-validation chain (typecheck,
301
- lint, test, format, maintainability, coverage, crap) before it merges —
302
- **do not** pre-run those gates here unless interactively iterating on a
303
- fix. (Interactively, `npm run typecheck && npm run lint && npm test` is
304
- fine as advisory pre-flight.)
305
-
306
- ---
307
-
308
- ## Step 3 — Close (`story-close.js`)
309
-
310
- Step 1 item 5 already flipped the snapshot to the `closing` phase, so this
311
- step does **not** re-render it (the duplicate render was removed). Invoke
312
- close directly. Pass the parent Epic id via `--epic <epicId>` from the
313
- Step 0 envelope so close skips re-parsing the Epic hierarchy off the
314
- Story body (which also closes the malformed-`Epic:`-line failure mode).
315
- Pass the main-checkout path via `--cwd` so the merge and branch deletion
316
- run against the main repo (branches checked out in a worktree cannot be
317
- deleted from themselves):
318
-
319
- ```bash
320
- node <main-repo>/.agents/scripts/story-close.js \
321
- --story <storyId> --epic <epicId> --cwd <main-repo>
322
- ```
323
-
324
- In single-tree mode, `--cwd` defaults to `PROJECT_ROOT`. The script merges
325
- into `epic/<epicId>` (`--no-ff`), pushes the Epic branch, deletes the
326
- Story branch, reaps the worktree via `WorktreeManager.reap`, closes the
327
- Story to `agent::done`, runs `cascadeCompletion()`, and regenerates the
328
- Epic dispatch manifest (`--skip-dashboard` to suppress). Output is JSON
329
- with `ticketsClosed[]`, `cascadedTo[]`, and reap status.
330
-
331
- > **Why not GitHub auto-close?** `Closes #N` only fires on default-branch
332
- > merges; close fires the state writer explicitly.
333
-
334
- After close, upsert a terminal snapshot:
335
-
336
- ```bash
337
- node .agents/scripts/story-phase.js \
338
- --story <storyId> --epic <epicId> --branch story-<storyId> \
339
- --phase done
340
- ```
341
-
342
- ---
343
-
344
- ## Step 4 — Return contract (sub-agent path)
345
-
346
- When run as a sub-agent, return one JSON object:
347
-
348
- ```json
349
- {
350
- "storyId": <number>,
351
- "status": "done" | "blocked" | "failed",
352
- "phase": "init|implementing|closing|blocked|done",
353
- "branchDeleted": <boolean>,
354
- "blockerCommentId": <string|null>,
355
- "detail": <string|undefined>,
356
- "renderedBody": <string|undefined>
357
- }
358
- ```
359
-
360
- `status === 'done'` requires the Story closed and
361
- `branchDeleted: true`.
362
-
363
- > **Handoff discipline — report state, not process.** Populate the return
364
- > object with essential terminal state only: the Story branch, the closing
365
- > commit SHA, what changed, and what was verified (this maps onto the
366
- > existing `storyId` / `branchDeleted` / `phase` / `detail` /
367
- > `renderedBody` fields — do **not** add new envelope fields). Do not
368
- > narrate the steps you took to get there, and do not prescribe how
369
- > `/deliver`'s aggregator should do its job downstream. The parent
370
- > reads structured state from this envelope and the `story-run-progress`
371
- > snapshot; prose process commentary only bloats the hydrated prompt
372
- > (`delivery.maxTokenBudget` elision).
373
-
374
- `branchDeleted` is sourced from the `branchDeleted` field of the
375
- `story-close.js` result envelope. It is **independent** of
376
- `worktreeReap.status` — every reap outcome the close reports (including
377
- the Windows-only `stale-registry-entry`, which queues a pending-cleanup
378
- entry for the next drain) is operationally complete. `status: 'done'` is
379
- appropriate when the Story is closed and `branchDeleted: true`,
380
- regardless of the reap status.
381
-
382
- `renderedBody` is the **most recent** `renderedBody` returned by
383
- `story-phase.js` (typically the `phase: 'done'` snapshot at close,
384
- or the `phase: 'blocked'` snapshot on a blocker). The parent
385
- `/deliver` may inline a digest of this in its wave-level Notable
386
- section. When run interactively (no parent), omit it — the authoritative
387
- body lives in the `story-run-progress` snapshot the phase CLI upserted,
388
- and the chat already carries the per-transition progress lines from
389
- Step 1 / Step 3.
390
-
391
- ---
392
-
393
- ## Idempotence
394
-
395
- `story-init.js` re-prints the same `workCwd` without recreating the
396
- worktree. `story-run-progress` is upserted in place. `story-close.js`
397
- short-circuits when the Story branch is already merged and deleted. Re-
398
- running this helper against an already-closed Story is safe.
399
-
400
- ---
401
-
402
- ## Constraints
403
-
404
- - **MUST merge into `epic/<epicId>`, never `main`.** The Story branch's
405
- only integration target is the parent Epic's integration branch. If
406
- `story-close.js` short-circuits, no-ops, or otherwise fails to merge,
407
- **do NOT** fall back to `gh pr create --base main`, **do NOT** invoke
408
- `/deliver` on the same Story, and **do NOT** open a PR by
409
- hand against `main`. Such a PR orphans the change on `main` and forces
410
- a manual `git merge origin/main` back into `epic/<id>` to recover (the
411
- Epic #2880 wave-5 / Story #2960 friction note). The framework refuses
412
- these PRs via the `pr-base-guard` helper wired into every
413
- `createPullRequest` surface; a raw shell `gh pr create` is the only
414
- way to bypass it, and you must not. Diagnose the no-op (was the
415
- branch already merged? is the ticket already closed? is the worktree
416
- on the wrong HEAD?) and re-run close, or transition the Story to
417
- `agent::blocked` with a `friction` comment so the operator can
418
- resolve it.
419
- - **Never** push the Story branch directly to `main`. `story-close.js` is
420
- the only writer that integrates upstream, and only into `epic/<epicId>`.
421
- - **Never** merge across Story branches; cross-Story dependencies are
422
- resolved by wave ordering via `blocked by`.
423
- - **Always** `cd` into the `workCwd` returned by Step 0 before editing, and
424
- prefix every path-based Edit/Write/Read with that absolute `workCwd` root —
425
- the Edit tools ignore the shell cwd. The worktree pins the branch to
426
- `story-<storyId>`, so there is no need to re-check `git branch` before each
427
- commit.
428
- - **Always** upsert a `story-run-progress` snapshot at every phase
429
- transition. The wave aggregator depends on this comment, not labels.
430
- - **Always** pass `--cwd <main-repo>` to `story-close.js` when invoking
431
- from inside a worktree.
432
- - **Label transitions**: drive every `agent::*` state change through
433
- `node .agents/scripts/update-ticket-state.js --ticket <id> --state <state>`.
434
- This CLI is the authoritative mechanism — there is no separate
435
- state-mutation MCP server to degrade from (see
436
- [`.agents/instructions.md` § 1.D](../../instructions.md)).
@@ -1,125 +0,0 @@
1
- ---
2
- description: QA Epic-testing workflow — ingest the agent-driven QA harness sweep as Epic evidence
3
- ---
4
-
5
- # Epic Testing (helper)
6
-
7
- > **Helper module.** Not a slash command. Invoked from the QA gate during
8
- > `/deliver` or directly by an operator when the Epic-testing ticket
9
- > needs refreshed evidence. For ad-hoc acceptance runs use `/qa-run` —
10
- > this helper owns the Epic-evidence ticket lifecycle on top of it.
11
-
12
- Gather and attach the acceptance-suite evidence that gates Epic closure. The
13
- evidence artifact is the **agent-driven QA harness sweep report** produced by
14
- `/qa-run` (scenario pass/fail/blocked totals plus structured
15
- findings), **not** a hand-ticked markdown checklist.
16
-
17
- > **When to run**: During the QA phase of an Epic, after all Story merges
18
- > have landed on the Epic branch and before `/deliver`. Also run ad-hoc
19
- > when a regression is suspected mid-Epic.
20
- >
21
- > **Persona**: `qa-engineer` · **Skills**:
22
- > `stack/qa/gherkin-authoring`, `stack/qa/playwright-bdd`
23
-
24
- ## Step 0 — Resolve Context
25
-
26
- 1. Identify the Epic-testing ticket for the current Epic (the QA evidence
27
- ticket produced by Epic planning).
28
- 2. Confirm the Epic branch is green: all child Story branches merged, CI
29
- passing.
30
- 3. Decide the tag slice to run:
31
- - Epic-wide regression gate → `@smoke and @risk-high` (or the project's
32
- equivalent release gate expression).
33
- - Targeted domain pass → `@domain-<area>`.
34
- - Full acceptance sweep → omit the tag expression.
35
-
36
- The canonical taxonomy lives in `.agents/rules/gherkin-standards.md`. Do
37
- not invent new tags here.
38
-
39
- ## Step 1 — Execute the QA Harness Sweep
40
-
41
- Invoke `/qa-run` with the chosen selector:
42
-
43
- ```text
44
- /qa-run "tag:@smoke and @risk-high"
45
- ```
46
-
47
- The `/qa-run` workflow (`.agents/workflows/qa-run.md`) owns the
48
- execution mechanics — `qa` contract resolution, scenario selection, browser
49
- navigation, and finding capture. This workflow consumes its output.
50
-
51
- If the consuming project runs the suite through its own CI invocation rather
52
- than the slash command, treat the CI run as equivalent provided it produces
53
- the same scenario totals and structured findings.
54
-
55
- ## Step 2 — Collect the Evidence Artifact
56
-
57
- The evidence package for the Epic-testing ticket is:
58
-
59
- - **Sweep summary** — selector applied, scenario totals (passed / failed /
60
- blocked), and the commit SHA the sweep ran against. Required.
61
- - **Structured findings** — the `F#` findings bundle the harness emits
62
- (console / network / visual problems by surface). Required.
63
- - **Accessibility snapshots / traces** — for every failed or blocked scenario.
64
- Required on failure.
65
- - **Drafted follow-up bundle** — the proposed follow-up tickets awaiting
66
- operator sign-off, when the sweep surfaced findings.
67
-
68
- Store the artifacts where your project's evidence convention dictates (CI
69
- artifact store, object storage, or attached to the ticket directly). Link —
70
- do not paste — large artifacts.
71
-
72
- ## Step 3 — Attach and Transition
73
-
74
- 1. Comment on the Epic-testing ticket with:
75
- - The sweep summary from Step 2.
76
- - Links (or attachments) to the structured findings, accessibility
77
- snapshots, and any traces.
78
- - The commit SHA the sweep executed against.
79
- 2. If every scenario passed (no `failed`, no `blocked`), transition the
80
- Epic-testing ticket to `agent::done`.
81
- 3. If any scenario failed or is blocked, leave the ticket in its current
82
- state and open a follow-up ticket per failure with:
83
- - Scenario name and `.feature` file path.
84
- - One-line symptom.
85
- - Link to the failing scenario's snapshot or trace.
86
-
87
- Do not close the Epic-testing ticket on a failed run. `/deliver`
88
- depends on green evidence.
89
-
90
- ## Deprecated — Markdown Checklist Flow
91
-
92
- Earlier revisions of this workflow asked the QA reviewer to tick items in a
93
- hand-maintained markdown checklist (`epic-<id>/test-plan.md`) and attach
94
- that file as evidence. **That flow is deprecated.** Reasons:
95
-
96
- - Hand-ticked checklists drift from the code and cannot be re-executed.
97
- - They do not capture scenario-level pass/fail state, traces, or the SHA the
98
- run targeted.
99
- - They are not machine-readable, so downstream aggregation and trend
100
- reporting are impossible.
101
-
102
- The QA harness sweep replaces the checklist as the single evidence artifact.
103
- Projects still maintaining a checklist should migrate by authoring the
104
- equivalent scenarios in Gherkin (see the `stack/qa/gherkin-authoring` skill)
105
- and deleting the checklist in the same change.
106
-
107
- ## Constraints
108
-
109
- - **Never** substitute a hand-authored checklist or prose summary for the
110
- harness sweep. The evidence must be the output of an actual run.
111
- - **Never** close the Epic-testing ticket while any scenario is `failed` or
112
- `blocked`.
113
- - **Always** record the commit SHA the sweep ran against, so the evidence is
114
- pinned to a verifiable tree state.
115
- - **Always** link a snapshot or trace for failed scenarios; a failure without
116
- evidence is not actionable.
117
-
118
- ## Cross-References
119
-
120
- - Execution mechanics: `.agents/workflows/qa-run.md`.
121
- - Scenario authoring rules: `.agents/rules/gherkin-standards.md`.
122
- - Runner / fixture / trace conventions:
123
- `.agents/skills/stack/qa/playwright-bdd/SKILL.md`.
124
- - Tier responsibilities (unit / contract / acceptance):
125
- `.agents/rules/testing-standards.md`.