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,355 +0,0 @@
1
- // .agents/scripts/lib/orchestration/lifecycle/listeners/cleaner.js
2
- /**
3
- * Cleaner — lifecycle listener that owns the post-arm temp archive and
4
- * the terminal `epic.complete` emit. Story #2259 / Task #2265
5
- * (Epic #2172).
6
- *
7
- * Subscribes to:
8
- * - `epic.merge.confirmed` → and ONLY this event.
9
- *
10
- * Story #2896 (Epic #2880) rebound this listener from
11
- * `epic.merge.armed` to `epic.merge.confirmed` so the Epic only
12
- * transitions to its terminal state AFTER the MergeWatcher has
13
- * observed `gh pr view --json mergeCommit` returning a non-null
14
- * `mergeCommit` (i.e. the PR has actually merged), rather than after
15
- * `gh pr merge --auto` was merely armed. The chain ordering is:
16
- *
17
- * epic.merge.armed → MergeWatcher polls
18
- * epic.merge.confirmed → Cleaner (this listener) + LabelTransitioner
19
- *
20
- * Side effects executed inside `handle()`:
21
- * 1. Emit `epic.cleanup.start`.
22
- * 2. Emit `epic.cleanup.end`.
23
- * 3. Emit `epic.complete` carrying `{ epicId, prUrl }` — the terminal
24
- * event of a successful Epic run. LabelTransitioner flips the
25
- * Epic ticket to `agent::done` on this event (see listener
26
- * README). The emit order is "complete BEFORE archive" so the
27
- * ledger written into `temp/epic-<id>/lifecycle.ndjson` carries
28
- * `epic.complete` as its last record — this is Task #2265's
29
- * acceptance contract.
30
- * 4. Move `temp/epic-<id>/` to `temp/archive/epic-<id>-<ts>/`. The
31
- * move is atomic on the same filesystem (`fs.renameSync`) so a
32
- * crash between rename and ledger flush leaves either the source
33
- * or the destination on disk — never both. When the source is
34
- * absent (because a prior interrupted run already moved it), the
35
- * step short-circuits to the resume contract: no second archive
36
- * directory is created (AC-10 Cleaner idempotency).
37
- *
38
- * Idempotency contract (AC-10): two-layer defence.
39
- * 1. Per-instance `Set<string>` of `${event}:${seqId}` keys — repeat
40
- * `(event, seqId)` invocation short-circuits and emits nothing.
41
- * This is the bus-level replay defence.
42
- * 2. On-disk archive probe — when the source `temp/epic-<id>/`
43
- * directory is absent (the prior process moved it before
44
- * crashing), the listener records the existing archive directory
45
- * and proceeds to emit `epic.cleanup.end` + `epic.complete`
46
- * exactly once. This defends against cross-process re-run after
47
- * a crash between the rename and the `epic.cleanup.end` emit.
48
- *
49
- * Side-effect firewall: the listener emits on the bus and moves a
50
- * directory under `tempRoot`. It does NOT mutate ticket labels, post
51
- * comments, or call `notify` — downstream listeners
52
- * (LabelTransitioner on `epic.complete`) own those side effects.
53
- *
54
- * Why move (rename) rather than copy + delete: a rename is atomic at
55
- * the OS level when source and destination share a filesystem (which
56
- * they do — both live under `temp/`). Copy + delete leaves a window
57
- * where both directories exist; a crash there would produce two
58
- * archive entries on the next run. The rename guarantees that the
59
- * source either still exists OR the destination does, never neither
60
- * and never both.
61
- */
62
-
63
- import { existsSync, mkdirSync, readdirSync, renameSync } from 'node:fs';
64
- import path from 'node:path';
65
-
66
- /**
67
- * Default clock — exported so tests can stub the timestamp suffix on
68
- * the archive directory name.
69
- */
70
- export function defaultNow() {
71
- return new Date();
72
- }
73
-
74
- /**
75
- * Format a `Date` as a filesystem-safe timestamp suffix for the archive
76
- * directory name. ISO-8601 with `:` replaced by `-` so the result is
77
- * usable on Windows. Pure — exported for tests.
78
- *
79
- * Example: 2026-05-17T21:55:09.123Z → 2026-05-17T21-55-09-123Z
80
- */
81
- export function formatArchiveTimestamp(date) {
82
- const iso = date.toISOString();
83
- return iso.replace(/[:.]/g, '-');
84
- }
85
-
86
- /**
87
- * Resolve the archive destination directory for an Epic. Pure helper
88
- * that builds the `<tempRoot>/archive/epic-<id>-<ts>` path. Exported
89
- * for tests so the layout pin is reviewable.
90
- */
91
- export function resolveArchiveDest({ tempRoot, epicId, now }) {
92
- const suffix = formatArchiveTimestamp(now);
93
- return path.join(tempRoot, 'archive', `epic-${epicId}-${suffix}`);
94
- }
95
-
96
- /**
97
- * Find an existing archive directory for an Epic. Returns the absolute
98
- * path of the FIRST match (alphabetic order; archive names are
99
- * timestamped so this is also chronological), or `null` when no
100
- * archive exists yet. Pure — exported for tests.
101
- *
102
- * Used by the on-disk idempotency probe: when `temp/epic-<id>/` is
103
- * absent AND an archive directory already exists, we know a prior run
104
- * completed the move; the listener short-circuits to a single
105
- * `epic.cleanup.end` + `epic.complete` emit without re-archiving.
106
- */
107
- export function findExistingArchive({
108
- tempRoot,
109
- epicId,
110
- readdirFn = readdirSync,
111
- }) {
112
- const archiveRoot = path.join(tempRoot, 'archive');
113
- let entries;
114
- try {
115
- entries = readdirFn(archiveRoot, { withFileTypes: true });
116
- } catch (err) {
117
- // Missing archive root is the typical first-run case.
118
- if (err && err.code === 'ENOENT') return null;
119
- throw err;
120
- }
121
- const prefix = `epic-${epicId}-`;
122
- const matches = entries
123
- .filter((e) => e.isDirectory?.() && e.name.startsWith(prefix))
124
- .map((e) => e.name)
125
- .sort();
126
- if (matches.length === 0) return null;
127
- return path.join(archiveRoot, matches[0]);
128
- }
129
-
130
- /**
131
- * Cleaner listener.
132
- */
133
- export class Cleaner {
134
- /**
135
- * @param {object} opts
136
- * @param {object} opts.bus
137
- * @param {number} opts.epicId
138
- * @param {string} opts.tempRoot - absolute or repo-relative path; the
139
- * listener resolves `<tempRoot>/epic-<id>/` as the source and
140
- * `<tempRoot>/archive/epic-<id>-<ts>/` as the destination.
141
- * @param {() => Date} [opts.now] - injectable clock for tests.
142
- * @param {typeof renameSync} [opts.renameFn] - injectable rename for
143
- * tests.
144
- * @param {typeof existsSync} [opts.existsFn] - injectable presence
145
- * probe for tests.
146
- * @param {typeof mkdirSync} [opts.mkdirFn] - injectable directory
147
- * creator for tests.
148
- * @param {typeof readdirSync} [opts.readdirFn] - injectable directory
149
- * reader for the existing-archive probe.
150
- * @param {{ info?: Function, warn?: Function, debug?: Function }} [opts.logger]
151
- */
152
- constructor(opts = {}) {
153
- if (
154
- !opts.bus ||
155
- typeof opts.bus.on !== 'function' ||
156
- typeof opts.bus.emit !== 'function'
157
- ) {
158
- throw new TypeError('Cleaner requires a bus with on() and emit()');
159
- }
160
- if (!Number.isInteger(opts.epicId) || opts.epicId < 1) {
161
- throw new TypeError('Cleaner requires a numeric epicId');
162
- }
163
- if (typeof opts.tempRoot !== 'string' || opts.tempRoot.length === 0) {
164
- throw new TypeError('Cleaner requires a non-empty tempRoot string');
165
- }
166
- this.bus = opts.bus;
167
- this.epicId = opts.epicId;
168
- this.tempRoot = opts.tempRoot;
169
- this.now = typeof opts.now === 'function' ? opts.now : defaultNow;
170
- this.renameFn = opts.renameFn ?? renameSync;
171
- this.existsFn = opts.existsFn ?? existsSync;
172
- this.mkdirFn = opts.mkdirFn ?? mkdirSync;
173
- this.readdirFn = opts.readdirFn ?? readdirSync;
174
- this.logger = opts.logger ?? console;
175
- /** @type {Set<string>} `${event}:${seqId}` idempotency cache. */
176
- this._seen = new Set();
177
- /**
178
- * Classification log — every `epic.merge.confirmed` observed
179
- * lands here with the outcome (`archived`, `existing-archive`,
180
- * `skipped-duplicate`, `failed`). Mirrors the
181
- * Finalizer / AutomergeArmer "no silent skip" surface.
182
- */
183
- this.classifications = [];
184
- // Frozen tuple — Cleaner subscribes to EXACTLY one event.
185
- // Story #2896 rebind: was `epic.merge.armed`, now
186
- // `epic.merge.confirmed` (downstream of MergeWatcher).
187
- this.events = Object.freeze(['epic.merge.confirmed']);
188
- }
189
-
190
- register() {
191
- return this.events.map((event) =>
192
- this.bus.on(event, async (ctx) => this.handle(ctx)),
193
- );
194
- }
195
-
196
- async handle({ event, seqId, payload }) {
197
- const key = `${event}:${seqId}`;
198
- if (this._seen.has(key)) {
199
- this.classifications.push({
200
- event,
201
- seqId,
202
- outcome: 'skipped',
203
- reason: 'duplicate-seqId',
204
- });
205
- this.logger.debug?.(`[Cleaner] skip duplicate ${key} (idempotent)`);
206
- return;
207
- }
208
- this._seen.add(key);
209
-
210
- const prUrl = payload?.prUrl;
211
- if (typeof prUrl !== 'string' || prUrl.length === 0) {
212
- this.classifications.push({
213
- event,
214
- seqId,
215
- outcome: 'failed',
216
- reason: 'no-pr-url',
217
- });
218
- return;
219
- }
220
-
221
- const epicId = this.epicId;
222
- const epicDir = path.join(this.tempRoot, `epic-${epicId}`);
223
-
224
- // 0. Cross-process resume probe — if an archive directory for
225
- // this Epic already exists on disk, a prior run already
226
- // completed the rename. Honour the AC-10 idempotency
227
- // contract: emit the terminal sequence exactly once (so
228
- // LabelTransitioner / downstream listeners stay in sync) but
229
- // do NOT re-archive the just-recreated source directory. The
230
- // `archivedTo` field carries the FIRST archive directory.
231
- //
232
- // This probe runs BEFORE the emit chain so the LedgerWriter's
233
- // `_ensureDir` recreation of `temp/epic-<id>/` (lazy on the
234
- // first append) does not mask the resume signal.
235
- const existingArchive = findExistingArchive({
236
- tempRoot: this.tempRoot,
237
- epicId,
238
- readdirFn: this.readdirFn,
239
- });
240
-
241
- // 1. Emit the terminal sequence FIRST so the ledger inside
242
- // `temp/epic-<id>/lifecycle.ndjson` captures the full
243
- // `epic.cleanup.start` → `epic.cleanup.end` → `epic.complete`
244
- // trail BEFORE the archive rename moves the directory. AC
245
- // contract: "epic.complete is the last event recorded in the
246
- // ledger before archive."
247
- //
248
- // Emits that throw are caught and recorded as `failed`; the
249
- // archive step is still attempted afterwards on resume but
250
- // NOT during this same handler invocation, because schema or
251
- // bus-shape errors are signal of a real problem we do not
252
- // want to mask.
253
- try {
254
- await this.bus.emit('epic.cleanup.start', { epicId });
255
- } catch (err) {
256
- this.classifications.push({
257
- event,
258
- seqId,
259
- outcome: 'failed',
260
- reason: `start-emit-failed:${err?.message ?? err}`,
261
- });
262
- this.logger.warn?.(
263
- `[Cleaner] epic.cleanup.start emit failed: ${err?.message ?? err}`,
264
- );
265
- return;
266
- }
267
- try {
268
- await this.bus.emit('epic.cleanup.end', { epicId });
269
- } catch (err) {
270
- this.classifications.push({
271
- event,
272
- seqId,
273
- outcome: 'failed',
274
- reason: `end-emit-failed:${err?.message ?? err}`,
275
- });
276
- this.logger.warn?.(
277
- `[Cleaner] epic.cleanup.end emit failed: ${err?.message ?? err}`,
278
- );
279
- return;
280
- }
281
- try {
282
- await this.bus.emit('epic.complete', { epicId, prUrl });
283
- } catch (err) {
284
- this.classifications.push({
285
- event,
286
- seqId,
287
- outcome: 'failed',
288
- reason: `complete-emit-failed:${err?.message ?? err}`,
289
- });
290
- this.logger.warn?.(
291
- `[Cleaner] epic.complete emit failed: ${err?.message ?? err}`,
292
- );
293
- return;
294
- }
295
-
296
- // 2. Archive. Three states:
297
- // (a) prior archive exists — resume contract; short-circuit
298
- // and record `existing-archive` without re-archiving the
299
- // (LedgerWriter-recreated) source directory.
300
- // (b) no prior archive + source exists — rename it under
301
- // `archive/`. Happy path.
302
- // (c) no prior archive + source absent — nothing to archive.
303
- let archivedTo;
304
- let outcome;
305
- if (existingArchive) {
306
- archivedTo = existingArchive;
307
- outcome = 'existing-archive';
308
- this.logger.info?.(
309
- `[Cleaner] existing archive ${existingArchive} found — resume contract honored; not re-archiving.`,
310
- );
311
- } else if (this.existsFn(epicDir)) {
312
- const dest = resolveArchiveDest({
313
- tempRoot: this.tempRoot,
314
- epicId,
315
- now: this.now(),
316
- });
317
- try {
318
- this.mkdirFn(path.dirname(dest), { recursive: true });
319
- this.renameFn(epicDir, dest);
320
- } catch (err) {
321
- this.classifications.push({
322
- event,
323
- seqId,
324
- outcome: 'failed',
325
- reason: `archive-failed:${err?.message ?? err}`,
326
- });
327
- this.logger.warn?.(
328
- `[Cleaner] archive rename failed (${epicDir} → ${dest}): ${err?.message ?? err}`,
329
- );
330
- return;
331
- }
332
- archivedTo = dest;
333
- outcome = 'archived';
334
- } else {
335
- archivedTo = null;
336
- outcome = 'no-source';
337
- this.logger.info?.(
338
- `[Cleaner] source ${epicDir} absent and no prior archive — nothing to do.`,
339
- );
340
- }
341
-
342
- this.classifications.push({
343
- event,
344
- seqId,
345
- outcome,
346
- epicId,
347
- archivedTo,
348
- });
349
- }
350
-
351
- reset() {
352
- this._seen.clear();
353
- this.classifications = [];
354
- }
355
- }