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
@@ -0,0 +1,27 @@
1
+ /**
2
+ * decomposer-context.js — system-prompt builder for the `/plan` authoring
3
+ * pass (Story #2466; v2 keeps the prompt helper, drops the Epic-fetch
4
+ * decomposition envelope).
5
+ *
6
+ * `buildDecomposerSystemPrompt` is the live surface consumed by
7
+ * `plan-context.js#buildSystemPrompts`. The retired
8
+ * `buildDecompositionContext` Epic-fetch path lived here until the
9
+ * Story-only cutover removed every caller.
10
+ */
11
+
12
+ import { renderDecomposerSystemPrompt } from '../../templates/decomposer-prompts.js';
13
+
14
+ export function buildDecomposerSystemPrompt(
15
+ heuristics = [],
16
+ { maxTickets, epicId } = {},
17
+ ) {
18
+ const base = renderDecomposerSystemPrompt({
19
+ maxTickets,
20
+ epicId,
21
+ });
22
+ const heuristicsStr =
23
+ heuristics.length > 0
24
+ ? `### RISK HEURISTICS (planning metadata if any apply):\n- ${heuristics.join('\n- ')}`
25
+ : '';
26
+ return `${base}${heuristicsStr ? `\n\n${heuristicsStr}` : ''}`;
27
+ }
@@ -24,7 +24,6 @@ export const RISK_VERDICT_SCHEMA_PATH = path.resolve(
24
24
  '..',
25
25
  '..',
26
26
  '..',
27
- '..',
28
27
  'schemas',
29
28
  'risk-verdict.schema.json',
30
29
  );
@@ -57,7 +56,7 @@ function getRiskVerdictValidator(schemaPath, io) {
57
56
  *
58
57
  * @param {unknown} verdict
59
58
  * @param {{ schemaPath?: string, io?: { readFileSync: typeof readFileSync } }} [opts]
60
- * @returns {import('../../planning-risk.js').RiskVerdict} The validated verdict (same reference).
59
+ * @returns {import('../planning-risk.js').RiskVerdict} The validated verdict (same reference).
61
60
  */
62
61
  export function validateRiskVerdict(verdict, opts = {}) {
63
62
  const validate = getRiskVerdictValidator(
@@ -72,7 +71,7 @@ export function validateRiskVerdict(verdict, opts = {}) {
72
71
  `[epic-plan-spec] risk verdict failed schema validation: ${detail}`,
73
72
  );
74
73
  }
75
- return /** @type {import('../../planning-risk.js').RiskVerdict} */ (verdict);
74
+ return /** @type {import('../planning-risk.js').RiskVerdict} */ (verdict);
76
75
  }
77
76
 
78
77
  /**
@@ -81,7 +80,7 @@ export function validateRiskVerdict(verdict, opts = {}) {
81
80
  *
82
81
  * @param {string} verdictPath
83
82
  * @param {{ schemaPath?: string, io?: { readFileSync: typeof readFileSync } }} [opts]
84
- * @returns {import('../../planning-risk.js').RiskVerdict}
83
+ * @returns {import('../planning-risk.js').RiskVerdict}
85
84
  */
86
85
  export function loadRiskVerdict(verdictPath, opts = {}) {
87
86
  const io = opts.io ?? { readFileSync };
@@ -8,7 +8,7 @@
8
8
  * while a remote not-found is treated as a no-op.
9
9
  */
10
10
 
11
- import { deleteBranchBoth } from '../../../git-branch-cleanup.js';
11
+ import { deleteBranchEverywhere } from '../../../git-branch-cleanup.js';
12
12
 
13
13
  function reapPhaseLogger(progress) {
14
14
  return progress ?? (() => {});
@@ -20,7 +20,7 @@ export async function branchCleanupPhase(ctx, state = {}) {
20
20
  repoRoot,
21
21
  progress,
22
22
  logger,
23
- branchCleanup = deleteBranchBoth,
23
+ branchCleanup = deleteBranchEverywhere,
24
24
  } = ctx;
25
25
  const log = reapPhaseLogger(progress);
26
26
  log('CLEANUP', `Deleting story branch: ${storyBranch}`);
@@ -1,33 +1,21 @@
1
1
  /**
2
- * phases/dashboard-refresh.js — regenerate the dispatch manifest after
3
- * a Story merges into its Epic branch. Honors `--skip-dashboard` so
4
- * operators running an out-of-band close can suppress the I/O.
2
+ * phases/dashboard-refresh.js — retired dispatch-manifest refresh seam.
3
+ *
4
+ * The Stage 5 hard cutover deletes the dispatcher/manifest surface; keep this
5
+ * phase as a no-op so any still-wired post-merge pipeline can drain safely.
5
6
  */
6
7
 
7
- import { generateAndSaveManifest } from '../../../../dispatcher.js';
8
-
9
8
  function reapPhaseLogger(progress) {
10
9
  return progress ?? (() => {});
11
10
  }
12
11
 
13
12
  export async function dashboardRefreshPhase(ctx) {
14
- const {
15
- epicId,
16
- provider,
17
- skipDashboard,
18
- progress,
19
- generateManifestFn = generateAndSaveManifest,
20
- } = ctx;
13
+ const { skipDashboard, progress } = ctx;
21
14
  const log = reapPhaseLogger(progress);
22
15
  if (skipDashboard) {
23
- log(
24
- 'DASHBOARD',
25
- '⏭️ Skipping dashboard refresh (--skip-dashboard flag set)',
26
- );
16
+ log('DASHBOARD', 'Skipping dashboard refresh (--skip-dashboard flag set)');
27
17
  return false;
28
18
  }
29
- log('DASHBOARD', 'Regenerating dispatch manifest...');
30
- await generateManifestFn(epicId, true, { provider });
31
- log('DASHBOARD', '✅ Dashboard manifest updated (temp/)');
32
- return true;
19
+ log('DASHBOARD', 'Dispatch manifest refresh retired; no dashboard updated.');
20
+ return false;
33
21
  }
@@ -1,7 +1,8 @@
1
1
  /**
2
2
  * phases/worktree-reap.js — post-merge worktree reap phase.
3
3
  *
4
- * After a Story branch is merged into the Epic branch, this phase removes
4
+ * After a Story branch is merged (pre-v2: into the Epic branch; v2:
5
+ * squash-merged to `main` via `single-story-close.js`), this phase removes
5
6
  * the per-Story worktree at `.worktrees/story-<id>/`. The reap is split
6
7
  * into three concerns:
7
8
  *
@@ -376,7 +377,7 @@ function applyStillRegisteredState({
376
377
  try {
377
378
  manifestEntry = recordPendingCleanupFn(worktreeRoot, {
378
379
  storyId: Number(storyId),
379
- branch: getStoryBranch(null, storyId),
380
+ branch: getStoryBranch(storyId),
380
381
  path: stillRegistered.path,
381
382
  push: false,
382
383
  });
@@ -1,47 +1,37 @@
1
1
  // .agents/scripts/lib/orchestration/pr-base-guard.js
2
2
  /**
3
- * pr-base-guard.js — refuse to open a pull request that would route an
4
- * Epic-attached Story's work directly into `main` instead of into the
5
- * parent Epic integration branch.
6
- *
7
- * Background: Story #2960 — during Epic #2880 wave 5 a sub-agent fell
8
- * back to `gh pr create --base main` after `story-close.js`
9
- * short-circuited as a no-op. The orphaned PR forced a manual recovery
10
- * (`git merge origin/main` back into `epic/2880`). This module is the
11
- * defence-in-depth call any framework helper that triggers `gh pr create`
12
- * MUST invoke before shelling out.
13
- *
14
- * Scope: the guard fires only when the Story body declares an
15
- * `Epic: #N` (or `Parent: #N`) reference. Stand-alone Stories — the
16
- * `/single-story-deliver` surface — are unaffected because they have no
17
- * parent reference to detect.
3
+ * pr-base-guard.js — refuse to open a pull request for a Story that still
4
+ * carries an Epic/parent footer (pre-v2 hierarchy). v2 Stories are
5
+ * standalone; Epic-attached bodies are a forward-cutover refusal, not a
6
+ * redirect onto `epic/<N>`.
18
7
  */
19
8
 
20
9
  import { resolveStoryHierarchy } from '../story-lifecycle.js';
21
10
 
22
11
  /**
23
- * Inspect a Story's body for an Epic parent reference and refuse a PR
24
- * whose `baseBranch` is not the matching `epic/<N>` integration branch.
12
+ * Inspect a Story's body for an Epic/parent reference and refuse any PR
13
+ * when one is present. Callers must re-plan Epic-attached tickets as v2
14
+ * Stories before delivering.
25
15
  *
26
16
  * @param {object} args
27
17
  * @param {number} args.storyId — Story ticket id (used in the error
28
18
  * message so the operator can grep the failing surface).
29
19
  * @param {string|null|undefined} args.storyBody — raw Story body markdown.
30
- * When falsy, the guard short-circuits (no parent → nothing to enforce).
31
- * @param {string} args.baseBranch — the `--base` value about to be passed
32
- * to `gh pr create`.
33
- * @throws {Error} when the Story is Epic-attached and `baseBranch` is not
34
- * the parent Epic's branch. The message matches the AC verbatim so
35
- * reviewers can grep it.
20
+ * When falsy, the guard short-circuits (no body → nothing to enforce).
21
+ * @param {string} args.baseBranch — retained for call-site compatibility;
22
+ * unused once an Epic/parent footer is detected (any base is refused).
23
+ * @throws {Error} when the Story body declares an Epic or Parent footer.
36
24
  */
37
- export function assertStoryPrBaseAllowed({ storyId, storyBody, baseBranch }) {
25
+ export function assertStoryPrBaseAllowed({
26
+ storyId,
27
+ storyBody,
28
+ baseBranch: _baseBranch,
29
+ }) {
38
30
  if (!storyBody) return;
39
31
  const { epicId } = resolveStoryHierarchy(storyBody);
40
32
  if (epicId == null) return;
41
- const expected = `epic/${epicId}`;
42
- if (baseBranch === expected) return;
43
33
  throw new Error(
44
- `Story #${storyId} is parented by Epic #${epicId} — merge into ${expected}, not ${baseBranch}. ` +
45
- 'To bypass, use /single-story-deliver explicitly.',
34
+ `Story #${storyId} still declares Epic/Parent #${epicId}. ` +
35
+ 'v2 delivery is Story-only — re-plan as a standalone Story (no Epic footer) before opening a PR.',
46
36
  );
47
37
  }
@@ -1,10 +1,10 @@
1
1
  /**
2
2
  * preflight-cache.js — Epic #3019 / Story #3027.
3
3
  *
4
- * Cache adapter for the snapshot/DAG envelope produced by
5
- * `epic-deliver-preflight.js` so `epic-deliver-prepare.js` can skip the
6
- * second walk of Epic Story when the underlying Epic ticket
7
- * has not drifted between the two operator invocations.
4
+ * Legacy cache adapter for the snapshot/DAG envelope the deleted
5
+ * `epic-deliver-preflight.js` / `epic-deliver-prepare.js` pair produced
6
+ * (pre-v2 Epic `/deliver`). Retained so fingerprint helpers and tests stay
7
+ * stable; no live v2 entry seam reads or writes this cache.
8
8
  *
9
9
  * Contract:
10
10
  * - Cache file lives at `<cwd>/temp/epic-<epicId>/preflight-snapshot.json`.
@@ -107,7 +107,7 @@ export function computeBaseSha(epic, stories = []) {
107
107
  * miss and fall back to a fresh snapshot/DAG pass.
108
108
  *
109
109
  * The function intentionally swallows `ENOENT` and JSON-parse errors so
110
- * a stale or partially-written file does not poison `epic-deliver-prepare`.
110
+ * a stale or partially-written file does not poison legacy Epic prepare callers.
111
111
  *
112
112
  * @param {{ epicId: number, cwd?: string }} args
113
113
  * @returns {Promise<object | null>}
@@ -7,7 +7,7 @@
7
7
  * the delivery inline and committing to local `main` without pushing —
8
8
  * when the driving agent *perceived* the environment had no live GitHub
9
9
  * remote. The judgment was vibes, not fact. This module gives the entry
10
- * seams (`epic-deliver-preflight.js`, `single-story-init.js`) a verified
10
+ * seams (`single-story-init.js` for v2 `/deliver`) a verified
11
11
  * probe result to record in their envelopes so the workflow can branch on
12
12
  * `remoteVerified: true|false` deterministically: use the remote, or
13
13
  * transition to `agent::blocked` quoting the probe output — never a
@@ -0,0 +1,155 @@
1
+ /**
2
+ * Pure helpers for resolve-plan-run.js — keep the CLI entry thin so new-file
3
+ * CRAP stays under the quality-preview ceiling.
4
+ *
5
+ * @module lib/orchestration/resolve-plan-run
6
+ */
7
+
8
+ import { TYPE_LABELS } from '../label-constants.js';
9
+ import { buildStoryAdjacency } from '../story-adjacency.js';
10
+ import {
11
+ normalizePlanRunId,
12
+ PLAN_RUN_LABEL_PREFIX,
13
+ } from './plan-persist/story-ops.js';
14
+
15
+ /**
16
+ * Normalize a plan-run id into the canonical label `plan-run::<token>`.
17
+ *
18
+ * @param {string} raw
19
+ * @returns {string}
20
+ */
21
+ export function normalizePlanRunLabel(raw) {
22
+ const token = normalizePlanRunId(raw);
23
+ return `${PLAN_RUN_LABEL_PREFIX}${token}`;
24
+ }
25
+
26
+ /**
27
+ * Extract a bare plan-run id from a label or raw token.
28
+ *
29
+ * @param {string} label
30
+ * @returns {string}
31
+ */
32
+ export function planRunIdFromLabel(label) {
33
+ return String(label ?? '')
34
+ .trim()
35
+ .replace(new RegExp(`^${PLAN_RUN_LABEL_PREFIX}`), '');
36
+ }
37
+
38
+ /**
39
+ * @param {object} issue
40
+ * @returns {string[]}
41
+ */
42
+ export function normalizeIssueLabels(issue) {
43
+ const raw = issue?.labels;
44
+ if (!Array.isArray(raw)) return [];
45
+ return raw
46
+ .map((l) => (typeof l === 'string' ? l : l?.name))
47
+ .filter((n) => typeof n === 'string' && n.length > 0);
48
+ }
49
+
50
+ /**
51
+ * @param {object} issue
52
+ * @returns {{ id: number, title: string, body: string, url: string|null, labels: string[], state: string }|null}
53
+ */
54
+ export function toStoryRecord(issue) {
55
+ const id = Number(issue?.number ?? issue?.id);
56
+ if (!Number.isInteger(id) || id <= 0) return null;
57
+ const labels = normalizeIssueLabels(issue);
58
+ if (!labels.includes(TYPE_LABELS.STORY)) return null;
59
+ return {
60
+ id,
61
+ title: String(issue?.title ?? ''),
62
+ body: String(issue?.body ?? ''),
63
+ url: issue?.html_url ?? issue?.url ?? null,
64
+ labels,
65
+ state: String(issue?.state ?? 'open').toLowerCase(),
66
+ };
67
+ }
68
+
69
+ /**
70
+ * @param {object[]} stories
71
+ * @returns {{ id: number, dependsOn: number[] }[]}
72
+ */
73
+ export function storiesToDag(stories) {
74
+ const adjacency = buildStoryAdjacency(stories, { dropForeign: false });
75
+ return stories.map((s) => ({
76
+ id: s.id,
77
+ dependsOn: adjacency.get(s.id) ?? [],
78
+ }));
79
+ }
80
+
81
+ /**
82
+ * Map provider issues into the deliver-router story list + DAG nodes.
83
+ *
84
+ * @param {object[]} issues
85
+ * @param {{ planRunId: string, planRunLabel: string }} meta
86
+ * @returns {{ kind: string, planRunId: string, planRunLabel: string, stories: object[], dag: object[] }}
87
+ */
88
+ export function buildPlanRunEnvelope(issues, { planRunId, planRunLabel }) {
89
+ const stories = (Array.isArray(issues) ? issues : [])
90
+ .map(toStoryRecord)
91
+ .filter(Boolean)
92
+ .sort((a, b) => a.id - b.id);
93
+
94
+ return {
95
+ kind: 'plan-run',
96
+ planRunId,
97
+ planRunLabel,
98
+ stories: stories.map(({ id, title, url, labels, state }) => ({
99
+ id,
100
+ title,
101
+ url,
102
+ labels,
103
+ state,
104
+ })),
105
+ dag: storiesToDag(stories),
106
+ done: stories
107
+ .filter(
108
+ (story) =>
109
+ story.state === 'closed' || story.labels.includes('agent::done'),
110
+ )
111
+ .map((story) => story.id),
112
+ };
113
+ }
114
+
115
+ /**
116
+ * Pure core used by tests: given issues + meta, build the envelope.
117
+ *
118
+ * @param {{ run: string, issues: object[] }} args
119
+ * @returns {ReturnType<typeof buildPlanRunEnvelope>}
120
+ */
121
+ export function resolvePlanRunFromIssues({ run, issues }) {
122
+ const planRunLabel = normalizePlanRunLabel(run);
123
+ const planRunId = planRunIdFromLabel(planRunLabel);
124
+ return buildPlanRunEnvelope(issues, { planRunId, planRunLabel });
125
+ }
126
+
127
+ /**
128
+ * Fetch issues for a plan-run label via the ticketing provider.
129
+ *
130
+ * @param {object} provider
131
+ * @param {{ planRunLabel: string, state: string }} args
132
+ * @returns {Promise<object[]>}
133
+ */
134
+ export async function fetchPlanRunIssues(provider, { planRunLabel, state }) {
135
+ if (typeof provider?.listIssuesByLabel !== 'function') {
136
+ throw new Error('resolve-plan-run: provider.listIssuesByLabel is required');
137
+ }
138
+ const labels = `${planRunLabel},${TYPE_LABELS.STORY}`;
139
+ const issues = await provider.listIssuesByLabel({ state, labels });
140
+ return Array.isArray(issues) ? issues : [];
141
+ }
142
+
143
+ /**
144
+ * @param {string|undefined} state
145
+ * @returns {string}
146
+ */
147
+ export function assertIssueState(state) {
148
+ const value = state ?? 'open';
149
+ if (!['open', 'closed', 'all'].includes(value)) {
150
+ throw new Error(
151
+ `resolve-plan-run: --state must be open|closed|all (got ${value})`,
152
+ );
153
+ }
154
+ return value;
155
+ }
@@ -2,7 +2,7 @@
2
2
  * resolves-token.js — single source of truth for the `(resolves #N)`
3
3
  * Story-merge integration marker.
4
4
  *
5
- * Background. `story-close.js` integrates each Story branch into its
5
+ * Background. The deleted `story-close.js` integrated each Story branch into its
6
6
  * parent Epic branch with `git merge --no-ff` and a Conventional-Commit
7
7
  * subject that carries a ` (resolves #<storyId>)` trailer. That trailer is
8
8
  * the *durable* proof a Story landed on `epic/<id>`: the local/remote
@@ -26,23 +26,23 @@
26
26
  * the renderer can attribute the run-length back to the deliver-runner
27
27
  * concurrency cap.
28
28
  *
29
- * Threshold contract (`.agentrc.json delivery.retro.perfThresholds`):
29
+ * Threshold contract (code constants only — not operator-tunable via
30
+ * `.agentrc.json`; the former `delivery.retro.perfThresholds` key was
31
+ * retired):
30
32
  *
31
33
  * - `utilisation`: number in [0, 1]. Default 0.6.
32
34
  * - `bootstrapShare`: number in [0, 1]. Default 0.4.
33
35
  * - `capBindingRunLength`: positive integer. Default 2.
34
36
  *
35
37
  * The function is total: it never throws on malformed input. A missing or
36
- * malformed `report` returns `[]`. A missing `thresholds` falls back to the
37
- * documented defaults.
38
+ * malformed `report` returns `[]`. A missing `thresholds` falls back to
39
+ * `DEFAULT_RETRO_PERF_THRESHOLDS` below.
38
40
  */
39
41
 
40
42
  /**
41
- * Defaults mirroring `.agentrc.json delivery.retro.perfThresholds` so
42
- * callers (and tests) can omit `thresholds` and get the same behaviour as
43
- * a resolved config with no overrides. Keep in lockstep with
44
- * `lib/config/runners.js` (or wherever the resolver default lives) and the
45
- * `agentrc.schema.json` defaults stanza.
43
+ * Framework-fixed defaults for `classifyPerfSignals`. Callers (and tests)
44
+ * can omit `thresholds` and get these values. Not sourced from agentrc —
45
+ * edit this constant (and keep tests in lockstep) to change the gates.
46
46
  */
47
47
  export const DEFAULT_RETRO_PERF_THRESHOLDS = Object.freeze({
48
48
  utilisation: 0.6,