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,174 +0,0 @@
1
- // .agents/scripts/lib/orchestration/lifecycle/listeners/notify-dispatcher.js
2
- /**
3
- * NotifyDispatcher — lifecycle listener that fans out the curated
4
- * webhook event subset (Story #2239 Task #2244).
5
- *
6
- * The framework's notification surface is the operator-supplied
7
- * `notifications.webhookEvents` allowlist (see
8
- * `.agents/scripts/lib/config/github.js NOTIFICATIONS_DEFAULTS`). Each
9
- * allowlisted name maps to one lifecycle event the bus emits — this
10
- * listener subscribes to those events and dispatches via the injected
11
- * `notify` function.
12
- *
13
- * Mapping (Tech Spec § curated webhooks):
14
- *
15
- * webhookEvents entry lifecycle event
16
- * -------------------- ---------------------
17
- * `epic-started` (emitted at /deliver kickoff;
18
- * this listener handles `epic.snapshot.start`)
19
- * `epic-blocked` `epic.blocked`
20
- * `epic-complete` `epic.complete`
21
- *
22
- * The `epic-progress` and `epic-unblocked` webhook events are NOT mapped
23
- * here: their former dotted lifecycle triggers (`wave.end` /
24
- * `epic.unblocked`) belonged to the in-process runner stratum deleted in
25
- * Story #3908. The production wave loop fires those curated webhooks
26
- * directly through `progress-reporter/transport.js`
27
- * (`wave-record-notifications.js`), so the webhook names stay valid in
28
- * `NOTIFICATIONS_DEFAULTS` — only the redundant lifecycle-bus subscription
29
- * is gone.
30
- *
31
- * Why per-event subscriptions instead of a wildcard listener? The
32
- * wildcard would receive every event the bus carries, forcing the
33
- * dispatcher to re-check membership on every emit. Per-event
34
- * subscription gives the bus's mediator the routing decision once at
35
- * registration time and keeps the side-effect surface auditable.
36
- *
37
- * Idempotency: `(event, seqId)` guard short-circuits replays. The
38
- * `notify` function itself is fire-and-forget per `notify.js`
39
- * (failures are swallowed); the listener wraps in try/catch defense.
40
- *
41
- * Trace emit (Tech Spec § observability): for every event the
42
- * dispatcher handles, it appends a `notification.emitted` row to the
43
- * epic-level signals NDJSON via the injected `appendEpicSignal`. This
44
- * gives operators a single place to confirm that a webhook actually
45
- * fired (the `notify` function's success is silent). The trace row
46
- * also carries `seqId` so the resume test can prove
47
- * notifications survive a crash window without duplicating.
48
- */
49
-
50
- /**
51
- * Static map: lifecycle event → curated webhook event name. Keys are
52
- * the bus event names this listener subscribes to.
53
- */
54
- export const LIFECYCLE_TO_WEBHOOK_EVENT = Object.freeze({
55
- 'epic.snapshot.start': 'epic-started',
56
- 'epic.blocked': 'epic-blocked',
57
- 'epic.complete': 'epic-complete',
58
- });
59
-
60
- /**
61
- * Compute the set of webhook event names this listener can emit.
62
- * Exposed so the listener-notify test can assert subset equality
63
- * against `notifications.webhookEvents` from `.agentrc.json`.
64
- */
65
- export function webhookEventNames() {
66
- return new Set(Object.values(LIFECYCLE_TO_WEBHOOK_EVENT));
67
- }
68
-
69
- export class NotifyDispatcher {
70
- /**
71
- * @param {object} opts
72
- * @param {number} opts.epicId
73
- * @param {(ticketId: number, payload: object, opts?: object) => Promise<unknown>} opts.notify
74
- * @param {(args: object) => Promise<boolean>} [opts.appendEpicSignal]
75
- * Optional trace writer; when omitted, trace emits are skipped.
76
- * @param {object} [opts.config] Resolved framework config (forwarded
77
- * to `appendEpicSignal`).
78
- * @param {() => number} [opts.now]
79
- * @param {{ warn?: Function, debug?: Function }} [opts.logger]
80
- */
81
- constructor(opts = {}) {
82
- if (!Number.isInteger(opts.epicId) || opts.epicId < 1) {
83
- throw new TypeError('NotifyDispatcher requires a numeric epicId');
84
- }
85
- if (typeof opts.notify !== 'function') {
86
- throw new TypeError('NotifyDispatcher requires a notify function');
87
- }
88
- this.epicId = opts.epicId;
89
- this._notify = opts.notify;
90
- this._appendEpicSignal = opts.appendEpicSignal ?? null;
91
- this._config = opts.config;
92
- this._now = typeof opts.now === 'function' ? opts.now : Date.now;
93
- this.logger = opts.logger ?? console;
94
- this._seen = new Set();
95
- this.events = Object.freeze(Object.keys(LIFECYCLE_TO_WEBHOOK_EVENT));
96
- }
97
-
98
- register(bus) {
99
- if (!bus || typeof bus.on !== 'function') {
100
- throw new TypeError('NotifyDispatcher.register requires a bus with on()');
101
- }
102
- return this.events.map((event) =>
103
- bus.on(event, async (ctx) => this.handle(ctx)),
104
- );
105
- }
106
-
107
- async handle({ event, seqId, payload }) {
108
- const key = `${event}:${seqId}`;
109
- if (this._seen.has(key)) {
110
- this.logger.debug?.(
111
- `[NotifyDispatcher] skip duplicate ${key} (idempotent)`,
112
- );
113
- return;
114
- }
115
- this._seen.add(key);
116
-
117
- const webhookEvent = LIFECYCLE_TO_WEBHOOK_EVENT[event];
118
- if (!webhookEvent) return;
119
-
120
- // notify() is fire-and-forget by contract; wrap in try/catch as a
121
- // defense layer so even a thrown notify error never propagates
122
- // back to the bus.
123
- try {
124
- await this._notify(
125
- this.epicId,
126
- {
127
- event: webhookEvent,
128
- level: 'epic',
129
- epicId: this.epicId,
130
- payload: { ...payload },
131
- },
132
- { skipComment: true },
133
- );
134
- } catch (err) {
135
- this.logger.warn?.(
136
- `[NotifyDispatcher] notify ${webhookEvent} failed: ${err?.message ?? err}`,
137
- );
138
- }
139
-
140
- // Self-emit `notification.emitted` for trace — but NOT through the
141
- // bus (the mediator forbids re-entry from inside a listener
142
- // body). Instead we append a row to the epic-level signals NDJSON
143
- // so the resume test can prove the dispatch survived a crash
144
- // window without duplicating.
145
- if (this._appendEpicSignal) {
146
- const signal = {
147
- kind: 'notification.emitted',
148
- seqId,
149
- ts: new Date(this._now()).toISOString(),
150
- // The common signal envelope requires `epicId` on the record
151
- // itself — `hasCommonEnvelope` (lib/signals/schema.js) rejects
152
- // rows without it and the read side silently drops them, so
153
- // without this field the record was write-only (invisible to
154
- // signals-view.js and every other reader).
155
- epicId: this.epicId,
156
- sourceEvent: event,
157
- webhookEvent,
158
- };
159
- try {
160
- await this._appendEpicSignal({
161
- epicId: this.epicId,
162
- signal,
163
- config: this._config,
164
- });
165
- } catch {
166
- // already best-effort; swallow.
167
- }
168
- }
169
- }
170
-
171
- resetSeen() {
172
- this._seen.clear();
173
- }
174
- }
@@ -1,222 +0,0 @@
1
- /**
2
- * lib/orchestration/manifest-builder.js — Manifest Building Logic
3
- *
4
- * 2-tier-only producer. Reads Story tickets from `allTickets` directly,
5
- * computes Story-scoped waves, and emits the `waves[].stories[]` /
6
- * Story-only `storyManifest` shape. The pre-Epic-#3163 Task-tier branch
7
- * has been removed; the framework no longer carries a Task-tier
8
- * producer path.
9
- */
10
-
11
- import { parseBlockedBy } from '../dependency-parser.js';
12
- import { getStoryBranch, slugify } from '../git-utils.js';
13
- import { TYPE_LABELS } from '../label-constants.js';
14
- import { computeStoryWaves } from './dependency-analyzer.js';
15
- import { STATE_LABELS } from './ticketing.js';
16
-
17
- /**
18
- * Extract the markdown list items under a `## <heading>` section of a
19
- * Story body. Returns an empty array when the section is missing or has
20
- * no list items. Recognises both `- ` (incl. `- [ ]` / `- [x]`) and
21
- * `* ` bullet markers — the same set the schema expects to round-trip
22
- * verbatim per the manifest dispatch-manifest contract.
23
- *
24
- * @param {string} body
25
- * @param {string} heading
26
- * @returns {string[]}
27
- */
28
- function extractSectionList(body, heading) {
29
- if (typeof body !== 'string' || body.length === 0) return [];
30
- const pattern = new RegExp(
31
- `^##\\s+${heading.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')}\\s*$`,
32
- 'mi',
33
- );
34
- const startMatch = body.match(pattern);
35
- if (!startMatch || startMatch.index == null) return [];
36
- const startIdx = startMatch.index + startMatch[0].length;
37
- const rest = body.slice(startIdx);
38
- const nextHeading = rest.search(/^##\s+/m);
39
- const block = nextHeading === -1 ? rest : rest.slice(0, nextHeading);
40
- const items = [];
41
- for (const rawLine of block.split(/\r?\n/)) {
42
- const line = rawLine.trim();
43
- const m = line.match(/^[-*]\s+(?:\[[ xX]\]\s+)?(.*)$/);
44
- if (m && m[1].length > 0) items.push(m[1].trim());
45
- }
46
- return items;
47
- }
48
-
49
- /**
50
- * Project a Story ticket into the inline-acceptance/verify shape required by
51
- * the 2-tier waves[].stories[] schema. Reads `## Acceptance` /
52
- * `## Acceptance Criteria` and `## Verify` sections from the body.
53
- *
54
- * @param {object} story
55
- * @param {number} epicId
56
- * @returns {object}
57
- */
58
- function projectStoryForWave(story, epicId) {
59
- const body = story.body ?? '';
60
- const acceptanceCriteria = extractSectionList(body, 'Acceptance Criteria');
61
- const acceptanceItems =
62
- acceptanceCriteria.length > 0
63
- ? acceptanceCriteria
64
- : extractSectionList(body, 'Acceptance');
65
- const verifyItems = extractSectionList(body, 'Verify');
66
- const fromBody = parseBlockedBy(body);
67
- const fromField = Array.isArray(story.dependencies)
68
- ? story.dependencies.map(Number)
69
- : [];
70
- const dependsOn = [...new Set([...fromBody, ...fromField])].filter((id) =>
71
- Number.isInteger(id),
72
- );
73
- const labels = story.labels ?? [];
74
- const personaLabel = labels.find((l) => l.startsWith('persona::'));
75
- const persona =
76
- story.persona ??
77
- (personaLabel ? personaLabel.replace('persona::', '') : 'engineer');
78
- const status =
79
- story.status ??
80
- labels.find((l) => l.startsWith('agent::')) ??
81
- 'agent::ready';
82
-
83
- return {
84
- storyId: story.id,
85
- title: story.title ?? '',
86
- status,
87
- branch: getStoryBranch(epicId, story.id),
88
- persona,
89
- acceptance: acceptanceItems,
90
- verify: verifyItems,
91
- dependsOn,
92
- };
93
- }
94
-
95
- const AGENT_DONE_LABEL = STATE_LABELS.DONE;
96
-
97
- /**
98
- * Build the Story-only manifest array used by the 2-tier hierarchy path.
99
- * Reads Story tickets directly from `allTickets`; there is no Task tier
100
- * to walk. Each entry exposes an empty `tasks: []` to keep downstream
101
- * consumers (renderers, dispatch helpers) on a single per-Story shape
102
- * until Category 4 of Epic #3163 rewrites them.
103
- *
104
- * @param {object[]} stories Story tickets (each with `id`, `title`,
105
- * `body`, `labels`, optional `dependencies`).
106
- * @param {number} epicId
107
- * @returns {object[]}
108
- */
109
- function buildStoryOnlyManifest(stories, epicId) {
110
- const storyById = new Map(stories.map((s) => [s.id, s]));
111
- const explicitStoryDeps = new Map();
112
- for (const story of stories) {
113
- const fromBody = parseBlockedBy(story.body ?? '');
114
- const fromField = Array.isArray(story.dependencies)
115
- ? story.dependencies.map(Number)
116
- : [];
117
- const merged = [...new Set([...fromBody, ...fromField])].filter(
118
- (id) => Number.isInteger(id) && id !== story.id && storyById.has(id),
119
- );
120
- if (merged.length > 0) explicitStoryDeps.set(story.id, merged);
121
- }
122
-
123
- // Reuse `computeStoryWaves` by adapting Stories to its `storyGroups`
124
- // input shape: a Map keyed by storyId whose values look like grouper
125
- // output. With no Tasks, every group's `tasks: []` collapses the
126
- // task-level wave inference to a no-op; only `explicitDeps` drives
127
- // ordering.
128
- const storyGroups = new Map(
129
- stories.map((s) => [s.id, { storyId: s.id, tasks: [] }]),
130
- );
131
- const storyWaves = computeStoryWaves(storyGroups, explicitStoryDeps);
132
-
133
- return stories.map((story) => {
134
- const earliestWave = storyWaves.get(story.id) ?? -1;
135
- return {
136
- storyId: story.id,
137
- storyTitle: story.title ?? '',
138
- storySlug: slugify(story.title ?? `story-${story.id}`),
139
- type: 'story',
140
- branchName: getStoryBranch(epicId, story.id),
141
- earliestWave,
142
- // Carry the resolved cross-Story dependency edges on the entry so the
143
- // presentation layer can derive grouping depth at render time via
144
- // `assignLayers` (Story #4157) instead of trusting the persisted
145
- // `earliestWave`. This is the same `explicitStoryDeps` set the wave
146
- // computation consumed, already closed over the scheduled Story set.
147
- dependsOn: explicitStoryDeps.get(story.id) ?? [],
148
- tasks: [],
149
- };
150
- });
151
- }
152
-
153
- /**
154
- * Build the wave records for a 2-tier manifest. Each wave entry exposes a
155
- * `stories[]` projection (instead of the legacy `tasks[]`) so dispatch
156
- * consumers can fan Story execution out wave-by-wave without ever seeing
157
- * a `type::task` ticket.
158
- *
159
- * @param {object[][]} waves Story waves (array of Story-ticket arrays).
160
- * @param {number} epicId
161
- * @returns {object[]}
162
- */
163
- function buildStoryWaves(waves, epicId) {
164
- return waves.map((wave, i) => ({
165
- waveIndex: i,
166
- stories: wave.map((s) => projectStoryForWave(s, epicId)),
167
- }));
168
- }
169
-
170
- /**
171
- * Build the full Dispatch Manifest object.
172
- *
173
- * Epic #3163, Category 2 deleted the legacy Task-tier
174
- * `waves[].tasks[]` branch and the Task-grouping import this module
175
- * used to pull from the removed helper. The producer is now
176
- * Story-only: it filters `allTickets` to the Story tier, computes
177
- * Story-scoped waves, and emits `waves[].stories[]` plus a Story-only
178
- * `storyManifest`.
179
- *
180
- * @param {object} params
181
- * @returns {object}
182
- */
183
- export function buildManifest({
184
- epicId,
185
- epic,
186
- allTickets,
187
- waves,
188
- dispatched,
189
- dryRun,
190
- agentTelemetry = null,
191
- }) {
192
- const stories = (allTickets ?? []).filter((t) =>
193
- (t.labelSet ?? new Set(t.labels ?? [])).has(TYPE_LABELS.STORY),
194
- );
195
- const totalStories = stories.length;
196
- const doneStories = stories.filter((s) =>
197
- (s.labelSet ?? new Set(s.labels ?? [])).has(AGENT_DONE_LABEL),
198
- ).length;
199
- const progress =
200
- totalStories > 0 ? Math.round((doneStories / totalStories) * 100) : 0;
201
-
202
- return {
203
- schemaVersion: '1.0.0',
204
- generatedAt: new Date().toISOString(),
205
- epicId,
206
- epicTitle: epic?.title ?? '',
207
- executor: 'claude-code',
208
- dryRun,
209
- hierarchy: '2-tier',
210
- summary: {
211
- totalStories,
212
- doneStories,
213
- progressPercent: progress,
214
- totalWaves: waves.length,
215
- dispatched: dispatched.length,
216
- },
217
- waves: buildStoryWaves(waves, epicId),
218
- storyManifest: buildStoryOnlyManifest(stories, epicId),
219
- dispatched,
220
- agentTelemetry,
221
- };
222
- }