mandrel 1.57.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 (843) hide show
  1. package/.agents/README.md +954 -0
  2. package/.agents/docs/SDLC.md +1420 -0
  3. package/.agents/docs/agentrc-reference.json +278 -0
  4. package/.agents/docs/configuration.md +1040 -0
  5. package/.agents/docs/workflows.md +59 -0
  6. package/.agents/instructions.md +384 -0
  7. package/.agents/personas/architect.md +107 -0
  8. package/.agents/personas/devops-engineer.md +36 -0
  9. package/.agents/personas/engineer-mobile.md +119 -0
  10. package/.agents/personas/engineer-web.md +110 -0
  11. package/.agents/personas/engineer.md +90 -0
  12. package/.agents/personas/product.md +88 -0
  13. package/.agents/personas/project-manager.md +110 -0
  14. package/.agents/personas/qa-engineer.md +91 -0
  15. package/.agents/personas/refactorer.md +110 -0
  16. package/.agents/personas/security-engineer.md +112 -0
  17. package/.agents/personas/sre.md +86 -0
  18. package/.agents/personas/technical-writer.md +100 -0
  19. package/.agents/personas/ux-designer.md +95 -0
  20. package/.agents/rules/api-conventions.md +75 -0
  21. package/.agents/rules/changelog-style.md +238 -0
  22. package/.agents/rules/gherkin-standards.md +146 -0
  23. package/.agents/rules/git-conventions.md +146 -0
  24. package/.agents/rules/orchestration-error-handling.md +35 -0
  25. package/.agents/rules/security-baseline.md +92 -0
  26. package/.agents/rules/shell-conventions.md +70 -0
  27. package/.agents/rules/test-seams.md +59 -0
  28. package/.agents/rules/testing-standards.md +177 -0
  29. package/.agents/runtime-deps.json +18 -0
  30. package/.agents/schemas/acceptance-eval-verdict.schema.json +93 -0
  31. package/.agents/schemas/agentrc.schema.json +1583 -0
  32. package/.agents/schemas/audit-results.schema.json +69 -0
  33. package/.agents/schemas/audit-rules.json +134 -0
  34. package/.agents/schemas/audit-rules.schema.json +69 -0
  35. package/.agents/schemas/baselines/baseline-envelope.schema.json +44 -0
  36. package/.agents/schemas/baselines/bundle-size.schema.json +47 -0
  37. package/.agents/schemas/baselines/coverage.schema.json +50 -0
  38. package/.agents/schemas/baselines/crap.schema.json +52 -0
  39. package/.agents/schemas/baselines/duplication.schema.json +62 -0
  40. package/.agents/schemas/baselines/lighthouse.schema.json +59 -0
  41. package/.agents/schemas/baselines/lint.schema.json +47 -0
  42. package/.agents/schemas/baselines/maintainability.schema.json +71 -0
  43. package/.agents/schemas/baselines/mutation.schema.json +52 -0
  44. package/.agents/schemas/crap-baseline.schema.json +57 -0
  45. package/.agents/schemas/crap-report.schema.json +102 -0
  46. package/.agents/schemas/dispatch-manifest.json +232 -0
  47. package/.agents/schemas/epic-perf-report.schema.json +89 -0
  48. package/.agents/schemas/epic-spec.schema.json +183 -0
  49. package/.agents/schemas/friction-event.schema.json +56 -0
  50. package/.agents/schemas/lifecycle/README.md +18 -0
  51. package/.agents/schemas/lifecycle/acceptance.reconcile.failed.schema.json +13 -0
  52. package/.agents/schemas/lifecycle/acceptance.reconcile.ok.schema.json +13 -0
  53. package/.agents/schemas/lifecycle/acceptance.reconcile.skipped.schema.json +13 -0
  54. package/.agents/schemas/lifecycle/acceptance.reconcile.start.schema.json +12 -0
  55. package/.agents/schemas/lifecycle/acceptance.reconcile.waived.schema.json +13 -0
  56. package/.agents/schemas/lifecycle/checkpoint.written.schema.json +13 -0
  57. package/.agents/schemas/lifecycle/close-validate.end.schema.json +18 -0
  58. package/.agents/schemas/lifecycle/close-validate.start.schema.json +13 -0
  59. package/.agents/schemas/lifecycle/code-review.end.schema.json +30 -0
  60. package/.agents/schemas/lifecycle/code-review.start.schema.json +12 -0
  61. package/.agents/schemas/lifecycle/epic.automerge.end.schema.json +14 -0
  62. package/.agents/schemas/lifecycle/epic.automerge.start.schema.json +13 -0
  63. package/.agents/schemas/lifecycle/epic.blocked.schema.json +13 -0
  64. package/.agents/schemas/lifecycle/epic.cleanup.end.schema.json +12 -0
  65. package/.agents/schemas/lifecycle/epic.cleanup.start.schema.json +12 -0
  66. package/.agents/schemas/lifecycle/epic.close.end.schema.json +12 -0
  67. package/.agents/schemas/lifecycle/epic.complete.schema.json +13 -0
  68. package/.agents/schemas/lifecycle/epic.finalize.end.schema.json +13 -0
  69. package/.agents/schemas/lifecycle/epic.finalize.start.schema.json +12 -0
  70. package/.agents/schemas/lifecycle/epic.merge.armed.schema.json +13 -0
  71. package/.agents/schemas/lifecycle/epic.merge.blocked.schema.json +14 -0
  72. package/.agents/schemas/lifecycle/epic.merge.confirmed.schema.json +17 -0
  73. package/.agents/schemas/lifecycle/epic.merge.ready.schema.json +15 -0
  74. package/.agents/schemas/lifecycle/epic.plan.end.schema.json +18 -0
  75. package/.agents/schemas/lifecycle/epic.plan.start.schema.json +12 -0
  76. package/.agents/schemas/lifecycle/epic.snapshot.end.schema.json +16 -0
  77. package/.agents/schemas/lifecycle/epic.snapshot.start.schema.json +12 -0
  78. package/.agents/schemas/lifecycle/epic.watch.end.schema.json +28 -0
  79. package/.agents/schemas/lifecycle/epic.watch.start.schema.json +16 -0
  80. package/.agents/schemas/lifecycle/intervention.recorded.schema.json +15 -0
  81. package/.agents/schemas/lifecycle/ledger-record.schema.json +59 -0
  82. package/.agents/schemas/lifecycle/notification.emitted.schema.json +18 -0
  83. package/.agents/schemas/lifecycle/pr.created.schema.json +14 -0
  84. package/.agents/schemas/lifecycle/retro.end.schema.json +16 -0
  85. package/.agents/schemas/lifecycle/retro.start.schema.json +12 -0
  86. package/.agents/schemas/lifecycle/story.blocked.schema.json +13 -0
  87. package/.agents/schemas/lifecycle/story.dispatch.end.schema.json +17 -0
  88. package/.agents/schemas/lifecycle/story.dispatch.start.schema.json +15 -0
  89. package/.agents/schemas/lifecycle/story.heartbeat.schema.json +20 -0
  90. package/.agents/schemas/lifecycle/story.merged.schema.json +13 -0
  91. package/.agents/schemas/mi-report.schema.json +58 -0
  92. package/.agents/schemas/model-attribution.schema.json +49 -0
  93. package/.agents/schemas/qa-finding.schema.json +133 -0
  94. package/.agents/schemas/qa-ledger.schema.json +89 -0
  95. package/.agents/schemas/risk-verdict.schema.json +53 -0
  96. package/.agents/schemas/signal-event.schema.json +58 -0
  97. package/.agents/schemas/skill.schema.json +31 -0
  98. package/.agents/schemas/skills-index.schema.json +81 -0
  99. package/.agents/schemas/story-perf-summary.schema.json +73 -0
  100. package/.agents/schemas/validation-evidence.schema.json +78 -0
  101. package/.agents/scripts/README.md +93 -0
  102. package/.agents/scripts/acceptance-eval.js +284 -0
  103. package/.agents/scripts/acceptance-spec-reconciler.js +556 -0
  104. package/.agents/scripts/agents-bootstrap-github.js +634 -0
  105. package/.agents/scripts/analyze-execution.js +369 -0
  106. package/.agents/scripts/assert-branch.js +83 -0
  107. package/.agents/scripts/audit-labels-bootstrap.js +253 -0
  108. package/.agents/scripts/audit-to-stories.js +257 -0
  109. package/.agents/scripts/bootstrap.js +1378 -0
  110. package/.agents/scripts/check-baselines.js +81 -0
  111. package/.agents/scripts/check-dead-exports.js +311 -0
  112. package/.agents/scripts/check-doc-links.js +401 -0
  113. package/.agents/scripts/check-gherkin-placeholders.js +663 -0
  114. package/.agents/scripts/check-lifecycle-doc-drift.js +402 -0
  115. package/.agents/scripts/check-lifecycle-lint.js +379 -0
  116. package/.agents/scripts/check-prepush-recovery.js +90 -0
  117. package/.agents/scripts/check-windows-git-perf.js +138 -0
  118. package/.agents/scripts/cleanup-repo-test-temp.js +67 -0
  119. package/.agents/scripts/coverage-capture.js +112 -0
  120. package/.agents/scripts/detect-merges.js +111 -0
  121. package/.agents/scripts/diagnose-friction.js +257 -0
  122. package/.agents/scripts/diagnose.js +240 -0
  123. package/.agents/scripts/dispatcher.js +295 -0
  124. package/.agents/scripts/drain-pending-cleanup.js +147 -0
  125. package/.agents/scripts/epic-audit-prepare.js +419 -0
  126. package/.agents/scripts/epic-audit-recheck.js +241 -0
  127. package/.agents/scripts/epic-deliver-note-intervention.js +192 -0
  128. package/.agents/scripts/epic-deliver-preflight.js +407 -0
  129. package/.agents/scripts/epic-deliver-prepare.js +383 -0
  130. package/.agents/scripts/epic-execute-record-wave.js +463 -0
  131. package/.agents/scripts/epic-plan-clarity.js +201 -0
  132. package/.agents/scripts/epic-plan-decompose.js +79 -0
  133. package/.agents/scripts/epic-plan-healthcheck.js +363 -0
  134. package/.agents/scripts/epic-plan-spec-validate.js +111 -0
  135. package/.agents/scripts/epic-plan-spec.js +198 -0
  136. package/.agents/scripts/epic-reconcile.js +637 -0
  137. package/.agents/scripts/evidence-gate.js +235 -0
  138. package/.agents/scripts/generate-config-docs.js +516 -0
  139. package/.agents/scripts/generate-lifecycle-docs.js +224 -0
  140. package/.agents/scripts/generate-skills-index.js +252 -0
  141. package/.agents/scripts/generate-workflows-doc.js +168 -0
  142. package/.agents/scripts/git-cleanup.js +124 -0
  143. package/.agents/scripts/git-pr-quality-gate.js +203 -0
  144. package/.agents/scripts/git-rebase-and-resolve.js +234 -0
  145. package/.agents/scripts/hierarchy-gate.js +176 -0
  146. package/.agents/scripts/hydrate-context.js +179 -0
  147. package/.agents/scripts/install-matrix-assert.js +282 -0
  148. package/.agents/scripts/lib/Graph.js +326 -0
  149. package/.agents/scripts/lib/ITicketingProvider.js +349 -0
  150. package/.agents/scripts/lib/Logger.js +194 -0
  151. package/.agents/scripts/lib/audit-suite/cli.js +64 -0
  152. package/.agents/scripts/lib/audit-suite/findings.js +164 -0
  153. package/.agents/scripts/lib/audit-suite/frontmatter-lint.js +32 -0
  154. package/.agents/scripts/lib/audit-suite/frontmatter.js +110 -0
  155. package/.agents/scripts/lib/audit-suite/index.js +22 -0
  156. package/.agents/scripts/lib/audit-suite/runner.js +233 -0
  157. package/.agents/scripts/lib/audit-suite/selector.js +235 -0
  158. package/.agents/scripts/lib/audit-suite/substitutions.js +124 -0
  159. package/.agents/scripts/lib/audit-suite/workflow-loader.js +49 -0
  160. package/.agents/scripts/lib/audit-to-stories/build-story-body.js +130 -0
  161. package/.agents/scripts/lib/audit-to-stories/dedupe-against-github.js +114 -0
  162. package/.agents/scripts/lib/audit-to-stories/finding-adapter.js +93 -0
  163. package/.agents/scripts/lib/audit-to-stories/group-findings.js +265 -0
  164. package/.agents/scripts/lib/audit-to-stories/parse-audit-md.js +246 -0
  165. package/.agents/scripts/lib/audit-to-stories/seed-epic-from-findings.js +160 -0
  166. package/.agents/scripts/lib/auto-refresh-baselines.js +308 -0
  167. package/.agents/scripts/lib/baseline-loader.js +0 -0
  168. package/.agents/scripts/lib/baseline-schema-registry.js +69 -0
  169. package/.agents/scripts/lib/baseline-snapshot.js +716 -0
  170. package/.agents/scripts/lib/baselines/component-matcher.js +21 -0
  171. package/.agents/scripts/lib/baselines/components.js +126 -0
  172. package/.agents/scripts/lib/baselines/diff-scope-cli.js +203 -0
  173. package/.agents/scripts/lib/baselines/duplication-scanner.js +220 -0
  174. package/.agents/scripts/lib/baselines/env-overrides.js +129 -0
  175. package/.agents/scripts/lib/baselines/envelope.js +368 -0
  176. package/.agents/scripts/lib/baselines/exit-codes.js +89 -0
  177. package/.agents/scripts/lib/baselines/git-base.js +0 -0
  178. package/.agents/scripts/lib/baselines/kernel.js +111 -0
  179. package/.agents/scripts/lib/baselines/kinds/_shared-metric.js +220 -0
  180. package/.agents/scripts/lib/baselines/kinds/bundle-size.js +157 -0
  181. package/.agents/scripts/lib/baselines/kinds/coverage.js +194 -0
  182. package/.agents/scripts/lib/baselines/kinds/crap.js +555 -0
  183. package/.agents/scripts/lib/baselines/kinds/duplication.js +197 -0
  184. package/.agents/scripts/lib/baselines/kinds/lighthouse.js +185 -0
  185. package/.agents/scripts/lib/baselines/kinds/lint.js +172 -0
  186. package/.agents/scripts/lib/baselines/kinds/maintainability.js +340 -0
  187. package/.agents/scripts/lib/baselines/kinds/mutation.js +153 -0
  188. package/.agents/scripts/lib/baselines/path-canon.js +279 -0
  189. package/.agents/scripts/lib/baselines/preview-gates.js +298 -0
  190. package/.agents/scripts/lib/baselines/reader.js +321 -0
  191. package/.agents/scripts/lib/baselines/refresh-service.js +733 -0
  192. package/.agents/scripts/lib/baselines/scope.js +291 -0
  193. package/.agents/scripts/lib/baselines/writer.js +312 -0
  194. package/.agents/scripts/lib/bdd-runner-detect.js +417 -0
  195. package/.agents/scripts/lib/bdd-scenario-scanner.js +310 -0
  196. package/.agents/scripts/lib/bootstrap/baselines-layout-migration.js +202 -0
  197. package/.agents/scripts/lib/bootstrap/branch-protection.js +222 -0
  198. package/.agents/scripts/lib/bootstrap/ci-workflow-template.js +171 -0
  199. package/.agents/scripts/lib/bootstrap/commit-push.js +146 -0
  200. package/.agents/scripts/lib/bootstrap/gh-list.js +153 -0
  201. package/.agents/scripts/lib/bootstrap/gh-preflight.js +306 -0
  202. package/.agents/scripts/lib/bootstrap/hitl-confirm.js +89 -0
  203. package/.agents/scripts/lib/bootstrap/install-ledger.js +174 -0
  204. package/.agents/scripts/lib/bootstrap/manifest.js +272 -0
  205. package/.agents/scripts/lib/bootstrap/merge-methods.js +108 -0
  206. package/.agents/scripts/lib/bootstrap/preflight.js +195 -0
  207. package/.agents/scripts/lib/bootstrap/project-bootstrap.js +801 -0
  208. package/.agents/scripts/lib/bootstrap/prompt.js +480 -0
  209. package/.agents/scripts/lib/bootstrap/quality-bootstrap.js +370 -0
  210. package/.agents/scripts/lib/bootstrap/summary.js +75 -0
  211. package/.agents/scripts/lib/bootstrap/workflow-audit.js +256 -0
  212. package/.agents/scripts/lib/branch-name-guard.js +98 -0
  213. package/.agents/scripts/lib/c8-cli-path.js +21 -0
  214. package/.agents/scripts/lib/changed-files.js +184 -0
  215. package/.agents/scripts/lib/checks/baseline-drift-main-checkout.js +104 -0
  216. package/.agents/scripts/lib/checks/core-bare-clean.js +48 -0
  217. package/.agents/scripts/lib/checks/epic-merge-lock-stale.js +54 -0
  218. package/.agents/scripts/lib/checks/index.js +288 -0
  219. package/.agents/scripts/lib/checks/push-hook-parity.js +106 -0
  220. package/.agents/scripts/lib/checks/stale-origin-epic.js +49 -0
  221. package/.agents/scripts/lib/checks/state.js +558 -0
  222. package/.agents/scripts/lib/checks/story-init-not-backgrounded.js +186 -0
  223. package/.agents/scripts/lib/checks/subagent-agent-tool-required.js +182 -0
  224. package/.agents/scripts/lib/checks/windows-coverage-noise-floor.js +92 -0
  225. package/.agents/scripts/lib/checks/worktree-bootstrap-env.js +81 -0
  226. package/.agents/scripts/lib/checks/worktree-residue-biome.js +55 -0
  227. package/.agents/scripts/lib/cli/parse-numeric.js +60 -0
  228. package/.agents/scripts/lib/cli/standard-args.js +351 -0
  229. package/.agents/scripts/lib/cli-args.js +286 -0
  230. package/.agents/scripts/lib/cli-utils.js +69 -0
  231. package/.agents/scripts/lib/close-validation/projections/head-sha.js +44 -0
  232. package/.agents/scripts/lib/close-validation/projections/inputs.js +86 -0
  233. package/.agents/scripts/lib/close-validation/projections/maintainability.js +286 -0
  234. package/.agents/scripts/lib/close-validation.js +897 -0
  235. package/.agents/scripts/lib/codebase-snapshot.js +513 -0
  236. package/.agents/scripts/lib/command-header.js +33 -0
  237. package/.agents/scripts/lib/config/acceptance-eval.js +95 -0
  238. package/.agents/scripts/lib/config/baselines.js +60 -0
  239. package/.agents/scripts/lib/config/ci.js +30 -0
  240. package/.agents/scripts/lib/config/commands.js +36 -0
  241. package/.agents/scripts/lib/config/defaults.js +119 -0
  242. package/.agents/scripts/lib/config/explain.js +348 -0
  243. package/.agents/scripts/lib/config/gates/bundle-size.schema.js +23 -0
  244. package/.agents/scripts/lib/config/gates/coverage.schema.js +18 -0
  245. package/.agents/scripts/lib/config/gates/crap.schema.js +33 -0
  246. package/.agents/scripts/lib/config/gates/duplication.schema.js +26 -0
  247. package/.agents/scripts/lib/config/gates/index.js +36 -0
  248. package/.agents/scripts/lib/config/gates/lighthouse.schema.js +23 -0
  249. package/.agents/scripts/lib/config/gates/lint.schema.js +9 -0
  250. package/.agents/scripts/lib/config/gates/maintainability.schema.js +20 -0
  251. package/.agents/scripts/lib/config/gates/mutation.schema.js +12 -0
  252. package/.agents/scripts/lib/config/gates/shared.js +117 -0
  253. package/.agents/scripts/lib/config/github.js +122 -0
  254. package/.agents/scripts/lib/config/lifecycle.js +40 -0
  255. package/.agents/scripts/lib/config/limits.js +211 -0
  256. package/.agents/scripts/lib/config/paths.js +73 -0
  257. package/.agents/scripts/lib/config/preflight.js +58 -0
  258. package/.agents/scripts/lib/config/quality.js +665 -0
  259. package/.agents/scripts/lib/config/retro.js +77 -0
  260. package/.agents/scripts/lib/config/runners.js +105 -0
  261. package/.agents/scripts/lib/config/runtime.js +167 -0
  262. package/.agents/scripts/lib/config/shared.js +46 -0
  263. package/.agents/scripts/lib/config/sync-agentrc.js +243 -0
  264. package/.agents/scripts/lib/config/temp-paths.js +373 -0
  265. package/.agents/scripts/lib/config/validate-orchestration.js +81 -0
  266. package/.agents/scripts/lib/config/worktree-isolation.js +80 -0
  267. package/.agents/scripts/lib/config-resolver.js +298 -0
  268. package/.agents/scripts/lib/config-schema-shared.js +32 -0
  269. package/.agents/scripts/lib/config-schema.js +20 -0
  270. package/.agents/scripts/lib/config-settings-schema-delivery.js +332 -0
  271. package/.agents/scripts/lib/config-settings-schema-quality.js +165 -0
  272. package/.agents/scripts/lib/config-settings-schema.js +420 -0
  273. package/.agents/scripts/lib/coverage-baseline.js +352 -0
  274. package/.agents/scripts/lib/coverage-capture.js +195 -0
  275. package/.agents/scripts/lib/coverage-utils.js +239 -0
  276. package/.agents/scripts/lib/cpu-pool.js +223 -0
  277. package/.agents/scripts/lib/crap-engine.js +119 -0
  278. package/.agents/scripts/lib/crap-utils.js +479 -0
  279. package/.agents/scripts/lib/degraded-mode.js +69 -0
  280. package/.agents/scripts/lib/dependency-parser.js +129 -0
  281. package/.agents/scripts/lib/duplicate-search.js +189 -0
  282. package/.agents/scripts/lib/dynamic-workflow/architecture-report-contract.js +70 -0
  283. package/.agents/scripts/lib/dynamic-workflow/audit-orchestrator.js +197 -0
  284. package/.agents/scripts/lib/dynamic-workflow/capability.js +396 -0
  285. package/.agents/scripts/lib/dynamic-workflow/clean-code-report-contract.js +80 -0
  286. package/.agents/scripts/lib/dynamic-workflow/performance-report-contract.js +72 -0
  287. package/.agents/scripts/lib/dynamic-workflow/quality-report-contract.js +90 -0
  288. package/.agents/scripts/lib/dynamic-workflow/report-contract-core.js +43 -0
  289. package/.agents/scripts/lib/dynamic-workflow/security-report-contract.js +83 -0
  290. package/.agents/scripts/lib/env-loader.js +52 -0
  291. package/.agents/scripts/lib/epic-merge-lock.js +239 -0
  292. package/.agents/scripts/lib/epic-plan-clarity.js +142 -0
  293. package/.agents/scripts/lib/epic-plan-ideation.js +228 -0
  294. package/.agents/scripts/lib/error-redactor.js +125 -0
  295. package/.agents/scripts/lib/errors/index.js +67 -0
  296. package/.agents/scripts/lib/feedback-loop/audit-results-graduator.js +230 -0
  297. package/.agents/scripts/lib/feedback-loop/code-review-graduator.js +207 -0
  298. package/.agents/scripts/lib/feedback-loop/graduator-core.js +421 -0
  299. package/.agents/scripts/lib/feedback-loop/memory-freshness.js +480 -0
  300. package/.agents/scripts/lib/feedback-loop/prior-feedback-fetcher.js +229 -0
  301. package/.agents/scripts/lib/findings/classify-finding.js +195 -0
  302. package/.agents/scripts/lib/findings/promote-finding.js +353 -0
  303. package/.agents/scripts/lib/findings/route-finding.js +283 -0
  304. package/.agents/scripts/lib/findings/semantic-issue-search.js +179 -0
  305. package/.agents/scripts/lib/findings/severity.js +102 -0
  306. package/.agents/scripts/lib/gates/baseline-store.js +106 -0
  307. package/.agents/scripts/lib/gates/friction.js +43 -0
  308. package/.agents/scripts/lib/gh-exec.js +553 -0
  309. package/.agents/scripts/lib/git/cached-fetch.js +0 -0
  310. package/.agents/scripts/lib/git/sync-from-base.js +162 -0
  311. package/.agents/scripts/lib/git-branch-cleanup.js +213 -0
  312. package/.agents/scripts/lib/git-branch-lifecycle.js +353 -0
  313. package/.agents/scripts/lib/git-merge-orchestrator.js +261 -0
  314. package/.agents/scripts/lib/git-utils.js +363 -0
  315. package/.agents/scripts/lib/github-url.js +29 -0
  316. package/.agents/scripts/lib/install-cmd-parser.js +51 -0
  317. package/.agents/scripts/lib/issue-link-parser.js +74 -0
  318. package/.agents/scripts/lib/json-utils.js +60 -0
  319. package/.agents/scripts/lib/label-constants.js +169 -0
  320. package/.agents/scripts/lib/label-taxonomy.js +200 -0
  321. package/.agents/scripts/lib/maintainability-engine.js +164 -0
  322. package/.agents/scripts/lib/maintainability-utils.js +343 -0
  323. package/.agents/scripts/lib/mandrel-catalog.js +170 -0
  324. package/.agents/scripts/lib/mutation/baseline-snapshot.js +238 -0
  325. package/.agents/scripts/lib/mutation/config-detector.js +119 -0
  326. package/.agents/scripts/lib/mutation/stryker-runner.js +306 -0
  327. package/.agents/scripts/lib/mutation/survivor-report.js +160 -0
  328. package/.agents/scripts/lib/notifications/notifier.js +75 -0
  329. package/.agents/scripts/lib/observability/active-story-env.js +182 -0
  330. package/.agents/scripts/lib/observability/baseline-refresh-rate.js +221 -0
  331. package/.agents/scripts/lib/observability/perf-aggregator.js +887 -0
  332. package/.agents/scripts/lib/observability/perf-report-readers.js +319 -0
  333. package/.agents/scripts/lib/observability/perf-report-render.js +182 -0
  334. package/.agents/scripts/lib/observability/signals-writer.js +296 -0
  335. package/.agents/scripts/lib/observability/source-classifier.js +103 -0
  336. package/.agents/scripts/lib/observability/tool-trace-hook.js +417 -0
  337. package/.agents/scripts/lib/onboard/detect-stack.js +300 -0
  338. package/.agents/scripts/lib/onboard/scaffold-docs.js +128 -0
  339. package/.agents/scripts/lib/orchestration/acceptance-eval-decision.js +173 -0
  340. package/.agents/scripts/lib/orchestration/cascade-grouping.js +275 -0
  341. package/.agents/scripts/lib/orchestration/check-baselines/phases/compare.js +131 -0
  342. package/.agents/scripts/lib/orchestration/check-baselines/phases/evaluate.js +80 -0
  343. package/.agents/scripts/lib/orchestration/check-baselines/phases/floors.js +132 -0
  344. package/.agents/scripts/lib/orchestration/check-baselines/phases/friction.js +142 -0
  345. package/.agents/scripts/lib/orchestration/check-baselines/phases/parse-args.js +149 -0
  346. package/.agents/scripts/lib/orchestration/check-baselines/phases/pipeline.js +158 -0
  347. package/.agents/scripts/lib/orchestration/check-baselines/phases/report.js +56 -0
  348. package/.agents/scripts/lib/orchestration/code-review.js +652 -0
  349. package/.agents/scripts/lib/orchestration/column-sync.js +286 -0
  350. package/.agents/scripts/lib/orchestration/context-envelope.js +280 -0
  351. package/.agents/scripts/lib/orchestration/context-hydration-engine.js +581 -0
  352. package/.agents/scripts/lib/orchestration/dependency-analyzer.js +88 -0
  353. package/.agents/scripts/lib/orchestration/detectors-phase.js +188 -0
  354. package/.agents/scripts/lib/orchestration/dispatch-engine.js +144 -0
  355. package/.agents/scripts/lib/orchestration/dispatch-pipeline.js +206 -0
  356. package/.agents/scripts/lib/orchestration/doc-reader.js +94 -0
  357. package/.agents/scripts/lib/orchestration/epic-cleanup.js +473 -0
  358. package/.agents/scripts/lib/orchestration/epic-deliver-lease-guard.js +310 -0
  359. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/cli.js +167 -0
  360. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/context.js +151 -0
  361. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/creation.js +74 -0
  362. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/dag.js +78 -0
  363. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/diagnostics.js +72 -0
  364. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/persist-helpers.js +155 -0
  365. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/persist.js +321 -0
  366. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/planning-artifacts.js +75 -0
  367. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/reconcile-spawn.js +86 -0
  368. package/.agents/scripts/lib/orchestration/epic-plan-lease-guard.js +235 -0
  369. package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/authoring-context.js +197 -0
  370. package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/cli-args.js +48 -0
  371. package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/drain.js +94 -0
  372. package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/plan-epic.js +414 -0
  373. package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/prompts.js +55 -0
  374. package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/risk-verdict.js +105 -0
  375. package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/run-spec-phase.js +235 -0
  376. package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/spec-freshness.js +120 -0
  377. package/.agents/scripts/lib/orchestration/epic-plan-state-store.js +118 -0
  378. package/.agents/scripts/lib/orchestration/epic-run-state-store.js +295 -0
  379. package/.agents/scripts/lib/orchestration/epic-runner/concurrency-gate.js +186 -0
  380. package/.agents/scripts/lib/orchestration/epic-runner/deliver-phases.js +50 -0
  381. package/.agents/scripts/lib/orchestration/epic-runner/phases/build-wave-dag.js +146 -0
  382. package/.agents/scripts/lib/orchestration/epic-runner/phases/snapshot.js +110 -0
  383. package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter/composition.js +392 -0
  384. package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter/signals.js +217 -0
  385. package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter/transport.js +235 -0
  386. package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter.js +69 -0
  387. package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/_bullet-format.js +32 -0
  388. package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/crap-drift.js +291 -0
  389. package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/maintainability-drift.js +175 -0
  390. package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/stalled-worktree.js +37 -0
  391. package/.agents/scripts/lib/orchestration/epic-runner/story-launcher.js +127 -0
  392. package/.agents/scripts/lib/orchestration/epic-runner/story-run-progress-writer.js +400 -0
  393. package/.agents/scripts/lib/orchestration/epic-runner/sub-agent-return.js +285 -0
  394. package/.agents/scripts/lib/orchestration/epic-runner/wave-scheduler.js +66 -0
  395. package/.agents/scripts/lib/orchestration/epic-spec-reconciler-apply.js +797 -0
  396. package/.agents/scripts/lib/orchestration/epic-spec-reconciler-diff.js +619 -0
  397. package/.agents/scripts/lib/orchestration/epic-spec-reconciler-discriminator.js +335 -0
  398. package/.agents/scripts/lib/orchestration/epic-spec-reconciler-format.js +230 -0
  399. package/.agents/scripts/lib/orchestration/epic-spec-reconciler-ops.js +363 -0
  400. package/.agents/scripts/lib/orchestration/error-journal.js +139 -0
  401. package/.agents/scripts/lib/orchestration/file-assumption-enum.js +31 -0
  402. package/.agents/scripts/lib/orchestration/file-assumptions.js +506 -0
  403. package/.agents/scripts/lib/orchestration/finalize/close-planning-tickets.js +116 -0
  404. package/.agents/scripts/lib/orchestration/finalize/open-or-locate-pr.js +241 -0
  405. package/.agents/scripts/lib/orchestration/finalize/post-handoff-comment.js +489 -0
  406. package/.agents/scripts/lib/orchestration/finalize/sanitize-skip-ci.js +88 -0
  407. package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-reap.js +219 -0
  408. package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches.js +309 -0
  409. package/.agents/scripts/lib/orchestration/git-cleanup/phases/cli.js +99 -0
  410. package/.agents/scripts/lib/orchestration/git-cleanup/phases/fast-forward.js +123 -0
  411. package/.agents/scripts/lib/orchestration/git-cleanup/phases/filters.js +57 -0
  412. package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes-ff.js +114 -0
  413. package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes.js +426 -0
  414. package/.agents/scripts/lib/orchestration/git-cleanup/phases/parse-args.js +84 -0
  415. package/.agents/scripts/lib/orchestration/git-cleanup/phases/phase-drivers.js +365 -0
  416. package/.agents/scripts/lib/orchestration/git-cleanup/phases/prompts.js +72 -0
  417. package/.agents/scripts/lib/orchestration/git-cleanup/phases/prune.js +69 -0
  418. package/.agents/scripts/lib/orchestration/git-cleanup/phases/render.js +214 -0
  419. package/.agents/scripts/lib/orchestration/git-cleanup/phases/stashes.js +137 -0
  420. package/.agents/scripts/lib/orchestration/label-transitions.js +43 -0
  421. package/.agents/scripts/lib/orchestration/lifecycle/bus.js +309 -0
  422. package/.agents/scripts/lib/orchestration/lifecycle/emit-story-dispatch-end.js +147 -0
  423. package/.agents/scripts/lib/orchestration/lifecycle/emit-story-heartbeat.js +155 -0
  424. package/.agents/scripts/lib/orchestration/lifecycle/ledger-writer.js +226 -0
  425. package/.agents/scripts/lib/orchestration/lifecycle/listeners/README.md +69 -0
  426. package/.agents/scripts/lib/orchestration/lifecycle/listeners/acceptance-reconciler.js +378 -0
  427. package/.agents/scripts/lib/orchestration/lifecycle/listeners/automerge-armer.js +248 -0
  428. package/.agents/scripts/lib/orchestration/lifecycle/listeners/automerge-predicate.js +527 -0
  429. package/.agents/scripts/lib/orchestration/lifecycle/listeners/branch-cleaner.js +259 -0
  430. package/.agents/scripts/lib/orchestration/lifecycle/listeners/checkpoint-pointer-writer.js +278 -0
  431. package/.agents/scripts/lib/orchestration/lifecycle/listeners/cleaner.js +355 -0
  432. package/.agents/scripts/lib/orchestration/lifecycle/listeners/finalizer.js +647 -0
  433. package/.agents/scripts/lib/orchestration/lifecycle/listeners/index.js +331 -0
  434. package/.agents/scripts/lib/orchestration/lifecycle/listeners/intervention-recorder.js +140 -0
  435. package/.agents/scripts/lib/orchestration/lifecycle/listeners/merge-watcher.js +421 -0
  436. package/.agents/scripts/lib/orchestration/lifecycle/listeners/notify-dispatcher.js +168 -0
  437. package/.agents/scripts/lib/orchestration/lifecycle/listeners/watcher.js +668 -0
  438. package/.agents/scripts/lib/orchestration/lifecycle/trace-logger.js +322 -0
  439. package/.agents/scripts/lib/orchestration/lint-baseline-service.js +114 -0
  440. package/.agents/scripts/lib/orchestration/manifest-builder.js +216 -0
  441. package/.agents/scripts/lib/orchestration/model-attribution.js +390 -0
  442. package/.agents/scripts/lib/orchestration/parked-follow-ons.js +147 -0
  443. package/.agents/scripts/lib/orchestration/phase-runner.js +87 -0
  444. package/.agents/scripts/lib/orchestration/plan-review-routing.js +63 -0
  445. package/.agents/scripts/lib/orchestration/plan-runner/plan-router.js +86 -0
  446. package/.agents/scripts/lib/orchestration/plan-runner/worktree-sweep.js +212 -0
  447. package/.agents/scripts/lib/orchestration/planning-context-budget.js +213 -0
  448. package/.agents/scripts/lib/orchestration/planning-risk.js +155 -0
  449. package/.agents/scripts/lib/orchestration/planning-state-manager.js +318 -0
  450. package/.agents/scripts/lib/orchestration/post-merge/phases/branch-cleanup.js +56 -0
  451. package/.agents/scripts/lib/orchestration/post-merge/phases/dashboard-refresh.js +33 -0
  452. package/.agents/scripts/lib/orchestration/post-merge/phases/notification.js +78 -0
  453. package/.agents/scripts/lib/orchestration/post-merge/phases/temp-cleanup.js +68 -0
  454. package/.agents/scripts/lib/orchestration/post-merge/phases/ticket-closure.js +118 -0
  455. package/.agents/scripts/lib/orchestration/post-merge/phases/worktree-reap.js +396 -0
  456. package/.agents/scripts/lib/orchestration/post-merge-pipeline.js +205 -0
  457. package/.agents/scripts/lib/orchestration/pr-base-guard.js +47 -0
  458. package/.agents/scripts/lib/orchestration/preflight-cache.js +164 -0
  459. package/.agents/scripts/lib/orchestration/reassert-status-column.js +202 -0
  460. package/.agents/scripts/lib/orchestration/reconciler.js +137 -0
  461. package/.agents/scripts/lib/orchestration/recurring-failure-detector.js +152 -0
  462. package/.agents/scripts/lib/orchestration/recut.js +56 -0
  463. package/.agents/scripts/lib/orchestration/resolves-token.js +127 -0
  464. package/.agents/scripts/lib/orchestration/retro/phases/checks.js +94 -0
  465. package/.agents/scripts/lib/orchestration/retro/phases/compose-body.js +448 -0
  466. package/.agents/scripts/lib/orchestration/retro/phases/gather-signals.js +335 -0
  467. package/.agents/scripts/lib/orchestration/retro/phases/post-and-mirror.js +133 -0
  468. package/.agents/scripts/lib/orchestration/retro-heuristics.js +57 -0
  469. package/.agents/scripts/lib/orchestration/retro-perf-heuristics.js +275 -0
  470. package/.agents/scripts/lib/orchestration/retro-proposals.js +395 -0
  471. package/.agents/scripts/lib/orchestration/retro-runner.js +171 -0
  472. package/.agents/scripts/lib/orchestration/review-depth.js +93 -0
  473. package/.agents/scripts/lib/orchestration/review-providers/codex.js +363 -0
  474. package/.agents/scripts/lib/orchestration/review-providers/findings-renderer.js +205 -0
  475. package/.agents/scripts/lib/orchestration/review-providers/native.js +805 -0
  476. package/.agents/scripts/lib/orchestration/review-providers/review-depth.js +73 -0
  477. package/.agents/scripts/lib/orchestration/review-providers/review-provider-factory.js +396 -0
  478. package/.agents/scripts/lib/orchestration/review-providers/security-review.js +373 -0
  479. package/.agents/scripts/lib/orchestration/review-providers/types.js +89 -0
  480. package/.agents/scripts/lib/orchestration/review-providers/ultrareview.js +107 -0
  481. package/.agents/scripts/lib/orchestration/single-story-close/phases/auto-merge.js +159 -0
  482. package/.agents/scripts/lib/orchestration/single-story-close/phases/base-sync.js +194 -0
  483. package/.agents/scripts/lib/orchestration/single-story-close/phases/close-validation.js +81 -0
  484. package/.agents/scripts/lib/orchestration/single-story-close/phases/code-review.js +190 -0
  485. package/.agents/scripts/lib/orchestration/single-story-close/phases/options.js +70 -0
  486. package/.agents/scripts/lib/orchestration/single-story-close/phases/pull-request.js +106 -0
  487. package/.agents/scripts/lib/orchestration/single-story-close/phases/push.js +42 -0
  488. package/.agents/scripts/lib/orchestration/single-story-close/phases/worktree-reap.js +73 -0
  489. package/.agents/scripts/lib/orchestration/single-story-close/phases/wrong-tree-guard.js +225 -0
  490. package/.agents/scripts/lib/orchestration/single-story-close/runner.js +315 -0
  491. package/.agents/scripts/lib/orchestration/single-story-lease-guard.js +149 -0
  492. package/.agents/scripts/lib/orchestration/skill-capsule-loader.js +110 -0
  493. package/.agents/scripts/lib/orchestration/spec-freshness.js +320 -0
  494. package/.agents/scripts/lib/orchestration/spec-renderer.js +456 -0
  495. package/.agents/scripts/lib/orchestration/spec-section-validator.js +80 -0
  496. package/.agents/scripts/lib/orchestration/story-close/auto-refresh-runner.js +797 -0
  497. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/gate-failure.js +163 -0
  498. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/pre-merge-attribution.js +152 -0
  499. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/refresh-commit.js +387 -0
  500. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/regression-projection.js +266 -0
  501. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/scope-discovery.js +48 -0
  502. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution-wiring.js +67 -0
  503. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution.js +161 -0
  504. package/.agents/scripts/lib/orchestration/story-close/baseline-friction-body.js +117 -0
  505. package/.agents/scripts/lib/orchestration/story-close/cd-out-guard.js +86 -0
  506. package/.agents/scripts/lib/orchestration/story-close/cleanup-reconciler.js +147 -0
  507. package/.agents/scripts/lib/orchestration/story-close/close-inputs.js +142 -0
  508. package/.agents/scripts/lib/orchestration/story-close/comment-bodies.js +62 -0
  509. package/.agents/scripts/lib/orchestration/story-close/format-autofix-scoped.js +221 -0
  510. package/.agents/scripts/lib/orchestration/story-close/format-autofix-shared.js +123 -0
  511. package/.agents/scripts/lib/orchestration/story-close/format-autofix.js +216 -0
  512. package/.agents/scripts/lib/orchestration/story-close/merge-runner.js +636 -0
  513. package/.agents/scripts/lib/orchestration/story-close/merge-subject.js +198 -0
  514. package/.agents/scripts/lib/orchestration/story-close/phases/branch-restore.js +105 -0
  515. package/.agents/scripts/lib/orchestration/story-close/phases/close.js +222 -0
  516. package/.agents/scripts/lib/orchestration/story-close/phases/code-review.js +220 -0
  517. package/.agents/scripts/lib/orchestration/story-close/phases/gates.js +291 -0
  518. package/.agents/scripts/lib/orchestration/story-close/phases/locked-pipeline.js +234 -0
  519. package/.agents/scripts/lib/orchestration/story-close/phases/preflight.js +110 -0
  520. package/.agents/scripts/lib/orchestration/story-close/phases/refresh.js +86 -0
  521. package/.agents/scripts/lib/orchestration/story-close/phases/timeout-blocked-emitter.js +112 -0
  522. package/.agents/scripts/lib/orchestration/story-close/phases/timeout-blocked.js +157 -0
  523. package/.agents/scripts/lib/orchestration/story-close/post-merge-close.js +434 -0
  524. package/.agents/scripts/lib/orchestration/story-close/pre-merge-validation.js +290 -0
  525. package/.agents/scripts/lib/orchestration/story-close-recovery.js +643 -0
  526. package/.agents/scripts/lib/orchestration/structured-comment-parser.js +67 -0
  527. package/.agents/scripts/lib/orchestration/task-body-validator.js +391 -0
  528. package/.agents/scripts/lib/orchestration/ticket-lease.js +358 -0
  529. package/.agents/scripts/lib/orchestration/ticket-validator-conflicts.js +783 -0
  530. package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +367 -0
  531. package/.agents/scripts/lib/orchestration/ticket-validator.js +691 -0
  532. package/.agents/scripts/lib/orchestration/ticketing/bulk.js +723 -0
  533. package/.agents/scripts/lib/orchestration/ticketing/reads.js +474 -0
  534. package/.agents/scripts/lib/orchestration/ticketing/state.js +559 -0
  535. package/.agents/scripts/lib/orchestration/ticketing.js +55 -0
  536. package/.agents/scripts/lib/orchestration/wave-marker.js +28 -0
  537. package/.agents/scripts/lib/orchestration/wave-record-io.js +277 -0
  538. package/.agents/scripts/lib/orchestration/wave-record-notifications.js +189 -0
  539. package/.agents/scripts/lib/orchestration/wave-record-projection.js +423 -0
  540. package/.agents/scripts/lib/path-security.js +25 -0
  541. package/.agents/scripts/lib/plan-phase-cleanup.js +125 -0
  542. package/.agents/scripts/lib/preflight-runner.js +196 -0
  543. package/.agents/scripts/lib/presentation/dispatch-manifest-render.js +95 -0
  544. package/.agents/scripts/lib/presentation/manifest-builder.js +245 -0
  545. package/.agents/scripts/lib/presentation/manifest-formatter.js +243 -0
  546. package/.agents/scripts/lib/presentation/manifest-helpers.js +213 -0
  547. package/.agents/scripts/lib/presentation/manifest-persistence.js +262 -0
  548. package/.agents/scripts/lib/presentation/manifest-procedures.js +55 -0
  549. package/.agents/scripts/lib/presentation/manifest-render-waves.js +252 -0
  550. package/.agents/scripts/lib/presentation/manifest-renderer.js +188 -0
  551. package/.agents/scripts/lib/presentation/manifest-story-views.js +119 -0
  552. package/.agents/scripts/lib/provider-factory.js +80 -0
  553. package/.agents/scripts/lib/push-epic-retry.js +209 -0
  554. package/.agents/scripts/lib/qa/console-allowlist.js +151 -0
  555. package/.agents/scripts/lib/qa/coverage-report.js +181 -0
  556. package/.agents/scripts/lib/qa/coverage-verdict.js +296 -0
  557. package/.agents/scripts/lib/qa/propose-missing-test.js +95 -0
  558. package/.agents/scripts/lib/qa/qa-context-hydrator.js +296 -0
  559. package/.agents/scripts/lib/qa/qa-session.js +197 -0
  560. package/.agents/scripts/lib/qa/redact-evidence.js +245 -0
  561. package/.agents/scripts/lib/qa/resolve-qa-contract.js +190 -0
  562. package/.agents/scripts/lib/qa/resolve-selection.js +373 -0
  563. package/.agents/scripts/lib/runtime-deps/ensure-installed.js +100 -0
  564. package/.agents/scripts/lib/runtime-deps/manifest.js +96 -0
  565. package/.agents/scripts/lib/runtime-deps/preflight.js +78 -0
  566. package/.agents/scripts/lib/runtime-deps/scan-imports.js +202 -0
  567. package/.agents/scripts/lib/signals/detectors/common.js +36 -0
  568. package/.agents/scripts/lib/signals/detectors/hotspot.js +298 -0
  569. package/.agents/scripts/lib/signals/detectors/index.js +14 -0
  570. package/.agents/scripts/lib/signals/detectors/retry.js +289 -0
  571. package/.agents/scripts/lib/signals/detectors/rework.js +204 -0
  572. package/.agents/scripts/lib/signals/index.js +39 -0
  573. package/.agents/scripts/lib/signals/read.js +268 -0
  574. package/.agents/scripts/lib/signals/schema.js +225 -0
  575. package/.agents/scripts/lib/signals/span-tree.js +290 -0
  576. package/.agents/scripts/lib/signals/write.js +19 -0
  577. package/.agents/scripts/lib/single-story/confirm-merge.js +201 -0
  578. package/.agents/scripts/lib/single-story/story-merged-notify.js +126 -0
  579. package/.agents/scripts/lib/single-story-sweep/protection.js +274 -0
  580. package/.agents/scripts/lib/single-story-sweep/sweep-lock.js +169 -0
  581. package/.agents/scripts/lib/single-story-sweep.js +329 -0
  582. package/.agents/scripts/lib/skills/parse-skill.js +202 -0
  583. package/.agents/scripts/lib/skills/walk-skill-files.js +56 -0
  584. package/.agents/scripts/lib/spec/index.js +36 -0
  585. package/.agents/scripts/lib/spec/loader.js +425 -0
  586. package/.agents/scripts/lib/spec/state.js +217 -0
  587. package/.agents/scripts/lib/story-body/story-body.js +743 -0
  588. package/.agents/scripts/lib/story-init/blocker-validator.js +68 -0
  589. package/.agents/scripts/lib/story-init/branch-initializer.js +422 -0
  590. package/.agents/scripts/lib/story-init/context-resolver.js +92 -0
  591. package/.agents/scripts/lib/story-init/donor-precheck.js +207 -0
  592. package/.agents/scripts/lib/story-init/hierarchy-tracer.js +36 -0
  593. package/.agents/scripts/lib/story-init/state-transitioner.js +80 -0
  594. package/.agents/scripts/lib/story-init/task-graph-builder.js +114 -0
  595. package/.agents/scripts/lib/story-init/transition-summary.js +34 -0
  596. package/.agents/scripts/lib/story-lifecycle.js +186 -0
  597. package/.agents/scripts/lib/story-plan.js +246 -0
  598. package/.agents/scripts/lib/task-utils.js +26 -0
  599. package/.agents/scripts/lib/templates/decomposer-prompts.js +168 -0
  600. package/.agents/scripts/lib/test-env.js +30 -0
  601. package/.agents/scripts/lib/test-isolate/env-snapshot-loader.js +52 -0
  602. package/.agents/scripts/lib/test-isolate/list-files.js +90 -0
  603. package/.agents/scripts/lib/test-isolate/parse-tap.js +75 -0
  604. package/.agents/scripts/lib/test-isolate/runner.js +483 -0
  605. package/.agents/scripts/lib/test-profile/parse-tap.js +136 -0
  606. package/.agents/scripts/lib/test-profile/render-report.js +45 -0
  607. package/.agents/scripts/lib/test-reserved-epic-temp-ids.js +35 -0
  608. package/.agents/scripts/lib/test-tiers.js +94 -0
  609. package/.agents/scripts/lib/util/concurrent-map.js +59 -0
  610. package/.agents/scripts/lib/util/phase-timer-state.js +72 -0
  611. package/.agents/scripts/lib/util/phase-timer.js +163 -0
  612. package/.agents/scripts/lib/util/poll-loop.js +86 -0
  613. package/.agents/scripts/lib/util/with-timeout.js +32 -0
  614. package/.agents/scripts/lib/validation-evidence.js +323 -0
  615. package/.agents/scripts/lib/wave-runner/tick.js +665 -0
  616. package/.agents/scripts/lib/wave-runner/wave-checkpoint.js +91 -0
  617. package/.agents/scripts/lib/wave-runner/wave-runner-error.js +19 -0
  618. package/.agents/scripts/lib/workers/crap-worker.js +197 -0
  619. package/.agents/scripts/lib/workers/maintainability-report-worker.js +137 -0
  620. package/.agents/scripts/lib/workers/maintainability-worker.js +79 -0
  621. package/.agents/scripts/lib/workspace-provisioner.js +189 -0
  622. package/.agents/scripts/lib/worktree/bootstrapper.js +48 -0
  623. package/.agents/scripts/lib/worktree/inspector.js +140 -0
  624. package/.agents/scripts/lib/worktree/lifecycle/creation.js +118 -0
  625. package/.agents/scripts/lib/worktree/lifecycle/drift-detection.js +62 -0
  626. package/.agents/scripts/lib/worktree/lifecycle/force-drain.js +276 -0
  627. package/.agents/scripts/lib/worktree/lifecycle/gc.js +49 -0
  628. package/.agents/scripts/lib/worktree/lifecycle/merge-reachability.js +178 -0
  629. package/.agents/scripts/lib/worktree/lifecycle/pending-cleanup.js +264 -0
  630. package/.agents/scripts/lib/worktree/lifecycle/precheck.js +100 -0
  631. package/.agents/scripts/lib/worktree/lifecycle/reap.js +588 -0
  632. package/.agents/scripts/lib/worktree/lifecycle/registry-sync.js +124 -0
  633. package/.agents/scripts/lib/worktree/lifecycle/shared.js +26 -0
  634. package/.agents/scripts/lib/worktree/lifecycle-manager.js +40 -0
  635. package/.agents/scripts/lib/worktree/node-modules-strategy.js +349 -0
  636. package/.agents/scripts/lib/worktree-manager.js +243 -0
  637. package/.agents/scripts/lifecycle-diff.js +206 -0
  638. package/.agents/scripts/lifecycle-emit-story-dispatch.js +194 -0
  639. package/.agents/scripts/lifecycle-emit.js +479 -0
  640. package/.agents/scripts/lint-baseline.js +507 -0
  641. package/.agents/scripts/lint-label-vocabulary.js +237 -0
  642. package/.agents/scripts/loc-delta.js +205 -0
  643. package/.agents/scripts/notify.js +307 -0
  644. package/.agents/scripts/package.json +3 -0
  645. package/.agents/scripts/post-structured-comment.js +127 -0
  646. package/.agents/scripts/pr-watch-with-update.js +152 -0
  647. package/.agents/scripts/providers/github/auth.js +65 -0
  648. package/.agents/scripts/providers/github/board-add.js +63 -0
  649. package/.agents/scripts/providers/github/branch-protection.js +186 -0
  650. package/.agents/scripts/providers/github/cache.js +72 -0
  651. package/.agents/scripts/providers/github/comments.js +131 -0
  652. package/.agents/scripts/providers/github/compose.js +111 -0
  653. package/.agents/scripts/providers/github/errors.js +242 -0
  654. package/.agents/scripts/providers/github/issues.js +242 -0
  655. package/.agents/scripts/providers/github/labels.js +179 -0
  656. package/.agents/scripts/providers/github/mappers.js +126 -0
  657. package/.agents/scripts/providers/github/merge-methods.js +82 -0
  658. package/.agents/scripts/providers/github/project-board.js +47 -0
  659. package/.agents/scripts/providers/github/projects-v2-graphql.js +472 -0
  660. package/.agents/scripts/providers/github/prs.js +103 -0
  661. package/.agents/scripts/providers/github/request-helpers.js +110 -0
  662. package/.agents/scripts/providers/github/sub-issues.js +369 -0
  663. package/.agents/scripts/providers/github/tickets.js +381 -0
  664. package/.agents/scripts/providers/github/transient-retry.js +62 -0
  665. package/.agents/scripts/providers/github.js +157 -0
  666. package/.agents/scripts/quality-preview.js +327 -0
  667. package/.agents/scripts/quality-watch.js +223 -0
  668. package/.agents/scripts/render-manifest.js +143 -0
  669. package/.agents/scripts/resync-status-column.js +176 -0
  670. package/.agents/scripts/retro-run.js +167 -0
  671. package/.agents/scripts/run-audit-suite.js +97 -0
  672. package/.agents/scripts/run-coverage.js +103 -0
  673. package/.agents/scripts/run-lint.js +94 -0
  674. package/.agents/scripts/run-test-profile.js +126 -0
  675. package/.agents/scripts/run-tests.js +185 -0
  676. package/.agents/scripts/run-verify.js +56 -0
  677. package/.agents/scripts/select-audits.js +155 -0
  678. package/.agents/scripts/signals-view.js +294 -0
  679. package/.agents/scripts/single-story-close.js +83 -0
  680. package/.agents/scripts/single-story-confirm-merge.js +183 -0
  681. package/.agents/scripts/single-story-init.js +692 -0
  682. package/.agents/scripts/stories-wave-tick.js +415 -0
  683. package/.agents/scripts/story-close.js +246 -0
  684. package/.agents/scripts/story-deliver-prepare.js +267 -0
  685. package/.agents/scripts/story-init.js +516 -0
  686. package/.agents/scripts/story-phase.js +327 -0
  687. package/.agents/scripts/story-plan.js +284 -0
  688. package/.agents/scripts/sync-agentrc.js +71 -0
  689. package/.agents/scripts/sync-branch-from-base.js +138 -0
  690. package/.agents/scripts/sync-claude-commands.js +151 -0
  691. package/.agents/scripts/test-isolate.js +222 -0
  692. package/.agents/scripts/test-wrapper.js +108 -0
  693. package/.agents/scripts/update-coverage-baseline.js +129 -0
  694. package/.agents/scripts/update-crap-baseline.js +177 -0
  695. package/.agents/scripts/update-duplication-baseline.js +134 -0
  696. package/.agents/scripts/update-maintainability-baseline.js +183 -0
  697. package/.agents/scripts/update-mutation-baseline.js +189 -0
  698. package/.agents/scripts/update-ticket-state.js +107 -0
  699. package/.agents/scripts/validate-docs-freshness.js +259 -0
  700. package/.agents/scripts/validate-skills.js +278 -0
  701. package/.agents/scripts/wave-tick.js +335 -0
  702. package/.agents/skills/core/analyze-execution/SKILL.md +98 -0
  703. package/.agents/skills/core/api-and-interface-design/SKILL.md +327 -0
  704. package/.agents/skills/core/baseline-refresh/SKILL.md +181 -0
  705. package/.agents/skills/core/browser-testing-with-devtools/SKILL.md +352 -0
  706. package/.agents/skills/core/ci-cd-and-automation/SKILL.md +274 -0
  707. package/.agents/skills/core/ci-cd-and-automation/examples.md +211 -0
  708. package/.agents/skills/core/code-review-and-quality/SKILL.md +421 -0
  709. package/.agents/skills/core/code-simplification/SKILL.md +389 -0
  710. package/.agents/skills/core/context-engineering/SKILL.md +309 -0
  711. package/.agents/skills/core/context-engineering/examples.md +58 -0
  712. package/.agents/skills/core/debugging-and-error-recovery/SKILL.md +338 -0
  713. package/.agents/skills/core/deprecation-and-migration/SKILL.md +250 -0
  714. package/.agents/skills/core/diagnose-friction/SKILL.md +79 -0
  715. package/.agents/skills/core/documentation-and-adrs/SKILL.md +323 -0
  716. package/.agents/skills/core/epic-plan-consolidate/SKILL.md +145 -0
  717. package/.agents/skills/core/epic-plan-decompose-author/SKILL.md +425 -0
  718. package/.agents/skills/core/epic-plan-spec-author/SKILL.md +393 -0
  719. package/.agents/skills/core/frontend-ui-engineering/SKILL.md +357 -0
  720. package/.agents/skills/core/git-workflow-and-versioning/SKILL.md +352 -0
  721. package/.agents/skills/core/hydrate-context/SKILL.md +118 -0
  722. package/.agents/skills/core/idea-refinement/SKILL.md +317 -0
  723. package/.agents/skills/core/idea-refinement/examples.md +437 -0
  724. package/.agents/skills/core/idea-refinement/frameworks.md +135 -0
  725. package/.agents/skills/core/idea-refinement/refinement-criteria.md +155 -0
  726. package/.agents/skills/core/idea-refinement/scripts/idea-refine.sh +15 -0
  727. package/.agents/skills/core/incremental-implementation/SKILL.md +271 -0
  728. package/.agents/skills/core/introducing-a-baseline-gate/SKILL.md +213 -0
  729. package/.agents/skills/core/knowledge-transfer/SKILL.md +175 -0
  730. package/.agents/skills/core/mutation-survivor-remediation/SKILL.md +117 -0
  731. package/.agents/skills/core/performance-optimization/SKILL.md +314 -0
  732. package/.agents/skills/core/planning-and-task-breakdown/SKILL.md +277 -0
  733. package/.agents/skills/core/property-based-testing/SKILL.md +148 -0
  734. package/.agents/skills/core/qa-coverage-mapping/SKILL.md +105 -0
  735. package/.agents/skills/core/refactoring-discipline/SKILL.md +111 -0
  736. package/.agents/skills/core/scope-triage/SKILL.md +127 -0
  737. package/.agents/skills/core/security-and-hardening/SKILL.md +400 -0
  738. package/.agents/skills/core/shipping-and-launch/SKILL.md +328 -0
  739. package/.agents/skills/core/spec-driven-development/SKILL.md +252 -0
  740. package/.agents/skills/core/test-driven-development/SKILL.md +475 -0
  741. package/.agents/skills/core/using-agent-skills/SKILL.md +232 -0
  742. package/.agents/skills/skills.index.json +596 -0
  743. package/.agents/skills/stack/architecture/monorepo-path-strategist/SKILL.md +31 -0
  744. package/.agents/skills/stack/architecture/structured-output-zod/SKILL.md +51 -0
  745. package/.agents/skills/stack/architecture/subagent-orchestration/SKILL.md +48 -0
  746. package/.agents/skills/stack/backend/cloudflare-hono-architect/SKILL.md +31 -0
  747. package/.agents/skills/stack/backend/cloudflare-hono-architect/examples/route-template.ts +33 -0
  748. package/.agents/skills/stack/backend/cloudflare-queue-manager/SKILL.md +31 -0
  749. package/.agents/skills/stack/backend/cloudflare-workers/SKILL.md +51 -0
  750. package/.agents/skills/stack/backend/highlevel-crm/SKILL.md +54 -0
  751. package/.agents/skills/stack/backend/sqlite-drizzle-expert/SKILL.md +29 -0
  752. package/.agents/skills/stack/backend/sqlite-drizzle-expert/examples/schema-template.ts +30 -0
  753. package/.agents/skills/stack/backend/stripe-integration/SKILL.md +57 -0
  754. package/.agents/skills/stack/backend/stripe-integration/scripts/listen-stripe.sh +9 -0
  755. package/.agents/skills/stack/backend/turso-sqlite/SKILL.md +48 -0
  756. package/.agents/skills/stack/frontend/astro/SKILL.md +62 -0
  757. package/.agents/skills/stack/frontend/astro-react-island-strategist/SKILL.md +30 -0
  758. package/.agents/skills/stack/frontend/expo-react-native-developer/SKILL.md +29 -0
  759. package/.agents/skills/stack/frontend/google-analytics-v4/SKILL.md +50 -0
  760. package/.agents/skills/stack/frontend/tailwind-v4/SKILL.md +58 -0
  761. package/.agents/skills/stack/frontend/ui-accessibility-engineer/SKILL.md +34 -0
  762. package/.agents/skills/stack/qa/audit-accessibility/SKILL.md +51 -0
  763. package/.agents/skills/stack/qa/gherkin-authoring/SKILL.md +257 -0
  764. package/.agents/skills/stack/qa/gherkin-authoring/examples/invoice-issue.feature +41 -0
  765. package/.agents/skills/stack/qa/lighthouse-baseline/SKILL.md +199 -0
  766. package/.agents/skills/stack/qa/playwright/SKILL.md +50 -0
  767. package/.agents/skills/stack/qa/playwright-bdd/SKILL.md +188 -0
  768. package/.agents/skills/stack/qa/qa-explore-driving/SKILL.md +142 -0
  769. package/.agents/skills/stack/qa/qa-harness/SKILL.md +220 -0
  770. package/.agents/skills/stack/qa/vitest/SKILL.md +51 -0
  771. package/.agents/skills/stack/security/backend-security-patterns/SKILL.md +68 -0
  772. package/.agents/starter-agentrc.json +22 -0
  773. package/.agents/templates/agent-protocol.md +72 -0
  774. package/.agents/templates/docs/architecture.md +30 -0
  775. package/.agents/templates/docs/decisions.md +24 -0
  776. package/.agents/templates/epic-from-idea.md +21 -0
  777. package/.agents/templates/single-story-body.md +17 -0
  778. package/.agents/workflows/agents-update.md +415 -0
  779. package/.agents/workflows/audit-architecture.md +312 -0
  780. package/.agents/workflows/audit-clean-code.md +179 -0
  781. package/.agents/workflows/audit-dependencies.md +91 -0
  782. package/.agents/workflows/audit-devops.md +110 -0
  783. package/.agents/workflows/audit-lighthouse.md +260 -0
  784. package/.agents/workflows/audit-performance.md +161 -0
  785. package/.agents/workflows/audit-privacy.md +104 -0
  786. package/.agents/workflows/audit-quality.md +191 -0
  787. package/.agents/workflows/audit-security.md +156 -0
  788. package/.agents/workflows/audit-seo.md +118 -0
  789. package/.agents/workflows/audit-sre.md +139 -0
  790. package/.agents/workflows/audit-to-stories.md +257 -0
  791. package/.agents/workflows/audit-ux-ui.md +102 -0
  792. package/.agents/workflows/epic-deliver.md +864 -0
  793. package/.agents/workflows/epic-plan.md +998 -0
  794. package/.agents/workflows/explain.md +118 -0
  795. package/.agents/workflows/git-cleanup.md +250 -0
  796. package/.agents/workflows/git-commit-all.md +15 -0
  797. package/.agents/workflows/git-merge-pr.md +377 -0
  798. package/.agents/workflows/git-pr-all.md +278 -0
  799. package/.agents/workflows/git-push.md +60 -0
  800. package/.agents/workflows/helpers/_merge-conflict-template.md +54 -0
  801. package/.agents/workflows/helpers/acceptance-self-eval.md +74 -0
  802. package/.agents/workflows/helpers/agents-sync-config.md +129 -0
  803. package/.agents/workflows/helpers/code-quality-guardrails.md +101 -0
  804. package/.agents/workflows/helpers/code-review.md +370 -0
  805. package/.agents/workflows/helpers/diagnose.md +117 -0
  806. package/.agents/workflows/helpers/epic-audit.md +295 -0
  807. package/.agents/workflows/helpers/epic-deliver-story.md +370 -0
  808. package/.agents/workflows/helpers/epic-plan-decompose.md +199 -0
  809. package/.agents/workflows/helpers/epic-plan-spec.md +184 -0
  810. package/.agents/workflows/helpers/epic-testing.md +125 -0
  811. package/.agents/workflows/helpers/parallel-tooling.md +88 -0
  812. package/.agents/workflows/helpers/signals.md +112 -0
  813. package/.agents/workflows/helpers/single-story-deliver.md +636 -0
  814. package/.agents/workflows/helpers/worktree-lifecycle.md +317 -0
  815. package/.agents/workflows/onboard.md +207 -0
  816. package/.agents/workflows/qa-assist.md +293 -0
  817. package/.agents/workflows/qa-explore.md +350 -0
  818. package/.agents/workflows/qa-run-harness.md +288 -0
  819. package/.agents/workflows/story-deliver.md +327 -0
  820. package/.agents/workflows/story-plan.md +233 -0
  821. package/LICENSE +21 -0
  822. package/README.md +193 -0
  823. package/bin/mandrel.js +56 -0
  824. package/bin/postinstall.js +195 -0
  825. package/lib/cli/__tests__/migrate.test.js +268 -0
  826. package/lib/cli/__tests__/sync-local-zone.test.js +247 -0
  827. package/lib/cli/__tests__/sync.test.js +372 -0
  828. package/lib/cli/__tests__/update-major.test.js +217 -0
  829. package/lib/cli/__tests__/update.test.js +696 -0
  830. package/lib/cli/__tests__/version-check.test.js +398 -0
  831. package/lib/cli/doctor.js +124 -0
  832. package/lib/cli/explain.js +107 -0
  833. package/lib/cli/migrate.js +260 -0
  834. package/lib/cli/registry.js +830 -0
  835. package/lib/cli/sync-commands.js +50 -0
  836. package/lib/cli/sync.js +200 -0
  837. package/lib/cli/uninstall.js +795 -0
  838. package/lib/cli/update.js +854 -0
  839. package/lib/cli/version-check.js +206 -0
  840. package/lib/migrations/README.md +69 -0
  841. package/lib/migrations/__tests__/index.test.js +216 -0
  842. package/lib/migrations/index.js +164 -0
  843. package/package.json +105 -0
@@ -0,0 +1,998 @@
1
+ ---
2
+ description:
3
+ Orchestrates end-to-end Epic planning (PRD, Tech Spec, Acceptance Spec, and
4
+ Work Breakdown) for a GitHub Epic.
5
+ ---
6
+
7
+ # /epic-plan [Epic ID]
8
+
9
+ ## Role
10
+
11
+ Director / Architect
12
+
13
+ ## Context
14
+
15
+ You are the master orchestrator for the v5 Epic-Centric ticketing pipeline. Your
16
+ goal is to transform a high-level Epic into a fully decomposed, ready-to-execute
17
+ backlog of Features, Stories, and Tasks.
18
+
19
+ `/epic-plan` is the unified planning entry point. It delegates to the two
20
+ phase helpers — [`helpers/epic-plan-spec.md`](helpers/epic-plan-spec.md) and
21
+ [`helpers/epic-plan-decompose.md`](helpers/epic-plan-decompose.md) — and runs
22
+ both phases sequentially with a human confirmation gate between them. The Epic
23
+ ID is the single positional argument.
24
+
25
+ As of v5.6, planning artifacts (PRD, Tech Spec, ticket decomposition) are
26
+ authored **directly by you, the host LLM** — no external Gemini / Anthropic /
27
+ OpenAI API is called. The Node scripts are deterministic GitHub I/O wrappers
28
+ that (a) emit the authoring context you need and (b) validate and persist the
29
+ artifacts you author.
30
+
31
+ ## Constraint
32
+
33
+ - Do not modify existing issues without explicit permission.
34
+ - Wait for user validation before migrating to Phase 8 when
35
+ `planningRisk.requiresReview` is true (or the operator passes
36
+ `--force-review`). Low-risk Epics auto-proceed after spec validation.
37
+ See [SDLC § Adaptive planning risk routing](../docs/SDLC.md#adaptive-planning-risk-routing)
38
+ for the full envelope shape and the planner-selected
39
+ `acceptance::n-a` route.
40
+ - Delegate Phase 7 and Phase 8 to the
41
+ [`helpers/epic-plan-spec.md`](helpers/epic-plan-spec.md) and
42
+ [`helpers/epic-plan-decompose.md`](helpers/epic-plan-decompose.md)
43
+ procedures respectively — they own the Epic lifecycle label transitions and
44
+ the `epic-plan-state` checkpoint. This wrapper must not apply those labels
45
+ directly.
46
+
47
+ ## Prerequisites
48
+
49
+ 1. **GitHub Epic**: An existing GitHub Issue with the `type::epic` label.
50
+ Skipped when entering via Phase 1 / `--idea` (the Epic does not exist
51
+ yet — Phases 1–4 will create it).
52
+ 2. **API Keys**: `GITHUB_TOKEN` must be set in the `.env` file.
53
+
54
+ ## Phase 1: Idea Refinement (s-plan-ideation entry)
55
+
56
+ This phase runs **only** when no `<epic#>` argument is supplied, or when
57
+ `--idea "<seed>"` is passed. If an Epic ID was provided, skip directly to
58
+ Phase 5 (Re-Plan Detection).
59
+
60
+ 1. **Activate the ideation skill**: Read
61
+ `<agentRoot>/skills/core/idea-refinement/SKILL.md` via the `Read`
62
+ tool (resolve `<agentRoot>` from `project.paths.agentRoot` —
63
+ default `.agents`) and execute its procedure with the `--idea` value
64
+ (or a user-supplied seed if no argument was given) as the seed. The
65
+ skill drives its own three-phase divergent → convergent → sharpen
66
+ loop and returns a markdown one-pager with the canonical sections
67
+ (Problem Statement, Recommended Direction, Key Assumptions, MVP
68
+ Scope, Not Doing). This is the canonical pattern for framework
69
+ skills — they are library-style content read on-demand per
70
+ `<agentRoot>/instructions.md` section 1.B, not entries in the
71
+ host's harness-level skill registry.
72
+
73
+ 2. **Run Phase 1.5 (Scope Triage) before the HITL stop**: The sharpened
74
+ one-pager feeds the scope-triage gate below, whose verdict folds into
75
+ the **same** Phase 1 HITL confirmation. Do not stop twice.
76
+
77
+ 3. **HITL stop — confirm the sharpened one-pager**: Display the one-pager
78
+ to the operator and **STOP**. Do not proceed to Phase 2 until the
79
+ user explicitly confirms the direction. This is the same gate the
80
+ skill's own Phase 3 enforces; surfacing it here makes the wait
81
+ contract visible to `/epic-plan` callers. When the Phase 1.5 verdict is
82
+ `story` or `borderline`, this stop carries the three-way choice the
83
+ triage gate defines (below) instead of a plain confirm.
84
+
85
+ ## Phase 1.5: Scope Triage (ideation path only)
86
+
87
+ This phase runs **only** on the ideation path, immediately after Phase 1
88
+ produces the sharpened one-pager. It is **skipped entirely** when an Epic ID
89
+ argument was supplied (the existing-Epic path jumps straight to Phase 5), and
90
+ it is **skipped** when `/epic-plan` was entered via a scope-triage handoff from
91
+ [`/story-plan`](story-plan.md) — a handoff is a triage decision already made,
92
+ and re-triaging it would re-litigate a settled call (the no-re-triage rule the
93
+ skill states once).
94
+
95
+ 1. **Activate the scope-triage skill**: Read
96
+ [`<agentRoot>/skills/core/scope-triage/SKILL.md`](../skills/core/scope-triage/SKILL.md)
97
+ via the `Read` tool (resolve `<agentRoot>` from `project.paths.agentRoot` —
98
+ default `.agents`) and apply its rubric to the Phase 1 one-pager. The skill
99
+ anchors its sizing judgment **by reference** to
100
+ `DELIVERABLE_GRANULARITY_GUIDANCE` / `DEFAULT_TASK_SIZING` in
101
+ [`ticket-validator-sizing.js`](../scripts/lib/orchestration/ticket-validator-sizing.js)
102
+ and emits one verdict: `epic` | `story` | `borderline`. The verdict is
103
+ host-LLM judgment — there is **no `--flag`**, no scorer, no schema, and no
104
+ label transition.
105
+
106
+ 2. **Fold the verdict into the existing Phase 1 HITL stop** — do **not** add a
107
+ second stop:
108
+ - **`epic` verdict** → no extra prompt. The Phase 1 confirmation proceeds
109
+ as a plain one-pager confirm and the run continues to Phase 2.
110
+ - **`story` or `borderline` verdict** → the Phase 1 confirmation prompt
111
+ presents a **three-way operator choice**:
112
+ - **Recommended: single Story** (with the triage rationale) — persist the
113
+ one-pager to a notes file and hand off to
114
+ `/story-plan --from-notes <path>`, identifying the invocation as a
115
+ scope-triage handoff so `/story-plan` skips its own gate. Then **exit
116
+ `/epic-plan`**.
117
+ - **Plan as Epic anyway** — ignore the recommendation and continue to
118
+ Phase 2 with the one-pager.
119
+ - **Abort** — stop planning entirely.
120
+
121
+ **Never auto-route.** The verdict is advisory; the operator always decides.
122
+ Being wrong in the `epic` direction is cheap (Phase 8.3 consolidation and
123
+ the sizing validator catch an over-planned Story later); the gate exists to
124
+ avoid the ceremony tax of pushing a story-sized scope through the full Epic
125
+ pipeline.
126
+
127
+ ## Phase 2: Cross-Epic Duplicate Search
128
+
129
+ Runs immediately after Phase 1 (and only on the s-plan-ideation path).
130
+ Its job is to surface open Epics whose scope already overlaps with the
131
+ sharpened one-pager so the operator can fold the work in rather than
132
+ opening a duplicate.
133
+
134
+ 1. **Invoke the duplicate-search module**: Call
135
+ `findSimilarOpenEpics({ onePager, provider })` exported from
136
+ [`.agents/scripts/lib/duplicate-search.js`](../scripts/lib/duplicate-search.js).
137
+ The `provider` is the resolved ticketing provider
138
+ (`provider-factory.js`), and `onePager` is the markdown returned by
139
+ Phase 1.
140
+
141
+ 2. **HITL pause on match**: If the module returns a non-empty ranked
142
+ list, render the candidates (id, title, score, URL) and **STOP**. Do
143
+ not proceed to Phase 3 until the user either (a) confirms the new
144
+ Epic is genuinely distinct or (b) chooses to fold the idea into one of
145
+ the existing Epics, in which case `/epic-plan` exits and the operator
146
+ resumes work on the existing Epic ID.
147
+
148
+ 3. **No-match fast path**: If the module returns `[]`, proceed
149
+ immediately to Phase 3 — no operator intervention required.
150
+
151
+ ## Phase 3: Render Epic Body from One-Pager
152
+
153
+ Runs after Phase 2 clears (no duplicates, or operator confirmed the
154
+ new Epic is genuinely distinct).
155
+
156
+ 1. **Render the body**: Call
157
+ `renderEpicBody({ onePager, template })` exported from
158
+ [`.agents/scripts/lib/epic-plan-ideation.js`](../scripts/lib/epic-plan-ideation.js).
159
+ The `template` argument is the contents of
160
+ [`.agents/templates/epic-from-idea.md`](../templates/epic-from-idea.md),
161
+ which carries the five canonical sections (Context, Goal, Non-Goals,
162
+ Scope, Acceptance Criteria). Sections missing from the one-pager are
163
+ rendered as `_(not specified)_` rather than left as raw `{{token}}`
164
+ placeholders.
165
+
166
+ 2. **HITL stop — confirm the body**: Display the rendered body to the
167
+ operator and **STOP**. Do not proceed to Phase 4 until the user
168
+ explicitly confirms the body is correct. This is the last chance to
169
+ tweak wording before the GitHub Issue is opened.
170
+
171
+ ## Phase 4: Open the GitHub Issue (`type::epic` only)
172
+
173
+ 1. **Open the Epic Issue**: Call
174
+ `openEpicFromOnePager({ onePager, template, createIssue })` from the
175
+ same `epic-plan-ideation.js` module. Pass a `createIssue` port that
176
+ delegates to the resolved ticketing provider's `createIssue` method
177
+ (`provider-factory.js`; GitHub: `TicketGateway.createIssue`) so the
178
+ labels and body land via the canonical I/O surface.
179
+
180
+ **Board membership (Story #3822)**: the provider's `createIssue`
181
+ adds the new Epic to the configured Projects V2 board via the
182
+ shared `addIssueToBoard` helper
183
+ ([`providers/github/board-add.js`](../scripts/providers/github/board-add.js))
184
+ — idempotent, non-fatal (warn-on-error), and a no-op when no
185
+ project number is configured — so the Epic lands on the board
186
+ without relying on GitHub's "Auto-add to project" built-in
187
+ workflow (off by default on fresh boards and not enableable via
188
+ API). The created issue's GraphQL `node_id` is surfaced as
189
+ `nodeId` on the returned envelope for follow-up board operations.
190
+
191
+ 2. **Label discipline**: The Issue is opened with **only** the
192
+ `type::epic` label. **Do not** add any `state::*` label at creation
193
+ time — the Epic carries only `type::epic` until PRD authoring
194
+ advances it to `agent::review-spec` in Phase 7. The
195
+ `openEpicFromOnePager` helper already enforces this; the workflow
196
+ prose codifies the intent so future label-set tweaks don't silently
197
+ widen it.
198
+
199
+ 3. **Continue to Phase 5**: The captured Epic ID becomes the new
200
+ `[Epic_ID]` for the rest of the planning pipeline. Re-Plan Detection
201
+ (Phase 5) will short-circuit because no PRD/Tech Spec is linked yet,
202
+ so the run flows naturally into Phase 6 (Epic Clarity Gate) and then
203
+ Phase 7.
204
+
205
+ ## Phase 5: Re-Plan Detection
206
+
207
+ Before generating any artifacts, check whether the Epic has already been
208
+ planned.
209
+
210
+ 1. **Fetch Epic**: Read the Epic issue body and check for a
211
+ `## Planning Artifacts` section containing PRD and Tech Spec references.
212
+ 2. **If already planned**: Inform the user that this Epic already has planning
213
+ artifacts. Ask:
214
+
215
+ > "Epic #[ID] already has PRD (#XX) and Tech Spec (#XX) with YY decomposed
216
+ > tickets. Do you want to **re-plan**? This will **overwrite the PRD,
217
+ > Tech Spec, and Acceptance Spec in place** (same issue numbers, refreshed
218
+ > bodies, comment history preserved) and **close-and-recreate** all
219
+ > Feature/Story tickets."
220
+
221
+ 3. **If user confirms re-plan**: Pass `--force` to all subsequent script
222
+ invocations. Under `--force`, the three context tickets (PRD, Tech Spec,
223
+ Acceptance Spec) are overwritten in place — their issue numbers, Epic
224
+ sub-issue links, and prior discussion are preserved, and each receives a
225
+ one-line regeneration audit comment. Feature/Story child tickets are still
226
+ closed and recreated, because a re-decomposition can legitimately produce a
227
+ different ticket set.
228
+ 4. **If user declines**: Abort gracefully.
229
+
230
+ ## Phase 5.5: Story-Sized Advisory (existing-Epic path)
231
+
232
+ An **advisory** scope-triage check that catches a story-sized scope which was
233
+ hand-opened directly as a `type::epic` issue before any ceremony is paid for.
234
+ Phase 6's Epic Clarity Gate scores section *presence*, not scope *size* — a
235
+ perfectly clear but story-sized Epic (typically a thin, freshly opened issue)
236
+ sails straight through to full planning. This advisory is the size check the
237
+ clarity gate does not make.
238
+
239
+ ### Firing condition (load-bearing)
240
+
241
+ The advisory runs **only** when **both** hold:
242
+
243
+ 1. **Phase 5 found no planning artifacts** — the Epic body has no
244
+ `## Planning Artifacts` section linking a PRD / Tech Spec (i.e. Phase 5
245
+ did **not** enter its re-plan branch).
246
+ 2. **The Epic has no open Feature/Story children** — no open `type::feature`
247
+ or `type::story` sub-issues are linked to this Epic.
248
+
249
+ If **either** condition fails, **skip this phase silently** and continue to
250
+ Phase 6. It must **never** fire on the re-plan path: recommending a "downgrade
251
+ to a Story" on an Epic that already carries a PRD and a ticket tree is
252
+ nonsense and would collide with the `--force` re-plan flow. The advisory also
253
+ does not fire on the ideation path — that path already ran the Phase 1.5 scope
254
+ triage on the one-pager before the Epic existed.
255
+
256
+ ### Triage
257
+
258
+ 1. **Activate the scope-triage skill**: Read
259
+ [`<agentRoot>/skills/core/scope-triage/SKILL.md`](../skills/core/scope-triage/SKILL.md)
260
+ via the `Read` tool (resolve `<agentRoot>` from `project.paths.agentRoot` —
261
+ default `.agents`) and apply its rubric to the **Epic body**. The skill is
262
+ artifact-agnostic — it reads the same against an Epic body as against a
263
+ one-pager or a Story draft — and anchors its sizing judgment **by
264
+ reference** to `DELIVERABLE_GRANULARITY_GUIDANCE` / `DEFAULT_TASK_SIZING`
265
+ in
266
+ [`ticket-validator-sizing.js`](../scripts/lib/orchestration/ticket-validator-sizing.js).
267
+ It emits one verdict: `epic` | `story` | `borderline`. The verdict is
268
+ host-LLM judgment — there is **no `--flag`**, no scorer, no schema, and no
269
+ label transition behind this gate. Do **not** restate the skill's rubric or
270
+ its sizing thresholds here.
271
+
272
+ 2. **`epic` verdict** → proceed silently. No extra prompt, no HITL stop. The
273
+ run continues straight to Phase 6. Being wrong in the `epic` direction is
274
+ cheap (Phase 8.3 consolidation and the sizing validator catch an
275
+ over-planned Story later), so an `epic` verdict never costs the operator a
276
+ stop.
277
+
278
+ 3. **`story` or `borderline` verdict** → **STOP** and present a **three-way
279
+ operator choice**. Never auto-route; the verdict is advisory and the
280
+ operator always decides.
281
+
282
+ - **Recommended: convert to a standalone Story** (with the triage
283
+ rationale) — run the conversion path below.
284
+ - **Proceed as Epic anyway** — ignore the recommendation and continue to
285
+ Phase 6 with the Epic unchanged.
286
+ - **Abort** — stop planning entirely. The Epic is left exactly as it was;
287
+ no labels move and nothing is closed.
288
+
289
+ ### Conversion path (close-and-recreate)
290
+
291
+ Conversion is **close-and-recreate**, not in-place relabeling. A `type::epic`
292
+ body does not satisfy `validateStoryBody` (it lacks the required Story
293
+ sections and would have to drop the Epic shape), and editing or relabeling the
294
+ existing issue violates the workflow's "Do not modify existing issues without
295
+ explicit permission" Constraint. So the conversion seeds a fresh Story and
296
+ closes the Epic in its favor, and **every** issue mutation below happens
297
+ **only after the operator explicitly confirms the conversion in-session**:
298
+
299
+ 1. **Seed a notes file from the Epic body.** Write the Epic's Context / Goal /
300
+ Scope / Acceptance Criteria into a seed file under
301
+ `temp/epic-[Epic_ID]/scope-triage-seed.md` (the `temp/` tree is gitignored).
302
+ This is the same notes-file shape `/story-plan --from-notes` consumes.
303
+
304
+ 2. **Hand off to `/story-plan --from-notes`.** Invoke
305
+ [`/story-plan --from-notes temp/epic-[Epic_ID]/scope-triage-seed.md`](story-plan.md),
306
+ **identifying the invocation as a scope-triage handoff** so `/story-plan`
307
+ skips its own escalation gate (the skill's no-re-triage rule — a handoff is
308
+ a settled triage decision, and re-running the gate on the receiving side
309
+ would re-litigate it and risk a ping-pong between the two workflows). The
310
+ replacement Story's `## Notes` section links back to the closed Epic
311
+ (`Converted from Epic #[Epic_ID] — scope triaged as a standalone Story`) so
312
+ the audit trail is bidirectional.
313
+
314
+ 3. **Close the Epic in favor of the replacement.** Once `/story-plan` has
315
+ created the replacement Story (capture its number as `#N`), close the Epic
316
+ with a cross-linking comment:
317
+
318
+ ```bash
319
+ gh issue close [Epic_ID] --repo <owner>/<repo> \
320
+ --comment "Closed in favor of #N — scope triaged as a standalone Story."
321
+ ```
322
+
323
+ This is the only `gh issue close` in the path, and it runs **after** the
324
+ replacement Story exists, so the conversion never strands a closed Epic
325
+ with no successor. The replacement-Story back-link plus this close comment
326
+ give a reviewer the full bidirectional trail.
327
+
328
+ The conversion mutates two issues (creates the Story, closes the Epic) — both
329
+ behind the single operator confirmation above. After conversion `/epic-plan`
330
+ exits: the work now lives on the standalone Story, which the operator delivers
331
+ via [`/single-story-deliver`](helpers/single-story-deliver.md) or
332
+ [`/story-deliver`](story-deliver.md).
333
+
334
+ ## Phase 6: Epic Clarity Gate
335
+
336
+ Runs on every existing-Epic invocation, after Phase 5 (Re-Plan
337
+ Detection) and the Phase 5.5 story-sized advisory, and before Phase 7
338
+ (PRD, Tech Spec & Acceptance Spec). The gate scores the Epic body
339
+ against the five canonical
340
+ sections from
341
+ [`.agents/templates/epic-from-idea.md`](../templates/epic-from-idea.md)
342
+ (Context, Goal, Non-Goals, Scope, Acceptance Criteria) and either
343
+ skips fast (when the Epic body is already clear) or drops into a
344
+ refinement loop seeded from the current Epic body. The scorer also
345
+ accepts common heading variants for back-compat (e.g. `## Problem`,
346
+ `## Direction`, `## MVP Scope`, `## Not Doing`, `## Out of Scope`) so
347
+ hand-authored Epics that predate the canonical headings continue to
348
+ pass without rewording.
349
+
350
+ The rubric is deterministic: section-presence against the five
351
+ canonical headings. A `clear` verdict requires **both** ≥ 4 of 5
352
+ sections present **and** the **Acceptance Criteria** section present —
353
+ AC is a required section, not one of the four optional passers, so an
354
+ Epic with no Acceptance Criteria is always `needs-refinement` (it would
355
+ otherwise hard-fail the `/epic-deliver` start gate downstream). See
356
+ [`lib/epic-plan-clarity.js`](../scripts/lib/epic-plan-clarity.js)
357
+ for the scoring logic.
358
+
359
+ 1. **Score the body**: Run the clarity-check CLI in context-emission
360
+ mode.
361
+
362
+ ```bash
363
+ node .agents/scripts/epic-plan-clarity.js --epic [Epic_ID] --emit-context \
364
+ > temp/epic-[Epic_ID]/clarity-context.json
365
+ ```
366
+
367
+ The envelope carries
368
+ `{ epicId, epicBody, verdict, sections, missingOrPlaceholder }`.
369
+
370
+ 2. **Clear fast path**: When `verdict === 'clear'`, print
371
+ `Epic clarity: clear — proceeding to Phase 7.` and continue. No
372
+ HITL, no prompt.
373
+
374
+ 3. **Needs-refinement path**: When `verdict === 'needs-refinement'`,
375
+ activate the
376
+ [`core/idea-refinement`](../skills/core/idea-refinement/SKILL.md)
377
+ skill **seeded from the current Epic body** (not a blank seed),
378
+ with `missingOrPlaceholder` as the convergence target. The skill
379
+ runs its three-phase divergent → convergent → sharpen loop and
380
+ returns a sharpened one-pager.
381
+
382
+ 4. **Re-render the body**: Call
383
+ `renderEpicBody({ onePager, template })` from
384
+ [`lib/epic-plan-ideation.js`](../scripts/lib/epic-plan-ideation.js)
385
+ (the same helper Phase 3 uses), passing the contents of
386
+ [`.agents/templates/epic-from-idea.md`](../templates/epic-from-idea.md).
387
+ Write the result to `temp/epic-[Epic_ID]/clarity-update.md`.
388
+
389
+ 5. **HITL stop — confirm the diff**: Display the diff between the
390
+ current Epic body and the sharpened body and **STOP**. Operator
391
+ approves, edits, or aborts. Flag the blast radius in the
392
+ confirmation prompt: an approved body change feeds **three**
393
+ downstream artifacts (PRD, Tech Spec, Acceptance Spec) — treat
394
+ this gate as a one-shot rewrite, not an iterative draft. The
395
+ Constraint ("Do not modify existing issues without explicit
396
+ permission") is honored — no `gh issue edit` call until the
397
+ operator confirms.
398
+
399
+ 6. **Persist**: On approval, run the persist mode:
400
+
401
+ ```bash
402
+ node .agents/scripts/epic-plan-clarity.js --epic [Epic_ID] \
403
+ --updated-body temp/epic-[Epic_ID]/clarity-update.md
404
+ ```
405
+
406
+ The CLI persists the new body via `provider.updateTicket` and
407
+ posts a `clarity-gate-update` audit comment recording the change.
408
+ Idempotent: no-op when the file content matches the current body.
409
+
410
+ 7. **Re-verify**: Re-run the `--emit-context` step once to confirm
411
+ the verdict flipped to `clear`. If it still reads
412
+ `needs-refinement`, abort with a non-zero exit and surface a
413
+ remediation hint to the operator. Do not loop — one refinement
414
+ pass per invocation, matching the `--force` re-plan pattern.
415
+
416
+ ## Phase 7: Epic Planning (PRD, Tech Spec & Acceptance Spec)
417
+
418
+ > **Epic-lease preflight (workflow guard).** Before any Phase 7 mutation,
419
+ > `epic-plan-spec.js` acquires the Epic-lease via the assignee-as-lease
420
+ > primitive (`lib/orchestration/ticket-lease.js`, wired through
421
+ > `lib/orchestration/epic-plan-lease-guard.js`). The lease rides the Epic's
422
+ > single assignee: the operator (`github.operatorHandle` in `.agentrc.json`)
423
+ > claims the Epic for the duration of the plan. The guard **fails closed**:
424
+ > `/epic-plan` emits no `story.heartbeat` during its run (heartbeats are a
425
+ > delivery-time signal), so there is no live-heartbeat source to judge a
426
+ > concurrent plan's liveness from. Any **foreign assignee** is therefore
427
+ > treated as a live claim — the persist half **exits non-zero and names the
428
+ > current owner**, so two `/epic-plan` runs cannot drive the same Epic
429
+ > concurrently. Pass **`--steal`** to forcibly transfer a foreign claim once
430
+ > you have confirmed the other run is dead. An **unassigned** Epic, or one
431
+ > **already held by this operator**, is taken (or re-affirmed) silently. The
432
+ > lease is **released after Phase 8** (decompose) completes; see the Phase 8
433
+ > note.
434
+
435
+ <!-- separator: adjacent blockquotes -->
436
+
437
+ > **Idempotent context tickets.** The persist half is find-or-create keyed on
438
+ > the Epic's `linkedIssues`: a re-run **reuses the already-linked PRD and Tech
439
+ > Spec issues** (and Acceptance Spec, when present) instead of creating
440
+ > duplicates. Pass `--force` to overwrite the canonical context tickets in
441
+ > place (same issue numbers, refreshed bodies).
442
+
443
+ <!-- separator: adjacent blockquotes -->
444
+
445
+ > **Three context tickets, not two.** Every Epic carries three planning
446
+ > artifacts as linked GitHub sub-issues: PRD (`context::prd`), Tech Spec
447
+ > (`context::tech-spec`), and Acceptance Spec
448
+ > (`context::acceptance-spec`). The Acceptance Spec captures the
449
+ > stable-ID acceptance criteria table (`| AC ID | Outcome | Feature
450
+ > File | Scenario | Disposition |`) that drives close-time
451
+ > reconciliation during `/epic-deliver` Phase 6. Operators may opt out
452
+ > for refactor-only or docs-only Epics by applying the
453
+ > `acceptance::n-a` label to the Epic ticket — when present, the
454
+ > `epic-plan-spec-author` skill skips the Acceptance Spec output and
455
+ > the runtime gates (start gate, finalize reconciler) honour the
456
+ > waiver — the spec ticket itself need not be authored or approved when
457
+ > the waiver is set. See [SDLC § Acceptance Spec — the third planning
458
+ > context ticket](../docs/SDLC.md#acceptance-spec--the-third-planning-context-ticket)
459
+ > for the full lifecycle.
460
+
461
+ <!-- separator: adjacent blockquotes -->
462
+
463
+ > **Parallel-safe file naming (per-Epic tree).** Multiple Epics may be
464
+ > planned or decomposed concurrently. Every temp file written in this
465
+ > workflow lives under the per-Epic tree
466
+ > (`temp/epic-[Epic_ID]/<artifact>`) — e.g.
467
+ > `temp/epic-[Epic_ID]/planner-context.json`,
468
+ > `temp/epic-[Epic_ID]/prd.md`, `temp/epic-[Epic_ID]/techspec.md`,
469
+ > `temp/epic-[Epic_ID]/decomposer-context.json`,
470
+ > `temp/epic-[Epic_ID]/tickets.json`. The directory namespace is the
471
+ > isolation boundary; basenames inside it are stable. Do **not** reuse
472
+ > bare flat names like `temp/prd.md` or the legacy
473
+ > `temp/<artifact>-epic-<id>.<ext>` shape — both have been retired.
474
+ >
475
+ > **Durability.** The per-Epic tree is durable across runs: only the
476
+ > wrapper scripts perform intra-phase cleanup of files they wrote in
477
+ > the same invocation (see
478
+ > [`lib/plan-phase-cleanup.js`](../scripts/lib/plan-phase-cleanup.js)).
479
+ > Nothing else garbage-collects the tree, so cross-Epic artifacts —
480
+ > retros, perf reports, signals, manifests — accumulate until an
481
+ > operator explicitly removes them.
482
+
483
+ 1. **Gather Authoring Context**: Run the spec-phase CLI in context-emission
484
+ mode to fetch the Epic body, scraped project docs, and the recommended
485
+ system prompts.
486
+
487
+ ```bash
488
+ node .agents/scripts/epic-plan-spec.js --epic [Epic_ID] --emit-context > temp/epic-[Epic_ID]/planner-context.json
489
+ ```
490
+
491
+ 2. **Activate the `epic-plan-spec-author` skill**: Read
492
+ [`<agentRoot>/skills/core/epic-plan-spec-author/SKILL.md`](../skills/core/epic-plan-spec-author/SKILL.md)
493
+ via the `Read` tool (resolve `<agentRoot>` from
494
+ `project.paths.agentRoot` — default `.agents`) and execute its
495
+ procedure with `[Epic_ID]` as input. The skill reads
496
+ `temp/epic-[Epic_ID]/planner-context.json`, authors the PRD, Tech
497
+ Spec, **risk verdict**, and **Acceptance Spec** against the embedded
498
+ system prompts, and writes them to `temp/epic-[Epic_ID]/prd.md`,
499
+ `temp/epic-[Epic_ID]/techspec.md`,
500
+ `temp/epic-[Epic_ID]/risk-verdict.json`, and
501
+ `temp/epic-[Epic_ID]/acceptance-spec.md`. The skill is the
502
+ authoritative authoring step — do **not** inline the PRD / Tech
503
+ Spec / risk-verdict / Acceptance Spec drafting in the workflow
504
+ body. The skill front-matter declares
505
+ `allowed_tools: [Read, Write, Bash]`; it never calls GitHub.
506
+
507
+ The skill body carries the authoritative PRD, Tech Spec, and
508
+ Acceptance Spec system prompts. The `systemPrompts` field on the
509
+ `--emit-context` envelope is a backstop for legacy callers; the
510
+ skill body wins when the two surfaces diverge.
511
+
512
+ 3. **Persist to GitHub**: Run the spec-phase CLI's persist half. It
513
+ schema-validates the planner-authored risk verdict (`--risk-verdict`,
514
+ required — a missing or malformed verdict fails closed before any
515
+ GitHub mutation), derives the `planningRisk` envelope from it
516
+ (`deriveRiskEnvelope`), records a `risk-verdict` structured comment
517
+ on the Epic, flips the Epic to `agent::review-spec`, and writes the
518
+ `epic-plan-state` checkpoint (including the `riskVerdict` field).
519
+ The `--acceptance-spec` flag persists the third planning ticket
520
+ (`context::acceptance-spec`) alongside the PRD and Tech Spec; the
521
+ persist half fails loudly if any file is missing or empty. Omit
522
+ `--acceptance-spec` only when the Epic carries the `acceptance::n-a`
523
+ waiver label.
524
+
525
+ ```bash
526
+ # Normal planning (three context tickets)
527
+ node .agents/scripts/epic-plan-spec.js --epic [Epic_ID] \
528
+ --prd temp/epic-[Epic_ID]/prd.md \
529
+ --techspec temp/epic-[Epic_ID]/techspec.md \
530
+ --risk-verdict temp/epic-[Epic_ID]/risk-verdict.json \
531
+ --acceptance-spec temp/epic-[Epic_ID]/acceptance-spec.md
532
+
533
+ # Re-planning (--force overwrites the three context tickets IN PLACE —
534
+ # same PRD / Tech Spec / Acceptance Spec issue numbers, refreshed bodies,
535
+ # tickets kept open, one regeneration audit comment each. Feature/Story
536
+ # child tickets are still close-and-recreate at decomposition time.)
537
+ node .agents/scripts/epic-plan-spec.js --epic [Epic_ID] \
538
+ --prd temp/epic-[Epic_ID]/prd.md \
539
+ --techspec temp/epic-[Epic_ID]/techspec.md \
540
+ --risk-verdict temp/epic-[Epic_ID]/risk-verdict.json \
541
+ --acceptance-spec temp/epic-[Epic_ID]/acceptance-spec.md --force
542
+
543
+ # Waived (acceptance::n-a label on Epic — no spec authored)
544
+ node .agents/scripts/epic-plan-spec.js --epic [Epic_ID] \
545
+ --prd temp/epic-[Epic_ID]/prd.md \
546
+ --techspec temp/epic-[Epic_ID]/techspec.md \
547
+ --risk-verdict temp/epic-[Epic_ID]/risk-verdict.json
548
+ ```
549
+
550
+ 4. **Verification and review routing**:
551
+ - Verify that the PRD, Technical Specification, and (when not waived)
552
+ Acceptance Specification have been posted as linked issues under
553
+ the Epic.
554
+ - Read `planningRisk` from the persist stdout JSON (or the
555
+ `epic-plan-state` checkpoint). Branch on
556
+ `planningRisk.requiresReview` unless the operator passed
557
+ `--force-review`:
558
+ - **High risk** (`requiresReview === true`) or **operator override**
559
+ (`--force-review`): **STOP**. Ask the USER to review the generated
560
+ PRD, Tech Spec, and Acceptance Spec on GitHub. Approval is the
561
+ user's verbal OK in this session — the three context tickets stay
562
+ **open** through delivery and are closed automatically by
563
+ `/epic-deliver` when the Epic PR opens. Do NOT proceed
564
+ to decomposition until the user confirms the plan is accurate.
565
+ - **Low risk** (`requiresReview === false` and no `--force-review`):
566
+ Emit the auto-proceed message from the persist stdout
567
+ (`reviewRouting.operatorMessage`) and **continue directly to Phase 8**
568
+ without an extra review stop. The Epic still carries
569
+ `agent::review-spec` until decomposition completes; the routing
570
+ decision is recorded in the `epic-plan-state` checkpoint.
571
+
572
+ 5. **Tech Spec freshness check (advisory)**: After the Tech Spec issue
573
+ is created, `epic-plan-spec.js` runs
574
+ [`validateSpecFreshness`](../scripts/lib/orchestration/spec-freshness.js)
575
+ against the authored Tech Spec body, probing every cited path-shape
576
+ reference (backticked paths, `// header` lines in code blocks, and
577
+ inline mentions of paths under `.agents/`, `src/`, `lib/`, `app/`,
578
+ `tests/`, `packages/`, `scripts/`, `docs/`) against the configured
579
+ `baseBranch`. Results land in three buckets:
580
+ - **fresh** — path exists at the base ref (no action).
581
+ - **ambiguous** — path is absent but surrounding prose carries a
582
+ net-new cue (`introduce`, `add`, `create`, `new file`, `to be
583
+ created`, etc.); surfaced for review without alarm.
584
+ - **stale** — path is absent and no net-new cue is nearby; likely a
585
+ reference the Architect inherited from drift-stale docs.
586
+
587
+ When ≥1 stale reference is detected, a `spec-freshness` structured
588
+ comment is upserted on the Tech Spec issue listing each citation
589
+ with its line number. The full report is also written to
590
+ `<tempRoot>/epic-<id>-spec-freshness.json` for downstream tooling.
591
+ The check is **advisory and non-blocking** — Phase 7 completes even
592
+ when stale references are present, so the operator retains final
593
+ judgment on edge cases. If the run summary shows
594
+ `⚠️ Spec freshness: N stale / M ambiguous`, review the Tech Spec
595
+ issue's `spec-freshness` comment and correct the cited spec body
596
+ before approving the plan for Phase 8.
597
+
598
+ 6. **BDD scenario cross-reference (advisory)**: When the project has
599
+ adopted BDD, `epic-plan-spec.js` populates the planner-context
600
+ envelope with `bddScenarios` — the output of
601
+ [`scanBddScenarios`](../scripts/lib/bdd-scenario-scanner.js) over
602
+ the canonical feature roots resolved by
603
+ [`resolveFeatureRoots`](../scripts/lib/bdd-runner-detect.js)
604
+ (`tests/features`, `features`, `test/features`). The Acceptance
605
+ Engineer step in the [`epic-plan-spec-author`](../skills/core/epic-plan-spec-author/SKILL.md)
606
+ skill scores each planned AC against the scenario index via
607
+ `findBestScenarioMatch`; when an existing scenario covers an AC's
608
+ outcome, the AC's `Scenario` column is annotated with `<file>:L<line>`
609
+ and the `Disposition` becomes `unchanged` / `refined` instead of
610
+ `new`. When `bddScenarios` is empty (no `.feature` files), the skill
611
+ degrades silently and the spec is authored exactly as before. The
612
+ matcher is keyword-based and deterministic so re-runs produce stable
613
+ dispositions.
614
+
615
+ 7. **Cleanup**: The wrapper script (`epic-plan-spec.js`) deletes the Phase 7
616
+ temp files automatically on success — no operator action required. The
617
+ cleanup contract lives in
618
+ [`lib/plan-phase-cleanup.js`](../scripts/lib/plan-phase-cleanup.js).
619
+ **Run the Phase 7.5 spec-validate gate (below) on
620
+ `temp/epic-[Epic_ID]/techspec.md` *before* this cleanup deletes the file** —
621
+ the gate reads the authored spec from temp.
622
+
623
+ ## Phase 7.5: Tech Spec Section Gate (`epic-plan-spec-validate.js`)
624
+
625
+ > **Hard gate (blocks Phase 8).** This step runs **after** the Tech Spec is
626
+ > authored (Phase 7) and **before** decomposition (Phase 8). Unlike the
627
+ > advisory spec-freshness and BDD cross-reference checks in Phase 7, this gate
628
+ > is **blocking**: a missing required section exits non-zero and Phase 8 MUST
629
+ > NOT proceed until it is resolved. It is the Phase 8-side counterpart to the
630
+ > Phase 6 Epic Clarity Gate — same detect-then-prompt pattern, one phase later.
631
+
632
+ **Why this gate exists.** Phase 8.3 (Holistic Consolidation) reconciles the
633
+ draft ticket array against the Tech Spec's `## Delivery Slicing` section, which
634
+ the [`epic-plan-decompose-author`](../skills/core/epic-plan-decompose-author/SKILL.md)
635
+ skill uses as the capability-boundary anchor (see Phase 8 step 2 below). When
636
+ the authored Tech Spec omits that section, the consolidation pass runs against a
637
+ void and produces groupings that reflect **technical shape** (e.g. cron jobs
638
+ together) rather than **capability boundaries** — reproduced on Epic #18 in
639
+ `dsj1984/athportal` (planned with v1.54.0), whose spec carried a detailed
640
+ `## Core Components` table but no `## Delivery Slicing` section.
641
+
642
+ **Run the gate** against the authored Tech Spec before the Phase 7 cleanup
643
+ deletes `temp/epic-[Epic_ID]/techspec.md`:
644
+
645
+ ```bash
646
+ node .agents/scripts/epic-plan-spec-validate.js \
647
+ --techspec temp/epic-[Epic_ID]/techspec.md
648
+ ```
649
+
650
+ - **Exit 0** — the spec contains a `## Delivery Slicing` heading (case-
651
+ insensitive; the gate also accepts the variant `## Delivery slicing` and the
652
+ shorthand `## Slicing`). Continue to Phase 8.
653
+ - **Exit non-zero** — the required section is missing. The gate is implemented
654
+ by [`lib/orchestration/spec-section-validator.js`](../scripts/lib/orchestration/spec-section-validator.js)
655
+ and prints an operator-visible message naming the missing section and the two
656
+ recovery paths:
657
+
658
+ ```text
659
+ [epic-plan-spec-validate] Tech Spec is missing required section(s): ## Delivery Slicing
660
+ Spec file: temp/epic-18/techspec.md
661
+
662
+ Phase 8 (decomposition) reconciles the draft ticket array against the
663
+ Tech Spec's "## Delivery Slicing" section — without it, the Phase 8.3
664
+ consolidation pass has no capability-boundary anchor and groups by
665
+ technical shape instead.
666
+
667
+ To continue, do ONE of the following before re-running Phase 8:
668
+ 1. Re-author the Tech Spec (re-run the Phase 7 spec-author step) so it
669
+ emits a "## Delivery Slicing" section, OR
670
+ 2. Add a "## Delivery Slicing" section to the Tech Spec by hand,
671
+ describing the capability boundaries the work should be sliced along.
672
+ ```
673
+
674
+ **STOP** on a non-zero exit: do not advance to Phase 8. Re-author the Tech
675
+ Spec (re-run the Phase 7 spec-author step) or add a `## Delivery Slicing`
676
+ section to the Tech Spec issue body by hand, then re-run the gate until it
677
+ exits 0.
678
+
679
+ ## Phase 8: Work Breakdown Decomposition
680
+
681
+ > **Open-children guard (workflow guard).** Before persisting the breakdown,
682
+ > `epic-plan-decompose.js` refuses to run when the Epic **already has open
683
+ > Feature/Story children**, unless `--force` (close + recreate the tree) or
684
+ > `--resume` (continue a partial persist) is set. This stops a re-run from
685
+ > stacking a duplicate Feature/Story tree on top of an existing one — the
686
+ > phase exits non-zero and lists the open children. Once persist completes,
687
+ > the Epic-lease acquired in Phase 7 is **released** (best-effort; a release
688
+ > failure never fails decompose).
689
+
690
+ <!-- separator: adjacent blockquotes -->
691
+
692
+ > **Hierarchy.** The decomposer emits an Epic → Feature → Story tree.
693
+ > Acceptance criteria and verification steps are inlined on each Story
694
+ > body (`acceptance[]` / `verify[]` fields) and resolved against the
695
+ > Acceptance Spec context ticket at close time. See
696
+ > [`.agents/instructions.md` § 5.D](../instructions.md) for the full
697
+ > contract.
698
+
699
+ 1. **Gather Decomposition Context**:
700
+
701
+ ```bash
702
+ node .agents/scripts/epic-plan-decompose.js --epic [Epic_ID] --emit-context > temp/epic-[Epic_ID]/decomposer-context.json
703
+ ```
704
+
705
+ 2. **Activate the `epic-plan-decompose-author` skill**: Read
706
+ [`<agentRoot>/skills/core/epic-plan-decompose-author/SKILL.md`](../skills/core/epic-plan-decompose-author/SKILL.md)
707
+ via the `Read` tool (resolve `<agentRoot>` from
708
+ `project.paths.agentRoot` — default `.agents`) and execute its
709
+ procedure with `[Epic_ID]` as input. The skill reads
710
+ `temp/epic-[Epic_ID]/decomposer-context.json` (PRD body, Tech Spec
711
+ body, risk heuristics, `maxTickets` cap, `contextMode`), applies its
712
+ embedded decomposer system prompt + ticket schema, and writes the
713
+ ticket array to `temp/epic-[Epic_ID]/tickets.json`. Do **not** inline
714
+ the JSON authoring in the workflow body.
715
+
716
+ The `maxTickets` cap (`planning.maxTickets` in
717
+ `.agentrc.json`; framework default in
718
+ `.agents/scripts/lib/config/limits.js`) is a **reviewability budget**,
719
+ not a hard authoring ceiling: a draft over budget warns at authoring
720
+ time and is rejected at persist unless rerun with `--allow-over-budget`
721
+ (after confirming the over-budget rationale on the Epic). The
722
+ `epic-plan-decompose.js` script also logs the resolved budget to stderr
723
+ so a misconfigured key surfaces immediately. The skill body is the
724
+ authoritative source of the decomposer prompt; the `systemPrompt`
725
+ field on the emit envelope is a backstop for legacy callers.
726
+
727
+ When the Tech Spec carries a `## Delivery Slicing` section (authored by
728
+ `epic-plan-spec-author` in Phase 7), the decompose-author skill authors
729
+ toward the Architect's proposed shippable-Story clusters; it degrades
730
+ gracefully when the section is absent.
731
+
732
+ 3. **Phase 8.3 — Holistic Consolidation (HITL diff gate)**: After the
733
+ draft `temp/epic-[Epic_ID]/tickets.json` exists and **before** the persist
734
+ call below, activate the
735
+ [`epic-plan-consolidate`](../skills/core/epic-plan-consolidate/SKILL.md)
736
+ skill with `[Epic_ID]` as input. This is a **separate critic pass with
737
+ fresh context** (not a self-review appended to the author skill): it reads
738
+ the draft array plus the PRD / Tech Spec, reconciles the draft against the
739
+ Tech Spec `## Delivery Slicing` target, and emits a **consolidated**
740
+ `tickets.json` plus a human-readable
741
+ `temp/epic-[Epic_ID]/consolidation-report.md`. Its operations are
742
+ scope-preserving only — **merge Stories, collapse single-Story Features
743
+ into siblings, re-parent, rewire `depends_on`** — and it MUST NOT add scope
744
+ or invent tickets; it resolves single-Story Features by **collapsing**
745
+ them, never by splitting a lone Story. It runs **before** the deterministic
746
+ validator (step 4), so the validator re-checks its output and the critic
747
+ cannot emit an invalid plan.
748
+
749
+ **Show the operator the consolidation report (the before/after diff +
750
+ rationale) before persisting.** Consolidation is never auto-applied without
751
+ review: on operator approval, persist the consolidated `tickets.json`; on
752
+ rejection, persist the draft instead. This is a sub-step of Phase 8 — it
753
+ does **not** renumber the top-level lifecycle phases (9–12).
754
+
755
+ 4. **Persist to GitHub**: Run the decompose CLI's persist half. It
756
+ validates the ticket array (`validateAndNormalizeTickets`), creates
757
+ the Feature/Story issues, flips the Epic to `agent::ready`, and
758
+ writes the `epic-plan-state` checkpoint.
759
+
760
+ ```bash
761
+ # Normal decomposition
762
+ node .agents/scripts/epic-plan-decompose.js --epic [Epic_ID] \
763
+ --tickets temp/epic-[Epic_ID]/tickets.json
764
+
765
+ # Re-planning (close old tickets first)
766
+ node .agents/scripts/epic-plan-decompose.js --epic [Epic_ID] \
767
+ --tickets temp/epic-[Epic_ID]/tickets.json --force
768
+ ```
769
+
770
+ 5. **Cross-Validation**:
771
+ - Hierarchy completeness, dependency-DAG acyclicity, and `risk::high`
772
+ labelling are deterministic invariants enforced by
773
+ `validateAndNormalizeTickets` in
774
+ [`lib/orchestration/ticket-validator.js`](../scripts/lib/orchestration/ticket-validator.js);
775
+ its output during decomposition is the canonical proof — no manual
776
+ re-check needed.
777
+ - **File-assumption gate (Story #2636)**: Each Story's `body.changes`
778
+ and `body.references` entries declare an explicit `assumption` ∈
779
+ `creates | refactors-existing | exists | deletes`. The validator
780
+ probes the base branch for every declared path and rejects the
781
+ decompose when the declaration contradicts reality:
782
+ - `creates` + path **exists** at base → error.
783
+ - `refactors-existing` / `exists` / `deletes` + path **absent** at
784
+ base → error.
785
+ Errors are batched per-Story into the validator's `errors` envelope
786
+ so the decompose loop surfaces every mismatch in a single re-prompt
787
+ rather than one at a time.
788
+ - **Scope-overlap check (docs/runbook downstream of config work)**:
789
+ Scan for Stories whose scope is "docs update", "runbook", or
790
+ "README" that land downstream of an earlier "config + runbook"
791
+ Story in the same Epic. If the earlier Story's AC already covers
792
+ the same document, the downstream Story's deliverable is likely
793
+ absorbed. Append a "Scope verification note" to the downstream
794
+ Story body pointing the executor to `git diff main -- <path>`
795
+ against the upstream Story branch so they can confirm whether a
796
+ substantive edit is still required (or only a cross-reference
797
+ remains). The decomposer system prompt emits this flag
798
+ automatically where it can detect the pattern — this checklist
799
+ item is the human/host-LLM backstop.
800
+ - **Action**: Fix any scope-overlap exceptions or validator failures by
801
+ re-running the scripted force path so the change is recorded in tooling
802
+ rather than hand-applied:
803
+
804
+ ```bash
805
+ node .agents/scripts/epic-plan-decompose.js \
806
+ --epic [Epic_ID] \
807
+ --tickets temp/epic-[Epic_ID]/tickets.json \
808
+ --force
809
+ ```
810
+
811
+ 6. **Audit**:
812
+ - Check the Epic's comment thread to ensure the backlog summary was posted.
813
+ - Verify that at least one `type::feature` and `type::story` issue
814
+ was created.
815
+
816
+ 7. **Cleanup**: The wrapper script (`epic-plan-decompose.js`) deletes the
817
+ Phase 8 temp files automatically on success — no operator action required.
818
+ The cleanup contract lives in
819
+ [`lib/plan-phase-cleanup.js`](../scripts/lib/plan-phase-cleanup.js).
820
+
821
+ ## Phase 9: Execution Roadmap (Story Dispatch)
822
+
823
+ 1. **Generate Roadmap**: Automatically invoke the dispatcher in dry-run mode to
824
+ calculate execution waves and model recommendations:
825
+
826
+ ```bash
827
+ node .agents/scripts/dispatcher.js [Epic_ID] --dry-run
828
+ ```
829
+
830
+ 2. **Verify Output**:
831
+ - Confirm the **Story Dispatch Table** is printed.
832
+ - Check for any stories in **Wave 0** — these are ready for immediate
833
+ execution.
834
+
835
+ > **Manifest persistence (v5.9.0):** the dispatcher also posts the manifest
836
+ > as a `dispatch-manifest` structured comment on the Epic (idempotent —
837
+ > re-runs replace the prior comment). That comment is the source of truth for
838
+ > the Wave Completeness Gate in `/epic-deliver` Step 0.5 and for any external
839
+ > wave-tracking tooling.
840
+
841
+ 3. **Handoff**: Provide the user with the recommended next step:
842
+
843
+ > "Planning is complete. Run `/epic-deliver #[Epic ID]` to start the wave
844
+ > loop, or pick a single Story from Wave 0 and run `/story-deliver #[Story
845
+ > ID]` to drive it directly."
846
+
847
+ ## Phase 10: Readiness Health Check
848
+
849
+ Run the post-plan health check to validate the backlog before handing off to
850
+ `/epic-deliver`. The default mode runs only the cheap checks
851
+ (config + git remote) and targets sub-2-second turnaround. The script itself
852
+ always exits 0; the structured JSON on stdout reports findings.
853
+
854
+ ```bash
855
+ node .agents/scripts/epic-plan-healthcheck.js --epic [Epic_ID]
856
+ ```
857
+
858
+ **The healthcheck is a blocking exit condition for `agent::ready`.**
859
+ Story #2921 (Epic #2880 F7) wired the persist half of
860
+ `epic-plan-decompose.js` to re-run the same default check before
861
+ flipping the Epic to `agent::ready`.
862
+ When the inline run reports `ok: false`, the persist phase **refuses the
863
+ flip** and throws with the failing check's `reason`. The Epic stays on its
864
+ prior label (`agent::review-spec` in the normal flow) until either the
865
+ underlying check passes on a rerun, or the operator applies the
866
+ `planning::healthcheck-waived` label to the Epic and reruns the persist
867
+ phase. See `.agents/docs/SDLC.md` § "`agent::ready` exit conditions" for the
868
+ full handoff contract and the waiver scope.
869
+
870
+ The script emits a single line of JSON to stdout:
871
+
872
+ ```json
873
+ {
874
+ "ok": true,
875
+ "degraded": false,
876
+ "reason": null,
877
+ "checks": [
878
+ { "name": "config", "ok": true, "durationMs": 12, "detail": "..." },
879
+ { "name": "git-remote", "ok": true, "durationMs": 234, "detail": "..." }
880
+ ]
881
+ }
882
+ ```
883
+
884
+ Modes (additive — the fast checks always run):
885
+
886
+ - **(default)** — config validation + git remote check only.
887
+ - **`--paranoid`** — adds ticket-hierarchy revalidation. Requires `--epic`.
888
+ Use this when you want the full backlog audit before execution.
889
+ - **`--prime-install`** — adds the pnpm content-addressable-store prime
890
+ (`pnpm install --frozen-lockfile`, up to 300s). Run only when
891
+ `nodeModulesStrategy: 'pnpm-store'` is configured and you want subsequent
892
+ worktree installs to be near-instant instead of fetching from scratch.
893
+
894
+ If `ok` is `false`, review the entries in `checks[]`, resolve the failing
895
+ check(s), and rerun the persist phase. Apply `planning::healthcheck-waived`
896
+ to the Epic only when the failure is environmental and the operator has
897
+ triaged it (e.g. a known `origin` outage during a maintenance window).
898
+
899
+ ## Phase 11: Plan Comprehension Gate
900
+
901
+ An **opt-in, advisory** gate that offers the operator a guided walkthrough of
902
+ the freshly planned backlog before they hand off to `/epic-deliver`. The plan
903
+ is the moment the operator authorizes an autonomous fan-out of subagents — this
904
+ phase exists so they can *understand and endorse* the approach while it is
905
+ still free to change, not after the code lands.
906
+
907
+ > **Non-blocking by construction.** This phase runs **after** Phase 10 has
908
+ > already flipped the Epic to `agent::ready`. It never gates that flip, never
909
+ > blocks the handoff, and the operator can decline or stop it at any point.
910
+ > `risk::high` remains planning metadata and `agent::blocked` remains the only
911
+ > mandatory runtime pause — this gate adds neither.
912
+
913
+ ### 1. Decide whether to offer the walkthrough (LM judgment)
914
+
915
+ There is **no `--flag`**. Evaluate the plan with judgment and **default to
916
+ skipping silently**. Offer the walkthrough only when the plan is genuinely
917
+ worth one. Signals that warrant offering:
918
+
919
+ - The roadmap spans **multiple waves** or a **large Story count**.
920
+ - Any Story or the Epic carries **`risk::high`**, or the plan matches the
921
+ `planning.riskHeuristics` in `.agentrc.json` (destructive/irreversible
922
+ changes, shared auth/security, CI/CD gate changes, monorepo-wide rewrites,
923
+ destructive migrations).
924
+ - The Tech Spec introduces a **novel architectural decision** or a wide
925
+ **blast radius** across subsystems.
926
+
927
+ A small, single-wave, low-risk plan proceeds straight to Phase 12 with no
928
+ prompt. When in doubt on a borderline plan, make a one-line offer rather than
929
+ forcing the walkthrough.
930
+
931
+ ### 2. Run the walkthrough (when offered and accepted)
932
+
933
+ Activate the
934
+ [`core/knowledge-transfer`](../skills/core/knowledge-transfer/SKILL.md) skill
935
+ with the **plan** as the subject — the Epic body, the linked PRD / Tech Spec
936
+ context tickets, the decomposition (Features/Stories with inline
937
+ `acceptance[]` / `verify[]`), and the Phase 9 wave roadmap. The skill owns the
938
+ method (restate-first, the why-ladder, mastery gates, depth levels, optional
939
+ quizzing, the persistent `temp/comprehension-*.md` checklist).
940
+
941
+ **Interruptible at every checkpoint.** Each step MUST offer an explicit
942
+ "I'm good — proceed to `/epic-deliver`" exit. The instant the operator takes
943
+ it, stop the walkthrough and advance to Phase 12. Never trap the operator in
944
+ the loop.
945
+
946
+ ### 3. Advance
947
+
948
+ Whether the walkthrough was skipped, declined, completed, or stopped early,
949
+ proceed to Phase 12. This gate produces no label transition and no blocking
950
+ condition.
951
+
952
+ ## Phase 12: Notification & Handoff
953
+
954
+ 1. **Notify Operator (INFO)**:
955
+ - Post a summary comment on the Epic issue with work breakdown stats.
956
+ - @mention the operator (informational — no webhook for planning) by running
957
+ the notification script:
958
+
959
+ ```bash
960
+ node .agents/scripts/notify.js [Epic_ID] "Planning complete, review tickets. Backlog decomposition complete. Epic is ready for /epic-deliver." --action
961
+ ```
962
+
963
+ ## Troubleshooting
964
+
965
+ - If `epic-plan-spec.js --emit-context` fails, confirm the Epic exists and
966
+ has a body with enough initial context.
967
+ - If `epic-plan-decompose.js` rejects the tickets file, re-read the
968
+ validator's error message — the most common causes are a Story with no
969
+ `parent_slug`, a Story whose `parent_slug` does not point at a Feature, or a
970
+ dependency cycle in the Story `depends_on` graph.
971
+ - If decomposition persisted the tickets but the Epic is not on `agent::ready`,
972
+ you likely called `runDecomposePhase` from `epic-plan-decompose.js`
973
+ directly without completing the persist flow — only the CLI surface
974
+ (`node epic-plan-decompose.js --tickets ...`) drives the full
975
+ reconciler pipeline and flips the lifecycle label. Apply `agent::ready`
976
+ by hand and re-run via the CLI next time.
977
+ - **Secondary rate limit on large Epics**: For backlogs over ~60 tickets,
978
+ GitHub's secondary rate limit (HTTP 403, body contains "secondary rate
979
+ limit") can trip mid-decomposition after ~80 issue creations. The
980
+ http-client retries automatically with a 30–120s backoff and the
981
+ decomposer drops `concurrencyCap` to 1 for the rest of the run on the
982
+ first observation. If the run still aborts (network drop, exhausted
983
+ retries, etc.), resume from the partial backlog with:
984
+
985
+ ```bash
986
+ node .agents/scripts/epic-plan-decompose.js --epic [Epic_ID] \
987
+ --tickets temp/epic-[Epic_ID]/tickets.json --resume
988
+ ```
989
+
990
+ `--resume` is idempotent: the reconciler recovers the slug→issue map
991
+ from `temp/epic-[Epic_ID]/[Epic_ID].state.json`, and when that file is
992
+ missing or incomplete it **reseeds the map from live GitHub state** by
993
+ matching each spec slug against the open children of the Epic by title.
994
+ Slugs that resolve to an existing open child diff as Updates/no-ops;
995
+ only the genuinely-missing children are created — the existing tree is
996
+ never duplicated. To force-throttle from the first call on a known-large
997
+ Epic, set `(framework constant: decomposer concurrency): 1` in
998
+ `.agentrc.json`.