mandrel 1.94.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (393) hide show
  1. package/.agents/README.md +59 -73
  2. package/.agents/agents/story-worker.md +12 -13
  3. package/.agents/docs/SDLC.md +489 -1285
  4. package/.agents/docs/agentrc-reference.json +177 -67
  5. package/.agents/docs/configuration.md +104 -138
  6. package/.agents/docs/execution-reference.md +17 -20
  7. package/.agents/docs/quality-gates.md +13 -19
  8. package/.agents/docs/workflows.md +3 -3
  9. package/.agents/instructions.md +70 -81
  10. package/.agents/rules/ci-remediation.md +8 -12
  11. package/.agents/rules/git-conventions-reference.md +6 -7
  12. package/.agents/rules/git-conventions.md +16 -22
  13. package/.agents/schemas/acceptance-eval-verdict.schema.json +1 -1
  14. package/.agents/schemas/agentrc.schema.json +54 -214
  15. package/.agents/schemas/lifecycle/ledger-record.schema.json +1 -1
  16. package/.agents/schemas/lifecycle/retro.end.schema.json +1 -1
  17. package/.agents/schemas/risk-verdict.schema.json +0 -13
  18. package/.agents/scripts/analyze-execution.js +1 -1
  19. package/.agents/scripts/audit-to-stories.js +7 -7
  20. package/.agents/scripts/boot-sweep.js +1 -1
  21. package/.agents/scripts/check-lifecycle-lint.js +6 -9
  22. package/.agents/scripts/check-prepush-recovery.js +1 -1
  23. package/.agents/scripts/cleanup-repo-test-temp.js +6 -1
  24. package/.agents/scripts/lib/Logger.js +6 -10
  25. package/.agents/scripts/lib/audit-suite/runner.js +2 -2
  26. package/.agents/scripts/lib/audit-suite/selector.js +5 -5
  27. package/.agents/scripts/lib/audit-to-stories/{seed-epic-from-findings.js → seed-from-findings.js} +9 -9
  28. package/.agents/scripts/lib/baselines/kernel.js +206 -18
  29. package/.agents/scripts/lib/baselines/kinds/maintainability.js +0 -4
  30. package/.agents/scripts/lib/baselines/reader.js +1 -6
  31. package/.agents/scripts/lib/bdd-runner-detect.js +5 -9
  32. package/.agents/scripts/lib/bootstrap/issue-forms-template.js +32 -33
  33. package/.agents/scripts/lib/checks/core-bare-clean.js +2 -2
  34. package/.agents/scripts/lib/checks/index.js +2 -1
  35. package/.agents/scripts/lib/checks/story-init-not-backgrounded.js +23 -21
  36. package/.agents/scripts/lib/cli/standard-args.js +13 -22
  37. package/.agents/scripts/lib/cli-args.js +16 -7
  38. package/.agents/scripts/lib/close-validation/gates.js +2 -2
  39. package/.agents/scripts/lib/config/ci.js +6 -31
  40. package/.agents/scripts/lib/config/delivery-routing.js +45 -29
  41. package/.agents/scripts/lib/config/explain.js +55 -36
  42. package/.agents/scripts/lib/config/limits.js +17 -58
  43. package/.agents/scripts/lib/config/paths.js +0 -2
  44. package/.agents/scripts/lib/config/quality.js +1 -1
  45. package/.agents/scripts/lib/config/runners.js +17 -50
  46. package/.agents/scripts/lib/config/temp-paths.js +19 -14
  47. package/.agents/scripts/lib/config/worktree-isolation.js +0 -5
  48. package/.agents/scripts/lib/config-resolver.js +2 -7
  49. package/.agents/scripts/lib/config-settings-schema-delivery.js +24 -148
  50. package/.agents/scripts/lib/config-settings-schema-quality.js +8 -14
  51. package/.agents/scripts/lib/config-settings-schema.js +52 -38
  52. package/.agents/scripts/lib/dependency-parser.js +3 -2
  53. package/.agents/scripts/lib/doc-tiers.js +2 -2
  54. package/.agents/scripts/lib/duplicate-search.js +211 -41
  55. package/.agents/scripts/lib/feedback-loop/retro-proposals-graduator.js +1 -1
  56. package/.agents/scripts/lib/findings/promote-finding.js +5 -5
  57. package/.agents/scripts/lib/framework-version.js +2 -3
  58. package/.agents/scripts/lib/git-branch-cleanup.js +1 -10
  59. package/.agents/scripts/lib/git-branch-lifecycle.js +17 -22
  60. package/.agents/scripts/lib/git-utils.js +32 -6
  61. package/.agents/scripts/lib/github/framework-repo.js +6 -0
  62. package/.agents/scripts/lib/label-constants.js +10 -23
  63. package/.agents/scripts/lib/label-taxonomy.js +9 -43
  64. package/.agents/scripts/lib/observability/active-story-env.js +1 -1
  65. package/.agents/scripts/lib/observability/hook-heartbeat.js +20 -52
  66. package/.agents/scripts/lib/observability/source-classifier.js +3 -3
  67. package/.agents/scripts/lib/onboard/init-tail.js +1 -3
  68. package/.agents/scripts/lib/orchestration/audit-lens-routing.js +128 -0
  69. package/.agents/scripts/lib/orchestration/bookkeeping-outbox.js +8 -5
  70. package/.agents/scripts/lib/orchestration/ceremony-routing.js +83 -20
  71. package/.agents/scripts/lib/orchestration/code-review.js +20 -268
  72. package/.agents/scripts/lib/orchestration/column-sync.js +1 -1
  73. package/.agents/scripts/lib/orchestration/consolidation-precondition.js +1 -1
  74. package/.agents/scripts/lib/orchestration/context-envelope.js +2 -5
  75. package/.agents/scripts/lib/orchestration/docs-digest.js +8 -8
  76. package/.agents/scripts/lib/orchestration/file-assumptions.js +7 -13
  77. package/.agents/scripts/lib/orchestration/git-cleanup/phases/cli.js +1 -1
  78. package/.agents/scripts/lib/orchestration/lifecycle/emit-loop-tick.js +8 -8
  79. package/.agents/scripts/lib/orchestration/lifecycle/emit-story-heartbeat.js +2 -2
  80. package/.agents/scripts/lib/orchestration/lifecycle/ledger-writer.js +6 -3
  81. package/.agents/scripts/lib/orchestration/lifecycle/listeners/README.md +17 -43
  82. package/.agents/scripts/lib/orchestration/lint-baseline-service.js +4 -4
  83. package/.agents/scripts/lib/orchestration/merge-block-class.js +1 -1
  84. package/.agents/scripts/lib/orchestration/phase-runner.js +3 -2
  85. package/.agents/scripts/lib/orchestration/plan-context.js +248 -266
  86. package/.agents/scripts/lib/orchestration/plan-critics-evaluate.js +1 -1
  87. package/.agents/scripts/lib/orchestration/plan-navigation.js +92 -0
  88. package/.agents/scripts/lib/orchestration/plan-persist/fan-out-gate.js +61 -0
  89. package/.agents/scripts/lib/orchestration/plan-persist/persist-helpers.js +97 -0
  90. package/.agents/scripts/lib/orchestration/plan-persist/run-plan-persist.js +223 -854
  91. package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +361 -0
  92. package/.agents/scripts/lib/orchestration/plan-persist/summary.js +35 -108
  93. package/.agents/scripts/lib/orchestration/plan-reachability.js +9 -14
  94. package/.agents/scripts/lib/orchestration/plan-runner/worktree-sweep.js +1 -1
  95. package/.agents/scripts/lib/orchestration/{epic-plan-spec/phases → planning}/authoring-context.js +13 -13
  96. package/.agents/scripts/lib/orchestration/planning/decomposer-context.js +27 -0
  97. package/.agents/scripts/lib/orchestration/{epic-plan-spec/phases → planning}/risk-verdict.js +3 -4
  98. package/.agents/scripts/lib/orchestration/post-merge/phases/branch-cleanup.js +2 -2
  99. package/.agents/scripts/lib/orchestration/post-merge/phases/dashboard-refresh.js +8 -20
  100. package/.agents/scripts/lib/orchestration/post-merge/phases/worktree-reap.js +3 -2
  101. package/.agents/scripts/lib/orchestration/pr-base-guard.js +18 -28
  102. package/.agents/scripts/lib/orchestration/preflight-cache.js +5 -5
  103. package/.agents/scripts/lib/orchestration/remote-verifier.js +1 -1
  104. package/.agents/scripts/lib/orchestration/resolve-plan-run.js +155 -0
  105. package/.agents/scripts/lib/orchestration/resolves-token.js +1 -1
  106. package/.agents/scripts/lib/orchestration/retro-perf-heuristics.js +8 -8
  107. package/.agents/scripts/lib/orchestration/retro-proposals.js +140 -79
  108. package/.agents/scripts/lib/orchestration/review-depth.js +26 -12
  109. package/.agents/scripts/lib/orchestration/review-providers/codex.js +2 -2
  110. package/.agents/scripts/lib/orchestration/review-providers/review-provider-factory.js +21 -56
  111. package/.agents/scripts/lib/orchestration/run-epilogue.js +426 -0
  112. package/.agents/scripts/lib/orchestration/single-story-close/phases/auto-merge.js +1 -1
  113. package/.agents/scripts/lib/orchestration/single-story-close/phases/code-review.js +95 -41
  114. package/.agents/scripts/lib/orchestration/single-story-close/phases/options.js +16 -13
  115. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-block.js +40 -0
  116. package/.agents/scripts/lib/orchestration/single-story-close/runner.js +11 -3
  117. package/.agents/scripts/lib/orchestration/spec-freshness.js +14 -205
  118. package/.agents/scripts/lib/orchestration/spec-section-validator.js +4 -5
  119. package/.agents/scripts/lib/orchestration/spec-spill.js +60 -0
  120. package/.agents/scripts/lib/orchestration/split-policy-validator.js +188 -0
  121. package/.agents/scripts/lib/orchestration/story-close/emit-blocked.js +49 -0
  122. package/.agents/scripts/lib/orchestration/story-close/phases/code-review.js +15 -12
  123. package/.agents/scripts/lib/orchestration/story-follow-ups.js +237 -0
  124. package/.agents/scripts/lib/orchestration/story-init-remote.js +47 -0
  125. package/.agents/scripts/lib/orchestration/story-plan-state.js +48 -0
  126. package/.agents/scripts/lib/orchestration/{epic-runner → story-progress}/story-run-progress-writer.js +3 -3
  127. package/.agents/scripts/lib/orchestration/structured-comment-parser.js +1 -1
  128. package/.agents/scripts/lib/orchestration/task-body-validator.js +8 -18
  129. package/.agents/scripts/lib/orchestration/ticket-validator-conflicts.js +11 -61
  130. package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +189 -373
  131. package/.agents/scripts/lib/orchestration/ticket-validator.js +2 -7
  132. package/.agents/scripts/lib/orchestration/ticketing/bulk.js +0 -25
  133. package/.agents/scripts/lib/orchestration/ticketing/reads.js +29 -26
  134. package/.agents/scripts/lib/orchestration/ticketing/transition.js +5 -5
  135. package/.agents/scripts/lib/planning-corpus.js +16 -11
  136. package/.agents/scripts/lib/preflight-runner.js +2 -2
  137. package/.agents/scripts/lib/qa/coverage-verdict.js +5 -5
  138. package/.agents/scripts/lib/single-story/confirm-merge-follow-ups.js +36 -0
  139. package/.agents/scripts/lib/single-story-sweep/protection-ctx.js +1 -1
  140. package/.agents/scripts/lib/story-adjacency.js +11 -14
  141. package/.agents/scripts/lib/story-body/story-body.js +124 -70
  142. package/.agents/scripts/lib/story-plan.js +2 -4
  143. package/.agents/scripts/lib/templates/decomposer-prompts.js +46 -45
  144. package/.agents/scripts/lib/templates/spec-author-prompts.js +47 -45
  145. package/.agents/scripts/lib/{epic-body-sections.js → ticket-body-sections.js} +26 -26
  146. package/.agents/scripts/lib/validation-evidence.js +1 -1
  147. package/.agents/scripts/lib/wave-runner/ready-set.js +6 -6
  148. package/.agents/scripts/lib/workspace-provisioner.js +1 -1
  149. package/.agents/scripts/lib/worktree/lifecycle/reap.js +5 -7
  150. package/.agents/scripts/lint-issue-body.js +71 -40
  151. package/.agents/scripts/mandrel-update-preflight.js +1 -1
  152. package/.agents/scripts/notify.js +4 -3
  153. package/.agents/scripts/plan-context.js +64 -74
  154. package/.agents/scripts/plan-persist.js +121 -280
  155. package/.agents/scripts/plan-run-epilogue.js +97 -0
  156. package/.agents/scripts/providers/github/issues.js +17 -33
  157. package/.agents/scripts/providers/github/mappers.js +0 -12
  158. package/.agents/scripts/providers/github/tickets.js +2 -5
  159. package/.agents/scripts/resolve-plan-run.js +117 -0
  160. package/.agents/scripts/signals-view.js +24 -19
  161. package/.agents/scripts/single-story-close.js +11 -14
  162. package/.agents/scripts/single-story-confirm-merge.js +39 -23
  163. package/.agents/scripts/single-story-init.js +29 -20
  164. package/.agents/scripts/stories-wave-tick.js +6 -6
  165. package/.agents/scripts/story-plan.js +26 -47
  166. package/.agents/scripts/update-ticket-state.js +6 -15
  167. package/.agents/skills/core/analyze-execution/SKILL.md +21 -18
  168. package/.agents/skills/core/idea-refinement/SKILL.md +6 -6
  169. package/.agents/skills/core/scope-triage/SKILL.md +28 -172
  170. package/.agents/skills/skills.index.json +3 -43
  171. package/.agents/starter-agentrc.json +0 -5
  172. package/.agents/templates/agent-protocol.md +9 -10
  173. package/.agents/workflows/audit-architecture.md +3 -3
  174. package/.agents/workflows/audit-clean-code.md +3 -3
  175. package/.agents/workflows/audit-dependencies.md +3 -3
  176. package/.agents/workflows/audit-devops.md +3 -3
  177. package/.agents/workflows/audit-documentation.md +5 -5
  178. package/.agents/workflows/audit-lighthouse.md +3 -3
  179. package/.agents/workflows/audit-navigability.md +3 -2
  180. package/.agents/workflows/audit-performance.md +3 -3
  181. package/.agents/workflows/audit-privacy.md +3 -3
  182. package/.agents/workflows/audit-quality.md +3 -3
  183. package/.agents/workflows/audit-security.md +3 -3
  184. package/.agents/workflows/audit-seo.md +3 -3
  185. package/.agents/workflows/audit-sre.md +3 -3
  186. package/.agents/workflows/audit-to-stories.md +20 -20
  187. package/.agents/workflows/audit-ux-ui.md +3 -3
  188. package/.agents/workflows/deliver.md +122 -174
  189. package/.agents/workflows/git-cleanup.md +3 -4
  190. package/.agents/workflows/helpers/_merge-conflict-template.md +1 -1
  191. package/.agents/workflows/helpers/acceptance-self-eval.md +16 -29
  192. package/.agents/workflows/helpers/code-review.md +70 -193
  193. package/.agents/workflows/helpers/{single-story-deliver-reference.md → deliver-story-reference.md} +12 -14
  194. package/.agents/workflows/helpers/{single-story-deliver.md → deliver-story.md} +113 -139
  195. package/.agents/workflows/helpers/diagnose.md +10 -10
  196. package/.agents/workflows/helpers/parallel-tooling.md +1 -1
  197. package/.agents/workflows/helpers/signals.md +16 -16
  198. package/.agents/workflows/helpers/worktree-lifecycle.md +48 -64
  199. package/.agents/workflows/mandrel-update.md +2 -1
  200. package/.agents/workflows/plan.md +112 -145
  201. package/.agents/workflows/qa-assist.md +24 -30
  202. package/.agents/workflows/qa-explore.md +29 -38
  203. package/.agents/workflows/qa-run.md +2 -2
  204. package/README.md +9 -8
  205. package/docs/CHANGELOG.md +30 -0
  206. package/lib/migrations/index.js +6 -5
  207. package/package.json +2 -2
  208. package/.agents/agents/retro.md +0 -42
  209. package/.agents/personas/architect.md +0 -113
  210. package/.agents/personas/devops-engineer.md +0 -38
  211. package/.agents/personas/engineer.md +0 -33
  212. package/.agents/personas/project-manager.md +0 -114
  213. package/.agents/personas/qa-engineer.md +0 -95
  214. package/.agents/personas/security-engineer.md +0 -111
  215. package/.agents/personas/technical-writer.md +0 -101
  216. package/.agents/schemas/dispatch-manifest.json +0 -232
  217. package/.agents/schemas/epic-spec.schema.json +0 -153
  218. package/.agents/schemas/lifecycle/slice.end.schema.json +0 -21
  219. package/.agents/schemas/lifecycle/slice.heartbeat.schema.json +0 -20
  220. package/.agents/schemas/lifecycle/slice.start.schema.json +0 -17
  221. package/.agents/scripts/acceptance-spec-reconciler.js +0 -642
  222. package/.agents/scripts/bookkeeping-reconcile.js +0 -117
  223. package/.agents/scripts/dispatcher.js +0 -295
  224. package/.agents/scripts/epic-audit-prepare.js +0 -497
  225. package/.agents/scripts/epic-audit-recheck.js +0 -274
  226. package/.agents/scripts/epic-deliver-note-intervention.js +0 -192
  227. package/.agents/scripts/epic-deliver-preflight.js +0 -462
  228. package/.agents/scripts/epic-deliver-prepare.js +0 -852
  229. package/.agents/scripts/epic-execute-record-wave.js +0 -449
  230. package/.agents/scripts/epic-plan-clarity.js +0 -211
  231. package/.agents/scripts/epic-plan-healthcheck.js +0 -581
  232. package/.agents/scripts/epic-reconcile.js +0 -625
  233. package/.agents/scripts/lib/baseline-snapshot.js +0 -979
  234. package/.agents/scripts/lib/checks/epic-merge-lock-stale.js +0 -54
  235. package/.agents/scripts/lib/checks/stale-origin-epic.js +0 -49
  236. package/.agents/scripts/lib/config/lifecycle.js +0 -40
  237. package/.agents/scripts/lib/config/preflight.js +0 -58
  238. package/.agents/scripts/lib/config/retro.js +0 -77
  239. package/.agents/scripts/lib/epic-merge-lock.js +0 -322
  240. package/.agents/scripts/lib/epic-plan-clarity.js +0 -181
  241. package/.agents/scripts/lib/epic-plan-ideation.js +0 -261
  242. package/.agents/scripts/lib/orchestration/context-hydration-engine.js +0 -539
  243. package/.agents/scripts/lib/orchestration/deliver-route.js +0 -173
  244. package/.agents/scripts/lib/orchestration/dispatch-engine.js +0 -134
  245. package/.agents/scripts/lib/orchestration/dispatch-pipeline.js +0 -183
  246. package/.agents/scripts/lib/orchestration/epic-cleanup.js +0 -801
  247. package/.agents/scripts/lib/orchestration/epic-deliver-lease-guard.js +0 -310
  248. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/context.js +0 -163
  249. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/creation.js +0 -140
  250. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/dag.js +0 -64
  251. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/diagnostics.js +0 -72
  252. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/persist-helpers.js +0 -156
  253. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/persist.js +0 -345
  254. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/planning-artifacts.js +0 -41
  255. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/reconcile-spawn.js +0 -86
  256. package/.agents/scripts/lib/orchestration/epic-plan-lease-guard.js +0 -391
  257. package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/drain.js +0 -94
  258. package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/plan-epic.js +0 -236
  259. package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/run-spec-phase.js +0 -307
  260. package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/spec-freshness.js +0 -117
  261. package/.agents/scripts/lib/orchestration/epic-plan-state-store.js +0 -117
  262. package/.agents/scripts/lib/orchestration/epic-run-state-store.js +0 -621
  263. package/.agents/scripts/lib/orchestration/epic-runner/concurrency-gate.js +0 -186
  264. package/.agents/scripts/lib/orchestration/epic-runner/deliver-phases.js +0 -50
  265. package/.agents/scripts/lib/orchestration/epic-runner/phases/build-wave-dag.js +0 -129
  266. package/.agents/scripts/lib/orchestration/epic-runner/phases/snapshot.js +0 -103
  267. package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter/composition.js +0 -267
  268. package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter/signals.js +0 -210
  269. package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter/transport.js +0 -238
  270. package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/_bullet-format.js +0 -32
  271. package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/component-drift.js +0 -203
  272. package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/crap-drift.js +0 -227
  273. package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/maintainability-drift.js +0 -117
  274. package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/stalled-worktree.js +0 -37
  275. package/.agents/scripts/lib/orchestration/epic-runner/story-launcher.js +0 -127
  276. package/.agents/scripts/lib/orchestration/epic-runner/sub-agent-return.js +0 -276
  277. package/.agents/scripts/lib/orchestration/epic-runner/wave-scheduler.js +0 -66
  278. package/.agents/scripts/lib/orchestration/epic-spec-reconciler-apply.js +0 -789
  279. package/.agents/scripts/lib/orchestration/epic-spec-reconciler-diff.js +0 -676
  280. package/.agents/scripts/lib/orchestration/epic-spec-reconciler-discriminator.js +0 -389
  281. package/.agents/scripts/lib/orchestration/epic-spec-reconciler-format.js +0 -230
  282. package/.agents/scripts/lib/orchestration/epic-spec-reconciler-ops.js +0 -361
  283. package/.agents/scripts/lib/orchestration/finalize/open-or-locate-pr.js +0 -306
  284. package/.agents/scripts/lib/orchestration/finalize/post-handoff-comment.js +0 -489
  285. package/.agents/scripts/lib/orchestration/finalize/sanitize-skip-ci.js +0 -88
  286. package/.agents/scripts/lib/orchestration/lifecycle/emit-slice-lifecycle.js +0 -270
  287. package/.agents/scripts/lib/orchestration/lifecycle/emit-story-dispatch-end.js +0 -147
  288. package/.agents/scripts/lib/orchestration/lifecycle/listeners/acceptance-reconciler.js +0 -465
  289. package/.agents/scripts/lib/orchestration/lifecycle/listeners/automerge-armer.js +0 -501
  290. package/.agents/scripts/lib/orchestration/lifecycle/listeners/automerge-predicate.js +0 -984
  291. package/.agents/scripts/lib/orchestration/lifecycle/listeners/branch-cleaner.js +0 -264
  292. package/.agents/scripts/lib/orchestration/lifecycle/listeners/checkpoint-pointer-writer.js +0 -284
  293. package/.agents/scripts/lib/orchestration/lifecycle/listeners/cleaner.js +0 -355
  294. package/.agents/scripts/lib/orchestration/lifecycle/listeners/finalizer.js +0 -673
  295. package/.agents/scripts/lib/orchestration/lifecycle/listeners/index.js +0 -378
  296. package/.agents/scripts/lib/orchestration/lifecycle/listeners/intervention-recorder.js +0 -140
  297. package/.agents/scripts/lib/orchestration/lifecycle/listeners/label-transitioner.js +0 -144
  298. package/.agents/scripts/lib/orchestration/lifecycle/listeners/notify-dispatcher.js +0 -174
  299. package/.agents/scripts/lib/orchestration/manifest-builder.js +0 -222
  300. package/.agents/scripts/lib/orchestration/plan-persist/amend.js +0 -359
  301. package/.agents/scripts/lib/orchestration/plan-persist/delivery-mode.js +0 -127
  302. package/.agents/scripts/lib/orchestration/post-merge-pipeline.js +0 -205
  303. package/.agents/scripts/lib/orchestration/recurring-failure-detector.js +0 -152
  304. package/.agents/scripts/lib/orchestration/retro/phases/checks.js +0 -94
  305. package/.agents/scripts/lib/orchestration/retro/phases/compose-body.js +0 -571
  306. package/.agents/scripts/lib/orchestration/retro/phases/gather-signals.js +0 -450
  307. package/.agents/scripts/lib/orchestration/retro/phases/post-and-mirror.js +0 -191
  308. package/.agents/scripts/lib/orchestration/retro-heuristics.js +0 -57
  309. package/.agents/scripts/lib/orchestration/retro-runner.js +0 -197
  310. package/.agents/scripts/lib/orchestration/spec-renderer.js +0 -447
  311. package/.agents/scripts/lib/orchestration/story-close/auto-refresh-runner.js +0 -747
  312. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/gate-failure.js +0 -211
  313. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/pre-merge-attribution.js +0 -158
  314. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/refresh-commit.js +0 -446
  315. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/regression-projection.js +0 -297
  316. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/scope-discovery.js +0 -48
  317. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution-wiring.js +0 -67
  318. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution.js +0 -161
  319. package/.agents/scripts/lib/orchestration/story-close/baseline-friction-body.js +0 -117
  320. package/.agents/scripts/lib/orchestration/story-close/cd-out-guard.js +0 -86
  321. package/.agents/scripts/lib/orchestration/story-close/cleanup-reconciler.js +0 -147
  322. package/.agents/scripts/lib/orchestration/story-close/close-inputs.js +0 -142
  323. package/.agents/scripts/lib/orchestration/story-close/comment-bodies.js +0 -62
  324. package/.agents/scripts/lib/orchestration/story-close/merge-runner.js +0 -658
  325. package/.agents/scripts/lib/orchestration/story-close/merge-subject.js +0 -198
  326. package/.agents/scripts/lib/orchestration/story-close/phases/branch-restore.js +0 -105
  327. package/.agents/scripts/lib/orchestration/story-close/phases/close.js +0 -222
  328. package/.agents/scripts/lib/orchestration/story-close/phases/gates.js +0 -292
  329. package/.agents/scripts/lib/orchestration/story-close/phases/locked-pipeline.js +0 -270
  330. package/.agents/scripts/lib/orchestration/story-close/phases/preflight.js +0 -110
  331. package/.agents/scripts/lib/orchestration/story-close/phases/refresh.js +0 -86
  332. package/.agents/scripts/lib/orchestration/story-close/phases/timeout-blocked-emitter.js +0 -112
  333. package/.agents/scripts/lib/orchestration/story-close/phases/timeout-blocked.js +0 -157
  334. package/.agents/scripts/lib/orchestration/story-close/post-merge-close.js +0 -421
  335. package/.agents/scripts/lib/orchestration/story-close/pre-merge-validation.js +0 -302
  336. package/.agents/scripts/lib/orchestration/story-close/shared-checkout-guard.js +0 -163
  337. package/.agents/scripts/lib/orchestration/story-close-recovery.js +0 -690
  338. package/.agents/scripts/lib/orchestration/wave-marker.js +0 -28
  339. package/.agents/scripts/lib/orchestration/wave-record-io.js +0 -218
  340. package/.agents/scripts/lib/orchestration/wave-record-notifications.js +0 -145
  341. package/.agents/scripts/lib/orchestration/wave-record-projection.js +0 -212
  342. package/.agents/scripts/lib/presentation/dispatch-manifest-render.js +0 -111
  343. package/.agents/scripts/lib/presentation/manifest-builder.js +0 -239
  344. package/.agents/scripts/lib/presentation/manifest-formatter.js +0 -242
  345. package/.agents/scripts/lib/presentation/manifest-helpers.js +0 -213
  346. package/.agents/scripts/lib/presentation/manifest-persistence.js +0 -261
  347. package/.agents/scripts/lib/presentation/manifest-procedures.js +0 -55
  348. package/.agents/scripts/lib/presentation/manifest-render-waves.js +0 -306
  349. package/.agents/scripts/lib/presentation/manifest-renderer.js +0 -188
  350. package/.agents/scripts/lib/presentation/manifest-story-views.js +0 -110
  351. package/.agents/scripts/lib/push-epic-retry.js +0 -209
  352. package/.agents/scripts/lib/spec/index.js +0 -36
  353. package/.agents/scripts/lib/spec/loader.js +0 -425
  354. package/.agents/scripts/lib/spec/state.js +0 -208
  355. package/.agents/scripts/lib/story-init/blocker-validator.js +0 -68
  356. package/.agents/scripts/lib/story-init/branch-initializer.js +0 -408
  357. package/.agents/scripts/lib/story-init/context-resolver.js +0 -92
  358. package/.agents/scripts/lib/story-init/donor-precheck.js +0 -207
  359. package/.agents/scripts/lib/story-init/state-transitioner.js +0 -80
  360. package/.agents/scripts/lib/story-init/task-graph-builder.js +0 -124
  361. package/.agents/scripts/lib/story-init/transition-summary.js +0 -34
  362. package/.agents/scripts/lib/test-reserved-epic-temp-ids.js +0 -35
  363. package/.agents/scripts/lib/wave-runner/tick.js +0 -754
  364. package/.agents/scripts/lib/wave-runner/wave-runner-error.js +0 -20
  365. package/.agents/scripts/lifecycle-emit-story-dispatch.js +0 -194
  366. package/.agents/scripts/lifecycle-emit.js +0 -510
  367. package/.agents/scripts/retro-run.js +0 -218
  368. package/.agents/scripts/slice-phase.js +0 -361
  369. package/.agents/scripts/standalone-feedback-rollup.js +0 -188
  370. package/.agents/scripts/story-close.js +0 -294
  371. package/.agents/scripts/story-init.js +0 -599
  372. package/.agents/scripts/story-phase.js +0 -369
  373. package/.agents/scripts/wave-tick.js +0 -464
  374. package/.agents/skills/core/epic-plan-consolidate/SKILL.md +0 -172
  375. package/.agents/skills/core/epic-plan-consolidate/examples.md +0 -51
  376. package/.agents/skills/core/epic-plan-decompose-author/SKILL.md +0 -441
  377. package/.agents/skills/core/epic-plan-decompose-author/examples.md +0 -47
  378. package/.agents/skills/core/epic-plan-premortem/SKILL.md +0 -146
  379. package/.agents/skills/core/epic-plan-premortem/examples.md +0 -53
  380. package/.agents/skills/core/epic-plan-spec-author/SKILL.md +0 -383
  381. package/.agents/skills/core/epic-plan-spec-author/examples.md +0 -91
  382. package/.agents/workflows/helpers/deliver-epic-reference.md +0 -547
  383. package/.agents/workflows/helpers/deliver-epic-single.md +0 -331
  384. package/.agents/workflows/helpers/deliver-epic.md +0 -998
  385. package/.agents/workflows/helpers/deliver-stories.md +0 -450
  386. package/.agents/workflows/helpers/epic-audit.md +0 -189
  387. package/.agents/workflows/helpers/epic-deliver-story.md +0 -436
  388. package/.agents/workflows/helpers/epic-testing.md +0 -125
  389. package/.agents/workflows/helpers/plan-epic-reference.md +0 -160
  390. package/.agents/workflows/helpers/plan-epic.md +0 -353
  391. package/.agents/workflows/helpers/plan-story.md +0 -251
  392. package/.agents/workflows/helpers/scope-triage-gate.md +0 -108
  393. /package/.agents/scripts/lib/orchestration/{epic-plan-spec/phases → planning}/spec-authoring-grounding.js +0 -0
@@ -1,369 +0,0 @@
1
- #!/usr/bin/env node
2
-
3
- /**
4
- * story-phase.js — phase snapshot + heartbeat writer (2-tier).
5
- *
6
- * Replaces the deleted per-Task progress writer from the 4-tier era
7
- * (removed under #3157). `/deliver` calls this CLI at each Story-
8
- * level phase transition (init → implementing → closing → done, or any
9
- * → blocked). Each call:
10
- *
11
- * 1. Renders the Story-phase snapshot for the requested phase (canonical
12
- * init/implement/validate/close progression in the `phases[]` payload)
13
- * and returns its markdown body for chat relay. Story #3909 — this no
14
- * longer posts a `story-run-progress` comment (the redundant mid-flight
15
- * progress surface was deleted); the snapshot is render-only.
16
- * 2. Appends one `story.heartbeat` lifecycle record to
17
- * `temp/epic-<epicId>/lifecycle.ndjson` so `/deliver`'s
18
- * §2e Idle Watchdog (`wave-tick.js --check-idle 30`) can confirm
19
- * forward progress without polling the Story comment.
20
- *
21
- * The heartbeat emit is best-effort: a missing/unreachable ledger,
22
- * schema-validation hiccup, or absent `Epic: #N` body reference is
23
- * logged and swallowed — the labels remain the source of truth, the
24
- * ledger record is observability.
25
- *
26
- * CLI:
27
- * --story <id> Story ID (required).
28
- * --phase <init|implementing|closing|blocked|done>
29
- * Phase the Story is entering (required).
30
- * --epic <id> Parent Epic id from the Step 0 envelope.
31
- * When supplied, skips the readEpicIdFromStory
32
- * GitHub read.
33
- * --branch <name> Story branch from the Step 0 envelope.
34
- * When supplied, skips the resolveStoryBranch
35
- * GitHub read.
36
- * --no-heartbeat Suppress the lifecycle emit (tests).
37
- *
38
- * Stdout: a single JSON envelope
39
- * { ok: true, storyId, phase, epicId, branch, heartbeatEmitted,
40
- * ledgerPath, renderedBody }
41
- *
42
- * `renderedBody` is the markdown body upserted onto the Story so the
43
- * caller can relay it to chat verbatim (mirrors the contract the deleted
44
- * per-Task progress writer exposed and that `/deliver` Step 1 / 3
45
- * already documents).
46
- */
47
-
48
- import { parseArgs } from 'node:util';
49
-
50
- import { runAsCli } from './lib/cli-utils.js';
51
- import { resolveConfig } from './lib/config-resolver.js';
52
- import { Logger } from './lib/Logger.js';
53
- import {
54
- defaultStoryPhases,
55
- STORY_PHASE_ORDER,
56
- upsertStoryRunProgress,
57
- } from './lib/orchestration/epic-runner/story-run-progress-writer.js';
58
- import { emitStoryHeartbeat } from './lib/orchestration/lifecycle/emit-story-heartbeat.js';
59
- import { parseFencedJsonComment } from './lib/orchestration/structured-comment-parser.js';
60
- import { normalizeOperatorHandle } from './lib/orchestration/ticket-lease.js';
61
- import { findStructuredComment } from './lib/orchestration/ticketing.js';
62
- import { createProvider } from './lib/provider-factory.js';
63
- import { resolveStoryHierarchy } from './lib/story-lifecycle.js';
64
- import { notify } from './notify.js';
65
-
66
- const VALID_PHASES = new Set([
67
- 'init',
68
- 'implementing',
69
- 'closing',
70
- 'blocked',
71
- 'done',
72
- ]);
73
-
74
- const HELP = `Usage: node .agents/scripts/story-phase.js \\
75
- --story <id> --phase <init|implementing|closing|blocked|done> \\
76
- [--epic <id>] [--branch <name>] [--no-heartbeat]
77
-
78
- Renders the Story-phase snapshot for Story #<id> at the requested phase
79
- (returned as renderedBody for chat relay; no comment is posted) and
80
- (unless --no-heartbeat) appends one story.heartbeat record to the parent
81
- Epic's lifecycle ledger so the Idle Watchdog can confirm the Story is alive.
82
-
83
- --epic / --branch let the caller pass the parent Epic id and Story branch
84
- from story-init.js's Step 0 envelope, skipping the GitHub reads
85
- (readEpicIdFromStory / resolveStoryBranch) that would otherwise re-fetch
86
- these immutable values on every phase call. Omit both for interactive use.
87
- `;
88
-
89
- /**
90
- * Map the workflow-level `--phase` value to the canonical phases[] row
91
- * progression carried in the snapshot payload (init/implement/validate/
92
- * close). The mapping is monotonic: each later phase marks every earlier
93
- * row `done`, the current row `in-progress` (or `done` when the workflow
94
- * phase itself is `done`), and any later rows `pending`. `blocked` leaves
95
- * the in-progress row marked in-progress (the blocker is reflected in the
96
- * header phase, not the row table).
97
- *
98
- * @param {string} workflowPhase
99
- * @returns {Array<{ name: string, status: string, startedAt: string|null, endedAt: string|null }>}
100
- */
101
- export function phasesForWorkflowPhase(workflowPhase, now = new Date()) {
102
- const ts = now.toISOString();
103
- const phases = defaultStoryPhases();
104
-
105
- // Anchor row that should be "current" for each workflow phase.
106
- const currentByPhase = {
107
- init: 'init',
108
- implementing: 'implement',
109
- closing: 'validate',
110
- blocked: 'implement',
111
- done: 'close',
112
- };
113
- const current = currentByPhase[workflowPhase];
114
- const currentIdx = STORY_PHASE_ORDER.indexOf(current);
115
-
116
- for (let i = 0; i < phases.length; i++) {
117
- if (i < currentIdx) {
118
- phases[i].status = 'done';
119
- phases[i].startedAt = ts;
120
- phases[i].endedAt = ts;
121
- } else if (i === currentIdx) {
122
- if (workflowPhase === 'done') {
123
- phases[i].status = 'done';
124
- phases[i].startedAt = ts;
125
- phases[i].endedAt = ts;
126
- } else {
127
- phases[i].status = 'in-progress';
128
- phases[i].startedAt = ts;
129
- }
130
- }
131
- }
132
- return phases;
133
- }
134
-
135
- /**
136
- * Hydrate the parent Epic id off the Story ticket body. Returns null when
137
- * the Story has no `Epic: #N` reference (the heartbeat emit will be
138
- * skipped because there is no Epic-scoped ledger path to write to).
139
- *
140
- * @param {{ provider: object, storyId: number }} args
141
- * @returns {Promise<number|null>}
142
- */
143
- export async function readEpicIdFromStory({ provider, storyId }) {
144
- const story = await provider.getTicket(storyId);
145
- const { epicId } = resolveStoryHierarchy(story?.body ?? '');
146
- return epicId ?? null;
147
- }
148
-
149
- /**
150
- * Hydrate the prior story-run-progress branch off the Story ticket so a
151
- * resumed run preserves the branch name rather than re-deriving it.
152
- * Falls back to `story-<id>` when no prior snapshot exists.
153
- */
154
- async function resolveStoryBranch({ provider, storyId }) {
155
- const snapshot = await findStructuredComment(
156
- provider,
157
- storyId,
158
- 'story-run-progress',
159
- );
160
- if (snapshot) {
161
- const parsed = parseFencedJsonComment(snapshot);
162
- if (parsed && typeof parsed.branch === 'string' && parsed.branch) {
163
- return parsed.branch;
164
- }
165
- }
166
- const initComment = await findStructuredComment(
167
- provider,
168
- storyId,
169
- 'story-init',
170
- );
171
- if (initComment) {
172
- const parsed = parseFencedJsonComment(initComment);
173
- if (
174
- parsed &&
175
- typeof parsed.storyBranch === 'string' &&
176
- parsed.storyBranch
177
- ) {
178
- return parsed.storyBranch;
179
- }
180
- }
181
- return `story-${storyId}`;
182
- }
183
-
184
- /**
185
- * Best-effort `story.heartbeat` emit for one phase transition. Resolves the
186
- * lease-owner handle the SAME way the lease primitive does
187
- * (`normalizeOperatorHandle(github.operatorHandle)`) and stamps it as
188
- * `operator` so `latestHeartbeatForOwner({ epicId, owner })` resolves a real
189
- * heartbeat — without it `isClaimLive(null)` is false and /deliver
190
- * silently reclaims a live foreign claim (audit #3513). The field is attached
191
- * only when a handle resolves, preserving the "omit when absent" shape for
192
- * repos that have not configured `github.operatorHandle`. A failed append is
193
- * logged and swallowed: the heartbeat is observability, not state.
194
- *
195
- * @param {{ storyId: number, epicId: number, phase: string, config: object|null, ledgerPath?: string, timestamp: string }} args
196
- * @returns {{ heartbeatEmitted: boolean, ledgerPath: string|null }}
197
- */
198
- function emitHeartbeatBestEffort({
199
- storyId,
200
- epicId,
201
- phase,
202
- config,
203
- ledgerPath,
204
- timestamp,
205
- }) {
206
- const operator = normalizeOperatorHandle(config?.github?.operatorHandle);
207
- try {
208
- const res = emitStoryHeartbeat({
209
- storyId,
210
- epicId,
211
- phase,
212
- timestamp,
213
- ...(operator !== null ? { operator } : {}),
214
- config: config ?? undefined,
215
- ledgerPath,
216
- });
217
- return { heartbeatEmitted: true, ledgerPath: res.ledgerPath };
218
- } catch (err) {
219
- Logger.warn(
220
- `[story-phase] story.heartbeat emit failed (continuing): ${err.message}`,
221
- );
222
- return { heartbeatEmitted: false, ledgerPath: null };
223
- }
224
- }
225
-
226
- /**
227
- * End-to-end phase writer. DI-friendly: tests pass `provider`, override
228
- * the ledger path, and skip the heartbeat as needed.
229
- *
230
- * When `epicId` / `branch` are supplied (the `/deliver` worker passes them
231
- * from `story-init.js`'s Step 0 envelope), the corresponding GitHub read is
232
- * skipped entirely: `epicId` short-circuits `readEpicIdFromStory` and
233
- * `branch` short-circuits `resolveStoryBranch`. Omit both for interactive
234
- * use to restore the original GitHub-read resolution.
235
- *
236
- * @param {{
237
- * storyId: number,
238
- * phase: string,
239
- * epicId?: number|null,
240
- * branch?: string,
241
- * noHeartbeat?: boolean,
242
- * provider?: object,
243
- * config?: object,
244
- * ledgerPath?: string,
245
- * now?: Date,
246
- * }} args
247
- */
248
- export async function runStoryPhase(args) {
249
- const {
250
- storyId,
251
- phase,
252
- epicId: epicIdOverride,
253
- branch: branchOverride,
254
- noHeartbeat = false,
255
- provider: providerOverride,
256
- config: configOverride,
257
- ledgerPath: ledgerPathOverride,
258
- now = new Date(),
259
- } = args ?? {};
260
-
261
- if (!Number.isInteger(storyId) || storyId <= 0) {
262
- throw new Error('runStoryPhase: --story must be a positive integer');
263
- }
264
- if (!VALID_PHASES.has(phase)) {
265
- throw new Error(
266
- `runStoryPhase: --phase "${phase}" must be one of: ${[...VALID_PHASES].join(', ')}`,
267
- );
268
- }
269
-
270
- const config = configOverride ?? (providerOverride ? null : resolveConfig());
271
- const provider = providerOverride ?? createProvider(config);
272
- const notifyFn = providerOverride
273
- ? null
274
- : (ticketId, payload, opts = {}) =>
275
- notify(ticketId, payload, { config, provider, ...opts });
276
-
277
- // When the Step 0 envelope supplied the branch / epicId (the /deliver
278
- // worker passes them via --branch / --epic), skip the GitHub reads that
279
- // would otherwise re-fetch these immutable values on every phase call.
280
- const branch =
281
- typeof branchOverride === 'string' && branchOverride
282
- ? branchOverride
283
- : await resolveStoryBranch({ provider, storyId });
284
- const epicId =
285
- epicIdOverride !== undefined
286
- ? epicIdOverride
287
- : await readEpicIdFromStory({ provider, storyId });
288
- const phases = phasesForWorkflowPhase(phase, now);
289
-
290
- const { body: renderedBody, payload: snapshot } =
291
- await upsertStoryRunProgress({
292
- provider,
293
- storyId,
294
- branch,
295
- phase,
296
- phases,
297
- epicId: epicId ?? undefined,
298
- updatedAt: now.toISOString(),
299
- notify: notifyFn,
300
- });
301
-
302
- let heartbeatEmitted = false;
303
- let ledgerPath = null;
304
- if (!noHeartbeat && epicId) {
305
- ({ heartbeatEmitted, ledgerPath } = emitHeartbeatBestEffort({
306
- storyId,
307
- epicId,
308
- phase,
309
- config,
310
- ledgerPath: ledgerPathOverride,
311
- timestamp: now.toISOString(),
312
- }));
313
- }
314
-
315
- return {
316
- ok: true,
317
- storyId,
318
- phase,
319
- epicId,
320
- branch,
321
- heartbeatEmitted,
322
- ledgerPath,
323
- snapshot,
324
- renderedBody,
325
- };
326
- }
327
-
328
- export function parseArgv(argv) {
329
- const { values } = parseArgs({
330
- args: argv,
331
- options: {
332
- story: { type: 'string' },
333
- phase: { type: 'string' },
334
- epic: { type: 'string' },
335
- branch: { type: 'string' },
336
- 'no-heartbeat': { type: 'boolean' },
337
- help: { type: 'boolean' },
338
- },
339
- strict: false,
340
- });
341
- // `--epic` absent → leave `epicId` undefined so runStoryPhase falls back to
342
- // the readEpicIdFromStory GitHub read. `--branch` absent → leave `branch`
343
- // undefined so it falls back to resolveStoryBranch.
344
- const parsed = {
345
- help: Boolean(values.help),
346
- storyId: Number.parseInt(values.story ?? '', 10),
347
- phase: values.phase,
348
- noHeartbeat: Boolean(values['no-heartbeat']),
349
- };
350
- if (values.epic !== undefined) {
351
- parsed.epicId = Number.parseInt(values.epic, 10);
352
- }
353
- if (typeof values.branch === 'string' && values.branch) {
354
- parsed.branch = values.branch;
355
- }
356
- return parsed;
357
- }
358
-
359
- export async function main(argv = process.argv.slice(2)) {
360
- const parsed = parseArgv(argv);
361
- if (parsed.help) {
362
- process.stdout.write(HELP);
363
- return;
364
- }
365
- const envelope = await runStoryPhase(parsed);
366
- process.stdout.write(`${JSON.stringify(envelope, null, 2)}\n`);
367
- }
368
-
369
- runAsCli(import.meta.url, main, { source: 'story-phase' });