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,288 @@
1
+ ---
2
+ description: Drive Gherkin scenarios through a real browser as an agent-driven QA sweep
3
+ ---
4
+
5
+ # /qa-run-harness
6
+
7
+ Execute a consumer's Gherkin `.feature` scenarios through a **real browser**
8
+ (the chrome-devtools MCP surface), with the agent acting as the step executor
9
+ and a human observing. The harness resolves the consumer's `qa` contract,
10
+ selects a concrete scenario set, signs in via the configured seam, navigates
11
+ **from a root** to drive each `Given/When/Then`, and asserts `Then` outcomes
12
+ **semantically** against the accessibility snapshot. Per-surface console and
13
+ network are instrumented into structured findings; findings are bundled into a
14
+ follow-up **draft** for operator sign-off — the harness never files tickets
15
+ autonomously.
16
+
17
+ This workflow is the agent-driven successor to the framework's earlier
18
+ headless BDD runner. It is a **prose workflow**, not a Node orchestrator: the host LLM
19
+ executes the procedure; deterministic Node helpers under
20
+ `.agents/scripts/lib/qa/` do only contract resolution, scenario selection, and
21
+ console filtering.
22
+
23
+ > **When to run**: During sprint testing to exercise a targeted slice of the
24
+ > acceptance suite (a feature, a tag expression, or a domain), for regression
25
+ > passes before `/epic-deliver`, or on demand while debugging a Story's
26
+ > user-visible behavior in a live browser.
27
+ >
28
+ > **Persona**: `qa-engineer` · **Skills**: `stack/qa/gherkin-authoring`,
29
+ > `stack/qa/playwright-bdd` (authoring reference; this harness owns execution)
30
+
31
+ ## Slash Command
32
+
33
+ ```text
34
+ /qa-run-harness <selector>
35
+ ```
36
+
37
+ ### Arguments
38
+
39
+ | Name | Required | Shape / Example | Notes |
40
+ | ---------- | -------- | -------------------------------------------- | -------------------------------------------------------------------------------------------------- |
41
+ | `selector` | yes | `feature:login`, `tag:@smoke and not @wip`, `domain:billing` | Scopes the sweep to a concrete scenario set. One of three kinds — see below. |
42
+
43
+ The selector is resolved by
44
+ [`resolve-selection.js`](../scripts/lib/qa/resolve-selection.js) into a
45
+ deterministic, `(file, line)`-sorted scenario set under the contract's
46
+ `featureRoot`. The three kinds map to that resolver's selector shapes:
47
+
48
+ - **`feature:<id>`** → `{ kind: 'feature', id }` — the single `.feature` file
49
+ whose `featureRoot`-relative path stem (or basename) equals the id
50
+ (case-insensitive). Ambiguous ids throw; qualify with a relative path.
51
+ - **`tag:<expression>`** → `{ kind: 'tag', expression }` — the scenario set
52
+ whose tags satisfy the cucumber boolean expression (`@tag` atoms with
53
+ `and` / `or` / `not` and parentheses). Quote expressions that contain
54
+ spaces.
55
+ - **`domain:<name>`** → `{ kind: 'domain', name }` — every scenario under the
56
+ `featureRoot`-relative subdirectory `name`.
57
+
58
+ ### Examples
59
+
60
+ ```text
61
+ /qa-run-harness feature:login
62
+ /qa-run-harness "tag:@smoke and not @wip"
63
+ /qa-run-harness domain:billing
64
+ ```
65
+
66
+ The canonical tag taxonomy — `@smoke`, `@risk-high`, `@platform-web`,
67
+ `@platform-mobile`, `@domain-*`, and the allowed extension syntax — is defined
68
+ in `.agents/rules/gherkin-standards.md`. Do not invent tags inside a feature
69
+ file; add new tags to the rule first.
70
+
71
+ ## Step 0 — Resolve the `qa` contract (fail loudly when absent)
72
+
73
+ The harness is meaningless without the consumer's `qa` contract block in
74
+ `.agentrc.json`. Resolve it through the single seam
75
+ [`resolve-qa-contract.js`](../scripts/lib/qa/resolve-qa-contract.js) **before
76
+ any browser work**:
77
+
78
+ ```bash
79
+ node -e "import('./.agents/scripts/lib/qa/resolve-qa-contract.js').then(async (m) => { const { resolveConfig } = await import('./.agents/scripts/config-resolver.js'); const cfg = await resolveConfig(); console.log(JSON.stringify(m.resolveQaContract(cfg), null, 2)); })"
80
+ ```
81
+
82
+ (Use whatever config-resolution entry point the host exposes; the contract
83
+ seam is `resolveQaContract(config)`.) The resolver returns the normalized
84
+ contract:
85
+
86
+ | Field | Use |
87
+ | ------------------ | ------------------------------------------------------------------------- |
88
+ | `featureRoot` | Root passed to `resolve-selection.js` for scenario discovery. |
89
+ | `fixturesManifest` | Persona → seed binding loaded before sign-in. |
90
+ | `signInSeam` | `{ kind: 'url', template }` **or** `{ kind: 'skill', skill }` — see Step 2. |
91
+ | `personas` | Canonical object map keyed by persona name (`personaNames` lists the names). Authored as a plain name array under a `urlTemplate` seam, or as a per-persona credential/skill map under a `skill` (or credential) seam — see Step 2. |
92
+ | `consoleAllowlist` | Inline benign-console patterns (default `[]`) — see Step 4. |
93
+ | `designTokens` | Pointer to the token/style source for visual inspection (default `null`). |
94
+
95
+ ### Loud-failure path (no `qa` block)
96
+
97
+ `resolveQaContract` **throws** — there is no silent fallback to
98
+ auto-detection — in three cases:
99
+
100
+ - **Block absent** (no `qa` key, or an empty `qa: {}` with no harness-required
101
+ fields): the error reads
102
+ _"qa: this project has not bound the QA harness — add a `qa` block to
103
+ .agentrc.json (featureRoot, fixturesManifest, signInSeam, personas) before
104
+ invoking the QA harness."_
105
+ - **Malformed shape** (wrong-typed field, unknown field): the error names the
106
+ offending field, e.g. `qa.featureRoot must be a string`.
107
+ - **Missing required field**: the error names the first missing field.
108
+
109
+ When you hit any of these, **STOP immediately**. Relay the resolver's
110
+ verbatim message to the operator as the harness's terminal output and do not
111
+ proceed to browser execution. Do not invent a `featureRoot`, do not guess a
112
+ sign-in seam, and do not fall back to any retired headless BDD runner. The
113
+ loud failure is the contract: a consumer that has not bound the harness has
114
+ not opted into it.
115
+
116
+ ### MCP availability check
117
+
118
+ The chrome-devtools MCP surface (`navigate_page`, `take_snapshot`, `click`,
119
+ `fill_form`, `evaluate_script`, `wait_for`, `list_console_messages`,
120
+ `list_network_requests`) is **host-provided** — it is an external runtime
121
+ dependency, not in-repo code. If the host does not expose it, degrade with a
122
+ clear error ("the chrome-devtools MCP server is unavailable; the QA harness
123
+ requires a live browser surface") and stop. Do not attempt a headless
124
+ fallback.
125
+
126
+ ## Step 1 — Select the scenario set
127
+
128
+ Pass the parsed `selector` and the contract's `featureRoot` to
129
+ [`resolveSelection`](../scripts/lib/qa/resolve-selection.js). It returns
130
+ `{ kind, featureRoot, files, scenarios }` where `scenarios` is the
131
+ `(file, line)`-sorted set the sweep will execute. Determinism is load-bearing:
132
+ re-running the same selector across sweeps scopes the identical set, so the
133
+ evidence stays diffable.
134
+
135
+ Load the `fixturesManifest` to resolve each persona's seed data before
136
+ sign-in. If the selection is empty, report "no scenarios matched
137
+ `<selector>`" and stop — an empty selection is operator error (a typo'd
138
+ feature id or domain), not a passing sweep.
139
+
140
+ ## Step 2 — Sign in via the `signInSeam`
141
+
142
+ Sign in **once per persona** before driving that persona's scenarios, using
143
+ the contract's discriminated-union seam:
144
+
145
+ - **`kind: 'url'`** — substitute `{persona}` into `template` (e.g.
146
+ `/dev/sign-in-as/{persona}` → `/dev/sign-in-as/admin`) and `navigate_page`
147
+ to the resulting dev seam URL. This is a dev-only seam; **no real
148
+ credentials** are ever entered. The persona **name** (a `personaNames`
149
+ entry) is the **sole input** the seam consumes — per-persona auth material
150
+ is neither needed nor read here, so under a `urlTemplate` seam the contract
151
+ is authored as a plain name array (`personas: ["athlete", "coach"]`).
152
+ - **`kind: 'skill'`** — invoke the named consumer skill for procedural
153
+ (multi-step or non-URL) sign-in. Read the skill's `SKILL.md` and follow it.
154
+
155
+ ### Which seam kinds consult per-persona material
156
+
157
+ Per-persona auth material (`credentialRef` / `signInSkill`, authored via the
158
+ object-map `personas` shape) is consulted **only** under a `skill` or
159
+ credential seam, where the sign-in procedure needs a stored credential
160
+ reference or a per-persona sign-in skill. Under a `urlTemplate`
161
+ dev-impersonation seam the persona name is the only input, so the material is
162
+ never read — author name-only personas there rather than fabricating
163
+ `credentialRef`/`signInSkill` values the harness ignores. The resolver
164
+ normalizes both authored shapes to one canonical object map keyed by persona
165
+ name; a name-only persona resolves to an empty record (no auth material).
166
+
167
+ After sign-in, confirm the authenticated state with a `take_snapshot`
168
+ (e.g. the user menu or persona badge is present) before driving any scenario.
169
+
170
+ ## Step 3 — Drive each scenario (navigation-first, semantic Then)
171
+
172
+ For each scenario in selection order, drive its `Given/When/Then` steps
173
+ through the browser. Two rules are **non-negotiable**:
174
+
175
+ ### Navigation-first — never URL-jump
176
+
177
+ Start every scenario at a **root** (the app's home/dashboard after sign-in)
178
+ and reach the surface under test **only by navigating UI affordances** — click
179
+ nav links, menu items, buttons, and follow the same paths a real user would.
180
+ **Never** `navigate_page` directly to a deep link to set up a `Given`. URL-
181
+ jumping bypasses the app's real authorization and routing flows, which both
182
+ masks access-control gaps and produces findings that do not reflect a user-
183
+ reachable state. Driving via affordances keeps the agent inside the app's
184
+ genuine flows and surfaces broken navigation, guard redirects, and dead links
185
+ as findings rather than hiding them.
186
+
187
+ Map the Gherkin steps to browser actions:
188
+
189
+ - **`Given`** — establish state by navigating from the root via affordances
190
+ (sign in as the persona, navigate to the starting surface, seed via UI where
191
+ the manifest does not pre-seed).
192
+ - **`When`** — perform the user action: `click`, `fill_form`,
193
+ `evaluate_script` (only for app-provided hooks, never to fabricate the
194
+ outcome), then `wait_for` the resulting transition.
195
+ - **`Then`** — assert the outcome semantically (below).
196
+
197
+ ### Semantic Then assertion against the accessibility snapshot
198
+
199
+ Assert every `Then` **semantically** against the accessibility snapshot from
200
+ `take_snapshot` — match on roles, accessible names, labels, and visible text
201
+ that express the user-visible outcome ("a banner with text _Invoice sent_ is
202
+ visible", "a row for _ACME Corp_ appears in the invoices table"). **Do not**
203
+ assert against brittle DOM/CSS/XPath selectors, and **do not** assert on HTTP
204
+ status codes, response bodies, or DB rows — those are contract-tier concerns
205
+ that belong in contract tests, not in a user-journey sweep (see
206
+ `.agents/rules/testing-standards.md` § Assertion Placement). A `Then` that can
207
+ only be expressed as a wire-shape or DB check is a signal the scenario is
208
+ mis-tiered, not a reason to break the semantic rule.
209
+
210
+ Before driving each scenario, state its **business intent** in one
211
+ plain-English line, derived from the `Scenario:` name and its
212
+ `Given/When/Then` (what the user is trying to do and the outcome that proves
213
+ it) — e.g. "a signed-in coach reaches their own team-management surface".
214
+ Then record the scenario's result (pass / fail / blocked) with the surface it
215
+ ended on and a one-line user-visible symptom for any failure. State the
216
+ intent for **every** scenario, not only failures. Keep it to one line sourced
217
+ from the `Scenario:` name and steps — the `.feature` file is the source of
218
+ truth; do not paraphrase every step or leak implementation detail.
219
+
220
+ ## Step 4 — Instrument & inspect (findings)
221
+
222
+ Per surface visited, capture console and network and turn genuine problems
223
+ into structured findings:
224
+
225
+ 1. **Console** — `list_console_messages`, then filter through the contract's
226
+ `consoleAllowlist` via
227
+ [`filterConsoleMessages`](../scripts/lib/qa/console-allowlist.js). Each
228
+ non-allowlisted console **error** (level `error` / `severe`) becomes one
229
+ `F#` finding; allowlisted patterns and non-error levels are suppressed. The
230
+ allowlist is a **noise filter, not a security control** — never expand it to
231
+ silence a genuine error signal.
232
+ 2. **Network** — `list_network_requests`; failed or error-status requests on
233
+ the surface become findings alongside the console-derived set.
234
+ 3. **Visual / style** — when `designTokens` is set, spot-check the surface
235
+ against the token source; gross token violations become findings.
236
+
237
+ Findings use the structured `F#` shape: `{ id, classification, surface,
238
+ symptom, likelyRootCause, disposition (blocker | follow-up), acceptance,
239
+ foldsInto?, evidence: { console[], network[] } }`, validated against
240
+ [`qa-finding.schema.json`](../schemas/qa-finding.schema.json). Before
241
+ rendering any finding evidence, **scrub captured console/network of tokens,
242
+ session cookies, and PII** per `.agents/rules/security-baseline.md` — findings
243
+ are posted to GitHub at approval time.
244
+
245
+ ## Step 5 — Draft follow-ups (operator sign-off required)
246
+
247
+ Validate each finding against
248
+ [`qa-finding.schema.json`](../schemas/qa-finding.schema.json) first, then
249
+ bundle findings **by likely root cause** into proposed follow-up tickets with
250
+ `Depends-on` / `Blocks` relationships, and present the draft to the operator
251
+ for approval. The harness **MUST NOT** create tickets autonomously — it stops
252
+ at a draft. The operator-approval gate is the safety boundary against spurious
253
+ filing. If the run was triggered from an Epic-testing context, hand the
254
+ approved findings to the Epic-testing helper for attachment to the Epic's QA
255
+ evidence ticket.
256
+
257
+ ## Step 6 — Report
258
+
259
+ Summarize the sweep in chat with:
260
+
261
+ - Selector applied and the resolved scenario count.
262
+ - Scenario totals: passed / failed / blocked.
263
+ - Findings totals by classification and disposition (blocker vs follow-up).
264
+ - A per-scenario line pairing each scenario's plain-English intent with its
265
+ verdict (pass / fail / blocked), grouped by feature file or domain — so the
266
+ digest reads as "what was checked → what happened", not a tag list.
267
+ - For each failure, the scenario name, file path, the surface it ended on, and
268
+ a one-line user-visible symptom.
269
+ - A pointer to the drafted follow-up bundle awaiting sign-off (if any).
270
+
271
+ ## Constraints
272
+
273
+ - **Always** resolve the `qa` contract first and **fail loudly** when it is
274
+ absent or malformed. There is no auto-detection fallback.
275
+ - **Always** navigate from a root via UI affordances. **Never** URL-jump to a
276
+ deep link to set up a scenario.
277
+ - **Always** assert `Then` outcomes semantically against the accessibility
278
+ snapshot. **Never** assert via DOM/CSS/XPath selectors, HTTP status codes,
279
+ response bodies, or DB rows inside a scenario — push those to the contract
280
+ tier per `.agents/rules/testing-standards.md`.
281
+ - **Never** enter real credentials; sign-in uses the consumer's dev seam only.
282
+ - **Never** file follow-up tickets autonomously; stop at a draft for operator
283
+ sign-off.
284
+ - **Never** expand `consoleAllowlist` to suppress genuine error signal — it is
285
+ a benign-noise filter, not a security control.
286
+ - **Always** scrub captured evidence of secrets and PII before rendering a
287
+ finding.
288
+ - **Never** fall back to a retired headless BDD-runner workflow.
@@ -0,0 +1,327 @@
1
+ ---
2
+ description: >-
3
+ Deliver one or more standalone Stories end-to-end. Accepts 1+ Story IDs,
4
+ computes a dependency-aware wave plan via `stories-wave-tick.js`, asks the
5
+ operator to confirm the plan, then fans out parallel Agent calls per wave
6
+ — each delegating to `helpers/single-story-deliver`. Stories without an
7
+ `Epic: #N` reference only; Epic-attached Stories use `/epic-deliver`.
8
+ ---
9
+
10
+ # /story-deliver [Story IDs...]
11
+
12
+ ## Overview
13
+
14
+ `/story-deliver` is the **operator-facing multi-Story delivery command**. It
15
+ takes one or more Story IDs, builds a dependency-aware wave plan, optionally
16
+ confirms it with the operator, and fans out one Agent call per Story per wave
17
+ — parallel within each wave, serialised across waves.
18
+
19
+ ```text
20
+ /story-deliver 101 102 103
21
+ → Phase 0 — Validate input & build DAG
22
+ → Phase 1 — stories-wave-tick.js → wave plan + operator confirmation
23
+ → Phase 2 — for each wave:
24
+ Agent tool × min(wave.stories.length, plan.concurrencyCap) parallel calls
25
+ helpers/single-story-deliver <storyId>
26
+ → Phase 3 — Summary
27
+ ```
28
+
29
+ **When to use `/story-deliver` vs. other commands:**
30
+
31
+ | Scenario | Command |
32
+ | --- | --- |
33
+ | 1+ standalone Stories (no `Epic: #N` in body) | `/story-deliver <id> [<id>...]` |
34
+ | Exactly one standalone Story (lighter path) | `/single-story-deliver <id>` |
35
+ | Epic-attached Stories (have `Epic: #N`) | `/epic-deliver <epicId>` |
36
+
37
+ `/story-deliver` **refuses** Stories that carry an `Epic: #N` reference in
38
+ their body. Those Stories belong to an Epic's dispatch manifest and must flow
39
+ through `/epic-deliver`. Use `/single-story-deliver` for a single Epic-free
40
+ Story when you want the leaner one-story path without wave machinery.
41
+
42
+ > **Concurrency cap.** The cap is resolved **deterministically in code** by
43
+ > `stories-wave-tick.js` (Phase 1a) — the same `resolveConfig` + `getRunners`
44
+ > seam `/epic-deliver` uses — and emitted as the `concurrencyCap` field on the
45
+ > `stories-wave-plan` envelope. The default is 3; override persistently via
46
+ > `delivery.deliverRunner.concurrencyCap` in `.agentrc.json` (a
47
+ > `.agentrc.local.json` override is honored) or per-run via the `--concurrency`
48
+ > flag below. Phase 2 dispatches `min(wave.stories.length, plan.concurrencyCap)`
49
+ > straight from the emitted field — do **not** re-read or merge config yourself.
50
+
51
+ ---
52
+
53
+ ## Arguments
54
+
55
+ ```text
56
+ /story-deliver <storyId> [<storyId> ...] [--dep <fromId>:<toId> ...] [--yes] [--concurrency <n>]
57
+ ```
58
+
59
+ - `storyId` — One or more GitHub issue numbers carrying `type::story` and
60
+ **no** `Epic: #N` reference. At least one is required.
61
+ - `--dep <fromId>:<toId>` — Declare an explicit dependency edge: `<fromId>`
62
+ must complete before `<toId>` runs. Repeat for each edge. When omitted,
63
+ all Stories are treated as independent (wave 0 catches everything) unless
64
+ `blocked by #N` references between the supplied IDs are detected
65
+ automatically.
66
+ - `--yes` — Skip the operator confirmation in Phase 1 and proceed
67
+ immediately. Safe for scripted / sub-agent invocations.
68
+ - `--concurrency <n>` — Override the per-wave concurrency cap for this run
69
+ only. Passed through to `stories-wave-tick.js` in Phase 1a, which validates
70
+ it (must be a positive integer) and reflects it in the emitted
71
+ `concurrencyCap` field. When omitted, the cap is resolved from
72
+ `delivery.deliverRunner.concurrencyCap` (default 3).
73
+
74
+ ---
75
+
76
+ ## Phase 0 — Validate input and build DAG
77
+
78
+ For each supplied Story ID:
79
+
80
+ 1. Confirm the issue exists and carries the `type::story` label.
81
+ 2. Confirm the issue body does **not** contain an `Epic: #N` reference. If
82
+ it does, STOP and tell the operator to use `/epic-deliver <epicId>`
83
+ instead.
84
+ 3. Collect `blocked by #N` references between the supplied Story IDs.
85
+ References to Story IDs outside the supplied set are advisory warnings
86
+ only — they do not block delivery.
87
+
88
+ Construct the DAG input array:
89
+
90
+ ```json
91
+ [
92
+ { "id": 101, "dependsOn": [] },
93
+ { "id": 102, "dependsOn": [101] },
94
+ { "id": 103, "dependsOn": [] }
95
+ ]
96
+ ```
97
+
98
+ `dependsOn` is the union of:
99
+
100
+ - `blocked by #N` edges where `N` is in the supplied set.
101
+ - Explicit `--dep` edges.
102
+
103
+ ---
104
+
105
+ ## Phase 1 — Wave planning and operator confirmation
106
+
107
+ ### 1a. Compute the wave plan
108
+
109
+ ```bash
110
+ node .agents/scripts/stories-wave-tick.js --dag '<dag-json>'
111
+ # with a per-run cap override:
112
+ node .agents/scripts/stories-wave-tick.js --dag '<dag-json>' --concurrency <n>
113
+ ```
114
+
115
+ When the operator passed `--concurrency <n>` to `/story-deliver`, forward it
116
+ verbatim to `stories-wave-tick.js`. The script resolves the cap from config
117
+ (`delivery.deliverRunner.concurrencyCap`, default 3) and the override wins for
118
+ that run.
119
+
120
+ Stdout is one JSON envelope:
121
+
122
+ ```json
123
+ {
124
+ "kind": "stories-wave-plan",
125
+ "waves": [
126
+ { "waveIndex": 0, "stories": [101, 103] },
127
+ { "waveIndex": 1, "stories": [102] }
128
+ ],
129
+ "totalStories": 3,
130
+ "concurrencyCap": 3,
131
+ "cycleError": null
132
+ }
133
+ ```
134
+
135
+ - **`cycleError` non-null** → STOP. Report the cycle to the operator and
136
+ exit. The Story set cannot be delivered until the circular dependency is
137
+ resolved.
138
+ - **`waves` empty** → STOP. Zero Stories resolved — report and exit.
139
+ - **`concurrencyCap`** is the resolved per-wave cap. Phase 2 dispatches
140
+ `min(wave.stories.length, plan.concurrencyCap)` from this field — the
141
+ workflow never re-reads or merges config to recover the cap.
142
+ - An invalid `--concurrency` value (non-positive / non-integer) makes the
143
+ script exit non-zero with an `inputError` → STOP and surface the message.
144
+
145
+ ### 1b. Operator confirmation (skipped with `--yes` or for single-story plans)
146
+
147
+ **Auto-skip rule (Story #3302):** When `waves.length === 1` and
148
+ `waves[0].stories.length === 1`, skip the confirmation prompt
149
+ automatically and proceed. A single-Story plan has no ordering ambiguity
150
+ and no meaningful operator decision to make — the plan *is* "deliver this
151
+ one Story". Prompting for confirmation would just be friction.
152
+
153
+ Otherwise, present the wave plan to the operator in a readable table:
154
+
155
+ ```text
156
+ Wave plan — 3 Stories across 2 waves
157
+ Wave 0 (parallel): #101 "<title>", #103 "<title>"
158
+ Wave 1 (after wave 0): #102 "<title>"
159
+
160
+ Proceed? [Y/n]
161
+ ```
162
+
163
+ Wait for the operator to confirm before dispatching. When the operator
164
+ types `n` or `N`, abort cleanly with a summary of the plan that was
165
+ declined. When `--yes` was passed, skip this step and proceed regardless
166
+ of wave count.
167
+
168
+ ---
169
+
170
+ ## Phase 2 — Wave dispatch loop
171
+
172
+ For each wave in `waves` (in `waveIndex` order):
173
+
174
+ ### 2a. Fan out per-Story Agent calls
175
+
176
+ Emit **one `Agent` tool call per Story** in the wave, capped at
177
+ `plan.concurrencyCap` from the Phase 1a `stories-wave-plan` envelope. When
178
+ the wave contains more Stories than `plan.concurrencyCap`, dispatch the first
179
+ `plan.concurrencyCap` in one turn with `run_in_background: true` and refill
180
+ as each child returns — never exceed the cap, never wait for the whole
181
+ batch before refilling. Do **not** re-derive the cap from config here; the
182
+ envelope field is the single deterministic source.
183
+
184
+ Each Agent call:
185
+
186
+ 1. Names the Story ID and instructs the child to invoke
187
+ [`helpers/single-story-deliver`](helpers/single-story-deliver.md)
188
+ for that Story.
189
+ 2. States the **return contract** (see § 2c).
190
+ 3. Reminds the child of the **non-interactive contract**: no clarifying
191
+ questions — if stuck, transition to `agent::blocked`, post a
192
+ `friction` comment, and exit non-zero.
193
+ 4. Requests the child suppress per-phase chat relay and include its
194
+ **terminal** `renderedBody` in the JSON return.
195
+
196
+ Use `subagent_type: general-purpose`.
197
+
198
+ ### 2b. Collect results
199
+
200
+ Wait for all dispatched Stories in the current wave to return before
201
+ advancing to the next wave. A wave is complete when every dispatched
202
+ Agent call has returned a result (success, blocked, or failed).
203
+
204
+ ### 2c. Per-Story return contract
205
+
206
+ Each child returns:
207
+
208
+ ```json
209
+ {
210
+ "storyId": <number>,
211
+ "status": "done" | "blocked" | "failed",
212
+ "phase": "init|implementing|closing|blocked|done",
213
+ "branchDeleted": <boolean>,
214
+ "blockerCommentId": <string|null>,
215
+ "detail": "<one-liner>",
216
+ "renderedBody": "<terminal story body>"
217
+ }
218
+ ```
219
+
220
+ ### 2d. Wave outcome handling
221
+
222
+ After every Story in a wave returns:
223
+
224
+ - **All `status === 'done'`** → Advance to the next wave (or Phase 3 if
225
+ this was the last wave). Print a one-line wave-complete summary.
226
+ - **Any `status === 'blocked'`** → STOP the wave loop. Post a summary
227
+ of blocked Stories and their `blockerCommentId` references. Do not
228
+ dispatch the next wave. Wait for the operator to resolve each blocker
229
+ and re-run `/story-deliver` with the same set (already-done Stories
230
+ will short-circuit because `single-story-close.js` is idempotent).
231
+ - **Any `status === 'failed'`** → STOP the wave loop. Report the
232
+ failures. The operator must fix the failing Stories before re-running.
233
+
234
+ ---
235
+
236
+ ## Phase 3 — Summary
237
+
238
+ Print a final run summary:
239
+
240
+ ```text
241
+ /story-deliver — 3 Stories delivered in 2 waves
242
+
243
+ Wave 0: #101 ✅ done, #103 ✅ done
244
+ Wave 1: #102 ✅ done
245
+
246
+ All Stories delivered. PRs opened, auto-merge armed. CI will merge each
247
+ PR when checks pass; each child then confirms the merge and flips its
248
+ Story to `agent::done` (Story #3385 — until the merge confirms, a Story
249
+ rests at `agent::closing` with its issue OPEN). Run
250
+ `git-cleanup --fast-forward-main` after the last merge to bring local
251
+ main up to date.
252
+ ```
253
+
254
+ When some Stories are blocked or failed, list them explicitly with the
255
+ `blockerCommentId` or failure detail so the operator knows where to look.
256
+
257
+ ---
258
+
259
+ ## Opt-in post-green refactor stage (`delivery.refactorStage`)
260
+
261
+ When `delivery.refactorStage.enabled` is `true` in `.agentrc.json`, each
262
+ per-Story worker runs an **advisory** post-green refactor pass after the
263
+ Story's suite is green and the close-validation gates already pass — and
264
+ **before** close. The stage is **strictly opt-in and default-OFF**: when the
265
+ key is unset or `false`, story-deliver behaves exactly as documented above
266
+ and this stage is skipped entirely.
267
+
268
+ The stage adopts the [`refactorer`](../personas/refactorer.md) persona and the
269
+ [`core/refactoring-discipline`](../skills/core/refactoring-discipline/SKILL.md)
270
+ skill to drive a behaviour-preserving pass that lowers CRAP and removes
271
+ duplication on the files the Story already touched:
272
+
273
+ - **Post-green only.** It runs after the suite is green and the gates pass —
274
+ never from red, and never to make a failing test pass.
275
+ - **Behaviour-preserving.** Existing tests MUST keep passing without
276
+ modification; if a test had to change, the change was a behaviour change and
277
+ must be reverted.
278
+ - **Advisory, not a gate.** This stage does **not** introduce a new
279
+ close-validation gate and does **not** change the semantics of the existing
280
+ [close-validation](../scripts/lib/close-validation.js) chain (typecheck,
281
+ lint, test, format, maintainability, coverage, crap). The canonical gates
282
+ remain the single source of pass/fail at close; the refactor stage only adds
283
+ an extra behaviour-preserving cleanup commit when enabled.
284
+
285
+ > **Default-OFF guarantee.** Consumers who do not set
286
+ > `delivery.refactorStage.enabled` (or set it to `false`) see no change in
287
+ > delivery behaviour — no extra stage, no new gate, identical close semantics.
288
+
289
+ ---
290
+
291
+ ## Idempotence
292
+
293
+ `/single-story-deliver` is idempotent at every phase:
294
+ `single-story-init.js` reuses an existing worktree and
295
+ `single-story-close.js` short-circuits when the Story is already closed.
296
+ Re-running `/story-deliver` with the same Story set after a partial
297
+ failure is safe — already-done Stories produce no-op outcomes; only the
298
+ blocked or unstarted Stories execute.
299
+
300
+ ---
301
+
302
+ ## Constraints
303
+
304
+ - **Never** pass Epic-attached Stories to this command. Detect `Epic: #N`
305
+ in Phase 0 and STOP.
306
+ - **Never** advance to the next wave while any Story in the current wave
307
+ is `blocked` or `failed`.
308
+ - **Never** exceed `plan.concurrencyCap` (the resolved cap emitted by
309
+ `stories-wave-tick.js`) parallel Agent calls at any moment.
310
+ - **Always** confirm the wave plan with the operator before dispatching,
311
+ unless `--yes` was passed.
312
+ - **Label transitions**: drive every `agent::*` state change through
313
+ `node .agents/scripts/update-ticket-state.js --ticket <id> --state <state>`.
314
+ This CLI is the authoritative mechanism — there is no separate
315
+ state-mutation MCP server to degrade from (see
316
+ [`.agents/instructions.md` § 1.D](../instructions.md)).
317
+
318
+ ---
319
+
320
+ ## See also
321
+
322
+ - [`helpers/single-story-deliver`](helpers/single-story-deliver.md) — the
323
+ per-Story worker this command delegates to.
324
+ - [`/epic-deliver`](epic-deliver.md) — full Epic wave loop for
325
+ Epic-attached Stories.
326
+ - [`helpers/epic-deliver-story`](helpers/epic-deliver-story.md) — the
327
+ per-Story worker `/epic-deliver` uses internally.