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
@@ -11,14 +11,9 @@ import {
11
11
  } from './ticket-validator-conflicts.js';
12
12
  import {
13
13
  computeSizingFindings,
14
- DEFAULT_TASK_SIZING,
15
14
  renderHardFindingError,
16
15
  } from './ticket-validator-sizing.js';
17
16
 
18
- // Re-exported for callers that want the constants without reaching into the
19
- // sizing helper module directly.
20
- export { DEFAULT_TASK_SIZING };
21
-
22
17
  /**
23
18
  * Regex matching code-asset paths the freshness gate cares about. The three
24
19
  * roots — `.agents/scripts`, `lib`, and `tests` — cover the executable surface
@@ -399,7 +394,7 @@ function renderMissLine({ slug, path }) {
399
394
  * @param {string} [opts.baseBranchRef] - When set, runs `validateAcFreshness` against this ref.
400
395
  * @param {Function} [opts.gitRunner] - Optional git probe override.
401
396
  * @param {string} [opts.cwd] - Repo cwd (forwarded to the freshness gate).
402
- * @param {object} [opts.taskSizing] - Override the three-layer sizing thresholds. Defaults to `DEFAULT_TASK_SIZING`.
397
+ * @param {object} [opts.modelCapacity] - Programmatic override of `DEFAULT_MODEL_CAPACITY` (tests only not read from `.agentrc.json`).
403
398
  * @param {object} [opts.conflictPolicy] - Severity controls for cross-Story conflict findings.
404
399
  * @param {boolean} [opts.conflictPolicy.failOnSharedEditors=false] - Upgrade `shared-editor` findings to `hard`.
405
400
  * @param {boolean} [opts.conflictPolicy.requireExplicitCrossStoryDeps=false] - Upgrade `implicit-cross-story-dep` findings to `hard`.
@@ -614,7 +609,7 @@ export function validateAndNormalizeTickets(tickets, opts = {}) {
614
609
 
615
610
  const sizingFindings = computeSizingFindings({
616
611
  stories,
617
- sizing: opts.taskSizing,
612
+ capacity: opts.modelCapacity,
618
613
  });
619
614
  // Cross-Story path-conflict pass observes the story-level depends_on
620
615
  // graph. Findings are appended to the same `findings` array consumed by
@@ -20,7 +20,6 @@
20
20
  */
21
21
 
22
22
  import { Logger } from '../../Logger.js';
23
- import { TYPE_LABELS } from '../../label-constants.js';
24
23
  import { ALL_STATES, STATE_LABELS } from './reads.js';
25
24
  import {
26
25
  postStructuredComment,
@@ -290,30 +289,6 @@ async function processCascadeParentLocked(
290
289
  );
291
290
  if (!allDone) return { cascadedTo, failed };
292
291
 
293
- // EXCLUSION: Epics do not auto-close via cascade. Epics close via
294
- // formal /deliver (its own machinery handles branch merges,
295
- // PR-driven `Closes #N` auto-close, and a recovery transition in
296
- // `epic-deliver-finalize.js`).
297
- //
298
- // Legacy planning tickets (pre-#4324 `context::*` artifacts on
299
- // historical Epics) DO close via cascade (Story #1951): leaving
300
- // them open as native sub-issues of the Epic blocks GitHub from
301
- // honoring the Epic's `Closes #N` footer. New Epics carry their
302
- // planning content on the Epic body itself, so this branch is
303
- // purely a legacy-hygiene path.
304
- //
305
- // Reuse the parentSnapshot from the idempotency check above — it is
306
- // a fresh read (cache was invalidated before the getTicket call) and
307
- // the parent's type label is invariant within a single cascade lock
308
- // hold, so a second getTicket is wasteful and redundant.
309
- const isEpic = parentSnapshot.labels.includes(TYPE_LABELS.EPIC);
310
- if (isEpic) {
311
- logger.warn(
312
- `[Ticketing] Cascade reached Epic #${parentId}. Skipping auto-close (Epics close via the operator's PR merge).`,
313
- );
314
- return { cascadedTo, failed };
315
- }
316
-
317
292
  // Retry the parent transition on transient `gh` failures (rate limit,
318
293
  // 5xx, transport timeouts). Permanent failures fall through to the
319
294
  // outer catch on the first attempt so the operator sees the real
@@ -12,7 +12,8 @@
12
12
  */
13
13
 
14
14
  import { AGENT_LABELS } from '../../label-constants.js';
15
- import { WAVE_MARKER_RE } from '../wave-marker.js';
15
+
16
+ const WAVE_MARKER_RE = /^wave-([0-9]{1,3})-(start|end)$/;
16
17
 
17
18
  /**
18
19
  * Canonical agent-state label triad used by every state mutator. Kept on
@@ -23,7 +24,7 @@ export const STATE_LABELS = {
23
24
  READY: AGENT_LABELS.READY,
24
25
  EXECUTING: AGENT_LABELS.EXECUTING,
25
26
  // Story #2144 — intermediate state held by a Story between successful
26
- // close-preflight and a confirmed merge into `epic/<id>`. Included in
27
+ // close-preflight and a confirmed Story PR merge into `main`. Included in
27
28
  // the state enum so `transitionTicketState` can apply the label via
28
29
  // the canonical one-state-at-a-time path (which removes every other
29
30
  // `agent::*` label in the same call) and so the read-side `ALL_STATES`
@@ -72,13 +73,17 @@ export const STRUCTURED_COMMENT_TYPES = Object.freeze([
72
73
  'verification-results',
73
74
  'retro',
74
75
  'retro-partial',
76
+ // v2 Story closeout — actionable follow-ups from friction signals
77
+ 'follow-ups',
78
+ // v2 plan-run epilogue artifacts (posted on the primary Story)
79
+ 'plan-run-audit-roster',
80
+ 'plan-run-sibling-coherence',
75
81
  'epic-run-state',
76
82
  'epic-run-progress',
77
83
  'epic-plan-state',
78
84
  'parked-follow-ons',
79
- 'dispatch-manifest',
80
- // Story #566 per-phase wall-clock summary posted by story-close
81
- // and consumed by the epic-runner progress reporter to surface median /
85
+ // Story #566 — per-phase wall-clock summary posted by single-story-close.js
86
+ // and consumed by analyze-execution / perf tooling to surface median /
82
87
  // p95 phase timings across completed stories.
83
88
  'phase-timings',
84
89
  // Story #831 — story-init upserts a `story-init` comment that
@@ -88,7 +93,7 @@ export const STRUCTURED_COMMENT_TYPES = Object.freeze([
88
93
  'story-init',
89
94
  // Story #908 — /deliver upserts a `story-run-progress` snapshot
90
95
  // on each Story per Task transition. The /deliver aggregator and
91
- // the epic-runner progress reporter both read this comment to derive
96
+ // `analyze-execution.js` both read this comment to derive
92
97
  // Story-level state without re-fetching ticket labels.
93
98
  'story-run-progress',
94
99
  // Story #1123 — analyze-execution.js upserts perf summaries at close
@@ -98,9 +103,8 @@ export const STRUCTURED_COMMENT_TYPES = Object.freeze([
98
103
  // surface (Epic #1030).
99
104
  'story-perf-summary',
100
105
  'epic-perf-report',
101
- // Story #2128 — Phase 6 Epic Clarity Gate. `epic-plan-clarity.js` upserts
102
- // a `clarity-gate-update` comment on the Epic when the operator approves
103
- // a sharpened body rewrite, recording the persistence event for audit.
106
+ // Story #2128 — Phase 6 Epic Clarity Gate (CLI retired). Historical
107
+ // `clarity-gate-update` comments may still exist on older tickets.
104
108
  'clarity-gate-update',
105
109
  // Story #2635 — Tech Spec freshness check. `plan-persist.js`
106
110
  // upserts a `spec-freshness` comment on the Epic listing any
@@ -126,24 +130,24 @@ export const STRUCTURED_COMMENT_TYPES = Object.freeze([
126
130
  // ticket. Re-invocations upsert the same marker rather than appending
127
131
  // duplicates.
128
132
  'epic-handoff',
129
- // Story #2899 (Epic #2880, F13) — `epic-deliver-preflight.js` upserts a
130
- // `delivery-preflight` comment on the Epic at the start of
131
- // /deliver Phase 1, surfacing estimated story count, install cost,
133
+ // Story #2899 (Epic #2880, F13) — the deleted `epic-deliver-preflight.js`
134
+ // upserted a `delivery-preflight` comment on the Epic at the start of
135
+ // pre-v2 Epic `/deliver` Phase 1, surfacing estimated story count, install cost,
132
136
  // wave count, GitHub API request volume, Claude quota burn, and any
133
137
  // threshold breaches against `delivery.preflight.max*`. One entry per
134
138
  // Epic; re-runs replace prior content.
135
139
  'delivery-preflight',
136
- // Story #3062 (Epic #3051) — `wave-tick.js` upserts a
140
+ // Story #3062 (Epic #3051) — the deleted `wave-tick.js` upserted a
137
141
  // `recurring-failure-class` comment on the Epic when the cross-Story
138
142
  // detector finds two or more Stories that hit the same `failedGate` in
139
143
  // `close-validate.end`. One entry per Epic; re-ticks with the same
140
144
  // findings upsert in place (`upsertStructuredComment` diffs by body).
141
145
  'recurring-failure-class',
142
- // Story #3061 (Epic #3051) — the /deliver §2e Idle Watchdog
143
- // subsection instructs the parent host LLM to upsert a `wave-stall`
144
- // comment on the Epic whenever an in-flight Story has been silent for
145
- // longer than the configured cadence. `wave-tick.js --check-idle`
146
- // emits the matching envelope; registering the kind here is what makes
146
+ // Story #3061 (Epic #3051) — the pre-v2 `/deliver` idle-watchdog prose
147
+ // instructed the parent host LLM to upsert a `wave-stall` comment on the
148
+ // Epic whenever an in-flight Story had been silent for longer than the
149
+ // configured cadence. The deleted `wave-tick.js --check-idle` CLI emitted
150
+ // the matching envelope; registering the kind here keeps historical
147
151
  // the documented remediation actually executable
148
152
  // (assertValidStructuredCommentType would otherwise throw).
149
153
  'wave-stall',
@@ -171,15 +175,14 @@ export const STRUCTURED_COMMENT_TYPES = Object.freeze([
171
175
  // `graduator="audit-results|code-review"` attr so the two graduators
172
176
  // upsert independent comments; re-runs upsert in place.
173
177
  'cross-repo-deferred',
174
- // Epic #4474 (PR3) — `plan-persist.js` upserts a single `plan-summary`
175
- // comment on the Epic at terminal persist success, carrying the risk /
176
- // routing / freshness / healthcheck receipts and the dry-run wave table
177
- // as closing text. Replaces the retired plan-time `dispatch-manifest`
178
- // comment (whose claimed consumer did not exist — the live manifest is
179
- // written at deliver time by `wave-record-io.js`) and the Phase 12
180
- // notify round-trip. One entry per Epic; a --force/--resume re-persist
181
- // upserts in place.
178
+ // Epic #4474 (PR3) / v2 Stage 3 — `plan-persist.js` upserts a single
179
+ // `plan-summary` comment on the primary Story at terminal persist
180
+ // success, carrying risk / routing receipts and the depends_on order
181
+ // table. One entry per plan; a re-persist upserts in place.
182
182
  'plan-summary',
183
+ // v2 Stage 3 — flat Story persist checkpoint on every created Story
184
+ // (replaces epic-plan-state for new plans). plan-summary stays primary-only.
185
+ 'story-plan-state',
183
186
  ]);
184
187
 
185
188
  export const WAVE_TYPE_PATTERN = WAVE_MARKER_RE;
@@ -145,11 +145,11 @@ async function loadTicketSnapshot(provider, opts, ticketId) {
145
145
  /**
146
146
  * Mirror the post-flip label set onto the GitHub Projects v2 Status
147
147
  * column. Story #2548 — wiring this here makes every caller of
148
- * `transitionTicketState` (story-init, story-close, story-phase,
149
- * the LabelTransitioner lifecycle listener, the update-ticket-state CLI,
150
- * batch transitions) update the board automatically. Prior to #2548 the
151
- * sync was only wired from the epic-runner against the Epic ticket, so
152
- * Stories and Tasks never had their `agent::executing` /
148
+ * `transitionTicketState` (`single-story-init.js`, `single-story-close.js`,
149
+ * `story-phase.js`, the LabelTransitioner lifecycle listener, the
150
+ * update-ticket-state CLI, batch transitions) update the board automatically.
151
+ * Prior to #2548 the sync was only wired from the deleted epic-runner against
152
+ * the Epic ticket, so Stories and Tasks never had their `agent::executing` /
153
153
  * `agent::blocked` flips reflected on the board.
154
154
  *
155
155
  * Best-effort: a project-board misconfig, missing scope, or transient
@@ -2,7 +2,7 @@
2
2
  * planning-corpus.js — corpus-aware context for the standalone-Story
3
3
  * planning path (Story #4432).
4
4
  *
5
- * `/plan --idea` previously drafted a standalone Story from a blank
5
+ * `/plan --seed` previously drafted a standalone Story from a blank
6
6
  * slate: the seed, the body template, and a title-only duplicate scan.
7
7
  * For a change request that is really a small delta against an
8
8
  * already-delivered surface, that blank slate throws away context the
@@ -22,11 +22,10 @@
22
22
  * with the seed, so the draft can build on prior art instead of
23
23
  * re-deriving it.
24
24
  *
25
- * The Epic list surface (`provider.getEpics`) maps every issue through
26
- * `issueToEpicListItem`, which deliberately omits `body` (a list-scale
27
- * payload trim). Body content therefore requires an **explicit**,
28
- * bounded per-candidate fetch via `provider.getEpic(id)` never a
29
- * silent assumption that the list response carries prose to score
25
+ * The historical Epic list surface (`provider.getEpics`) returns a
26
+ * list-scale payload with no `body`. Body content therefore requires an
27
+ * **explicit**, bounded per-candidate fetch via `provider.getEpic(id)`
28
+ * never a silent assumption that the list response carries prose to score
30
29
  * against.
31
30
  *
32
31
  * Relevance scoring reuses the same `tokenize` / `overlapScore` Jaccard
@@ -36,9 +35,12 @@
36
35
  */
37
36
 
38
37
  import { overlapScore, tokenize } from './duplicate-search.js';
39
- import { extractEpicSection, hasEpicSection } from './epic-body-sections.js';
40
38
  import { Logger } from './Logger.js';
41
39
  import { buildDocsDigest } from './orchestration/docs-digest.js';
40
+ import {
41
+ extractTicketSection,
42
+ hasTicketSection,
43
+ } from './ticket-body-sections.js';
42
44
 
43
45
  /** Top-K Epics kept after the cheap title-only ranking pass. */
44
46
  const DEFAULT_CORPUS_MAX_CANDIDATES = 5;
@@ -71,8 +73,8 @@ const CORPUS_EPICS_PAGE_CAP = 5;
71
73
 
72
74
  /**
73
75
  * Rank open Epics by title-overlap with the seed. This is the cheap
74
- * first pass over the list surface (title only — `issueToEpicListItem`
75
- * has no `body`), used solely to pick the bounded top-K candidates
76
+ * first pass over the list surface (title only — no `body`), used solely
77
+ * to pick the bounded top-K candidates
76
78
  * worth an explicit body fetch. It is not the final relevance signal;
77
79
  * `extractRelevantSections` re-scores against actual section content.
78
80
  *
@@ -179,8 +181,11 @@ export async function fetchCandidateBodies({
179
181
  * @returns {{ kind:'techSpec'|'lede', content:string }}
180
182
  */
181
183
  function extractScoreableExcerpt(body) {
182
- if (hasEpicSection(body, 'techSpec')) {
183
- return { kind: 'techSpec', content: extractEpicSection(body, 'techSpec') };
184
+ if (hasTicketSection(body, 'techSpec')) {
185
+ return {
186
+ kind: 'techSpec',
187
+ content: extractTicketSection(body, 'techSpec'),
188
+ };
184
189
  }
185
190
  const lede = (body ?? '').split(/^##\s+/m)[0].trim();
186
191
  return { kind: 'lede', content: lede };
@@ -3,7 +3,7 @@
3
3
  *
4
4
  * This module is the single implementation of the "run the registry, fail
5
5
  * fast on blockers, log auto-fixes" pattern. The consumer entry points
6
- * (story-close.js, epic-deliver-preflight.js, the npm test wrapper, and
6
+ * (`single-story-close.js`, `mandrel-update-preflight.js`, the npm test wrapper, and
7
7
  * the bootstrap scripts) call `runPreflight({ scope })` instead of
8
8
  * re-implementing the same assemble+run+format+exit-2 dance.
9
9
  *
@@ -13,7 +13,7 @@
13
13
  * auto-fixes. The wrapper prints a human-readable blocker table
14
14
  * (`id · summary · fixCommand`) before returning. Code 2 is the
15
15
  * project-wide "preflight refused" reservation — see
16
- * .agents/workflows/helpers/deliver-epic.md for the rationale.
16
+ * `.agents/workflows/helpers/deliver-story.md` for the rationale.
17
17
  *
18
18
  * Auto-fixes are logged via `logFixes` before the blocker check so the
19
19
  * operator sees the "we corrected X" line even when a separate blocker
@@ -9,8 +9,8 @@
9
9
  // `.agents/rules/testing-standards.md` (unit / contract / acceptance) are
10
10
  // PRESENT, and which are ABSENT — and why.
11
11
  //
12
- // A scenario that is skipped does not exercise anything — a `@skip` /
13
- // `@pending` Gherkin tag (or a runner equivalent such as `it.skip` / `xit` /
12
+ // A scenario that is skipped does not exercise anything — a `@skip`
13
+ // Gherkin tag (or a runner equivalent such as `it.skip` / `xit` /
14
14
  // `describe.skip`, or a `skipped: true` descriptor field) means the test is
15
15
  // inert at run time. This module therefore treats a skipped test as ABSENT
16
16
  // for its tier: it never bumps a tier into `present`, because a tier whose
@@ -49,10 +49,10 @@ export const TIERS = Object.freeze(['unit', 'contract', 'acceptance']);
49
49
  const PRESENT = 'present';
50
50
  const ABSENT = 'absent';
51
51
 
52
- /** True when `value` contains a `@skip` or `@pending` Gherkin-style tag. */
52
+ /** True when `value` contains a `@skip` Gherkin-style tag. */
53
53
  function hasSkipTag(value) {
54
54
  if (typeof value !== 'string') return false;
55
- return /(^|[\s,])@(skip|pending)\b/i.test(value);
55
+ return /(^|[\s,])@skip\b/i.test(value);
56
56
  }
57
57
 
58
58
  /** True when `value` contains a runner-level skip/pending marker. */
@@ -67,7 +67,7 @@ function hasRunnerSkipMarker(value) {
67
67
  /**
68
68
  * True when a test descriptor is marked skipped/pending and therefore must
69
69
  * NOT count toward its tier. Recognizes:
70
- * - a `@skip` / `@pending` tag in a `tags` array or whitespace/comma string,
70
+ * - a `@skip` tag in a `tags` array or whitespace/comma string,
71
71
  * - the same tags embedded in a path or descriptor `name`,
72
72
  * - explicit boolean flags (`skipped`, `pending`),
73
73
  * - runner skip markers in a path/name (`it.skip`, `xit`, `xdescribe`,
@@ -0,0 +1,36 @@
1
+ /**
2
+ * confirm-merge-follow-ups.js — post-land follow-up capture seam for
3
+ * `single-story-confirm-merge.js` (keeps the CLI entry under the MI ceiling).
4
+ */
5
+
6
+ import { captureFollowUpsAfterConfirm } from '../orchestration/story-follow-ups.js';
7
+
8
+ /**
9
+ * @param {object} args
10
+ * @param {object} args.confirmation
11
+ * @param {number} args.storyId
12
+ * @param {number|null} args.prNumber
13
+ * @param {object} args.provider
14
+ * @param {object} [args.config]
15
+ * @param {string} args.cwd
16
+ * @param {(tag: string, msg: string) => void} [args.progress]
17
+ * @returns {Promise<object>}
18
+ */
19
+ export async function withConfirmFollowUps({
20
+ confirmation,
21
+ storyId,
22
+ prNumber,
23
+ provider,
24
+ config,
25
+ cwd,
26
+ progress,
27
+ }) {
28
+ const followUps = await captureFollowUpsAfterConfirm(confirmation, {
29
+ storyId,
30
+ provider,
31
+ config,
32
+ cwd,
33
+ progress,
34
+ });
35
+ return { standalone: true, prNumber, ...confirmation, followUps };
36
+ }
@@ -4,7 +4,7 @@
4
4
  * Shared builder for the `evaluateProtection` context the boot-sweep
5
5
  * engine ([`sweepMergedBranches`](../single-story-sweep.js)) threads into
6
6
  * every candidate protection check. Single-homed here so the three boot
7
- * callers — `single-story-init.js`, `epic-deliver-prepare.js`, and the
7
+ * callers — `single-story-init.js` and the
8
8
  * `boot-sweep.js` CLI — build an identical ctx instead of each re-wiring
9
9
  * the git/gh/ticket ports.
10
10
  *
@@ -1,27 +1,24 @@
1
1
  /**
2
2
  * lib/story-adjacency.js — the single story-level adjacency builder.
3
3
  *
4
- * Both Epic-path wave-computation wrappers bottom out in the shared
4
+ * Both pre-v2 Epic wave wrappers and the v2 `/deliver` ready-set path bottom out in the shared
5
5
  * `lib/Graph.js` kernel (`detectCycle` / `assignLayers` / `computeWaves`),
6
6
  * but each historically re-implemented the step that turns a list of Story
7
7
  * records into the `Map<storyId, number[]>` adjacency the kernel consumes.
8
- * This module is now the one home for that step; the consumers are:
8
+ * This module is now the one home for that step; the live consumer is:
9
9
  *
10
- * - `lib/orchestration/epic-runner/phases/build-wave-dag.js`
11
- * (`buildStoryDag` → `computeWaves`)
12
- * - `lib/orchestration/dispatch-pipeline.js`
13
- * (`buildStoryDispatchGraph` → `computeStoryWaves`)
14
10
  * - `lib/wave-runner/ready-set.js` (`selectReadySet`, the path-agnostic
15
- * continuous scheduler the standalone `stories-wave-tick.js` adapter
16
- * and the Epic path both dispatch through)
11
+ * continuous scheduler the `stories-wave-tick.js` adapter dispatches through)
17
12
  * - `stories-wave-tick.js` (for cycle detection, before delegating
18
13
  * selection to `selectReadySet`)
19
14
  *
20
- * Dependency source order (must stay aligned with manifest-builder.js so
21
- * the dispatch manifest and runtime wave scheduling never disagree):
15
+ * (Pre-v2: `epic-runner/phases/build-wave-dag.js` and `dispatch-pipeline.js`
16
+ * also called here; both entry seams were deleted.)
17
+ *
18
+ * Dependency source order (must stay aligned with `manifest-builder.js` and
19
+ * `helpers/deliver-story.md` so planning and runtime scheduling never disagree):
22
20
  * 1. Canonical: `blocked by #NNN` / `depends on #NNN` parsed from the
23
- * Story body via `parseBlockedBy` (the same parser the dispatcher
24
- * uses).
21
+ * Story body via `parseBlockedBy` (the same parser planning uses).
25
22
  * 2. Fallback: an explicit `dependencies` (ticket shape) or
26
23
  * `dependsOn` (operator-DAG shape) array on the Story record.
27
24
  *
@@ -46,9 +43,9 @@ import { parseBlockedBy } from './dependency-parser.js';
46
43
  * DAG nodes).
47
44
  * @param {object} [opts]
48
45
  * @param {boolean} [opts.dropForeign=true] When true (the default,
49
- * matching the Epic-scoped wrappers), edges pointing at ids outside
46
+ * matching pre-v2 Epic-scoped wrappers), edges pointing at ids outside
50
47
  * the supplied story set are dropped so the DAG stays closed over the
51
- * scheduled set. The standalone path (`stories-wave-tick.js` and the
48
+ * scheduled set. The v2 `/deliver` path (`stories-wave-tick.js` and the
52
49
  * `selectReadySet` core) passes `false` to preserve the operator-DAG
53
50
  * contract, where a dependency on an id absent from the input is treated
54
51
  * as not-yet-done and withholds the dependent until it completes.