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,864 @@
1
+ ---
2
+ description: >-
3
+ Drive an Epic from `agent::ready` to a merged pull request against `main`.
4
+ The ten-phase flow runs the wave loop, close-validation, epic-audit,
5
+ code-review, retro, finalize, watch-and-iterate, conditional auto-merge,
6
+ and local branch cleanup. When the run is end-to-end clean (zero manual
7
+ interventions, zero 🔴/🟠 review findings, compact retro) the PR
8
+ auto-merges via `gh pr merge --squash --delete-branch`; otherwise the
9
+ workflow falls back to the operator-merges-button path so a human
10
+ inspects the surface area.
11
+ ---
12
+
13
+ # /epic-deliver #[Epic ID]
14
+
15
+ ## Overview
16
+
17
+ `/epic-deliver` is the **single SDL execution command** in the 5.40 surface.
18
+ It opens a PR against `main` and auto-merges when every signal certifies a
19
+ clean run; otherwise it falls back to the operator-merges-button path.
20
+
21
+ ```text
22
+ /epic-deliver <epicId>
23
+ → Phase 1 — prepare (epic-deliver-prepare.js)
24
+ → Phase 2 — wave loop (wave-tick.js + Agent fan-out × concurrencyCap)
25
+ → Phase 3 — close-validation (lint + test + ratchets on epic/<id>)
26
+ → Phase 4 — epic-audit (helpers/epic-audit.md — change-set audits via selectAudits)
27
+ → Phase 5 — code-review (helpers/code-review.md with scope: epic)
28
+ → Phase 6 — retro (.agents/scripts/lib/orchestration/retro-runner.js)
29
+ → Phase 7 — finalize (lifecycle-emit → epic.close.end → open PR to main)
30
+ → Phase 8 — watch-and-iterate (poll `gh pr checks`; fix locally until green)
31
+ → Phase 8.5 — auto-merge gate (lifecycle-emit → epic.automerge.start)
32
+ → Phase 9 — cleanup (BranchCleaner + Cleaner lifecycle listeners on epic.cleanup.start / epic.merge.armed; fire via lifecycle-emit → epic.merge.armed)
33
+ ```
34
+
35
+ The argument is always an Epic ID (`type::epic`). Story IDs go to
36
+ [`/story-deliver`](story-deliver.md) (standalone) or the
37
+ [`helpers/epic-deliver-story`](helpers/epic-deliver-story.md) helper
38
+ (Epic-attached, invoked by this workflow's fan-out); Tasks are not directly
39
+ executable.
40
+ Story dispatch is in-session via the Agent tool — no subprocess is
41
+ spawned.
42
+
43
+ ---
44
+
45
+ ## Arguments
46
+
47
+ ```text
48
+ /epic-deliver <epicId> [--skip-epic-audit] [--skip-code-review] [--skip-retro] [--full-retro]
49
+ ```
50
+
51
+ - `epicId` — must carry `type::epic`. Otherwise STOP and tell the operator
52
+ to use `/story-deliver <id>` (standalone Story) or open the parent Epic.
53
+ - `--skip-epic-audit` — skip Phase 4 (log the override). Use only when the
54
+ change-set audits are known to be irrelevant (e.g., docs-only Epic).
55
+ - `--skip-code-review` — skip Phase 5 (log the override).
56
+ - `--skip-retro` — skip Phase 6 (use sparingly).
57
+ - `--full-retro` — force the six-section retro regardless of manifest
58
+ cleanliness. `--skip-retro` wins over `--full-retro`.
59
+
60
+ Every other runtime modifier is sourced from the Epic's labels or from
61
+ `delivery.deliverRunner` in `.agentrc.json`.
62
+
63
+ ---
64
+
65
+ ## Contract
66
+
67
+ - **Idempotent by checkpoint.** Re-runs resume from `epic-run-state`.
68
+ - **Single pause point.** Only `agent::blocked` halts execution. No
69
+ clarifying questions — if stuck, flip to `agent::blocked`, post a
70
+ friction comment, park.
71
+ - **Two-level dispatch.** Host LLM fans out per-Story Agent calls
72
+ directly with `subagent_type: general-purpose`. Sub-agents do not
73
+ carry the `Agent` tool, so this stays flat.
74
+ - **Operator-merges-PR exit.** Phase 7 opens the PR; the workflow
75
+ never merges to `main` itself. Phase 8.5 may fire auto-merge when
76
+ every signal is clean.
77
+ - **Lifecycle bus is the runner model.** Phase transitions, ticket
78
+ state flips, structured comments, and notifications are emitted as
79
+ typed events on the in-session lifecycle bus; a fixed roster of
80
+ listeners performs the side effects. Phase 7, 8.5, and 9 each fire
81
+ exactly one lifecycle event via the generic
82
+ [`lifecycle-emit.js`](../scripts/lifecycle-emit.js) CLI
83
+ (`--event epic.close.end` / `--event epic.automerge.start` /
84
+ `--event epic.merge.armed`); the matching listener chain runs the
85
+ bus-driven side effects (acceptance reconcile, automerge-armer,
86
+ branch cleanup). PR open + planning-artifact close are
87
+ operator-/host-LLM-driven in the current wiring — see Phase 7.1 for
88
+ the canonical manual sequence and `finalizer.js` for the listener's
89
+ no-op disclaimer. The append-only NDJSON ledger at
90
+ `temp/epic-<id>/lifecycle.ndjson` is the resume target. See
91
+ [`docs/LIFECYCLE.md`](../../docs/LIFECYCLE.md) for the bus
92
+ contract, event taxonomy, ledger format, and listener model.
93
+
94
+ > **Hierarchy.** `/epic-deliver` operates over the 3-tier hierarchy
95
+ > (Epic → Feature → Story). The fan-out is one `Agent` tool call per
96
+ > Story per wave (§ 2b); Story branches merge into `epic/<id>` with
97
+ > `--no-ff` via `story-close.js`; the close-validation chain
98
+ > (Phase 3), epic-audit, code-review, retro, finalize, and auto-merge
99
+ > gates all operate on Story-level units.
100
+ > [`helpers/epic-deliver-story`](helpers/epic-deliver-story.md) runs a
101
+ > single Story-implementation phase per Story against the Story's
102
+ > inline `acceptance[]` / `verify[]` fields. See
103
+ > [`.agents/instructions.md` § 5.D](../instructions.md) and
104
+ > [`.agents/docs/SDLC.md` § Ticket hierarchy](../docs/SDLC.md) for the full
105
+ > contract.
106
+
107
+ ---
108
+
109
+ ## Phase 1 — Prepare the Epic run
110
+
111
+ ### Phase 1 prelude — Delivery preflight (Story #2899 / F13)
112
+
113
+ Before `epic-deliver-prepare.js` seeds the wave plan, run
114
+ `epic-deliver-preflight.js` so the operator (and any reviewer reading the
115
+ Epic ticket) sees the estimated Story count, install cost, wave count,
116
+ GitHub API request volume, and Claude Max quota burn for the run that is
117
+ about to fan out. **Preflight always runs before Story fan-out.**
118
+
119
+ ```bash
120
+ node .agents/scripts/epic-deliver-preflight.js --epic <epicId> --post
121
+ ```
122
+
123
+ The CLI upserts a `delivery-preflight` structured comment on the Epic
124
+ (idempotent across re-runs) and prints a JSON envelope on stdout with
125
+ the canonical metric keys `storyCount`, `installCostSeconds`,
126
+ `waveCount`, `githubApiRequests`, `claudeQuotaTokens`, plus a `breaches`
127
+ array describing any `delivery.preflight.max*` thresholds the estimate
128
+ exceeds.
129
+
130
+ **Breach handling.** When `breaches` is non-empty, the workflow MUST
131
+ flip the Epic to `agent::blocked`, surface the envelope in chat for the
132
+ operator, and halt before Phase 1's `epic-deliver-prepare.js` call.
133
+ Resume after the operator unblocks (raising the threshold in
134
+ `.agentrc.json`, splitting the Epic, or accepting the cost) by re-running
135
+ `/epic-deliver <epicId>` — the preflight is idempotent and the second
136
+ run upserts the same comment in place.
137
+
138
+ Threshold defaults live in `delivery.preflight.*` in `.agentrc.json`
139
+ (all keys default to "no cap" — the gate is opt-in until an operator
140
+ configures `maxStories` etc.). The CI-firehose mitigation
141
+ (`delivery.ci.skipForStoryPushes: true`) and these threshold keys are
142
+ the two operator-tunable knobs F13 ships.
143
+
144
+ ### Phase 1 main — Seed the wave plan
145
+
146
+ ```bash
147
+ node .agents/scripts/epic-deliver-prepare.js --epic <epicId> [--steal] [--as <handle>]
148
+ ```
149
+
150
+ Validates `type::epic`, enumerates `type::story` descendants, parses
151
+ `blocked by #N` plus explicit `dependencies`, runs `Graph.computeWaves()`,
152
+ and upserts the `epic-run-state` checkpoint. Treat the printed JSON as
153
+ `state`: `{ epicId, totalWaves, concurrencyCap, plan, checkpointInitializedAt }`.
154
+ `plan[N]` is the Stories assigned to wave `N`. Flip the Epic to
155
+ `agent::executing` (idempotent) after the CLI returns.
156
+
157
+ > **Preflight guards (Story #3482 / F-workflow-guards).** Before the
158
+ > snapshot phase runs — and before any worktree is created — prepare runs
159
+ > two **fail-closed** guards
160
+ > ([`lib/orchestration/epic-deliver-lease-guard.js`](../scripts/lib/orchestration/epic-deliver-lease-guard.js)):
161
+ >
162
+ > 1. **Checkout safety.** Prepare refuses to start when the working tree is
163
+ > dirty or HEAD is on a branch other than the expected one (`epic/<id>`
164
+ > on a resume, or the project base branch on a fresh run). It will
165
+ > **not** check `epic/<id>` out over your work — the historic
166
+ > HEAD-yank footgun. Remediation: commit/stash/clean the tree, or
167
+ > switch to the expected branch, then re-run.
168
+ > 2. **Epic lease.** Prepare acquires the assignee-as-lease on the Epic
169
+ > ticket (`ticket-lease.acquireLease`). On a **live foreign claim**
170
+ > (a teammate's run with a fresh `story.heartbeat` within
171
+ > `delivery.lease.ttlMs`) it exits non-zero and names the current owner;
172
+ > a **stale** claim is silently reclaimed. The operator identity is
173
+ > resolved from `--as <handle>` → `github.operatorHandle` →
174
+ > `git config user.email`. Pass `--steal` to forcibly transfer a live
175
+ > foreign claim (the takeover is logged for auditability). The committed
176
+ > `github.operatorHandle` is the non-personal `@[USERNAME]` placeholder,
177
+ > which resolves to null — so when none of the three sources yields a real
178
+ > identity the guard **fails closed** (throws after the checkout guard
179
+ > runs) rather than driving an ownerless, unguarded delivery. Set your own
180
+ > handle in `.agentrc.local.json`, pass `--as <handle>`, or configure
181
+ > `git user.email`. The lease is the cross-clone coordination layer, while
182
+ > `epic-merge-lock.js` continues to serialize same-machine sessions.
183
+ >
184
+ > Both guards throw on failure, which `runAsCli` maps to `process.exit(1)`
185
+ > per [`orchestration-error-handling.md`](../rules/orchestration-error-handling.md).
186
+
187
+ Once the preflight guards pass, the snapshot phase applies one more gate:
188
+
189
+ > **Acceptance-spec start gate.** Before the wave loop fans out, the
190
+ > snapshot phase
191
+ > ([`lib/orchestration/epic-runner/phases/snapshot.js`](../scripts/lib/orchestration/epic-runner/phases/snapshot.js))
192
+ > asserts that the Epic either carries the `acceptance::n-a` waiver
193
+ > label **or** has a linked `context::acceptance-spec` ticket. The
194
+ > ticket's GitHub state (open / closed) is **not** checked —
195
+ > presence is sufficient, matching the PRD and Tech Spec contract.
196
+ > The reviewer's OK during `/epic-plan` Phase 7 is the approval
197
+ > signal, not a manual ticket-close action. Neither condition met →
198
+ > the snapshot throws a clear error
199
+ > (`[epic-deliver] Epic #<id> cannot launch: …`) and `runAsCli`
200
+ > maps it to `process.exit(1)`. Operator remediation: either run
201
+ > `/epic-plan` Phase 7 to author the spec, or apply the
202
+ > `acceptance::n-a` label to opt out.
203
+
204
+ ---
205
+
206
+ ## Phase 2 — Wave loop
207
+
208
+ The wave-loop state machine lives in
209
+ [`lib/wave-runner/tick.js`](../scripts/lib/wave-runner/tick.js) — one
210
+ stateless `tick({ epic })` call returns one `WaveTickResult` describing
211
+ the next action. The slash command's job is to call `tick()` via its CLI
212
+ shim, dispatch from `nextAction.stories` via the Agent tool, persist the
213
+ outcome, and loop until terminal.
214
+
215
+ ### 2a. Tick — plan the next action
216
+
217
+ ```bash
218
+ node .agents/scripts/wave-tick.js --epic <epicId>
219
+ ```
220
+
221
+ Stdout is one `WaveTickResult` envelope:
222
+
223
+ ```json
224
+ {
225
+ "nextAction":
226
+ { "kind": "dispatch", "stories": [{ "id": <n>, "title": "…", "worktree"?: "…" }, ...] }
227
+ | { "kind": "observe", "waitingOn": [<storyId>, ...] }
228
+ | { "kind": "wave-complete", "index": <n> }
229
+ | { "kind": "epic-complete" },
230
+ "blockedStories": [{ "storyId": <n>, "reason": "…", "detail"?: "…" }, ...],
231
+ "gateFailures": [{ "storyId": <n>, "gate": "…", "detail"?: "…" }, ...],
232
+ "currentWave": <n>,
233
+ "totalWaves": <n>
234
+ }
235
+ ```
236
+
237
+ The CLI is a planner: it returns the `nextAction` envelope above. Wave
238
+ progress is durable on two operator-facing surfaces — the `epic-run-state`
239
+ checkpoint (resume) and the `epic-run-progress` rollup comment, both written
240
+ by `epic-execute-record-wave.js` at the wave boundary. The CLI itself emits
241
+ only the two wave-window forensics signals that have a live consumer —
242
+ `wave-start` and `wave-complete`, which the perf-aggregator brackets into the
243
+ `waveParallelism` report (and `wave-start` anchors span-tree Story spans).
244
+ Story #3909 retired the write-only wave events with no reader (`wave-tick`,
245
+ `epic-complete`) — they duplicated the checkpoint + rollup. The
246
+ [`signals` helper](helpers/signals.md) (`node .agents/scripts/signals-view.js`)
247
+ renders the forensics signals in the span-tree view.
248
+
249
+ ### 2b. Dispatch — fan out per-Story Agent calls
250
+
251
+ *You* (the LLM running this skill) are the wave dispatcher; you never
252
+ invoke `helpers/epic-deliver-story` yourself. Emit **one `Agent` tool call per
253
+ Story** in `nextAction.stories` (even when `length === 1` — the
254
+ parent-child boundary keeps the return-parser uniform). The *children*
255
+ run [`helpers/epic-deliver-story`](helpers/epic-deliver-story.md). Use
256
+ `subagent_type: general-purpose`.
257
+
258
+ Emit **one assistant turn** with **N parallel `Agent` calls** where
259
+ `N === min(nextAction.stories.length, concurrencyCap)`. When the wave
260
+ exceeds `concurrencyCap`, dispatch the first `concurrencyCap` Stories
261
+ as background calls (`run_in_background: true`) and refill from
262
+ `nextAction.stories` immediately as each child returns — never exceed
263
+ the cap, never wait for a whole batch before refilling.
264
+
265
+ > **Throughput tradeoff.** The default `concurrencyCap` of 3 is
266
+ > intentionally conservative — it keeps host-quota consumption low on
267
+ > Epics with small waves and avoids flooding the GitHub API. For
268
+ > wide-wave Epics (many Stories per wave) where the host has adequate
269
+ > parallel-agent quota, raising `delivery.deliverRunner.concurrencyCap`
270
+ > in `.agentrc.json` reduces wall-clock time proportionally to the
271
+ > extra concurrency. The safe default is left in place; this is a
272
+ > deliberate operator-tuning knob, not a hidden performance ceiling.
273
+ > See `agentrc-reference.json` `delivery.deliverRunner.concurrencyCap` for
274
+ > the configuration surface.
275
+
276
+ **Ledger the dispatch BEFORE the Agent call.** Immediately before each
277
+ per-Story `Agent` tool call (one shell-out per Story, every attempt —
278
+ including retries from a refill), invoke
279
+ [`lifecycle-emit-story-dispatch.js`](../scripts/lifecycle-emit-story-dispatch.js)
280
+ so the lifecycle ledger durably records the dispatch attempt. The
281
+ emit must happen **before** the Agent call fires — never after — so
282
+ that a host-process crash mid-Agent leaves a `story.dispatch.start`
283
+ record that `wave-tick.js` (see § 2a) can surface under
284
+ `nextAction['in-flight']` on the next tick:
285
+
286
+ ```bash
287
+ node .agents/scripts/lifecycle-emit-story-dispatch.js \
288
+ --epic <epicId> --story <storyId> \
289
+ --wave <currentWave> --attempt <attempt>
290
+ ```
291
+
292
+ `<attempt>` starts at 1 for the Story's first dispatch in this wave
293
+ and increments on each retry/refill. The CLI appends exactly one
294
+ NDJSON line to `temp/epic-<epicId>/lifecycle.ndjson`; the matching
295
+ `story.dispatch.end` record is appended later by
296
+ `epic-execute-record-wave.js` (via `emit-story-dispatch-end.js`, Story #3900)
297
+ after the Agent return is recorded in § 2c.
298
+
299
+ Each Agent call's prompt must (1) name the Story + Epic ids, (2)
300
+ instruct the child to invoke `helpers/epic-deliver-story <storyId>`, (3) state the
301
+ **return contract** below, (4) remind the child of the
302
+ **non-interactive contract** (no clarifying questions; transition to
303
+ `agent::blocked` and exit if stuck), (5) ask the child to suppress
304
+ per-Story chat relay and include its **terminal** `renderedBody` in the
305
+ JSON return, and (6) require the child to emit a `story.heartbeat`
306
+ lifecycle event at least once per Story-level phase transition via
307
+ `node .agents/scripts/story-phase.js` (or whenever it stalls on a
308
+ long-running step), and if it cannot make progress to transition
309
+ to `agent::blocked` rather than fall silent. The pairing of
310
+ `story.heartbeat` and `agent::blocked` is what lets the §2e Idle
311
+ Watchdog distinguish a working child from a dead one; a silent child
312
+ with no recent heartbeat and no blocker label is the failure mode the
313
+ watchdog is built to catch.
314
+
315
+ ```json
316
+ {
317
+ "storyId": <number>,
318
+ "status": "done" | "blocked" | "failed",
319
+ "phase": "init|implementing|closing|blocked|done",
320
+ "branchDeleted": <boolean>,
321
+ "blockerCommentId": <string|null>,
322
+ "detail": <string|undefined>,
323
+ "renderedBody": <string|undefined>
324
+ }
325
+ ```
326
+
327
+ **Sub-agent dispatch.** `Agent` calls emit no `model:` argument by
328
+ default — children inherit from the `general-purpose` sub-agent
329
+ definition and the parent's worktree context. No
330
+ `--dangerously-skip-permissions` (no subprocess is spawned). If a
331
+ specific call needs to override the inherited model, pass `model:` as a
332
+ per-call literal at the `Agent(...)` site.
333
+
334
+ ### 2c. Record the wave outcome
335
+
336
+ Once every dispatched Story has returned, persist via
337
+ `epic-execute-record-wave.js`:
338
+
339
+ ```bash
340
+ # Mode A — host LLM already parsed each child return.
341
+ node .agents/scripts/epic-execute-record-wave.js \
342
+ --epic <epicId> --wave <N> [--concurrency-cap <N>] \
343
+ --results @<file>|<inline-json>
344
+
345
+ # Mode B — pipe the raw per-Story sub-agent return texts directly.
346
+ node .agents/scripts/epic-execute-record-wave.js \
347
+ --epic <epicId> --wave <N> [--concurrency-cap <N>] \
348
+ --returns @<file>|<inline-json>
349
+ # `<inline-json>` shape: [{ "storyId": <n>, "returnText": "<raw text>" }]
350
+ ```
351
+
352
+ **Prefer mode B** when the host LLM can't fully verify every child's
353
+ return is a parseable envelope. The CLI reconciles parse failures from
354
+ GitHub, aggregates terminal status, appends to `state.waves[]`,
355
+ re-renders `epic-run-progress`, and prints
356
+ `{ status, nextAction, renderedBody, ... }`. Print `renderedBody`
357
+ verbatim, then optionally append a short **Notable** section (0–5
358
+ bullets on newly blocked / failed / slow Stories, friction,
359
+ elapsed-time surprises).
360
+
361
+ > **Crash recovery — empty mode-B returns (Story #3907).** If the host
362
+ > crashed *after* this wave's children finished but *before* `record-wave`
363
+ > ran, no return text survives. Re-run mode B with an **empty** returns
364
+ > array (`--returns '[]'`): the CLI reconciles **every** Story in
365
+ > `plan[<N>]` directly from GitHub (label + `state`) and records the wave
366
+ > from that live state instead of recording a falsely-`complete` empty
367
+ > wave. This is what lets `currentWave` advance after a crash — only
368
+ > `record-wave` advances it, so without this path the loop would return
369
+ > `wave-complete` for the same index forever.
370
+
371
+ ### 2d. Loop on `nextAction`
372
+
373
+ After `2c`, re-run `wave-tick.js`. Branch on the new envelope:
374
+
375
+ - `dispatch` → repeat 2b/2c for the same wave (refill) or the next wave.
376
+ - `observe` → poll the Epic (children may still be in flight, or some
377
+ are `agent::blocked`). If `blockedStories` is non-empty, post a
378
+ friction comment, flip Epic to `agent::blocked`, park.
379
+ - `wave-complete` → loop to the next wave.
380
+ - `epic-complete` → proceed to Phase 3.
381
+
382
+ ### 2e. Idle Watchdog
383
+
384
+ A Story's implementation loop can run for many minutes between
385
+ `story.dispatch.start` and the post-merge `story.merged` record. While
386
+ `observe` keeps the host LLM polling the Epic, it does **not** flag a
387
+ sub-agent that has gone silent (host crash, mid-Story stall, lost
388
+ return). The Idle Watchdog closes that gap.
389
+
390
+ **Cadence.** While any wave is in flight (i.e. `nextAction.kind` is
391
+ `observe` or the most recent dispatch's `in-flight` list is non-empty),
392
+ re-tick every **30 minutes** with the watchdog flag:
393
+
394
+ ```bash
395
+ node .agents/scripts/wave-tick.js --epic <epicId> --check-idle 30
396
+ ```
397
+
398
+ > **Why 30, not 10 (Story #3900).** Heartbeats fire only at Story-level
399
+ > phase transitions, and `implementing → closing` routinely exceeds 10
400
+ > minutes for a healthy Story. A 10-minute threshold therefore tripped the
401
+ > watchdog on every long-running Story, whose prescribed remediation —
402
+ > re-dispatch — put two agents on one `story-<id>` branch (the worst
403
+ > failure mode in the system). The threshold is widened to 30 minutes and
404
+ > the staleness test now also consults a deterministic branch-commit
405
+ > signal (below), so a Story still gaining commits is never flagged.
406
+
407
+ The `--check-idle <minutes>` mode scans the per-Epic lifecycle ledger
408
+ (`temp/epic-<epicId>/lifecycle.ndjson`) for Stories that carry a
409
+ `story.dispatch.start` without a matching `story.dispatch.end` (the
410
+ canonical in-flight list — see § 2a's `nextAction['in-flight']`), and
411
+ compares each in-flight Story's most recent ledger event (any
412
+ `story.*` event, notably the `story.heartbeat` records emitted by
413
+ `story-phase.js` at each Story-level phase transition) against the
414
+ threshold. **Before flagging a stall, it also checks the last commit on
415
+ `story-<id>` via `git log` (Story #3900): a Story whose branch carries a
416
+ commit newer than the threshold is making forward progress and is left
417
+ in-flight, never stalled — deterministic protection against the
418
+ false-positive re-dispatch hazard even when no heartbeat has landed.**
419
+ The CLI emits one envelope on stdout and exits non-zero when at least
420
+ one in-flight Story has been silent for ≥ the threshold:
421
+
422
+ ```json
423
+ {
424
+ "kind": "wave-stall",
425
+ "epicId": <n>,
426
+ "thresholdMinutes": <n>,
427
+ "checkedAt": "<ISO-8601>",
428
+ "stalled": [{ "storyId": <n>, "lastEventAt": "<ISO-8601>", "idleMinutes": <n> }],
429
+ "inFlight": [<storyId>, ...]
430
+ }
431
+ ```
432
+
433
+ **On a stall.** When the watchdog exits non-zero, post the envelope
434
+ verbatim as a `wave-stall` structured comment on the Epic (use
435
+ [`post-structured-comment.js`](../scripts/post-structured-comment.js)
436
+ with `--kind wave-stall`), then re-evaluate the affected Stories: if a
437
+ child sub-agent has crashed (no `story.dispatch.end`, no recent
438
+ heartbeat, no commit on `story-<id>`), re-dispatch the Story per § 2b
439
+ incrementing the `--attempt` counter; if the child is alive but
440
+ genuinely blocked, flip the Story to `agent::blocked` and proceed per
441
+ § 2d's `observe` branch.
442
+
443
+ Stop the watchdog cadence once `wave-tick.js` returns
444
+ `wave-complete` or `epic-complete` — there are no in-flight Stories
445
+ left to monitor.
446
+
447
+ ---
448
+
449
+ ## Phase 3 — Close-validation
450
+
451
+ Run lint + test + ratchets against `epic/<epicId>` before opening the PR:
452
+
453
+ ```bash
454
+ node .agents/scripts/evidence-gate.js \
455
+ --epic-id <epicId> --scope-id <epicId> --gate lint -- npm run lint
456
+ node .agents/scripts/evidence-gate.js \
457
+ --epic-id <epicId> --scope-id <epicId> --gate test -- npm test
458
+ ```
459
+
460
+ If either gate fails: STOP, fix on a hotfix branch, merge back to the
461
+ Epic branch, restart this phase.
462
+
463
+ ### 3.1 Refresh ratcheted baselines
464
+
465
+ Inspect the scripts in `.husky/pre-push` (typecheck, lint, maintainability,
466
+ design tokens, dependency audits, bundle-size budgets). Run each against
467
+ the Epic branch; if any drifts, refresh and commit
468
+ `chore(baselines): refresh <name> for Epic #<epicId>`.
469
+
470
+ ---
471
+
472
+ ## Phase 4 — Epic audit (change-set lenses)
473
+
474
+ Skip when `--skip-epic-audit`. Otherwise auto-invoke
475
+ [`helpers/epic-audit.md`](helpers/epic-audit.md) inline. The helper runs
476
+ [`epic-audit-prepare.js`](../scripts/epic-audit-prepare.js) to ask the
477
+ [`selectAudits`](../scripts/lib/audit-suite/index.js) SDK which lenses fire
478
+ at the `gate3` close gate, **unions in the model-judged risk-routed lenses**
479
+ (Story #3889 — `epic-audit-prepare.js` reads the Epic's `planningRisk`
480
+ envelope off the `epic-plan-state` checkpoint and maps each high-risk axis to
481
+ its lens via `resolveAuditLenses`), then dispatches each selected lens through
482
+ [`runAuditSuite`](../scripts/lib/audit-suite/index.js). A high-risk Epic
483
+ therefore auto-runs its mapped lenses (e.g. a `security`-axis Epic runs
484
+ `audit-security`) even when the change set alone did not select them; a
485
+ low-risk Epic adds nothing. Findings are persisted as an `audit-results`
486
+ structured comment on the Epic.
487
+
488
+ - **Any 🔴 Critical Blocker** — STOP. Relay to the operator.
489
+ - **Only 🟠/🟡/🟢** — log as non-blocking and continue.
490
+ - **Selector reports `degraded: true`** — STOP. Propagate the
491
+ `reason`/`detail`, post a friction comment, do not fall back to a
492
+ full-roster audit.
493
+ - **`selectedAudits` is empty** (docs-only change set) — log the
494
+ short-circuit and continue to Phase 5.
495
+
496
+ ---
497
+
498
+ ## Phase 5 — Code review
499
+
500
+ Skip when `--skip-code-review`. Otherwise resolve the **risk-derived review
501
+ depth** for this Epic, then auto-invoke
502
+ [`helpers/code-review.md`](helpers/code-review.md) inline (read-only audit)
503
+ with the argument envelope `{ scope: 'epic', ticketId: <epicId>, baseRef:
504
+ 'main', headRef: 'epic/<epicId>', depth: <reviewDepth> }`. The helper
505
+ persists findings as a `code-review` structured comment on the Epic.
506
+
507
+ The `depth` is the live epic-scope producer for Story #3876's review-depth
508
+ lever (Story #3937). Resolve it from the Epic's judged risk envelope the same
509
+ best-effort way Phase 4 routes audit lenses — via
510
+ [`resolveReviewDepthForEpic`](../scripts/lib/orchestration/code-review.js),
511
+ which reads `planningRisk.overallLevel` off the Epic's `epic-plan-state`
512
+ checkpoint and maps it: `high` → `deep`, `low` → `light`, everything else
513
+ (including a missing/unparseable checkpoint, or an Epic that skipped
514
+ `/epic-plan`) → `standard`. The helper threads `depth` into `runCodeReview`,
515
+ which forwards it to every provider's `runReview` input; the LLM-backed
516
+ providers (codex, security-review, ultrareview) render it into the prompt they
517
+ emit so a high-risk Epic gets a deeper adversarial pass and a low-risk one a
518
+ lighter one. Depth is **input-only** — it never changes the findings envelope
519
+ or the posted comment shape.
520
+
521
+ - **Any 🔴 Critical Blocker** — STOP. Relay to the operator.
522
+ - **Only 🟠/🟡/🟢** — log as non-blocking and continue.
523
+
524
+ ---
525
+
526
+ ## Phase 6 — Retro
527
+
528
+ Skip when `--skip-retro`. Otherwise post the `epic-perf-report` via
529
+ `node .agents/scripts/analyze-execution.js --epic <epicId>` (failure →
530
+ warn and continue; the retro runner falls back). Then invoke the retro
531
+ runner via its CLI wrapper:
532
+
533
+ ```bash
534
+ node .agents/scripts/retro-run.js --epic <epicId>
535
+ ```
536
+
537
+ [`retro-run.js`](../scripts/retro-run.js) resolves the config/provider,
538
+ constructs a lifecycle bus with a `LedgerWriter` (so the run's
539
+ `retro.start` / `retro.end` boundaries land in
540
+ `temp/epic-<epicId>/lifecycle.ndjson`), and calls `runRetro` — the
541
+ canonical compose-and-post surface at
542
+ [`.agents/scripts/lib/orchestration/retro-runner.js`](../scripts/lib/orchestration/retro-runner.js).
543
+ Propagate `--full-retro` to bypass the compact-path heuristic.
544
+
545
+ Retro fires here (before the PR opens) so it stays in the operator's
546
+ local session with full env access (env vars, credentials, MCP).
547
+
548
+ After the GitHub upsert succeeds, the retro body is also **mirrored
549
+ locally** to the per-Epic temp tree at `temp/epic-<epicId>/retro.md`
550
+ (path resolved via
551
+ [`lib/config/temp-paths.js`](../scripts/lib/config/temp-paths.js)'s
552
+ `epicRetroMirrorPath`, which honours `project.paths.tempRoot`).
553
+ Operators can read the retro without re-fetching from GitHub. GitHub
554
+ remains the source of truth — a mirror-write failure only logs a warn
555
+ and never fails the phase.
556
+
557
+ ---
558
+
559
+ ## Phase 7 — Finalize (open PR to main)
560
+
561
+ ### 7.0 — Sync Epic branch from `main` (Story #2580)
562
+
563
+ Before firing the close-tail emit, sync the Epic branch with
564
+ `origin/main` so the PR opens with the latest base commits already
565
+ integrated. The Epic branch may be behind `main` if other PRs merged
566
+ during the wave loop; without this step, the Epic→`main` PR opens
567
+ "behind base" and (with branch-protection's `up-to-date branch` rule)
568
+ stalls at the merge gate.
569
+
570
+ ```bash
571
+ git checkout epic/<epicId>
572
+ node .agents/scripts/sync-branch-from-base.js \
573
+ --branch epic/<epicId> --base main
574
+ ```
575
+
576
+ Outcomes:
577
+
578
+ - **`fast-forward` / `merge-commit` / `noop-already-current`** → push
579
+ the resulting tip and continue to Phase 7.1: `git push origin epic/<epicId>`.
580
+ - **`conflict`** → resolve in the Epic checkout (`git merge --no-edit
581
+ origin/main`, fix conflicts, `git commit --no-edit`), then re-run the
582
+ sync command. Once it exits 0, continue. Operator-recoverable; not an
583
+ agent loop.
584
+ - **`fetch-failed`** → re-check network / `origin` access and re-run.
585
+
586
+ This is a workflow-level step (operator-driven), not part of the
587
+ close-tail listener chain. The sync runs from the main checkout so
588
+ the resulting tip lands on `epic/<epicId>` before Phase 7.1 fires
589
+ the bus-driven close-tail.
590
+
591
+ ### 7.1 — Fire the close-tail emit
592
+
593
+ ```bash
594
+ node .agents/scripts/lifecycle-emit.js --epic <epicId> --event epic.close.end
595
+ ```
596
+
597
+ Emits `epic.close.end` onto the lifecycle bus. **Every close-time
598
+ responsibility below runs inside the listener chain — the operator
599
+ shells nothing manually. The `Finalizer` listener (Story #2894 —
600
+ bus-owned finalize) composes three helpers under
601
+ `.agents/scripts/lib/orchestration/finalize/` and emits the canonical
602
+ chain.** Treat this section as a runtime contract — `/epic-deliver`
603
+ just fires the emit and reads the resulting ledger.
604
+
605
+ 1. **Acceptance-spec reconciliation — bus-driven.** The
606
+ `AcceptanceReconciler` listener invokes
607
+ [`acceptance-spec-reconciler.js`](../scripts/acceptance-spec-reconciler.js)
608
+ to diff the AC IDs declared in the linked `context::acceptance-spec`
609
+ body against `@ac-*` / `@pending` tags in `tests/features/**`. A
610
+ non-OK reconciliation throws (per
611
+ [`rules/orchestration-error-handling.md`](../rules/orchestration-error-handling.md)),
612
+ aborting finalize **before** any PR is opened or planning artifacts
613
+ are closed — so the PRD, Tech Spec, and Acceptance Spec stay open
614
+ until the AC coverage gap is fixed. The reconciler returns
615
+ `status: 'waived'` without scanning features when the Epic carries
616
+ `acceptance::n-a`, and defends against direct CLI invocation by
617
+ refusing to run when no spec is linked and no waiver is set (the
618
+ start gate in Phase 1 would normally catch that first).
619
+ 2. **PR open — bus-driven (Story #2894).** On
620
+ `acceptance.reconcile.ok` the `Finalizer` listener invokes
621
+ [`openOrLocatePr`](../scripts/lib/orchestration/finalize/open-or-locate-pr.js)
622
+ with `{ epicId, headBranch: 'epic/<id>', baseBranch: 'main' }`.
623
+ The helper probes for an existing open PR on the head branch
624
+ first (idempotent locate path — a re-run of `/epic-deliver`
625
+ on the same branch short-circuits without opening a duplicate)
626
+ and only opens a new PR when none exists. The listener then
627
+ emits `pr.created` → `epic.finalize.end` and **stops** (Story
628
+ #3367). It does **not** emit `epic.merge.ready`: that event is
629
+ the sole `AutomergeArmer` trigger, and emitting it from finalize
630
+ would cascade `epic.close.end` synchronously through the arm →
631
+ `MergeWatcher` → `Cleaner` → `BranchCleaner` reap, deleting the
632
+ `epic/<id>` branch before the PR merged and bypassing the
633
+ `AutomergePredicate` disqualification gate. The auto-merge arm is
634
+ driven later from the gated watch path (`pr.created` → `Watcher`
635
+ → `epic.watch.end` → `AutomergePredicate` → `epic.merge.ready` →
636
+ `AutomergeArmer`) re-entered in Phase 8.5. The merge-lockout rule
637
+ in [`check-lifecycle-lint.js`](../scripts/check-lifecycle-lint.js)
638
+ keeps `gh pr merge --auto --squash --delete-branch` confined to
639
+ `AutomergeArmer` — Phase 7 never shells the merge command.
640
+ 3. **Planning-artifact close + hand-off — bus-driven (Story
641
+ #2894).** After `openOrLocatePr` returns, the `Finalizer` chains
642
+ [`closePlanningTickets`](../scripts/lib/orchestration/finalize/close-planning-tickets.js)
643
+ to close the three planning context tickets
644
+ (`context::prd`, `context::tech-spec`, `context::acceptance-spec`)
645
+ so the Epic's `Closes #<id>` auto-close path is not blocked by
646
+ open sub-issues, then
647
+ [`postHandoffComment`](../scripts/lib/orchestration/finalize/post-handoff-comment.js)
648
+ to upsert the canonical `epic-handoff` structured comment naming
649
+ the PR URL. Both helpers are idempotent — already-closed tickets
650
+ are counted under `alreadyClosed`, and the handoff comment is
651
+ edited in place via `upsertStructuredComment` rather than
652
+ appending a duplicate. When the `acceptance::n-a` waiver is set
653
+ and no Acceptance Spec ticket was ever opened, the third
654
+ planning-ticket close is recorded as `skipped`.
655
+
656
+ Branch cleanup is out-of-band (Phase 9 reaps local refs after merge; the
657
+ rare "scrap and reset" case for an unmerged Epic is handled manually).
658
+
659
+ ---
660
+
661
+ ## Phase 8 — Watch-and-iterate until CI is green
662
+
663
+ The host LLM owns the green-bar loop until the operator merges. Use
664
+ the shared watch-and-recover helper, which wraps `gh pr checks --watch`
665
+ and additionally auto-recovers from `mergeStateStatus: BEHIND` by
666
+ calling `gh pr update-branch` once every required check is green
667
+ (branch-protection rules requiring "up to date before merging"
668
+ otherwise park the PR until the operator clicks **Update branch**
669
+ manually):
670
+
671
+ ```bash
672
+ node <agentRoot>/scripts/pr-watch-with-update.js --pr <prNumber>
673
+ ```
674
+
675
+ `<agentRoot>` resolves from `project.paths.agentRoot` (default
676
+ `.agents`). Pass `--max-updates N` (default 3) to cap update-branch
677
+ calls per session and `--poll-interval-ms MS` (default 10000) to
678
+ override the polling cadence.
679
+
680
+ Exit 0 → proceed to Phase 8.5. Non-zero → remediate (below) and re-run
681
+ the helper. Auto-merge stays armed across retries; the
682
+ `epic.automerge.start` emit in Phase 8.5 re-runs the `AutomergeArmer`
683
+ listener, which re-checks `mergeStateStatus` before firing merge, so a
684
+ second BEHIND that arrives between the helper exiting clean and Phase
685
+ 8.5 starting is also caught.
686
+
687
+ ### 8.1 Remediation
688
+
689
+ For each failed required check: fetch the log
690
+ (`gh run view <runId> --log-failed`), classify and fix:
691
+
692
+ - **lint / format** → `npm run lint` + `npx biome check --apply` (or
693
+ `format --write`); commit, push.
694
+ - **maintainability / crap baseline drift** → re-run the ratcheted
695
+ script. Refresh the baseline only when drift is justified by the
696
+ diff; otherwise fix at source.
697
+ - **test failure** → reproduce with `npm test`, fix source or test.
698
+ - **coverage threshold** → add tests (preferred); refresh baseline only
699
+ when the diff demonstrably can't be covered.
700
+ - **anything else** → read the log, fix at source.
701
+
702
+ Push to `epic/<epicId>` and re-run
703
+ `node <agentRoot>/scripts/pr-watch-with-update.js --pr <prNumber>`.
704
+
705
+ ### 8.2 When to halt
706
+
707
+ Three consecutive iterations on the same failure class without
708
+ convergence → friction comment, flip to `agent::blocked`, park. Unknown
709
+ failure class on first encounter → attempt source-level fix; log
710
+ friction if diagnosis takes more than one round.
711
+
712
+ ### 8.3 Hard prohibitions
713
+
714
+ **Never** `gh pr merge` from Phase 8 (Phase 8.5 is the only merge
715
+ site). **Never** force-push to `main`. **Never** push empty commits or
716
+ refresh baselines to dodge a red check.
717
+
718
+ ---
719
+
720
+ ## Phase 8.5 — Auto-merge gate
721
+
722
+ After Phase 8 exits 0, evaluate the auto-merge predicate by emitting
723
+ `epic.automerge.start`:
724
+
725
+ ```bash
726
+ node .agents/scripts/lifecycle-emit.js --epic <epicId> \
727
+ --event epic.automerge.start --pr-url <prUrl>
728
+ ```
729
+
730
+ `AutomergePredicate` subscribes to `epic.automerge.start` (Story #3901 —
731
+ before that this event had **zero** subscribers and the entire Phase 8.5
732
+ gate was a dead wire). It evaluates the structured-signal verdict and
733
+ emits `epic.merge.ready` on a clean verdict or `epic.merge.blocked`
734
+ otherwise. The CI-freshness gate is skipped on this event because Phase 8
735
+ already polled every required check to green — `epic.automerge.start`
736
+ carries `prUrl` but no `checkOutcomes`.
737
+
738
+ The `AutomergeArmer` listener subscribes to the downstream
739
+ `epic.merge.ready` outcome and fires `gh pr merge --auto --squash
740
+ --delete-branch` only when `clean: true`. `clean: true` requires
741
+ **all** of:
742
+
743
+ - `state.manualInterventions[]` is empty;
744
+ - every wave's `status === "complete"`;
745
+ - no story envelope carries a `blockerCommentId` or non-`done` status;
746
+ - code-review reports `0` 🔴 + `0` 🟠 findings;
747
+ - the retro's machine-readable `automerge-verdict` trailer reports
748
+ `cleanSprint: true` (Story #3901 — the predicate reads the parsed JSON
749
+ trailer `retro-run.js` writes into the retro body, **not** an emoji
750
+ string-match on the human-facing "🟢 Clean sprint" prose).
751
+
752
+ When clean, the listener fires `gh pr merge --squash --delete-branch`.
753
+ Otherwise the listener records disqualifying reasons via
754
+ `epic.merge.blocked` and exits without merging — operator merges
755
+ manually.
756
+
757
+ Close the phase wrapper by emitting `epic.automerge.end` (records the
758
+ arm outcome on the ledger; `merged: true` once GitHub completes the
759
+ squash, `merged: false` with a reason for predicate-blocked or
760
+ armed-but-pending):
761
+
762
+ ```bash
763
+ node .agents/scripts/lifecycle-emit.js --epic <epicId> \
764
+ --event epic.automerge.end --pr-url <prUrl> --merged <true|false>
765
+ ```
766
+
767
+ ### Recording manual interventions
768
+
769
+ Whenever you step outside the happy path during a delivery, record it
770
+ (each entry disqualifies auto-merge):
771
+
772
+ ```bash
773
+ node .agents/scripts/epic-deliver-note-intervention.js \
774
+ --epic <epicId> --reason "<one-line description>"
775
+ ```
776
+
777
+ Triggers: `AskUserQuestion` mid-run; `git restore`/`reset` against the
778
+ tree; child-reported `--no-ff` recovery, stash dance, or out-of-band
779
+ merge surgery; child closes via `--skipValidation`; force-pushing or
780
+ empty-committing to dodge CI diagnosis.
781
+
782
+ ---
783
+
784
+ ## Phase 9 — Local branch cleanup
785
+
786
+ Phase 9 runs **automatically** inside the lifecycle bus once auto-merge
787
+ arms: the `BranchCleaner` listener subscribes to `epic.cleanup.start`
788
+ and reaps local refs before `Cleaner` archives the `temp/epic-<id>/`
789
+ tree. No operator step is required on the auto-merge path.
790
+
791
+ What gets reaped (in order, all in-process):
792
+
793
+ 1. The main checkout is switched off `epic/<id>` to `baseBranch` when
794
+ needed (otherwise `git branch -D epic/<id>` is refused).
795
+ 2. Every `story-<id>` listed in the `epic-run-state` checkpoint, plus
796
+ `epic/<id>`. Attached worktrees are removed with the standard
797
+ `git worktree remove` → `--force` → filesystem-rm fallback (the
798
+ last step covers Windows file-locks).
799
+ 3. `git remote prune <remote>` drops stale `<remote>/...` tracking
800
+ refs left behind by `gh pr merge --delete-branch`.
801
+ 4. The `wt-branch` scratch ref left by `story-close.js`'s internal
802
+ merge worktree is deleted when no worktree still points at it.
803
+
804
+ Per-branch failures aggregate into the listener's classification log
805
+ (`reaped` / `failed` / `no-state` / `skipped-duplicate`) and are
806
+ visible in `temp/epic-<id>/lifecycle.ndjson`. They do not block the
807
+ rest of cleanup.
808
+
809
+ For out-of-band cleanup re-entry (resume after a crash, or operator
810
+ override), fire `epic.merge.armed` via the lifecycle-emit helper:
811
+
812
+ ```bash
813
+ node .agents/scripts/lifecycle-emit.js --epic <epicId> \
814
+ --event epic.merge.armed --pr-url <prUrl>
815
+ ```
816
+
817
+ If Phase 8.5 fell back to the operator-merges-button path (`gh pr
818
+ merge --auto` was declined), the `epic.merge.armed` event never fires
819
+ inside this run and Phase 9 will not run automatically. After the
820
+ operator merges the PR, `epic/<epicId>` and each `story-<id>` ref can
821
+ be reaped manually:
822
+
823
+ ```bash
824
+ git checkout main
825
+ git pull --ff-only origin main
826
+ git branch -D epic/<epicId>
827
+ git branch -D story-<id1> story-<id2> ...
828
+ git remote prune origin
829
+ ```
830
+
831
+ Note that `git-cleanup.js` alone will not catch `story-<id>` refs in
832
+ this case because the epic PR squash-merges break the `git branch
833
+ --merged main` signal and the stories never had their own PRs. Wiring
834
+ a CLI surface that drives the BranchCleaner listener for this
835
+ fallback is tracked as follow-up to Story #2398.
836
+
837
+ ---
838
+
839
+ ## Idempotence and resume
840
+
841
+ Re-runs pick up at the next undispatched wave (in-flight Stories finish
842
+ via `helpers/epic-deliver-story`'s own checkpointing). The PR from Phase 7 is
843
+ updated in place on subsequent runs. The authoritative live view is
844
+ the `epic-run-progress` structured comment.
845
+
846
+ ---
847
+
848
+ ## Constraints
849
+
850
+ - **Never** merge `epic/<epicId>` to `main` outside Phase 8.5.
851
+ - **Never** dispatch more than one wave at a time; concurrency lives
852
+ inside a single wave's fan-out, capped at `concurrencyCap`.
853
+ - **Never** flip Story-level labels from this skill; **never** invoke
854
+ `helpers/epic-deliver-story` yourself (children run it via Agent fan-out,
855
+ even for single-Story waves); **never** spawn a subprocess for dispatch.
856
+ - **Always** checkpoint via `epic-deliver-prepare.js` /
857
+ `epic-execute-record-wave.js`; never write run state elsewhere.
858
+ - **Always** post a friction structured comment before a non-`complete`
859
+ outcome.
860
+ - **Always** auto-invoke the epic-audit, code-review, and retro helpers
861
+ (Phases 4–6) when their artefacts aren't already present.
862
+ - **Always** drive Phase 8 to green CI before returning control — the
863
+ host LLM owns the loop until the PR is mergeable or the Epic is
864
+ parked at `agent::blocked`.