mandrel 1.94.0 → 2.1.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 (560) hide show
  1. package/.agents/README.md +116 -99
  2. package/.agents/agents/acceptance-critic.md +9 -7
  3. package/.agents/agents/story-worker.md +45 -51
  4. package/.agents/audit-checklists/performance.md +1 -1
  5. package/.agents/docs/SDLC.md +498 -1287
  6. package/.agents/docs/agentrc-reference.json +185 -80
  7. package/.agents/docs/configuration.md +132 -190
  8. package/.agents/docs/execution-reference.md +51 -25
  9. package/.agents/docs/quality-gates.md +25 -33
  10. package/.agents/docs/workflows.md +8 -8
  11. package/.agents/instructions.md +113 -139
  12. package/.agents/rules/ci-remediation.md +11 -15
  13. package/.agents/rules/git-conventions-reference.md +48 -58
  14. package/.agents/rules/git-conventions.md +16 -22
  15. package/.agents/schemas/acceptance-eval-verdict.schema.json +1 -1
  16. package/.agents/schemas/agentrc.schema.json +83 -254
  17. package/.agents/schemas/audit-rules.json +59 -1
  18. package/.agents/schemas/audit-rules.schema.json +33 -1
  19. package/.agents/schemas/lifecycle/README.md +1 -2
  20. package/.agents/schemas/lifecycle/ledger-record.schema.json +1 -1
  21. package/.agents/schemas/lifecycle/merge.flip-failed.schema.json +33 -0
  22. package/.agents/schemas/lifecycle/merge.unlanded.schema.json +1 -0
  23. package/.agents/schemas/lifecycle/retro.end.schema.json +1 -1
  24. package/.agents/schemas/lifecycle/story.merged.schema.json +1 -1
  25. package/.agents/schemas/signal-event.schema.json +3 -3
  26. package/.agents/schemas/story-deliver-terminal.schema.json +152 -0
  27. package/.agents/schemas/validation-evidence.schema.json +1 -1
  28. package/.agents/scripts/acceptance-eval.js +22 -66
  29. package/.agents/scripts/agents-bootstrap-github.js +1 -1
  30. package/.agents/scripts/audit-to-stories.js +7 -7
  31. package/.agents/scripts/boot-sweep.js +1 -1
  32. package/.agents/scripts/bootstrap.js +3 -3
  33. package/.agents/scripts/check-dead-exports.js +43 -104
  34. package/.agents/scripts/check-doc-links.js +2 -2
  35. package/.agents/scripts/check-lifecycle-lint.js +7 -10
  36. package/.agents/scripts/check-workflow-cli-lint.js +91 -0
  37. package/.agents/scripts/cleanup-repo-test-temp.js +6 -1
  38. package/.agents/scripts/deliver-recover.js +122 -0
  39. package/.agents/scripts/drain-pending-cleanup.js +1 -1
  40. package/.agents/scripts/evidence-gate.js +20 -50
  41. package/.agents/scripts/generate-skills-index.js +17 -1
  42. package/.agents/scripts/generate-workflows-doc.js +4 -4
  43. package/.agents/scripts/lib/ITicketingProvider.js +1 -19
  44. package/.agents/scripts/lib/Logger.js +6 -10
  45. package/.agents/scripts/lib/audit-suite/runner.js +2 -2
  46. package/.agents/scripts/lib/audit-suite/selector.js +328 -28
  47. package/.agents/scripts/lib/audit-to-stories/{seed-epic-from-findings.js → seed-from-findings.js} +9 -9
  48. package/.agents/scripts/lib/baselines/kernel.js +206 -18
  49. package/.agents/scripts/lib/baselines/kinds/maintainability.js +0 -15
  50. package/.agents/scripts/lib/baselines/reader.js +1 -6
  51. package/.agents/scripts/lib/bdd-runner-detect.js +5 -9
  52. package/.agents/scripts/lib/bootstrap/ci-workflow-template.js +28 -33
  53. package/.agents/scripts/lib/bootstrap/issue-forms-template.js +32 -33
  54. package/.agents/scripts/lib/bootstrap/manifest.js +8 -11
  55. package/.agents/scripts/lib/bootstrap/project-bootstrap.js +30 -53
  56. package/.agents/scripts/lib/bootstrap/quality-bootstrap.js +0 -2
  57. package/.agents/scripts/lib/checks/core-bare-clean.js +6 -3
  58. package/.agents/scripts/lib/checks/index.js +3 -2
  59. package/.agents/scripts/lib/checks/loop-health.js +12 -11
  60. package/.agents/scripts/lib/checks/state.js +17 -248
  61. package/.agents/scripts/lib/checks/story-init-not-backgrounded.js +26 -24
  62. package/.agents/scripts/lib/checks/subagent-agent-tool-required.js +3 -4
  63. package/.agents/scripts/lib/checks/worktree-bootstrap-env.js +2 -2
  64. package/.agents/scripts/lib/checks/worktree-residue-biome.js +3 -3
  65. package/.agents/scripts/lib/cli/standard-args.js +13 -22
  66. package/.agents/scripts/lib/cli-args.js +39 -9
  67. package/.agents/scripts/lib/close-validation/gates.js +15 -15
  68. package/.agents/scripts/lib/close-validation/projections/inputs.js +7 -7
  69. package/.agents/scripts/lib/close-validation/projections/maintainability.js +12 -12
  70. package/.agents/scripts/lib/close-validation/runner.js +13 -21
  71. package/.agents/scripts/lib/close-validation/telemetry.js +17 -8
  72. package/.agents/scripts/lib/config/ci.js +6 -31
  73. package/.agents/scripts/lib/config/delivery-routing.js +52 -35
  74. package/.agents/scripts/lib/config/explain.js +61 -48
  75. package/.agents/scripts/lib/config/github.js +7 -5
  76. package/.agents/scripts/lib/config/limits.js +29 -80
  77. package/.agents/scripts/lib/config/paths.js +0 -2
  78. package/.agents/scripts/lib/config/quality.js +12 -15
  79. package/.agents/scripts/lib/config/runners.js +20 -66
  80. package/.agents/scripts/lib/config/temp-paths.js +30 -63
  81. package/.agents/scripts/lib/config/worktree-isolation.js +0 -5
  82. package/.agents/scripts/lib/config-resolver.js +2 -7
  83. package/.agents/scripts/lib/config-settings-schema-delivery.js +55 -161
  84. package/.agents/scripts/lib/config-settings-schema-quality.js +17 -16
  85. package/.agents/scripts/lib/config-settings-schema.js +100 -60
  86. package/.agents/scripts/lib/dead-exports-knip.js +105 -0
  87. package/.agents/scripts/lib/dead-exports-mode.js +51 -0
  88. package/.agents/scripts/lib/dependency-parser.js +3 -2
  89. package/.agents/scripts/lib/doc-tiers.js +2 -2
  90. package/.agents/scripts/lib/duplicate-search.js +242 -41
  91. package/.agents/scripts/lib/feedback-loop/retro-proposals-graduator.js +1 -1
  92. package/.agents/scripts/lib/findings/promote-finding.js +23 -14
  93. package/.agents/scripts/lib/format-generated-json.js +97 -0
  94. package/.agents/scripts/lib/framework-version.js +19 -190
  95. package/.agents/scripts/lib/gh-exec.js +8 -0
  96. package/.agents/scripts/lib/git-branch-cleanup.js +1 -10
  97. package/.agents/scripts/lib/git-branch-lifecycle.js +17 -180
  98. package/.agents/scripts/lib/git-utils.js +32 -20
  99. package/.agents/scripts/lib/github/framework-repo.js +6 -0
  100. package/.agents/scripts/lib/json-utils.js +1 -2
  101. package/.agents/scripts/lib/label-constants.js +10 -38
  102. package/.agents/scripts/lib/label-taxonomy.js +10 -55
  103. package/.agents/scripts/lib/observability/active-story-env.js +44 -165
  104. package/.agents/scripts/lib/observability/runtime-friction.js +243 -0
  105. package/.agents/scripts/lib/observability/signal-validator.js +4 -4
  106. package/.agents/scripts/lib/observability/signals-writer.js +6 -82
  107. package/.agents/scripts/lib/observability/source-classifier.js +5 -5
  108. package/.agents/scripts/lib/observability/tool-trace-hook.js +2 -12
  109. package/.agents/scripts/lib/onboard/init-tail.js +1 -3
  110. package/.agents/scripts/lib/orchestration/acceptance-clusters.js +1 -1
  111. package/.agents/scripts/lib/orchestration/acceptance-eval-decision.js +2 -2
  112. package/.agents/scripts/lib/orchestration/ceremony-routing.js +105 -44
  113. package/.agents/scripts/lib/orchestration/code-review.js +78 -436
  114. package/.agents/scripts/lib/orchestration/column-sync.js +1 -1
  115. package/.agents/scripts/lib/orchestration/consolidation-precondition.js +4 -4
  116. package/.agents/scripts/lib/orchestration/context-envelope.js +2 -5
  117. package/.agents/scripts/lib/orchestration/deliver-recover.js +328 -0
  118. package/.agents/scripts/lib/orchestration/detectors-phase.js +12 -6
  119. package/.agents/scripts/lib/orchestration/docs-digest.js +8 -8
  120. package/.agents/scripts/lib/orchestration/file-assumptions.js +7 -13
  121. package/.agents/scripts/lib/orchestration/git-cleanup/phases/cli.js +1 -1
  122. package/.agents/scripts/lib/orchestration/git-cleanup/phases/fast-forward.js +34 -0
  123. package/.agents/scripts/lib/orchestration/lease-guard-shared.js +3 -2
  124. package/.agents/scripts/lib/orchestration/lifecycle/emit-ledger-event.js +142 -0
  125. package/.agents/scripts/lib/orchestration/lifecycle/emit-loop-tick.js +17 -19
  126. package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-flip-failed.js +86 -0
  127. package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-unlanded.js +37 -103
  128. package/.agents/scripts/lib/orchestration/lifecycle/ledger-writer.js +6 -3
  129. package/.agents/scripts/lib/orchestration/lifecycle/listeners/README.md +21 -43
  130. package/.agents/scripts/lib/orchestration/lifecycle/listeners/watcher.js +50 -85
  131. package/.agents/scripts/lib/orchestration/lifecycle/trace-logger.js +3 -14
  132. package/.agents/scripts/lib/orchestration/lint-baseline-service.js +4 -4
  133. package/.agents/scripts/lib/orchestration/merge-block-class.js +77 -21
  134. package/.agents/scripts/lib/orchestration/merge-poll.js +104 -0
  135. package/.agents/scripts/lib/orchestration/phase-runner.js +3 -2
  136. package/.agents/scripts/lib/orchestration/plan-context.js +354 -282
  137. package/.agents/scripts/lib/orchestration/plan-critic-conditions.js +11 -22
  138. package/.agents/scripts/lib/orchestration/plan-critics-evaluate.js +4 -8
  139. package/.agents/scripts/lib/orchestration/plan-metrics.js +38 -6
  140. package/.agents/scripts/lib/orchestration/plan-navigation.js +92 -0
  141. package/.agents/scripts/lib/orchestration/plan-persist/fan-out-gate.js +71 -0
  142. package/.agents/scripts/lib/orchestration/plan-persist/persist-helpers.js +245 -0
  143. package/.agents/scripts/lib/orchestration/plan-persist/plan-context-source.js +116 -0
  144. package/.agents/scripts/lib/orchestration/plan-persist/run-plan-persist.js +432 -858
  145. package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +778 -0
  146. package/.agents/scripts/lib/orchestration/plan-persist/summary.js +47 -115
  147. package/.agents/scripts/lib/orchestration/plan-persist/supersede-ops.js +509 -0
  148. package/.agents/scripts/lib/orchestration/plan-reachability.js +9 -14
  149. package/.agents/scripts/lib/orchestration/plan-runner/worktree-sweep.js +1 -1
  150. package/.agents/scripts/lib/orchestration/{epic-plan-spec/phases → planning}/authoring-context.js +52 -51
  151. package/.agents/scripts/lib/orchestration/planning/decomposer-context.js +27 -0
  152. package/.agents/scripts/lib/orchestration/{epic-plan-spec/phases → planning}/spec-authoring-grounding.js +1 -1
  153. package/.agents/scripts/lib/orchestration/pr-base-guard.js +18 -28
  154. package/.agents/scripts/lib/orchestration/remote-verifier.js +1 -1
  155. package/.agents/scripts/lib/orchestration/resolve-stories.js +344 -0
  156. package/.agents/scripts/lib/orchestration/resolves-token.js +1 -1
  157. package/.agents/scripts/lib/orchestration/retro-proposals.js +140 -79
  158. package/.agents/scripts/lib/orchestration/review-depth.js +126 -47
  159. package/.agents/scripts/lib/orchestration/review-providers/codex.js +2 -2
  160. package/.agents/scripts/lib/orchestration/review-providers/findings-renderer.js +3 -13
  161. package/.agents/scripts/lib/orchestration/review-providers/native.js +1 -154
  162. package/.agents/scripts/lib/orchestration/review-providers/review-depth.js +3 -2
  163. package/.agents/scripts/lib/orchestration/review-providers/review-provider-factory.js +21 -56
  164. package/.agents/scripts/lib/orchestration/review-providers/security-review.js +1 -1
  165. package/.agents/scripts/lib/orchestration/review-providers/types.js +5 -4
  166. package/.agents/scripts/lib/orchestration/review-providers/ultrareview.js +1 -1
  167. package/.agents/scripts/lib/orchestration/run-epilogue.js +784 -0
  168. package/.agents/scripts/lib/orchestration/single-story-close/phases/auto-merge.js +25 -1
  169. package/.agents/scripts/lib/orchestration/single-story-close/phases/base-sync.js +11 -9
  170. package/.agents/scripts/lib/orchestration/single-story-close/phases/close-validation.js +4 -4
  171. package/.agents/scripts/lib/orchestration/single-story-close/phases/code-review.js +86 -41
  172. package/.agents/scripts/lib/orchestration/single-story-close/phases/confirm-merge.js +608 -152
  173. package/.agents/scripts/lib/orchestration/single-story-close/phases/options.js +77 -32
  174. package/.agents/scripts/lib/orchestration/single-story-close/phases/post-land.js +305 -0
  175. package/.agents/scripts/lib/orchestration/single-story-close/phases/pull-request.js +1 -1
  176. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-block.js +44 -0
  177. package/.agents/scripts/lib/orchestration/single-story-close/phases/worktree-reap.js +37 -4
  178. package/.agents/scripts/lib/orchestration/single-story-close/phases/wrong-tree-guard.js +2 -2
  179. package/.agents/scripts/lib/orchestration/single-story-close/runner.js +275 -46
  180. package/.agents/scripts/lib/orchestration/single-story-lease-guard.js +1 -1
  181. package/.agents/scripts/lib/orchestration/spec-freshness.js +14 -205
  182. package/.agents/scripts/lib/orchestration/spec-section-validator.js +4 -5
  183. package/.agents/scripts/lib/orchestration/spec-spill.js +60 -0
  184. package/.agents/scripts/lib/orchestration/split-policy-validator.js +188 -0
  185. package/.agents/scripts/lib/orchestration/story-close/emit-blocked.js +49 -0
  186. package/.agents/scripts/lib/orchestration/story-close/format-autofix.js +10 -10
  187. package/.agents/scripts/lib/orchestration/story-close/phases/code-review.js +28 -42
  188. package/.agents/scripts/lib/orchestration/story-deliver-terminal.js +360 -0
  189. package/.agents/scripts/lib/orchestration/story-follow-ups.js +298 -0
  190. package/.agents/scripts/lib/orchestration/story-init-remote.js +51 -0
  191. package/.agents/scripts/lib/orchestration/story-plan-state.js +33 -0
  192. package/.agents/scripts/lib/orchestration/structured-comment-parser.js +1 -1
  193. package/.agents/scripts/lib/orchestration/task-body-validator.js +60 -25
  194. package/.agents/scripts/lib/orchestration/ticket-lease.js +27 -74
  195. package/.agents/scripts/lib/orchestration/ticket-validator-conflicts.js +130 -75
  196. package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +192 -377
  197. package/.agents/scripts/lib/orchestration/ticket-validator.js +123 -25
  198. package/.agents/scripts/lib/orchestration/ticketing/bulk.js +14 -72
  199. package/.agents/scripts/lib/orchestration/ticketing/reads.js +45 -55
  200. package/.agents/scripts/lib/orchestration/ticketing/transition.js +66 -6
  201. package/.agents/scripts/lib/orchestration/ticketing.js +0 -1
  202. package/.agents/scripts/lib/plan-phase-cleanup.js +12 -14
  203. package/.agents/scripts/lib/planning-corpus.js +12 -281
  204. package/.agents/scripts/lib/preflight-runner.js +4 -4
  205. package/.agents/scripts/lib/qa/coverage-verdict.js +5 -5
  206. package/.agents/scripts/lib/qa/qa-context-hydrator.js +5 -5
  207. package/.agents/scripts/lib/signals/index.js +4 -17
  208. package/.agents/scripts/lib/signals/read.js +35 -35
  209. package/.agents/scripts/lib/signals/schema.js +8 -11
  210. package/.agents/scripts/lib/signals/span-tree.js +7 -7
  211. package/.agents/scripts/lib/signals/write.js +0 -1
  212. package/.agents/scripts/lib/single-story/story-merged-notify.js +13 -2
  213. package/.agents/scripts/lib/single-story-sweep/protection-ctx.js +1 -1
  214. package/.agents/scripts/lib/skills/parse-skill.js +16 -3
  215. package/.agents/scripts/lib/story-adjacency.js +17 -19
  216. package/.agents/scripts/lib/story-body/story-body.js +130 -75
  217. package/.agents/scripts/lib/story-plan.js +2 -4
  218. package/.agents/scripts/lib/templates/decomposer-prompts.js +51 -46
  219. package/.agents/scripts/lib/templates/spec-author-prompts.js +47 -45
  220. package/.agents/scripts/lib/test-env.js +14 -1
  221. package/.agents/scripts/lib/test-tiers.js +0 -3
  222. package/.agents/scripts/lib/{epic-body-sections.js → ticket-body-sections.js} +25 -39
  223. package/.agents/scripts/lib/validation-evidence.js +32 -60
  224. package/.agents/scripts/lib/wave-runner/ready-set.js +38 -12
  225. package/.agents/scripts/lib/workspace-provisioner.js +1 -1
  226. package/.agents/scripts/lib/worktree/lifecycle/pending-cleanup.js +1 -1
  227. package/.agents/scripts/lib/worktree/lifecycle/reap.js +72 -25
  228. package/.agents/scripts/lib/worktree/lifecycle-manager.js +1 -2
  229. package/.agents/scripts/lint-issue-body.js +71 -40
  230. package/.agents/scripts/mandrel-update-preflight.js +1 -1
  231. package/.agents/scripts/notify.js +4 -3
  232. package/.agents/scripts/plan-context.js +102 -80
  233. package/.agents/scripts/plan-persist.js +230 -279
  234. package/.agents/scripts/plan-run-epilogue.js +142 -0
  235. package/.agents/scripts/post-structured-comment.js +0 -38
  236. package/.agents/scripts/pr-watch-with-update.js +43 -22
  237. package/.agents/scripts/providers/github/compose.js +0 -1
  238. package/.agents/scripts/providers/github/errors.js +0 -19
  239. package/.agents/scripts/providers/github/issues.js +13 -39
  240. package/.agents/scripts/providers/github/mappers.js +5 -12
  241. package/.agents/scripts/providers/github/sub-issues.js +0 -47
  242. package/.agents/scripts/providers/github/tickets.js +33 -156
  243. package/.agents/scripts/providers/github.js +17 -6
  244. package/.agents/scripts/resolve-stories.js +236 -0
  245. package/.agents/scripts/run-coverage.js +4 -1
  246. package/.agents/scripts/run-lint.js +2 -2
  247. package/.agents/scripts/run-verify.js +31 -2
  248. package/.agents/scripts/signals-view.js +25 -21
  249. package/.agents/scripts/single-story-close.js +178 -26
  250. package/.agents/scripts/single-story-confirm-merge.js +313 -24
  251. package/.agents/scripts/single-story-init.js +35 -30
  252. package/.agents/scripts/stories-wave-tick.js +85 -10
  253. package/.agents/scripts/story-plan.js +28 -49
  254. package/.agents/scripts/update-ticket-state.js +14 -65
  255. package/.agents/skills/core/code-review-and-quality/SKILL.md +28 -450
  256. package/.agents/skills/core/code-review-and-quality/reference.md +458 -0
  257. package/.agents/skills/core/debugging-and-error-recovery/SKILL.md +22 -315
  258. package/.agents/skills/core/debugging-and-error-recovery/reference.md +323 -0
  259. package/.agents/skills/core/diagnose-friction/SKILL.md +14 -18
  260. package/.agents/skills/core/documentation-and-adrs/SKILL.md +25 -397
  261. package/.agents/skills/core/documentation-and-adrs/reference.md +403 -0
  262. package/.agents/skills/core/gates-and-baselines/SKILL.md +12 -12
  263. package/.agents/skills/core/idea-refinement/SKILL.md +9 -9
  264. package/.agents/skills/core/scope-triage/SKILL.md +31 -172
  265. package/.agents/skills/core/security-and-hardening/SKILL.md +22 -367
  266. package/.agents/skills/core/security-and-hardening/reference.md +375 -0
  267. package/.agents/skills/skills.index.json +3 -53
  268. package/.agents/skills/stack/qa/playwright-bdd/SKILL.md +2 -4
  269. package/.agents/skills/stack/qa/qa-explore-driving/SKILL.md +1 -1
  270. package/.agents/skills/stack/qa/qa-harness/SKILL.md +1 -3
  271. package/.agents/starter-agentrc.json +0 -5
  272. package/.agents/templates/agent-protocol.md +9 -10
  273. package/.agents/workflows/audit-architecture.md +6 -7
  274. package/.agents/workflows/audit-clean-code.md +7 -7
  275. package/.agents/workflows/audit-dependencies.md +3 -3
  276. package/.agents/workflows/audit-devops.md +3 -3
  277. package/.agents/workflows/audit-documentation.md +9 -10
  278. package/.agents/workflows/audit-lighthouse.md +11 -3
  279. package/.agents/workflows/audit-navigability.md +13 -2
  280. package/.agents/workflows/audit-performance.md +5 -6
  281. package/.agents/workflows/audit-privacy.md +3 -3
  282. package/.agents/workflows/audit-quality.md +11 -12
  283. package/.agents/workflows/audit-security.md +4 -5
  284. package/.agents/workflows/audit-seo.md +13 -3
  285. package/.agents/workflows/audit-sre.md +3 -3
  286. package/.agents/workflows/audit-to-stories.md +20 -20
  287. package/.agents/workflows/audit-ux-ui.md +10 -3
  288. package/.agents/workflows/deliver.md +177 -176
  289. package/.agents/workflows/git-cleanup.md +5 -6
  290. package/.agents/workflows/git-deliver.md +1 -1
  291. package/.agents/workflows/helpers/_merge-conflict-template.md +1 -1
  292. package/.agents/workflows/helpers/acceptance-self-eval.md +35 -40
  293. package/.agents/workflows/helpers/code-quality-guardrails.md +7 -7
  294. package/.agents/workflows/helpers/code-review.md +75 -196
  295. package/.agents/workflows/helpers/{single-story-deliver-reference.md → deliver-story-reference.md} +83 -44
  296. package/.agents/workflows/helpers/deliver-story.md +606 -0
  297. package/.agents/workflows/helpers/diagnose.md +10 -10
  298. package/.agents/workflows/helpers/parallel-tooling.md +3 -3
  299. package/.agents/workflows/helpers/signals.md +16 -16
  300. package/.agents/workflows/helpers/worktree-lifecycle.md +66 -86
  301. package/.agents/workflows/mandrel-update.md +2 -1
  302. package/.agents/workflows/plan.md +277 -145
  303. package/.agents/workflows/qa-assist.md +27 -33
  304. package/.agents/workflows/qa-explore.md +29 -38
  305. package/.agents/workflows/qa-run.md +2 -6
  306. package/README.md +9 -8
  307. package/bin/mandrel.js +12 -1
  308. package/docs/CHANGELOG.md +70 -0
  309. package/lib/cli/registry.js +262 -19
  310. package/lib/cli/sync-agents.js +157 -0
  311. package/lib/cli/sync-commands.js +115 -6
  312. package/lib/cli/sync.js +168 -6
  313. package/lib/cli/update.js +105 -8
  314. package/lib/cli/version-helpers.js +131 -0
  315. package/lib/migrations/README.md +7 -5
  316. package/lib/migrations/index.js +12 -8
  317. package/lib/migrations/steps/2.1.0-retire-mi-drop-knobs.js +100 -0
  318. package/lib/migrations/steps/2.1.0-retire-verify-concurrency-cap.js +101 -0
  319. package/package.json +2 -2
  320. package/.agents/agents/retro.md +0 -42
  321. package/.agents/personas/architect.md +0 -113
  322. package/.agents/personas/devops-engineer.md +0 -38
  323. package/.agents/personas/engineer.md +0 -33
  324. package/.agents/personas/project-manager.md +0 -114
  325. package/.agents/personas/qa-engineer.md +0 -95
  326. package/.agents/personas/security-engineer.md +0 -111
  327. package/.agents/personas/technical-writer.md +0 -101
  328. package/.agents/schemas/dispatch-manifest.json +0 -232
  329. package/.agents/schemas/epic-perf-report.schema.json +0 -89
  330. package/.agents/schemas/epic-spec.schema.json +0 -153
  331. package/.agents/schemas/lifecycle/acceptance.reconcile.failed.schema.json +0 -13
  332. package/.agents/schemas/lifecycle/acceptance.reconcile.ok.schema.json +0 -13
  333. package/.agents/schemas/lifecycle/acceptance.reconcile.skipped.schema.json +0 -13
  334. package/.agents/schemas/lifecycle/acceptance.reconcile.start.schema.json +0 -12
  335. package/.agents/schemas/lifecycle/acceptance.reconcile.waived.schema.json +0 -13
  336. package/.agents/schemas/lifecycle/epic.automerge.end.schema.json +0 -15
  337. package/.agents/schemas/lifecycle/epic.automerge.start.schema.json +0 -13
  338. package/.agents/schemas/lifecycle/epic.blocked.schema.json +0 -13
  339. package/.agents/schemas/lifecycle/epic.cleanup.end.schema.json +0 -12
  340. package/.agents/schemas/lifecycle/epic.cleanup.start.schema.json +0 -12
  341. package/.agents/schemas/lifecycle/epic.close.end.schema.json +0 -12
  342. package/.agents/schemas/lifecycle/epic.complete.schema.json +0 -13
  343. package/.agents/schemas/lifecycle/epic.finalize.end.schema.json +0 -13
  344. package/.agents/schemas/lifecycle/epic.finalize.start.schema.json +0 -12
  345. package/.agents/schemas/lifecycle/epic.merge.armed.schema.json +0 -13
  346. package/.agents/schemas/lifecycle/epic.merge.blocked.schema.json +0 -14
  347. package/.agents/schemas/lifecycle/epic.merge.confirmed.schema.json +0 -17
  348. package/.agents/schemas/lifecycle/epic.merge.ready.schema.json +0 -15
  349. package/.agents/schemas/lifecycle/epic.plan.end.schema.json +0 -18
  350. package/.agents/schemas/lifecycle/epic.plan.start.schema.json +0 -12
  351. package/.agents/schemas/lifecycle/epic.snapshot.end.schema.json +0 -16
  352. package/.agents/schemas/lifecycle/epic.snapshot.start.schema.json +0 -12
  353. package/.agents/schemas/lifecycle/epic.watch.end.schema.json +0 -29
  354. package/.agents/schemas/lifecycle/epic.watch.start.schema.json +0 -16
  355. package/.agents/schemas/lifecycle/slice.end.schema.json +0 -21
  356. package/.agents/schemas/lifecycle/slice.heartbeat.schema.json +0 -20
  357. package/.agents/schemas/lifecycle/slice.start.schema.json +0 -17
  358. package/.agents/schemas/lifecycle/story.heartbeat.schema.json +0 -20
  359. package/.agents/schemas/risk-verdict.schema.json +0 -66
  360. package/.agents/schemas/story-perf-summary.schema.json +0 -73
  361. package/.agents/scripts/acceptance-spec-reconciler.js +0 -642
  362. package/.agents/scripts/analyze-execution.js +0 -444
  363. package/.agents/scripts/bookkeeping-reconcile.js +0 -117
  364. package/.agents/scripts/check-prepush-recovery.js +0 -90
  365. package/.agents/scripts/dispatcher.js +0 -295
  366. package/.agents/scripts/epic-audit-prepare.js +0 -497
  367. package/.agents/scripts/epic-audit-recheck.js +0 -274
  368. package/.agents/scripts/epic-deliver-note-intervention.js +0 -192
  369. package/.agents/scripts/epic-deliver-preflight.js +0 -462
  370. package/.agents/scripts/epic-deliver-prepare.js +0 -852
  371. package/.agents/scripts/epic-execute-record-wave.js +0 -449
  372. package/.agents/scripts/epic-plan-clarity.js +0 -211
  373. package/.agents/scripts/epic-plan-healthcheck.js +0 -581
  374. package/.agents/scripts/epic-reconcile.js +0 -625
  375. package/.agents/scripts/lib/baseline-snapshot.js +0 -979
  376. package/.agents/scripts/lib/checks/epic-merge-lock-stale.js +0 -54
  377. package/.agents/scripts/lib/checks/stale-origin-epic.js +0 -49
  378. package/.agents/scripts/lib/config/lifecycle.js +0 -40
  379. package/.agents/scripts/lib/config/preflight.js +0 -58
  380. package/.agents/scripts/lib/config/retro.js +0 -77
  381. package/.agents/scripts/lib/epic-merge-lock.js +0 -322
  382. package/.agents/scripts/lib/epic-plan-clarity.js +0 -181
  383. package/.agents/scripts/lib/epic-plan-ideation.js +0 -261
  384. package/.agents/scripts/lib/git-merge-orchestrator.js +0 -261
  385. package/.agents/scripts/lib/observability/baseline-refresh-rate.js +0 -221
  386. package/.agents/scripts/lib/observability/hook-heartbeat.js +0 -219
  387. package/.agents/scripts/lib/observability/perf-aggregator.js +0 -813
  388. package/.agents/scripts/lib/observability/perf-report-readers.js +0 -328
  389. package/.agents/scripts/lib/observability/perf-report-render.js +0 -182
  390. package/.agents/scripts/lib/orchestration/bookkeeping-outbox.js +0 -270
  391. package/.agents/scripts/lib/orchestration/context-hydration-engine.js +0 -539
  392. package/.agents/scripts/lib/orchestration/deliver-route.js +0 -173
  393. package/.agents/scripts/lib/orchestration/dispatch-engine.js +0 -134
  394. package/.agents/scripts/lib/orchestration/dispatch-pipeline.js +0 -183
  395. package/.agents/scripts/lib/orchestration/epic-cleanup.js +0 -801
  396. package/.agents/scripts/lib/orchestration/epic-deliver-lease-guard.js +0 -310
  397. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/context.js +0 -163
  398. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/creation.js +0 -140
  399. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/dag.js +0 -64
  400. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/diagnostics.js +0 -72
  401. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/persist-helpers.js +0 -156
  402. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/persist.js +0 -345
  403. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/planning-artifacts.js +0 -41
  404. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/reconcile-spawn.js +0 -86
  405. package/.agents/scripts/lib/orchestration/epic-plan-lease-guard.js +0 -391
  406. package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/drain.js +0 -94
  407. package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/plan-epic.js +0 -236
  408. package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/risk-verdict.js +0 -105
  409. package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/run-spec-phase.js +0 -307
  410. package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/spec-freshness.js +0 -117
  411. package/.agents/scripts/lib/orchestration/epic-plan-state-store.js +0 -117
  412. package/.agents/scripts/lib/orchestration/epic-run-state-store.js +0 -621
  413. package/.agents/scripts/lib/orchestration/epic-runner/concurrency-gate.js +0 -186
  414. package/.agents/scripts/lib/orchestration/epic-runner/deliver-phases.js +0 -50
  415. package/.agents/scripts/lib/orchestration/epic-runner/phases/build-wave-dag.js +0 -129
  416. package/.agents/scripts/lib/orchestration/epic-runner/phases/snapshot.js +0 -103
  417. package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter/composition.js +0 -267
  418. package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter/signals.js +0 -210
  419. package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter/transport.js +0 -238
  420. package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/_bullet-format.js +0 -32
  421. package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/component-drift.js +0 -203
  422. package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/crap-drift.js +0 -227
  423. package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/maintainability-drift.js +0 -117
  424. package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/stalled-worktree.js +0 -37
  425. package/.agents/scripts/lib/orchestration/epic-runner/story-launcher.js +0 -127
  426. package/.agents/scripts/lib/orchestration/epic-runner/story-run-progress-writer.js +0 -400
  427. package/.agents/scripts/lib/orchestration/epic-runner/sub-agent-return.js +0 -276
  428. package/.agents/scripts/lib/orchestration/epic-runner/wave-scheduler.js +0 -66
  429. package/.agents/scripts/lib/orchestration/epic-spec-reconciler-apply.js +0 -789
  430. package/.agents/scripts/lib/orchestration/epic-spec-reconciler-diff.js +0 -676
  431. package/.agents/scripts/lib/orchestration/epic-spec-reconciler-discriminator.js +0 -389
  432. package/.agents/scripts/lib/orchestration/epic-spec-reconciler-format.js +0 -230
  433. package/.agents/scripts/lib/orchestration/epic-spec-reconciler-ops.js +0 -361
  434. package/.agents/scripts/lib/orchestration/error-journal.js +0 -139
  435. package/.agents/scripts/lib/orchestration/finalize/open-or-locate-pr.js +0 -306
  436. package/.agents/scripts/lib/orchestration/finalize/post-handoff-comment.js +0 -489
  437. package/.agents/scripts/lib/orchestration/finalize/sanitize-skip-ci.js +0 -88
  438. package/.agents/scripts/lib/orchestration/lifecycle/emit-slice-lifecycle.js +0 -270
  439. package/.agents/scripts/lib/orchestration/lifecycle/emit-story-dispatch-end.js +0 -147
  440. package/.agents/scripts/lib/orchestration/lifecycle/emit-story-heartbeat.js +0 -155
  441. package/.agents/scripts/lib/orchestration/lifecycle/ledger-diff.js +0 -140
  442. package/.agents/scripts/lib/orchestration/lifecycle/listeners/acceptance-reconciler.js +0 -465
  443. package/.agents/scripts/lib/orchestration/lifecycle/listeners/automerge-armer.js +0 -501
  444. package/.agents/scripts/lib/orchestration/lifecycle/listeners/automerge-predicate.js +0 -984
  445. package/.agents/scripts/lib/orchestration/lifecycle/listeners/branch-cleaner.js +0 -264
  446. package/.agents/scripts/lib/orchestration/lifecycle/listeners/checkpoint-pointer-writer.js +0 -284
  447. package/.agents/scripts/lib/orchestration/lifecycle/listeners/cleaner.js +0 -355
  448. package/.agents/scripts/lib/orchestration/lifecycle/listeners/finalizer.js +0 -673
  449. package/.agents/scripts/lib/orchestration/lifecycle/listeners/index.js +0 -378
  450. package/.agents/scripts/lib/orchestration/lifecycle/listeners/intervention-recorder.js +0 -140
  451. package/.agents/scripts/lib/orchestration/lifecycle/listeners/label-transitioner.js +0 -144
  452. package/.agents/scripts/lib/orchestration/lifecycle/listeners/merge-watcher.js +0 -665
  453. package/.agents/scripts/lib/orchestration/lifecycle/listeners/notify-dispatcher.js +0 -174
  454. package/.agents/scripts/lib/orchestration/manifest-builder.js +0 -222
  455. package/.agents/scripts/lib/orchestration/plan-persist/amend.js +0 -359
  456. package/.agents/scripts/lib/orchestration/plan-persist/delivery-mode.js +0 -127
  457. package/.agents/scripts/lib/orchestration/plan-review-routing.js +0 -63
  458. package/.agents/scripts/lib/orchestration/planning-context-budget.js +0 -213
  459. package/.agents/scripts/lib/orchestration/planning-risk.js +0 -194
  460. package/.agents/scripts/lib/orchestration/post-merge/phases/branch-cleanup.js +0 -56
  461. package/.agents/scripts/lib/orchestration/post-merge/phases/dashboard-refresh.js +0 -33
  462. package/.agents/scripts/lib/orchestration/post-merge/phases/notification.js +0 -78
  463. package/.agents/scripts/lib/orchestration/post-merge/phases/temp-cleanup.js +0 -68
  464. package/.agents/scripts/lib/orchestration/post-merge/phases/ticket-closure.js +0 -118
  465. package/.agents/scripts/lib/orchestration/post-merge/phases/worktree-reap.js +0 -396
  466. package/.agents/scripts/lib/orchestration/post-merge-pipeline.js +0 -205
  467. package/.agents/scripts/lib/orchestration/preflight-cache.js +0 -187
  468. package/.agents/scripts/lib/orchestration/recurring-failure-detector.js +0 -152
  469. package/.agents/scripts/lib/orchestration/retro/phases/checks.js +0 -94
  470. package/.agents/scripts/lib/orchestration/retro/phases/compose-body.js +0 -571
  471. package/.agents/scripts/lib/orchestration/retro/phases/gather-signals.js +0 -450
  472. package/.agents/scripts/lib/orchestration/retro/phases/post-and-mirror.js +0 -191
  473. package/.agents/scripts/lib/orchestration/retro-heuristics.js +0 -57
  474. package/.agents/scripts/lib/orchestration/retro-perf-heuristics.js +0 -275
  475. package/.agents/scripts/lib/orchestration/retro-runner.js +0 -197
  476. package/.agents/scripts/lib/orchestration/spec-renderer.js +0 -447
  477. package/.agents/scripts/lib/orchestration/story-close/auto-refresh-runner.js +0 -747
  478. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/gate-failure.js +0 -211
  479. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/pre-merge-attribution.js +0 -158
  480. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/refresh-commit.js +0 -446
  481. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/regression-projection.js +0 -297
  482. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/scope-discovery.js +0 -48
  483. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution-wiring.js +0 -67
  484. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution.js +0 -161
  485. package/.agents/scripts/lib/orchestration/story-close/baseline-friction-body.js +0 -117
  486. package/.agents/scripts/lib/orchestration/story-close/cd-out-guard.js +0 -86
  487. package/.agents/scripts/lib/orchestration/story-close/cleanup-reconciler.js +0 -147
  488. package/.agents/scripts/lib/orchestration/story-close/close-inputs.js +0 -142
  489. package/.agents/scripts/lib/orchestration/story-close/comment-bodies.js +0 -62
  490. package/.agents/scripts/lib/orchestration/story-close/merge-runner.js +0 -658
  491. package/.agents/scripts/lib/orchestration/story-close/merge-subject.js +0 -198
  492. package/.agents/scripts/lib/orchestration/story-close/phases/branch-restore.js +0 -105
  493. package/.agents/scripts/lib/orchestration/story-close/phases/close.js +0 -222
  494. package/.agents/scripts/lib/orchestration/story-close/phases/gates.js +0 -292
  495. package/.agents/scripts/lib/orchestration/story-close/phases/locked-pipeline.js +0 -270
  496. package/.agents/scripts/lib/orchestration/story-close/phases/preflight.js +0 -110
  497. package/.agents/scripts/lib/orchestration/story-close/phases/refresh.js +0 -86
  498. package/.agents/scripts/lib/orchestration/story-close/phases/timeout-blocked-emitter.js +0 -112
  499. package/.agents/scripts/lib/orchestration/story-close/phases/timeout-blocked.js +0 -157
  500. package/.agents/scripts/lib/orchestration/story-close/post-merge-close.js +0 -421
  501. package/.agents/scripts/lib/orchestration/story-close/pre-merge-validation.js +0 -302
  502. package/.agents/scripts/lib/orchestration/story-close/shared-checkout-guard.js +0 -163
  503. package/.agents/scripts/lib/orchestration/story-close-recovery.js +0 -690
  504. package/.agents/scripts/lib/orchestration/wave-marker.js +0 -28
  505. package/.agents/scripts/lib/orchestration/wave-record-io.js +0 -218
  506. package/.agents/scripts/lib/orchestration/wave-record-notifications.js +0 -145
  507. package/.agents/scripts/lib/orchestration/wave-record-projection.js +0 -212
  508. package/.agents/scripts/lib/presentation/dispatch-manifest-render.js +0 -111
  509. package/.agents/scripts/lib/presentation/manifest-builder.js +0 -239
  510. package/.agents/scripts/lib/presentation/manifest-formatter.js +0 -242
  511. package/.agents/scripts/lib/presentation/manifest-helpers.js +0 -213
  512. package/.agents/scripts/lib/presentation/manifest-persistence.js +0 -261
  513. package/.agents/scripts/lib/presentation/manifest-procedures.js +0 -55
  514. package/.agents/scripts/lib/presentation/manifest-render-waves.js +0 -306
  515. package/.agents/scripts/lib/presentation/manifest-renderer.js +0 -188
  516. package/.agents/scripts/lib/presentation/manifest-story-views.js +0 -110
  517. package/.agents/scripts/lib/push-epic-retry.js +0 -209
  518. package/.agents/scripts/lib/spec/index.js +0 -36
  519. package/.agents/scripts/lib/spec/loader.js +0 -425
  520. package/.agents/scripts/lib/spec/state.js +0 -208
  521. package/.agents/scripts/lib/story-init/blocker-validator.js +0 -68
  522. package/.agents/scripts/lib/story-init/branch-initializer.js +0 -408
  523. package/.agents/scripts/lib/story-init/context-resolver.js +0 -92
  524. package/.agents/scripts/lib/story-init/donor-precheck.js +0 -207
  525. package/.agents/scripts/lib/story-init/state-transitioner.js +0 -80
  526. package/.agents/scripts/lib/story-init/task-graph-builder.js +0 -124
  527. package/.agents/scripts/lib/story-init/transition-summary.js +0 -34
  528. package/.agents/scripts/lib/test-reserved-epic-temp-ids.js +0 -35
  529. package/.agents/scripts/lib/wave-runner/tick.js +0 -754
  530. package/.agents/scripts/lib/wave-runner/wave-runner-error.js +0 -20
  531. package/.agents/scripts/lifecycle-emit-story-dispatch.js +0 -194
  532. package/.agents/scripts/lifecycle-emit.js +0 -510
  533. package/.agents/scripts/retro-run.js +0 -218
  534. package/.agents/scripts/slice-phase.js +0 -361
  535. package/.agents/scripts/standalone-feedback-rollup.js +0 -188
  536. package/.agents/scripts/story-close.js +0 -294
  537. package/.agents/scripts/story-init.js +0 -599
  538. package/.agents/scripts/story-phase.js +0 -369
  539. package/.agents/scripts/wave-tick.js +0 -464
  540. package/.agents/skills/core/analyze-execution/SKILL.md +0 -98
  541. package/.agents/skills/core/epic-plan-consolidate/SKILL.md +0 -172
  542. package/.agents/skills/core/epic-plan-consolidate/examples.md +0 -51
  543. package/.agents/skills/core/epic-plan-decompose-author/SKILL.md +0 -441
  544. package/.agents/skills/core/epic-plan-decompose-author/examples.md +0 -47
  545. package/.agents/skills/core/epic-plan-premortem/SKILL.md +0 -146
  546. package/.agents/skills/core/epic-plan-premortem/examples.md +0 -53
  547. package/.agents/skills/core/epic-plan-spec-author/SKILL.md +0 -383
  548. package/.agents/skills/core/epic-plan-spec-author/examples.md +0 -91
  549. package/.agents/workflows/helpers/deliver-epic-reference.md +0 -547
  550. package/.agents/workflows/helpers/deliver-epic-single.md +0 -331
  551. package/.agents/workflows/helpers/deliver-epic.md +0 -998
  552. package/.agents/workflows/helpers/deliver-stories.md +0 -450
  553. package/.agents/workflows/helpers/epic-audit.md +0 -189
  554. package/.agents/workflows/helpers/epic-deliver-story.md +0 -436
  555. package/.agents/workflows/helpers/epic-testing.md +0 -125
  556. package/.agents/workflows/helpers/plan-epic-reference.md +0 -160
  557. package/.agents/workflows/helpers/plan-epic.md +0 -353
  558. package/.agents/workflows/helpers/plan-story.md +0 -251
  559. package/.agents/workflows/helpers/scope-triage-gate.md +0 -108
  560. package/.agents/workflows/helpers/single-story-deliver.md +0 -557
@@ -1,557 +0,0 @@
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
- > **Runtime core.** This file is the always-ingested standalone-Story path:
11
- > step flow, commands, gate contracts, and the return contract. The lease /
12
- > sweep mechanics, the worktree-scope safety warning, the CI-recovery
13
- > procedures, and the Status-column reconciliation live in the sibling
14
- > [`single-story-deliver-reference.md`](single-story-deliver-reference.md);
15
- > each moved procedure keeps a one-line pointer at its trigger point below.
16
- > The reference is not projected to `.claude/commands/` — it is consulted on
17
- > demand.
18
-
19
- ## Overview
20
-
21
- `/single-story-deliver` is the standalone counterpart to
22
- [`/deliver`](deliver-stories.md). Use it for a Story that is **not**
23
- attached to an Epic — refactors carved out of closed Epics, framework
24
- maintenance, or any work small enough that the Epic-Centric ceremony
25
- (sectioned Epic body + decomposition + dispatch manifest + cascade) would be
26
- overhead rather than help.
27
-
28
- ```text
29
- /single-story-deliver <storyId>
30
- → single-story-init.js (branch from main, worktree, agent::executing)
31
- → agent implements + commits (operator works in the worktree)
32
- → single-story-close.js (gates, push, gh pr create → main, agent::closing)
33
- → CI watch + fix loop (until all required checks pass + PR is merged)
34
- → single-story-confirm-merge.js (PR merged → agent::done, issue closes)
35
- ```
36
-
37
- **When to use `/single-story-deliver` vs. `/deliver`:**
38
-
39
- | Trait | `/single-story-deliver` | `/deliver` |
40
- | ----------------------------- | ---------------------------------------------------- | ------------------------------------------------------- |
41
- | Parent Epic | None (no `Epic: #N` in body) | Required (`Epic: #N` in body) |
42
- | Branch base | `project.baseBranch` (default `main`) | `epic/<epicId>` |
43
- | Merge target | `main` via PR | `epic/<epicId>` via `--no-ff` merge |
44
- | Epic-branch integration | No | Yes — merged into `epic/<epicId>` at close |
45
- | Dispatch manifest interaction | None | Read at init, regenerated at close |
46
- | Story scope | Inline `acceptance[]` / `verify[]` on the Story body | Inline `acceptance[]` / `verify[]` on the Story body |
47
-
48
- If the Story has an `Epic: #N` reference, use `/deliver`. If it
49
- doesn't, use this workflow (or `/deliver` for several standalone
50
- Stories at once).
51
-
52
- ## Prerequisites
53
-
54
- 1. A GitHub Issue with the `type::story` label and **no** `Epic: #N`
55
- reference in its body.
56
- 2. `GITHUB_TOKEN` or `gh auth status` clean — `gh pr create` runs at close.
57
- 3. The base branch (`project.baseBranch`, default `main`) exists on
58
- both local and `origin`.
59
-
60
- ---
61
-
62
- ## Step 0 — Initialize (`single-story-init.js`)
63
-
64
- Run from the **main checkout** (the worktree does not exist yet):
65
-
66
- ```bash
67
- node .agents/scripts/single-story-init.js --story <storyId>
68
- ```
69
-
70
- Flags: `--dry-run` (no git/ticket mutation), `--steal` (forcibly transfer a
71
- foreign Story lease to this operator — see the lease note below).
72
-
73
- > **Execution mode.** Like `story-init.js`, this command can take 3–6
74
- > minutes when the worktree's per-tree install runs. Invoke synchronously
75
- > with `Bash(timeout: 600000)`. Do **not** use `run_in_background` +
76
- > `Monitor` — a sub-agent that exits mid-install leaves the worktree
77
- > half-bootstrapped.
78
-
79
- The script validates `type::story`, **acquires the Story lease**, fetches
80
- `origin`, seeds `story-<id>` from `baseBranch`, materializes a worktree
81
- (when `delivery.worktreeIsolation.enabled` is true), upserts a
82
- `story-init` structured comment carrying `standalone: true`, and flips
83
- the Story to `agent::executing`. It also reuses an existing `story-<id>`
84
- branch (idempotent re-init) and runs a **merged-`story-*` sweep** between
85
- fetch and branch-seed.
86
-
87
- > **Lease preflight, branch reuse, and merged-sweep.** The standalone lease
88
- > **fails closed** on a foreign assignee (there is no Epic-scoped
89
- > heartbeat ledger to judge staleness) — coordinate or pass `--steal`. The
90
- > sweep is guarded (per-candidate protection + cross-session lock) and
91
- > never blocks init. See
92
- > [`single-story-deliver-reference.md` § Step 0 — Lease preflight and merged-sweep](single-story-deliver-reference.md#step-0--lease-preflight-and-merged-sweep)
93
- > for the fail-closed outcomes, the `--steal` contract, and the sweep
94
- > hardening layers.
95
-
96
- Capture `workCwd` from the result envelope. Add `--dry-run` to inspect
97
- the planned actions without git or ticket mutations (dry-run also skips
98
- the lease and the sweep).
99
-
100
- **Remote evidence — land or block (issue #4483).** The envelope also
101
- carries `remoteVerified` + `remoteProbe` (`git remote get-url origin` +
102
- bounded `git ls-remote origin HEAD`). When `remoteVerified` is `false`,
103
- transition the Story to `agent::blocked` quoting `remoteProbe.detail` and
104
- stop. Implementing the Story inline outside the worktree/branch/PR path
105
- and/or committing it to local `main` is expressly forbidden — the close
106
- pipeline's push is the only sanctioned landing.
107
-
108
- ### Step 0.5 — `cd` into the workCwd
109
-
110
- ```bash
111
- cd "<workCwd from Step 0 result>"
112
- ```
113
-
114
- All subsequent commands run from this directory.
115
-
116
- > **Worktree scope is not just the Bash cwd.** `cd <workCwd>` steers the
117
- > Bash tool's cwd but does **not** scope the path-based Edit/Write/Read
118
- > tools — you MUST prefix every such path with the absolute `workCwd` root or
119
- > risk silently editing the main checkout. Close's wrong-tree guard (Story
120
- > #3364) is a backstop, not a substitute. See
121
- > [`single-story-deliver-reference.md` § Worktree scope is not just the Bash cwd](single-story-deliver-reference.md#worktree-scope-is-not-just-the-bash-cwd).
122
-
123
- ---
124
-
125
- ## Step 1 — Implementation
126
-
127
- A standalone Story is **atomic** — no wave dispatch and no Epic-scoped
128
- cascade. Work happens in one or more commits on the `story-<id>`
129
- branch, against the inline `acceptance[]` / `verify[]` arrays on the
130
- Story body.
131
-
132
- Operator/agent responsibilities while in the worktree:
133
-
134
- 1. Read the Story body. Treat its acceptance criteria as the contract.
135
-
136
- **Docs context — digest-first.** A standalone Story has no parent Epic,
137
- so there is usually no per-Epic docs digest to read. If the caller
138
- provides a `docsDigestPath` (the per-Epic docs digest at
139
- `temp/epic-<epicId>/docs-digest.md`), read that compact outline instead
140
- of re-reading the full `project.docsContextFiles` set, and pull
141
- individual docs files on demand (jump to the section at the line number
142
- the digest names). When no digest path is provided, read a full doc
143
- only when the Story's own context points you at one — do not ingest the
144
- whole docs set up front. See
145
- [`.agents/instructions.md` § 3](../../instructions.md).
146
-
147
- **Write-time audit checklists.** The write-time local-lens checklist
148
- threading (Story #4410) is wired on the Epic delivery path via
149
- `epic-deliver-prepare.js`, which threads a per-Story `checklistPath` into
150
- the maker prompt. When a standalone caller provides a `checklistPath`
151
- (the repo-relative path to this Story's footprint-matched **local**-lens
152
- authoring checklists, matched via `resolveLensTier(lens) === 'local'` +
153
- `matchesAnyFilePattern` against the Story's predicted footprint — never
154
- `selectAudits`, so no provider or git diff runs), read it before you
155
- write and self-check your change against each listed concern as you
156
- author it. When no `checklistPath` is provided, there is nothing extra to
157
- read — the lens-aware coverage still runs maker-blind at Story-scope
158
- review inside the close subprocess.
159
- 2. Implement the changes.
160
- 3. Commit on the Story branch. Conventional-commit format is encouraged
161
- but not enforced — the PR title carries the canonical summary.
162
- 4. Iterate (read tests, run targeted gates, edit, commit) until the
163
- acceptance criteria are met.
164
- 5. Run the **bounded acceptance self-eval loop** (Step 1a below) before
165
- proceeding to close.
166
-
167
- Recommended quick gates while iterating (each is fast enough to run on
168
- save):
169
-
170
- ```bash
171
- npm run typecheck
172
- npm run lint
173
- npm test -- --grep "<scope>"
174
- ```
175
-
176
- The full close-validation chain runs in Step 3; the gates above are
177
- advisory pre-flight.
178
-
179
- > Conflict with `main` mid-implementation → resolve as you would any
180
- > branch rebase. There is no `epic/<id>` intermediate, so the rebase
181
- > base is `main` directly.
182
-
183
- ### Step 1a — Bounded acceptance self-eval loop (**required, not optional**)
184
-
185
- After the implementation commits land and **before** you proceed to close, run
186
- the bounded acceptance self-eval loop. The per-round critic mechanic (fresh-
187
- context critic, `verify[]`-as-evidence, the verdict schema, and the
188
- proceed / redraft / block decision) is the single-homed include
189
- [`acceptance-self-eval.md`](acceptance-self-eval.md) — read it and follow it.
190
-
191
- Standalone specifics for this path:
192
-
193
- - **Critic evidence-share** (Story #4250). When the critic runs a `verify[]`
194
- command that is byte-identical to a close gate (`lint` / `typecheck`), it
195
- records the pass into the standalone evidence keyspace via `--standalone`
196
- (no parent Epic to key on) so Step 3's close short-circuits the gate at
197
- unchanged HEAD. Run it in the **Story worktree** (`workCwd` from Step 0):
198
-
199
- ```bash
200
- node <main-repo>/.agents/scripts/evidence-gate.js \
201
- --standalone --scope-id <storyId> --gate lint \
202
- --worktree <workCwd> -- npm run lint
203
- ```
204
-
205
- - **Gate invocation** (omit `--epic` — there is no parent Epic):
206
-
207
- ```bash
208
- node <main-repo>/.agents/scripts/acceptance-eval.js \
209
- --story <storyId> --verdict <verdict-path>
210
- ```
211
-
212
- - **On `decision: "proceed"`** → proceed to Step 3 (close).
213
- - **On `decision: "block"`** → **do not proceed to close.** Post a `friction`
214
- comment naming the unmet criteria, then transition the Story to
215
- `agent::blocked`:
216
-
217
- ```bash
218
- node .agents/scripts/diagnose-friction.js --story <storyId> \
219
- --cmd node .agents/scripts/acceptance-eval.js --story <storyId> --verdict <verdict-path>
220
- node .agents/scripts/update-ticket-state.js --ticket <storyId> --state agent::blocked
221
- ```
222
-
223
- ---
224
-
225
- ## Step 2 — Validate (deferred to close)
226
-
227
- `single-story-close.js` runs the canonical close-validation chain
228
- (typecheck, lint, test, format, maintainability, coverage, crap) before
229
- it pushes. Do **not** pre-run those gates here unless interactively
230
- iterating on a fix.
231
-
232
- ---
233
-
234
- ## Step 3 — Close (`single-story-close.js`)
235
-
236
- Invoke from the main checkout (or pass `--cwd <main-repo>` from inside
237
- the worktree):
238
-
239
- ```bash
240
- node <main-repo>/.agents/scripts/single-story-close.js --story <storyId> --cwd <main-repo>
241
- ```
242
-
243
- The script runs the close-validation gates against `baseBranch`, syncs the
244
- Story branch from `origin/<baseBranch>` (Story #2580 — the parallel-race
245
- defence), pushes `story-<id>`, opens (or reuses) a PR against `baseBranch`
246
- with a `Closes #<storyId>` footer, enables GitHub native auto-merge
247
- (`--auto --squash --delete-branch`) **when `delivery.ci.autoMerge` is
248
- `"trust-ci"` (the default)**, flips the Story to **`agent::closing`**
249
- (NOT `agent::done` — the issue stays OPEN until Step 5 confirms the merge,
250
- Story #3385), reaps the worktree, and releases the Story lease.
251
-
252
- > **`delivery.ci.autoMerge` policy (shared with the Epic path).** The
253
- > standalone close honours the same config knob the Epic Phase 8.5 gate
254
- > reads. Under the default `"trust-ci"`, GitHub native auto-merge is armed
255
- > and the PR squash-merges once its **required** checks pass (GitHub's
256
- > `--auto` is the required-check gate — no client-side predicate is needed
257
- > here, unlike the Epic path, because a standalone Story runs no
258
- > audit/review/retro phase to gate on). Under `"strict"`, the close **does
259
- > not arm auto-merge** — the PR opens and waits for an **operator merge**,
260
- > exactly as `--no-auto-merge` does per-run. This lets a consumer who tightens
261
- > Epic merges with `"strict"` get the same operator-in-the-loop behaviour for
262
- > standalone Stories.
263
-
264
- Flags:
265
-
266
- - `--skip-validation` — bypass the gates (Step 1). Use only when re-running
267
- close after a fixed gate failure that's already known to pass.
268
- - `--skip-sync` — bypass the base-sync (Story #2580). Use only after a
269
- hand-resolved sync, or in tests.
270
- - `--no-auto-merge` — disable auto-merge. Use when the PR materially changes
271
- behaviour and warrants a pre-merge eyeball; the operator then merges via
272
- the GitHub UI.
273
- - `--wait-merge` — **headless must-land** (Story #4428, Epic #4425). Pass
274
- this flag when driving `single-story-close.js` from an unattended /
275
- headless context (no operator available to run Step 5 by hand — a CI
276
- job, a scheduled `/loop`, or any wrapper that cannot rely on a human to
277
- invoke `single-story-confirm-merge.js` later). Instead of resting at
278
- `agent::closing` after arming, close polls the armed PR to merge
279
- confirmation on the `delivery.mergeWatch.*` cadence (reusing the same
280
- `confirmStoryMerged` flip logic Step 5 calls) and flips `agent::done`
281
- itself. If the arm fails, the PR closes without merging, or the poll
282
- budget is exhausted first, close classifies the block
283
- (`checks-pending-timeout` \| `branch-protection-human-required` \|
284
- `arm-failure` \| `api-race-other`), emits a `merge.unlanded` lifecycle
285
- event, posts a `friction` comment, transitions the Story to
286
- `agent::blocked`, and exits non-zero — never a silent `agent::closing`
287
- rest. **Attended runs must not pass this flag** — the default (no flag)
288
- preserves the exit-at-`agent::closing` behaviour documented in Step 3
289
- and Step 5 below.
290
- - `--no-wait-merge` — explicit opt-out that always wins over `--wait-merge`
291
- (including for a caller that otherwise defaults to headless mode). Use
292
- when a headless wrapper still wants to manage merge confirmation itself
293
- (e.g. via its own `single-story-confirm-merge.js` invocation) rather than
294
- have close block the turn.
295
-
296
- > **Full close pipeline (base-sync outcomes, `agent::closing` rationale,
297
- > lease release).** For the numbered close pipeline, the base-sync outcome
298
- > table (no-op / conflict → `agent::blocked` / fetch-failed), and why the
299
- > issue stays OPEN at `agent::closing`, see
300
- > [`single-story-deliver-reference.md` § Step 3 — Close pipeline detail](single-story-deliver-reference.md#step-3--close-pipeline-detail).
301
-
302
- ---
303
-
304
- ## Step 4 — CI watch + fix loop (**required, not optional**)
305
-
306
- > **Headless (`--wait-merge`) runs skip Steps 4 and 5.** When Step 3 passed
307
- > `--wait-merge`, `single-story-close.js` already polled the PR to a
308
- > confirmed merge (flipping `agent::done` itself) or exited non-zero after
309
- > transitioning the Story to `agent::blocked` with a `merge.unlanded`
310
- > event — there is no separate CI-watch turn or manual confirm step to run.
311
- > Proceed straight to Step 5.5. Attended runs (the default) still own
312
- > Steps 4 and 5 as documented below.
313
-
314
- The Story is **not done** when `single-story-close.js` returns. Auto-merge
315
- only fires when every required CI check turns green. Local close-validation
316
- gates pass on the dev host's environment; CI runs on a different OS and
317
- concurrency, and coverage rounding, platform-conditional branches, and
318
- timing-sensitive tests routinely drift between the two. The agent owns the
319
- green-CI outcome, not just the push.
320
-
321
- > **The auto-merge wait is an internally-blocking step, not a reason to end
322
- > your turn.** `pr-watch-with-update.js` blocks the current turn until CI
323
- > resolves — that IS how you wait. Keep the turn alive: watch → (fix +
324
- > push + re-watch on red) → confirm the merge (Step 5) → flip
325
- > `agent::done` → post-merge steps → return the terminal JSON contract.
326
- > Ending the turn with prose and an unconfirmed merge is a contract
327
- > violation (the Story #1553 / PR #1554 failure mode). See
328
- > [`single-story-deliver-reference.md` § The auto-merge wait is an internally-blocking step](single-story-deliver-reference.md#the-auto-merge-wait-is-an-internally-blocking-step).
329
-
330
- After `single-story-close.js` succeeds, enter the watch + fix loop. Drive
331
- `pr-watch-with-update.js` — the **single CI-watch mechanism** shared with
332
- the Epic Phase 8 path (Story #4358). It polls the required checks to a
333
- terminal state and auto-recovers from `mergeStateStatus: BEHIND`; do
334
- **not** fall back to a bare `gh pr checks` watch invocation:
335
-
336
- ```bash
337
- node <agentRoot>/scripts/pr-watch-with-update.js --pr <prNumber>
338
- ```
339
-
340
- Poll cadence and caps come from `delivery.ci.watch.*`
341
- (`pollIntervalMs`, `maxPolls`, `maxResumes`); pass `--poll-interval-ms`,
342
- `--max-polls`, or `--max-resumes` to override for one run.
343
-
344
- When the watch exits, branch on the exit code:
345
-
346
- - **Exit 0 (all checks ✓)** — auto-merge will fire (or has already). The
347
- Story is still at `agent::closing` with its issue OPEN. **Proceed to
348
- Step 5 within the same turn** — green CI is the *start* of the
349
- merge-confirm sequence, not a terminal state.
350
- - **Exit 1 (a check genuinely failed)** — diagnose, fix, and push a new
351
- commit on `story-<storyId>`, then re-watch. Auto-merge stays enabled
352
- across retries; no need to re-arm it. The Story stays at
353
- `agent::closing` throughout, so a failed/abandoned PR never strands a
354
- CLOSED issue. If the same failure class recurs, hand convergence off to a
355
- self-paced host loop (`/loop`) that re-runs the failing check and applies
356
- the smallest fix until it exits green.
357
- - **Exit 2 (still-running — slow CI, not red)** — the poll cap fired with
358
- checks still pending and the watcher exhausted its resume budget with
359
- nothing red. This is **never** a failure. Hand the wait off to the
360
- host's interval loop rather than ending your turn: `/loop 5m` polling
361
- `gh pr checks` until the checks settle.
362
-
363
- > **Triage authority.** How to classify and remediate a red (or repeatedly
364
- > slow) check — the root-cause-only decision tree for infra/transient and
365
- > flaky failures (reproduce → check `main` → bisect env vs code → fix in-scope
366
- > or file a `meta::framework-gap` issue), the never-rerun / never-quarantine
367
- > prohibitions, and the escalation criteria (three-strikes, the 30-minute
368
- > wall-clock timebox, and the clearly-environmental fast path) — is defined
369
- > once in [`.agents/rules/ci-remediation.md`](../../rules/ci-remediation.md).
370
- > Read it before remediating a red check above.
371
- >
372
- > **CI recovery procedures.** For resurrecting the worktree after
373
- > `reapOnSuccess`, pulling the failing job log, fixing coverage/CRAP
374
- > baselines without re-running close-validation, and the when-to-stop
375
- > Anti-Thrashing rules, see
376
- > [`single-story-deliver-reference.md` § Step 4 — CI watch + fix recovery](single-story-deliver-reference.md#step-4--ci-watch--fix-recovery).
377
-
378
- ---
379
-
380
- ## Step 5 — Merge confirmation + `agent::done` flip (**required, not optional**)
381
-
382
- With auto-merge enabled (default), GitHub squash-merges the PR when
383
- every required check turns green and the `Closes #<id>` footer
384
- auto-closes the Story issue.
385
-
386
- Confirm the merge landed:
387
-
388
- ```bash
389
- gh pr view <prNumber> --json state,mergedAt,mergeCommit
390
- ```
391
-
392
- Expect `state: "MERGED"`. With `--no-auto-merge`, the PR is the merge
393
- gate — the operator reviews and merges via the GitHub UI; the same
394
- `Closes #<id>` auto-close fires when the merge lands on `main`.
395
-
396
- **Then flip the Story to `agent::done`.** Step 3 deferred this flip
397
- (Story #3385); now that the merge is confirmed, drive the
398
- `agent::closing → agent::done` transition (which closes the issue) via:
399
-
400
- ```bash
401
- node .agents/scripts/single-story-confirm-merge.js --story <storyId> --cwd <main-repo>
402
- ```
403
-
404
- > **Confirmation outcomes.** `single-story-confirm-merge.js` re-reads the
405
- > live PR state and flips to `agent::done` only on a confirmed `MERGED` PR;
406
- > it is idempotent and safe to re-run while the PR is still open (returns
407
- > `pending`). See
408
- > [`single-story-deliver-reference.md` § Step 5 — Merge confirmation detail](single-story-deliver-reference.md#step-5--merge-confirmation-detail).
409
-
410
- ---
411
-
412
- ## Step 5.5 — Re-assert Status column (**required, not optional**)
413
-
414
- GitHub Projects v2 built-in workflows fire minutes *after* auto-merge lands
415
- and clobber the `Done` Status the confirm step set, stranding closed
416
- Stories at `In Progress` on the board (reproduced on Story #2813).
417
- Re-assert authority once the merge confirms:
418
-
419
- ```bash
420
- node .agents/scripts/resync-status-column.js --story <storyId>
421
- ```
422
-
423
- The helper re-fires the `ColumnSync` mutation and **polls for ~15 s** to win
424
- the race against the bot's late write (Story #2876). It is idempotent and
425
- no-op-safe (`no-project` / `not-on-project` exit 0). Skip Step 5.5 only when
426
- the operator opted out of auto-merge AND has not yet merged the PR — run it
427
- after the manual merge instead.
428
-
429
- > **Status-column detail + tuning flags + operator fix.** For the poll-loop
430
- > flags (`--poll-attempts`, `--poll-delay-ms`), the `attempts` / `drifted`
431
- > envelope semantics, and the canonical
432
- > `--reap-conflicting-workflows` operator fix, see
433
- > [`single-story-deliver-reference.md` § Step 5.5 — Re-assert Status column detail](single-story-deliver-reference.md#step-55--re-assert-status-column-detail).
434
-
435
- ---
436
-
437
- ## Step 6 — Local branch cleanup (**required, not optional**)
438
-
439
- GitHub deletes the **remote** branch on auto-merge, but the **local**
440
- `story-<storyId>` ref lingers in the main checkout until something prunes
441
- it. After Step 5 confirms `state: "MERGED"`, prune the story ref **and**
442
- fast-forward local `main` (or `project.baseBranch`):
443
-
444
- ```bash
445
- node .agents/scripts/git-cleanup.js \
446
- --execute \
447
- --remote \
448
- --yes \
449
- --fast-forward-main \
450
- --branches \
451
- --include "story-<storyId>"
452
- ```
453
-
454
- `--fast-forward-main` brings local `main` current (the next init seeds from
455
- it), `--branches` + `--include` reap only this Story's ref, and
456
- `--execute --remote --yes` run the deletes non-interactively. The sweep is
457
- idempotent and safe to run before `MERGED` confirms. Skip Step 6 only when
458
- the operator opted out via `--no-auto-merge` AND has not yet merged the PR —
459
- run the cleanup after the manual merge lands.
460
-
461
- > **Why local `main` goes stale + per-flag behaviour.** For the stale-`main`
462
- > mechanism and the full `--fast-forward-main` / `--branches` / `--include`
463
- > flag semantics, see
464
- > [`single-story-deliver-reference.md` § Step 6 — Local branch cleanup detail](single-story-deliver-reference.md#step-6--local-branch-cleanup-detail).
465
-
466
- ---
467
-
468
- ## Step 7 — Return contract (**required when dispatched as a sub-agent**) {#return-contract}
469
-
470
- When this workflow runs as a per-Story sub-agent (dispatched by `/deliver`
471
- via [`deliver-stories.md` § 2a/2c](deliver-stories.md)), the **only**
472
- acceptable way to end your turn is to **return a single terminal JSON status
473
- object** — never free-form prose:
474
-
475
- ```json
476
- {
477
- "storyId": <number>,
478
- "status": "done" | "blocked" | "failed",
479
- "phase": "init|implementing|closing|blocked|done",
480
- "branchDeleted": <boolean>,
481
- "blockerCommentId": <string|null>,
482
- "detail": "<one-liner: what changed + what was verified, e.g. PR #N merged>",
483
- "renderedBody": "<terminal Story body>"
484
- }
485
- ```
486
-
487
- This is the same envelope [`deliver-stories.md` § 2c](deliver-stories.md)
488
- mandates; this section is its single-homed restatement for the standalone
489
- worker so the contract is self-contained when this workflow is the entry
490
- point.
491
-
492
- There is **no fourth "pending" status** — the CI/auto-merge wait is handled
493
- internally by blocking on `pr-watch-with-update.js` (Step 4) and confirming
494
- the merge (Step 5). Return **only** on a confirmed `MERGED` PR (`status: "done"`),
495
- an `agent::blocked` transition (`status: "blocked"`), or an unrecoverable
496
- failure (`status: "failed"`).
497
-
498
- > **No-park rule + per-status contract + handoff discipline.** For the full
499
- > terminal-status contract (what each status requires), why a prose hand-off
500
- > with an unconfirmed merge is the very bug this workflow prevents, and the
501
- > report-state-not-process handoff discipline, see
502
- > [`single-story-deliver-reference.md` § Step 7 — Return-contract detail](single-story-deliver-reference.md#step-7--return-contract-detail).
503
-
504
- ---
505
-
506
- ## Idempotence
507
-
508
- - `single-story-init.js` re-prints the same `workCwd` without recreating
509
- the worktree when one already exists for `story-<id>`.
510
- - `single-story-close.js` short-circuits when the Story is already
511
- closed (returns `{ action: 'noop', reason: 'already-closed' }`).
512
- - `single-story-confirm-merge.js` short-circuits when the Story already
513
- carries `agent::done` or the issue is already closed (returns
514
- `{ action: 'noop', reason: 'already-done' }`), and is safe to re-run
515
- while the PR is still open (returns `{ action: 'pending', ... }` without
516
- mutating the Story).
517
- - The PR probe (`gh pr list --head <branch> --state open`) reuses an
518
- existing open PR rather than opening a duplicate.
519
-
520
- Re-running `/single-story-deliver` against an already-closed Story is
521
- safe.
522
-
523
- ---
524
-
525
- ## Constraints
526
-
527
- - **Never** push the Story branch directly to `main`. The PR is the only
528
- merge surface.
529
- - **Always** `cd` into the `workCwd` returned by Step 0 before editing,
530
- **and** prefix every path-based Edit/Write/Read with that absolute
531
- `workCwd` root — the `cd` alone does not scope the path-based tools (see
532
- Step 0.5). Editing a bare main-checkout path lands the change in the wrong
533
- tree; close's wrong-tree guard (Story #3364) aborts when it detects this.
534
- - **Handoff discipline — report state, not process.** When you hand back to
535
- your caller (the `/deliver` aggregator or the interactive operator),
536
- report essential terminal state only: the Story branch, the closing commit
537
- SHA, what changed, and what was verified. Mirror the fields the close
538
- pipeline already emits (`single-story-close.js` / `story-phase.js`
539
- envelopes, the `story-run-progress` snapshot) rather than inventing a new
540
- contract. Do not narrate the steps you took, and do not prescribe how the
541
- next stage should do its work. Prose process commentary only bloats the
542
- hydrated prompt (`delivery.maxTokenBudget` elision).
543
- - **Label transitions**: drive every `agent::*` state change through
544
- `node .agents/scripts/update-ticket-state.js --ticket <id> --state <state>`.
545
- This CLI is the authoritative mechanism — there is no separate
546
- state-mutation MCP server to degrade from (see
547
- [`.agents/instructions.md` § 1.D](../../instructions.md)).
548
-
549
- ---
550
-
551
- ## See also
552
-
553
- - [`/deliver`](deliver-stories.md) — several standalone Stories at
554
- once (dependency-aware waves).
555
- - [`/deliver`](deliver-epic.md) — full Epic wave loop.
556
- - [`single-story-deliver-reference.md`](single-story-deliver-reference.md) —
557
- lease, sweep, CI-recovery, and Status-column reference detail.