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
@@ -0,0 +1,606 @@
1
+ ---
2
+ description:
3
+ Execute one Story end-to-end. Creates story-<id> from main, implements in a
4
+ worktree (optional ## Slicing checkpoints), runs derived-level ceremony,
5
+ opens a PR against main, and lands.
6
+ ---
7
+
8
+ # /deliver-story #[Story ID]
9
+
10
+ > **Runtime core.** Always-ingested per-Story delivery path. Lease / sweep /
11
+ > CI-recovery detail lives in
12
+ > [`deliver-story-reference.md`](deliver-story-reference.md); consult on demand.
13
+ > Invoked by [`/deliver`](../deliver.md) for every Story (N=1 and N>1).
14
+
15
+ ## Overview
16
+
17
+ `/deliver-story` is the **one** delivery engine in v2. Every Story — trivial or
18
+ large — uses the same machinery:
19
+
20
+ ```text
21
+ /deliver <storyId> [<storyId> ...] (each Story runs through this engine)
22
+ → single-story-init.js (branch from main, worktree, agent::executing)
23
+ → agent implements + commits (optional ## Slicing intra-session checkpoints)
24
+ → derived-level ceremony (acceptance critics · review depth)
25
+ → single-story-close.js (gates, push, gh pr create → main, agent::closing)
26
+ → CI watch + fix loop (until required checks pass + PR merged)
27
+ → single-story-confirm-merge.js (PR merged → agent::done + follow-ups)
28
+ ```
29
+
30
+ | Trait | v2 `/deliver-story` |
31
+ | --- | --- |
32
+ | Ticket type | `type::story` only |
33
+ | Branch | `story-<id>` seeded from `project.baseBranch` (`main`) |
34
+ | Merge target | `main` via PR (squash + required checks) |
35
+ | Epic integration branch | **None** — no `epic/<id>`, no `--no-ff` wave merge |
36
+ | Spec / slices | Folded `## Spec` + optional `## Slicing` checkpoints in-session |
37
+ | Ceremony | Per-Story, routed off the derived change level via `ceremony-routing.js` |
38
+
39
+ If the Story still carries an `Epic: #N` reference, **stop** — that is a v1
40
+ Epic-attached ticket; re-plan as a v2 Story or finish it on a pre-v2 checkout.
41
+
42
+ ## Prerequisites
43
+
44
+ 1. A GitHub Issue with the `type::story` label and **no** `Epic: #N`
45
+ reference in its body.
46
+ 2. `GITHUB_TOKEN` or `gh auth status` clean — `gh pr create` runs at close.
47
+ 3. The base branch (`project.baseBranch`, default `main`) exists on
48
+ both local and `origin`.
49
+
50
+ ---
51
+
52
+ ## Step 0 — Initialize (`single-story-init.js`)
53
+
54
+ Run from the **main checkout** (the worktree does not exist yet):
55
+
56
+ ```bash
57
+ node .agents/scripts/single-story-init.js --story <storyId>
58
+ ```
59
+
60
+ Flags: `--dry-run` (no git/ticket mutation), `--steal` (forcibly transfer a
61
+ foreign Story lease to this operator — see the lease note below).
62
+
63
+ > **Execution mode.** `single-story-init.js` can take 3–6 minutes when the
64
+ > worktree's per-tree install runs. Invoke synchronously with
65
+ > `Bash(timeout: 600000)`. Do **not** use `run_in_background` + `Monitor` —
66
+ > a sub-agent that exits mid-install leaves the worktree half-bootstrapped.
67
+
68
+ The script validates `type::story`, **acquires the Story lease**, fetches
69
+ `origin`, seeds `story-<id>` from `baseBranch`, materializes a worktree
70
+ (when `delivery.worktreeIsolation.enabled` is true), upserts a
71
+ `story-init` structured comment carrying `standalone: true`, and flips
72
+ the Story to `agent::executing`. It also reuses an existing `story-<id>`
73
+ branch (idempotent re-init) and runs a **merged-`story-*` sweep** between
74
+ fetch and branch-seed.
75
+
76
+ > **Lease preflight, branch reuse, and merged-sweep.** The standalone lease
77
+ > **fails closed** on a foreign assignee (there is no Epic-scoped
78
+ > heartbeat ledger to judge staleness) — coordinate or pass `--steal`. The
79
+ > sweep is guarded (per-candidate protection + cross-session lock) and
80
+ > never blocks init. See
81
+ > [`deliver-story-reference.md` § Step 0 — Lease preflight and merged-sweep](deliver-story-reference.md#step-0--lease-preflight-and-merged-sweep)
82
+ > for the fail-closed outcomes, the `--steal` contract, and the sweep
83
+ > hardening layers.
84
+
85
+ Capture `workCwd` from the result envelope. Add `--dry-run` to inspect
86
+ the planned actions without git or ticket mutations (dry-run also skips
87
+ the lease and the sweep).
88
+
89
+ **Remote evidence — land or block (issue #4483).** The envelope also
90
+ carries `remoteVerified` + `remoteProbe` (`git remote get-url origin` +
91
+ bounded `git ls-remote origin HEAD`). When `remoteVerified` is `false`,
92
+ transition the Story to `agent::blocked` quoting `remoteProbe.detail` and
93
+ stop. Implementing the Story inline outside the worktree/branch/PR path
94
+ and/or committing it to local `main` is expressly forbidden — the close
95
+ pipeline's push is the only sanctioned landing.
96
+
97
+ ### Step 0.5 — `cd` into the workCwd
98
+
99
+ ```bash
100
+ cd "<workCwd from Step 0 result>"
101
+ ```
102
+
103
+ All subsequent commands run from this directory.
104
+
105
+ > **Worktree scope is not just the Bash cwd.** `cd <workCwd>` steers the
106
+ > Bash tool's cwd but does **not** scope the path-based Edit/Write/Read
107
+ > tools — you MUST prefix every such path with the absolute `workCwd` root or
108
+ > risk silently editing the main checkout. Close's wrong-tree guard (Story
109
+ > #3364) is a backstop, not a substitute. See
110
+ > [`deliver-story-reference.md` § Worktree scope is not just the Bash cwd](deliver-story-reference.md#worktree-scope-is-not-just-the-bash-cwd).
111
+
112
+ ---
113
+
114
+ ## Step 1 — Implementation
115
+
116
+ A Story is **atomic** — one `story-<id>` branch, one PR to `main`. Work
117
+ happens in one or more commits against the inline `acceptance[]` /
118
+ `verify[]` arrays (and the folded `## Spec` when present).
119
+
120
+ Operator/agent responsibilities while in the worktree:
121
+
122
+ 1. Read the Story body. Treat its acceptance criteria as the contract.
123
+
124
+ **Docs context — digest-first.** Read a full doc only when the Story's
125
+ own context points you at one — do not ingest the whole
126
+ `project.docsContextFiles` set up front. If the caller provides a
127
+ `docsDigestPath`, prefer that compact outline and pull individual files
128
+ on demand. See [`.agents/instructions.md` § 3](../../instructions.md).
129
+
130
+ **Write-time audit checklists.** When the caller provides a
131
+ `checklistPath` (footprint-matched **local**-lens authoring checklists),
132
+ read it before you write and self-check as you author. When absent,
133
+ lens-aware coverage still runs maker-blind at Story-scope review inside
134
+ the close subprocess.
135
+ 2. Implement the changes. When the body has a `## Slicing` / Delivery
136
+ Slicing table, walk rows as **intra-session checkpoints** (commit +
137
+ flip each row when done) — never as sibling tickets.
138
+ 3. Commit on the Story branch. Conventional-commit format is encouraged
139
+ but not enforced — the PR title carries the canonical summary.
140
+ 4. Iterate (read tests, run targeted gates, edit, commit) until the
141
+ acceptance criteria are met.
142
+ 5. Run the **bounded acceptance self-eval loop** (Step 1a below) before
143
+ ceremony / close.
144
+
145
+ Recommended quick gates while iterating (each is fast enough to run on
146
+ save):
147
+
148
+ ```bash
149
+ npm run typecheck
150
+ npm run lint
151
+ npm test -- --grep "<scope>"
152
+ ```
153
+
154
+ The full close-validation chain runs in Step 3; the gates above are
155
+ advisory pre-flight.
156
+
157
+ > Conflict with `main` mid-implementation → resolve as you would any
158
+ > branch rebase. There is no `epic/<id>` intermediate, so the rebase
159
+ > base is `main` directly.
160
+
161
+ ### Step 1a — Bounded acceptance self-eval loop (**required, not optional**)
162
+
163
+ After the implementation commits land and **before** you proceed to close, run
164
+ the bounded acceptance self-eval loop. The per-round critic mechanic (fresh-
165
+ context critic, `verify[]`-as-evidence, the verdict schema, and the
166
+ proceed / redraft / block decision) is the single-homed include
167
+ [`acceptance-self-eval.md`](acceptance-self-eval.md) — read it and follow it.
168
+
169
+ Story-path specifics:
170
+
171
+ - **Critic evidence-share** (Story #4250). When the critic runs a `verify[]`
172
+ command that is byte-identical to a close gate (`lint` / `typecheck`), it
173
+ records the pass into the Story evidence keyspace via `--standalone` so
174
+ Step 3's close short-circuits the gate at unchanged HEAD. Run it in the
175
+ **Story worktree** (`workCwd` from Step 0):
176
+
177
+ ```bash
178
+ node <main-repo>/.agents/scripts/evidence-gate.js \
179
+ --standalone --scope-id <storyId> --gate lint \
180
+ --worktree <workCwd> -- npm run lint
181
+ ```
182
+
183
+ - **Gate invocation** (omit `--epic`):
184
+
185
+ ```bash
186
+ node <main-repo>/.agents/scripts/acceptance-eval.js \
187
+ --story <storyId> --verdict <verdict-path>
188
+ ```
189
+
190
+ - **On `decision: "proceed"`** → proceed to Step 2 (ceremony) then Step 3.
191
+ - **On `decision: "block"`** → **do not proceed to close.** Post a `friction`
192
+ comment naming the unmet criteria, then transition the Story to
193
+ `agent::blocked`:
194
+
195
+ ```bash
196
+ node .agents/scripts/diagnose-friction.js --story <storyId> \
197
+ --cmd node .agents/scripts/acceptance-eval.js --story <storyId> --verdict <verdict-path>
198
+ node .agents/scripts/update-ticket-state.js --ticket <storyId> --state agent::blocked
199
+ ```
200
+
201
+ ---
202
+
203
+ ## Step 2 — Ceremony (profile + derived level)
204
+
205
+ Per-Story ceremony is selected by `delivery.routing.ceremonyProfile`
206
+ (`minimal` | `standard` | `strict`, default `standard`) and the Story's
207
+ **derived change level** — not a planner-authored verdict (Story #4542 retired
208
+ that). Derive the level with
209
+ [`deriveChangeLevel`](../../scripts/lib/orchestration/review-depth.js) over the
210
+ Story's changed files (`git diff --name-only main...story-<id>`): a diff
211
+ touching a sensitive path registered in `.agents/schemas/audit-rules.json`
212
+ derives `high`, one touching none derives `low`, and an unenumerable diff
213
+ derives `null`.
214
+
215
+ Resolve fresh-vs-inline acceptance critics per AC-cluster with
216
+ [`resolveCeremonyForRisk`](../../scripts/lib/orchestration/ceremony-routing.js)
217
+ (`minimal` → always inline; `strict` → always fresh; `standard` →
218
+ `high`/`null` → `fresh`, `low` → `inline` unless the `freshCriticSampleRate`
219
+ floor forces `fresh`). Review depth reads the same derived level via
220
+ `review-depth.js` inside close, so the two decisions cannot disagree.
221
+
222
+ Hard gates (lint / test / format / coverage / CRAP / maintainability) always
223
+ run in Step 3 — the derived level never disables them. Do **not** pre-run the
224
+ full close-validation chain here unless interactively iterating on a fix.
225
+
226
+ ---
227
+
228
+ ## Step 3 — Close and land (`single-story-close.js`)
229
+
230
+ Invoke from the main checkout (or pass `--cwd <main-repo>` from inside
231
+ the worktree):
232
+
233
+ ```bash
234
+ node <main-repo>/.agents/scripts/single-story-close.js --story <storyId> --cwd <main-repo>
235
+ ```
236
+
237
+ **This step is the whole delivery tail.** Close owns the gates, the PR, the
238
+ merge wait, the `agent::done` flip, and the post-land tail (follow-up
239
+ capture, status-column resync, local ref cleanup, base fast-forward) in one
240
+ process. Your job is to run it and **branch on the terminal envelope's
241
+ `status`** — nothing more (Story #4543).
242
+
243
+ ### Branch on the terminal envelope
244
+
245
+ Every invocation emits exactly one schema-validated envelope
246
+ ([`story-deliver-terminal.schema.json`](../../schemas/story-deliver-terminal.schema.json))
247
+ between `--- STORY DELIVER TERMINAL ---` markers, and the exit code mirrors
248
+ its `status`:
249
+
250
+ | `status` | Exit | What it means | What you do |
251
+ | --- | --- | --- | --- |
252
+ | `landed` | 0 | PR merged, Story `agent::done`, tail ran. `tail.*` booleans expose any partial degradation — a `false` there does **not** demote the land. | Go to Step 7 and relay the envelope. Nothing else. |
253
+ | `pending` | 3 | **Resumable, not a failure.** The per-invocation merge wait expired with the PR healthy and in flight, or the operator owns the merge. No label was mutated; no `merge.unlanded` was emitted. | Run the envelope's `nextCommand`. Repeat until it resolves. Relay `pending` only once you have exhausted your own budget. |
254
+ | `blocked` | 1 | A classified hard block. Story carries `agent::blocked`; `blocked.blockClass` names the class and `blocked.frictionCommentId` points at the remediation. | `checks-failed` → fix the red check and push (Step 4). Otherwise go to Step 7 and relay the envelope. |
255
+ | `failed` | 1 | A phase crashed; `phase` names which. | Diagnose, fix, re-run close. |
256
+
257
+ Do **not** re-sequence the post-close steps by hand. Steps 4–6 below are
258
+ **recovery-only** — reached from a `blocked`/`pending` envelope, never as
259
+ routine choreography.
260
+
261
+ ### What close does internally
262
+
263
+ The script runs the close-validation gates against `baseBranch`, syncs the
264
+ Story branch from `origin/<baseBranch>` (Story #2580 — the parallel-race
265
+ defence), pushes `story-<id>`, opens (or reuses) a PR against `baseBranch`
266
+ with a `Closes #<storyId>` footer, enables GitHub native auto-merge
267
+ (`--auto --squash --delete-branch`) **when `delivery.ci.autoMerge` is
268
+ `"trust-ci"` (the default)**, flips the Story to `agent::closing`, reaps the
269
+ worktree, releases the lease, then **waits for the merge** and — on a
270
+ confirmed merge — flips `agent::done` and runs the post-land tail.
271
+
272
+ ### The merge wait is bounded and resumable
273
+
274
+ Two budgets, deliberately separate (`delivery.mergeWatch.*`):
275
+
276
+ - **`maxWaitSeconds`** (default 300) bounds **one invocation**, sized to fit
277
+ inside a single host tool invocation (~10 min ceiling) alongside the gates
278
+ that precede it. Expiry → `pending`. Pass `--max-wait-seconds <n>` to raise
279
+ it when your host has no such ceiling and you want to land in one block.
280
+ - **`maxBudgetSeconds`** (default 3600) bounds the **cumulative** wait across
281
+ resumes, anchored at the PR's `createdAt` so resuming does not restart the
282
+ clock. Exhausting *this* is the genuine give-up → `blocked`.
283
+
284
+ The wait probes the checks every poll: a red required check fails fast as
285
+ `checks-failed` instead of burning the budget, and a PR that falls behind its
286
+ base is brought up to date within `updateAttempts` tries.
287
+
288
+ > **`delivery.ci.autoMerge` policy.** Under the default `"trust-ci"`, GitHub
289
+ > native auto-merge is armed and the PR squash-merges once its **required**
290
+ > checks pass. Under `"strict"`, the close **does not arm auto-merge** — the
291
+ > PR opens and waits for an **operator merge**, exactly as `--no-auto-merge`
292
+ > does per-run.
293
+
294
+ Flags:
295
+
296
+ - `--skip-validation` — bypass the gates (Step 1). Use only when re-running
297
+ close after a fixed gate failure that's already known to pass.
298
+ - `--skip-sync` — bypass the base-sync (Story #2580). Use only after a
299
+ hand-resolved sync, or in tests.
300
+ - `--no-auto-merge` — disable auto-merge. Use when the PR materially changes
301
+ behaviour and warrants a pre-merge eyeball; the operator then merges via
302
+ the GitHub UI.
303
+ - `--wait-merge` — **close-and-land** (Story #4428). Forces close to poll
304
+ the armed PR to merge confirmation and flip `agent::done` itself. When
305
+ neither land flag is passed, close defaults from
306
+ `delivery.routing.closeAndLand` (**true**): attended and headless delivers
307
+ share the land-in-one-close happy path.
308
+ - `--no-wait-merge` — explicit opt-out that always wins. Use when the
309
+ operator wants the PR left at `agent::closing` for a human land (or a
310
+ wrapper that will invoke `single-story-confirm-merge.js` itself). Reports
311
+ `pending` — the work is not done, nothing is broken, and one named command
312
+ finishes it.
313
+ - `--max-wait-seconds <n>` — raise the merge wait's per-invocation bound for
314
+ this run (Story #4543). Use from a headless caller with no host
315
+ tool-invocation ceiling to keep single-block semantics without editing the
316
+ consumer's config.
317
+
318
+ > **Full close pipeline (base-sync outcomes, `agent::closing` rationale,
319
+ > lease release).** For the numbered close pipeline, the base-sync outcome
320
+ > table (no-op / conflict → `agent::blocked` / fetch-failed), and why the
321
+ > issue stays OPEN at `agent::closing`, see
322
+ > [`deliver-story-reference.md` § Step 3 — Close pipeline detail](deliver-story-reference.md#step-3--close-pipeline-detail).
323
+
324
+ ---
325
+
326
+ ## Step 4 — CI fix loop (**recovery-only**)
327
+
328
+ > **Steps 4, 5, 5.5, and 6 are recovery paths, not routine choreography
329
+ > (Story #4543).** On the default path Step 3 already polled the PR to a
330
+ > confirmed merge, flipped `agent::done`, and ran the whole post-land tail —
331
+ > follow-up capture, status resync, ref cleanup, base fast-forward — in one
332
+ > process. A `landed` envelope means all of it ran; go straight to Step 7.
333
+ >
334
+ > Enter this step **only** when Step 3 returned `blocked` with
335
+ > `blockClass: "checks-failed"` (a required check went red), or when a
336
+ > `--no-wait-merge` run left the PR for you to shepherd.
337
+
338
+ When a required check is red, the agent owns the green-CI outcome, not just
339
+ the push. Local close-validation gates pass on the dev host's environment;
340
+ CI runs on a different OS and concurrency, and coverage rounding,
341
+ platform-conditional branches, and timing-sensitive tests routinely drift
342
+ between the two.
343
+
344
+ Fix the failure and push a new commit on `story-<storyId>` — auto-merge stays
345
+ armed across retries, so you do not re-arm — then resume the land with the
346
+ envelope's `nextCommand`.
347
+
348
+ > **A watch is an internally-blocking step, not a reason to end your turn.**
349
+ > `pr-watch-with-update.js` blocks the current turn until CI resolves — that
350
+ > IS how you wait. Ending the turn with prose and an unconfirmed merge is a
351
+ > contract violation (the Story #1553 / PR #1554 failure mode). See
352
+ > [`deliver-story-reference.md` § The auto-merge wait is an internally-blocking step](deliver-story-reference.md#the-auto-merge-wait-is-an-internally-blocking-step).
353
+
354
+ To watch the checks on the red path, drive
355
+ `pr-watch-with-update.js` — the **single CI-watch mechanism**
356
+ (Story #4358). It polls the required checks to a
357
+ terminal state and auto-recovers from `mergeStateStatus: BEHIND`; do
358
+ **not** fall back to a bare `gh pr checks` watch invocation:
359
+
360
+ ```bash
361
+ node <agentRoot>/scripts/pr-watch-with-update.js --pr <prNumber> --story <storyId>
362
+ ```
363
+
364
+ `--story` is what keys the red-path CI digest
365
+ (`temp/story-<id>-ci-digest.{json,md}` — failing check name, run id, and a
366
+ `gh run view --log-failed` tail). Omit it and a red check writes no digest.
367
+
368
+ Poll cadence and caps come from `delivery.ci.watch.*`
369
+ (`pollIntervalMs`, `maxPolls`, `maxResumes`); pass `--poll-interval-ms`,
370
+ `--max-polls`, or `--max-resumes` to override for one run.
371
+
372
+ When the watch exits, branch on the exit code:
373
+
374
+ - **Exit 0 (all checks ✓)** — auto-merge will fire (or has already). The
375
+ Story is still at `agent::closing` with its issue OPEN. **Proceed to
376
+ Step 5 within the same turn** — green CI is the *start* of the
377
+ merge-confirm sequence, not a terminal state.
378
+ - **Exit 1 (a check genuinely failed)** — diagnose, fix, and push a new
379
+ commit on `story-<storyId>`, then re-watch. Auto-merge stays enabled
380
+ across retries; no need to re-arm it. The Story stays at
381
+ `agent::closing` throughout, so a failed/abandoned PR never strands a
382
+ CLOSED issue. If the same failure class recurs, hand convergence off to a
383
+ self-paced host loop (`/loop`) that re-runs the failing check and applies
384
+ the smallest fix until it exits green.
385
+ - **Exit 2 (still-running — slow CI, not red)** — the poll cap fired with
386
+ checks still pending and the watcher exhausted its resume budget with
387
+ nothing red. This is **never** a failure. Hand the wait off to the
388
+ host's interval loop rather than ending your turn: `/loop 5m` polling
389
+ `gh pr checks` until the checks settle.
390
+
391
+ > **Triage authority.** How to classify and remediate a red (or repeatedly
392
+ > slow) check — the root-cause-only decision tree for infra/transient and
393
+ > flaky failures (reproduce → check `main` → bisect env vs code → fix in-scope
394
+ > or file a `meta::framework-gap` issue), the never-rerun / never-quarantine
395
+ > prohibitions, and the escalation criteria (three-strikes, the 30-minute
396
+ > wall-clock timebox, and the clearly-environmental fast path) — is defined
397
+ > once in [`.agents/rules/ci-remediation.md`](../../rules/ci-remediation.md).
398
+ > Read it before remediating a red check above.
399
+ >
400
+ > **CI recovery procedures.** For resurrecting the worktree after
401
+ > `reapOnSuccess`, pulling the failing job log, fixing coverage/CRAP
402
+ > baselines without re-running close-validation, and the when-to-stop
403
+ > Anti-Thrashing rules, see
404
+ > [`deliver-story-reference.md` § Step 4 — CI watch + fix recovery](deliver-story-reference.md#step-4--ci-watch--fix-recovery).
405
+
406
+ ---
407
+
408
+ ## Step 5 — Merge confirmation + land tail (**recovery-only**)
409
+
410
+ > On the default path Step 3 already did this. Run it only to resume a
411
+ > `pending` envelope, to finish a `--no-wait-merge` run, or to rescue a
412
+ > merged-but-mislabelled Story.
413
+
414
+ ```bash
415
+ node .agents/scripts/single-story-confirm-merge.js --story <storyId> --cwd <main-repo>
416
+ ```
417
+
418
+ This is the **same** shared land path Step 3 reaches: it flips
419
+ `agent::closing → agent::done` on a confirmed merge (closing the issue) and
420
+ runs the **same** post-land tail — so the two surfaces cannot diverge. It is
421
+ idempotent, emits the same terminal envelope, and is safe to re-run while
422
+ the PR is still open (returns `pending`).
423
+
424
+ > **Confirmation outcomes.** `single-story-confirm-merge.js` re-reads the
425
+ > live PR state and flips to `agent::done` only on a confirmed `MERGED` PR;
426
+ > it is idempotent and safe to re-run while the PR is still open (returns
427
+ > `pending`). See
428
+ > [`deliver-story-reference.md` § Step 5 — Merge confirmation detail](deliver-story-reference.md#step-5--merge-confirmation-detail).
429
+
430
+ ---
431
+
432
+ ## Step 5.5 — Re-assert Status column (**recovery-only**)
433
+
434
+ > **The land tail already ran this** (Story #4543) — it is `tail.statusResync`
435
+ > in the terminal envelope. Run it by hand only when that step reported
436
+ > `false`, or after a manual merge on a `--no-wait-merge` run.
437
+
438
+ GitHub Projects v2 built-in workflows fire minutes *after* auto-merge lands
439
+ and clobber the `Done` Status the confirm step set, stranding closed
440
+ Stories at `In Progress` on the board (reproduced on Story #2813).
441
+ Re-assert authority:
442
+
443
+ ```bash
444
+ node .agents/scripts/resync-status-column.js --story <storyId>
445
+ ```
446
+
447
+ The helper re-fires the `ColumnSync` mutation and **polls for ~15 s** to win
448
+ the race against the bot's late write (Story #2876). It is idempotent and
449
+ no-op-safe (`no-project` / `not-on-project` exit 0).
450
+
451
+ > **Status-column detail + tuning flags + operator fix.** For the poll-loop
452
+ > flags (`--poll-attempts`, `--poll-delay-ms`), the `attempts` / `drifted`
453
+ > envelope semantics, and the canonical
454
+ > `--reap-conflicting-workflows` operator fix, see
455
+ > [`deliver-story-reference.md` § Step 5.5 — Re-assert Status column detail](deliver-story-reference.md#step-55--re-assert-status-column-detail).
456
+
457
+ ---
458
+
459
+ ## Step 6 — Local branch cleanup (**recovery-only**)
460
+
461
+ > **The land tail already ran this** (Story #4543) — it is `tail.refCleanup`
462
+ > and `tail.baseFastForward` in the terminal envelope, done in-process
463
+ > against the same planners this command drives. Run it by hand only when
464
+ > either step reported `false` (a dirty shared checkout is the common,
465
+ > benign cause), or after a manual merge on a `--no-wait-merge` run.
466
+
467
+ GitHub deletes the **remote** branch on auto-merge, but the **local**
468
+ `story-<storyId>` ref lingers in the main checkout until something prunes
469
+ it. To prune the story ref **and** fast-forward local `main` (or
470
+ `project.baseBranch`):
471
+
472
+ ```bash
473
+ node .agents/scripts/git-cleanup.js \
474
+ --execute \
475
+ --remote \
476
+ --yes \
477
+ --fast-forward-main \
478
+ --branches \
479
+ --include "story-<storyId>"
480
+ ```
481
+
482
+ `--fast-forward-main` brings local `main` current (the next init seeds from
483
+ it), `--branches` + `--include` reap only this Story's ref, and
484
+ `--execute --remote --yes` run the deletes non-interactively. The sweep is
485
+ idempotent and safe to run before `MERGED` confirms. Skip Step 6 only when
486
+ the operator opted out via `--no-auto-merge` AND has not yet merged the PR —
487
+ run the cleanup after the manual merge lands.
488
+
489
+ > **Why local `main` goes stale + per-flag behaviour.** For the stale-`main`
490
+ > mechanism and the full `--fast-forward-main` / `--branches` / `--include`
491
+ > flag semantics, see
492
+ > [`deliver-story-reference.md` § Step 6 — Local branch cleanup detail](deliver-story-reference.md#step-6--local-branch-cleanup-detail).
493
+
494
+ ---
495
+
496
+ ## Step 7 — Return contract (**required when dispatched as a sub-agent**) {#return-contract}
497
+
498
+ The return contract is the shipped schema
499
+ [`story-deliver-terminal.schema.json`](../../schemas/story-deliver-terminal.schema.json)
500
+ — **the single source of truth for every field, and the only place they are
501
+ defined** (Story #4543). Do not restate its fields here or anywhere else:
502
+ this section and
503
+ [`agents/story-worker.md`](../../agents/story-worker.md) each used to define
504
+ their own divergent shape, neither validated by anything, which is exactly
505
+ how they drifted apart.
506
+
507
+ When this workflow runs as a per-Story sub-agent (dispatched by
508
+ [`/deliver`](../deliver.md)), the **only** acceptable way to end your turn is
509
+ to return a single terminal JSON object conforming to that schema — never
510
+ free-form prose. `single-story-close.js` already emits a validated one
511
+ between its `--- STORY DELIVER TERMINAL ---` markers; **relay that envelope**
512
+ rather than composing a new object by hand.
513
+
514
+ Its `status` is one of exactly four values, and the no-park rule follows
515
+ directly from them:
516
+
517
+ - `landed` — the PR merged, the Story is `agent::done`, and the tail was
518
+ attempted. Terminal; you are done.
519
+ - `pending` — **resumable**, and the only sanctioned way to end a turn
520
+ without a merge. It carries the `nextCommand` that resumes it. Return this
521
+ only when you have exhausted your own budget, not as a way to avoid
522
+ waiting: the wait is internally blocking (Step 4).
523
+ - `blocked` — the Story carries `agent::blocked` and `blocked.blockClass`
524
+ names the class.
525
+ - `failed` — a phase crashed; `phase` names it.
526
+
527
+ Ending the turn with prose and an unconfirmed merge is a contract violation
528
+ (the Story #1553 / PR #1554 failure mode).
529
+
530
+ > **No-park rule + handoff discipline.** For why a prose hand-off with an
531
+ > unconfirmed merge is the very bug this workflow prevents, and the
532
+ > report-state-not-process handoff discipline, see
533
+ > [`deliver-story-reference.md` § Step 7 — Return-contract detail](deliver-story-reference.md#step-7--return-contract-detail).
534
+
535
+ ---
536
+
537
+ ## Recovering a stranded Story {#recover}
538
+
539
+ When a Story is in an unclear state — a killed run, a `pending` envelope you
540
+ no longer have, a Story a `/deliver` re-run refuses — do not guess and do not
541
+ re-run the pipeline hoping it converges. Probe it:
542
+
543
+ ```bash
544
+ node .agents/scripts/deliver-recover.js --story <storyId>
545
+ ```
546
+
547
+ It is **read-only**: it probes the labels, lease, branch, worktree, and PR
548
+ (state + checks), then prints the **one** next command with the evidence it
549
+ was derived from — never a menu.
550
+
551
+ It is the only automated way out of the **merged-but-label-stale** strand: a
552
+ `/deliver` re-run refuses that Story outright, because `single-story-init.js`
553
+ hard-errors on an already-closed one.
554
+
555
+ ---
556
+
557
+ ## Idempotence
558
+
559
+ - `single-story-init.js` re-prints the same `workCwd` without recreating
560
+ the worktree when one already exists for `story-<id>`.
561
+ - `single-story-close.js` short-circuits when the Story is already
562
+ closed (returns `{ action: 'noop', reason: 'already-closed' }`).
563
+ - `single-story-confirm-merge.js` short-circuits when the Story already
564
+ carries `agent::done` or the issue is already closed (returns
565
+ `{ action: 'noop', reason: 'already-done' }`), and is safe to re-run
566
+ while the PR is still open (returns `{ action: 'pending', ... }` without
567
+ mutating the Story).
568
+ - The PR probe (`gh pr list --head <branch> --state open`) reuses an
569
+ existing open PR rather than opening a duplicate.
570
+
571
+ Re-running `/deliver-story` against an already-closed Story is
572
+ safe.
573
+
574
+ ---
575
+
576
+ ## Constraints
577
+
578
+ - **Never** push the Story branch directly to `main`. The PR is the only
579
+ merge surface.
580
+ - **Always** `cd` into the `workCwd` returned by Step 0 before editing,
581
+ **and** prefix every path-based Edit/Write/Read with that absolute
582
+ `workCwd` root — the `cd` alone does not scope the path-based tools (see
583
+ Step 0.5). Editing a bare main-checkout path lands the change in the wrong
584
+ tree; close's wrong-tree guard (Story #3364) aborts when it detects this.
585
+ - **Handoff discipline — report state, not process.** When you hand back to
586
+ your caller (the `/deliver` aggregator or the interactive operator),
587
+ report essential terminal state only: the Story branch, the closing commit
588
+ SHA, what changed, and what was verified. Mirror the fields the close
589
+ pipeline already emits (the `single-story-close.js` terminal envelope)
590
+ rather than inventing a new contract. Do not narrate the steps you took, and do not prescribe how the
591
+ next stage should do its work. Prose process commentary only bloats the
592
+ hydrated prompt.
593
+ - **Label transitions**: drive every `agent::*` state change through
594
+ `node .agents/scripts/update-ticket-state.js --ticket <id> --state <state>`.
595
+ This CLI is the authoritative mechanism — there is no separate
596
+ state-mutation MCP server to degrade from (see
597
+ [`.agents/instructions.md` § 1.D](../../instructions.md)).
598
+
599
+ ---
600
+
601
+ ## See also
602
+
603
+ - [`/deliver`](../deliver.md) — unified entry point (`<storyId...>`;
604
+ sequences via `depends_on`, resolved from live state).
605
+ - [`deliver-story-reference.md`](deliver-story-reference.md) —
606
+ lease, sweep, CI-recovery, and Status-column reference detail.
@@ -9,7 +9,7 @@ description: >-
9
9
 
10
10
  > **Helper, not a slash command.** Files under `workflows/helpers/` are not
11
11
  > projected into the mandrel plugin command tree. The same `lib/checks/` registry runs
12
- > automatically as preflight inside `/deliver`, `/story-close`, and
12
+ > automatically as preflight inside `/deliver`, `single-story-close`, and
13
13
  > `npm test` — this viewer exists only for ad-hoc inspection. Invoke the
14
14
  > backing script directly: `node .agents/scripts/diagnose.js [args]`.
15
15
 
@@ -18,8 +18,8 @@ description: >-
18
18
  `diagnose.js` runs the checks registry assembled under
19
19
  `.agents/scripts/lib/checks/` in read-only mode and surfaces every
20
20
  finding declared on the requested scope. It is the operator-facing read
21
- of the same registry that preflight guards (`epic-deliver`,
22
- `story-close`), the retro hook, and `npm test` consult — but with
21
+ of the same registry that preflight guards (`/deliver`,
22
+ `single-story-close`), the retro hook, and `npm test` consult — but with
23
23
  `autoFix: false` always, no remote GitHub writes, and no commits.
24
24
 
25
25
  It is distinct from `diagnose-friction.js` (the per-Task signal capture
@@ -37,7 +37,7 @@ node .agents/scripts/diagnose.js [--scope <scope>] [--fail-on-blocker] [--json]
37
37
 
38
38
  | Flag | Default | Description |
39
39
  | -------------------- | ------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
40
- | `--scope <s>` | `diagnose` | Filter checks by declared scope. Use `all` to disable the filter and run every registered check. Other surface scopes (`epic-deliver`, `story-close`, `retro`) are accepted verbatim — checks whose `scope[]` includes the value will fire. |
40
+ | `--scope <s>` | `diagnose` | Filter checks by declared scope. Use `all` to disable the filter and run every registered check. Other surface scopes (`deliver`, `single-story-close`, `retro`) are accepted verbatim — checks whose `scope[]` includes the value will fire. |
41
41
  | `--fail-on-blocker` | off | Exit `2` when at least one finding has `severity === 'blocker'`. Without this flag the command always exits `0` even when blockers are present (it is by default an advisory read). |
42
42
  | `--json` | off | Emit a single line of JSON shaped as `{ scope, findings: [...] }` to stdout in place of the human table. Findings preserve the registry's `Finding` shape (id, severity, scope, summary, fixCommand, detail?, autoCorrectable). |
43
43
 
@@ -59,7 +59,7 @@ node .agents/scripts/diagnose.js
59
59
  node .agents/scripts/diagnose.js --scope all --json
60
60
 
61
61
  # Use inside a preflight script that should block on a blocker.
62
- node .agents/scripts/diagnose.js --scope story-close --fail-on-blocker
62
+ node .agents/scripts/diagnose.js --scope single-story-close --fail-on-blocker
63
63
  ```
64
64
 
65
65
  ## Output shape
@@ -80,12 +80,12 @@ Exactly one line. Schema:
80
80
  "scope": "diagnose",
81
81
  "findings": [
82
82
  {
83
- "id": "stale-origin-epic",
83
+ "id": "stale-origin-main",
84
84
  "severity": "blocker",
85
- "scope": "story-close",
86
- "summary": "Local epic/<id> is ahead of origin/epic/<id>",
87
- "detail": "Push the epic branch before re-running story-close.",
88
- "fixCommand": "git push origin epic/<id>",
85
+ "scope": "single-story-close",
86
+ "summary": "Local main is behind origin/main",
87
+ "detail": "Fast-forward main before re-running single-story-close.",
88
+ "fixCommand": "git fetch origin main; git merge --ff-only origin/main",
89
89
  "autoCorrectable": false
90
90
  }
91
91
  ]