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,50 +1,54 @@
1
1
  ---
2
2
  description: >-
3
- Perform a comprehensive code review of a change set scoped to either a Story
4
- branch or an Epic branch
3
+ Perform a comprehensive code review of a Story change set against main
4
+ before `/deliver` opens or merges the Story PR
5
5
  ---
6
6
 
7
7
  # Code Review (helper)
8
8
 
9
9
  > **Helper module.** Not a slash command. Invoked automatically from
10
- > `/deliver` (Story scope) and `/deliver` Phase 5 (Epic scope).
11
- > To run a review directly, invoke the parent workflow — operators do not
12
- > call this helper by hand.
10
+ > `/deliver` via `single-story-close.js`. To run a review directly, invoke
11
+ > the parent workflow — operators do not call this helper by hand.
13
12
 
14
13
  This helper performs a comprehensive code review of a change set before it
15
- is merged upstream. It runs in two scopes:
14
+ is merged to `main`. The live v2 path is **Story scope only**:
16
15
 
17
- - **Story scope** — reviews the diff between a Story branch and its parent
18
- Epic branch, before `story-close.js` merges the Story into the Epic.
19
- - **Epic scope** reviews the cumulative diff between an Epic branch and
20
- `main`, before `/deliver` opens the integration pull request.
16
+ - **Story scope** — reviews `main...story-<storyId>` (or
17
+ `project.baseBranch...story-<storyId>`) inside `single-story-close.js`
18
+ after the PR opens and before auto-merge. Findings post to the PR;
19
+ critical findings block close (`agent::blocked`).
20
+
21
+ Legacy `scope: epic` / Epic-branch review procedure (including
22
+ `epic-audit-prepare.js` / `epic-audit-recheck.js`) was removed with the
23
+ v2 Story-only cutover.
21
24
 
22
25
  **Invariant — Story-scope review runs outside the maker's LLM context.**
23
- The Story-scope review executes inside the `story-close.js` /
24
- `single-story-close.js` close subprocess, **not** in the delivering
25
- child's (maker agent's) LLM context. The close pipeline invokes it after
26
- the delivering child has exited, so the change set is reviewed by a
27
- process the maker cannot influence. The enforcing code path is
28
- [`.agents/scripts/lib/orchestration/story-close/phases/code-review.js`](../../scripts/lib/orchestration/story-close/phases/code-review.js)
29
- (invoked from `runStoryCloseLocked`; both close entry points reach it
30
- through the shared `runStoryReviewCore` spine). A future refactor MUST
31
- preserve this isolation: do not move Story-scope review into the maker's
32
- context or run it as a step of the delivering child.
26
+ The Story-scope review executes inside the `single-story-close.js` close
27
+ subprocess, **not** in the delivering child's (maker agent's) LLM context.
28
+ The close pipeline invokes it after the delivering child has exited, so
29
+ the change set is reviewed by a process the maker cannot influence. The
30
+ enforcing code path is
31
+ [`runStoryScopeReview`](../../scripts/lib/orchestration/single-story-close/phases/code-review.js)
32
+ shared
33
+ [`runStoryReviewCore`](../../scripts/lib/orchestration/story-close/phases/code-review.js).
34
+ A future refactor MUST preserve this isolation: do not move Story-scope
35
+ review into the maker's context or run it as a step of the delivering
36
+ child.
33
37
 
34
38
  > **Persona**: `architect` · **Skills**: `core/code-review-and-quality`,
35
39
  > `core/security-and-hardening`
36
40
 
37
41
  ## Argument contract
38
42
 
39
- The caller passes the following arguments (Story workflows pass
40
- `scope: story`; Epic workflows pass `scope: epic`):
43
+ The caller passes the following arguments (`/deliver` passes
44
+ `scope: story`):
41
45
 
42
46
  | Argument | Type | Required | Meaning |
43
47
  | ----------- | ------------------------------------- | -------- | ------------------------------------------------------------------------------------------------ |
44
- | `scope` | `"story"` \| `"epic"` | yes | Selects the integration-pillar diff base and the structured-comment target ticket. |
45
- | `ticketId` | integer | yes | GitHub issue number of the Story (when `scope === 'story'`) or Epic (when `scope === 'epic'`). |
46
- | `baseRef` | string (git ref) | yes | The diff base. Story scope: `epic/<epicId>`. Epic scope: `main` (or `project.baseBranch`). |
47
- | `headRef` | string (git ref) | yes | The branch tip under review. Story scope: `story-<storyId>`. Epic scope: `epic/<epicId>`. |
48
+ | `scope` | `"story"` \| `"epic"` | yes | Live path is `"story"`. `"epic"` remains only for legacy cumulative adapters. |
49
+ | `ticketId` | integer | yes | GitHub issue number of the Story (when `scope === 'story'`) or cumulative ticket (legacy `scope === 'epic'`). |
50
+ | `baseRef` | string (git ref) | yes | The diff base. Story scope: `main` (or `project.baseBranch`). Legacy cumulative scope: caller-provided base. |
51
+ | `headRef` | string (git ref) | yes | The branch tip under review. Story scope: `story-<storyId>`. Legacy cumulative scope: caller-provided head. |
48
52
  | `depth` | `"light"` \| `"standard"` \| `"deep"` | no | Risk-derived review thoroughness lever. Absent → `standard`. See **Review depth** below. |
49
53
 
50
54
  All scope-dependent behavior in this helper branches off the first four
@@ -53,19 +57,21 @@ the argument envelope.
53
57
 
54
58
  ### Review depth (`depth`)
55
59
 
56
- `depth` is the risk-derived thoroughness lever introduced by Story #3876 and
57
- made a live consumed signal end to end by Story #3937. The Epic caller
58
- (`/deliver` Phase 5) resolves it from the Epic's judged `planningRisk`
59
- envelope via
60
- [`resolveReviewDepthForEpic`](../../scripts/lib/orchestration/code-review.js)
61
- (`high` `deep`, `low` `light`, everything else including a missing
62
- `epic-plan-state` checkpoint `standard`) and passes it in this envelope.
63
- `runCodeReview` forwards `depth` to every provider's `runReview` input.
60
+ `depth` is the thoroughness lever introduced by Story #3876, made a live
61
+ consumed signal end to end by Story #3937, and re-based on an observable signal
62
+ by Story #4542. `runCodeReview` derives it from the diff it already enumerates,
63
+ via [`review-depth.js`](../../scripts/lib/orchestration/review-depth.js): the
64
+ changed files' intersection with the `sensitivePaths` classes registered in
65
+ `audit-rules.json` gives the level, their count gives the width, and
66
+ `resolveDepth` folds the two (a sensitive path OR a wide diff → `deep`; neither,
67
+ on a small diff → `light`; an unenumerable diff `standard`). It takes no
68
+ planner-authored input and reads no checkpoint. `runCodeReview` forwards `depth`
69
+ to every provider's `runReview` input.
64
70
 
65
71
  It is an **input-only** signal: it changes *how thorough* the review is, never
66
72
  the findings envelope (`{ status, severity, posted, report, halted,
67
73
  blockerReason }`) nor the posted `verification-results` structured-comment body. An
68
- absent or malformed `depth` is treated as `standard`, so an Epic that skipped
74
+ absent or malformed `depth` is treated as `standard`, so a Story that skipped
69
75
  `/plan` still gets a passing review with no new failure mode.
70
76
 
71
77
  How each tier changes the review protocol:
@@ -89,17 +95,13 @@ review yourself, honor the `depth` semantics above directly.
89
95
 
90
96
  ## Step 0 — Resolve Context
91
97
 
92
- 1. Resolve `[TICKET_ID]` from `ticketId` (Story or Epic depending on `scope`).
98
+ 1. Resolve `[TICKET_ID]` from `ticketId` (the Story for live `scope: story`).
93
99
  2. Resolve `[BASE_REF]` from `baseRef` and `[HEAD_REF]` from `headRef`.
94
- 3. Fetch the `[TICKET_ID]` ticket and resolve the planning context:
95
- - **Story scope** read the parent Epic from the Story body, then load
96
- the Epic body (including its `## User Stories` section and its folded
97
- Tech Spec sections).
98
- - **Epic scope** read the Epic body directly; its managed sections
99
- carry the Tech Spec.
100
- 4. Read the Epic body fully (including its Tech Spec sections) to
101
- understand the intended
102
- scope, architectural decisions, and acceptance criteria.
100
+ 3. Fetch the Story ticket and resolve the planning context from its own
101
+ body: folded `## Spec` / `## Slicing`, acceptance criteria, and the
102
+ `story-plan-state` structured comment when present.
103
+ 4. Read that Spec fully to understand the intended scope, architectural
104
+ decisions, and acceptance criteria. Do **not** look for a parent Epic.
103
105
 
104
106
  ## Step 1 — Automated Audit (Pre-Review)
105
107
 
@@ -142,57 +144,21 @@ A diff that matches no local lens adds **no** lens work (the roster is empty and
142
144
  or materialization failure degrades to a skipped envelope and never blocks the
143
145
  close.
144
146
 
145
- Both close entry points
146
- [`runStoryCodeReview`](../../scripts/lib/orchestration/story-close/phases/code-review.js)
147
- (Epic-attached) and
147
+ The live close entry point
148
148
  [`runStoryScopeReview`](../../scripts/lib/orchestration/single-story-close/phases/code-review.js)
149
- (standalone) reach this pass through the single `runStoryReviewCore` spine, so
150
- standalone Stories gain local-lens coverage for the first time. Because the pass
151
- lives inside the close subprocess (invoked after the delivering child exits), it
152
- honors the maker-blind invariant above: a maker never runs its own local-lens
153
- review. This step does not apply to `scope: epic`, whose lens roster is the
154
- cumulative + global + risk-routed set resolved at Epic close (Step 1b).
155
-
156
- ### Step 1b — Epic-close lens roster (`scope: epic` only, Epic #4405)
157
-
158
- When `scope === 'epic'`, the cumulative Epic diff is walked **once** at close:
159
- the Epic-close lens roster is executed as **dimensions of this same review
160
- pass**, not as a separate Phase 4 walk (Story #4412 folded the standalone
161
- epic-audit lens walk into this pass). Resolve and walk the roster inline:
162
-
163
- 1. Resolve the roster via [`helpers/epic-audit.md`](epic-audit.md) Step 1 —
164
- run `epic-audit-prepare.js --gate gate3` and take its **`epicCloseLenses`**
165
- field: the slim roster of cumulative + global + risk-routed lenses, with
166
- every local-tier change-set lens excluded (routed off `resolveLensTier` in
167
- [`selectEpicCloseLenses`](../../scripts/lib/orchestration/code-review.js)).
168
- Local-tier concerns are already verified shift-left (write-time checklists +
169
- the Story-scope local-lens pass), so they are **not** re-run here.
170
- 2. Materialize each rostered lens via
171
- [`runAuditSuite`](../../scripts/lib/audit-suite/index.js) at the envelope's
172
- `depth`, applying the `{{changedFiles}}` substitution, and walk each lens's
173
- `.agents/workflows/audit-<lens>.md` procedure over the cumulative
174
- `main..epic/<epicId>` diff. Global lenses (`globalLenses`, e.g.
175
- `audit-navigability`) run against the WHOLE route tree, exempt from the
176
- change-set narrowing.
177
- 3. Fold the lens findings into this pass's severity aggregate **alongside** the
178
- Step 2 review pillars — one walk of the cumulative diff, one aggregate, one
179
- `verification-results` comment (Step 4). An empty `epicCloseLenses` roster
180
- (docs-only, or every selected lens already covered shift-left, and no
181
- risk-routed lens) adds no lens dimension — the pillars still run.
182
-
183
- This step does not apply to `scope: story` (its roster is the local-tier set of
184
- Step 1a) and is skipped when `epic-audit-prepare.js` returns `degraded: true`
185
- (propagate the reason and STOP, per `epic-audit.md`).
149
+ reaches this pass through the shared `runStoryReviewCore` spine. Because
150
+ the pass lives inside the close subprocess (invoked after the delivering
151
+ child exits), it honors the maker-blind invariant above: a maker never runs
152
+ its own local-lens review.
186
153
 
187
154
  ## Step 2 — Review Pillars
188
155
 
189
156
  For each changed file, execute a strict review against four pillars. The
190
157
  second pillar (**Integration Review**) deliberately defers the security /
191
- performance / quality / coverage sweeps to the change-set-scoped lenses — at
192
- `scope: story` those ran shift-left in the Story-scope local-lens pass (Step
193
- 1a); at `scope: epic` they run inline in this same pass as the Epic-close lens
194
- roster (Step 1b). Re-walking those sweeps a second time in this pillar is
195
- duplication, not defense-in-depth.
158
+ performance / quality / coverage sweeps to the change-set-scoped lenses —
159
+ those ran shift-left in the Story-scope local-lens pass (Step 1a).
160
+ Re-walking those sweeps a second time in this pillar is duplication, not
161
+ defense-in-depth.
196
162
 
197
163
  **Apply the `depth` lever** (see **Review depth** above) to how hard you walk
198
164
  these pillars: at `light`, focus on Pillar 1 and reduce Pillars 2–3 to a quick
@@ -206,57 +172,27 @@ never reduced to a scan.
206
172
 
207
173
  ### Pillar 1: Spec Adherence
208
174
 
209
- Does the implementation match the Epic's requirements and Tech Spec architecture?
175
+ Does the implementation match the Story's acceptance criteria and folded Spec?
210
176
 
211
- - Compare each completed Story/Task against its stated acceptance criteria.
177
+ - Compare the completed Story against its stated acceptance criteria.
212
178
  - Flag any undocumented deviations, missing features, or scope creep.
213
- - Verify API contracts, data models, and interface boundaries match the Tech
214
- Spec.
179
+ - Verify API contracts, data models, and interface boundaries match the Spec.
215
180
 
216
181
  ### Pillar 2: Integration Review
217
182
 
218
- The integration view depends on `scope`. The diff under review is always
219
- `baseRef..headRef`, but the **set of upstream audit signals** to integrate
220
- against differs:
221
-
222
- - **`scope: story`** the diff is `epic/<epicId>..story-<storyId>` (i.e.
223
- one Story's contribution to the Epic). The Story-scope local-lens pass
224
- (Step 1a) has already covered the local-tier concerns; the Epic-close lens
225
- roster has not run for this change set (it runs once at Epic close). The
226
- integration view here focuses on cross-Task ripple within the Story and
227
- contract drift against the Epic branch tip. Look for:
228
- - Cross-Task contract drift inside the Story (one Task's API change vs.
229
- another Task's caller in the same branch).
230
- - Shared-module ripple effects from this Story onto siblings already
231
- merged into `epic/<epicId>`.
232
- - Spec deviations that the per-Task commits papered over.
233
-
234
- - **`scope: epic`** — the diff is `main..epic/<epicId>` (the cumulative
235
- Epic change set). The Epic-close lens roster (`epicCloseLenses`) is walked
236
- **inline as part of this pass** (Step 1b) — the cumulative diff is read once,
237
- and the security, privacy, performance, code-quality, and test-coverage
238
- findings the rostered lenses produce feed this pass's aggregate directly.
239
- There is no separate `audit-results` comment to read (Story #4412 retired it);
240
- the lens findings and the pillar findings share the single
241
- `verification-results` comment this pass posts.
242
-
243
- The integration view at epic scope is what the per-lens audits cannot
244
- produce because each lens runs in isolation:
245
-
246
- - Cross-reference 🔴 / 🟠 lens findings against the spec deviations
247
- flagged in Pillar 1 — a finding that traces back to a deliberate
248
- Tech-Spec decision is different from one that traces back to an
249
- oversight.
250
- - Look for cross-cutting concerns no single lens owns: contract drift
251
- between Stories, shared-module ripple effects, boundary changes that
252
- thread security and performance implications together.
253
- - Note any lens finding that the operator's remediation flow should
254
- bundle (e.g. one refactor closes findings from multiple lenses).
255
-
256
- If the Epic-close roster is empty (docs-only Epic, every selected lens
257
- already covered shift-left, or the pass was skipped via
258
- `--skip-epic-audit` / `--skip-code-review`), record that explicitly in the
259
- findings report and proceed — there is no lens dimension to integrate.
183
+ The diff under review is `baseRef..headRef`
184
+ (`main..story-<storyId>`, or the configured base branch to the Story
185
+ branch). The Story-scope local-lens pass (Step 1a) has already covered the
186
+ local-tier concerns. Lens findings and pillar findings share the single
187
+ `verification-results` comment this pass posts (Story #4411). The
188
+ integration view here focuses on cross-cutting ripple within the Story and
189
+ contract drift against the base branch. Look for:
190
+
191
+ - Contract drift inside the Story (one change's API edit vs. another caller
192
+ in the same branch).
193
+ - Shared-module ripple effects from this Story onto code already merged to
194
+ `main`.
195
+ - Spec deviations that individual commits papered over.
260
196
 
261
197
  ### Pillar 3: Documentation Integrity
262
198
 
@@ -333,7 +269,7 @@ prior baseline before merging.
333
269
 
334
270
  Findings are **persisted as a `verification-results` structured comment on
335
271
  the `[TICKET_ID]` issue** by `runCodeReview` (the unified findings contract of
336
- Story #4411; at `scope: epic` this single comment also carries the Step 1b
272
+ Story #4411; this single comment carries the
337
273
  Epic-close lens findings). The target ticket is the Story when
338
274
  `scope === 'story'` and the Epic when `scope === 'epic'`. The comment
339
275
  is idempotent — re-runs replace the prior one — and its body includes
@@ -442,7 +378,7 @@ in-place.
442
378
  structured comment for the operator to triage in Step 5.
443
379
  2. **Leave the finding on the structured comment for Step 5.** Required
444
380
  when the finding falls into any of the following classes:
445
- - `spec-deviation` — the change diverges from the Epic/Tech Spec.
381
+ - `spec-deviation` — the change diverges from the Story `## Spec`.
446
382
  - `secrets` — credentials, tokens, or PII surfaced in the diff.
447
383
  - `test-deletion` — coverage was removed without an explicit
448
384
  decision in the spec.
@@ -483,63 +419,6 @@ escalating to the operator. Escalated findings remain on the `code-review`
483
419
  structured comment with their reason recorded, so Step 5 (and downstream
484
420
  consumers) see exactly why each one was not auto-remediated.
485
421
 
486
- ## Step 4.6 — Cross-phase re-check trigger
487
-
488
- After the focused-fix routing in Step 4.5 completes, any host-LLM-applied
489
- fix commits have modified files on `[HEAD_REF]` that the Epic-close lens
490
- roster already walked (Step 1b). Some of those edits may overlap the
491
- `filePatterns` of one or more lenses (e.g. a fix landing in `**/auth/*.js`
492
- overlaps the `audit-security` lens). When that happens, the lens findings in
493
- the `verification-results` comment are **stale for the overlapping lenses
494
- only** — the non-overlapping findings remain authoritative and MUST NOT be
495
- re-derived.
496
-
497
- > **Scope note.** This cross-phase re-check applies only when
498
- > `scope === 'epic'`. Story-scope reviews carry no Epic-close lens roster,
499
- > so there is nothing to invalidate; skip this step entirely for
500
- > `scope === 'story'`.
501
-
502
- Invoke the re-check selector with the cumulative set of paths touched by
503
- the focused-fix commits:
504
-
505
- ```powershell
506
- node .agents/scripts/epic-audit-recheck.js \
507
- --epic [TICKET_ID] --files <comma-separated-touched-paths>
508
- ```
509
-
510
- For large touched-file lists, pass `@<file>` (where `<file>` is a
511
- newline-delimited list written to `temp/`) to avoid shell argument-length
512
- limits. The CLI emits a JSON envelope of the shape
513
- `{ selectedAudits: [...], context: { ... } }` restricted to lenses whose
514
- `filePatterns` overlap the input file list. An empty `selectedAudits`
515
- array means no overlap — there is nothing to re-run and this step is a
516
- no-op.
517
-
518
- When `selectedAudits` is non-empty:
519
-
520
- 1. Re-invoke each listed lens prompt under
521
- [`../audit-*.md`](../) the same way the Step 1b Epic-close walk does —
522
- one lens at a time, against the current `[HEAD_REF]` tip.
523
- 2. **Append** a `## Cross-phase re-check` section to the **existing**
524
- `verification-results` structured comment on the Epic ticket. Do **not**
525
- post a new comment; the comment is idempotent and downstream consumers
526
- (the code-review trim, `/deliver` Pillar 2, the retro helper)
527
- read it once. The append carries the re-checked lens names, the new
528
- findings (if any), and the focused-fix commit SHAs that triggered the
529
- re-run, so reviewers can trace each finding back to the change set
530
- that produced it.
531
- 3. If the re-check surfaces fresh 🔴 / 🟠 findings, route them back
532
- through Step 4.5's focused-fix routing. Findings that already
533
- received a focused-fix attempt in the first pass do not get a fresh
534
- attempt when the cross-phase re-check resurfaces an adjacent one —
535
- leave them on the `verification-results` comment for the operator.
536
-
537
- If `selectedAudits` is empty, skip silently and proceed to Step 5. The
538
- re-check trigger is **read-only signal** — it never mutates the Epic
539
- branch on its own; mutations only happen if the re-invoked lenses
540
- surface findings that the host LLM then converts into commits through
541
- the same focused-fix routing as Step 4.5.
542
-
543
422
  ## Step 5 — Remediation
544
423
 
545
424
  If the operator instructs you to fix any findings:
@@ -576,7 +455,7 @@ to the next phase of the parent workflow.
576
455
  the scope is set by the caller, and reviewing against the wrong base
577
456
  produces either a hollow review (too small a diff) or noise (too large a
578
457
  diff that includes unrelated history).
579
- - **Always** read the Epic body and Tech Spec before reviewing code. Findings without
458
+ - **Always** read the Story body and folded Spec before reviewing code. Findings without
580
459
  spec context are noise.
581
460
  - **Never** implement fixes unless the operator explicitly requests it. The
582
461
  default mode is read-only audit.
@@ -1,18 +1,18 @@
1
1
  ---
2
2
  description: >-
3
- Reference companion to `helpers/single-story-deliver.md` — the lease and
3
+ Reference companion to `helpers/deliver-story.md` — the lease and
4
4
  sweep detail, worktree-scope warnings, CI-recovery procedures, and
5
5
  Status-column reconciliation lifted out of the runtime core so the
6
6
  always-ingested standalone-delivery prose stays lean. Not a slash command;
7
7
  consulted on demand when the core file points here.
8
- caller: helpers/single-story-deliver.md
8
+ caller: helpers/deliver-story.md
9
9
  ---
10
10
 
11
- # helpers/single-story-deliver — reference (lease, recovery, troubleshooting)
11
+ # helpers/deliver-story — reference (lease, recovery, troubleshooting)
12
12
 
13
13
  > **Not a slash command, not the runtime path.** This file is the
14
14
  > reference companion to
15
- > [`single-story-deliver.md`](single-story-deliver.md). The core file
15
+ > [`deliver-story.md`](deliver-story.md). The core file
16
16
  > carries the step flow, commands, gate contracts, and the return contract a
17
17
  > standalone-Story run needs; this file holds the lease/sweep mechanics, the
18
18
  > worktree-scope safety warning, the CI-recovery procedures, and the
@@ -85,7 +85,7 @@ The sweep applies two hardening layers (Story #2011):
85
85
  operator can see what was preserved.
86
86
  - **Cross-session lock.** The sweep acquires a process-scoped lockfile
87
87
  at `<tempRoot>/single-story-sweep.lock` before planning. On
88
- contention (another `/single-story-deliver` already in the sweep
88
+ contention (another `/deliver-story` already in the sweep
89
89
  step), this run's sweep is **skipped** with a warn log; init
90
90
  continues normally. Stale lockfiles (mtime older than the timeout)
91
91
  are treated as expired. The timeout defaults to 60 seconds and is
@@ -121,7 +121,7 @@ The `single-story-close.js` script, in order:
121
121
  1a. **Syncs the Story branch from `origin/<baseBranch>`** before push
122
122
  (Story #2580). Runs `git fetch origin <baseBranch>` followed by
123
123
  `git merge --no-edit origin/<baseBranch>` inside the worktree. This
124
- defends against the parallel-`/single-story-deliver` race: when
124
+ defends against the parallel-`/deliver-story` race: when
125
125
  multiple sessions run in parallel, the Story that auto-merges first
126
126
  bumps `baseBranch`, and without this sync the lagging Stories open
127
127
  PRs that are "behind base" and stall against branch-protection's
@@ -133,7 +133,7 @@ The `single-story-close.js` script, in order:
133
133
  command set), the Story flips to `agent::blocked`, and close
134
134
  throws. Resolve in the worktree (`git merge origin/<base>` + fix
135
135
  conflicts + `git commit --no-edit`) and re-run
136
- `/single-story-deliver`.
136
+ `/deliver-story`.
137
137
  - **Fetch failed** → close throws with the git stderr; no label
138
138
  transition.
139
139
 
@@ -161,19 +161,24 @@ The `single-story-close.js` script, in order:
161
161
  would strand a CLOSED issue with no merged work if the PR later failed
162
162
  CI, went `BEHIND` base, or was closed without merging. The Story rests
163
163
  at `agent::closing` while the PR is open with auto-merge armed; the
164
- `agent::done` flip (which closes the issue) is deferred to Step 5.5's
165
- `single-story-confirm-merge.js`. This brings the standalone path to
166
- parity with the epic path (#2155), where a Story only reaches
167
- `agent::done` once its merge into `epic/<id>` is confirmed.
164
+ `agent::done` flip (which closes the issue) is deferred to Step 5's
165
+ merge confirmation — `single-story-confirm-merge.js` on a
166
+ `--no-wait-merge` run, or the in-close confirm phase on the
167
+ close-and-land default. (Step 5.5 is the Status-column resync.) A Story
168
+ only reaches `agent::done` once its PR to `main` is confirmed merged.
168
169
  5. Reaps the worktree when `delivery.worktreeIsolation.reapOnSuccess`
169
170
  is enabled.
170
171
  6. **Releases the Story lease** (Story #3483). Clears the Story assignment
171
- that init claimed so the next `/single-story-deliver` run sees an
172
+ that init claimed so the next `/deliver-story` run sees an
172
173
  unclaimed ticket. The release is a no-op when the operator no longer
173
174
  holds the claim (a later run took over via reclaim/steal), so a late
174
175
  close never yanks a live claim away from its current owner. Best-effort:
175
- a release failure is logged but does not fail an otherwise-clean close
176
- the lease goes stale via TTL regardless. The close result carries
176
+ a release failure is logged but does not fail an otherwise-clean close.
177
+ Note the lease does **not** expire on its own: the standalone lease is
178
+ fail-closed by design (it anchors its heartbeat to now, so a foreign
179
+ claim always reads as live regardless of the configured TTL), so a
180
+ claim stranded by a failed release is cleared only by `--steal` or by
181
+ de-assigning the ticket. The close result carries
177
182
  `leaseReleased: <boolean>`.
178
183
 
179
184
  `--skip-validation` bypasses Step 1 (gates). Use only when re-running
@@ -290,9 +295,8 @@ when `--pr` is omitted) and:
290
295
  - **Story already `agent::done` / issue already closed** → idempotent
291
296
  `{ action: 'noop', reason: 'already-done' }`.
292
297
 
293
- This is the standalone counterpart to the epic path's post-merge
294
- `agent::done` flip in `post-merge-close.js` (#2155): the issue closes
295
- exactly when the work has merged, never at PR-open.
298
+ The issue closes exactly when the work has merged, never at PR-open
299
+ (#2155).
296
300
 
297
301
  ---
298
302
 
@@ -348,7 +352,7 @@ GitHub deletes the **remote** branch on auto-merge (via the
348
352
  `--delete-branch` flag `single-story-close.js` passes to `gh pr merge`).
349
353
  The **local** `story-<storyId>` ref, however, lingers in the main
350
354
  checkout until something prunes it — `single-story-init.js` runs a
351
- merged-sweep at the start of every *subsequent* `/single-story-deliver`
355
+ merged-sweep at the start of every *subsequent* `/deliver-story`
352
356
  invocation, but that's next-run cleanup, not end-of-run cleanup. Stale
353
357
  local refs accumulate between sessions, clutter `git branch`, and shadow
354
358
  the lessons the sweep is meant to surface.
@@ -387,36 +391,71 @@ up").
387
391
 
388
392
  ## Step 7 — Return-contract detail
389
393
 
390
- **The auto-merge wait does not produce a fourth status.** There is no
391
- "pending" or "waiting" terminal — the CI/auto-merge wait is handled
392
- *internally* by blocking on `pr-watch-with-update.js` (Step 4) and confirming
393
- the merge (Step 5). You return **only** when you have reached a genuinely
394
- terminal state:
395
-
396
- - **`status: "done"`** — the PR is confirmed `state: "MERGED"` (Step 5),
397
- the Story carries `agent::done`, and Steps 5.5 / 6 have run. `phase: "done"`,
398
- `branchDeleted: true`.
399
- - **`status: "blocked"`** you transitioned the Story to `agent::blocked`
400
- and posted a `friction` comment (acceptance self-eval block in Step 1a, a
401
- base-sync conflict, or an operator-blocking CI failure / Anti-Thrashing
402
- stop in Step 4). `phase: "blocked"`, `blockerCommentId` set.
403
- - **`status: "failed"`** an unrecoverable failure outside the blocked
404
- protocol. `phase` reflects where it died.
405
-
406
- A turn that ends with prose ("I'll wait for the watch task…", "the next event
407
- will be its completion notification…") and an **unconfirmed merge** is a
408
- **contract violation** (the Story #1553 / PR #1554 failure mode): the parent
409
- wave loop cannot distinguish "still working" from "done but silent", and the
410
- Story strands at `agent::closing`. If you genuinely cannot confirm the merge,
411
- that is a `blocked` or `failed` outcome with the JSON contract not a
412
- prose hand-off.
394
+ The field-level contract is the shipped schema
395
+ [`story-deliver-terminal.schema.json`](../../schemas/story-deliver-terminal.schema.json)
396
+ (Story #4543) not this file, and not
397
+ [`agents/story-worker.md`](../../agents/story-worker.md). All three used to
398
+ carry their own prose version; the schema is now the only definition. What
399
+ follows is the *judgement* around it, which a schema cannot express.
400
+
401
+ ### `pending` is a real status and it is not a park
402
+
403
+ Earlier revisions asserted "the auto-merge wait does not produce a fourth
404
+ status", on the reasoning that the wait is internally blocking so a run either
405
+ merges or blocks. That was true only while the wait was unbounded — and it was
406
+ never actually unbounded, because the host kills a tool invocation at ~10
407
+ minutes. So a close-and-land whose CI outlived that ceiling took **no**
408
+ terminal path at all: no event, no label, the Story parked at
409
+ `agent::closing`. The status the model refused to name was the one that kept
410
+ happening.
411
+
412
+ `pending` names it, with its own exit code (3):
413
+
414
+ - It is **resumable**: no label was mutated, no `merge.unlanded` was emitted,
415
+ and `nextCommand` names the one command that continues it. The cumulative
416
+ budget is anchored at the PR's `createdAt`, so resuming does not restart the
417
+ clock and the give-up bound still means something.
418
+ - It is **not** a park. Returning `pending` because you would rather not wait
419
+ is the Story #1553 / PR #1554 failure mode wearing a schema. Return it only
420
+ when the bound genuinely expired, or a human owns the merge.
421
+
422
+ The no-park rule is therefore unchanged in substance: a turn that ends with
423
+ prose ("I'll wait for the watch task…", "the next event will be its
424
+ completion notification…") and an unconfirmed merge is a **contract
425
+ violation** — the parent cannot distinguish "still working" from "done but
426
+ silent". What changed is that there is now an honest, machine-readable way to
427
+ say "not finished, here is exactly how to continue" instead of a choice
428
+ between lying and blocking forever.
429
+
430
+ ### Exit-code compatibility note (`--no-wait-merge`)
431
+
432
+ Every close flag keeps its meaning, but the **exit code** of a
433
+ `--no-wait-merge` (or `--no-auto-merge` / `autoMerge: "strict"`) run changed:
434
+ it now exits **3** (`pending`) rather than 0, because the PR is open and a
435
+ human still owns the merge. Reporting `landed` would be a lie, and `landed` is
436
+ what exit 0 means. A wrapper that shells out and tests `exit == 0` to mean
437
+ "close finished" must be updated to treat 3 as the operator-merge success
438
+ path; `!= 0` no longer implies failure.
439
+
440
+ ### Per-status judgement
441
+
442
+ - **`landed`** — the only status that means done. A `false` in `tail.*`
443
+ degrades the report, never the land: the merge is on the base branch, and
444
+ failing it because a Projects v2 mutation flaked would report a false
445
+ negative about work that demonstrably shipped.
446
+ - **`pending`** — see above.
447
+ - **`blocked`** — you (or the close pipeline) transitioned the Story to
448
+ `agent::blocked` and posted a `friction` comment. `blocked.blockClass` comes
449
+ from the shared classifier, never an ad hoc string, and
450
+ `blocked.frictionCommentId` points at the remediation.
451
+ - **`failed`** — an unrecoverable failure outside the blocked protocol.
452
+ `phase` reflects where it died.
413
453
 
414
454
  > **Handoff discipline — report state, not process.** Populate the envelope
415
455
  > with essential terminal state only (mirroring the fields
416
- > `single-story-close.js` / `story-phase.js` already emit). Do not narrate the
456
+ > `single-story-close.js` already emits). Do not narrate the
417
457
  > steps you took, and do not prescribe how the next stage should work. Prose
418
- > process commentary only bloats the hydrated prompt
419
- > (`delivery.maxTokenBudget` elision). When run **interactively** (no parent
458
+ > process commentary only bloats the hydrated prompt. When run **interactively** (no parent
420
459
  > aggregator), this JSON envelope is optional — relay terminal state to the
421
460
  > operator in prose instead — but the **no-park rule still holds**: never end
422
461
  > an interactive turn with an unconfirmed merge either; block on the watch,