mandrel 1.93.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 (463) hide show
  1. package/.agents/README.md +59 -73
  2. package/.agents/agents/acceptance-critic.md +129 -0
  3. package/.agents/agents/story-worker.md +161 -0
  4. package/.agents/docs/SDLC.md +489 -1285
  5. package/.agents/docs/agentrc-reference.json +177 -67
  6. package/.agents/docs/configuration.md +108 -136
  7. package/.agents/docs/execution-reference.md +44 -22
  8. package/.agents/docs/quality-gates.md +13 -19
  9. package/.agents/docs/workflows.md +3 -3
  10. package/.agents/instructions.md +107 -108
  11. package/.agents/rules/ci-remediation.md +8 -12
  12. package/.agents/rules/git-conventions-reference.md +224 -0
  13. package/.agents/rules/git-conventions.md +42 -223
  14. package/.agents/rules/security-baseline.md +5 -0
  15. package/.agents/rules/testing-standards.md +106 -13
  16. package/.agents/schemas/acceptance-eval-verdict.schema.json +1 -1
  17. package/.agents/schemas/agentrc.schema.json +71 -201
  18. package/.agents/schemas/lifecycle/ledger-record.schema.json +1 -1
  19. package/.agents/schemas/lifecycle/retro.end.schema.json +1 -1
  20. package/.agents/schemas/risk-verdict.schema.json +0 -13
  21. package/.agents/scripts/acceptance-eval.js +62 -18
  22. package/.agents/scripts/agents-bootstrap-github.js +1 -1
  23. package/.agents/scripts/analyze-execution.js +1 -1
  24. package/.agents/scripts/audit-to-stories.js +7 -7
  25. package/.agents/scripts/boot-sweep.js +1 -1
  26. package/.agents/scripts/check-context-budget.js +62 -5
  27. package/.agents/scripts/check-lifecycle-lint.js +6 -9
  28. package/.agents/scripts/check-prepush-recovery.js +1 -1
  29. package/.agents/scripts/cleanup-repo-test-temp.js +6 -1
  30. package/.agents/scripts/diagnose-friction.js +0 -6
  31. package/.agents/scripts/lib/Logger.js +6 -10
  32. package/.agents/scripts/lib/audit-suite/runner.js +2 -2
  33. package/.agents/scripts/lib/audit-suite/selector.js +5 -5
  34. package/.agents/scripts/lib/audit-to-stories/{seed-epic-from-findings.js → seed-from-findings.js} +9 -9
  35. package/.agents/scripts/lib/baselines/kernel.js +206 -18
  36. package/.agents/scripts/lib/baselines/kinds/maintainability.js +0 -4
  37. package/.agents/scripts/lib/baselines/reader.js +1 -6
  38. package/.agents/scripts/lib/bdd-runner-detect.js +5 -9
  39. package/.agents/scripts/lib/bootstrap/issue-forms-template.js +32 -33
  40. package/.agents/scripts/lib/bootstrap/project-bootstrap.js +56 -18
  41. package/.agents/scripts/lib/checks/core-bare-clean.js +2 -2
  42. package/.agents/scripts/lib/checks/index.js +2 -1
  43. package/.agents/scripts/lib/checks/story-init-not-backgrounded.js +23 -21
  44. package/.agents/scripts/lib/cli/standard-args.js +13 -22
  45. package/.agents/scripts/lib/cli-args.js +16 -7
  46. package/.agents/scripts/lib/close-validation/gates.js +160 -22
  47. package/.agents/scripts/lib/config/acceptance-eval.js +52 -5
  48. package/.agents/scripts/lib/config/ci.js +6 -31
  49. package/.agents/scripts/lib/config/delivery-routing.js +103 -0
  50. package/.agents/scripts/lib/config/explain.js +57 -36
  51. package/.agents/scripts/lib/config/limits.js +17 -58
  52. package/.agents/scripts/lib/config/paths.js +0 -2
  53. package/.agents/scripts/lib/config/quality.js +1 -1
  54. package/.agents/scripts/lib/config/runners.js +17 -50
  55. package/.agents/scripts/lib/config/temp-paths.js +19 -14
  56. package/.agents/scripts/lib/config/worktree-isolation.js +0 -5
  57. package/.agents/scripts/lib/config-resolver.js +3 -8
  58. package/.agents/scripts/lib/config-settings-schema-delivery.js +46 -136
  59. package/.agents/scripts/lib/config-settings-schema-quality.js +17 -14
  60. package/.agents/scripts/lib/config-settings-schema.js +52 -38
  61. package/.agents/scripts/lib/dependency-parser.js +3 -2
  62. package/.agents/scripts/lib/doc-tiers.js +39 -4
  63. package/.agents/scripts/lib/duplicate-search.js +211 -41
  64. package/.agents/scripts/lib/feedback-loop/retro-proposals-graduator.js +1 -1
  65. package/.agents/scripts/lib/findings/promote-finding.js +5 -5
  66. package/.agents/scripts/lib/framework-version.js +2 -3
  67. package/.agents/scripts/lib/git-branch-cleanup.js +1 -10
  68. package/.agents/scripts/lib/git-branch-lifecycle.js +17 -22
  69. package/.agents/scripts/lib/git-utils.js +32 -6
  70. package/.agents/scripts/lib/github/framework-repo.js +6 -0
  71. package/.agents/scripts/lib/label-constants.js +10 -23
  72. package/.agents/scripts/lib/label-taxonomy.js +9 -43
  73. package/.agents/scripts/lib/observability/active-story-env.js +112 -3
  74. package/.agents/scripts/lib/observability/hook-heartbeat.js +187 -0
  75. package/.agents/scripts/lib/observability/source-classifier.js +3 -3
  76. package/.agents/scripts/lib/observability/tool-trace-hook.js +15 -4
  77. package/.agents/scripts/lib/onboard/init-tail.js +1 -3
  78. package/.agents/scripts/lib/orchestration/acceptance-clusters.js +111 -0
  79. package/.agents/scripts/lib/orchestration/acceptance-eval-decision.js +32 -4
  80. package/.agents/scripts/lib/orchestration/audit-lens-routing.js +128 -0
  81. package/.agents/scripts/lib/orchestration/bookkeeping-outbox.js +273 -0
  82. package/.agents/scripts/lib/orchestration/ceremony-routing.js +204 -0
  83. package/.agents/scripts/lib/orchestration/code-review.js +20 -268
  84. package/.agents/scripts/lib/orchestration/column-sync.js +1 -1
  85. package/.agents/scripts/lib/orchestration/consolidation-precondition.js +1 -1
  86. package/.agents/scripts/lib/orchestration/context-envelope.js +2 -5
  87. package/.agents/scripts/lib/orchestration/docs-digest.js +8 -8
  88. package/.agents/scripts/lib/orchestration/file-assumptions.js +7 -13
  89. package/.agents/scripts/lib/orchestration/git-cleanup/phases/cli.js +1 -1
  90. package/.agents/scripts/lib/orchestration/lifecycle/emit-loop-tick.js +8 -8
  91. package/.agents/scripts/lib/orchestration/lifecycle/emit-story-heartbeat.js +2 -2
  92. package/.agents/scripts/lib/orchestration/lifecycle/ledger-writer.js +6 -3
  93. package/.agents/scripts/lib/orchestration/lifecycle/listeners/README.md +17 -43
  94. package/.agents/scripts/lib/orchestration/lint-baseline-service.js +4 -4
  95. package/.agents/scripts/lib/orchestration/merge-block-class.js +1 -1
  96. package/.agents/scripts/lib/orchestration/phase-runner.js +3 -2
  97. package/.agents/scripts/lib/orchestration/plan-context.js +248 -266
  98. package/.agents/scripts/lib/orchestration/plan-critic-conditions.js +3 -2
  99. package/.agents/scripts/lib/orchestration/plan-critics-evaluate.js +1 -1
  100. package/.agents/scripts/lib/orchestration/plan-navigation.js +92 -0
  101. package/.agents/scripts/lib/orchestration/plan-persist/fan-out-gate.js +61 -0
  102. package/.agents/scripts/lib/orchestration/plan-persist/persist-helpers.js +97 -0
  103. package/.agents/scripts/lib/orchestration/plan-persist/run-plan-persist.js +223 -854
  104. package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +361 -0
  105. package/.agents/scripts/lib/orchestration/plan-persist/summary.js +35 -108
  106. package/.agents/scripts/lib/orchestration/plan-reachability.js +9 -14
  107. package/.agents/scripts/lib/orchestration/plan-runner/worktree-sweep.js +1 -1
  108. package/.agents/scripts/lib/orchestration/{epic-plan-spec/phases → planning}/authoring-context.js +14 -14
  109. package/.agents/scripts/lib/orchestration/planning/decomposer-context.js +27 -0
  110. package/.agents/scripts/lib/orchestration/{epic-plan-spec/phases → planning}/risk-verdict.js +3 -4
  111. package/.agents/scripts/lib/orchestration/post-merge/phases/branch-cleanup.js +2 -2
  112. package/.agents/scripts/lib/orchestration/post-merge/phases/dashboard-refresh.js +8 -20
  113. package/.agents/scripts/lib/orchestration/post-merge/phases/worktree-reap.js +3 -2
  114. package/.agents/scripts/lib/orchestration/pr-base-guard.js +18 -28
  115. package/.agents/scripts/lib/orchestration/preflight-cache.js +5 -5
  116. package/.agents/scripts/lib/orchestration/remote-verifier.js +1 -1
  117. package/.agents/scripts/lib/orchestration/resolve-plan-run.js +155 -0
  118. package/.agents/scripts/lib/orchestration/resolves-token.js +1 -1
  119. package/.agents/scripts/lib/orchestration/retro-perf-heuristics.js +8 -8
  120. package/.agents/scripts/lib/orchestration/retro-proposals.js +140 -79
  121. package/.agents/scripts/lib/orchestration/review-depth.js +26 -12
  122. package/.agents/scripts/lib/orchestration/review-providers/codex.js +2 -2
  123. package/.agents/scripts/lib/orchestration/review-providers/review-provider-factory.js +21 -56
  124. package/.agents/scripts/lib/orchestration/run-epilogue.js +426 -0
  125. package/.agents/scripts/lib/orchestration/single-story-close/phases/auto-merge.js +1 -1
  126. package/.agents/scripts/lib/orchestration/single-story-close/phases/close-validation.js +1 -0
  127. package/.agents/scripts/lib/orchestration/single-story-close/phases/code-review.js +95 -41
  128. package/.agents/scripts/lib/orchestration/single-story-close/phases/options.js +16 -13
  129. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-block.js +40 -0
  130. package/.agents/scripts/lib/orchestration/single-story-close/runner.js +11 -3
  131. package/.agents/scripts/lib/orchestration/spec-freshness.js +14 -205
  132. package/.agents/scripts/lib/orchestration/spec-section-validator.js +4 -5
  133. package/.agents/scripts/lib/orchestration/spec-spill.js +60 -0
  134. package/.agents/scripts/lib/orchestration/split-policy-validator.js +188 -0
  135. package/.agents/scripts/lib/orchestration/story-close/emit-blocked.js +49 -0
  136. package/.agents/scripts/lib/orchestration/story-close/phases/code-review.js +15 -12
  137. package/.agents/scripts/lib/orchestration/story-follow-ups.js +237 -0
  138. package/.agents/scripts/lib/orchestration/story-init-remote.js +47 -0
  139. package/.agents/scripts/lib/orchestration/story-plan-state.js +48 -0
  140. package/.agents/scripts/lib/orchestration/{epic-runner → story-progress}/story-run-progress-writer.js +3 -3
  141. package/.agents/scripts/lib/orchestration/structured-comment-parser.js +1 -1
  142. package/.agents/scripts/lib/orchestration/task-body-validator.js +8 -18
  143. package/.agents/scripts/lib/orchestration/ticket-validator-conflicts.js +11 -61
  144. package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +189 -373
  145. package/.agents/scripts/lib/orchestration/ticket-validator.js +3 -8
  146. package/.agents/scripts/lib/orchestration/ticketing/bulk.js +0 -25
  147. package/.agents/scripts/lib/orchestration/ticketing/reads.js +29 -26
  148. package/.agents/scripts/lib/orchestration/ticketing/transition.js +5 -5
  149. package/.agents/scripts/lib/planning-corpus.js +16 -11
  150. package/.agents/scripts/lib/preflight-runner.js +2 -2
  151. package/.agents/scripts/lib/provider-factory.js +1 -1
  152. package/.agents/scripts/lib/qa/coverage-verdict.js +5 -5
  153. package/.agents/scripts/lib/single-story/confirm-merge-follow-ups.js +36 -0
  154. package/.agents/scripts/lib/single-story-sweep/protection-ctx.js +1 -1
  155. package/.agents/scripts/lib/story-adjacency.js +11 -14
  156. package/.agents/scripts/lib/story-body/story-body.js +124 -70
  157. package/.agents/scripts/lib/story-plan.js +2 -4
  158. package/.agents/scripts/lib/templates/decomposer-prompts.js +46 -45
  159. package/.agents/scripts/lib/templates/spec-author-prompts.js +47 -45
  160. package/.agents/scripts/lib/{epic-body-sections.js → ticket-body-sections.js} +26 -26
  161. package/.agents/scripts/lib/validation-evidence.js +1 -1
  162. package/.agents/scripts/lib/wave-runner/ready-set.js +6 -6
  163. package/.agents/scripts/lib/workspace-provisioner.js +1 -1
  164. package/.agents/scripts/lib/worktree/lifecycle/reap.js +5 -7
  165. package/.agents/scripts/lint-issue-body.js +71 -40
  166. package/.agents/scripts/mandrel-update-preflight.js +1 -1
  167. package/.agents/scripts/notify.js +4 -3
  168. package/.agents/scripts/plan-context.js +64 -74
  169. package/.agents/scripts/plan-persist.js +121 -280
  170. package/.agents/scripts/plan-run-epilogue.js +97 -0
  171. package/.agents/scripts/post-structured-comment.js +38 -0
  172. package/.agents/scripts/providers/github/issues.js +17 -33
  173. package/.agents/scripts/providers/github/mappers.js +0 -12
  174. package/.agents/scripts/providers/github/tickets.js +2 -5
  175. package/.agents/scripts/resolve-plan-run.js +117 -0
  176. package/.agents/scripts/signals-view.js +24 -19
  177. package/.agents/scripts/single-story-close.js +11 -14
  178. package/.agents/scripts/single-story-confirm-merge.js +39 -23
  179. package/.agents/scripts/single-story-init.js +29 -20
  180. package/.agents/scripts/stories-wave-tick.js +6 -6
  181. package/.agents/scripts/story-plan.js +26 -47
  182. package/.agents/scripts/sync-claude-agents.js +165 -0
  183. package/.agents/scripts/update-ticket-state.js +37 -15
  184. package/.agents/skills/core/analyze-execution/SKILL.md +21 -18
  185. package/.agents/skills/core/api-and-interface-design/SKILL.md +5 -3
  186. package/.agents/skills/core/code-review-and-quality/SKILL.md +63 -7
  187. package/.agents/skills/core/debugging-and-error-recovery/SKILL.md +1 -1
  188. package/.agents/skills/core/gates-and-baselines/SKILL.md +149 -0
  189. package/.agents/skills/core/idea-refinement/SKILL.md +8 -14
  190. package/.agents/skills/core/qa-coverage-mapping/SKILL.md +7 -7
  191. package/.agents/skills/core/scope-triage/SKILL.md +28 -172
  192. package/.agents/skills/skills.index.json +8 -418
  193. package/.agents/starter-agentrc.json +0 -5
  194. package/.agents/templates/agent-protocol.md +9 -10
  195. package/.agents/workflows/audit-architecture.md +3 -3
  196. package/.agents/workflows/audit-clean-code.md +3 -3
  197. package/.agents/workflows/audit-dependencies.md +3 -3
  198. package/.agents/workflows/audit-devops.md +3 -3
  199. package/.agents/workflows/audit-documentation.md +5 -5
  200. package/.agents/workflows/audit-lighthouse.md +3 -3
  201. package/.agents/workflows/audit-navigability.md +3 -2
  202. package/.agents/workflows/audit-performance.md +3 -3
  203. package/.agents/workflows/audit-privacy.md +3 -3
  204. package/.agents/workflows/audit-quality.md +3 -3
  205. package/.agents/workflows/audit-security.md +3 -3
  206. package/.agents/workflows/audit-seo.md +3 -3
  207. package/.agents/workflows/audit-sre.md +3 -3
  208. package/.agents/workflows/audit-to-stories.md +20 -20
  209. package/.agents/workflows/audit-ux-ui.md +3 -3
  210. package/.agents/workflows/deliver.md +122 -131
  211. package/.agents/workflows/git-cleanup.md +3 -4
  212. package/.agents/workflows/helpers/_merge-conflict-template.md +1 -1
  213. package/.agents/workflows/helpers/acceptance-self-eval.md +52 -40
  214. package/.agents/workflows/helpers/code-review.md +70 -193
  215. package/.agents/workflows/helpers/{single-story-deliver-reference.md → deliver-story-reference.md} +12 -14
  216. package/.agents/workflows/helpers/{single-story-deliver.md → deliver-story.md} +113 -139
  217. package/.agents/workflows/helpers/diagnose.md +10 -10
  218. package/.agents/workflows/helpers/mandrel-sync-config.md +1 -1
  219. package/.agents/workflows/helpers/parallel-tooling.md +1 -1
  220. package/.agents/workflows/helpers/signals.md +16 -16
  221. package/.agents/workflows/helpers/worktree-lifecycle.md +48 -64
  222. package/.agents/workflows/mandrel-update.md +3 -2
  223. package/.agents/workflows/plan.md +112 -145
  224. package/.agents/workflows/qa-assist.md +24 -30
  225. package/.agents/workflows/qa-explore.md +29 -38
  226. package/.agents/workflows/qa-run.md +2 -2
  227. package/README.md +9 -8
  228. package/docs/CHANGELOG.md +46 -0
  229. package/lib/cli/registry.js +95 -0
  230. package/lib/migrations/index.js +6 -5
  231. package/package.json +5 -3
  232. package/.agents/personas/architect.md +0 -113
  233. package/.agents/personas/devops-engineer.md +0 -38
  234. package/.agents/personas/engineer-mobile.md +0 -120
  235. package/.agents/personas/engineer-web.md +0 -111
  236. package/.agents/personas/engineer.md +0 -119
  237. package/.agents/personas/product.md +0 -94
  238. package/.agents/personas/project-manager.md +0 -114
  239. package/.agents/personas/qa-engineer.md +0 -95
  240. package/.agents/personas/refactorer.md +0 -113
  241. package/.agents/personas/security-engineer.md +0 -112
  242. package/.agents/personas/sre.md +0 -86
  243. package/.agents/personas/technical-writer.md +0 -101
  244. package/.agents/personas/ux-designer.md +0 -95
  245. package/.agents/schemas/dispatch-manifest.json +0 -232
  246. package/.agents/schemas/epic-spec.schema.json +0 -153
  247. package/.agents/scripts/acceptance-spec-reconciler.js +0 -642
  248. package/.agents/scripts/dispatcher.js +0 -295
  249. package/.agents/scripts/epic-audit-prepare.js +0 -497
  250. package/.agents/scripts/epic-audit-recheck.js +0 -274
  251. package/.agents/scripts/epic-deliver-note-intervention.js +0 -192
  252. package/.agents/scripts/epic-deliver-preflight.js +0 -462
  253. package/.agents/scripts/epic-deliver-prepare.js +0 -590
  254. package/.agents/scripts/epic-execute-record-wave.js +0 -449
  255. package/.agents/scripts/epic-plan-clarity.js +0 -211
  256. package/.agents/scripts/epic-plan-decompose.js +0 -54
  257. package/.agents/scripts/epic-plan-healthcheck.js +0 -581
  258. package/.agents/scripts/epic-plan-spec.js +0 -64
  259. package/.agents/scripts/epic-reconcile.js +0 -625
  260. package/.agents/scripts/lib/baseline-snapshot.js +0 -979
  261. package/.agents/scripts/lib/checks/epic-merge-lock-stale.js +0 -54
  262. package/.agents/scripts/lib/checks/stale-origin-epic.js +0 -49
  263. package/.agents/scripts/lib/config/lifecycle.js +0 -40
  264. package/.agents/scripts/lib/config/preflight.js +0 -58
  265. package/.agents/scripts/lib/config/retro.js +0 -77
  266. package/.agents/scripts/lib/epic-merge-lock.js +0 -322
  267. package/.agents/scripts/lib/epic-plan-clarity.js +0 -181
  268. package/.agents/scripts/lib/epic-plan-ideation.js +0 -261
  269. package/.agents/scripts/lib/orchestration/context-hydration-engine.js +0 -660
  270. package/.agents/scripts/lib/orchestration/dispatch-engine.js +0 -134
  271. package/.agents/scripts/lib/orchestration/dispatch-pipeline.js +0 -183
  272. package/.agents/scripts/lib/orchestration/epic-cleanup.js +0 -801
  273. package/.agents/scripts/lib/orchestration/epic-deliver-lease-guard.js +0 -310
  274. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/context.js +0 -163
  275. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/creation.js +0 -140
  276. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/dag.js +0 -64
  277. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/diagnostics.js +0 -72
  278. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/persist-helpers.js +0 -156
  279. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/persist.js +0 -345
  280. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/planning-artifacts.js +0 -41
  281. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/reconcile-spawn.js +0 -86
  282. package/.agents/scripts/lib/orchestration/epic-plan-lease-guard.js +0 -391
  283. package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/drain.js +0 -94
  284. package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/plan-epic.js +0 -236
  285. package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/run-spec-phase.js +0 -307
  286. package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/spec-freshness.js +0 -117
  287. package/.agents/scripts/lib/orchestration/epic-plan-state-store.js +0 -117
  288. package/.agents/scripts/lib/orchestration/epic-run-state-store.js +0 -388
  289. package/.agents/scripts/lib/orchestration/epic-runner/concurrency-gate.js +0 -186
  290. package/.agents/scripts/lib/orchestration/epic-runner/deliver-phases.js +0 -50
  291. package/.agents/scripts/lib/orchestration/epic-runner/phases/build-wave-dag.js +0 -129
  292. package/.agents/scripts/lib/orchestration/epic-runner/phases/snapshot.js +0 -103
  293. package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter/composition.js +0 -267
  294. package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter/signals.js +0 -210
  295. package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter/transport.js +0 -238
  296. package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/_bullet-format.js +0 -32
  297. package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/component-drift.js +0 -203
  298. package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/crap-drift.js +0 -227
  299. package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/maintainability-drift.js +0 -117
  300. package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/stalled-worktree.js +0 -37
  301. package/.agents/scripts/lib/orchestration/epic-runner/story-launcher.js +0 -127
  302. package/.agents/scripts/lib/orchestration/epic-runner/sub-agent-return.js +0 -276
  303. package/.agents/scripts/lib/orchestration/epic-runner/wave-scheduler.js +0 -66
  304. package/.agents/scripts/lib/orchestration/epic-spec-reconciler-apply.js +0 -789
  305. package/.agents/scripts/lib/orchestration/epic-spec-reconciler-diff.js +0 -676
  306. package/.agents/scripts/lib/orchestration/epic-spec-reconciler-discriminator.js +0 -389
  307. package/.agents/scripts/lib/orchestration/epic-spec-reconciler-format.js +0 -230
  308. package/.agents/scripts/lib/orchestration/epic-spec-reconciler-ops.js +0 -361
  309. package/.agents/scripts/lib/orchestration/finalize/open-or-locate-pr.js +0 -306
  310. package/.agents/scripts/lib/orchestration/finalize/post-handoff-comment.js +0 -489
  311. package/.agents/scripts/lib/orchestration/finalize/sanitize-skip-ci.js +0 -88
  312. package/.agents/scripts/lib/orchestration/lifecycle/emit-story-dispatch-end.js +0 -147
  313. package/.agents/scripts/lib/orchestration/lifecycle/listeners/acceptance-reconciler.js +0 -384
  314. package/.agents/scripts/lib/orchestration/lifecycle/listeners/automerge-armer.js +0 -501
  315. package/.agents/scripts/lib/orchestration/lifecycle/listeners/automerge-predicate.js +0 -984
  316. package/.agents/scripts/lib/orchestration/lifecycle/listeners/branch-cleaner.js +0 -264
  317. package/.agents/scripts/lib/orchestration/lifecycle/listeners/checkpoint-pointer-writer.js +0 -278
  318. package/.agents/scripts/lib/orchestration/lifecycle/listeners/cleaner.js +0 -355
  319. package/.agents/scripts/lib/orchestration/lifecycle/listeners/finalizer.js +0 -673
  320. package/.agents/scripts/lib/orchestration/lifecycle/listeners/index.js +0 -378
  321. package/.agents/scripts/lib/orchestration/lifecycle/listeners/intervention-recorder.js +0 -140
  322. package/.agents/scripts/lib/orchestration/lifecycle/listeners/label-transitioner.js +0 -144
  323. package/.agents/scripts/lib/orchestration/lifecycle/listeners/notify-dispatcher.js +0 -174
  324. package/.agents/scripts/lib/orchestration/manifest-builder.js +0 -222
  325. package/.agents/scripts/lib/orchestration/plan-persist/amend.js +0 -359
  326. package/.agents/scripts/lib/orchestration/plan-persist/delivery-mode.js +0 -127
  327. package/.agents/scripts/lib/orchestration/post-merge-pipeline.js +0 -205
  328. package/.agents/scripts/lib/orchestration/recurring-failure-detector.js +0 -152
  329. package/.agents/scripts/lib/orchestration/retro/phases/checks.js +0 -94
  330. package/.agents/scripts/lib/orchestration/retro/phases/compose-body.js +0 -571
  331. package/.agents/scripts/lib/orchestration/retro/phases/gather-signals.js +0 -450
  332. package/.agents/scripts/lib/orchestration/retro/phases/post-and-mirror.js +0 -191
  333. package/.agents/scripts/lib/orchestration/retro-heuristics.js +0 -57
  334. package/.agents/scripts/lib/orchestration/retro-runner.js +0 -197
  335. package/.agents/scripts/lib/orchestration/skill-capsule-loader.js +0 -109
  336. package/.agents/scripts/lib/orchestration/spec-renderer.js +0 -447
  337. package/.agents/scripts/lib/orchestration/story-close/auto-refresh-runner.js +0 -747
  338. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/gate-failure.js +0 -211
  339. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/pre-merge-attribution.js +0 -158
  340. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/refresh-commit.js +0 -446
  341. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/regression-projection.js +0 -297
  342. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/scope-discovery.js +0 -48
  343. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution-wiring.js +0 -67
  344. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution.js +0 -161
  345. package/.agents/scripts/lib/orchestration/story-close/baseline-friction-body.js +0 -117
  346. package/.agents/scripts/lib/orchestration/story-close/cd-out-guard.js +0 -86
  347. package/.agents/scripts/lib/orchestration/story-close/cleanup-reconciler.js +0 -147
  348. package/.agents/scripts/lib/orchestration/story-close/close-inputs.js +0 -142
  349. package/.agents/scripts/lib/orchestration/story-close/comment-bodies.js +0 -62
  350. package/.agents/scripts/lib/orchestration/story-close/merge-runner.js +0 -658
  351. package/.agents/scripts/lib/orchestration/story-close/merge-subject.js +0 -198
  352. package/.agents/scripts/lib/orchestration/story-close/phases/branch-restore.js +0 -105
  353. package/.agents/scripts/lib/orchestration/story-close/phases/close.js +0 -222
  354. package/.agents/scripts/lib/orchestration/story-close/phases/gates.js +0 -292
  355. package/.agents/scripts/lib/orchestration/story-close/phases/locked-pipeline.js +0 -270
  356. package/.agents/scripts/lib/orchestration/story-close/phases/preflight.js +0 -110
  357. package/.agents/scripts/lib/orchestration/story-close/phases/refresh.js +0 -86
  358. package/.agents/scripts/lib/orchestration/story-close/phases/timeout-blocked-emitter.js +0 -112
  359. package/.agents/scripts/lib/orchestration/story-close/phases/timeout-blocked.js +0 -157
  360. package/.agents/scripts/lib/orchestration/story-close/post-merge-close.js +0 -421
  361. package/.agents/scripts/lib/orchestration/story-close/pre-merge-validation.js +0 -301
  362. package/.agents/scripts/lib/orchestration/story-close/shared-checkout-guard.js +0 -163
  363. package/.agents/scripts/lib/orchestration/story-close-recovery.js +0 -690
  364. package/.agents/scripts/lib/orchestration/wave-marker.js +0 -28
  365. package/.agents/scripts/lib/orchestration/wave-record-io.js +0 -218
  366. package/.agents/scripts/lib/orchestration/wave-record-notifications.js +0 -145
  367. package/.agents/scripts/lib/orchestration/wave-record-projection.js +0 -212
  368. package/.agents/scripts/lib/presentation/dispatch-manifest-render.js +0 -111
  369. package/.agents/scripts/lib/presentation/manifest-builder.js +0 -239
  370. package/.agents/scripts/lib/presentation/manifest-formatter.js +0 -242
  371. package/.agents/scripts/lib/presentation/manifest-helpers.js +0 -213
  372. package/.agents/scripts/lib/presentation/manifest-persistence.js +0 -261
  373. package/.agents/scripts/lib/presentation/manifest-procedures.js +0 -55
  374. package/.agents/scripts/lib/presentation/manifest-render-waves.js +0 -306
  375. package/.agents/scripts/lib/presentation/manifest-renderer.js +0 -188
  376. package/.agents/scripts/lib/presentation/manifest-story-views.js +0 -110
  377. package/.agents/scripts/lib/push-epic-retry.js +0 -209
  378. package/.agents/scripts/lib/spec/index.js +0 -36
  379. package/.agents/scripts/lib/spec/loader.js +0 -425
  380. package/.agents/scripts/lib/spec/state.js +0 -208
  381. package/.agents/scripts/lib/story-init/blocker-validator.js +0 -68
  382. package/.agents/scripts/lib/story-init/branch-initializer.js +0 -408
  383. package/.agents/scripts/lib/story-init/context-resolver.js +0 -92
  384. package/.agents/scripts/lib/story-init/donor-precheck.js +0 -207
  385. package/.agents/scripts/lib/story-init/state-transitioner.js +0 -80
  386. package/.agents/scripts/lib/story-init/task-graph-builder.js +0 -124
  387. package/.agents/scripts/lib/story-init/transition-summary.js +0 -34
  388. package/.agents/scripts/lib/test-reserved-epic-temp-ids.js +0 -35
  389. package/.agents/scripts/lib/wave-runner/tick.js +0 -754
  390. package/.agents/scripts/lib/wave-runner/wave-runner-error.js +0 -20
  391. package/.agents/scripts/lifecycle-emit-story-dispatch.js +0 -194
  392. package/.agents/scripts/lifecycle-emit.js +0 -510
  393. package/.agents/scripts/plan-critics.js +0 -199
  394. package/.agents/scripts/retro-run.js +0 -218
  395. package/.agents/scripts/standalone-feedback-rollup.js +0 -188
  396. package/.agents/scripts/story-close.js +0 -294
  397. package/.agents/scripts/story-init.js +0 -599
  398. package/.agents/scripts/story-phase.js +0 -369
  399. package/.agents/scripts/wave-tick.js +0 -335
  400. package/.agents/skills/core/baseline-refresh/SKILL.md +0 -181
  401. package/.agents/skills/core/ci-cd-and-automation/SKILL.md +0 -274
  402. package/.agents/skills/core/ci-cd-and-automation/examples.md +0 -211
  403. package/.agents/skills/core/code-simplification/SKILL.md +0 -389
  404. package/.agents/skills/core/context-engineering/SKILL.md +0 -309
  405. package/.agents/skills/core/context-engineering/examples.md +0 -58
  406. package/.agents/skills/core/deprecation-and-migration/SKILL.md +0 -250
  407. package/.agents/skills/core/epic-plan-consolidate/SKILL.md +0 -172
  408. package/.agents/skills/core/epic-plan-consolidate/examples.md +0 -51
  409. package/.agents/skills/core/epic-plan-decompose-author/SKILL.md +0 -441
  410. package/.agents/skills/core/epic-plan-decompose-author/examples.md +0 -47
  411. package/.agents/skills/core/epic-plan-premortem/SKILL.md +0 -146
  412. package/.agents/skills/core/epic-plan-premortem/examples.md +0 -53
  413. package/.agents/skills/core/epic-plan-spec-author/SKILL.md +0 -413
  414. package/.agents/skills/core/epic-plan-spec-author/examples.md +0 -91
  415. package/.agents/skills/core/frontend-ui-engineering/SKILL.md +0 -357
  416. package/.agents/skills/core/hydrate-context/SKILL.md +0 -123
  417. package/.agents/skills/core/idea-refinement/examples.md +0 -437
  418. package/.agents/skills/core/idea-refinement/frameworks.md +0 -135
  419. package/.agents/skills/core/incremental-implementation/SKILL.md +0 -271
  420. package/.agents/skills/core/introducing-a-baseline-gate/SKILL.md +0 -213
  421. package/.agents/skills/core/knowledge-transfer/SKILL.md +0 -180
  422. package/.agents/skills/core/mutation-survivor-remediation/SKILL.md +0 -117
  423. package/.agents/skills/core/performance-optimization/SKILL.md +0 -314
  424. package/.agents/skills/core/planning-and-task-breakdown/SKILL.md +0 -277
  425. package/.agents/skills/core/property-based-testing/SKILL.md +0 -148
  426. package/.agents/skills/core/refactoring-discipline/SKILL.md +0 -111
  427. package/.agents/skills/core/shipping-and-launch/SKILL.md +0 -328
  428. package/.agents/skills/core/spec-driven-development/SKILL.md +0 -252
  429. package/.agents/skills/core/test-driven-development/SKILL.md +0 -475
  430. package/.agents/skills/core/using-agent-skills/SKILL.md +0 -232
  431. package/.agents/skills/stack/architecture/monorepo-path-strategist/SKILL.md +0 -31
  432. package/.agents/skills/stack/architecture/structured-output-zod/SKILL.md +0 -51
  433. package/.agents/skills/stack/architecture/subagent-orchestration/SKILL.md +0 -76
  434. package/.agents/skills/stack/backend/cloudflare-hono-architect/SKILL.md +0 -31
  435. package/.agents/skills/stack/backend/cloudflare-hono-architect/examples/route-template.ts +0 -33
  436. package/.agents/skills/stack/backend/cloudflare-queue-manager/SKILL.md +0 -31
  437. package/.agents/skills/stack/backend/cloudflare-workers/SKILL.md +0 -51
  438. package/.agents/skills/stack/backend/highlevel-crm/SKILL.md +0 -54
  439. package/.agents/skills/stack/backend/sqlite-drizzle-expert/SKILL.md +0 -29
  440. package/.agents/skills/stack/backend/sqlite-drizzle-expert/examples/schema-template.ts +0 -30
  441. package/.agents/skills/stack/backend/stripe-integration/SKILL.md +0 -57
  442. package/.agents/skills/stack/backend/stripe-integration/scripts/listen-stripe.sh +0 -9
  443. package/.agents/skills/stack/backend/turso-sqlite/SKILL.md +0 -48
  444. package/.agents/skills/stack/frontend/astro/SKILL.md +0 -62
  445. package/.agents/skills/stack/frontend/astro-react-island-strategist/SKILL.md +0 -30
  446. package/.agents/skills/stack/frontend/expo-react-native-developer/SKILL.md +0 -29
  447. package/.agents/skills/stack/frontend/google-analytics-v4/SKILL.md +0 -50
  448. package/.agents/skills/stack/frontend/tailwind-v4/SKILL.md +0 -58
  449. package/.agents/skills/stack/frontend/ui-accessibility-engineer/SKILL.md +0 -34
  450. package/.agents/skills/stack/qa/audit-accessibility/SKILL.md +0 -51
  451. package/.agents/skills/stack/qa/lighthouse-baseline/SKILL.md +0 -199
  452. package/.agents/skills/stack/security/backend-security-patterns/SKILL.md +0 -68
  453. package/.agents/workflows/helpers/deliver-epic-reference.md +0 -534
  454. package/.agents/workflows/helpers/deliver-epic.md +0 -955
  455. package/.agents/workflows/helpers/deliver-stories.md +0 -440
  456. package/.agents/workflows/helpers/epic-audit.md +0 -189
  457. package/.agents/workflows/helpers/epic-deliver-story.md +0 -427
  458. package/.agents/workflows/helpers/epic-testing.md +0 -125
  459. package/.agents/workflows/helpers/plan-epic-reference.md +0 -160
  460. package/.agents/workflows/helpers/plan-epic.md +0 -351
  461. package/.agents/workflows/helpers/plan-story.md +0 -251
  462. package/.agents/workflows/helpers/scope-triage-gate.md +0 -108
  463. /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,