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,295 @@
1
+ ---
2
+ description: >-
3
+ Run smart change-set audits at Epic finalize. Consumes the epic-audit-prepare
4
+ envelope, dispatches each selected lens inline via runAuditSuite, and posts
5
+ an audit-results structured comment back onto the Epic ticket.
6
+ ---
7
+
8
+ # Epic Audit (helper)
9
+
10
+ > **Helper module.** Not a slash command. Invoked automatically from
11
+ > `/epic-deliver` Phase 4 once the wave loop completes (all Stories at
12
+ > `agent::done`). To run an audit directly, use `/epic-deliver [Epic_ID]` — it
13
+ > delegates here (or pass `--skip-epic-audit` to bypass).
14
+
15
+ This helper runs the **change-set-aware audit pass** on an Epic branch
16
+ before the code-review helper opens its review. Unlike code-review (which
17
+ walks the full diff against `main` through six fixed pillars), epic-audit
18
+ asks the [`selectAudits`](../../scripts/lib/audit-suite/index.js) SDK which
19
+ lenses are actually relevant to **this** Epic's change set, then dispatches
20
+ only the matching audit workflows. Docs-only Epics select zero lenses and
21
+ exit cleanly.
22
+
23
+ In addition to the change-set selection, `epic-audit-prepare.js` unions in
24
+ the **risk-routed lenses** (Story #3889): it reads the Epic's model-judged
25
+ `planningRisk` envelope off the `epic-plan-state` checkpoint and routes each
26
+ high-risk axis to its mapped lens via
27
+ [`resolveAuditLenses`](../../scripts/lib/orchestration/code-review.js)
28
+ (`security` → `audit-security`, `public-api` → `audit-architecture`). A
29
+ high-risk Epic therefore auto-runs its mapped lenses even when the change
30
+ set alone did not select them; a low-risk Epic adds nothing beyond the
31
+ change-set selection. Both lens sources fire through the **same**
32
+ `runAuditSuite` dispatch below — no new audit machinery.
33
+
34
+ > **When to run**: After Phase 3 close-validation passes and before Phase 5
35
+ > code-review. `/epic-deliver` invokes this automatically once the wave loop
36
+ > completes and all Stories reach `agent::done`.
37
+ >
38
+ > **Persona**: `architect` · **Skills**: `core/code-review-and-quality`,
39
+ > `core/security-and-hardening`
40
+
41
+ ## Step 0 — Resolve Context
42
+
43
+ 1. Resolve `[EPIC_ID]` — the GitHub Issue number of the Epic under audit.
44
+ 2. Resolve `[EPIC_BRANCH]` — `epic/<epicId>`.
45
+ 3. Resolve `[BASE_BRANCH]` from `baseBranch` in `.agentrc.json` (default:
46
+ `main`).
47
+ 4. Fetch the Epic ticket and identify linked context tickets:
48
+ - **PRD** — the `context::prd` ticket linked in the Epic body.
49
+ - **Tech Spec** — the `context::tech-spec` ticket linked in the Epic
50
+ body.
51
+ 5. Read both the PRD and Tech Spec fully to understand the intended scope,
52
+ selected lenses, and acceptance criteria.
53
+
54
+ ## Step 1 — Prepare (`epic-audit-prepare.js`)
55
+
56
+ Run the prepare CLI to compute the change-set, ask `selectAudits` which
57
+ lenses fire at `gate3` (the Epic close gate), and emit the helper-consumable
58
+ JSON envelope on stdout:
59
+
60
+ ```bash
61
+ node .agents/scripts/epic-audit-prepare.js \
62
+ --epic [EPIC_ID] --base-branch [BASE_BRANCH] --gate gate3
63
+ ```
64
+
65
+ The CLI is thin glue around the audit-suite SDK and is fully described in
66
+ [`epic-audit-prepare.js`](../../scripts/epic-audit-prepare.js). Capture the
67
+ envelope:
68
+
69
+ ```json
70
+ {
71
+ "epicId": 2586,
72
+ "epicBranch": "epic/2586",
73
+ "depth": "deep",
74
+ "selectedAudits": ["audit-security", "audit-privacy"],
75
+ "changeSetAudits": ["audit-privacy"],
76
+ "riskRoutedAudits": ["audit-security"],
77
+ "changedFiles": ["src/api/admin/users.ts", "..."],
78
+ "changedFilesCount": 47,
79
+ "substitutionsPayload": "src/api/admin/users.ts\n..."
80
+ }
81
+ ```
82
+
83
+ `selectedAudits` is the de-duplicated **union** of `changeSetAudits` (the
84
+ change-set selection) and `riskRoutedAudits` (the model-judged risk-routed
85
+ lenses). The two source arrays are surfaced for observability so the
86
+ operator can see why each lens fired. Dispatch the `selectedAudits` union
87
+ in Step 2.
88
+
89
+ ### The `depth` field (Story #3939)
90
+
91
+ `depth` is `light`, `standard`, or `deep` — an **orthogonal** signal that
92
+ tells you how thorough each **selected** lens should be on this Epic. It is
93
+ resolved by the shared `resolveDepth` resolver from the Epic's model-judged
94
+ risk envelope (`overallLevel` off the `epic-plan-state` checkpoint) folded
95
+ with `changedFilesCount`: a high-risk **or** wide-footprint Epic resolves to
96
+ `deep`, a low-risk small one to `light`, and everything else — including an
97
+ Epic that skipped `/epic-plan` and has no checkpoint — to `standard`.
98
+
99
+ Depth changes **how deeply** each lens runs, never **which** lenses fire:
100
+
101
+ - **`light`** — run each selected lens against the **changed surface only**
102
+ and report **only Critical/High** findings. Skip the Medium/Suggestion
103
+ sweep. Light **never skips a selected lens** — including the alwaysRun
104
+ floor (`audit-clean-code`, `audit-architecture`) — it only **shrinks the
105
+ selected lens's sweep**. An easy, low-risk Epic still runs its audits;
106
+ they just run lighter.
107
+ - **`standard`** — today's behavior: walk each selected lens's full
108
+ procedure over the changed surface at every severity.
109
+ - **`deep`** — run the full lens procedure over the changed surface **plus
110
+ the modules it directly touches**, at every severity.
111
+
112
+ Depth never changes the severity taxonomy, the findings-report shape, or the
113
+ Phase 4 halting rule below (a 🔴 Critical Blocker halts at every depth;
114
+ everything else logs). Thread the resolved `depth` into each lens walk in
115
+ Step 2 — it scopes the sweep, it does not gate the roster.
116
+
117
+ ### Outcomes
118
+
119
+ - **`selectedAudits` is non-empty** — continue to Step 2.
120
+ - **`selectedAudits` is empty** (docs-only or no-lens change set, and no
121
+ high-risk axis routed a lens) — skip Step 2 and write the docs-only
122
+ marker described in Step 4.
123
+ - **`degraded: true`** — the selector aborted. Possible `reason` codes:
124
+ `GIT_DIFF_TIMEOUT` (git-diff timed out), `HEAD_REF_UNRESOLVED` (the
125
+ Epic's branch `refs/heads/epic/<id>` is not present in this checkout),
126
+ or `EPIC_REF_MISMATCH` (the selector diffed a ref other than the
127
+ requested Epic's branch — the cross-epic-leak guard from Story #3362).
128
+ Surface the `reason`/`detail` fields to the operator, post a friction
129
+ comment on the Epic, and STOP. Do not fall back to running the full lens
130
+ roster — that defeats the change-set scoping, and an unresolved/mismatched
131
+ ref means the change set would belong to the wrong Epic.
132
+
133
+ ## Step 2 — Walk Selected Lenses (`runAuditSuite`)
134
+
135
+ > **Execution model — the host LLM is the executor, not the CLI.**
136
+ > `run-audit-suite.js` is a **prompt-assembly runner**, not a findings
137
+ > generator. It resolves each lens to its workflow markdown, applies
138
+ > the `{{ticketId}}` / `{{baseBranch}}` / `{{changedFiles}}` (and any
139
+ > per-audit) substitutions, and returns one *workflow descriptor* per
140
+ > lens. Its return envelope intentionally carries `findings: []` and
141
+ > `summary: { critical:0, high:0, medium:0, low:0 }` because no lens
142
+ > has been *executed* yet — the host LLM walks each workflow's
143
+ > procedure inline against the substitution payload, severity-rates
144
+ > what it finds, and assembles the aggregate report in Step 4. If you
145
+ > expected `findings[]` to be populated by the CLI, the rest of this
146
+ > helper will surprise you; stop and re-read this paragraph.
147
+
148
+ For each lens name in `selectedAudits`, invoke
149
+ [`runAuditSuite`](../../scripts/lib/audit-suite/index.js) (or its CLI
150
+ wrapper) with the prepare envelope as the substitution source. The
151
+ runner loads the matching `.agents/workflows/audit-<lens>.md` file,
152
+ applies the substitutions, and — when `--run-id` is supplied — writes
153
+ the substituted body to a per-lens artifact at
154
+ `<auditOutputDir>/audit-<run-id>-<lens>.md` (default `auditOutputDir`
155
+ is `temp/audits/`):
156
+
157
+ ```bash
158
+ node .agents/scripts/run-audit-suite.js \
159
+ --audits audit-security,audit-privacy \
160
+ --ticket [EPIC_ID] \
161
+ --base-branch [BASE_BRANCH] \
162
+ --substitution changedFiles="[substitutionsPayload]" \
163
+ --run-id epic-[EPIC_ID]
164
+ ```
165
+
166
+ CLI shape notes:
167
+
168
+ - `--audits` is **comma-separated**, not space-separated. Passing each
169
+ lens as a separate positional arg only captures the first one.
170
+ - `--substitution` is **repeatable** (`key=value` per occurrence); the
171
+ legacy `--substitutions '<json>'` flag is not supported.
172
+ - `--run-id` is the per-lens artifact prefix (the legacy
173
+ `--artifact-prefix` flag is not supported). When omitted, no
174
+ artifact is written and the host LLM must walk the workflow body in
175
+ memory.
176
+
177
+ After the runner returns:
178
+
179
+ 1. **Read the descriptor stream** — confirm every requested lens
180
+ appears in `metadata.auditsRun`, then walk each entry in
181
+ `workflows[]` (or each on-disk artifact when `--run-id` was set).
182
+ 2. **Execute the lens inline at the run's `depth`.** Open the lens
183
+ workflow at `path` (or the per-lens artifact file when `--run-id`
184
+ produced one) and follow its procedure verbatim against the
185
+ substituted change set, scoping the sweep to the envelope's `depth`
186
+ (see "The `depth` field" above): `light` walks the changed surface and
187
+ reports only 🔴/🟠 findings, `standard` walks the full procedure at
188
+ every severity, and `deep` extends the sweep to the directly-touched
189
+ modules. Depth scopes the sweep only — never skip a selected lens.
190
+ Each lens declares its own pillars, severity rubric, and remediation
191
+ prose; treat its body as the canonical execution contract for that
192
+ pass.
193
+ 3. **Aggregate** by severity (🔴 Critical Blocker / 🟠 High /
194
+ 🟡 Medium / 🟢 Suggestion). Hold the aggregate for Step 3
195
+ (auto-fix) and Step 4 (the `audit-results` structured comment).
196
+
197
+ If a future Story lifts per-lens execution out of the host-LLM walk
198
+ into the CLI itself, the runner will populate `findings[]` and this
199
+ section will collapse to a "read the structured findings off the
200
+ envelope" bullet. Until then, the host LLM is the gate.
201
+
202
+ ## Step 3 — Remediation Routing (host LLM, no automated loop)
203
+
204
+ There is **no runtime auto-fix function** at this phase. The host LLM is
205
+ the executor: it inspects the aggregated 🔴 / 🟠 findings from Step 2 and
206
+ either applies a focused fix on the Epic branch or escalates the finding
207
+ to the operator via the `audit-results` comment in Step 4.
208
+
209
+ For each 🔴 / 🟠 finding, the host LLM MUST decide between two paths:
210
+
211
+ 1. **Apply a focused fix on `[EPIC_BRANCH]`.** Permitted only when the
212
+ finding is unambiguously *fixable* (clean remediation, no scope creep,
213
+ no spec deviation, no secret exposure):
214
+ - Call [`assert-branch.js`](../../scripts/assert-branch.js) with
215
+ `--expected [EPIC_BRANCH]` before touching the working tree.
216
+ - Stage explicit paths only (never `git add .`).
217
+ - Make one focused conventional commit per finding
218
+ (`fix(<scope>): <description> (audit finding)`).
219
+ - Re-run the owning lens (re-invoke `run-audit-suite.js` for that
220
+ single lens) and confirm the finding is gone before moving on.
221
+ - Run the lens-appropriate validation subset (`npm run lint` plus the
222
+ relevant `npm test` slice) to confirm the fix did not regress
223
+ anything.
224
+ - If the rescan still surfaces the same finding, or validation
225
+ regresses, **stop fixing** — route the finding to escalation
226
+ (path 2) and record the attempt context in Step 4.
227
+ 2. **Escalate to the operator via Step 4.** Required when the finding
228
+ falls into any of the following classes:
229
+ - `spec-deviation` — the change diverges from the PRD/Tech Spec.
230
+ - `secrets` — credentials, tokens, or PII surfaced in the diff.
231
+ - `test-deletion` — coverage was removed without an explicit
232
+ decision in the spec.
233
+ - `scope-exceeded` — the remediation would touch more files than the
234
+ change set warrants.
235
+ - Any finding the host LLM cannot remediate after one focused
236
+ attempt (the equivalent of the prior loop's
237
+ `validation-regression` / `thrash-detected` exits).
238
+
239
+ Do not invent a programmatic retry budget. The host LLM applies *at most
240
+ one* focused-fix attempt per finding before escalating; any further
241
+ remediation is the operator's call after reading the `audit-results`
242
+ comment.
243
+
244
+ Escalated findings flow through to Step 4 unchanged with their
245
+ escalation reason recorded — the audit pass does not delete them, it
246
+ just stops trying to fix them automatically. Surface the escalation
247
+ reason for each in the `audit-results` comment so the operator sees
248
+ exactly why the finding was not auto-remediated.
249
+
250
+ ## Step 4 — Post `audit-results` Structured Comment
251
+
252
+ Persist the findings as an `audit-results` structured comment on the Epic
253
+ issue. The comment is idempotent — re-runs replace the prior one. Build the
254
+ body in a temp file under `[TEMP_ROOT]/epic-[EPIC_ID]/audit-results.md`,
255
+ then upsert via [`post-structured-comment.js`](../../scripts/post-structured-comment.js):
256
+
257
+ ```bash
258
+ node .agents/scripts/post-structured-comment.js \
259
+ --ticket [EPIC_ID] \
260
+ --marker audit-results \
261
+ --body-file [TEMP_ROOT]/epic-[EPIC_ID]/audit-results.md
262
+ ```
263
+
264
+ The body MUST include:
265
+
266
+ - the `selectedAudits` roster (or `Lenses applied: none (docs-only)` when
267
+ the prepare envelope returned an empty list),
268
+ - the per-severity counts (🔴 critical / 🟠 high / 🟡 medium / 🟢 suggestion),
269
+ - the per-lens findings grouped under the lens name, each carrying file
270
+ path + line range + pillar + recommended fix,
271
+ - a link to the per-lens artifact files under `<auditOutputDir>` so the
272
+ operator (and downstream retro) can re-read the full prompt body.
273
+
274
+ ### Severity gating
275
+
276
+ - **Any 🔴 Critical Blocker** → STOP. Relay to the operator and let
277
+ `/epic-deliver` Phase 4 record a manual intervention.
278
+ - **Only 🟠/🟡/🟢** → log as non-blocking and return to `/epic-deliver`
279
+ Phase 5 (code-review).
280
+
281
+ ## Constraints
282
+
283
+ - **Always** diff against `[BASE_BRANCH]`, not against individual Story
284
+ branches. The audit examines the cumulative effect of the entire Epic.
285
+ - **Always** read the PRD and Tech Spec before walking lenses. Findings
286
+ without spec context are noise.
287
+ - **Always** cap focused fixes at one attempt per finding (Step 3). The
288
+ host LLM is the executor; there is no shared retry/anti-thrash module
289
+ to call. Any finding that does not resolve cleanly on the first attempt
290
+ routes to escalation in Step 4.
291
+ - **Never** widen the lens roster past `selectedAudits`. The whole point of
292
+ the change-set selector is to avoid running irrelevant audits on a
293
+ scoped Epic — running extras defeats the gate.
294
+ - **Always** propagate `degraded` envelopes verbatim. Do not paper over a
295
+ selector failure with a full-roster fallback.
@@ -0,0 +1,370 @@
1
+ ---
2
+ description: >-
3
+ Helper — not a slash command. Execute one Epic-attached Story end-to-end on
4
+ behalf of `/epic-deliver`. Calls `story-init.js`, `cd`s into the worktree,
5
+ runs the Story-implementation phase against the inline acceptance[] /
6
+ verify[] arrays, writes a `story-run-progress` snapshot per transition, and
7
+ finally calls `story-close.js` to merge into the Epic branch and reap the
8
+ worktree.
9
+ caller: epic-deliver.md
10
+ ---
11
+
12
+ # helpers/epic-deliver-story — Epic-attached Story worker
13
+
14
+ > **Not a slash command.** This file lives in `helpers/` and is not projected
15
+ > into the mandrel plugin command tree. It is invoked exclusively by the
16
+ > [`/epic-deliver`](../epic-deliver.md) per-wave fan-out via an `Agent` tool
17
+ > call (`subagent_type: general-purpose`). Run `/epic-deliver <epicId>` from
18
+ > the operator surface, not this helper directly.
19
+
20
+ ## Overview
21
+
22
+ `epic-deliver-story` is the **single-Story worker** for Epic-attached Stories.
23
+ It sits below [`/epic-deliver`](../epic-deliver.md) (which fans out one Story
24
+ sub-agent per slot, per wave) and runs one Story from init to close in one
25
+ invocation.
26
+
27
+ ```text
28
+ /epic-deliver <epicId>
29
+ → for each wave N:
30
+ Agent tool × concurrencyCap parallel calls (one assistant turn):
31
+ helpers/epic-deliver-story <storyId>
32
+ → story-init.js
33
+ → single Story-implementation phase using inline
34
+ acceptance[] / verify[] from the Story body
35
+ → story-close.js
36
+ ```
37
+
38
+ The argument is always a **Story ID** (`type::story`). Epic IDs go through
39
+ [`/epic-deliver`](../epic-deliver.md).
40
+
41
+ **Standalone Stories** (no `Epic: #N` in body) use
42
+ [`/story-deliver`](../story-deliver.md) instead — that workflow's helper
43
+ branches from `main`, opens its PR directly to `main`, and skips the
44
+ Epic-scoped machinery (cascade, dispatch manifest, dashboard regen). This
45
+ helper requires a parent Epic and will refuse to initialize a Story that lacks
46
+ the `Epic: #N` reference.
47
+
48
+ > **Worktree isolation.** When `delivery.worktreeIsolation.enabled` is
49
+ > `true`, Step 0 creates a worktree at `.worktrees/story-<id>/` and prints
50
+ > its absolute path as `workCwd`. You **must** `cd` into that path before
51
+ > Step 1. The main checkout's HEAD is never moved. See
52
+ > [`worktree-lifecycle.md`](worktree-lifecycle.md) for node_modules
53
+ > strategies, Windows notes, and escape hatches.
54
+
55
+ ---
56
+
57
+ ## Non-interactive execution contract
58
+
59
+ `epic-deliver-story` runs as a sub-agent of `/epic-deliver`'s per-wave fan-out
60
+ (common case) or interactively for a single Story. Sub-agent runs share
61
+ the parent's permissions but have **no input channel** mid-run.
62
+
63
+ - **Never** ask clarifying questions as a sub-agent. Pick the narrowest
64
+ reasonable interpretation that satisfies the Story's AC. If you cannot
65
+ proceed, transition to `agent::blocked`, post a `friction` comment with
66
+ the decision needed and the default assumption, and exit non-zero.
67
+ - **Never** assume tool-permission prompts will be auto-approved. Treat a
68
+ blocking prompt as a harness condition and transition to `agent::blocked`.
69
+ - **Always** write `story-run-progress` snapshots at every phase
70
+ transition so the parent aggregator never falls back to label
71
+ re-derivation.
72
+
73
+ ---
74
+
75
+ ## Step 0 — Initialize (`story-init.js`)
76
+
77
+ Run from the **main checkout** (the worktree does not exist yet):
78
+
79
+ ```bash
80
+ node .agents/scripts/story-init.js --story <storyId>
81
+ ```
82
+
83
+ > **Execution mode (sub-agents must read).** This command typically takes
84
+ > 3–6 minutes when the worktree's per-tree install runs. Invoke it
85
+ > **synchronously** with the Bash tool's maximum timeout
86
+ > (`Bash(timeout: 600000)`). Do **not** use `run_in_background` + `Monitor`
87
+ > here: `Monitor`'s return is not equivalent to script exit, and a sub-agent
88
+ > that exits during a `Monitor` wait kills `story-init.js` mid-batch — the
89
+ > worktree is left half-initialized (no `story-init` comment, no Story-level
90
+ > `agent::*` label flip) and the parent
91
+ > wave aggregator records the Story as failed. The script is idempotent on
92
+ > partial state, so the recovery is to re-run it synchronously, but
93
+ > prevention is cheaper: just give Bash the 10-minute timeout and block.
94
+
95
+ The script validates `type::story`, checks blockers, traces the
96
+ Feature → Epic → PRD/Tech-Spec hierarchy, seeds `story-<id>` from the
97
+ Epic branch, and (when worktree isolation is on) runs `git worktree add`
98
+ at `.worktrees/story-<id>/`. The Story flips to `agent::executing`. A
99
+ `story-init` structured comment is upserted with the Story's inline
100
+ `acceptance[]` and `verify[]` arrays from the body.
101
+
102
+ Capture `workCwd`, `dependenciesInstalled` (tri-state), and
103
+ `context.{prdId,techSpecId,acceptance,verify}`. Add `--dry-run` to check
104
+ status without git or ticket changes.
105
+
106
+ ### Step 0.5 — `cd` into the workCwd
107
+
108
+ ```bash
109
+ cd "<workCwd from Step 0 result>"
110
+ ```
111
+
112
+ All subsequent commands run from this directory. The `dependenciesInstalled`
113
+ tri-state carries one of three values:
114
+
115
+ | Value | Meaning | Action |
116
+ | --------- | ---------------------------------------------------------------------------------- | --------------------------------------------------- |
117
+ | `true` | Per-worktree install ran and succeeded. | Proceed. |
118
+ | `false` | Install was attempted and failed. | The next CLI runs the install before proceeding. |
119
+ | `skipped` | No per-worktree install (single-tree, reused worktree, `symlink`, `pnpm-store`). | Trust the strategy. |
120
+
121
+ ### Step 0.6 — Initial `story-run-progress` snapshot
122
+
123
+ Re-read the `story-init` comment, apply the install tri-state, and upsert
124
+ the initial snapshot (`phase: "init"`):
125
+
126
+ ```bash
127
+ node .agents/scripts/story-deliver-prepare.js --story <storyId> --cwd .
128
+ ```
129
+
130
+ The CLI runs the install command when `dependenciesInstalled === 'false'`
131
+ (default `npm ci`; override with `--install-cmd "<cmd>"`).
132
+
133
+ The CLI's stdout JSON envelope carries a `renderedBody` field — the markdown
134
+ body that was upserted onto the Story ticket. **Relay it verbatim to chat**
135
+ so operators see the initial progress block before the first commit lands.
136
+ Do the same after every transition in Step 1 / Step 3 (the body is the
137
+ Story-level rollup the parent `/epic-deliver` aggregator reads).
138
+
139
+ ---
140
+
141
+ ## Step 1 — Story implementation
142
+
143
+ Run a single Story-implementation phase against the inline `acceptance[]`
144
+ / `verify[]` arrays on the Story body.
145
+
146
+ 1. Flip the snapshot to the `implementing` phase:
147
+
148
+ ```bash
149
+ node .agents/scripts/story-phase.js \
150
+ --story <storyId> --phase implementing
151
+ ```
152
+
153
+ 2. Read the Story body's inline `acceptance[]` and `verify[]` arrays
154
+ from the `story-init` structured comment (`context.acceptance`,
155
+ `context.verify`). Treat the acceptance items as the contract and
156
+ the verify items as the canonical at-keyboard checks.
157
+
158
+ 3. Implement the work as one or more commits on `story-<storyId>`.
159
+ Author commits directly with the project's editor / `git commit`,
160
+ following
161
+ [`.agents/rules/git-conventions.md`](../../rules/git-conventions.md):
162
+ - Conventional Commit subject (`feat:`, `fix:`, …).
163
+ - Reference the parent Story via `(refs #<storyId>)` in the subject
164
+ or body.
165
+ - The `commit-msg` Husky hook enforces commitlint locally.
166
+
167
+ 4. After the final commit lands, run the **bounded acceptance self-eval
168
+ loop** (Step 1a below) **before** flipping to `closing`. The
169
+ `verify[]` commands are consumed inside that loop as **required
170
+ evidence** — they are no longer optional advisory pre-flight.
171
+
172
+ 5. Once the eval loop returns `proceed`, flip the snapshot to `closing`
173
+ and proceed to Step 3:
174
+
175
+ ```bash
176
+ node .agents/scripts/story-phase.js \
177
+ --story <storyId> --phase closing
178
+ ```
179
+
180
+ 6. If blocked (including by the eval loop reaching its round cap with
181
+ criteria still unmet — Step 1a), flip the snapshot to `blocked`,
182
+ transition the Story to `agent::blocked`, post a `friction` comment,
183
+ and exit non-zero:
184
+
185
+ ```bash
186
+ node .agents/scripts/story-phase.js \
187
+ --story <storyId> --phase blocked
188
+ ```
189
+
190
+ ### Step 1a — Bounded acceptance self-eval loop (**required, not optional**)
191
+
192
+ After the implementation commits land and **before** the snapshot flips to
193
+ `closing`, run the bounded acceptance self-eval loop. The per-round critic
194
+ mechanic (fresh-context critic, `verify[]`-as-evidence, the verdict schema, and
195
+ the proceed / redraft / block decision) is the single-homed include
196
+ [`acceptance-self-eval.md`](acceptance-self-eval.md) — read it and follow it.
197
+ The critic reads the Story's inline `acceptance[]` / `verify[]` arrays from the
198
+ `story-init` comment (`context.acceptance` / `context.verify`).
199
+
200
+ Epic-attached specifics for this path:
201
+
202
+ - **Gate invocation** (pass `--epic <epicId>` so the per-criterion signal lands
203
+ on the Epic-scoped stream):
204
+
205
+ ```bash
206
+ node .agents/scripts/acceptance-eval.js \
207
+ --story <storyId> --epic <epicId> --verdict <verdict-path>
208
+ ```
209
+
210
+ - **On `decision: "proceed"`** → flip the snapshot to `closing` (item 5 above).
211
+ - **On `decision: "block"`** → take the blocked path (item 6 above): post a
212
+ `friction` comment naming the unmet criteria and their evidence, flip the
213
+ snapshot to `blocked`, and exit non-zero. Never silently proceed to close.
214
+
215
+ The resume guard is expressed at the Story level: re-entering a
216
+ partially-implemented Story picks up from whatever commits are already
217
+ on `story-<storyId>`; the agent inspects `git log` to decide what work
218
+ remains.
219
+
220
+ After each `story-phase.js` call, **relay the envelope's
221
+ `renderedBody` to chat** as the Story's progress update. Skip chat
222
+ relay only when running in a non-interactive sub-agent context where
223
+ the parent will aggregate.
224
+
225
+ > Rebase pauses on conflicts → follow
226
+ > [`_merge-conflict-template.md`](_merge-conflict-template.md).
227
+
228
+ ---
229
+
230
+ ## Step 2 — Validate (deferred to close)
231
+
232
+ `story-close.js` runs the canonical close-validation chain (typecheck,
233
+ lint, test, format, maintainability, coverage, crap) before it merges —
234
+ **do not** pre-run those gates here unless interactively iterating on a
235
+ fix. (Interactively, `npm run typecheck && npm run lint && npm test` is
236
+ fine as advisory pre-flight.)
237
+
238
+ ---
239
+
240
+ ## Step 3 — Close (`story-close.js`)
241
+
242
+ Flip the snapshot to the closing phase, then invoke close. Pass the
243
+ main-checkout path via `--cwd` so the merge and branch deletion run
244
+ against the main repo (branches checked out in a worktree cannot be
245
+ deleted from themselves):
246
+
247
+ ```bash
248
+ node .agents/scripts/story-phase.js \
249
+ --story <storyId> --phase closing
250
+
251
+ node <main-repo>/.agents/scripts/story-close.js --story <storyId> --cwd <main-repo>
252
+ ```
253
+
254
+ In single-tree mode, `--cwd` defaults to `PROJECT_ROOT`. The script merges
255
+ into `epic/<epicId>` (`--no-ff`), pushes the Epic branch, deletes the
256
+ Story branch, reaps the worktree via `WorktreeManager.reap`, closes the
257
+ Story to `agent::done`, runs `cascadeCompletion()`, and regenerates the
258
+ Epic dispatch manifest (`--skip-dashboard` to suppress). Output is JSON
259
+ with `ticketsClosed[]`, `cascadedTo[]`, and reap status.
260
+
261
+ > **Why not GitHub auto-close?** `Closes #N` only fires on default-branch
262
+ > merges; close fires the state writer explicitly.
263
+
264
+ After close, upsert a terminal snapshot:
265
+
266
+ ```bash
267
+ node .agents/scripts/story-phase.js \
268
+ --story <storyId> --phase done
269
+ ```
270
+
271
+ ---
272
+
273
+ ## Step 4 — Return contract (sub-agent path)
274
+
275
+ When run as a sub-agent, return one JSON object:
276
+
277
+ ```json
278
+ {
279
+ "storyId": <number>,
280
+ "status": "done" | "blocked" | "failed",
281
+ "phase": "init|implementing|closing|blocked|done",
282
+ "branchDeleted": <boolean>,
283
+ "blockerCommentId": <string|null>,
284
+ "detail": <string|undefined>,
285
+ "renderedBody": <string|undefined>
286
+ }
287
+ ```
288
+
289
+ `status === 'done'` requires the Story closed and
290
+ `branchDeleted: true`.
291
+
292
+ > **Handoff discipline — report state, not process.** Populate the return
293
+ > object with essential terminal state only: the Story branch, the closing
294
+ > commit SHA, what changed, and what was verified (this maps onto the
295
+ > existing `storyId` / `branchDeleted` / `phase` / `detail` /
296
+ > `renderedBody` fields — do **not** add new envelope fields). Do not
297
+ > narrate the steps you took to get there, and do not prescribe how
298
+ > `/epic-deliver`'s aggregator should do its job downstream. The parent
299
+ > reads structured state from this envelope and the `story-run-progress`
300
+ > snapshot; prose process commentary only bloats the hydrated prompt
301
+ > (`delivery.maxTokenBudget` elision).
302
+
303
+ `branchDeleted` is sourced from the `branchDeleted` field of the
304
+ `story-close.js` result envelope, which is `branchCleanup.localDeleted &&
305
+ branchCleanup.remoteDeleted`. It is **independent** of `worktreeReap.status`.
306
+ Specifically, when `worktreeReap.status === 'stale-registry-entry'` — a
307
+ Windows-only outcome where the worktree directory was removed and the local
308
+ branch was deleted but `git worktree list` still shows the entry — the
309
+ close still reports `branchDeleted: true` because the branch was honestly
310
+ deleted; a pending-cleanup entry is recorded so the next post-close drain
311
+ (or the next plan-time sweep) clears the stale `.git/worktrees/<name>/`
312
+ registry entry. Treat `stale-registry-entry` as operationally complete
313
+ when computing your return contract: `status: 'done'` is appropriate when
314
+ all Tasks are closed and `branchDeleted: true`, regardless of whether
315
+ `worktreeReap.status` is `'removed'`, `'removed-after-drain'`, or
316
+ `'stale-registry-entry'`.
317
+
318
+ `renderedBody` is the **most recent** `renderedBody` returned by
319
+ `story-phase.js` (typically the `phase: 'done'` snapshot at close,
320
+ or the `phase: 'blocked'` snapshot on a blocker). The parent
321
+ `/epic-deliver` may inline a digest of this in its wave-level Notable
322
+ section. When run interactively (no parent), omit it — the chat already
323
+ has the latest body relayed during Step 1 / Step 3.
324
+
325
+ ---
326
+
327
+ ## Idempotence
328
+
329
+ `story-init.js` re-prints the same `workCwd` without recreating the
330
+ worktree. `story-run-progress` is upserted in place. `story-close.js`
331
+ short-circuits when the Story branch is already merged and deleted. Re-
332
+ running this helper against an already-closed Story is safe.
333
+
334
+ ---
335
+
336
+ ## Constraints
337
+
338
+ - **MUST merge into `epic/<epicId>`, never `main`.** The Story branch's
339
+ only integration target is the parent Epic's integration branch. If
340
+ `story-close.js` short-circuits, no-ops, or otherwise fails to merge,
341
+ **do NOT** fall back to `gh pr create --base main`, **do NOT** invoke
342
+ `/story-deliver` on the same Story, and **do NOT** open a PR by
343
+ hand against `main`. Such a PR orphans the change on `main` and forces
344
+ a manual `git merge origin/main` back into `epic/<id>` to recover (the
345
+ Epic #2880 wave-5 / Story #2960 friction note). The framework refuses
346
+ these PRs via the `pr-base-guard` helper wired into every
347
+ `createPullRequest` surface; a raw shell `gh pr create` is the only
348
+ way to bypass it, and you must not. Diagnose the no-op (was the
349
+ branch already merged? is the ticket already closed? is the worktree
350
+ on the wrong HEAD?) and re-run close, or transition the Story to
351
+ `agent::blocked` with a `friction` comment so the operator can
352
+ resolve it.
353
+ - **Never** push the Story branch directly to `main`. `story-close.js` is
354
+ the only writer that integrates upstream, and only into `epic/<epicId>`.
355
+ - **Never** merge across Story branches; cross-Story dependencies are
356
+ resolved by wave ordering via `blocked by`.
357
+ - **Always** `cd` into the `workCwd` returned by Step 0 before editing, and
358
+ prefix every path-based Edit/Write/Read with that absolute `workCwd` root —
359
+ the Edit tools ignore the shell cwd. The worktree pins the branch to
360
+ `story-<storyId>`, so there is no need to re-check `git branch` before each
361
+ commit.
362
+ - **Always** upsert a `story-run-progress` snapshot at every phase
363
+ transition. The wave aggregator depends on this comment, not labels.
364
+ - **Always** pass `--cwd <main-repo>` to `story-close.js` when invoking
365
+ from inside a worktree.
366
+ - **Label transitions**: drive every `agent::*` state change through
367
+ `node .agents/scripts/update-ticket-state.js --ticket <id> --state <state>`.
368
+ This CLI is the authoritative mechanism — there is no separate
369
+ state-mutation MCP server to degrade from (see
370
+ [`.agents/instructions.md` § 1.D](../../instructions.md)).