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,636 @@
1
+ ---
2
+ description:
3
+ Execute a standalone Story (no parent Epic) end-to-end. Creates a branch
4
+ from main, implements the changes in a worktree, runs gates, pushes, and
5
+ opens a PR directly against main.
6
+ ---
7
+
8
+ # /single-story-deliver #[Story ID]
9
+
10
+ ## Overview
11
+
12
+ `/single-story-deliver` is the standalone counterpart to
13
+ [`/story-deliver`](../story-deliver.md). Use it for a Story that is **not**
14
+ attached to an Epic — refactors carved out of closed Epics, framework
15
+ maintenance, or any work small enough that the Epic-Centric ceremony
16
+ (PRD + Tech Spec + decomposition + dispatch manifest + cascade) would be
17
+ overhead rather than help.
18
+
19
+ ```text
20
+ /single-story-deliver <storyId>
21
+ → single-story-init.js (branch from main, worktree, agent::executing)
22
+ → agent implements + commits (operator works in the worktree)
23
+ → single-story-close.js (gates, push, gh pr create → main, agent::closing)
24
+ → CI watch + fix loop (until all required checks pass + PR is merged)
25
+ → single-story-confirm-merge.js (PR merged → agent::done, issue closes)
26
+ ```
27
+
28
+ **When to use `/single-story-deliver` vs. `/epic-deliver`:**
29
+
30
+ | Trait | `/single-story-deliver` | `/epic-deliver` |
31
+ | ----------------------------- | ---------------------------------------------------- | ------------------------------------------------------- |
32
+ | Parent Epic | None (no `Epic: #N` in body) | Required (`Epic: #N` in body) |
33
+ | Branch base | `project.baseBranch` (default `main`) | `epic/<epicId>` |
34
+ | Merge target | `main` via PR | `epic/<epicId>` via `--no-ff` merge |
35
+ | Cascade up to Feature/Epic | No | Yes |
36
+ | Dispatch manifest interaction | None | Read at init, regenerated at close |
37
+ | Story scope | Inline `acceptance[]` / `verify[]` on the Story body | Inline `acceptance[]` / `verify[]` on the Story body |
38
+
39
+ If the Story has an `Epic: #N` reference, use `/epic-deliver`. If it
40
+ doesn't, use this workflow (or `/story-deliver` for several standalone
41
+ Stories at once).
42
+
43
+ ## Prerequisites
44
+
45
+ 1. A GitHub Issue with the `type::story` label and **no** `Epic: #N`
46
+ reference in its body.
47
+ 2. `GITHUB_TOKEN` or `gh auth status` clean — `gh pr create` runs at close.
48
+ 3. The base branch (`project.baseBranch`, default `main`) exists on
49
+ both local and `origin`.
50
+
51
+ ---
52
+
53
+ ## Step 0 — Initialize (`single-story-init.js`)
54
+
55
+ Run from the **main checkout** (the worktree does not exist yet):
56
+
57
+ ```bash
58
+ node .agents/scripts/single-story-init.js --story <storyId>
59
+ ```
60
+
61
+ Flags: `--dry-run` (no git/ticket mutation), `--steal` (forcibly transfer a
62
+ foreign Story lease to this operator — see the fail-closed lease note below).
63
+
64
+ > **Execution mode.** Like `story-init.js`, this command can take 3–6
65
+ > minutes when the worktree's per-tree install runs. Invoke synchronously
66
+ > with `Bash(timeout: 600000)`. Do **not** use `run_in_background` +
67
+ > `Monitor` — a sub-agent that exits mid-install leaves the worktree
68
+ > half-bootstrapped.
69
+
70
+ The script validates `type::story`, **acquires the Story lease**, fetches
71
+ `origin`, seeds `story-<id>` from `baseBranch`, materializes a worktree
72
+ (when `delivery.worktreeIsolation.enabled` is true), upserts a
73
+ `story-init` structured comment carrying `standalone: true`, and flips
74
+ the Story to `agent::executing`.
75
+
76
+ > **Lease preflight (Story #3483).** Before any git mutation, init takes an
77
+ > exclusive, time-bounded **lease** on the Story ticket via the
78
+ > assignee-as-lease primitive (`lib/orchestration/ticket-lease.js`). The
79
+ > single assignee *is* the lease owner (resolved from
80
+ > `github.operatorHandle`). The standalone path has no Epic-scoped dispatch
81
+ > manifest to serialise two operators driving the same Story, so this lease
82
+ > is the only guard against a concurrent `single-story-init` clobbering an
83
+ > in-flight run.
84
+ >
85
+ > **Fail-closed (audit #3513).** Unlike `/epic-deliver`, the standalone path
86
+ > has **no Epic-scoped lifecycle ledger** to read a per-owner
87
+ > `story.heartbeat` from, so there is no live-heartbeat source to decide
88
+ > whether a foreign claim is stale. Rather than silently reclaim every
89
+ > foreign assignee (which would leave the guard inert), the standalone lease
90
+ > **fails closed**: a foreign assignee is treated as a *live* claim. Outcomes:
91
+ >
92
+ > - **Unclaimed / self-held** → init proceeds (a self-held claim is
93
+ > re-affirmed without re-writing assignees).
94
+ > - **Any foreign assignee** → init **exits non-zero** with a message naming
95
+ > the current owner. Coordinate with that operator, or pass **`--steal`** to
96
+ > forcibly transfer the claim once you have confirmed the other run is dead.
97
+ >
98
+ > `--dry-run` skips the lease (no assignee mutation). The matching release
99
+ > runs in `single-story-close.js` (Step 3).
100
+
101
+ Init is also idempotent on the Story branch itself:
102
+
103
+ > **Branch reuse (Story #3483).** When a `story-<id>` branch already exists
104
+ > locally, init **reuses** it rather than re-creating it (re-running
105
+ > `git branch` on an existing ref throws `branch already exists`). The
106
+ > seed decision (`reuse` / `fetch` / `create`) keys off local + remote ref
107
+ > presence, so re-running init on a partially-initialized Story is
108
+ > idempotent.
109
+
110
+ Between the fetch and the branch-seed step, the script also runs a
111
+ **merged-`story-*` sweep**: it invokes the same primitive as
112
+ `<agentRoot>/scripts/git-cleanup.js` (`<agentRoot>` resolves
113
+ from `project.paths.agentRoot`, default `.agents`) scoped to `story-*`
114
+ only, in `--execute --remote` mode, with the current run's
115
+ `story-<id>` branch excluded from the candidate list. Local refs, the
116
+ matching `origin/` ref, and stale tracking refs for any merged sibling
117
+ stories are reaped in one pass. The sweep never blocks init — failures
118
+ are logged and the new story is initialized regardless.
119
+
120
+ The sweep applies two hardening layers (Story #2011):
121
+
122
+ - **Per-candidate protection.** Each merged-PR candidate is filtered
123
+ through three guards before reaching `executeCleanup`:
124
+ - `unpushed-work` — branch HEAD SHA differs from the PR's
125
+ `headRefOid`, meaning the operator has commits the merge didn't
126
+ capture.
127
+ - `dirty-tree` — the attached worktree (if any) has uncommitted
128
+ changes.
129
+ - `ticket-not-done` — the parent Story ticket isn't closed and
130
+ doesn't carry `agent::done`.
131
+ Protected candidates are skipped, listed in the sweep result envelope
132
+ under `protected[]`, and named in the `CLEANUP` log line so the
133
+ operator can see what was preserved.
134
+ - **Cross-session lock.** The sweep acquires a process-scoped lockfile
135
+ at `<tempRoot>/single-story-sweep.lock` before planning. On
136
+ contention (another `/single-story-deliver` already in the sweep
137
+ step), this run's sweep is **skipped** with a warn log; init
138
+ continues normally. Stale lockfiles (mtime older than the timeout)
139
+ are treated as expired. The timeout defaults to 60 seconds and is
140
+ overridable via `delivery.worktreeIsolation.sweepLockMs` in
141
+ `.agentrc.json`.
142
+
143
+ Both layers are non-fatal — sweep failure / skip never blocks init, and
144
+ the new story is always created.
145
+
146
+ Capture `workCwd` from the result envelope. Add `--dry-run` to inspect
147
+ the planned actions without git or ticket mutations (dry-run also skips
148
+ the sweep).
149
+
150
+ ### Step 0.5 — `cd` into the workCwd
151
+
152
+ ```bash
153
+ cd "<workCwd from Step 0 result>"
154
+ ```
155
+
156
+ All subsequent commands run from this directory.
157
+
158
+ > **Worktree scope is not just the Bash cwd.** `cd <workCwd>` steers the
159
+ > **Bash** tool's working directory, but it does **not** scope the
160
+ > path-based **Edit/Write/Read** tools — those resolve **absolute paths**
161
+ > and ignore the shell cwd. On Windows especially, an agent whose shell
162
+ > sits in the worktree can still silently edit the **main checkout** if it
163
+ > resolves a main-checkout absolute path. To stay in the worktree you MUST
164
+ > prefix **every Edit/Write/Read path with the absolute worktree root**
165
+ > (the `workCwd` value from Step 0), not merely `cd` into it. Never edit
166
+ > files under the bare main-checkout root. `single-story-close.js` runs a
167
+ > **wrong-tree guard** (Story #3364) that aborts close and posts a
168
+ > `friction` comment if it finds uncommitted tracked-path edits in the main
169
+ > checkout while the worktree is the active work tree — but that is a
170
+ > backstop, not a substitute for prefixing paths correctly.
171
+
172
+ ---
173
+
174
+ ## Step 1 — Implementation
175
+
176
+ A standalone Story is **atomic** — no wave dispatch and no Epic-scoped
177
+ cascade. Work happens in one or more commits on the `story-<id>`
178
+ branch, against the inline `acceptance[]` / `verify[]` arrays on the
179
+ Story body.
180
+
181
+ Operator/agent responsibilities while in the worktree:
182
+
183
+ 1. Read the Story body. Treat its acceptance criteria as the contract.
184
+ 2. Implement the changes.
185
+ 3. Commit on the Story branch. Conventional-commit format is encouraged
186
+ but not enforced — the PR title carries the canonical summary.
187
+ 4. Iterate (read tests, run targeted gates, edit, commit) until the
188
+ acceptance criteria are met.
189
+ 5. Run the **bounded acceptance self-eval loop** (Step 1a below) before
190
+ proceeding to close.
191
+
192
+ Recommended quick gates while iterating (each is fast enough to run on
193
+ save):
194
+
195
+ ```bash
196
+ npm run typecheck
197
+ npm run lint
198
+ npm test -- --grep "<scope>"
199
+ ```
200
+
201
+ The full close-validation chain runs in Step 3; the gates above are
202
+ advisory pre-flight.
203
+
204
+ > Conflict with `main` mid-implementation → resolve as you would any
205
+ > branch rebase. There is no `epic/<id>` intermediate, so the rebase
206
+ > base is `main` directly.
207
+
208
+ ### Step 1a — Bounded acceptance self-eval loop (**required, not optional**)
209
+
210
+ After the implementation commits land and **before** you proceed to close, run
211
+ the bounded acceptance self-eval loop. The per-round critic mechanic (fresh-
212
+ context critic, `verify[]`-as-evidence, the verdict schema, and the
213
+ proceed / redraft / block decision) is the single-homed include
214
+ [`acceptance-self-eval.md`](acceptance-self-eval.md) — read it and follow it.
215
+
216
+ Standalone specifics for this path:
217
+
218
+ - **Gate invocation** (omit `--epic` — there is no parent Epic):
219
+
220
+ ```bash
221
+ node <main-repo>/.agents/scripts/acceptance-eval.js \
222
+ --story <storyId> --verdict <verdict-path>
223
+ ```
224
+
225
+ - **On `decision: "proceed"`** → proceed to Step 3 (close).
226
+ - **On `decision: "block"`** → **do not proceed to close.** Post a `friction`
227
+ comment naming the unmet criteria, then transition the Story to
228
+ `agent::blocked`:
229
+
230
+ ```bash
231
+ node .agents/scripts/diagnose-friction.js --story <storyId> \
232
+ --cmd node .agents/scripts/acceptance-eval.js --story <storyId> --verdict <verdict-path>
233
+ node .agents/scripts/update-ticket-state.js --ticket <storyId> --state agent::blocked
234
+ ```
235
+
236
+ ---
237
+
238
+ ## Step 2 — Validate (deferred to close)
239
+
240
+ `single-story-close.js` runs the canonical close-validation chain
241
+ (typecheck, lint, test, format, maintainability, coverage, crap) before
242
+ it pushes. Do **not** pre-run those gates here unless interactively
243
+ iterating on a fix.
244
+
245
+ ---
246
+
247
+ ## Step 3 — Close (`single-story-close.js`)
248
+
249
+ Invoke from the main checkout (or pass `--cwd <main-repo>` from inside
250
+ the worktree):
251
+
252
+ ```bash
253
+ node <main-repo>/.agents/scripts/single-story-close.js --story <storyId> --cwd <main-repo>
254
+ ```
255
+
256
+ The script:
257
+
258
+ 1. Runs the close-validation gates against `baseBranch` as the baseline.
259
+ On any gate failure it throws — the operator fixes and re-runs close.
260
+ 1a. **Syncs the Story branch from `origin/<baseBranch>`** before push
261
+ (Story #2580). Runs `git fetch origin <baseBranch>` followed by
262
+ `git merge --no-edit origin/<baseBranch>` inside the worktree. This
263
+ defends against the parallel-`/single-story-deliver` race: when
264
+ multiple sessions run in parallel, the Story that auto-merges first
265
+ bumps `baseBranch`, and without this sync the lagging Stories open
266
+ PRs that are "behind base" and stall against branch-protection's
267
+ `up-to-date branch` rule. Outcomes:
268
+ - **No-op / fast-forward / clean merge-commit** → close proceeds to
269
+ push.
270
+ - **Merge conflict** → the merge is aborted, a `friction` structured
271
+ comment is posted on the Story (conflicting file list + recovery
272
+ command set), the Story flips to `agent::blocked`, and close
273
+ throws. Resolve in the worktree (`git merge origin/<base>` + fix
274
+ conflicts + `git commit --no-edit`) and re-run
275
+ `/single-story-deliver`.
276
+ - **Fetch failed** → close throws with the git stderr; no label
277
+ transition.
278
+
279
+ Note: the merge queue (when enabled) re-tests each PR against the
280
+ queue tip before merging, so this sync + merge queue is the complete
281
+ defence against the parallel race. Without merge queue, the sync
282
+ closes the PR-open-time race but a residual race remains between PR
283
+ open and auto-merge fire.
284
+ 2. Pushes `story-<id>` to `origin`.
285
+ 3. Probes for an existing open PR with `head = story-<id>`. If none
286
+ exists, opens one via `gh pr create --base <baseBranch>`. The PR
287
+ body carries `Closes #<storyId>` so the GitHub merge auto-closes the
288
+ issue.
289
+ 3a. **Enables GitHub native auto-merge by default** via
290
+ `gh pr merge <prNumber> --auto --squash --delete-branch`. Once CI's
291
+ required checks turn green, GitHub squash-merges the PR and deletes
292
+ the source branch — the operator does not need to babysit the merge
293
+ button. Mirrors the `/epic-deliver` finalize path. Failure is
294
+ non-fatal: the operator retains the manual merge surface in the
295
+ GitHub UI. Pass `--no-auto-merge` to opt out when the PR needs a
296
+ pre-merge eyeball.
297
+ 4. Flips the Story to **`agent::closing`** (NOT `agent::done`) and leaves
298
+ the GitHub issue **OPEN** (Story #3385). Auto-merge completes
299
+ asynchronously *after* this script exits, so closing the issue here
300
+ would strand a CLOSED issue with no merged work if the PR later failed
301
+ CI, went `BEHIND` base, or was closed without merging. The Story rests
302
+ at `agent::closing` while the PR is open with auto-merge armed; the
303
+ `agent::done` flip (which closes the issue) is deferred to Step 5.5's
304
+ `single-story-confirm-merge.js`. This brings the standalone path to
305
+ parity with the epic path (#2155), where a Story only reaches
306
+ `agent::done` once its merge into `epic/<id>` is confirmed.
307
+ 5. Reaps the worktree when `delivery.worktreeIsolation.reapOnSuccess`
308
+ is enabled.
309
+ 6. **Releases the Story lease** (Story #3483). Clears the Story assignment
310
+ that init claimed so the next `/single-story-deliver` run sees an
311
+ unclaimed ticket. The release is a no-op when the operator no longer
312
+ holds the claim (a later run took over via reclaim/steal), so a late
313
+ close never yanks a live claim away from its current owner. Best-effort:
314
+ a release failure is logged but does not fail an otherwise-clean close —
315
+ the lease goes stale via TTL regardless. The close result carries
316
+ `leaseReleased: <boolean>`.
317
+
318
+ `--skip-validation` bypasses Step 1 (gates). Use only when re-running
319
+ close after a fixed gate failure that's already known to pass.
320
+
321
+ `--skip-sync` bypasses Step 1a (base-sync). Use only when re-running
322
+ close after a hand-resolved sync, or in tests.
323
+
324
+ `--no-auto-merge` disables Step 3a. Use when the PR materially changes
325
+ behaviour and warrants pre-merge review.
326
+
327
+ ---
328
+
329
+ ## Step 4 — CI watch + fix loop (**required, not optional**)
330
+
331
+ The Story is **not done** when `single-story-close.js` returns. Auto-merge
332
+ only fires when every required CI check turns green. Local close-validation
333
+ gates pass on the dev host's environment (Windows, particular Node patch,
334
+ particular concurrency), but CI runs on a different OS and concurrency —
335
+ coverage rounding, platform-conditional branches, and timing-sensitive
336
+ tests routinely drift between the two. The agent owns the green-CI
337
+ outcome, not just the push.
338
+
339
+ After `single-story-close.js` succeeds, enter the watch + fix loop:
340
+
341
+ ```bash
342
+ gh pr checks <prNumber> --watch
343
+ ```
344
+
345
+ When the watch exits:
346
+
347
+ - **All checks ✓** — auto-merge will fire (or has already). The Story is
348
+ still at `agent::closing` with its issue OPEN at this point (Step 3
349
+ deferred the `agent::done` flip). The `Closes #<id>` footer closes the
350
+ Story issue when the merge lands; Step 5 confirms the merge and Step 5.5
351
+ flips the Story to `agent::done`. Proceed to Step 5.
352
+ - **Any check ✗** — diagnose, fix, and push a new commit on
353
+ `story-<storyId>`, then re-watch. Auto-merge stays enabled across
354
+ retries; no need to re-arm it. The Story stays at `agent::closing`
355
+ throughout, so a failed/abandoned PR never strands a CLOSED issue.
356
+
357
+ ### Resurrecting the worktree after `reapOnSuccess`
358
+
359
+ `single-story-close.js` reaps the worktree on success when
360
+ `delivery.worktreeIsolation.reapOnSuccess` is enabled (the default). To
361
+ fix CI you must re-attach a worktree to the existing remote branch:
362
+
363
+ ```bash
364
+ cd <main-repo>
365
+ git fetch origin story-<storyId>
366
+ git worktree add .worktrees/story-<storyId> story-<storyId>
367
+ cd .worktrees/story-<storyId>
368
+ ```
369
+
370
+ Do **not** re-run `single-story-init.js` — it would reset the branch
371
+ state and lose the close commit's structured comment.
372
+
373
+ ### Diagnosing the failure
374
+
375
+ Pull the failing job log via:
376
+
377
+ ```bash
378
+ gh run view <runId> --repo <owner>/<repo> --log-failed
379
+ ```
380
+
381
+ The `<runId>` is the run number that `gh pr checks` shows in the
382
+ failing row's URL. Read the bottom of the log — the gate that exited
383
+ non-zero is named there (e.g. `[Coverage] ❌ REGRESSION in …`).
384
+
385
+ ### Fixing without re-running close-validation
386
+
387
+ For coverage / maintainability / CRAP regressions detected only on CI:
388
+
389
+ 1. Update the relevant baseline file (`baselines/coverage.json`,
390
+ `baselines/maintainability.json`, `baselines/crap.json`) to absorb
391
+ CI's actual numbers. Edit by hand when CI's numbers are within the
392
+ tolerance you'd otherwise accept — don't re-run `npm run … :update`
393
+ locally, because Windows numbers will overwrite CI's Linux numbers
394
+ and the cycle repeats.
395
+ 2. Commit the baseline delta with a `chore(baselines):` message that
396
+ names the CI run that produced the values.
397
+ 3. `git push` to `origin/story-<storyId>` and re-watch.
398
+
399
+ For genuine test failures (a flaky test, a platform-conditional bug):
400
+ fix the code or test, commit, push, re-watch. Keep iterating until
401
+ the watch exits clean.
402
+
403
+ ### When to stop iterating
404
+
405
+ - **Three consecutive failures with the same fix shape** — stop and
406
+ Re-Plan per Anti-Thrashing Protocol. The diagnosis is likely wrong.
407
+ - **Operator-blocking failure** (security scanner, branch-protection
408
+ rule the agent can't change) — transition the Story to
409
+ `agent::blocked`, summarize the blocker on the PR, and yield to the
410
+ operator.
411
+
412
+ ### Idempotence of the loop
413
+
414
+ - The PR stays open across retries; `gh pr create` is a one-shot at
415
+ close, the loop only pushes new commits.
416
+ - Auto-merge stays armed across retries — pushing a new commit does
417
+ not disarm `gh pr merge --auto`.
418
+ - If the operator manually merges or disables auto-merge mid-loop,
419
+ exit the loop and report.
420
+
421
+ ---
422
+
423
+ ## Step 5 — Merge confirmation + `agent::done` flip (**required, not optional**)
424
+
425
+ With auto-merge enabled (default), GitHub squash-merges the PR when
426
+ every required check turns green and the `Closes #<id>` footer
427
+ auto-closes the Story issue.
428
+
429
+ Confirm the merge landed:
430
+
431
+ ```bash
432
+ gh pr view <prNumber> --json state,mergedAt,mergeCommit
433
+ ```
434
+
435
+ Expect `state: "MERGED"`. With `--no-auto-merge`, the PR is the merge
436
+ gate. The operator reviews and merges via the GitHub UI; the same
437
+ `Closes #<id>` auto-close fires when the merge lands on `main`.
438
+
439
+ **Then flip the Story to `agent::done`.** Step 3 deferred this flip
440
+ (Story #3385) so the Story rested at `agent::closing` with its issue OPEN
441
+ while the PR was open. Now that the merge is confirmed, drive the
442
+ `agent::closing → agent::done` transition (which closes the issue) via:
443
+
444
+ ```bash
445
+ node .agents/scripts/single-story-confirm-merge.js --story <storyId> --cwd <main-repo>
446
+ ```
447
+
448
+ The confirmation script re-reads the live PR state (`gh pr view --json
449
+ state,mergedAt`, probing `gh pr list --head story-<id> --state all` when
450
+ `--pr` is omitted) and:
451
+
452
+ - **PR `MERGED`** → flips `agent::closing → agent::done`, closing the
453
+ issue, and fires the `story-merged` notify. Prints
454
+ `{ action: 'done', merged: true, ... }`.
455
+ - **PR still open / closed-without-merge** → leaves the Story at
456
+ `agent::closing` (issue stays OPEN) and prints
457
+ `{ action: 'pending', reason: 'pr-open' | 'pr-not-merged' | 'no-pr' }`.
458
+ Re-run after the merge lands.
459
+ - **Story already `agent::done` / issue already closed** → idempotent
460
+ `{ action: 'noop', reason: 'already-done' }`.
461
+
462
+ This is the standalone counterpart to the epic path's post-merge
463
+ `agent::done` flip in `post-merge-close.js` (#2155): the issue closes
464
+ exactly when the work has merged, never at PR-open.
465
+
466
+ ---
467
+
468
+ ## Step 5.5 — Re-assert Status column (**required, not optional**)
469
+
470
+ The GitHub Projects v2 built-in workflows `Pull request merged` and
471
+ `Pull request linked to issue` are enabled by default on most boards
472
+ and fire ~minutes *after* auto-merge lands. They overwrite the Status
473
+ field as a side-effect, clobbering the `Done` value
474
+ `single-story-confirm-merge.js` set at the `agent::done` flip in Step 5
475
+ and leaving closed Stories stuck at `In Progress` on the board
476
+ (reproduced on Story #2813). The confirmation step has already exited by
477
+ then, so the bot gets the last write.
478
+
479
+ Re-assert authority once the merge confirms:
480
+
481
+ ```bash
482
+ node .agents/scripts/resync-status-column.js --story <storyId>
483
+ ```
484
+
485
+ What this does:
486
+
487
+ - Reads the ticket's current `agent::*` label set (now `agent::done`).
488
+ - Re-fires the same `ColumnSync` mutation `transitionTicketState` used
489
+ at close, overwriting the bot's late write.
490
+ - **Polls the live Status for ~15 s after the initial write** and
491
+ re-fires on drift (Story #2876). Without this loop, a one-shot
492
+ mutation routinely lost the race against the bot's asynchronous
493
+ fire (reproduced on Story #2871 / PR #2872).
494
+ - Prints a single-line JSON envelope:
495
+ `{ ticketId, status, column?, reason?, attempts? }`. `attempts > 1`
496
+ means the helper had to fight a bot overwrite; `status: 'drifted'`
497
+ means the bot won every attempt in the poll budget (rare; usually
498
+ signals operator should reap the conflicting workflows).
499
+
500
+ Tuning flags (rarely needed):
501
+
502
+ - `--poll-attempts <n>` — total mutation attempts including the
503
+ initial sync. Default `4`. Pass `1` to disable the poll loop
504
+ (fastest, matches pre-#2876 behaviour).
505
+ - `--poll-delay-ms <ms>` — delay between drift checks. Default `5000`.
506
+
507
+ Idempotent: re-running on a ticket whose Status already matches the
508
+ target returns the same envelope. No-op skips (`no-project`,
509
+ `no-meta`, `not-on-project`) exit 0 with the reason in the envelope
510
+ so the workflow can continue.
511
+
512
+ **Canonical operator fix:** run
513
+ `node .agents/scripts/agents-bootstrap-github.js --reap-conflicting-workflows`
514
+ once per project to delete the conflicting bot workflows entirely.
515
+ This eliminates the race source; the poll loop becomes pure
516
+ defense-in-depth against re-enabled or future workflows.
517
+
518
+ Skip Step 5.5 only when the operator opted out of auto-merge AND has
519
+ not yet merged the PR (no `agent::done` to re-assert yet) — run it
520
+ after the manual merge instead.
521
+
522
+ ---
523
+
524
+ ## Step 6 — Local branch cleanup (**required, not optional**)
525
+
526
+ GitHub deletes the **remote** branch on auto-merge (via the
527
+ `--delete-branch` flag `single-story-close.js` passes to `gh pr merge`).
528
+ The **local** `story-<storyId>` ref, however, lingers in the main
529
+ checkout until something prunes it — `single-story-init.js` runs a
530
+ merged-sweep at the start of every *subsequent* `/single-story-deliver`
531
+ invocation, but that's next-run cleanup, not end-of-run cleanup. Stale
532
+ local refs accumulate between sessions, clutter `git branch`, and shadow
533
+ the lessons the sweep is meant to surface.
534
+
535
+ **Why local `main` goes stale:** `single-story-init.js` seeds new
536
+ `story-<id>` branches from the **local** `baseBranch` ref (default
537
+ `main`). Auto-merge updates **`origin/main`** on GitHub; nothing in
538
+ close or the old Step 6 command updated **local `main`**. The next init
539
+ then forked from a tip six merges behind until you manually pulled.
540
+ `single-story-init` also attempts the same fast-forward after `git fetch`
541
+ when the main checkout is clean (defense in depth if Step 6 was skipped).
542
+ Step 6 must still run `--fast-forward-main` so local `main` is current
543
+ before the next session — init may skip when the tree is dirty or the
544
+ operator is mid-checkout on another branch.
545
+
546
+ After Step 5 confirms `state: "MERGED"`, prune the story ref **and**
547
+ fast-forward local `main` (or `project.baseBranch`):
548
+
549
+ ```bash
550
+ node .agents/scripts/git-cleanup.js \
551
+ --execute \
552
+ --remote \
553
+ --yes \
554
+ --fast-forward-main \
555
+ --branches \
556
+ --include "story-<storyId>"
557
+ ```
558
+
559
+ What this does:
560
+
561
+ - **`--fast-forward-main`** fetches `origin/<baseBranch>` and
562
+ `git merge --ff-only` on the main checkout when the tree is clean and
563
+ the local base is strictly behind remote. Skipped when already current,
564
+ dirty, or diverged (see `/git-cleanup`).
565
+ - **`--branches`** reaps the merged `story-<storyId>` ref (worktree,
566
+ local branch, stale `origin/` tracking ref). Does not run
567
+ `--prune-remotes` or `--stashes` unless you add those flags.
568
+ - **`--include "story-<storyId>"`** scopes the branch reap to this
569
+ Story's ref only — sibling stories in flight are untouched.
570
+ - **`--execute --remote --yes`** actually deletes the local ref, prunes
571
+ the matching `origin/` tracking ref, and runs non-interactively.
572
+
573
+ The sweep is idempotent. It is safe to run before `state: "MERGED"`
574
+ confirms (it will skip a not-yet-merged branch), and safe to re-run
575
+ after a successful cleanup (it reports "no merged branches to clean
576
+ up").
577
+
578
+ Skip Step 6 only when the operator has explicitly opted out via
579
+ `--no-auto-merge` AND has not yet merged the PR — in that case, leave
580
+ the branch in place until the manual merge lands, then run the
581
+ cleanup.
582
+
583
+ ---
584
+
585
+ ## Idempotence
586
+
587
+ - `single-story-init.js` re-prints the same `workCwd` without recreating
588
+ the worktree when one already exists for `story-<id>`.
589
+ - `single-story-close.js` short-circuits when the Story is already
590
+ closed (returns `{ action: 'noop', reason: 'already-closed' }`).
591
+ - `single-story-confirm-merge.js` short-circuits when the Story already
592
+ carries `agent::done` or the issue is already closed (returns
593
+ `{ action: 'noop', reason: 'already-done' }`), and is safe to re-run
594
+ while the PR is still open (returns `{ action: 'pending', ... }` without
595
+ mutating the Story).
596
+ - The PR probe (`gh pr list --head <branch> --state open`) reuses an
597
+ existing open PR rather than opening a duplicate.
598
+
599
+ Re-running `/single-story-deliver` against an already-closed Story is
600
+ safe.
601
+
602
+ ---
603
+
604
+ ## Constraints
605
+
606
+ - **Never** push the Story branch directly to `main`. The PR is the only
607
+ merge surface.
608
+ - **Always** `cd` into the `workCwd` returned by Step 0 before editing,
609
+ **and** prefix every path-based Edit/Write/Read with that absolute
610
+ `workCwd` root — the `cd` alone does not scope the path-based tools (see
611
+ Step 0.5). Editing a bare main-checkout path lands the change in the wrong
612
+ tree; close's wrong-tree guard (Story #3364) aborts when it detects this.
613
+ - **Always** pass `--cwd <main-repo>` to `single-story-close.js` when
614
+ invoking from inside a worktree (worktree-local branch deletion fails
615
+ when run from inside the worktree).
616
+ - **Handoff discipline — report state, not process.** When you hand back to
617
+ your caller (the `/story-deliver` aggregator or the interactive operator),
618
+ report essential terminal state only: the Story branch, the closing commit
619
+ SHA, what changed, and what was verified. Mirror the fields the close
620
+ pipeline already emits (`single-story-close.js` / `story-phase.js`
621
+ envelopes, the `story-run-progress` snapshot) rather than inventing a new
622
+ contract. Do not narrate the steps you took, and do not prescribe how the
623
+ next stage should do its work. Prose process commentary only bloats the
624
+ hydrated prompt (`delivery.maxTokenBudget` elision).
625
+ - **Label transitions**: drive every `agent::*` state change through
626
+ `node .agents/scripts/update-ticket-state.js --ticket <id> --state <state>`.
627
+ This CLI is the authoritative mechanism — there is no separate
628
+ state-mutation MCP server to degrade from (see
629
+ [`.agents/instructions.md` § 1.D](../../instructions.md)).
630
+
631
+ ---
632
+
633
+ ## See also
634
+
635
+ - [`/story-deliver`](../story-deliver.md) — Epic-attached Story execution.
636
+ - [`/epic-deliver`](../epic-deliver.md) — full Epic wave loop.