mandrel 1.94.0 → 2.0.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 (393) hide show
  1. package/.agents/README.md +59 -73
  2. package/.agents/agents/story-worker.md +12 -13
  3. package/.agents/docs/SDLC.md +489 -1285
  4. package/.agents/docs/agentrc-reference.json +177 -67
  5. package/.agents/docs/configuration.md +104 -138
  6. package/.agents/docs/execution-reference.md +17 -20
  7. package/.agents/docs/quality-gates.md +13 -19
  8. package/.agents/docs/workflows.md +3 -3
  9. package/.agents/instructions.md +70 -81
  10. package/.agents/rules/ci-remediation.md +8 -12
  11. package/.agents/rules/git-conventions-reference.md +6 -7
  12. package/.agents/rules/git-conventions.md +16 -22
  13. package/.agents/schemas/acceptance-eval-verdict.schema.json +1 -1
  14. package/.agents/schemas/agentrc.schema.json +54 -214
  15. package/.agents/schemas/lifecycle/ledger-record.schema.json +1 -1
  16. package/.agents/schemas/lifecycle/retro.end.schema.json +1 -1
  17. package/.agents/schemas/risk-verdict.schema.json +0 -13
  18. package/.agents/scripts/analyze-execution.js +1 -1
  19. package/.agents/scripts/audit-to-stories.js +7 -7
  20. package/.agents/scripts/boot-sweep.js +1 -1
  21. package/.agents/scripts/check-lifecycle-lint.js +6 -9
  22. package/.agents/scripts/check-prepush-recovery.js +1 -1
  23. package/.agents/scripts/cleanup-repo-test-temp.js +6 -1
  24. package/.agents/scripts/lib/Logger.js +6 -10
  25. package/.agents/scripts/lib/audit-suite/runner.js +2 -2
  26. package/.agents/scripts/lib/audit-suite/selector.js +5 -5
  27. package/.agents/scripts/lib/audit-to-stories/{seed-epic-from-findings.js → seed-from-findings.js} +9 -9
  28. package/.agents/scripts/lib/baselines/kernel.js +206 -18
  29. package/.agents/scripts/lib/baselines/kinds/maintainability.js +0 -4
  30. package/.agents/scripts/lib/baselines/reader.js +1 -6
  31. package/.agents/scripts/lib/bdd-runner-detect.js +5 -9
  32. package/.agents/scripts/lib/bootstrap/issue-forms-template.js +32 -33
  33. package/.agents/scripts/lib/checks/core-bare-clean.js +2 -2
  34. package/.agents/scripts/lib/checks/index.js +2 -1
  35. package/.agents/scripts/lib/checks/story-init-not-backgrounded.js +23 -21
  36. package/.agents/scripts/lib/cli/standard-args.js +13 -22
  37. package/.agents/scripts/lib/cli-args.js +16 -7
  38. package/.agents/scripts/lib/close-validation/gates.js +2 -2
  39. package/.agents/scripts/lib/config/ci.js +6 -31
  40. package/.agents/scripts/lib/config/delivery-routing.js +45 -29
  41. package/.agents/scripts/lib/config/explain.js +55 -36
  42. package/.agents/scripts/lib/config/limits.js +17 -58
  43. package/.agents/scripts/lib/config/paths.js +0 -2
  44. package/.agents/scripts/lib/config/quality.js +1 -1
  45. package/.agents/scripts/lib/config/runners.js +17 -50
  46. package/.agents/scripts/lib/config/temp-paths.js +19 -14
  47. package/.agents/scripts/lib/config/worktree-isolation.js +0 -5
  48. package/.agents/scripts/lib/config-resolver.js +2 -7
  49. package/.agents/scripts/lib/config-settings-schema-delivery.js +24 -148
  50. package/.agents/scripts/lib/config-settings-schema-quality.js +8 -14
  51. package/.agents/scripts/lib/config-settings-schema.js +52 -38
  52. package/.agents/scripts/lib/dependency-parser.js +3 -2
  53. package/.agents/scripts/lib/doc-tiers.js +2 -2
  54. package/.agents/scripts/lib/duplicate-search.js +211 -41
  55. package/.agents/scripts/lib/feedback-loop/retro-proposals-graduator.js +1 -1
  56. package/.agents/scripts/lib/findings/promote-finding.js +5 -5
  57. package/.agents/scripts/lib/framework-version.js +2 -3
  58. package/.agents/scripts/lib/git-branch-cleanup.js +1 -10
  59. package/.agents/scripts/lib/git-branch-lifecycle.js +17 -22
  60. package/.agents/scripts/lib/git-utils.js +32 -6
  61. package/.agents/scripts/lib/github/framework-repo.js +6 -0
  62. package/.agents/scripts/lib/label-constants.js +10 -23
  63. package/.agents/scripts/lib/label-taxonomy.js +9 -43
  64. package/.agents/scripts/lib/observability/active-story-env.js +1 -1
  65. package/.agents/scripts/lib/observability/hook-heartbeat.js +20 -52
  66. package/.agents/scripts/lib/observability/source-classifier.js +3 -3
  67. package/.agents/scripts/lib/onboard/init-tail.js +1 -3
  68. package/.agents/scripts/lib/orchestration/audit-lens-routing.js +128 -0
  69. package/.agents/scripts/lib/orchestration/bookkeeping-outbox.js +8 -5
  70. package/.agents/scripts/lib/orchestration/ceremony-routing.js +83 -20
  71. package/.agents/scripts/lib/orchestration/code-review.js +20 -268
  72. package/.agents/scripts/lib/orchestration/column-sync.js +1 -1
  73. package/.agents/scripts/lib/orchestration/consolidation-precondition.js +1 -1
  74. package/.agents/scripts/lib/orchestration/context-envelope.js +2 -5
  75. package/.agents/scripts/lib/orchestration/docs-digest.js +8 -8
  76. package/.agents/scripts/lib/orchestration/file-assumptions.js +7 -13
  77. package/.agents/scripts/lib/orchestration/git-cleanup/phases/cli.js +1 -1
  78. package/.agents/scripts/lib/orchestration/lifecycle/emit-loop-tick.js +8 -8
  79. package/.agents/scripts/lib/orchestration/lifecycle/emit-story-heartbeat.js +2 -2
  80. package/.agents/scripts/lib/orchestration/lifecycle/ledger-writer.js +6 -3
  81. package/.agents/scripts/lib/orchestration/lifecycle/listeners/README.md +17 -43
  82. package/.agents/scripts/lib/orchestration/lint-baseline-service.js +4 -4
  83. package/.agents/scripts/lib/orchestration/merge-block-class.js +1 -1
  84. package/.agents/scripts/lib/orchestration/phase-runner.js +3 -2
  85. package/.agents/scripts/lib/orchestration/plan-context.js +248 -266
  86. package/.agents/scripts/lib/orchestration/plan-critics-evaluate.js +1 -1
  87. package/.agents/scripts/lib/orchestration/plan-navigation.js +92 -0
  88. package/.agents/scripts/lib/orchestration/plan-persist/fan-out-gate.js +61 -0
  89. package/.agents/scripts/lib/orchestration/plan-persist/persist-helpers.js +97 -0
  90. package/.agents/scripts/lib/orchestration/plan-persist/run-plan-persist.js +223 -854
  91. package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +361 -0
  92. package/.agents/scripts/lib/orchestration/plan-persist/summary.js +35 -108
  93. package/.agents/scripts/lib/orchestration/plan-reachability.js +9 -14
  94. package/.agents/scripts/lib/orchestration/plan-runner/worktree-sweep.js +1 -1
  95. package/.agents/scripts/lib/orchestration/{epic-plan-spec/phases → planning}/authoring-context.js +13 -13
  96. package/.agents/scripts/lib/orchestration/planning/decomposer-context.js +27 -0
  97. package/.agents/scripts/lib/orchestration/{epic-plan-spec/phases → planning}/risk-verdict.js +3 -4
  98. package/.agents/scripts/lib/orchestration/post-merge/phases/branch-cleanup.js +2 -2
  99. package/.agents/scripts/lib/orchestration/post-merge/phases/dashboard-refresh.js +8 -20
  100. package/.agents/scripts/lib/orchestration/post-merge/phases/worktree-reap.js +3 -2
  101. package/.agents/scripts/lib/orchestration/pr-base-guard.js +18 -28
  102. package/.agents/scripts/lib/orchestration/preflight-cache.js +5 -5
  103. package/.agents/scripts/lib/orchestration/remote-verifier.js +1 -1
  104. package/.agents/scripts/lib/orchestration/resolve-plan-run.js +155 -0
  105. package/.agents/scripts/lib/orchestration/resolves-token.js +1 -1
  106. package/.agents/scripts/lib/orchestration/retro-perf-heuristics.js +8 -8
  107. package/.agents/scripts/lib/orchestration/retro-proposals.js +140 -79
  108. package/.agents/scripts/lib/orchestration/review-depth.js +26 -12
  109. package/.agents/scripts/lib/orchestration/review-providers/codex.js +2 -2
  110. package/.agents/scripts/lib/orchestration/review-providers/review-provider-factory.js +21 -56
  111. package/.agents/scripts/lib/orchestration/run-epilogue.js +426 -0
  112. package/.agents/scripts/lib/orchestration/single-story-close/phases/auto-merge.js +1 -1
  113. package/.agents/scripts/lib/orchestration/single-story-close/phases/code-review.js +95 -41
  114. package/.agents/scripts/lib/orchestration/single-story-close/phases/options.js +16 -13
  115. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-block.js +40 -0
  116. package/.agents/scripts/lib/orchestration/single-story-close/runner.js +11 -3
  117. package/.agents/scripts/lib/orchestration/spec-freshness.js +14 -205
  118. package/.agents/scripts/lib/orchestration/spec-section-validator.js +4 -5
  119. package/.agents/scripts/lib/orchestration/spec-spill.js +60 -0
  120. package/.agents/scripts/lib/orchestration/split-policy-validator.js +188 -0
  121. package/.agents/scripts/lib/orchestration/story-close/emit-blocked.js +49 -0
  122. package/.agents/scripts/lib/orchestration/story-close/phases/code-review.js +15 -12
  123. package/.agents/scripts/lib/orchestration/story-follow-ups.js +237 -0
  124. package/.agents/scripts/lib/orchestration/story-init-remote.js +47 -0
  125. package/.agents/scripts/lib/orchestration/story-plan-state.js +48 -0
  126. package/.agents/scripts/lib/orchestration/{epic-runner → story-progress}/story-run-progress-writer.js +3 -3
  127. package/.agents/scripts/lib/orchestration/structured-comment-parser.js +1 -1
  128. package/.agents/scripts/lib/orchestration/task-body-validator.js +8 -18
  129. package/.agents/scripts/lib/orchestration/ticket-validator-conflicts.js +11 -61
  130. package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +189 -373
  131. package/.agents/scripts/lib/orchestration/ticket-validator.js +2 -7
  132. package/.agents/scripts/lib/orchestration/ticketing/bulk.js +0 -25
  133. package/.agents/scripts/lib/orchestration/ticketing/reads.js +29 -26
  134. package/.agents/scripts/lib/orchestration/ticketing/transition.js +5 -5
  135. package/.agents/scripts/lib/planning-corpus.js +16 -11
  136. package/.agents/scripts/lib/preflight-runner.js +2 -2
  137. package/.agents/scripts/lib/qa/coverage-verdict.js +5 -5
  138. package/.agents/scripts/lib/single-story/confirm-merge-follow-ups.js +36 -0
  139. package/.agents/scripts/lib/single-story-sweep/protection-ctx.js +1 -1
  140. package/.agents/scripts/lib/story-adjacency.js +11 -14
  141. package/.agents/scripts/lib/story-body/story-body.js +124 -70
  142. package/.agents/scripts/lib/story-plan.js +2 -4
  143. package/.agents/scripts/lib/templates/decomposer-prompts.js +46 -45
  144. package/.agents/scripts/lib/templates/spec-author-prompts.js +47 -45
  145. package/.agents/scripts/lib/{epic-body-sections.js → ticket-body-sections.js} +26 -26
  146. package/.agents/scripts/lib/validation-evidence.js +1 -1
  147. package/.agents/scripts/lib/wave-runner/ready-set.js +6 -6
  148. package/.agents/scripts/lib/workspace-provisioner.js +1 -1
  149. package/.agents/scripts/lib/worktree/lifecycle/reap.js +5 -7
  150. package/.agents/scripts/lint-issue-body.js +71 -40
  151. package/.agents/scripts/mandrel-update-preflight.js +1 -1
  152. package/.agents/scripts/notify.js +4 -3
  153. package/.agents/scripts/plan-context.js +64 -74
  154. package/.agents/scripts/plan-persist.js +121 -280
  155. package/.agents/scripts/plan-run-epilogue.js +97 -0
  156. package/.agents/scripts/providers/github/issues.js +17 -33
  157. package/.agents/scripts/providers/github/mappers.js +0 -12
  158. package/.agents/scripts/providers/github/tickets.js +2 -5
  159. package/.agents/scripts/resolve-plan-run.js +117 -0
  160. package/.agents/scripts/signals-view.js +24 -19
  161. package/.agents/scripts/single-story-close.js +11 -14
  162. package/.agents/scripts/single-story-confirm-merge.js +39 -23
  163. package/.agents/scripts/single-story-init.js +29 -20
  164. package/.agents/scripts/stories-wave-tick.js +6 -6
  165. package/.agents/scripts/story-plan.js +26 -47
  166. package/.agents/scripts/update-ticket-state.js +6 -15
  167. package/.agents/skills/core/analyze-execution/SKILL.md +21 -18
  168. package/.agents/skills/core/idea-refinement/SKILL.md +6 -6
  169. package/.agents/skills/core/scope-triage/SKILL.md +28 -172
  170. package/.agents/skills/skills.index.json +3 -43
  171. package/.agents/starter-agentrc.json +0 -5
  172. package/.agents/templates/agent-protocol.md +9 -10
  173. package/.agents/workflows/audit-architecture.md +3 -3
  174. package/.agents/workflows/audit-clean-code.md +3 -3
  175. package/.agents/workflows/audit-dependencies.md +3 -3
  176. package/.agents/workflows/audit-devops.md +3 -3
  177. package/.agents/workflows/audit-documentation.md +5 -5
  178. package/.agents/workflows/audit-lighthouse.md +3 -3
  179. package/.agents/workflows/audit-navigability.md +3 -2
  180. package/.agents/workflows/audit-performance.md +3 -3
  181. package/.agents/workflows/audit-privacy.md +3 -3
  182. package/.agents/workflows/audit-quality.md +3 -3
  183. package/.agents/workflows/audit-security.md +3 -3
  184. package/.agents/workflows/audit-seo.md +3 -3
  185. package/.agents/workflows/audit-sre.md +3 -3
  186. package/.agents/workflows/audit-to-stories.md +20 -20
  187. package/.agents/workflows/audit-ux-ui.md +3 -3
  188. package/.agents/workflows/deliver.md +122 -174
  189. package/.agents/workflows/git-cleanup.md +3 -4
  190. package/.agents/workflows/helpers/_merge-conflict-template.md +1 -1
  191. package/.agents/workflows/helpers/acceptance-self-eval.md +16 -29
  192. package/.agents/workflows/helpers/code-review.md +70 -193
  193. package/.agents/workflows/helpers/{single-story-deliver-reference.md → deliver-story-reference.md} +12 -14
  194. package/.agents/workflows/helpers/{single-story-deliver.md → deliver-story.md} +113 -139
  195. package/.agents/workflows/helpers/diagnose.md +10 -10
  196. package/.agents/workflows/helpers/parallel-tooling.md +1 -1
  197. package/.agents/workflows/helpers/signals.md +16 -16
  198. package/.agents/workflows/helpers/worktree-lifecycle.md +48 -64
  199. package/.agents/workflows/mandrel-update.md +2 -1
  200. package/.agents/workflows/plan.md +112 -145
  201. package/.agents/workflows/qa-assist.md +24 -30
  202. package/.agents/workflows/qa-explore.md +29 -38
  203. package/.agents/workflows/qa-run.md +2 -2
  204. package/README.md +9 -8
  205. package/docs/CHANGELOG.md +30 -0
  206. package/lib/migrations/index.js +6 -5
  207. package/package.json +2 -2
  208. package/.agents/agents/retro.md +0 -42
  209. package/.agents/personas/architect.md +0 -113
  210. package/.agents/personas/devops-engineer.md +0 -38
  211. package/.agents/personas/engineer.md +0 -33
  212. package/.agents/personas/project-manager.md +0 -114
  213. package/.agents/personas/qa-engineer.md +0 -95
  214. package/.agents/personas/security-engineer.md +0 -111
  215. package/.agents/personas/technical-writer.md +0 -101
  216. package/.agents/schemas/dispatch-manifest.json +0 -232
  217. package/.agents/schemas/epic-spec.schema.json +0 -153
  218. package/.agents/schemas/lifecycle/slice.end.schema.json +0 -21
  219. package/.agents/schemas/lifecycle/slice.heartbeat.schema.json +0 -20
  220. package/.agents/schemas/lifecycle/slice.start.schema.json +0 -17
  221. package/.agents/scripts/acceptance-spec-reconciler.js +0 -642
  222. package/.agents/scripts/bookkeeping-reconcile.js +0 -117
  223. package/.agents/scripts/dispatcher.js +0 -295
  224. package/.agents/scripts/epic-audit-prepare.js +0 -497
  225. package/.agents/scripts/epic-audit-recheck.js +0 -274
  226. package/.agents/scripts/epic-deliver-note-intervention.js +0 -192
  227. package/.agents/scripts/epic-deliver-preflight.js +0 -462
  228. package/.agents/scripts/epic-deliver-prepare.js +0 -852
  229. package/.agents/scripts/epic-execute-record-wave.js +0 -449
  230. package/.agents/scripts/epic-plan-clarity.js +0 -211
  231. package/.agents/scripts/epic-plan-healthcheck.js +0 -581
  232. package/.agents/scripts/epic-reconcile.js +0 -625
  233. package/.agents/scripts/lib/baseline-snapshot.js +0 -979
  234. package/.agents/scripts/lib/checks/epic-merge-lock-stale.js +0 -54
  235. package/.agents/scripts/lib/checks/stale-origin-epic.js +0 -49
  236. package/.agents/scripts/lib/config/lifecycle.js +0 -40
  237. package/.agents/scripts/lib/config/preflight.js +0 -58
  238. package/.agents/scripts/lib/config/retro.js +0 -77
  239. package/.agents/scripts/lib/epic-merge-lock.js +0 -322
  240. package/.agents/scripts/lib/epic-plan-clarity.js +0 -181
  241. package/.agents/scripts/lib/epic-plan-ideation.js +0 -261
  242. package/.agents/scripts/lib/orchestration/context-hydration-engine.js +0 -539
  243. package/.agents/scripts/lib/orchestration/deliver-route.js +0 -173
  244. package/.agents/scripts/lib/orchestration/dispatch-engine.js +0 -134
  245. package/.agents/scripts/lib/orchestration/dispatch-pipeline.js +0 -183
  246. package/.agents/scripts/lib/orchestration/epic-cleanup.js +0 -801
  247. package/.agents/scripts/lib/orchestration/epic-deliver-lease-guard.js +0 -310
  248. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/context.js +0 -163
  249. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/creation.js +0 -140
  250. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/dag.js +0 -64
  251. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/diagnostics.js +0 -72
  252. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/persist-helpers.js +0 -156
  253. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/persist.js +0 -345
  254. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/planning-artifacts.js +0 -41
  255. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/reconcile-spawn.js +0 -86
  256. package/.agents/scripts/lib/orchestration/epic-plan-lease-guard.js +0 -391
  257. package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/drain.js +0 -94
  258. package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/plan-epic.js +0 -236
  259. package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/run-spec-phase.js +0 -307
  260. package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/spec-freshness.js +0 -117
  261. package/.agents/scripts/lib/orchestration/epic-plan-state-store.js +0 -117
  262. package/.agents/scripts/lib/orchestration/epic-run-state-store.js +0 -621
  263. package/.agents/scripts/lib/orchestration/epic-runner/concurrency-gate.js +0 -186
  264. package/.agents/scripts/lib/orchestration/epic-runner/deliver-phases.js +0 -50
  265. package/.agents/scripts/lib/orchestration/epic-runner/phases/build-wave-dag.js +0 -129
  266. package/.agents/scripts/lib/orchestration/epic-runner/phases/snapshot.js +0 -103
  267. package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter/composition.js +0 -267
  268. package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter/signals.js +0 -210
  269. package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter/transport.js +0 -238
  270. package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/_bullet-format.js +0 -32
  271. package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/component-drift.js +0 -203
  272. package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/crap-drift.js +0 -227
  273. package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/maintainability-drift.js +0 -117
  274. package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/stalled-worktree.js +0 -37
  275. package/.agents/scripts/lib/orchestration/epic-runner/story-launcher.js +0 -127
  276. package/.agents/scripts/lib/orchestration/epic-runner/sub-agent-return.js +0 -276
  277. package/.agents/scripts/lib/orchestration/epic-runner/wave-scheduler.js +0 -66
  278. package/.agents/scripts/lib/orchestration/epic-spec-reconciler-apply.js +0 -789
  279. package/.agents/scripts/lib/orchestration/epic-spec-reconciler-diff.js +0 -676
  280. package/.agents/scripts/lib/orchestration/epic-spec-reconciler-discriminator.js +0 -389
  281. package/.agents/scripts/lib/orchestration/epic-spec-reconciler-format.js +0 -230
  282. package/.agents/scripts/lib/orchestration/epic-spec-reconciler-ops.js +0 -361
  283. package/.agents/scripts/lib/orchestration/finalize/open-or-locate-pr.js +0 -306
  284. package/.agents/scripts/lib/orchestration/finalize/post-handoff-comment.js +0 -489
  285. package/.agents/scripts/lib/orchestration/finalize/sanitize-skip-ci.js +0 -88
  286. package/.agents/scripts/lib/orchestration/lifecycle/emit-slice-lifecycle.js +0 -270
  287. package/.agents/scripts/lib/orchestration/lifecycle/emit-story-dispatch-end.js +0 -147
  288. package/.agents/scripts/lib/orchestration/lifecycle/listeners/acceptance-reconciler.js +0 -465
  289. package/.agents/scripts/lib/orchestration/lifecycle/listeners/automerge-armer.js +0 -501
  290. package/.agents/scripts/lib/orchestration/lifecycle/listeners/automerge-predicate.js +0 -984
  291. package/.agents/scripts/lib/orchestration/lifecycle/listeners/branch-cleaner.js +0 -264
  292. package/.agents/scripts/lib/orchestration/lifecycle/listeners/checkpoint-pointer-writer.js +0 -284
  293. package/.agents/scripts/lib/orchestration/lifecycle/listeners/cleaner.js +0 -355
  294. package/.agents/scripts/lib/orchestration/lifecycle/listeners/finalizer.js +0 -673
  295. package/.agents/scripts/lib/orchestration/lifecycle/listeners/index.js +0 -378
  296. package/.agents/scripts/lib/orchestration/lifecycle/listeners/intervention-recorder.js +0 -140
  297. package/.agents/scripts/lib/orchestration/lifecycle/listeners/label-transitioner.js +0 -144
  298. package/.agents/scripts/lib/orchestration/lifecycle/listeners/notify-dispatcher.js +0 -174
  299. package/.agents/scripts/lib/orchestration/manifest-builder.js +0 -222
  300. package/.agents/scripts/lib/orchestration/plan-persist/amend.js +0 -359
  301. package/.agents/scripts/lib/orchestration/plan-persist/delivery-mode.js +0 -127
  302. package/.agents/scripts/lib/orchestration/post-merge-pipeline.js +0 -205
  303. package/.agents/scripts/lib/orchestration/recurring-failure-detector.js +0 -152
  304. package/.agents/scripts/lib/orchestration/retro/phases/checks.js +0 -94
  305. package/.agents/scripts/lib/orchestration/retro/phases/compose-body.js +0 -571
  306. package/.agents/scripts/lib/orchestration/retro/phases/gather-signals.js +0 -450
  307. package/.agents/scripts/lib/orchestration/retro/phases/post-and-mirror.js +0 -191
  308. package/.agents/scripts/lib/orchestration/retro-heuristics.js +0 -57
  309. package/.agents/scripts/lib/orchestration/retro-runner.js +0 -197
  310. package/.agents/scripts/lib/orchestration/spec-renderer.js +0 -447
  311. package/.agents/scripts/lib/orchestration/story-close/auto-refresh-runner.js +0 -747
  312. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/gate-failure.js +0 -211
  313. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/pre-merge-attribution.js +0 -158
  314. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/refresh-commit.js +0 -446
  315. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/regression-projection.js +0 -297
  316. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/scope-discovery.js +0 -48
  317. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution-wiring.js +0 -67
  318. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution.js +0 -161
  319. package/.agents/scripts/lib/orchestration/story-close/baseline-friction-body.js +0 -117
  320. package/.agents/scripts/lib/orchestration/story-close/cd-out-guard.js +0 -86
  321. package/.agents/scripts/lib/orchestration/story-close/cleanup-reconciler.js +0 -147
  322. package/.agents/scripts/lib/orchestration/story-close/close-inputs.js +0 -142
  323. package/.agents/scripts/lib/orchestration/story-close/comment-bodies.js +0 -62
  324. package/.agents/scripts/lib/orchestration/story-close/merge-runner.js +0 -658
  325. package/.agents/scripts/lib/orchestration/story-close/merge-subject.js +0 -198
  326. package/.agents/scripts/lib/orchestration/story-close/phases/branch-restore.js +0 -105
  327. package/.agents/scripts/lib/orchestration/story-close/phases/close.js +0 -222
  328. package/.agents/scripts/lib/orchestration/story-close/phases/gates.js +0 -292
  329. package/.agents/scripts/lib/orchestration/story-close/phases/locked-pipeline.js +0 -270
  330. package/.agents/scripts/lib/orchestration/story-close/phases/preflight.js +0 -110
  331. package/.agents/scripts/lib/orchestration/story-close/phases/refresh.js +0 -86
  332. package/.agents/scripts/lib/orchestration/story-close/phases/timeout-blocked-emitter.js +0 -112
  333. package/.agents/scripts/lib/orchestration/story-close/phases/timeout-blocked.js +0 -157
  334. package/.agents/scripts/lib/orchestration/story-close/post-merge-close.js +0 -421
  335. package/.agents/scripts/lib/orchestration/story-close/pre-merge-validation.js +0 -302
  336. package/.agents/scripts/lib/orchestration/story-close/shared-checkout-guard.js +0 -163
  337. package/.agents/scripts/lib/orchestration/story-close-recovery.js +0 -690
  338. package/.agents/scripts/lib/orchestration/wave-marker.js +0 -28
  339. package/.agents/scripts/lib/orchestration/wave-record-io.js +0 -218
  340. package/.agents/scripts/lib/orchestration/wave-record-notifications.js +0 -145
  341. package/.agents/scripts/lib/orchestration/wave-record-projection.js +0 -212
  342. package/.agents/scripts/lib/presentation/dispatch-manifest-render.js +0 -111
  343. package/.agents/scripts/lib/presentation/manifest-builder.js +0 -239
  344. package/.agents/scripts/lib/presentation/manifest-formatter.js +0 -242
  345. package/.agents/scripts/lib/presentation/manifest-helpers.js +0 -213
  346. package/.agents/scripts/lib/presentation/manifest-persistence.js +0 -261
  347. package/.agents/scripts/lib/presentation/manifest-procedures.js +0 -55
  348. package/.agents/scripts/lib/presentation/manifest-render-waves.js +0 -306
  349. package/.agents/scripts/lib/presentation/manifest-renderer.js +0 -188
  350. package/.agents/scripts/lib/presentation/manifest-story-views.js +0 -110
  351. package/.agents/scripts/lib/push-epic-retry.js +0 -209
  352. package/.agents/scripts/lib/spec/index.js +0 -36
  353. package/.agents/scripts/lib/spec/loader.js +0 -425
  354. package/.agents/scripts/lib/spec/state.js +0 -208
  355. package/.agents/scripts/lib/story-init/blocker-validator.js +0 -68
  356. package/.agents/scripts/lib/story-init/branch-initializer.js +0 -408
  357. package/.agents/scripts/lib/story-init/context-resolver.js +0 -92
  358. package/.agents/scripts/lib/story-init/donor-precheck.js +0 -207
  359. package/.agents/scripts/lib/story-init/state-transitioner.js +0 -80
  360. package/.agents/scripts/lib/story-init/task-graph-builder.js +0 -124
  361. package/.agents/scripts/lib/story-init/transition-summary.js +0 -34
  362. package/.agents/scripts/lib/test-reserved-epic-temp-ids.js +0 -35
  363. package/.agents/scripts/lib/wave-runner/tick.js +0 -754
  364. package/.agents/scripts/lib/wave-runner/wave-runner-error.js +0 -20
  365. package/.agents/scripts/lifecycle-emit-story-dispatch.js +0 -194
  366. package/.agents/scripts/lifecycle-emit.js +0 -510
  367. package/.agents/scripts/retro-run.js +0 -218
  368. package/.agents/scripts/slice-phase.js +0 -361
  369. package/.agents/scripts/standalone-feedback-rollup.js +0 -188
  370. package/.agents/scripts/story-close.js +0 -294
  371. package/.agents/scripts/story-init.js +0 -599
  372. package/.agents/scripts/story-phase.js +0 -369
  373. package/.agents/scripts/wave-tick.js +0 -464
  374. package/.agents/skills/core/epic-plan-consolidate/SKILL.md +0 -172
  375. package/.agents/skills/core/epic-plan-consolidate/examples.md +0 -51
  376. package/.agents/skills/core/epic-plan-decompose-author/SKILL.md +0 -441
  377. package/.agents/skills/core/epic-plan-decompose-author/examples.md +0 -47
  378. package/.agents/skills/core/epic-plan-premortem/SKILL.md +0 -146
  379. package/.agents/skills/core/epic-plan-premortem/examples.md +0 -53
  380. package/.agents/skills/core/epic-plan-spec-author/SKILL.md +0 -383
  381. package/.agents/skills/core/epic-plan-spec-author/examples.md +0 -91
  382. package/.agents/workflows/helpers/deliver-epic-reference.md +0 -547
  383. package/.agents/workflows/helpers/deliver-epic-single.md +0 -331
  384. package/.agents/workflows/helpers/deliver-epic.md +0 -998
  385. package/.agents/workflows/helpers/deliver-stories.md +0 -450
  386. package/.agents/workflows/helpers/epic-audit.md +0 -189
  387. package/.agents/workflows/helpers/epic-deliver-story.md +0 -436
  388. package/.agents/workflows/helpers/epic-testing.md +0 -125
  389. package/.agents/workflows/helpers/plan-epic-reference.md +0 -160
  390. package/.agents/workflows/helpers/plan-epic.md +0 -353
  391. package/.agents/workflows/helpers/plan-story.md +0 -251
  392. package/.agents/workflows/helpers/scope-triage-gate.md +0 -108
  393. /package/.agents/scripts/lib/orchestration/{epic-plan-spec/phases → planning}/spec-authoring-grounding.js +0 -0
@@ -1,17 +1,17 @@
1
1
  /**
2
2
  * story-init-not-backgrounded — refuse-and-print check.
3
3
  *
4
- * Detects orchestration call sites that invoke `story-init.js` via the
5
- * Bash tool's `run_in_background: true` mode (with subsequent `Monitor`
4
+ * Detects orchestration call sites that invoke `single-story-init.js` via
5
+ * the Bash tool's `run_in_background: true` mode (with subsequent `Monitor`
6
6
  * waiting on completion) instead of a synchronous Bash call with a
7
7
  * 10-minute timeout. This guards the failure mode where `Monitor`'s wait
8
8
  * is not equivalent to script exit — a sub-agent that exits during a
9
- * Monitor wait kills `story-init.js` mid-batch, leaving a half-initialized
10
- * worktree and a failed wave aggregator.
9
+ * Monitor wait kills `single-story-init.js` mid-run, leaving a
10
+ * half-initialized worktree.
11
11
  *
12
12
  * Scope: 'epic-deliver', 'story-close', 'retro'. The check runs at every
13
- * preflight surface that has the opportunity to invoke story-init —
14
- * primarily `epic-deliver`'s wave loop — and surfaces as a retro audit
13
+ * preflight surface that has the opportunity to invoke Story init —
14
+ * primarily `/deliver`'s init step — and surfaces as a retro audit
15
15
  * signal if the failure mode resurfaces during a sprint.
16
16
  *
17
17
  * The check is `refuse-and-print`. Auto-rewriting an orchestration call
@@ -20,7 +20,8 @@
20
20
  * synchronous-call replacement pattern so they can apply it deliberately.
21
21
  *
22
22
  * Implementation note: we scan `.agents/` (markdown + js) for the
23
- * juxtaposition of a `story-init.js` reference and a backgrounding token
23
+ * juxtaposition of a `story-init.js` reference (which also matches
24
+ * `single-story-init.js` as a suffix) and a backgrounding token
24
25
  * (`run_in_background: true`, the literal `Monitor` tool name as a
25
26
  * fan-out target, or `&` shell backgrounding) within a small line window.
26
27
  */
@@ -39,7 +40,8 @@ const WINDOW_LINES = 20;
39
40
  * - `run_in_background: true` — Bash tool's backgrounding flag.
40
41
  * - `detached: true` — child_process.spawn options that detach the
41
42
  * subprocess from the parent's lifecycle, equivalent to backgrounding.
42
- * - `story-init.js &` — POSIX shell ampersand backgrounding.
43
+ * - `single-story-init.js &` — POSIX shell ampersand backgrounding
44
+ * (the pattern matches the `story-init.js` suffix of both names).
43
45
  */
44
46
  const BACKGROUND_TOKENS = [
45
47
  /run_in_background\s*:\s*true/,
@@ -85,12 +87,12 @@ function walkSources(dir) {
85
87
 
86
88
  /**
87
89
  * For one file, return an array of `{ line, kind }` offences: every line
88
- * referencing `story-init.js` that has a backgrounding token in the same
89
- * ±WINDOW_LINES window.
90
+ * referencing `story-init.js` (including `single-story-init.js`) that has
91
+ * a backgrounding token in the same ±WINDOW_LINES window.
90
92
  *
91
- * The check explicitly excludes the `story-init.js` file itself and any
92
- * dedicated check module (this file): the source-of-truth implementation
93
- * legitimately mentions itself.
93
+ * The check explicitly excludes the `single-story-init.js` file itself and
94
+ * any dedicated check module (this file): the source-of-truth
95
+ * implementation legitimately mentions itself.
94
96
  *
95
97
  * @param {string} file
96
98
  * @param {string} src
@@ -100,12 +102,12 @@ function scanFile(file, src) {
100
102
  const offences = [];
101
103
  // Don't flag the actual story-init script, self-references, or the
102
104
  // parallel-tooling helper — the helper documents both Rule 2
103
- // (run_in_background) and the story-init.js anti-pattern in adjacent
104
- // bullets, which collides with the scanner's ±20-line window even
105
- // though there is no real invocation in the prose.
105
+ // (run_in_background) and the story-init backgrounding anti-pattern in
106
+ // adjacent bullets, which collides with the scanner's ±20-line window
107
+ // even though there is no real invocation in the prose.
106
108
  const basename = path.basename(file);
107
109
  if (
108
- basename === 'story-init.js' ||
110
+ basename === 'single-story-init.js' ||
109
111
  basename === 'story-init-not-backgrounded.js' ||
110
112
  basename === 'story-init-not-backgrounded.test.js' ||
111
113
  basename === 'parallel-tooling.md'
@@ -129,13 +131,13 @@ function scanFile(file, src) {
129
131
  }
130
132
 
131
133
  const FIX_COMMAND = [
132
- '# Invoke story-init.js synchronously with a 10-minute timeout. The',
133
- '# script is idempotent on partial state, so re-running after a',
134
+ '# Invoke single-story-init.js synchronously with a 10-minute timeout.',
135
+ '# The script is idempotent on partial state, so re-running after a',
134
136
  '# half-initialized worktree is safe — but blocking on the Bash call',
135
137
  '# is what prevents the half-init state in the first place.',
136
138
  '#',
137
139
  '# Replacement pattern (Bash tool):',
138
- '# Bash(timeout: 600000, command: "node .agents/scripts/story-init.js --story <id>")',
140
+ '# Bash(timeout: 600000, command: "node .agents/scripts/single-story-init.js --story <id>")',
139
141
  '#',
140
142
  '# Do NOT use:',
141
143
  '# Bash(run_in_background: true, ...) + Monitor(...)',
@@ -177,7 +179,7 @@ export default {
177
179
  id: 'story-init-not-backgrounded',
178
180
  severity: 'blocker',
179
181
  scope: state?.scope ?? 'epic-deliver',
180
- summary: `${offences.length} orchestration call site(s) invoke story-init.js with Monitor backgrounding`,
182
+ summary: `${offences.length} orchestration call site(s) invoke single-story-init.js with Monitor backgrounding`,
181
183
  detail,
182
184
  fixCommand: FIX_COMMAND,
183
185
  autoCorrectable: false,
@@ -13,7 +13,6 @@
13
13
  *
14
14
  * Contract
15
15
  * --------
16
- * parseStandardCliArgs(argv, schema?) → { values, positionals }
17
16
  * parseStandardCliArgs({ argv, schema?, extras? }) → { values, positionals }
18
17
  *
19
18
  * - `argv` — `process.argv.slice(2)` shape; the helper does NOT strip
@@ -99,24 +98,20 @@ function camelCase(name) {
99
98
  }
100
99
 
101
100
  /**
102
- * Normalize the call signature. Accepts either positional
103
- * `(argv, schema)` (backward compat) or the object form
104
- * `({ argv, schema, extras })`.
101
+ * Validate the call signature. Only the object form
102
+ * `({ argv, schema, extras })` is accepted.
105
103
  *
106
- * @param {unknown} argvOrOpts
107
- * @param {unknown} maybeSchema
104
+ * @param {unknown} opts
108
105
  * @returns {{ argv: string[], schema: object | undefined, extras: object | undefined }}
109
106
  */
110
- function normaliseCallSignature(argvOrOpts, maybeSchema) {
111
- if (
112
- argvOrOpts !== null &&
113
- typeof argvOrOpts === 'object' &&
114
- !Array.isArray(argvOrOpts)
115
- ) {
116
- const { argv, schema, extras } = argvOrOpts;
117
- return { argv: argv ?? [], schema, extras };
107
+ function normaliseCallSignature(opts) {
108
+ if (opts === null || typeof opts !== 'object' || Array.isArray(opts)) {
109
+ throw new Error(
110
+ 'parseStandardCliArgs: options must be a plain object ({ argv, schema?, extras? })',
111
+ );
118
112
  }
119
- return { argv: argvOrOpts ?? [], schema: maybeSchema, extras: undefined };
113
+ const { argv, schema, extras } = opts;
114
+ return { argv: argv ?? [], schema, extras };
120
115
  }
121
116
 
122
117
  /**
@@ -313,15 +308,11 @@ function normaliseValues(raw, extras) {
313
308
  * Parse the dispatcher's shared CLI flag surface. See module docstring
314
309
  * for the full contract.
315
310
  *
316
- * @param {string[]|{argv?: string[], schema?: object, extras?: object}} argvOrOpts
317
- * @param {Record<string, { required?: boolean }>} [maybeSchema]
311
+ * @param {{ argv?: string[], schema?: object, extras?: object }} [opts]
318
312
  * @returns {{ values: Record<string, unknown>, positionals: string[] }}
319
313
  */
320
- export function parseStandardCliArgs(argvOrOpts = [], maybeSchema) {
321
- const { argv, schema, extras } = normaliseCallSignature(
322
- argvOrOpts,
323
- maybeSchema,
324
- );
314
+ export function parseStandardCliArgs(opts = {}) {
315
+ const { argv, schema, extras } = normaliseCallSignature(opts);
325
316
  if (!Array.isArray(argv)) {
326
317
  throw new Error('parseStandardCliArgs: argv must be an array');
327
318
  }
@@ -40,6 +40,12 @@ function coerceBooleanFlag(value) {
40
40
  return Boolean(value);
41
41
  }
42
42
 
43
+ /** Like coerceBooleanFlag, but preserves `undefined` (flag absent). */
44
+ function optionalBooleanFlag(value) {
45
+ if (value === undefined) return undefined;
46
+ return coerceBooleanFlag(value);
47
+ }
48
+
43
49
  /**
44
50
  * Standardized CLI argument parser for sprint scripts.
45
51
  * Supports options like --epic, --story, --dry-run, --skip-dashboard.
@@ -58,7 +64,8 @@ export function parseSprintArgs(args = process.argv) {
58
64
  'skip-sync': { type: 'boolean', default: false },
59
65
  'no-auto-merge': { type: 'boolean', default: false },
60
66
  'no-full-scope-crap': { type: 'boolean', default: false },
61
- 'wait-merge': { type: 'boolean', default: false },
67
+ // No default absent means "use delivery.routing.closeAndLand".
68
+ 'wait-merge': { type: 'boolean' },
62
69
  'no-wait-merge': { type: 'boolean', default: false },
63
70
  executor: { type: 'string' },
64
71
  cwd: { type: 'string' },
@@ -81,11 +88,11 @@ export function parseSprintArgs(args = process.argv) {
81
88
  skipSync: coerceBooleanFlag(values['skip-sync']),
82
89
  noAutoMerge: coerceBooleanFlag(values['no-auto-merge']),
83
90
  noFullScopeCrap: coerceBooleanFlag(values['no-full-scope-crap']),
84
- // Story #4428 — headless must-land signal for `single-story-close.js`:
85
- // `--wait-merge` opts a headless run into polling to merge confirmation
86
- // instead of resting at `agent::closing`; `--no-wait-merge` is the
87
- // explicit opt-out (see `single-story-close/phases/options.js`).
88
- waitForMerge: coerceBooleanFlag(values['wait-merge']),
91
+ // Close-and-land: `--wait-merge` forces land-in-close; `--no-wait-merge`
92
+ // opts out. When neither flag is present (`undefined`),
93
+ // `parseCloseOptions` applies `delivery.routing.closeAndLand` (default
94
+ // true) so attended and headless delivers share the same happy path.
95
+ waitForMerge: optionalBooleanFlag(values['wait-merge']),
89
96
  noWaitForMerge: coerceBooleanFlag(values['no-wait-merge']),
90
97
  executor: values.executor ?? null,
91
98
  // Resolve worktree cwd from flag or env. Empty string/whitespace → null.
@@ -95,7 +102,9 @@ export function parseSprintArgs(args = process.argv) {
95
102
  null,
96
103
  recutOf: parseTicketId(values['recut-of']),
97
104
  // Story #4253: pre-resolved Epic linkage threaded by the /deliver
98
- // fan-out so `story-init.js` can skip the per-Story `getEpic` round-trip.
105
+ // fan-out so `single-story-init.js` can skip redundant Epic lookups when
106
+ // the parent already threaded Epic context (pre-v2; field retained for
107
+ // CLI compatibility).
99
108
  resume: values.resume ?? false,
100
109
  restart: values.restart ?? false,
101
110
  noEvidence: values['no-evidence'] ?? false,
@@ -146,7 +146,7 @@ function enabledBaselineKinds(config) {
146
146
  * `delivery.quality.requireBaselines: true`. Default false — a consumer that
147
147
  * enables baseline gates but has not committed baseline artifacts gets a
148
148
  * clean skip (see `probeBaselinesGate`) rather than a deterministic first-try
149
- * close failure. Mirrors the `delivery.ci.requireChecks` escape hatch (#4472).
149
+ * close failure. Fail-closed baseline posture (#4495).
150
150
  *
151
151
  * @param {object|undefined|null} config
152
152
  * @returns {boolean}
@@ -379,7 +379,7 @@ export function buildDefaultGates({
379
379
  /**
380
380
  * Default gate list resolved with no consumer config — uses the
381
381
  * `npm run typecheck` fallback for the typecheck gate. Call sites that have a
382
- * resolved config object in scope (e.g. `story-close.js`) should
382
+ * resolved config object in scope (e.g. `single-story-close.js`) should
383
383
  * prefer `buildDefaultGates({ config })` so a configured
384
384
  * `project.commands.typecheck` is honoured.
385
385
  *
@@ -1,30 +1,17 @@
1
1
  /**
2
- * `delivery.ci` accessor + framework defaults — Story #2899 (Epic #2880, F13)
3
- * and Story #4356 (Epic #4355).
2
+ * `delivery.ci` accessor + framework defaults — Story #4356 (Epic #4355).
4
3
  *
5
- * `delivery.ci.skipForStoryPushes` defaults to `true` so per-Task Story-branch
6
- * commits append a `[skip ci]` trailer out of the box. The Epic-branch merge
7
- * commit produced by `story-close.js`'s merge runner never carries the
8
- * marker — that path is the one consumers actually want CI to evaluate.
9
- *
10
- * Story #4356 adds the CI-aware delivery knobs: `earlyPr` (default `true`)
11
- * gates whether /deliver opens the Epic PR early so CI warms while later
12
- * waves run; `watch` tunes the merge/CI watch poll loop; and `autoMerge`
4
+ * Surviving knobs: `watch` tunes the merge/CI watch poll loop; `autoMerge`
13
5
  * (default `"trust-ci"`) selects the merge posture — `"trust-ci"` merges once
14
6
  * required checks pass, `"strict"` additionally requires a clean review gate.
15
7
  *
16
- * Story #4472 adds `requireChecks` (default `false`): when `true` the
17
- * AutomergePredicate treats a checks-less repo ("no checks reported") as a
18
- * hard block rather than green, so a consumer that wants fail-closed-without-
19
- * checks as policy opts into it explicitly instead of the framework blocking
20
- * implicitly.
8
+ * Retired (no production readers on v2 Story-only delivery): `earlyPr`
9
+ * (Epic early-PR warmup) and `requireChecks` (AutomergePredicate escape hatch
10
+ * whose listener was never landed).
21
11
  */
22
12
 
23
13
  export const CI_DELIVERY_DEFAULTS = Object.freeze({
24
- skipForStoryPushes: true,
25
- earlyPr: true,
26
14
  autoMerge: 'trust-ci',
27
- requireChecks: false,
28
15
  });
29
16
 
30
17
  /**
@@ -35,27 +22,15 @@ export const CI_DELIVERY_DEFAULTS = Object.freeze({
35
22
  * defaults; only the scalar knobs carry framework defaults here.
36
23
  *
37
24
  * @param {object | null | undefined} config
38
- * @returns {{ skipForStoryPushes: boolean, earlyPr: boolean, autoMerge: 'trust-ci' | 'strict', requireChecks: boolean, watch: object | undefined }}
25
+ * @returns {{ autoMerge: 'trust-ci' | 'strict', watch: object | undefined }}
39
26
  */
40
27
  export function getCiDelivery(config) {
41
28
  const ci = config?.delivery?.ci ?? config?.ci ?? config ?? {};
42
29
  return {
43
- skipForStoryPushes:
44
- typeof ci.skipForStoryPushes === 'boolean'
45
- ? ci.skipForStoryPushes
46
- : CI_DELIVERY_DEFAULTS.skipForStoryPushes,
47
- earlyPr:
48
- typeof ci.earlyPr === 'boolean'
49
- ? ci.earlyPr
50
- : CI_DELIVERY_DEFAULTS.earlyPr,
51
30
  autoMerge:
52
31
  ci.autoMerge === 'trust-ci' || ci.autoMerge === 'strict'
53
32
  ? ci.autoMerge
54
33
  : CI_DELIVERY_DEFAULTS.autoMerge,
55
- requireChecks:
56
- typeof ci.requireChecks === 'boolean'
57
- ? ci.requireChecks
58
- : CI_DELIVERY_DEFAULTS.requireChecks,
59
34
  watch:
60
35
  ci.watch && typeof ci.watch === 'object' ? { ...ci.watch } : undefined,
61
36
  };
@@ -1,31 +1,21 @@
1
1
  /**
2
- * `delivery.routing` accessor + framework defaults — Epic #4475 (M4-A),
3
- * the single-delivery-as-default foundation, plus Epic #4478 (M7-B), the
2
+ * `delivery.routing` accessor + framework defaults — Epic #4478 (M7-B), the
4
3
  * role-scoped-boot-context flip and the maker-checker sampling floor.
5
4
  *
6
- * `delivery.routing.singleDelivery` is the **global kill-switch** for the
7
- * single-delivery route. It defaults to `true` (single-delivery is the
8
- * default shape for epic-shaped work), and is shipped INERT in M4-A: the
9
- * `deliver.md` router's single verdict currently falls through to the
10
- * fan-out helper, so flipping this knob has no observable effect until
11
- * M4-B wires `deliver-epic-single.md`.
12
- *
13
- * When set to `false`, `resolveEpicDeliveryRoute` forces EVERY Epic — even
14
- * one carrying the `delivery::single` label or a `decompose.shape:"single"`
15
- * checkpoint — down the fan-out path. This is the instant, per-consumer
16
- * global revert that ships BEFORE the default flips: no code rollback, no
17
- * re-plan, just a config edit.
5
+ * Stage 6 dropped `delivery.routing.singleDelivery` (the v1 epic
6
+ * single-vs-fan-out kill-switch). v2 has one Story delivery path; routing
7
+ * here is only about spawn boot context and critic sampling.
18
8
  *
19
9
  * `delivery.routing.roleScopedAgents` is the **kill-switch for the role-scoped
20
- * boot contexts** (Epic #4478, M7-B). It mirrors the `singleDelivery` shape
21
- * exactly. It defaults to `true`: a converted spawn (`story-worker`,
22
- * `acceptance-critic`) boots on its own `.claude/agents/<role>.md` system
23
- * prompt instead of re-paying the full `CLAUDE.md` @-import closure, which is
24
- * the whole payoff of the context diet (≈50KB → ≈8KB per spawn). When set to
25
- * `false`, every converted spawn falls back to `subagent_type: general-purpose`
26
- * — the instant, code-rollback-free per-consumer revert, and the universal
27
- * escape for hosts that ignore `.claude/agents/`. Flipping it off never drops a
28
- * gate: the fallback is the full-closure agent that ran before M7-B.
10
+ * boot contexts** (Epic #4478, M7-B). It defaults to `true`: a converted spawn
11
+ * (`story-worker`, `acceptance-critic`) boots on its own
12
+ * `.claude/agents/<role>.md` system prompt instead of re-paying the full
13
+ * `CLAUDE.md` @-import closure, which is the whole payoff of the context diet
14
+ * (≈50KB → ≈8KB per spawn). When set to `false`, every converted spawn falls
15
+ * back to `subagent_type: general-purpose` — the instant, code-rollback-free
16
+ * per-consumer revert, and the universal escape for hosts that ignore
17
+ * `.claude/agents/`. Flipping it off never drops a gate: the fallback is the
18
+ * full-closure agent that ran before M7-B.
29
19
  *
30
20
  * `delivery.routing.freshCriticSampleRate` is the **maker-checker sampling
31
21
  * floor** (Epic #4478, M7-B, Part 2). Risk-routed ceremony sends a low-risk
@@ -40,9 +30,16 @@
40
30
  */
41
31
 
42
32
  export const DELIVERY_ROUTING_DEFAULTS = Object.freeze({
43
- singleDelivery: true,
44
33
  roleScopedAgents: true,
45
34
  freshCriticSampleRate: 0.2,
35
+ /** @type {'minimal'|'standard'|'strict'} */
36
+ ceremonyProfile: 'standard',
37
+ /**
38
+ * When true (default), attended `/deliver` lands through merge in one
39
+ * close (`--wait-merge` semantics) instead of stopping at `agent::closing`.
40
+ * Operators opt out per-run with `--no-wait-merge`.
41
+ */
42
+ closeAndLand: true,
46
43
  });
47
44
 
48
45
  /**
@@ -62,6 +59,19 @@ function clampSampleRate(value) {
62
59
  return value;
63
60
  }
64
61
 
62
+ /**
63
+ * Normalize ceremony profile; unknown values → `standard`.
64
+ *
65
+ * @param {unknown} value
66
+ * @returns {'minimal'|'standard'|'strict'}
67
+ */
68
+ function normalizeCeremonyProfile(value) {
69
+ if (value === 'minimal' || value === 'standard' || value === 'strict') {
70
+ return value;
71
+ }
72
+ return DELIVERY_ROUTING_DEFAULTS.ceremonyProfile;
73
+ }
74
+
65
75
  /**
66
76
  * Read the merged `delivery.routing` block, applying framework defaults for
67
77
  * any field the operator omitted. Accepts the full resolved config, the bare
@@ -69,19 +79,25 @@ function clampSampleRate(value) {
69
79
  * tolerant unwrap so callers can pass whichever shape they hold.
70
80
  *
71
81
  * @param {object | null | undefined} config
72
- * @returns {{ singleDelivery: boolean, roleScopedAgents: boolean, freshCriticSampleRate: number }}
82
+ * @returns {{
83
+ * roleScopedAgents: boolean,
84
+ * freshCriticSampleRate: number,
85
+ * ceremonyProfile: 'minimal'|'standard'|'strict',
86
+ * closeAndLand: boolean,
87
+ * }}
73
88
  */
74
89
  export function getDeliveryRouting(config) {
75
90
  const routing = config?.delivery?.routing ?? config?.routing ?? config ?? {};
76
91
  return {
77
- singleDelivery:
78
- typeof routing.singleDelivery === 'boolean'
79
- ? routing.singleDelivery
80
- : DELIVERY_ROUTING_DEFAULTS.singleDelivery,
81
92
  roleScopedAgents:
82
93
  typeof routing.roleScopedAgents === 'boolean'
83
94
  ? routing.roleScopedAgents
84
95
  : DELIVERY_ROUTING_DEFAULTS.roleScopedAgents,
85
96
  freshCriticSampleRate: clampSampleRate(routing.freshCriticSampleRate),
97
+ ceremonyProfile: normalizeCeremonyProfile(routing.ceremonyProfile),
98
+ closeAndLand:
99
+ typeof routing.closeAndLand === 'boolean'
100
+ ? routing.closeAndLand
101
+ : DELIVERY_ROUTING_DEFAULTS.closeAndLand,
86
102
  };
87
103
  }
@@ -90,6 +90,8 @@ const KEY_MEANINGS = Object.freeze({
90
90
  'github.projectOwner': 'Owner of the GitHub Projects board.',
91
91
  'github.operatorHandle':
92
92
  'GitHub @handle mentioned when a run needs operator attention.',
93
+ 'github.defaultTimeoutMs':
94
+ 'Default timeout (ms) for GitHub CLI / API calls when a caller does not supply one.',
93
95
  'github.branchProtection.enforce':
94
96
  'Whether the framework applies branch-protection rules.',
95
97
  'github.branchProtection.requiredChecks':
@@ -126,28 +128,28 @@ const KEY_MEANINGS = Object.freeze({
126
128
  'How many recent commits the snapshot summarizes.',
127
129
  'planning.riskHeuristics':
128
130
  'Phrases that flag a Story as high-risk for HITL escalation.',
129
- 'planning.taskSizing.softAcceptanceCount':
130
- 'Acceptance-criteria count above which a Story is flagged as large (advisory-only — there is no hard acceptance ceiling).',
131
- 'planning.taskSizing.softFiles':
132
- 'Touched-file count above which a Story is flagged as large.',
133
- 'planning.taskSizing.hardFiles':
134
- 'Touched-file count above which a Story is rejected unless it declares `wide` with a reason.',
135
131
  'planning.failOnSharedEditors':
136
132
  'Whether shared-editor conflict findings are promoted to hard errors.',
137
133
  'planning.requireExplicitCrossStoryDeps':
138
134
  'Whether implicit cross-Story dependencies are promoted to hard errors.',
135
+ 'planning.failOnRegistryConflicts':
136
+ 'Whether cross-cutting registry conflict findings are promoted to hard errors.',
137
+ 'planning.failOnLargeFanOut':
138
+ 'Whether large fan-out findings are promoted to hard errors.',
139
+ 'planning.largeFanOutThreshold':
140
+ 'Story count above which a plan is flagged as a large fan-out.',
141
+ 'planning.crossCuttingRegistries':
142
+ 'Glob patterns naming cross-cutting registry files the planner conflict-checks.',
143
+ 'planning.navigation.routeGlobs':
144
+ 'Glob patterns marking paths that add a user-facing route (plan-time reachability gate).',
145
+ 'planning.navigation.navRegistry':
146
+ 'Tokens identifying the nav-registry SSOT a route-adding Story is expected to reference.',
139
147
 
140
148
  // delivery.*
141
149
  'delivery.execution.timeoutMs':
142
150
  'Per-execution timeout for orchestrated delivery steps.',
143
- 'delivery.maxTokenBudget':
144
- 'Cap on the hydrated task-prompt size handed to an agent.',
145
151
  'delivery.lease.ttlMs':
146
152
  'Time-to-live for the Epic lease before a stale claim is reclaimable.',
147
- 'delivery.ci.skipForStoryPushes':
148
- 'Whether Story-branch pushes carry a [skip ci] trailer.',
149
- 'delivery.ci.earlyPr':
150
- 'Whether /deliver opens the Epic PR early so CI warms during later waves.',
151
153
  'delivery.ci.watch.pollIntervalMs':
152
154
  'Poll cadence (ms) for the merge/CI watch loop.',
153
155
  'delivery.ci.watch.maxPolls':
@@ -156,22 +158,10 @@ const KEY_MEANINGS = Object.freeze({
156
158
  'Maximum times the CI watch may resume after a transient stall.',
157
159
  'delivery.ci.autoMerge':
158
160
  'Merge posture: trust-ci merges on green checks; strict also requires a clean review gate.',
159
- 'delivery.preflight.maxStories':
160
- 'Pre-dispatch ceiling on estimated Story count (no cap when unset).',
161
- 'delivery.preflight.maxWaves':
162
- 'Pre-dispatch ceiling on estimated wave count.',
163
- 'delivery.preflight.maxInstallCostSeconds':
164
- 'Pre-dispatch ceiling on estimated dependency-install seconds.',
165
- 'delivery.preflight.maxGithubApiRequests':
166
- 'Pre-dispatch ceiling on estimated GitHub API request volume.',
167
- 'delivery.preflight.maxClaudeQuotaTokens':
168
- 'Pre-dispatch ceiling on estimated Claude quota-token burn.',
169
161
  'delivery.docsFreshness.paths':
170
162
  'Docs whose freshness is checked at delivery time.',
171
163
  'delivery.deliverRunner.concurrencyCap':
172
164
  'Maximum Stories dispatched in parallel within one wave. Default 3 — conservative by design to keep host-quota consumption predictable. Operators running wide-wave Epics with adequate parallel-agent quota should raise this to reduce wall-clock time proportionally.',
173
- 'delivery.deliverRunner.progressReportIntervalSec':
174
- 'Cadence for delivery progress reporting.',
175
165
  'delivery.deliverRunner.verifyConcurrencyCap':
176
166
  'Maximum verify steps run in parallel.',
177
167
  'delivery.worktreeIsolation.enabled':
@@ -179,17 +169,19 @@ const KEY_MEANINGS = Object.freeze({
179
169
  'delivery.worktreeIsolation.root':
180
170
  'Directory under which per-Story worktrees are created.',
181
171
  'delivery.worktreeIsolation.nodeModulesStrategy':
182
- 'How node_modules is provisioned per worktree.',
172
+ 'How node_modules is provisioned per worktree (default clone on darwin/linux; per-worktree on win32).',
183
173
  'delivery.worktreeIsolation.primeFromPath':
184
174
  'Source path a worktree primes its node_modules from.',
185
175
  'delivery.worktreeIsolation.allowSymlinkOnWindows':
186
176
  'Whether symlink node_modules strategy is allowed on Windows.',
187
177
  'delivery.worktreeIsolation.reapOnSuccess':
188
178
  'Whether a worktree is removed after a Story closes cleanly.',
189
- 'delivery.worktreeIsolation.reapOnCancel':
190
- 'Whether a worktree is removed after a cancelled run.',
191
179
  'delivery.worktreeIsolation.bootstrapFiles':
192
- 'Files copied into each new worktree (e.g. .env, .mcp.json).',
180
+ 'Files copied into each new worktree (e.g. .env, .mcp.json, local overrides).',
181
+ 'delivery.mergeWatch.intervalSeconds':
182
+ 'Poll cadence (seconds) for MergeWatcher after epic.merge.armed.',
183
+ 'delivery.mergeWatch.maxBudgetSeconds':
184
+ 'Wall-clock budget (seconds) before MergeWatcher surfaces budget-exceeded.',
193
185
  'delivery.codeReview.providers':
194
186
  'Ordered provider chain the code-review phase consults.',
195
187
  'delivery.codeReview.maxFixAttempts':
@@ -198,8 +190,28 @@ const KEY_MEANINGS = Object.freeze({
198
190
  'Maximum files an auto-fix may touch in one attempt.',
199
191
  'delivery.codeReview.autoFixSeverity':
200
192
  'Severity threshold for on-branch code-review remediation (medium fixes 🔴/🟠/🟡, high fixes 🔴/🟠 only; default medium).',
201
- 'delivery.epicAudit.autoFixSeverity':
202
- 'Severity threshold for on-branch epic-audit remediation (medium fixes 🔴/🟠/🟡, high fixes 🔴/🟠 only; default medium).',
193
+ 'delivery.routing.roleScopedAgents':
194
+ 'Whether delivery spawns boot on role-scoped .claude/agents/<role>.md contexts.',
195
+ 'delivery.routing.freshCriticSampleRate':
196
+ 'Fraction of low-risk acceptance clusters forced through a fresh-context critic (maker-checker floor).',
197
+ 'delivery.routing.ceremonyProfile':
198
+ 'Acceptance-ceremony depth: minimal (always inline), standard (risk-routed), or strict (always fresh).',
199
+ 'delivery.routing.closeAndLand':
200
+ 'When true, single-story-close lands through merge in one close (opt out with --no-wait-merge).',
201
+ 'delivery.feedbackLoop.auditResultsAutoFile':
202
+ 'When true, auto-file non-blocking audit findings as follow-up issues.',
203
+ 'delivery.feedbackLoop.retroProposals':
204
+ 'When true, auto-file actionable retro proposals as follow-up issues.',
205
+ 'delivery.quality.formatAutofix.timeoutMs':
206
+ 'Bounded timeout (ms) for the close-time format autofix spawn.',
207
+ 'delivery.quality.requireBaselines':
208
+ 'When true, absent baseline artifacts fail close-validation instead of skipping cleanly.',
209
+ 'delivery.quality.navigability.routeGlobs':
210
+ 'Glob patterns marking user-facing routes for the navigability lens / journey gate.',
211
+ 'delivery.quality.navigability.navRegistry':
212
+ 'Tokens identifying the nav-registry SSOT the navigability lens expects.',
213
+ 'delivery.quality.navigability.journeySuite':
214
+ 'Optional journey-suite path the post-wave navigability integration gate runs.',
203
215
  'delivery.refactorStage.enabled':
204
216
  'Whether a dedicated refactor stage runs during delivery.',
205
217
  'delivery.acceptanceEval.maxRounds':
@@ -240,11 +252,19 @@ const PREFIX_MEANINGS = Object.freeze([
240
252
  ],
241
253
  ['delivery.quality', 'Delivery-time quality configuration.'],
242
254
  ['delivery.signals', 'Threshold for a delivery friction/telemetry signal.'],
243
- ['delivery.lifecycle.timeouts', 'Timeout for a lifecycle-bus phase.'],
244
- ['delivery.lifecycle', 'Lifecycle-bus configuration.'],
255
+ ['delivery.mergeWatch', 'MergeWatcher poll cadence and wall-clock budget.'],
245
256
  [
246
- 'planning.taskSizing',
247
- 'Story-sizing threshold for the decompose validator.',
257
+ 'delivery.feedbackLoop',
258
+ 'Opt-out toggles for auto-filing non-blocking findings.',
259
+ ],
260
+ [
261
+ 'delivery.routing',
262
+ 'Delivery-spawn routing and acceptance-ceremony profile.',
263
+ ],
264
+ ['delivery.ci', 'CI-aware delivery namespace (watch, auto-merge).'],
265
+ [
266
+ 'planning.navigation',
267
+ 'Plan-time navigability reachability gate (route globs + nav registry).',
248
268
  ],
249
269
  [
250
270
  'qa.environments',
@@ -263,8 +283,7 @@ const BLOCK_MEANINGS = Object.freeze({
263
283
  project: 'Project identity, paths, and command configuration.',
264
284
  github: 'GitHub provider identity and merge/notification policy.',
265
285
  planning: 'Inputs and guardrails for /epic-plan.',
266
- delivery:
267
- 'Execution, isolation, quality, and lifecycle settings for delivery.',
286
+ delivery: 'Execution, isolation, quality, and CI settings for delivery.',
268
287
  qa: 'Agent-driven QA harness contract.',
269
288
  });
270
289