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,200 +1,201 @@
1
1
  ---
2
2
  description:
3
- Unified delivery entry point. Inspects the ticket type(s) and
4
- Epic-reference state of the supplied IDs, composes a sequential segment
5
- plan over any mix of Epics and standalone Stories, then delegates each
6
- segment to the Epic wave loop or the standalone multi-Story fan-out —
7
- preserving every flag and the parallel-delivery contract of the retired
8
- commands.
3
+ Unified delivery entry point. Takes a list of Story ids, resolves their
4
+ dependency graph from live state, and delivers each via the single
5
+ deliver-story engine story-<id> PR main.
9
6
  ---
10
7
 
11
- # /deliver [Epic IDs...] | [Story IDs...]
8
+ # /deliver <storyId...>
12
9
 
13
10
  ## Role
14
11
 
15
- Router. `/deliver` owns input classification, segment-plan composition, and
16
- path selection only all phase content lives in the two path helpers:
12
+ Single delivery path with a single input shape: **a list of Story ids**.
13
+ `/deliver` owns input resolution and sequencing only every Story runs
14
+ through [`helpers/deliver-story.md`](helpers/deliver-story.md). There is no
15
+ Epic wave loop, no `epic/<id>` integration branch, and no `--no-ff` wave
16
+ merges.
17
17
 
18
- - [`helpers/deliver-epic.md`](helpers/deliver-epic.md) — the full Epic
19
- delivery loop (preflight, wave loop fanning out
20
- [`helpers/epic-deliver-story`](helpers/epic-deliver-story.md),
21
- close-validation, epic-audit, code-review, retro, finalize, watch,
22
- auto-merge gate, cleanup).
23
- - [`helpers/deliver-stories.md`](helpers/deliver-stories.md) the
24
- standalone multi-Story path (`stories-wave-tick.js` continuous ready-set
25
- loop, operator confirmation, parallel fan-out to
26
- [`helpers/single-story-deliver`](helpers/single-story-deliver.md)).
18
+ The dependency graph is **discovered, not declared**: `resolve-stories.js`
19
+ reads it from live state (body edges native GitHub `blocked_by` edges,
20
+ with every blocker resolved against its real issue state). You never hand it
21
+ a graph, and there is no batch label — which is what lets you deliver
22
+ Stories **across plan runs and over time**: a Story whose blocker landed
23
+ weeks ago in a different run is simply ready.
27
24
 
28
- ## Input matrix (authoritative)
25
+ ## Inputs
29
26
 
30
- Fetch each supplied ID's labels and body (`type::*` label, `Epic: #N`
31
- reference) before routing:
32
-
33
- | Input | Route |
34
- | --- | --- |
35
- | Exactly one `type::epic` ID | **Epic path** — resolve the Epic's delivery route (see [Epic delivery-route resolution](#epic-delivery-route-resolution) below), then run the selected helper's phases unchanged (single-segment plan; no confirmation prompt). |
36
- | One or more `type::story` IDs, none carrying an `Epic: #N` reference | **Standalone path** — run [`helpers/deliver-stories.md`](helpers/deliver-stories.md) Phases 0–3 (single-segment plan; no confirmation prompt). |
37
- | Any combination of ≥1 `type::epic` IDs and ≥0 standalone `type::story` IDs | **Segment plan** — compose and execute the sequential segment plan below. |
38
- | Any Story carrying an `Epic: #N` reference (alone or mixed into an otherwise-valid set) | **Error**, naming every affected ID and the fix: `Story #<id> belongs to Epic #<n> — run /deliver <n>`. |
39
-
40
- Per-ID classification is unchanged: fetch the `type::*` label and probe the
41
- body for an `Epic: #N` reference before routing. Never guess a route.
42
-
43
- ## Epic delivery-route resolution
44
-
45
- Every `type::epic` segment resolves to one of two delivery shapes before its
46
- helper runs. The routing is a pure function of the Epic's labels, its
47
- `epic-plan-state` checkpoint, and the config kill-switch — implemented in
48
- [`lib/orchestration/deliver-route.js`](../scripts/lib/orchestration/deliver-route.js)
49
- (`resolveEpicDeliveryRoute(epic, checkpoint, config)`), mirroring how the
50
- code-review depth resolver reads `planningRisk`/`decompose` off the same
51
- checkpoint. Fetch the Epic's labels and read its `epic-plan-state` structured
52
- comment, then apply the precedence (highest wins):
53
-
54
- 1. **Kill-switch — overrides all.** `delivery.routing.singleDelivery === false`
55
- (default `true`, read via `getDeliveryRouting`) forces **fan-out** for
56
- *every* Epic, even a single-marked one. This is the instant, per-consumer
57
- global revert that ships before the default flips — no code rollback, no
58
- re-plan.
59
- 2. **Single marker → single route.** The `delivery::single` label (primary)
60
- **or** `decompose.shape === "single"` on the checkpoint (secondary). A
61
- spec-only plan authored no Story tree; its `## Delivery Slicing` table is
62
- the audit trail.
63
- 3. **No marker → fan-out.** A legacy Epic (no marker, an authored Story tree)
64
- or a genuinely-wide DAG. Deliver-time width only *advises* — it never
65
- reroutes a single-marked Epic (that would orphan a tree that does not
66
- exist; re-route = re-plan).
67
-
68
- **Route dispatch.**
69
-
70
- - **`fan-out`** → run [`helpers/deliver-epic.md`](helpers/deliver-epic.md)
71
- Phases 1–9 unchanged (the wave loop fanning out per-Story sub-agents).
72
- - **`single`** → run
73
- [`helpers/deliver-epic-single.md`](helpers/deliver-epic-single.md) (the
74
- live flip, M4-B): a one-worktree in-session slice walk (prepare `--single` →
75
- ordered `## Delivery Slicing` walk on `epic/<id>` → per-AC-cluster
76
- acceptance critics) that **reuses `helpers/deliver-epic.md` Phases 3–9
77
- byte-for-byte** for the merge tail. This is now the **default** shape for a
78
- single-marked Epic. The kill-switch (`delivery.routing.singleDelivery=false`)
79
- still forces this verdict back to `fan-out` — an instant global revert with
80
- no code rollback.
81
-
82
- ## Segment plan (mixed / multi-Epic input)
83
-
84
- When the supplied IDs span more than one Epic, or mix Epics with standalone
85
- Stories, the router composes a **segment plan** and executes the segments
86
- **strictly sequentially**:
87
-
88
- 1. **Standalone segment first** (when any standalone Story IDs are
89
- present): the full standalone-Story set forms **one** segment,
90
- delivered via [`helpers/deliver-stories.md`](helpers/deliver-stories.md)
91
- Phases 0–3 unchanged. It runs first because it is fast, each Story
92
- merges to `main` independently, and each subsequent Epic segment's
93
- Phase 7.0 base-sync then integrates those merges naturally instead of
94
- the Epic PR opening behind base.
95
- 2. **Epic segments in input order**: each `type::epic` ID forms its own
96
- segment. Resolve its delivery route (see [Epic delivery-route
97
- resolution](#epic-delivery-route-resolution)) and run the selected helper
98
- unchanged — the `fan-out` route dispatches
99
- [`helpers/deliver-epic.md`](helpers/deliver-epic.md) Phases 1–9, the
100
- `single` route dispatches
101
- [`helpers/deliver-epic-single.md`](helpers/deliver-epic-single.md) (which
102
- reuses that helper's Phases 3–9 for the merge tail).
103
-
104
- Sequential execution is a deliberate design decision: the Epic path assumes
105
- a single main checkout (prepare's checkout guard, Phase 7.0
106
- `git checkout epic/<id>`), holds a per-Epic lease, serializes same-machine
107
- sessions via `epic-merge-lock.js`, and constrains dispatch to one wave at a
108
- time. Segments are never interleaved or parallelized; running them one at a
109
- time keeps both helpers' machinery untouched.
110
-
111
- **Confirmation gate.** When the composed plan has more than one segment,
112
- present it to the operator before dispatching — the segments, the IDs in
113
- each, and the execution order — and wait for confirmation. `--yes`
114
- suppresses this prompt. Single-segment plans route directly with today's
115
- behavior (no new prompt; the standalone path's own Phase 1 confirmation
116
- still applies as before).
117
-
118
- **Failure policy.** A segment that ends non-complete (blocked, failed, or
119
- halted at a gate) **stops the run** — no subsequent segment dispatches.
120
- Report the terminal state: which segments completed, which segment halted
121
- (and why), and which segments never started. Name the resume command:
122
- re-running `/deliver` with the same IDs — both path helpers short-circuit
123
- already-done work (the Epic path resumes idempotently from its checkpoint;
124
- merged standalone Stories no-op).
125
-
126
- ## Flags (scoped per segment)
127
-
128
- | Path | Flags |
27
+ | Invocation | Behavior |
129
28
  | --- | --- |
130
- | Epic | `--skip-epic-audit`, `--skip-code-review`, `--skip-retro`, `--full-retro`, `--steal`, `--as <handle>` |
131
- | Story | `--dep <from>:<to>`, `--yes`, `--concurrency <n>` |
29
+ | `/deliver <storyId>` | Deliver one Story via `helpers/deliver-story.md`. |
30
+ | `/deliver <storyId> <storyId> ...` | Resolve the set with `resolve-stories.js`, then sequence by the discovered graph via `stories-wave-tick.js`. Default concurrency is **3**. |
132
31
 
133
- In a segment plan, Epic-path flags apply to **every** Epic segment;
134
- Story-path flags apply to the standalone segment. `--yes` additionally
135
- suppresses the router's segment-plan confirmation gate above. A flag with
136
- no applicable segment in the plan is reported once as a no-op warning and
137
- ignored — never an error (the existing convention, restated for segment
138
- plans).
32
+ Any named ticket that is not `type::story`, or that still carries an
33
+ `Epic: #N` footer, is a hard error naming the id and the fix (close or
34
+ re-plan as a v2 Story). Resolution refuses the whole set rather than
35
+ silently dropping the offending id and under-delivering.
139
36
 
140
- **Multi-Story parallel contract (preserved verbatim).**
37
+ > **Retired (Story #4540).** `--run <planRunId>` and the `plan-run::<id>`
38
+ > label are gone, along with `--dep`. Batch identity was the wrong axis:
39
+ > it could not express an edge to a Story planned in another run, while
40
+ > ordering already lives in the dependency edges themselves. Deliver the
41
+ > ids; the graph resolves itself.
141
42
 
142
- ```text
143
- /deliver <id> <id> … --dep <from>:<to> --concurrency <n> --yes
144
- ```
43
+ ## Flags
145
44
 
146
- preserves the retired multi-Story command's full surface — the same flags,
147
- the same operator confirmation gate (suppressed by `--yes`), and the same
148
- parallel fan-out to
149
- [`helpers/single-story-deliver`](helpers/single-story-deliver.md) — but
150
- schedules through `stories-wave-tick.js`'s **continuous ready-set loop**
151
- (the shared `selectReadySet` core) rather than a static wave plan: each
152
- Story dispatches the instant its own dependencies are done, capped by the
153
- resolved global `concurrencyCap` and guarded against file-overlap
154
- co-dispatch, exactly as the Epic path is. The parallelism lives **inside**
155
- the standalone segment; segments themselves remain strictly sequential.
45
+ | Flag | Meaning |
46
+ | --- | --- |
47
+ | `--concurrency <n>` | Ready-set fan-out cap (default **3** from `delivery.deliverRunner.concurrencyCap`; set `1` for sequential). |
48
+ | `--yes` | Suppress the multi-Story confirmation gate. |
49
+ | `--steal` | Forwarded to `single-story-init.js` / lease steal. |
50
+ | `--wait-merge` | Force close-and-land (the default; `delivery.routing.closeAndLand`, default `true`). |
51
+ | `--no-wait-merge` | Opt out of close-and-land; stop at `agent::closing` for a human land. |
52
+
53
+ **Operator-merge implies no-wait.** `--no-auto-merge` and
54
+ `delivery.ci.autoMerge: "strict"` deliberately leave the PR un-armed, so
55
+ there is nothing for close to land: the Story rests at `agent::closing` for
56
+ the human merge, and is **not** flipped to `agent::blocked`. An explicit
57
+ `--wait-merge` does not override this — close cannot land a PR that was
58
+ never armed. A genuine *arm failure* is different: it still waits and still
59
+ blocks, because that is a fault to report rather than an operator decision
60
+ to respect.
156
61
 
157
62
  ## Procedure
158
63
 
159
- 1. **Parse args.** At least one positive-integer ID is required.
160
- 2. **Classify.** Fetch each ticket's labels + body and apply the input
161
- matrix above. Any Epic-attached Story ID is a hard error naming the
162
- affected IDs and the fix — never guess a route.
163
- 3. **Compose the segment plan.** Standalone-Story set (when present) as
164
- one segment, then one segment per Epic ID in input order. For a
165
- multi-segment plan, present it and wait for operator confirmation
166
- (`--yes` suppresses).
167
- 4. **Execute segments sequentially.** For each segment in order, read the
168
- selected path helper **in full** and execute it from its entry phase,
169
- forwarding the segment's scoped flags. The helper's phase numbering,
170
- watchdogs, gates, and scripts are unchanged this router adds no phase
171
- content. Stop on the first non-complete segment per the failure policy.
172
- 5. **Report.** On completion (or halt), summarize per-segment outcomes and,
173
- when halted, the resume command.
64
+ 1. **Resolve the set.** One command, for one Story or many:
65
+
66
+ ```bash
67
+ node .agents/scripts/resolve-stories.js --ids <id,id,...>
68
+ ```
69
+
70
+ Capture `stories[]`, `dag[]`, and `done[]` from the envelope. Do **not**
71
+ rebuild the graph by hand — it is discovered from live state, including
72
+ edges a body does not spell out and blockers outside the delivered set.
73
+
74
+ Resolution hard-errors (exit 1) on a named id that is not a Story, still
75
+ carries an `Epic: #N` footer, or whose native dependency edges cannot be
76
+ read. A failed edge read is fatal by design: a missing gate would
77
+ co-dispatch a Story against an unlanded blocker.
78
+
79
+ 2. **Confirm (N>1).** Present the order and wait unless `--yes`.
80
+
81
+ 3. **Sequence.** Loop until every Story is done:
82
+
83
+ ```bash
84
+ node .agents/scripts/stories-wave-tick.js \
85
+ --dag '<dag from step 1>' --done <csv> --in-flight <n> --concurrency <n>
86
+ ```
87
+
88
+ **Seed the first beat's `--done` from the resolver's `done[]`** — not from
89
+ an empty string. That array carries the blockers that have already landed,
90
+ including foreign ones outside the delivered set. Seeding it empty
91
+ discards exactly the cross-run resolution this step exists for, and the
92
+ run wedges on a blocker that finished weeks ago. On later beats, `--done`
93
+ is `done[]` plus every Story that has since closed.
94
+
95
+ Branch on the exit code:
96
+ - **0** — dispatch each `ready` id. An empty `ready` with work in flight
97
+ means "waiting"; keep looping.
98
+ - **2** — `cycleError`: the graph is self-referential. Fix the
99
+ `depends_on` declarations; do not retry.
100
+ - **3** — `wedged`: nothing is dispatchable, nothing is in flight, and
101
+ undone Stories are waiting on blockers that are not done. The envelope
102
+ names the stuck ids and their unmet blockers. Either land the blocker
103
+ first or include it in `--ids`. Do not retry unchanged — the state
104
+ cannot improve on its own.
105
+
106
+ For each `ready` Story id, read
107
+ [`helpers/deliver-story.md`](helpers/deliver-story.md) **in full** and
108
+ execute it (init → implement → ceremony → close-and-land). Under
109
+ `--yes` / injected helper content, execute directly without a re-read
110
+ turn.
111
+
112
+ 4. **Per-run epilogue (N>1).** After the last Story lands, keyed on the
113
+ delivered id set:
114
+
115
+ ```bash
116
+ node .agents/scripts/plan-run-epilogue.js --stories 101,102
117
+ ```
118
+
119
+ This executes, in order:
120
+ - `audit-roster` — selects cross-Story audit lenses over the combined
121
+ landed tip and posts `plan-run-audit-roster` on the primary Story;
122
+ the host MUST walk each listed lens against the combined diff
123
+ - `follow-up-rollup` — friction follow-ups across every Story in the
124
+ run (files issues when auto-file is on; posts `follow-ups`)
125
+ - `sibling-coherence` — Spec/Acceptance coherence check across sibling
126
+ bodies (`plan-run-sibling-coherence`)
127
+
128
+ A single-Story run skips the epilogue — follow-ups are captured on
129
+ merge confirm instead (`captureStoryFollowUps`).
130
+
131
+ ## Branch model (authoritative)
132
+
133
+ Every Story:
134
+
135
+ ```text
136
+ story-<id> → PR → main (squash + required checks)
137
+ ```
138
+
139
+ There is no `epic/<id>` integration branch and no `--no-ff` wave merge.
140
+ Dependent Stories land sequentially so each builds on the previous merge
141
+ to `main`.
142
+
143
+ ## Ceremony (profiles + two scopes)
144
+
145
+ Ceremony depth is selected by `delivery.routing.ceremonyProfile`
146
+ (`minimal` | `standard` | `strict`, default `standard`) and the **change
147
+ level derived from the Story's own diff** — the changed files' intersection
148
+ with the sensitive-path classes in `audit-rules.json`
149
+ (`review-depth.js#deriveChangeLevel`), not a planner-authored verdict
150
+ (Story #4542):
151
+
152
+ | Profile | Acceptance critic | When to use |
153
+ | --- | --- | --- |
154
+ | `minimal` | Always inline | Tiny trusted N=1 Stories |
155
+ | `standard` | Derived-level routed (+ sampling floor) | Default |
156
+ | `strict` | Always fresh-context | High-assurance / regulated surfaces |
157
+
158
+ | Scope | What runs | Mechanism |
159
+ | --- | --- | --- |
160
+ | **Per-Story (always)** | Gates, branch discipline, close-and-land | `deliver-story` / `single-story-close` |
161
+ | **Per-Story (profile + derived level)** | Acceptance critic mode; review depth | `ceremony-routing.js` + `review-depth.js` + `code-review.js` |
162
+ | **Per-run (N>1)** | Audit roster · follow-up roll-up · sibling coherence | `plan-run-epilogue.js` once at run end |
163
+ | **Per-Story land tail** | Follow-up capture · status resync · ref cleanup · base fast-forward | `single-story-close/phases/post-land.js` (in-process, per-step reported) |
164
+
165
+ ## Reading a Story's outcome
166
+
167
+ Each Story's delivery ends in exactly one schema-validated terminal envelope
168
+ ([`story-deliver-terminal.schema.json`](../schemas/story-deliver-terminal.schema.json),
169
+ Story #4543) — `landed` | `pending` | `blocked` | `failed`. That schema is the
170
+ SSOT for the shape; this workflow does not restate its fields.
171
+
172
+ `pending` is **not** a failure: the bounded merge wait expired with the PR
173
+ healthy and in flight (or a human owns the merge), nothing was mutated, and
174
+ the envelope's `nextCommand` names what resumes it. Run that command rather
175
+ than re-dispatching the Story.
176
+
177
+ For a Story in an unclear state — including the merged-but-label-stale one a
178
+ `/deliver` re-run refuses outright — probe it read-only:
179
+
180
+ ```bash
181
+ node .agents/scripts/deliver-recover.js --story <storyId>
182
+ ```
174
183
 
175
184
  ## Constraints
176
185
 
177
- - **Land or block — never a silent local build (issue #4483).** The
178
- helpers' orchestration path (worktrees, `story-<id>`/`epic/<id>` branches,
179
- close-validation, PR) is the ONLY sanctioned delivery mechanism.
180
- Executing story slices inline in this session and/or committing the
181
- delivery to local `main` is expressly forbidden, regardless of how the
182
- environment looks. Each path surfaces verified remote evidence
183
- (`remoteVerified`) at entry; on `false`, transition the ticket to
184
- `agent::blocked` quoting `remoteProbe.detail` and halt.
185
- - `/deliver` requires planned tickets: Epics at `agent::ready` (the
186
- Epic helper's preflight enforces this, per segment) or well-formed
187
- standalone Stories. Planning happens in [`/plan`](plan.md); the
188
- plan-review gate between the two commands is a hard boundary.
189
- - The router performs no git or label mutations itself; the path helpers
190
- own every script invocation.
191
- - Segments execute strictly sequentially — never interleave a standalone
192
- Story fan-out with an Epic wave loop, and never run two Epic segments
193
- concurrently.
186
+ - **Land or block — never a silent local build.** Worktrees, `story-<id>`
187
+ branches, close-validation, and PR-to-`main` are the only sanctioned
188
+ delivery mechanism. Attended delivers default to close-and-land
189
+ (`delivery.routing.closeAndLand: true`); use `--no-wait-merge` only when
190
+ a human will land the PR.
191
+ - `/deliver` never plans tickets come from [`/plan`](plan.md).
192
+ - The router performs no git/label mutations; `deliver-story` owns every
193
+ script invocation per Story.
194
194
 
195
195
  ## See also
196
196
 
197
- - [`/plan`](plan.md) — the unified planning entry point.
198
- - [`helpers/deliver-epic.md`](helpers/deliver-epic.md) /
199
- [`helpers/deliver-stories.md`](helpers/deliver-stories.md) — the path
200
- helpers, delegated to per segment.
197
+ - [`/plan`](plan.md) — unified planning entry point.
198
+ - [`helpers/deliver-story.md`](helpers/deliver-story.md) — the one Story
199
+ delivery engine.
200
+ - Placeholder design Story for a fully deterministic deliver-run
201
+ orchestrator: [#4521](https://github.com/dsj1984/mandrel/issues/4521).
@@ -24,7 +24,7 @@ confirmation:
24
24
  already gone (or never existed) but whose `origin/<branch>` still
25
25
  points at a merged PR — even without `--remote`; `--remote` is still
26
26
  required to *delete* them. A third branch, whose content already
27
- landed in `<base>` by another route (a squash-merged Epic PR, a
27
+ landed in `<base>` by another route (a squash-merged PR, a
28
28
  cherry-pick, a manual `merge --squash`), is caught by a
29
29
  **content-equivalence probe** (`git merge-tree --write-tree`,
30
30
  git ≥ 2.38) even when it has no merged PR of its own and is not a
@@ -40,7 +40,7 @@ passed, **all four phases run** sequentially. Pass any of
40
40
  narrow the run.
41
41
 
42
42
  > **When to run**: After a session that landed several PRs, or before
43
- > starting a new Epic / Story, to put the local checkout into a known
43
+ > starting a new Story, to put the local checkout into a known
44
44
  > tidy state.
45
45
  >
46
46
  > **Persona**: `devops-engineer` · **Skills**:
@@ -226,10 +226,9 @@ The merged-branch sweep recognizes three detection signals, in order:
226
226
  `git merge-tree --write-tree <base> <branch>` (git ≥ 2.38) produces a
227
227
  tree identical to `<base>`'s own tree — i.e. applying the branch's
228
228
  changes on top of `<base>` is a content no-op. This catches
229
- `story-<id>` branches merged into `epic/<id>` whose Epic PR
230
- **squash-merged** to `main` (the story commits are not ancestors of
231
- `main` and the story branch usually has no PR of its own), and any
232
- other branch whose content landed via a different route (a renamed
229
+ `story-<id>` branches whose PR **squash-merged** to `main` (the story
230
+ commits are not ancestors of `main`), and any other branch whose content
231
+ landed via a different route (a renamed
233
232
  head, a cherry-pick, a manual `merge --squash`). When git rejects
234
233
  `--write-tree` (git < 2.38) or the simulated merge conflicts, the
235
234
  probe is inconclusive and the branch keeps its existing `not-merged`
@@ -10,7 +10,7 @@ description: >-
10
10
  # /git-deliver [Message] [--no-push] [--pr] [--draft] [--no-auto-merge] [--branch <name>] [--base <branch>]
11
11
 
12
12
  The **single source of truth** for getting outstanding working-tree changes
13
- out the door when they do not belong to a planned Epic (typo fixes, doc
13
+ out the door when they do not belong to a planned Story (typo fixes, doc
14
14
  tweaks, dependency bumps, operator housekeeping, benchmark result commits
15
15
  from mandrel-bench's `/benchmark` Step 4). It is the ad-hoc counterpart to
16
16
  the heavyweight `/deliver` pipeline: one command that **detects the git
@@ -1,7 +1,7 @@
1
1
  # Merge Conflict Resolution — Shared Procedure
2
2
 
3
3
  Canonical, workflow-agnostic procedure for resolving merge / rebase conflicts.
4
- Referenced by `deliver-stories.md` and `deliver-epic.md`.
4
+ Referenced by `deliver.md` and `helpers/deliver-story.md`.
5
5
 
6
6
  ## Procedure
7
7
 
@@ -1,19 +1,16 @@
1
1
  ---
2
2
  description: >-
3
3
  Shared include for the bounded acceptance self-eval loop run during Story
4
- delivery (both Epic-attached `epic-deliver-story` and standalone
5
- `single-story-deliver`). Defines the per-round critic mechanic; each caller
6
- supplies its own gate-decision wrapper (snapshot vs. label transitions).
4
+ delivery (`helpers/deliver-story`). Defines the per-round critic mechanic;
5
+ the caller supplies its gate-decision wrapper (label transitions).
7
6
  ---
8
7
 
9
8
  # Bounded acceptance self-eval loop (shared include)
10
9
 
11
10
  > **Include module.** Not a slash command. Referenced from
12
- > [`epic-deliver-story.md`](epic-deliver-story.md) and
13
- > [`single-story-deliver.md`](single-story-deliver.md) at their respective
14
- > Step 1a. This file is the **single prose home** for the per-round critic
15
- > mechanic; each caller layers only its own wrapper (snapshot transitions vs.
16
- > standalone label transitions, and whether to pass `--epic`).
11
+ > [`deliver-story.md`](deliver-story.md) at Step 1a. This file is the
12
+ > **single prose home** for the per-round critic mechanic; the caller layers
13
+ > only its wrapper (Story label transitions).
17
14
 
18
15
  After the implementation commits land and **before** the Story proceeds to
19
16
  close, run an explicit, **independent** eval pass that scores the working diff
@@ -25,10 +22,9 @@ satisfies *this Story's* acceptance criteria.
25
22
  The loop is **always on** (a hard cutover — there is no flag to disable it) and
26
23
  **bounded** by `delivery.acceptanceEval.maxRounds` (default 2), which the
27
24
  resolver clamps into `[1, hard ceiling]` so the cap can never be switched off or
28
- run unbounded. It is **distinct from** the Epic-level acceptance-spec
29
- reconciliation in `/deliver` Phase 7.1 (which fires once at finalize and
30
- only checks `@ac-*` Gherkin tag presence): this loop is per-Story,
31
- per-criterion, mid-delivery, and evaluates the actual work product.
25
+ run unbounded. It is **distinct from** the per-run `sibling-coherence` epilogue
26
+ step (`planRunEpilogue` for N>1): this loop is per-Story, per-criterion,
27
+ mid-delivery, and evaluates the actual work product.
32
28
 
33
29
  ## Per round
34
30
 
@@ -37,7 +33,7 @@ per-criterion, mid-delivery, and evaluates the actual work product.
37
33
  continuation of your implementing turn — so the evaluator does not grade its
38
34
  own homework.
39
35
 
40
- > **Sub-agent type + risk-routed ceremony (Epic #4478, M7-B).** When
36
+ > **Sub-agent type + derived-level ceremony (Epic #4478, M7-B).** When
41
37
  > `delivery.routing.roleScopedAgents` is enabled (the **default**), dispatch
42
38
  > the critic with `subagent_type: acceptance-critic` — it boots on the
43
39
  > role-scoped [`acceptance-critic`](../../agents/acceptance-critic.md) context
@@ -46,20 +42,28 @@ per-criterion, mid-delivery, and evaluates the actual work product.
46
42
  > kill-switch is **off** (`roleScopedAgents: false`), fall back to
47
43
  > `subagent_type: general-purpose`.
48
44
  >
49
- > **Whether to spawn fresh at all is risk-routed** (mirrors the risk
50
- > review-depth and risk audit-lens routers). Resolve it per cluster with
51
- > `resolveCeremonyForRisk` from
45
+ > **Whether to spawn fresh at all is routed off the derived change level**
46
+ > the same signal `review-depth.js` resolves depth from, so the two
47
+ > decisions cannot disagree. Derive it with `deriveChangeLevel` from
48
+ > [`review-depth.js`](../../scripts/lib/orchestration/review-depth.js) over
49
+ > the Story's changed files (`git diff --name-only main...story-<id>`), then
50
+ > resolve the ceremony per cluster with `resolveCeremonyForRisk` from
52
51
  > [`ceremony-routing.js`](../../scripts/lib/orchestration/ceremony-routing.js)
53
- > using the Epic's `planningRisk.overallLevel` and
54
- > `delivery.routing.freshCriticSampleRate`:
55
- > **`high`/`medium` risk → `fresh`** (spawn the critic); **`low` risk
56
- > `inline`** (the contract-identical inline fallback below), **except** the
57
- > `freshCriticSampleRate` fraction of low-risk clusters the sampling floor
58
- > forces `fresh` so low risk never means zero independent checking; **missing
59
- > / unknown risk → `fresh` + full ceremony** (fail-safe). This chooses
60
- > fresh-vs-inline **per cluster only — it never changes the cluster count**.
52
+ > using that `derivedLevel` and `delivery.routing.freshCriticSampleRate`:
53
+ > **`high` (the diff touches a sensitive path registered in
54
+ > `audit-rules.json`) → `fresh`** (spawn the critic); **`low` (it touches
55
+ > none) → `inline`** (the contract-identical inline fallback below),
56
+ > **except** the `freshCriticSampleRate` fraction of low-level clusters the
57
+ > sampling floor forces `fresh` so a low level never means zero independent
58
+ > checking; **`null` / unknown (the diff could not be enumerated) → `fresh` +
59
+ > full ceremony** (fail-safe). This chooses fresh-vs-inline **per cluster
60
+ > only — it never changes the cluster count**.
61
61
  >
62
- > **Inline-critic path (low-risk-routed OR nesting-absent harness).** The
62
+ > Story #4542 re-based this off the planner-authored risk verdict: a level
63
+ > the plan asserted about itself was exactly the signal that could *reduce*
64
+ > independent checking, and nothing verified it against the diff.
65
+ >
66
+ > **Inline-critic path (low-level-routed OR nesting-absent harness).** The
63
67
  > verdict is authored **inline** whenever the risk router above resolves to
64
68
  > `inline` (a low-risk cluster not caught by the sampling floor), and also as
65
69
  > a **fallback** on any harness that cannot spawn the fresh critic.
@@ -100,15 +104,9 @@ per-criterion, mid-delivery, and evaluates the actual work product.
100
104
  HEAD-sha key enforces "unchanged HEAD") and pass the exact gate name:
101
105
 
102
106
  ```bash
103
- # Epic-attached Story:
104
107
  node <main-repo>/.agents/scripts/evidence-gate.js \
105
- --epic-id <epicId> --scope-id <storyId> --gate lint \
108
+ --standalone --scope-id <storyId> --gate lint \
106
109
  --worktree <worktree> -- npm run lint
107
-
108
- # Standalone Story (no parent Epic) — use --standalone, omit --epic-id:
109
- node <main-repo>/.agents/scripts/evidence-gate.js \
110
- --standalone --scope-id <storyId> --gate typecheck \
111
- --worktree <worktree> -- <resolved typecheck command>
112
110
  ```
113
111
 
114
112
  Close's `shouldSkip` then short-circuits that gate when HEAD is
@@ -122,13 +120,11 @@ per-criterion, mid-delivery, and evaluates the actual work product.
122
120
  one `{ index, criterion, verdict: met|partial|unmet, evidence,
123
121
  verifyEvidence[] }` record per acceptance item.
124
122
  2. **Decide.** Run the gate against the verdict (the caller's Step 1a names the
125
- exact invocation — standalone omits `--epic`; the Epic-attached path passes
126
- `--epic <epicId>` so the per-criterion signal lands on the Epic-scoped
127
- stream):
123
+ exact invocation — omit `--epic`):
128
124
 
129
125
  ```bash
130
126
  node <main-repo>/.agents/scripts/acceptance-eval.js \
131
- --story <storyId> [--epic <epicId>] --verdict <verdict-path>
127
+ --story <storyId> --verdict <verdict-path>
132
128
  ```
133
129
 
134
130
  The gate validates the verdict against the schema, applies the round cap,
@@ -138,11 +134,10 @@ per-criterion, mid-delivery, and evaluates the actual work product.
138
134
  close.
139
135
  - **`decision: "redraft"`** (some `partial`/`unmet`, rounds remaining) →
140
136
  exit 0. Redraft the flagged criteria (named in `unmetCriteria[]`), commit
141
- the fix, and re-run the eval pass for the next round.
137
+ the fix, and start another round.
142
138
  - **`decision: "block"`** (round cap reached, criteria still unmet) → exit
143
139
  non-zero. **Do not proceed to close.** Take the caller's blocked path
144
- (transition to `agent::blocked` / flip the snapshot to `blocked`) and post
145
- a `friction` comment naming the unmet criteria and their evidence. Never
146
- silently proceed to close.
140
+ (transition to `agent::blocked`) and post a `friction` comment naming the
141
+ unmet criteria and their evidence. Never silently proceed to close.
147
142
 
148
143
  Write the verdict files under `temp/` only — they are scratch artifacts.
@@ -58,13 +58,13 @@ review-time prose rule.
58
58
 
59
59
  Per-file Maintainability Index (MI) is tracked in
60
60
  [`baselines/maintainability.json`](../../../baselines/maintainability.json).
61
- A commit that drops a file's MI by more than
62
- `delivery.quality.codingGuardrails.miDropMustRefactor` points (default
63
- `1.5`) requires a refactor in the same Story — not a baseline bump. The MI
64
- ratchet's per-file `tolerance` (default `0.5`) is a noise filter, **not**
65
- permission to spend the budget; the 1.5-point ceiling is the upper bound
66
- above which the change is treated as a regression that must be undone or
67
- offset, not absorbed.
61
+ A commit that drops a file's MI by more than the configured
62
+ `delivery.quality.gates.maintainability.tolerance` (default `0.5` points)
63
+ requires a refactor in the same Story — not a baseline bump. `tolerance` is
64
+ the single MI-drop control: it is not a noise filter beneath a separate
65
+ must-refactor ceiling any drop past it is treated as a regression that
66
+ must be undone or offset, not absorbed. Set `tolerance` higher only when the
67
+ project deliberately wants a looser MI-drop budget.
68
68
 
69
69
  `quality:preview --changed-since HEAD` shows the per-file MI delta in the
70
70
  working tree before the commit lands.