mandrel 1.94.0 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (560) hide show
  1. package/.agents/README.md +116 -99
  2. package/.agents/agents/acceptance-critic.md +9 -7
  3. package/.agents/agents/story-worker.md +45 -51
  4. package/.agents/audit-checklists/performance.md +1 -1
  5. package/.agents/docs/SDLC.md +498 -1287
  6. package/.agents/docs/agentrc-reference.json +185 -80
  7. package/.agents/docs/configuration.md +132 -190
  8. package/.agents/docs/execution-reference.md +51 -25
  9. package/.agents/docs/quality-gates.md +25 -33
  10. package/.agents/docs/workflows.md +8 -8
  11. package/.agents/instructions.md +113 -139
  12. package/.agents/rules/ci-remediation.md +11 -15
  13. package/.agents/rules/git-conventions-reference.md +48 -58
  14. package/.agents/rules/git-conventions.md +16 -22
  15. package/.agents/schemas/acceptance-eval-verdict.schema.json +1 -1
  16. package/.agents/schemas/agentrc.schema.json +83 -254
  17. package/.agents/schemas/audit-rules.json +59 -1
  18. package/.agents/schemas/audit-rules.schema.json +33 -1
  19. package/.agents/schemas/lifecycle/README.md +1 -2
  20. package/.agents/schemas/lifecycle/ledger-record.schema.json +1 -1
  21. package/.agents/schemas/lifecycle/merge.flip-failed.schema.json +33 -0
  22. package/.agents/schemas/lifecycle/merge.unlanded.schema.json +1 -0
  23. package/.agents/schemas/lifecycle/retro.end.schema.json +1 -1
  24. package/.agents/schemas/lifecycle/story.merged.schema.json +1 -1
  25. package/.agents/schemas/signal-event.schema.json +3 -3
  26. package/.agents/schemas/story-deliver-terminal.schema.json +152 -0
  27. package/.agents/schemas/validation-evidence.schema.json +1 -1
  28. package/.agents/scripts/acceptance-eval.js +22 -66
  29. package/.agents/scripts/agents-bootstrap-github.js +1 -1
  30. package/.agents/scripts/audit-to-stories.js +7 -7
  31. package/.agents/scripts/boot-sweep.js +1 -1
  32. package/.agents/scripts/bootstrap.js +3 -3
  33. package/.agents/scripts/check-dead-exports.js +43 -104
  34. package/.agents/scripts/check-doc-links.js +2 -2
  35. package/.agents/scripts/check-lifecycle-lint.js +7 -10
  36. package/.agents/scripts/check-workflow-cli-lint.js +91 -0
  37. package/.agents/scripts/cleanup-repo-test-temp.js +6 -1
  38. package/.agents/scripts/deliver-recover.js +122 -0
  39. package/.agents/scripts/drain-pending-cleanup.js +1 -1
  40. package/.agents/scripts/evidence-gate.js +20 -50
  41. package/.agents/scripts/generate-skills-index.js +17 -1
  42. package/.agents/scripts/generate-workflows-doc.js +4 -4
  43. package/.agents/scripts/lib/ITicketingProvider.js +1 -19
  44. package/.agents/scripts/lib/Logger.js +6 -10
  45. package/.agents/scripts/lib/audit-suite/runner.js +2 -2
  46. package/.agents/scripts/lib/audit-suite/selector.js +328 -28
  47. package/.agents/scripts/lib/audit-to-stories/{seed-epic-from-findings.js → seed-from-findings.js} +9 -9
  48. package/.agents/scripts/lib/baselines/kernel.js +206 -18
  49. package/.agents/scripts/lib/baselines/kinds/maintainability.js +0 -15
  50. package/.agents/scripts/lib/baselines/reader.js +1 -6
  51. package/.agents/scripts/lib/bdd-runner-detect.js +5 -9
  52. package/.agents/scripts/lib/bootstrap/ci-workflow-template.js +28 -33
  53. package/.agents/scripts/lib/bootstrap/issue-forms-template.js +32 -33
  54. package/.agents/scripts/lib/bootstrap/manifest.js +8 -11
  55. package/.agents/scripts/lib/bootstrap/project-bootstrap.js +30 -53
  56. package/.agents/scripts/lib/bootstrap/quality-bootstrap.js +0 -2
  57. package/.agents/scripts/lib/checks/core-bare-clean.js +6 -3
  58. package/.agents/scripts/lib/checks/index.js +3 -2
  59. package/.agents/scripts/lib/checks/loop-health.js +12 -11
  60. package/.agents/scripts/lib/checks/state.js +17 -248
  61. package/.agents/scripts/lib/checks/story-init-not-backgrounded.js +26 -24
  62. package/.agents/scripts/lib/checks/subagent-agent-tool-required.js +3 -4
  63. package/.agents/scripts/lib/checks/worktree-bootstrap-env.js +2 -2
  64. package/.agents/scripts/lib/checks/worktree-residue-biome.js +3 -3
  65. package/.agents/scripts/lib/cli/standard-args.js +13 -22
  66. package/.agents/scripts/lib/cli-args.js +39 -9
  67. package/.agents/scripts/lib/close-validation/gates.js +15 -15
  68. package/.agents/scripts/lib/close-validation/projections/inputs.js +7 -7
  69. package/.agents/scripts/lib/close-validation/projections/maintainability.js +12 -12
  70. package/.agents/scripts/lib/close-validation/runner.js +13 -21
  71. package/.agents/scripts/lib/close-validation/telemetry.js +17 -8
  72. package/.agents/scripts/lib/config/ci.js +6 -31
  73. package/.agents/scripts/lib/config/delivery-routing.js +52 -35
  74. package/.agents/scripts/lib/config/explain.js +61 -48
  75. package/.agents/scripts/lib/config/github.js +7 -5
  76. package/.agents/scripts/lib/config/limits.js +29 -80
  77. package/.agents/scripts/lib/config/paths.js +0 -2
  78. package/.agents/scripts/lib/config/quality.js +12 -15
  79. package/.agents/scripts/lib/config/runners.js +20 -66
  80. package/.agents/scripts/lib/config/temp-paths.js +30 -63
  81. package/.agents/scripts/lib/config/worktree-isolation.js +0 -5
  82. package/.agents/scripts/lib/config-resolver.js +2 -7
  83. package/.agents/scripts/lib/config-settings-schema-delivery.js +55 -161
  84. package/.agents/scripts/lib/config-settings-schema-quality.js +17 -16
  85. package/.agents/scripts/lib/config-settings-schema.js +100 -60
  86. package/.agents/scripts/lib/dead-exports-knip.js +105 -0
  87. package/.agents/scripts/lib/dead-exports-mode.js +51 -0
  88. package/.agents/scripts/lib/dependency-parser.js +3 -2
  89. package/.agents/scripts/lib/doc-tiers.js +2 -2
  90. package/.agents/scripts/lib/duplicate-search.js +242 -41
  91. package/.agents/scripts/lib/feedback-loop/retro-proposals-graduator.js +1 -1
  92. package/.agents/scripts/lib/findings/promote-finding.js +23 -14
  93. package/.agents/scripts/lib/format-generated-json.js +97 -0
  94. package/.agents/scripts/lib/framework-version.js +19 -190
  95. package/.agents/scripts/lib/gh-exec.js +8 -0
  96. package/.agents/scripts/lib/git-branch-cleanup.js +1 -10
  97. package/.agents/scripts/lib/git-branch-lifecycle.js +17 -180
  98. package/.agents/scripts/lib/git-utils.js +32 -20
  99. package/.agents/scripts/lib/github/framework-repo.js +6 -0
  100. package/.agents/scripts/lib/json-utils.js +1 -2
  101. package/.agents/scripts/lib/label-constants.js +10 -38
  102. package/.agents/scripts/lib/label-taxonomy.js +10 -55
  103. package/.agents/scripts/lib/observability/active-story-env.js +44 -165
  104. package/.agents/scripts/lib/observability/runtime-friction.js +243 -0
  105. package/.agents/scripts/lib/observability/signal-validator.js +4 -4
  106. package/.agents/scripts/lib/observability/signals-writer.js +6 -82
  107. package/.agents/scripts/lib/observability/source-classifier.js +5 -5
  108. package/.agents/scripts/lib/observability/tool-trace-hook.js +2 -12
  109. package/.agents/scripts/lib/onboard/init-tail.js +1 -3
  110. package/.agents/scripts/lib/orchestration/acceptance-clusters.js +1 -1
  111. package/.agents/scripts/lib/orchestration/acceptance-eval-decision.js +2 -2
  112. package/.agents/scripts/lib/orchestration/ceremony-routing.js +105 -44
  113. package/.agents/scripts/lib/orchestration/code-review.js +78 -436
  114. package/.agents/scripts/lib/orchestration/column-sync.js +1 -1
  115. package/.agents/scripts/lib/orchestration/consolidation-precondition.js +4 -4
  116. package/.agents/scripts/lib/orchestration/context-envelope.js +2 -5
  117. package/.agents/scripts/lib/orchestration/deliver-recover.js +328 -0
  118. package/.agents/scripts/lib/orchestration/detectors-phase.js +12 -6
  119. package/.agents/scripts/lib/orchestration/docs-digest.js +8 -8
  120. package/.agents/scripts/lib/orchestration/file-assumptions.js +7 -13
  121. package/.agents/scripts/lib/orchestration/git-cleanup/phases/cli.js +1 -1
  122. package/.agents/scripts/lib/orchestration/git-cleanup/phases/fast-forward.js +34 -0
  123. package/.agents/scripts/lib/orchestration/lease-guard-shared.js +3 -2
  124. package/.agents/scripts/lib/orchestration/lifecycle/emit-ledger-event.js +142 -0
  125. package/.agents/scripts/lib/orchestration/lifecycle/emit-loop-tick.js +17 -19
  126. package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-flip-failed.js +86 -0
  127. package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-unlanded.js +37 -103
  128. package/.agents/scripts/lib/orchestration/lifecycle/ledger-writer.js +6 -3
  129. package/.agents/scripts/lib/orchestration/lifecycle/listeners/README.md +21 -43
  130. package/.agents/scripts/lib/orchestration/lifecycle/listeners/watcher.js +50 -85
  131. package/.agents/scripts/lib/orchestration/lifecycle/trace-logger.js +3 -14
  132. package/.agents/scripts/lib/orchestration/lint-baseline-service.js +4 -4
  133. package/.agents/scripts/lib/orchestration/merge-block-class.js +77 -21
  134. package/.agents/scripts/lib/orchestration/merge-poll.js +104 -0
  135. package/.agents/scripts/lib/orchestration/phase-runner.js +3 -2
  136. package/.agents/scripts/lib/orchestration/plan-context.js +354 -282
  137. package/.agents/scripts/lib/orchestration/plan-critic-conditions.js +11 -22
  138. package/.agents/scripts/lib/orchestration/plan-critics-evaluate.js +4 -8
  139. package/.agents/scripts/lib/orchestration/plan-metrics.js +38 -6
  140. package/.agents/scripts/lib/orchestration/plan-navigation.js +92 -0
  141. package/.agents/scripts/lib/orchestration/plan-persist/fan-out-gate.js +71 -0
  142. package/.agents/scripts/lib/orchestration/plan-persist/persist-helpers.js +245 -0
  143. package/.agents/scripts/lib/orchestration/plan-persist/plan-context-source.js +116 -0
  144. package/.agents/scripts/lib/orchestration/plan-persist/run-plan-persist.js +432 -858
  145. package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +778 -0
  146. package/.agents/scripts/lib/orchestration/plan-persist/summary.js +47 -115
  147. package/.agents/scripts/lib/orchestration/plan-persist/supersede-ops.js +509 -0
  148. package/.agents/scripts/lib/orchestration/plan-reachability.js +9 -14
  149. package/.agents/scripts/lib/orchestration/plan-runner/worktree-sweep.js +1 -1
  150. package/.agents/scripts/lib/orchestration/{epic-plan-spec/phases → planning}/authoring-context.js +52 -51
  151. package/.agents/scripts/lib/orchestration/planning/decomposer-context.js +27 -0
  152. package/.agents/scripts/lib/orchestration/{epic-plan-spec/phases → planning}/spec-authoring-grounding.js +1 -1
  153. package/.agents/scripts/lib/orchestration/pr-base-guard.js +18 -28
  154. package/.agents/scripts/lib/orchestration/remote-verifier.js +1 -1
  155. package/.agents/scripts/lib/orchestration/resolve-stories.js +344 -0
  156. package/.agents/scripts/lib/orchestration/resolves-token.js +1 -1
  157. package/.agents/scripts/lib/orchestration/retro-proposals.js +140 -79
  158. package/.agents/scripts/lib/orchestration/review-depth.js +126 -47
  159. package/.agents/scripts/lib/orchestration/review-providers/codex.js +2 -2
  160. package/.agents/scripts/lib/orchestration/review-providers/findings-renderer.js +3 -13
  161. package/.agents/scripts/lib/orchestration/review-providers/native.js +1 -154
  162. package/.agents/scripts/lib/orchestration/review-providers/review-depth.js +3 -2
  163. package/.agents/scripts/lib/orchestration/review-providers/review-provider-factory.js +21 -56
  164. package/.agents/scripts/lib/orchestration/review-providers/security-review.js +1 -1
  165. package/.agents/scripts/lib/orchestration/review-providers/types.js +5 -4
  166. package/.agents/scripts/lib/orchestration/review-providers/ultrareview.js +1 -1
  167. package/.agents/scripts/lib/orchestration/run-epilogue.js +784 -0
  168. package/.agents/scripts/lib/orchestration/single-story-close/phases/auto-merge.js +25 -1
  169. package/.agents/scripts/lib/orchestration/single-story-close/phases/base-sync.js +11 -9
  170. package/.agents/scripts/lib/orchestration/single-story-close/phases/close-validation.js +4 -4
  171. package/.agents/scripts/lib/orchestration/single-story-close/phases/code-review.js +86 -41
  172. package/.agents/scripts/lib/orchestration/single-story-close/phases/confirm-merge.js +608 -152
  173. package/.agents/scripts/lib/orchestration/single-story-close/phases/options.js +77 -32
  174. package/.agents/scripts/lib/orchestration/single-story-close/phases/post-land.js +305 -0
  175. package/.agents/scripts/lib/orchestration/single-story-close/phases/pull-request.js +1 -1
  176. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-block.js +44 -0
  177. package/.agents/scripts/lib/orchestration/single-story-close/phases/worktree-reap.js +37 -4
  178. package/.agents/scripts/lib/orchestration/single-story-close/phases/wrong-tree-guard.js +2 -2
  179. package/.agents/scripts/lib/orchestration/single-story-close/runner.js +275 -46
  180. package/.agents/scripts/lib/orchestration/single-story-lease-guard.js +1 -1
  181. package/.agents/scripts/lib/orchestration/spec-freshness.js +14 -205
  182. package/.agents/scripts/lib/orchestration/spec-section-validator.js +4 -5
  183. package/.agents/scripts/lib/orchestration/spec-spill.js +60 -0
  184. package/.agents/scripts/lib/orchestration/split-policy-validator.js +188 -0
  185. package/.agents/scripts/lib/orchestration/story-close/emit-blocked.js +49 -0
  186. package/.agents/scripts/lib/orchestration/story-close/format-autofix.js +10 -10
  187. package/.agents/scripts/lib/orchestration/story-close/phases/code-review.js +28 -42
  188. package/.agents/scripts/lib/orchestration/story-deliver-terminal.js +360 -0
  189. package/.agents/scripts/lib/orchestration/story-follow-ups.js +298 -0
  190. package/.agents/scripts/lib/orchestration/story-init-remote.js +51 -0
  191. package/.agents/scripts/lib/orchestration/story-plan-state.js +33 -0
  192. package/.agents/scripts/lib/orchestration/structured-comment-parser.js +1 -1
  193. package/.agents/scripts/lib/orchestration/task-body-validator.js +60 -25
  194. package/.agents/scripts/lib/orchestration/ticket-lease.js +27 -74
  195. package/.agents/scripts/lib/orchestration/ticket-validator-conflicts.js +130 -75
  196. package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +192 -377
  197. package/.agents/scripts/lib/orchestration/ticket-validator.js +123 -25
  198. package/.agents/scripts/lib/orchestration/ticketing/bulk.js +14 -72
  199. package/.agents/scripts/lib/orchestration/ticketing/reads.js +45 -55
  200. package/.agents/scripts/lib/orchestration/ticketing/transition.js +66 -6
  201. package/.agents/scripts/lib/orchestration/ticketing.js +0 -1
  202. package/.agents/scripts/lib/plan-phase-cleanup.js +12 -14
  203. package/.agents/scripts/lib/planning-corpus.js +12 -281
  204. package/.agents/scripts/lib/preflight-runner.js +4 -4
  205. package/.agents/scripts/lib/qa/coverage-verdict.js +5 -5
  206. package/.agents/scripts/lib/qa/qa-context-hydrator.js +5 -5
  207. package/.agents/scripts/lib/signals/index.js +4 -17
  208. package/.agents/scripts/lib/signals/read.js +35 -35
  209. package/.agents/scripts/lib/signals/schema.js +8 -11
  210. package/.agents/scripts/lib/signals/span-tree.js +7 -7
  211. package/.agents/scripts/lib/signals/write.js +0 -1
  212. package/.agents/scripts/lib/single-story/story-merged-notify.js +13 -2
  213. package/.agents/scripts/lib/single-story-sweep/protection-ctx.js +1 -1
  214. package/.agents/scripts/lib/skills/parse-skill.js +16 -3
  215. package/.agents/scripts/lib/story-adjacency.js +17 -19
  216. package/.agents/scripts/lib/story-body/story-body.js +130 -75
  217. package/.agents/scripts/lib/story-plan.js +2 -4
  218. package/.agents/scripts/lib/templates/decomposer-prompts.js +51 -46
  219. package/.agents/scripts/lib/templates/spec-author-prompts.js +47 -45
  220. package/.agents/scripts/lib/test-env.js +14 -1
  221. package/.agents/scripts/lib/test-tiers.js +0 -3
  222. package/.agents/scripts/lib/{epic-body-sections.js → ticket-body-sections.js} +25 -39
  223. package/.agents/scripts/lib/validation-evidence.js +32 -60
  224. package/.agents/scripts/lib/wave-runner/ready-set.js +38 -12
  225. package/.agents/scripts/lib/workspace-provisioner.js +1 -1
  226. package/.agents/scripts/lib/worktree/lifecycle/pending-cleanup.js +1 -1
  227. package/.agents/scripts/lib/worktree/lifecycle/reap.js +72 -25
  228. package/.agents/scripts/lib/worktree/lifecycle-manager.js +1 -2
  229. package/.agents/scripts/lint-issue-body.js +71 -40
  230. package/.agents/scripts/mandrel-update-preflight.js +1 -1
  231. package/.agents/scripts/notify.js +4 -3
  232. package/.agents/scripts/plan-context.js +102 -80
  233. package/.agents/scripts/plan-persist.js +230 -279
  234. package/.agents/scripts/plan-run-epilogue.js +142 -0
  235. package/.agents/scripts/post-structured-comment.js +0 -38
  236. package/.agents/scripts/pr-watch-with-update.js +43 -22
  237. package/.agents/scripts/providers/github/compose.js +0 -1
  238. package/.agents/scripts/providers/github/errors.js +0 -19
  239. package/.agents/scripts/providers/github/issues.js +13 -39
  240. package/.agents/scripts/providers/github/mappers.js +5 -12
  241. package/.agents/scripts/providers/github/sub-issues.js +0 -47
  242. package/.agents/scripts/providers/github/tickets.js +33 -156
  243. package/.agents/scripts/providers/github.js +17 -6
  244. package/.agents/scripts/resolve-stories.js +236 -0
  245. package/.agents/scripts/run-coverage.js +4 -1
  246. package/.agents/scripts/run-lint.js +2 -2
  247. package/.agents/scripts/run-verify.js +31 -2
  248. package/.agents/scripts/signals-view.js +25 -21
  249. package/.agents/scripts/single-story-close.js +178 -26
  250. package/.agents/scripts/single-story-confirm-merge.js +313 -24
  251. package/.agents/scripts/single-story-init.js +35 -30
  252. package/.agents/scripts/stories-wave-tick.js +85 -10
  253. package/.agents/scripts/story-plan.js +28 -49
  254. package/.agents/scripts/update-ticket-state.js +14 -65
  255. package/.agents/skills/core/code-review-and-quality/SKILL.md +28 -450
  256. package/.agents/skills/core/code-review-and-quality/reference.md +458 -0
  257. package/.agents/skills/core/debugging-and-error-recovery/SKILL.md +22 -315
  258. package/.agents/skills/core/debugging-and-error-recovery/reference.md +323 -0
  259. package/.agents/skills/core/diagnose-friction/SKILL.md +14 -18
  260. package/.agents/skills/core/documentation-and-adrs/SKILL.md +25 -397
  261. package/.agents/skills/core/documentation-and-adrs/reference.md +403 -0
  262. package/.agents/skills/core/gates-and-baselines/SKILL.md +12 -12
  263. package/.agents/skills/core/idea-refinement/SKILL.md +9 -9
  264. package/.agents/skills/core/scope-triage/SKILL.md +31 -172
  265. package/.agents/skills/core/security-and-hardening/SKILL.md +22 -367
  266. package/.agents/skills/core/security-and-hardening/reference.md +375 -0
  267. package/.agents/skills/skills.index.json +3 -53
  268. package/.agents/skills/stack/qa/playwright-bdd/SKILL.md +2 -4
  269. package/.agents/skills/stack/qa/qa-explore-driving/SKILL.md +1 -1
  270. package/.agents/skills/stack/qa/qa-harness/SKILL.md +1 -3
  271. package/.agents/starter-agentrc.json +0 -5
  272. package/.agents/templates/agent-protocol.md +9 -10
  273. package/.agents/workflows/audit-architecture.md +6 -7
  274. package/.agents/workflows/audit-clean-code.md +7 -7
  275. package/.agents/workflows/audit-dependencies.md +3 -3
  276. package/.agents/workflows/audit-devops.md +3 -3
  277. package/.agents/workflows/audit-documentation.md +9 -10
  278. package/.agents/workflows/audit-lighthouse.md +11 -3
  279. package/.agents/workflows/audit-navigability.md +13 -2
  280. package/.agents/workflows/audit-performance.md +5 -6
  281. package/.agents/workflows/audit-privacy.md +3 -3
  282. package/.agents/workflows/audit-quality.md +11 -12
  283. package/.agents/workflows/audit-security.md +4 -5
  284. package/.agents/workflows/audit-seo.md +13 -3
  285. package/.agents/workflows/audit-sre.md +3 -3
  286. package/.agents/workflows/audit-to-stories.md +20 -20
  287. package/.agents/workflows/audit-ux-ui.md +10 -3
  288. package/.agents/workflows/deliver.md +177 -176
  289. package/.agents/workflows/git-cleanup.md +5 -6
  290. package/.agents/workflows/git-deliver.md +1 -1
  291. package/.agents/workflows/helpers/_merge-conflict-template.md +1 -1
  292. package/.agents/workflows/helpers/acceptance-self-eval.md +35 -40
  293. package/.agents/workflows/helpers/code-quality-guardrails.md +7 -7
  294. package/.agents/workflows/helpers/code-review.md +75 -196
  295. package/.agents/workflows/helpers/{single-story-deliver-reference.md → deliver-story-reference.md} +83 -44
  296. package/.agents/workflows/helpers/deliver-story.md +606 -0
  297. package/.agents/workflows/helpers/diagnose.md +10 -10
  298. package/.agents/workflows/helpers/parallel-tooling.md +3 -3
  299. package/.agents/workflows/helpers/signals.md +16 -16
  300. package/.agents/workflows/helpers/worktree-lifecycle.md +66 -86
  301. package/.agents/workflows/mandrel-update.md +2 -1
  302. package/.agents/workflows/plan.md +277 -145
  303. package/.agents/workflows/qa-assist.md +27 -33
  304. package/.agents/workflows/qa-explore.md +29 -38
  305. package/.agents/workflows/qa-run.md +2 -6
  306. package/README.md +9 -8
  307. package/bin/mandrel.js +12 -1
  308. package/docs/CHANGELOG.md +70 -0
  309. package/lib/cli/registry.js +262 -19
  310. package/lib/cli/sync-agents.js +157 -0
  311. package/lib/cli/sync-commands.js +115 -6
  312. package/lib/cli/sync.js +168 -6
  313. package/lib/cli/update.js +105 -8
  314. package/lib/cli/version-helpers.js +131 -0
  315. package/lib/migrations/README.md +7 -5
  316. package/lib/migrations/index.js +12 -8
  317. package/lib/migrations/steps/2.1.0-retire-mi-drop-knobs.js +100 -0
  318. package/lib/migrations/steps/2.1.0-retire-verify-concurrency-cap.js +101 -0
  319. package/package.json +2 -2
  320. package/.agents/agents/retro.md +0 -42
  321. package/.agents/personas/architect.md +0 -113
  322. package/.agents/personas/devops-engineer.md +0 -38
  323. package/.agents/personas/engineer.md +0 -33
  324. package/.agents/personas/project-manager.md +0 -114
  325. package/.agents/personas/qa-engineer.md +0 -95
  326. package/.agents/personas/security-engineer.md +0 -111
  327. package/.agents/personas/technical-writer.md +0 -101
  328. package/.agents/schemas/dispatch-manifest.json +0 -232
  329. package/.agents/schemas/epic-perf-report.schema.json +0 -89
  330. package/.agents/schemas/epic-spec.schema.json +0 -153
  331. package/.agents/schemas/lifecycle/acceptance.reconcile.failed.schema.json +0 -13
  332. package/.agents/schemas/lifecycle/acceptance.reconcile.ok.schema.json +0 -13
  333. package/.agents/schemas/lifecycle/acceptance.reconcile.skipped.schema.json +0 -13
  334. package/.agents/schemas/lifecycle/acceptance.reconcile.start.schema.json +0 -12
  335. package/.agents/schemas/lifecycle/acceptance.reconcile.waived.schema.json +0 -13
  336. package/.agents/schemas/lifecycle/epic.automerge.end.schema.json +0 -15
  337. package/.agents/schemas/lifecycle/epic.automerge.start.schema.json +0 -13
  338. package/.agents/schemas/lifecycle/epic.blocked.schema.json +0 -13
  339. package/.agents/schemas/lifecycle/epic.cleanup.end.schema.json +0 -12
  340. package/.agents/schemas/lifecycle/epic.cleanup.start.schema.json +0 -12
  341. package/.agents/schemas/lifecycle/epic.close.end.schema.json +0 -12
  342. package/.agents/schemas/lifecycle/epic.complete.schema.json +0 -13
  343. package/.agents/schemas/lifecycle/epic.finalize.end.schema.json +0 -13
  344. package/.agents/schemas/lifecycle/epic.finalize.start.schema.json +0 -12
  345. package/.agents/schemas/lifecycle/epic.merge.armed.schema.json +0 -13
  346. package/.agents/schemas/lifecycle/epic.merge.blocked.schema.json +0 -14
  347. package/.agents/schemas/lifecycle/epic.merge.confirmed.schema.json +0 -17
  348. package/.agents/schemas/lifecycle/epic.merge.ready.schema.json +0 -15
  349. package/.agents/schemas/lifecycle/epic.plan.end.schema.json +0 -18
  350. package/.agents/schemas/lifecycle/epic.plan.start.schema.json +0 -12
  351. package/.agents/schemas/lifecycle/epic.snapshot.end.schema.json +0 -16
  352. package/.agents/schemas/lifecycle/epic.snapshot.start.schema.json +0 -12
  353. package/.agents/schemas/lifecycle/epic.watch.end.schema.json +0 -29
  354. package/.agents/schemas/lifecycle/epic.watch.start.schema.json +0 -16
  355. package/.agents/schemas/lifecycle/slice.end.schema.json +0 -21
  356. package/.agents/schemas/lifecycle/slice.heartbeat.schema.json +0 -20
  357. package/.agents/schemas/lifecycle/slice.start.schema.json +0 -17
  358. package/.agents/schemas/lifecycle/story.heartbeat.schema.json +0 -20
  359. package/.agents/schemas/risk-verdict.schema.json +0 -66
  360. package/.agents/schemas/story-perf-summary.schema.json +0 -73
  361. package/.agents/scripts/acceptance-spec-reconciler.js +0 -642
  362. package/.agents/scripts/analyze-execution.js +0 -444
  363. package/.agents/scripts/bookkeeping-reconcile.js +0 -117
  364. package/.agents/scripts/check-prepush-recovery.js +0 -90
  365. package/.agents/scripts/dispatcher.js +0 -295
  366. package/.agents/scripts/epic-audit-prepare.js +0 -497
  367. package/.agents/scripts/epic-audit-recheck.js +0 -274
  368. package/.agents/scripts/epic-deliver-note-intervention.js +0 -192
  369. package/.agents/scripts/epic-deliver-preflight.js +0 -462
  370. package/.agents/scripts/epic-deliver-prepare.js +0 -852
  371. package/.agents/scripts/epic-execute-record-wave.js +0 -449
  372. package/.agents/scripts/epic-plan-clarity.js +0 -211
  373. package/.agents/scripts/epic-plan-healthcheck.js +0 -581
  374. package/.agents/scripts/epic-reconcile.js +0 -625
  375. package/.agents/scripts/lib/baseline-snapshot.js +0 -979
  376. package/.agents/scripts/lib/checks/epic-merge-lock-stale.js +0 -54
  377. package/.agents/scripts/lib/checks/stale-origin-epic.js +0 -49
  378. package/.agents/scripts/lib/config/lifecycle.js +0 -40
  379. package/.agents/scripts/lib/config/preflight.js +0 -58
  380. package/.agents/scripts/lib/config/retro.js +0 -77
  381. package/.agents/scripts/lib/epic-merge-lock.js +0 -322
  382. package/.agents/scripts/lib/epic-plan-clarity.js +0 -181
  383. package/.agents/scripts/lib/epic-plan-ideation.js +0 -261
  384. package/.agents/scripts/lib/git-merge-orchestrator.js +0 -261
  385. package/.agents/scripts/lib/observability/baseline-refresh-rate.js +0 -221
  386. package/.agents/scripts/lib/observability/hook-heartbeat.js +0 -219
  387. package/.agents/scripts/lib/observability/perf-aggregator.js +0 -813
  388. package/.agents/scripts/lib/observability/perf-report-readers.js +0 -328
  389. package/.agents/scripts/lib/observability/perf-report-render.js +0 -182
  390. package/.agents/scripts/lib/orchestration/bookkeeping-outbox.js +0 -270
  391. package/.agents/scripts/lib/orchestration/context-hydration-engine.js +0 -539
  392. package/.agents/scripts/lib/orchestration/deliver-route.js +0 -173
  393. package/.agents/scripts/lib/orchestration/dispatch-engine.js +0 -134
  394. package/.agents/scripts/lib/orchestration/dispatch-pipeline.js +0 -183
  395. package/.agents/scripts/lib/orchestration/epic-cleanup.js +0 -801
  396. package/.agents/scripts/lib/orchestration/epic-deliver-lease-guard.js +0 -310
  397. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/context.js +0 -163
  398. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/creation.js +0 -140
  399. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/dag.js +0 -64
  400. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/diagnostics.js +0 -72
  401. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/persist-helpers.js +0 -156
  402. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/persist.js +0 -345
  403. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/planning-artifacts.js +0 -41
  404. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/reconcile-spawn.js +0 -86
  405. package/.agents/scripts/lib/orchestration/epic-plan-lease-guard.js +0 -391
  406. package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/drain.js +0 -94
  407. package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/plan-epic.js +0 -236
  408. package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/risk-verdict.js +0 -105
  409. package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/run-spec-phase.js +0 -307
  410. package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/spec-freshness.js +0 -117
  411. package/.agents/scripts/lib/orchestration/epic-plan-state-store.js +0 -117
  412. package/.agents/scripts/lib/orchestration/epic-run-state-store.js +0 -621
  413. package/.agents/scripts/lib/orchestration/epic-runner/concurrency-gate.js +0 -186
  414. package/.agents/scripts/lib/orchestration/epic-runner/deliver-phases.js +0 -50
  415. package/.agents/scripts/lib/orchestration/epic-runner/phases/build-wave-dag.js +0 -129
  416. package/.agents/scripts/lib/orchestration/epic-runner/phases/snapshot.js +0 -103
  417. package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter/composition.js +0 -267
  418. package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter/signals.js +0 -210
  419. package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter/transport.js +0 -238
  420. package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/_bullet-format.js +0 -32
  421. package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/component-drift.js +0 -203
  422. package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/crap-drift.js +0 -227
  423. package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/maintainability-drift.js +0 -117
  424. package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/stalled-worktree.js +0 -37
  425. package/.agents/scripts/lib/orchestration/epic-runner/story-launcher.js +0 -127
  426. package/.agents/scripts/lib/orchestration/epic-runner/story-run-progress-writer.js +0 -400
  427. package/.agents/scripts/lib/orchestration/epic-runner/sub-agent-return.js +0 -276
  428. package/.agents/scripts/lib/orchestration/epic-runner/wave-scheduler.js +0 -66
  429. package/.agents/scripts/lib/orchestration/epic-spec-reconciler-apply.js +0 -789
  430. package/.agents/scripts/lib/orchestration/epic-spec-reconciler-diff.js +0 -676
  431. package/.agents/scripts/lib/orchestration/epic-spec-reconciler-discriminator.js +0 -389
  432. package/.agents/scripts/lib/orchestration/epic-spec-reconciler-format.js +0 -230
  433. package/.agents/scripts/lib/orchestration/epic-spec-reconciler-ops.js +0 -361
  434. package/.agents/scripts/lib/orchestration/error-journal.js +0 -139
  435. package/.agents/scripts/lib/orchestration/finalize/open-or-locate-pr.js +0 -306
  436. package/.agents/scripts/lib/orchestration/finalize/post-handoff-comment.js +0 -489
  437. package/.agents/scripts/lib/orchestration/finalize/sanitize-skip-ci.js +0 -88
  438. package/.agents/scripts/lib/orchestration/lifecycle/emit-slice-lifecycle.js +0 -270
  439. package/.agents/scripts/lib/orchestration/lifecycle/emit-story-dispatch-end.js +0 -147
  440. package/.agents/scripts/lib/orchestration/lifecycle/emit-story-heartbeat.js +0 -155
  441. package/.agents/scripts/lib/orchestration/lifecycle/ledger-diff.js +0 -140
  442. package/.agents/scripts/lib/orchestration/lifecycle/listeners/acceptance-reconciler.js +0 -465
  443. package/.agents/scripts/lib/orchestration/lifecycle/listeners/automerge-armer.js +0 -501
  444. package/.agents/scripts/lib/orchestration/lifecycle/listeners/automerge-predicate.js +0 -984
  445. package/.agents/scripts/lib/orchestration/lifecycle/listeners/branch-cleaner.js +0 -264
  446. package/.agents/scripts/lib/orchestration/lifecycle/listeners/checkpoint-pointer-writer.js +0 -284
  447. package/.agents/scripts/lib/orchestration/lifecycle/listeners/cleaner.js +0 -355
  448. package/.agents/scripts/lib/orchestration/lifecycle/listeners/finalizer.js +0 -673
  449. package/.agents/scripts/lib/orchestration/lifecycle/listeners/index.js +0 -378
  450. package/.agents/scripts/lib/orchestration/lifecycle/listeners/intervention-recorder.js +0 -140
  451. package/.agents/scripts/lib/orchestration/lifecycle/listeners/label-transitioner.js +0 -144
  452. package/.agents/scripts/lib/orchestration/lifecycle/listeners/merge-watcher.js +0 -665
  453. package/.agents/scripts/lib/orchestration/lifecycle/listeners/notify-dispatcher.js +0 -174
  454. package/.agents/scripts/lib/orchestration/manifest-builder.js +0 -222
  455. package/.agents/scripts/lib/orchestration/plan-persist/amend.js +0 -359
  456. package/.agents/scripts/lib/orchestration/plan-persist/delivery-mode.js +0 -127
  457. package/.agents/scripts/lib/orchestration/plan-review-routing.js +0 -63
  458. package/.agents/scripts/lib/orchestration/planning-context-budget.js +0 -213
  459. package/.agents/scripts/lib/orchestration/planning-risk.js +0 -194
  460. package/.agents/scripts/lib/orchestration/post-merge/phases/branch-cleanup.js +0 -56
  461. package/.agents/scripts/lib/orchestration/post-merge/phases/dashboard-refresh.js +0 -33
  462. package/.agents/scripts/lib/orchestration/post-merge/phases/notification.js +0 -78
  463. package/.agents/scripts/lib/orchestration/post-merge/phases/temp-cleanup.js +0 -68
  464. package/.agents/scripts/lib/orchestration/post-merge/phases/ticket-closure.js +0 -118
  465. package/.agents/scripts/lib/orchestration/post-merge/phases/worktree-reap.js +0 -396
  466. package/.agents/scripts/lib/orchestration/post-merge-pipeline.js +0 -205
  467. package/.agents/scripts/lib/orchestration/preflight-cache.js +0 -187
  468. package/.agents/scripts/lib/orchestration/recurring-failure-detector.js +0 -152
  469. package/.agents/scripts/lib/orchestration/retro/phases/checks.js +0 -94
  470. package/.agents/scripts/lib/orchestration/retro/phases/compose-body.js +0 -571
  471. package/.agents/scripts/lib/orchestration/retro/phases/gather-signals.js +0 -450
  472. package/.agents/scripts/lib/orchestration/retro/phases/post-and-mirror.js +0 -191
  473. package/.agents/scripts/lib/orchestration/retro-heuristics.js +0 -57
  474. package/.agents/scripts/lib/orchestration/retro-perf-heuristics.js +0 -275
  475. package/.agents/scripts/lib/orchestration/retro-runner.js +0 -197
  476. package/.agents/scripts/lib/orchestration/spec-renderer.js +0 -447
  477. package/.agents/scripts/lib/orchestration/story-close/auto-refresh-runner.js +0 -747
  478. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/gate-failure.js +0 -211
  479. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/pre-merge-attribution.js +0 -158
  480. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/refresh-commit.js +0 -446
  481. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/regression-projection.js +0 -297
  482. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/scope-discovery.js +0 -48
  483. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution-wiring.js +0 -67
  484. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution.js +0 -161
  485. package/.agents/scripts/lib/orchestration/story-close/baseline-friction-body.js +0 -117
  486. package/.agents/scripts/lib/orchestration/story-close/cd-out-guard.js +0 -86
  487. package/.agents/scripts/lib/orchestration/story-close/cleanup-reconciler.js +0 -147
  488. package/.agents/scripts/lib/orchestration/story-close/close-inputs.js +0 -142
  489. package/.agents/scripts/lib/orchestration/story-close/comment-bodies.js +0 -62
  490. package/.agents/scripts/lib/orchestration/story-close/merge-runner.js +0 -658
  491. package/.agents/scripts/lib/orchestration/story-close/merge-subject.js +0 -198
  492. package/.agents/scripts/lib/orchestration/story-close/phases/branch-restore.js +0 -105
  493. package/.agents/scripts/lib/orchestration/story-close/phases/close.js +0 -222
  494. package/.agents/scripts/lib/orchestration/story-close/phases/gates.js +0 -292
  495. package/.agents/scripts/lib/orchestration/story-close/phases/locked-pipeline.js +0 -270
  496. package/.agents/scripts/lib/orchestration/story-close/phases/preflight.js +0 -110
  497. package/.agents/scripts/lib/orchestration/story-close/phases/refresh.js +0 -86
  498. package/.agents/scripts/lib/orchestration/story-close/phases/timeout-blocked-emitter.js +0 -112
  499. package/.agents/scripts/lib/orchestration/story-close/phases/timeout-blocked.js +0 -157
  500. package/.agents/scripts/lib/orchestration/story-close/post-merge-close.js +0 -421
  501. package/.agents/scripts/lib/orchestration/story-close/pre-merge-validation.js +0 -302
  502. package/.agents/scripts/lib/orchestration/story-close/shared-checkout-guard.js +0 -163
  503. package/.agents/scripts/lib/orchestration/story-close-recovery.js +0 -690
  504. package/.agents/scripts/lib/orchestration/wave-marker.js +0 -28
  505. package/.agents/scripts/lib/orchestration/wave-record-io.js +0 -218
  506. package/.agents/scripts/lib/orchestration/wave-record-notifications.js +0 -145
  507. package/.agents/scripts/lib/orchestration/wave-record-projection.js +0 -212
  508. package/.agents/scripts/lib/presentation/dispatch-manifest-render.js +0 -111
  509. package/.agents/scripts/lib/presentation/manifest-builder.js +0 -239
  510. package/.agents/scripts/lib/presentation/manifest-formatter.js +0 -242
  511. package/.agents/scripts/lib/presentation/manifest-helpers.js +0 -213
  512. package/.agents/scripts/lib/presentation/manifest-persistence.js +0 -261
  513. package/.agents/scripts/lib/presentation/manifest-procedures.js +0 -55
  514. package/.agents/scripts/lib/presentation/manifest-render-waves.js +0 -306
  515. package/.agents/scripts/lib/presentation/manifest-renderer.js +0 -188
  516. package/.agents/scripts/lib/presentation/manifest-story-views.js +0 -110
  517. package/.agents/scripts/lib/push-epic-retry.js +0 -209
  518. package/.agents/scripts/lib/spec/index.js +0 -36
  519. package/.agents/scripts/lib/spec/loader.js +0 -425
  520. package/.agents/scripts/lib/spec/state.js +0 -208
  521. package/.agents/scripts/lib/story-init/blocker-validator.js +0 -68
  522. package/.agents/scripts/lib/story-init/branch-initializer.js +0 -408
  523. package/.agents/scripts/lib/story-init/context-resolver.js +0 -92
  524. package/.agents/scripts/lib/story-init/donor-precheck.js +0 -207
  525. package/.agents/scripts/lib/story-init/state-transitioner.js +0 -80
  526. package/.agents/scripts/lib/story-init/task-graph-builder.js +0 -124
  527. package/.agents/scripts/lib/story-init/transition-summary.js +0 -34
  528. package/.agents/scripts/lib/test-reserved-epic-temp-ids.js +0 -35
  529. package/.agents/scripts/lib/wave-runner/tick.js +0 -754
  530. package/.agents/scripts/lib/wave-runner/wave-runner-error.js +0 -20
  531. package/.agents/scripts/lifecycle-emit-story-dispatch.js +0 -194
  532. package/.agents/scripts/lifecycle-emit.js +0 -510
  533. package/.agents/scripts/retro-run.js +0 -218
  534. package/.agents/scripts/slice-phase.js +0 -361
  535. package/.agents/scripts/standalone-feedback-rollup.js +0 -188
  536. package/.agents/scripts/story-close.js +0 -294
  537. package/.agents/scripts/story-init.js +0 -599
  538. package/.agents/scripts/story-phase.js +0 -369
  539. package/.agents/scripts/wave-tick.js +0 -464
  540. package/.agents/skills/core/analyze-execution/SKILL.md +0 -98
  541. package/.agents/skills/core/epic-plan-consolidate/SKILL.md +0 -172
  542. package/.agents/skills/core/epic-plan-consolidate/examples.md +0 -51
  543. package/.agents/skills/core/epic-plan-decompose-author/SKILL.md +0 -441
  544. package/.agents/skills/core/epic-plan-decompose-author/examples.md +0 -47
  545. package/.agents/skills/core/epic-plan-premortem/SKILL.md +0 -146
  546. package/.agents/skills/core/epic-plan-premortem/examples.md +0 -53
  547. package/.agents/skills/core/epic-plan-spec-author/SKILL.md +0 -383
  548. package/.agents/skills/core/epic-plan-spec-author/examples.md +0 -91
  549. package/.agents/workflows/helpers/deliver-epic-reference.md +0 -547
  550. package/.agents/workflows/helpers/deliver-epic-single.md +0 -331
  551. package/.agents/workflows/helpers/deliver-epic.md +0 -998
  552. package/.agents/workflows/helpers/deliver-stories.md +0 -450
  553. package/.agents/workflows/helpers/epic-audit.md +0 -189
  554. package/.agents/workflows/helpers/epic-deliver-story.md +0 -436
  555. package/.agents/workflows/helpers/epic-testing.md +0 -125
  556. package/.agents/workflows/helpers/plan-epic-reference.md +0 -160
  557. package/.agents/workflows/helpers/plan-epic.md +0 -353
  558. package/.agents/workflows/helpers/plan-story.md +0 -251
  559. package/.agents/workflows/helpers/scope-triage-gate.md +0 -108
  560. package/.agents/workflows/helpers/single-story-deliver.md +0 -557
@@ -11,7 +11,7 @@
11
11
  * emits the set of Stories safe to dispatch **on this beat** — a Story
12
12
  * becomes dispatchable the instant its own dependencies are done, under the
13
13
  * same global concurrency cap and the same file-overlap co-dispatch guard
14
- * the Epic path uses. There is no wave barrier: this no longer batches
14
+ * `lib/wave-runner/ready-set.js` applies everywhere. There is no wave barrier: this no longer batches
15
15
  * Stories into fully-draining waves; it selects continuously.
16
16
  *
17
17
  * The previous static wave-batch plan (group N must fully drain before
@@ -37,7 +37,8 @@
37
37
  * totalStories: number,
38
38
  * concurrencyCap: number,
39
39
  * inFlight: number,
40
- * cycleError: string | null
40
+ * cycleError: string | null,
41
+ * wedged: { reason, stories: [{ id, unmetBlockers }] } | null
41
42
  * }
42
43
  *
43
44
  * The standalone loop calls this once per beat: after each Story closes it
@@ -50,11 +51,17 @@
50
51
  * `/deliver` uses — `resolveConfig` + `getRunners` reading
51
52
  * `delivery.deliverRunner.concurrencyCap` (default 3) — so a
52
53
  * `.agentrc.local.json` override is honored. A `--concurrency <n>` CLI flag
53
- * overrides the config-resolved value for that run only. This puts both the
54
- * standalone (`/deliver`) and Epic (`/deliver`) delivery paths on one
55
- * deterministic config source **and** one scheduling kernel.
54
+ * overrides the config-resolved value for that run only. This shares one
55
+ * deterministic config source (`delivery.deliverRunner.concurrencyCap`) and
56
+ * one scheduling kernel with every `/deliver` multi-Story invocation.
56
57
  *
57
- * On cycle detection, exits with code 2 and sets cycleError in the envelope.
58
+ * Exit codes: 0 ok · 1 input error · 2 dependency cycle (`cycleError`) ·
59
+ * 3 wedged (`wedged`) — ready is empty, nothing is in flight, and undone
60
+ * Stories are waiting on blockers that are not done. A cycle is a
61
+ * self-referential DAG the operator must fix; a wedge is a well-formed DAG
62
+ * whose gates cannot be satisfied from the supplied `--done` set (usually a
63
+ * blocker outside the delivered set that has not landed). Both are distinct
64
+ * from the ordinary `ready: []` that means "waiting on in-flight work".
58
65
  */
59
66
 
60
67
  import { readFileSync } from 'node:fs';
@@ -68,13 +75,20 @@ import { AGENT_LABELS } from './lib/label-constants.js';
68
75
  import { buildStoryAdjacency } from './lib/story-adjacency.js';
69
76
  import { selectReadySet } from './lib/wave-runner/ready-set.js';
70
77
 
78
+ /**
79
+ * Exit code for a wedged run — deliberately distinct from the cycle exit (2)
80
+ * so a caller can tell "your DAG is self-referential" from "your DAG is fine
81
+ * but its gates can never be satisfied from this `--done` set".
82
+ */
83
+ export const WEDGED_EXIT_CODE = 3;
84
+
71
85
  const HELP = `Usage: node .agents/scripts/stories-wave-tick.js --dag '<json>' | --dag-file <path> [--concurrency <n>] [--done <csv>] [--in-flight <n>]
72
86
 
73
87
  Continuous ready-set planner for standalone Story delivery. Consumes a
74
88
  dependency graph of Story IDs plus the live run progress and emits the set
75
89
  of Stories safe to dispatch on this beat — a Story is dispatchable the
76
90
  instant its own dependencies are done — plus the resolved per-beat
77
- concurrency cap and the same file-overlap guard the Epic path uses.
91
+ concurrency cap and the same file-overlap guard as selectReadySet.
78
92
 
79
93
  Input DAG format (JSON array):
80
94
  [{ "id": 101, "dependsOn": [] }, { "id": 102, "dependsOn": [101] }]
@@ -102,13 +116,17 @@ Output envelope:
102
116
  "totalStories": 2,
103
117
  "concurrencyCap": 3,
104
118
  "inFlight": 0,
105
- "cycleError": null
119
+ "cycleError": null,
120
+ "wedged": null
106
121
  }
107
122
 
108
123
  Exit codes:
109
124
  0 - Success, ready set emitted
110
125
  1 - Invalid input (missing/malformed DAG, invalid --concurrency/--in-flight/--done)
111
126
  2 - Cycle detected in dependency graph
127
+ 3 - Wedged: ready is empty, nothing is in flight, and undone Stories are
128
+ waiting on blockers that are not done. Distinct from an ordinary empty
129
+ ready set (which means "waiting on in-flight work") and from a cycle.
112
130
  `;
113
131
 
114
132
  /**
@@ -257,7 +275,7 @@ export function parseConcurrencyOverride(raw) {
257
275
  /**
258
276
  * Resolve the per-beat concurrency cap.
259
277
  *
260
- * Mirrors the `/deliver` seam (`epic-deliver-prepare.js`): resolve the
278
+ * Mirrors the `/deliver` multi-Story seam (`helpers/deliver-story.md`): resolve the
261
279
  * project config (which deep-merges `.agentrc.local.json` over `.agentrc.json`)
262
280
  * then read `delivery.deliverRunner.concurrencyCap` via `getRunners` (default
263
281
  * 3). An explicit `override` (the `--concurrency <n>` CLI flag) wins over
@@ -322,6 +340,7 @@ export function buildReadySetEnvelope(
322
340
  concurrencyCap,
323
341
  inFlight,
324
342
  cycleError: null,
343
+ wedged: null,
325
344
  };
326
345
 
327
346
  if (totalStories === 0) {
@@ -365,7 +384,62 @@ export function buildReadySetEnvelope(
365
384
  globalCap: concurrencyCap,
366
385
  }).map((rec) => rec.id);
367
386
 
368
- return { envelope: { ...base, ready }, exitCode: 0 };
387
+ // Wedge detection (Story #4540). `ready: []` is normal while work is in
388
+ // flight — the loop is simply waiting. But ready-empty AND nothing in
389
+ // flight AND undone Stories remaining means no beat can ever make
390
+ // progress: the run is stuck, and the previous behaviour was to return
391
+ // exit 0 with an empty ready set forever, indistinguishable from
392
+ // "waiting". Name the stuck ids and their unmet blockers.
393
+ //
394
+ // Distinct from `cycleError`/exit 2: a cycle is a self-referential DAG,
395
+ // whereas this is a DAG whose gates are real but unsatisfiable from the
396
+ // supplied `done` set (typically a blocker outside the delivered set that
397
+ // has not landed).
398
+ const wedge = detectWedge({ nodes, doneIds, ready, inFlight });
399
+ if (wedge) {
400
+ return {
401
+ envelope: { ...base, ready, wedged: wedge },
402
+ exitCode: WEDGED_EXIT_CODE,
403
+ };
404
+ }
405
+
406
+ return { envelope: { ...base, ready, wedged: null }, exitCode: 0 };
407
+ }
408
+
409
+ /**
410
+ * Identify a run that cannot progress: nothing dispatchable, nothing in
411
+ * flight, work remaining.
412
+ *
413
+ * @param {{ nodes: object[], doneIds: Set<number>, ready: number[], inFlight: number }} args
414
+ * @returns {{ reason: string, stories: Array<{ id: number, unmetBlockers: number[] }> }|null}
415
+ */
416
+ export function detectWedge({ nodes, doneIds, ready, inFlight }) {
417
+ if (ready.length > 0 || inFlight > 0) return null;
418
+ const undone = nodes.filter((n) => !doneIds.has(n.id));
419
+ if (undone.length === 0) return null;
420
+
421
+ const stories = undone
422
+ .map((n) => ({
423
+ id: n.id,
424
+ unmetBlockers: (n.dependsOn ?? []).filter((dep) => !doneIds.has(dep)),
425
+ }))
426
+ .filter((s) => s.unmetBlockers.length > 0);
427
+
428
+ // Undone work with no unmet blockers would have been dispatched; if that
429
+ // is the whole set, the cap or in-flight accounting explains the empty
430
+ // ready set rather than a wedge.
431
+ if (stories.length === 0) return null;
432
+
433
+ const detail = stories
434
+ .map((s) => `#${s.id} ← ${s.unmetBlockers.map((d) => `#${d}`).join(', ')}`)
435
+ .join('; ');
436
+ return {
437
+ reason:
438
+ `No Story can be dispatched: nothing is in flight and ${stories.length} ` +
439
+ `Story(ies) are waiting on blockers that are not done — ${detail}. ` +
440
+ `A blocker outside the delivered set must land first, or be included in --ids.`,
441
+ stories,
442
+ };
369
443
  }
370
444
 
371
445
  /**
@@ -405,6 +479,7 @@ export function runStoriesWaveTick({
405
479
  concurrencyCap,
406
480
  inFlight: inFlightValue,
407
481
  cycleError: null,
482
+ wedged: null,
408
483
  inputError: message,
409
484
  },
410
485
  exitCode: 1,
@@ -2,33 +2,17 @@
2
2
  /* node:coverage ignore file */
3
3
 
4
4
  /**
5
- * story-plan.js — Local `/plan` wrapper.
5
+ * story-plan.js — QA helper for promote round-trips and `--emit-context`
6
+ * envelope emission.
6
7
  *
7
- * Standalone counterpart to `/plan` for Stories that do **not**
8
- * attach to an Epic. The script is deliberately a thin CLI around the
9
- * pure helpers in `lib/story-plan.js`:
8
+ * Canonical operator planning is `plan-context.js` + `plan-persist.js` (see
9
+ * `.agents/workflows/plan.md`). Use this CLI only for QA promote
10
+ * round-trips (`--body` / `--dry-run`) or test harnesses that need the
11
+ * standalone envelope shape.
10
12
  *
11
- * 1. `--emit-context` mode — given a `--idea`/`--from-notes` seed,
12
- * build the context envelope (seed, refine heuristic, persona,
13
- * body template, duplicate candidates, tech-stack summary, and a
14
- * corpus-aware `corpusContext` — the docs digest plus relevant
15
- * existing-Epic Tech Spec excerpts, Story #4432) and print it as
16
- * JSON on stdout. Logs route to stderr so the envelope is
17
- * byte-clean for `JSON.parse`.
18
- * 2. Persist mode — given a `--body <file>` authored by the host
19
- * LLM after operator confirmation, validate the shape and persist
20
- * via `provider.createIssue` (which also adds the new Story to
21
- * the configured Projects V2 board — Story #3822) with
22
- * `type::story` + the chosen persona label, falling back to
23
- * `gh issue create` when the provider lacks a createIssue
24
- * analogue. Prints `Next: /single-story-deliver <id>`.
25
- * 3. `--dry-run` — same as persist but exits without touching
26
- * GitHub. Echoes the rendered body and the `gh` argv it would
27
- * have run.
28
- *
29
- * Mirrors the `/plan` pattern: deterministic Node I/O wrappers
30
- * with HITL gating handled by the host LLM in chat. No external LLM
31
- * APIs are called from this script.
13
+ * Operator planning:
14
+ * node .agents/scripts/plan-context.js --seed "…" | --seed-file <path> | --tickets <ids>
15
+ * node .agents/scripts/plan-persist.js --stories
32
16
  */
33
17
 
34
18
  import { readFile } from 'node:fs/promises';
@@ -53,10 +37,10 @@ import {
53
37
 
54
38
  const HELP = `\
55
39
  Usage:
56
- story-plan.js --emit-context (--idea "<seed>" | --from-notes <file>) \\
57
- [--persona <name>] [--refine | --no-refine] [--pretty]
40
+ story-plan.js --emit-context (--seed "<seed>" | --seed-file <file>) \\
41
+ [--refine | --no-refine] [--pretty]
58
42
 
59
- story-plan.js --body <file> [--persona <name>] [--dry-run]
43
+ story-plan.js --body <file> [--dry-run]
60
44
 
61
45
  story-plan.js --help
62
46
 
@@ -66,12 +50,11 @@ Modes:
66
50
  draft body using the envelope and the body template.
67
51
  --body <file> Persist a pre-authored body. Validates shape (required
68
52
  sections, no Epic: ref, AC checklist non-empty) and
69
- calls \`gh issue create\` with type::story + persona.
53
+ calls \`gh issue create\` with type::story.
70
54
  --dry-run With --body: print the body and the gh argv that would
71
55
  be invoked, then exit 0. No GitHub mutations.
72
56
 
73
57
  Options:
74
- --persona <name> Persona label (default: engineer).
75
58
  --refine Force the idea-refinement hint on regardless of seed
76
59
  length. Default heuristic: refine when seed < 200
77
60
  chars.
@@ -80,17 +63,17 @@ Options:
80
63
  `;
81
64
 
82
65
  /**
83
- * Resolve the seed string from --idea or --from-notes. One of the two
66
+ * Resolve the seed string from --seed or --seed-file. One of the two
84
67
  * must be present in --emit-context mode.
85
68
  */
86
- async function resolveSeed({ idea, fromNotes }) {
87
- if (idea && fromNotes) {
88
- throw new Error('Pass either --idea or --from-notes, not both.');
69
+ async function resolveSeed({ seed, seedFile }) {
70
+ if (seed && seedFile) {
71
+ throw new Error('Pass either --seed or --seed-file, not both.');
89
72
  }
90
- if (idea) return idea;
91
- if (fromNotes) return (await readFile(fromNotes, 'utf8')).trim();
73
+ if (seed) return seed;
74
+ if (seedFile) return (await readFile(seedFile, 'utf8')).trim();
92
75
  throw new Error(
93
- '--emit-context requires --idea "<seed>" or --from-notes <file>.',
76
+ '--emit-context requires --seed "<seed>" or --seed-file <file>.',
94
77
  );
95
78
  }
96
79
 
@@ -147,12 +130,11 @@ async function runEmitContext({
147
130
  write = (s) => process.stdout.write(s),
148
131
  }) {
149
132
  const seed = await resolveSeed({
150
- idea: values.idea,
151
- fromNotes: values['from-notes'],
133
+ seed: values.seed,
134
+ seedFile: values['seed-file'],
152
135
  });
153
136
  const override = values.refine ? 'on' : values['no-refine'] ? 'off' : null;
154
137
  const refine = shouldRefine({ seed, override });
155
- const persona = values.persona ?? 'engineer';
156
138
 
157
139
  // Corpus lookup uses the raw (un-defaulted) docsContextFiles list, same
158
140
  // as the `/deliver` per-Epic digest builder: `config.project` fills in
@@ -164,7 +146,7 @@ async function runEmitContext({
164
146
  // corpus digest reads the project's actual docs directory regardless
165
147
  // of the directory this CLI happens to be invoked from — matching the
166
148
  // sibling resolution pattern in
167
- // epic-plan-spec/phases/authoring-context.js.
149
+ // planning/authoring-context.js.
168
150
  const docsRoot = path.resolve(
169
151
  PROJECT_ROOT,
170
152
  config?.project?.paths?.docsRoot ?? 'docs',
@@ -175,7 +157,7 @@ async function runEmitContext({
175
157
  loadBodyTemplate(projectRoot),
176
158
  fetchOpenStories(provider),
177
159
  readTechStackSummary(projectRoot),
178
- buildCorpusContext({ seed, provider, docsContextFiles, docsRoot }),
160
+ buildCorpusContext({ docsContextFiles, docsRoot }),
179
161
  ]);
180
162
 
181
163
  const duplicateCandidates = rankDuplicateCandidates({
@@ -186,7 +168,6 @@ async function runEmitContext({
186
168
  const envelope = buildContextEnvelope({
187
169
  seed,
188
170
  refine,
189
- persona,
190
171
  bodyTemplate,
191
172
  duplicateCandidates,
192
173
  techStack,
@@ -221,8 +202,7 @@ async function runPersist({
221
202
  }
222
203
 
223
204
  const title = extractTitle(body);
224
- const persona = values.persona ?? 'engineer';
225
- const labels = [TYPE_LABELS.STORY, `persona::${persona}`];
205
+ const labels = [TYPE_LABELS.STORY];
226
206
  const argv = renderGhArgv({ title, bodyPath, labels });
227
207
 
228
208
  if (dryRun) {
@@ -264,7 +244,7 @@ async function runPersist({
264
244
  }
265
245
 
266
246
  write(`${JSON.stringify({ issueNumber, title, labels }, null, 2)}\n`);
267
- Logger.info(`Next: /single-story-deliver ${issueNumber}`);
247
+ Logger.info(`Next: /deliver ${issueNumber}`);
268
248
  }
269
249
 
270
250
  /* node:coverage ignore next */
@@ -272,10 +252,9 @@ async function main() {
272
252
  const { values } = parseArgs({
273
253
  options: {
274
254
  'emit-context': { type: 'boolean', default: false },
275
- idea: { type: 'string' },
276
- 'from-notes': { type: 'string' },
255
+ seed: { type: 'string' },
256
+ 'seed-file': { type: 'string' },
277
257
  body: { type: 'string' },
278
- persona: { type: 'string' },
279
258
  refine: { type: 'boolean', default: false },
280
259
  'no-refine': { type: 'boolean', default: false },
281
260
  pretty: { type: 'boolean', default: false },
@@ -1,27 +1,14 @@
1
1
  /**
2
- * .agents/scripts/update-ticket-state.js — CLI Re-export Shim
3
- *
4
- * Thin backward-compatibility shim. The core logic has been moved to
5
- * `lib/orchestration/ticketing.js` as part of the SDK refactor.
6
- *
7
- * This file preserves backward compatibility for CLI usage and existing
8
- * testing patterns.
9
- *
10
- * Successor to the retired mandrel MCP tools. See ADR 20260424-702a in docs/decisions.md for the migration table.
2
+ * .agents/scripts/update-ticket-state.js — CLI entrypoint for ticket
3
+ * label transitions. Core logic lives in `lib/orchestration/ticketing.js`;
4
+ * this file is the operator-facing command surface (not a compatibility
5
+ * layer).
11
6
  */
12
7
 
13
8
  import { parseArgs } from 'node:util';
14
9
  import { resolveConfig } from './lib/config-resolver.js';
15
10
  import { Logger } from './lib/Logger.js';
16
- import {
17
- enqueueLabel,
18
- outboxPathFor,
19
- } from './lib/orchestration/bookkeeping-outbox.js';
20
- import {
21
- cascadeCompletion,
22
- STATE_LABELS,
23
- transitionTicketState,
24
- } from './lib/orchestration/ticketing.js';
11
+ import { transitionTicketState } from './lib/orchestration/ticketing.js';
25
12
  import { createProvider } from './lib/provider-factory.js';
26
13
 
27
14
  // ── CLI Main Block ────────────────────────────────────────────────────────
@@ -33,27 +20,21 @@ if (
33
20
  const { values } = parseArgs({
34
21
  args: process.argv.slice(2),
35
22
  options: {
36
- task: { type: 'string' },
37
23
  ticket: { type: 'string' },
38
24
  state: { type: 'string' },
39
25
  'remove-label': { type: 'string' },
40
- buffer: { type: 'boolean' },
41
- epic: { type: 'string' },
42
26
  },
43
27
  strict: false,
44
28
  });
45
29
 
46
- // `--ticket` is the v5.9.0 alias for `--task` (labels can apply to any
47
- // ticket type, not just Tasks). Both continue to work.
48
- const idSource = values.ticket ?? values.task;
49
- const ticketId = Number.parseInt(idSource, 10);
30
+ const ticketId = Number.parseInt(values.ticket, 10);
50
31
  const state = values.state;
51
32
  const removeLabel = values['remove-label'];
52
33
 
53
34
  if (Number.isNaN(ticketId) || (!state && !removeLabel)) {
54
35
  throw new Error(
55
36
  'Usage: node update-ticket-state.js ' +
56
- '(--ticket|--task) <id> ' +
37
+ '--ticket <id> ' +
57
38
  '[--state <state> | --remove-label <label>]',
58
39
  );
59
40
  }
@@ -75,50 +56,18 @@ if (
75
56
  return;
76
57
  }
77
58
 
78
- // Headless buffering (Epic #4476 M5): buffer an intermediate state flip to
79
- // the per-Epic outbox instead of a live GitHub round-trip; finalize's
80
- // bookkeeping-reconcile.js drains it once. `agent::blocked` (the HITL gate,
81
- // §1.J) and `agent::done` (its cascade must run live) ALWAYS surface
82
- // immediately and are never buffered. Requires --epic to locate the outbox.
83
- if (
84
- values.buffer &&
85
- state !== STATE_LABELS.BLOCKED &&
86
- state !== STATE_LABELS.DONE
87
- ) {
88
- const epicId = Number.parseInt(values.epic ?? '', 10);
89
- if (!Number.isInteger(epicId) || epicId <= 0) {
90
- throw new Error('--buffer requires --epic <id>');
91
- }
92
- enqueueLabel({
93
- outboxPath: outboxPathFor(epicId, config),
94
- ticketId,
95
- state,
96
- });
97
- Logger.info(
98
- `[State-Sync] Buffered #${ticketId} → ${state} (headless; drained at finalize)`,
99
- );
100
- return;
101
- }
102
-
103
59
  Logger.info(
104
60
  `[State-Sync] Transitioning ticket #${ticketId} to ${state}...`,
105
61
  );
62
+ // Story #4545 — no second cascade here. `transitionTicketState` already
63
+ // fires the upward cascade on every transition (bulk.js registers
64
+ // `cascadeParentState` as transition.js's cascade runner, and the DONE
65
+ // branch delegates to `cascadeCompletion`), so the explicit call this
66
+ // used to make re-walked the same parents and re-spent the same API
67
+ // calls a second time on every done transition — under a Story-only
68
+ // model where no orchestration parent exists to find.
106
69
  await transitionTicketState(provider, ticketId, state);
107
70
 
108
- if (state === STATE_LABELS.DONE) {
109
- Logger.info(`[State-Sync] Cascading completion from #${ticketId}...`);
110
- const cascade = await cascadeCompletion(provider, ticketId);
111
- // Hoisted out of the `for...of` initializer because typhonjs-escomplex
112
- // mis-parses optional chaining there (it would zero out this file's
113
- // maintainability score).
114
- const cascadeFailures = cascade?.failed ?? [];
115
- for (const { parentId, error } of cascadeFailures) {
116
- Logger.warn(
117
- `[State-Sync] ⚠️ Cascade partial-failure on parent #${parentId}: ${error}`,
118
- );
119
- }
120
- }
121
-
122
71
  // Optional secondary label removal alongside the state transition
123
72
  // (e.g. clear `status::blocked` when transitioning back to ready).
124
73
  if (removeLabel) {