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,497 +0,0 @@
1
- #!/usr/bin/env node
2
- /* node:coverage ignore file */
3
-
4
- /**
5
- * epic-audit-prepare.js — Phase 4 prepare CLI for `/deliver`.
6
- *
7
- * Thin glue around the audit-suite `selectAudits` SDK. Reads the Epic
8
- * ticket, runs the change-set selector against the Epic branch diff
9
- * (`main..epic/<id>`), and emits a JSON envelope on stdout that the
10
- * inline `helpers/epic-audit.md` consumes.
11
- *
12
- * The CLI carries no business logic beyond:
13
- * 1. validating `--epic <id>`,
14
- * 2. resolving the Epic branch name (`epic/<id>`),
15
- * 3. running `selectAudits` at the close-gate (`gate3`),
16
- * 4. routing the model-judged risk envelope's high-risk axes onto their
17
- * mapped audit lenses (Story #3889 — `resolveAuditLenses`) and unioning
18
- * them into the change-set selection,
19
- * 5. resolving the run's audit depth (`light` / `standard` / `deep`) from
20
- * the same risk envelope + the change-set's changed-file count via the
21
- * shared `resolveDepth` resolver (Story #3939), and
22
- * 6. shaping the result into the helper-consumable envelope.
23
- *
24
- * Story #3939 — depth-aware lenses. The `depth` field tells the audit
25
- * executor (`helpers/epic-audit.md`) how thorough each selected lens should
26
- * be on this Epic without ever skipping a selected lens:
27
- * `light` shrinks a lens's sweep to the changed surface + Critical/High
28
- * findings, `standard` is today's behavior, and `deep` widens the sweep to
29
- * the directly-touched modules. Depth never changes which lenses fire, the
30
- * severity taxonomy, the findings shape, or the Phase 4 halting rule — it is
31
- * an orthogonal "how deep" signal alongside the "which lenses" selection.
32
- * Depth is resolved from the SAME best-effort `planningRisk` checkpoint read
33
- * the risk-routed lenses use (a missing/unparseable checkpoint degrades to
34
- * `standard`, never an abort) folded with the changed-file count the
35
- * change-set diff already produces.
36
- *
37
- * Story #3889 — risk-routed lenses. Epic #3865 added `resolveAuditLenses`
38
- * (axis → audit-lens mapping for the model-judged risk verdict) to
39
- * `lib/orchestration/code-review.js` but nothing invoked it in the live
40
- * delivery path. This CLI now reads the `planningRisk` envelope off the
41
- * Epic's `epic-plan-state` checkpoint and unions the routed lenses into
42
- * `selectedAudits`, so a high-risk Epic auto-runs its mapped lenses
43
- * (e.g. a `security`-axis Epic runs `audit-security`) at Phase 4 through the
44
- * SAME `runAuditSuite` / `selectAuditStrategy` engine the helper already
45
- * dispatches — no new audit machinery. A low-risk Epic routes no extra
46
- * lenses. Reading the checkpoint is best-effort: a missing/unparseable
47
- * checkpoint degrades to the change-set selection alone (never an abort).
48
- *
49
- * Envelope shape (Tech Spec #2588 — API Changes § New CLI):
50
- *
51
- * {
52
- * "epicId": 2586,
53
- * "epicBranch": "epic/2586",
54
- * "depth": "deep",
55
- * "selectedAudits": ["audit-security", "audit-privacy"],
56
- * "epicCloseLenses": ["audit-security"],
57
- * "changeSetAudits": ["audit-privacy"],
58
- * "riskRoutedAudits": ["audit-security"],
59
- * "globalLenses": [],
60
- * "changedFiles": ["src/api/admin/users.ts", "..."],
61
- * "changedFilesCount": 47,
62
- * "substitutionsPayload": "src/api/admin/users.ts\n..."
63
- * }
64
- *
65
- * `selectedAudits` is the union the helper dispatches: the change-set
66
- * selection (`changeSetAudits`) plus the risk-routed lenses
67
- * (`riskRoutedAudits`), de-duplicated. The two source-of-truth arrays are
68
- * surfaced for observability so the operator can see why each lens fired.
69
- * `depth` (`light` / `standard` / `deep`) is the orthogonal "how deep each
70
- * selected lens runs" signal (Story #3939).
71
- *
72
- * Epic #4131 (F2/F3) — `globalLenses` is the subset of `selectedAudits` on the
73
- * global-lens allowlist (`GLOBAL_LENS_ALLOWLIST`, e.g. `audit-navigability`):
74
- * lenses the helper runs against the WHOLE route tree, exempt from the
75
- * cross-epic-leak guard's change-set narrowing (`#3362`). The exemption is
76
- * scoped to these lenses only — every other selected lens stays scoped to
77
- * `changedFiles`, and the guard is not weakened for them. The navigability lens
78
- * is also auto-selected here when a changed file matches a consumer-configured
79
- * route glob (`delivery.quality.navigability.routeGlobs`), routed through the
80
- * SAME risk-routed-lens union; with no route globs configured it routes
81
- * nothing (silent no-op).
82
- *
83
- * Usage:
84
- * node .agents/scripts/epic-audit-prepare.js --epic <epicId> [--base-branch main]
85
- *
86
- * Exit codes:
87
- * 0 — envelope written to stdout
88
- * 2 — validation error (missing/invalid --epic)
89
- * 1 — provider / git failure
90
- */
91
-
92
- import {
93
- GLOBAL_LENS_ALLOWLIST,
94
- isGlobalLens,
95
- routesNavigabilityLens,
96
- selectAudits,
97
- } from './lib/audit-suite/index.js';
98
- import { defineFlags } from './lib/cli-args.js';
99
- import { runAsCli } from './lib/cli-utils.js';
100
- import { resolveConfig } from './lib/config-resolver.js';
101
- import {
102
- resolveAuditLenses,
103
- selectEpicCloseLenses,
104
- } from './lib/orchestration/code-review.js';
105
- import { read as readPlanState } from './lib/orchestration/epic-plan-state-store.js';
106
- import { resolveDepth } from './lib/orchestration/review-depth.js';
107
- import { createProvider } from './lib/provider-factory.js';
108
-
109
- const HELP = `Usage: node .agents/scripts/epic-audit-prepare.js --epic <epicId> [--base-branch main]
110
-
111
- Flags:
112
- --epic Epic ticket ID to prepare audit selection for (required).
113
- --base-branch Branch to diff against for the selector's change-set
114
- input (default: main).
115
- --gate Audit gate label (default: gate3 — Epic close gate).
116
- --help Show this message.
117
-
118
- Output (JSON envelope on stdout):
119
- epicId, epicBranch
120
- depth Audit depth for this run — one of light | standard | deep
121
- (Story #3939). Resolved from the model-judged risk
122
- envelope + the change-set's changed-file count via the
123
- shared resolveDepth resolver; an absent checkpoint
124
- degrades to standard. Tells the audit executor how deep
125
- each SELECTED lens runs; it never changes which lenses
126
- fire, the severity taxonomy, or the Phase 4 halting rule.
127
- selectedAudits De-duplicated union of changeSetAudits + riskRoutedAudits.
128
- epicCloseLenses The SLIM Epic-close roster (Story #4412): selectedAudits
129
- with every local-tier change-set lens excluded, keeping
130
- only cumulative + global change-set lenses plus every
131
- risk-routed lens. This is the roster the Phase 5
132
- code-review pass walks over the cumulative Epic diff —
133
- local-tier concerns are already verified shift-left
134
- (write-time checklists + the Story-scope local-lens pass),
135
- so they are not re-run at Epic close.
136
- changeSetAudits Lenses the change-set selector chose.
137
- riskRoutedAudits Lenses routed from the model-judged high-risk axes plus the
138
- navigability lens when a changed file matches a configured
139
- route glob (Epic #4131, F3).
140
- globalLenses Subset of selectedAudits on the global-lens allowlist
141
- (e.g. audit-navigability) — run against the WHOLE route
142
- tree, exempt from the cross-epic-leak guard (Epic #4131,
143
- F2). Empty unless a global lens was selected.
144
- changedFiles, changedFilesCount, substitutionsPayload
145
- `;
146
-
147
- const DEFAULT_GATE = 'gate3';
148
-
149
- /**
150
- * Parse argv into the values bag this CLI understands.
151
- *
152
- * @param {string[]} argv
153
- * @returns {{ epic: number|null, 'base-branch': string, gate: string, help: boolean }}
154
- */
155
- export function parseArgv(argv) {
156
- const { values } = defineFlags(
157
- {
158
- epic: { type: 'ticket', alias: 'epicId' },
159
- 'base-branch': { type: 'string', default: 'main', alias: 'baseBranch' },
160
- gate: { type: 'string', default: DEFAULT_GATE },
161
- help: { type: 'boolean' },
162
- },
163
- argv,
164
- );
165
- return values;
166
- }
167
-
168
- /**
169
- * Resolve the risk-routed audit lenses for an Epic by reading the model-judged
170
- * `planningRisk` envelope off the Epic's `epic-plan-state` checkpoint and
171
- * mapping its high-risk axes onto audit lenses via `resolveAuditLenses`
172
- * (Story #3889). Best-effort: a missing/unparseable checkpoint, an absent
173
- * `planningRisk` field, or a provider read failure resolves to an empty array
174
- * so the change-set selection is never aborted by a risk-read failure.
175
- *
176
- * @param {{
177
- * epicId: number,
178
- * provider: object,
179
- * readPlanState?: typeof readPlanState,
180
- * resolveAuditLenses?: typeof resolveAuditLenses,
181
- * }} params
182
- * @returns {Promise<string[]>} Ordered, de-duplicated risk-routed lens names.
183
- */
184
- export async function resolveRiskRoutedLenses({
185
- epicId,
186
- provider,
187
- readPlanState: readPlanStateFn = readPlanState,
188
- resolveAuditLenses: resolveAuditLensesFn = resolveAuditLenses,
189
- }) {
190
- let state = null;
191
- try {
192
- state = await readPlanStateFn({ provider, epicId });
193
- } catch {
194
- // A read failure (provider error, malformed comment) must not abort the
195
- // change-set audit. Degrade to "no risk-routed lenses".
196
- return [];
197
- }
198
- const planningRisk = state?.planningRisk;
199
- if (!planningRisk || !Array.isArray(planningRisk.axes)) return [];
200
- return resolveAuditLensesFn(planningRisk);
201
- }
202
-
203
- /**
204
- * Resolve the operator's `planning.taskSizing` override the same way the
205
- * ticket validator and the code-review depth resolver do, so retuning sizing
206
- * retunes the audit-depth thresholds in lockstep. Reads `config.planning`
207
- * first, then the legacy `config.agentSettings.planning` nest; absent →
208
- * `undefined` so {@link resolveDepth} falls back to `DEFAULT_TASK_SIZING`.
209
- *
210
- * @param {object|null|undefined} config
211
- * @returns {object|undefined}
212
- */
213
- function resolveTaskSizing(config) {
214
- return (
215
- config?.planning?.taskSizing ??
216
- config?.agentSettings?.planning?.taskSizing ??
217
- undefined
218
- );
219
- }
220
-
221
- /**
222
- * Resolve the run's audit depth (`light` / `standard` / `deep`) for an Epic
223
- * via the shared {@link resolveDepth} resolver (Story #3939), folding the
224
- * model-judged risk envelope's `overallLevel` (read off the Epic's
225
- * `epic-plan-state` checkpoint) with the mechanical changed-file count of the
226
- * change set the prepare CLI already enumerated.
227
- *
228
- * Best-effort and total, mirroring `resolveRiskRoutedLenses`: a
229
- * missing/unparseable checkpoint, an absent `planningRisk` field, or a
230
- * provider read failure all degrade to `standard` — the neutral default that
231
- * preserves today's behavior — so an Epic that skipped `/plan` (no
232
- * checkpoint) still gets a passing `standard` pass with no new failure mode.
233
- * The changed-file count can only escalate a low-risk Epic to `deep` (a wide
234
- * diff) and never downgrades a high-risk one; an unknown/absent count is the
235
- * neutral "width unknown" signal {@link resolveDepth} tolerates.
236
- *
237
- * @param {{
238
- * epicId: number,
239
- * provider: object,
240
- * changedFileCount: number|null,
241
- * sizing?: object|undefined,
242
- * readPlanState?: typeof readPlanState,
243
- * }} params
244
- * @returns {Promise<import('./lib/orchestration/review-depth.js').ReviewDepth>}
245
- */
246
- export async function resolveRunDepth({
247
- epicId,
248
- provider,
249
- changedFileCount,
250
- sizing,
251
- readPlanState: readPlanStateFn = readPlanState,
252
- }) {
253
- let state = null;
254
- try {
255
- state = await readPlanStateFn({ provider, epicId });
256
- } catch {
257
- // A read failure must not abort the audit. Resolve from the diff width
258
- // alone (width can still escalate to `deep`); an unknown width with no
259
- // risk signal lands on `standard`.
260
- return resolveDepth({ changedFileCount, sizing });
261
- }
262
- return resolveDepth({
263
- overallLevel: state?.planningRisk?.overallLevel,
264
- changedFileCount,
265
- sizing,
266
- });
267
- }
268
-
269
- /**
270
- * Union two ordered lens lists, de-duplicating while preserving the order of
271
- * first appearance (change-set selection first, then risk-routed extras).
272
- *
273
- * @param {string[]} changeSetAudits
274
- * @param {string[]} riskRoutedAudits
275
- * @returns {string[]}
276
- */
277
- function unionAudits(changeSetAudits, riskRoutedAudits) {
278
- const seen = new Set();
279
- const merged = [];
280
- for (const lens of [...changeSetAudits, ...riskRoutedAudits]) {
281
- if (typeof lens !== 'string' || lens.length === 0 || seen.has(lens)) {
282
- continue;
283
- }
284
- seen.add(lens);
285
- merged.push(lens);
286
- }
287
- return merged;
288
- }
289
-
290
- /**
291
- * Orchestration body. Exported as a sibling so tests can drive it
292
- * without spawning a child process. CLI surface unchanged.
293
- *
294
- * @param {{ epicId: number, baseBranch?: string, gate?: string, help?: boolean }} values
295
- * @param {{
296
- * resolveConfig?: () => object,
297
- * createProvider?: (config: object) => object,
298
- * selectAudits?: typeof selectAudits,
299
- * readPlanState?: typeof readPlanState,
300
- * resolveAuditLenses?: typeof resolveAuditLenses,
301
- * resolveRunDepth?: typeof resolveRunDepth,
302
- * help?: string,
303
- * }} [deps]
304
- * @returns {Promise<{ exitCode: number, result: object }>}
305
- * `result.kind` is one of `'help'`, `'validation-error'`, `'envelope'`.
306
- */
307
- export async function runEpicAuditPrepare(values, deps = {}) {
308
- const helpText = deps.help ?? HELP;
309
- if (values.help) {
310
- return { exitCode: 0, result: { kind: 'help', text: helpText } };
311
- }
312
-
313
- const { epicId, baseBranch, gate } = values;
314
-
315
- if (!Number.isFinite(epicId) || epicId <= 0) {
316
- return {
317
- exitCode: 2,
318
- result: {
319
- kind: 'validation-error',
320
- message: '[epic-audit-prepare] --epic <id> is required.',
321
- help: helpText,
322
- },
323
- };
324
- }
325
-
326
- const cfg = deps.resolveConfig ? deps.resolveConfig() : resolveConfig();
327
- const provider = deps.createProvider
328
- ? deps.createProvider(cfg)
329
- : createProvider(cfg);
330
- const runner = deps.selectAudits ?? selectAudits;
331
-
332
- // Pin the change set to the requested Epic's own branch rather than the
333
- // shared checkout's HEAD (Story #3362). Under two concurrent /deliver
334
- // runs sharing one working copy, a HEAD-relative diff silently reports the
335
- // *other* Epic's change set; `refs/heads/epic/<id>` is unambiguous.
336
- const epicBranch = `epic/${epicId}`;
337
- const epicRef = `refs/heads/${epicBranch}`;
338
-
339
- const envelope = await runner({
340
- ticketId: epicId,
341
- gate: gate ?? DEFAULT_GATE,
342
- provider,
343
- baseBranch,
344
- headRef: epicRef,
345
- });
346
-
347
- // Degraded envelopes from selectAudits short-circuit through the
348
- // same surface so callers can branch on `degraded: true`. The
349
- // helper treats a degraded envelope as a Phase 4 abort — propagate
350
- // it verbatim with a non-zero exit code so shell pipelines see the
351
- // failure. An unresolved Epic ref (HEAD_REF_UNRESOLVED) flows through
352
- // here too: better to abort Phase 4 than audit a phantom change set.
353
- if (envelope?.degraded) {
354
- return {
355
- exitCode: 1,
356
- result: {
357
- kind: 'envelope',
358
- envelope: {
359
- epicId,
360
- epicBranch,
361
- ...envelope,
362
- },
363
- },
364
- };
365
- }
366
-
367
- // Defence in depth: assert the selector diffed the ref we asked for. If a
368
- // future selector change drops the pin, fail closed with an explicit
369
- // degraded envelope rather than emitting an audit selection silently
370
- // derived from the wrong branch.
371
- const resolvedRef = envelope?.context?.resolvedRef;
372
- if (resolvedRef !== epicRef) {
373
- return {
374
- exitCode: 1,
375
- result: {
376
- kind: 'envelope',
377
- envelope: {
378
- epicId,
379
- epicBranch,
380
- ok: false,
381
- degraded: true,
382
- reason: 'EPIC_REF_MISMATCH',
383
- detail: `epic-audit-prepare: selector diffed '${resolvedRef ?? '(unset)'}' but Epic #${epicId} requested '${epicRef}'`,
384
- },
385
- },
386
- };
387
- }
388
-
389
- const changedFiles = envelope?.context?.changedFiles ?? [];
390
- const changeSetAudits = envelope?.selectedAudits ?? [];
391
-
392
- // Story #3889 — union the model-judged risk-routed lenses into the
393
- // change-set selection. Read off the Epic's epic-plan-state checkpoint
394
- // (best-effort; a read failure yields no extra lenses). A high-risk
395
- // `security` axis therefore fires `audit-security` even when the change
396
- // set alone did not select it; a low-risk Epic adds nothing.
397
- const riskRoutedFromVerdict = await resolveRiskRoutedLenses({
398
- epicId,
399
- provider,
400
- readPlanState: deps.readPlanState,
401
- resolveAuditLenses: deps.resolveAuditLenses,
402
- });
403
-
404
- // Epic #4131 (F3) — route the navigability lens onto route-adding change
405
- // sets through the SAME risk-routed-lens union: when a changed file matches a
406
- // consumer-configured route glob (`delivery.quality.navigability.routeGlobs`)
407
- // the lens joins `riskRoutedAudits`, exactly like a verdict-routed lens. No
408
- // new routing function is introduced — the predicate feeds the existing
409
- // `unionAudits` seam. Unconfigured consumers route nothing (silent no-op), so
410
- // the change-set-scoped selection is unchanged. `cfg` may be `{}` in tests;
411
- // the predicate tolerates an absent config and returns `false`.
412
- const navigabilityRouted = routesNavigabilityLens({
413
- changedFiles,
414
- config: cfg,
415
- })
416
- ? GLOBAL_LENS_ALLOWLIST.slice()
417
- : [];
418
- const riskRoutedAudits = unionAudits(
419
- riskRoutedFromVerdict,
420
- navigabilityRouted,
421
- );
422
- const selectedAudits = unionAudits(changeSetAudits, riskRoutedAudits);
423
-
424
- // Story #4412 (Epic #4405) — the SLIM Epic-close roster. Restrict the gate3
425
- // selection to the tiers the Epic-close pass owns: cumulative + global
426
- // change-set lenses plus every risk-routed lens, dropping every local-tier
427
- // change-set lens (routed off `resolveLensTier` in `selectEpicCloseLenses`).
428
- // Local-tier concerns are already verified shift-left — the write-time
429
- // checklist threading (#4410) and the maker-blind Story-scope local-lens
430
- // pass (#4409) — so re-running them over the cumulative diff at close would
431
- // verify the same concern at a second tier. This is the roster the Phase 5
432
- // code-review pass walks; `selectedAudits` stays the pre-slim union for
433
- // observability.
434
- const epicCloseLenses = selectEpicCloseLenses({
435
- changeSetAudits,
436
- riskRoutedAudits,
437
- });
438
-
439
- // Epic #4131 (F2) — surface which selected lenses are on the global-lens
440
- // allowlist so the helper runs them against the WHOLE route tree, exempt from
441
- // the cross-epic-leak guard's change-set narrowing (`#3362`). The exemption
442
- // is scoped to these lenses only; every other selected lens stays scoped to
443
- // `changedFiles`. Order follows `selectedAudits` for a deterministic list.
444
- const globalLenses = selectedAudits.filter(isGlobalLens);
445
-
446
- // Story #3939 — resolve the run's audit depth from the SAME model-judged
447
- // risk envelope the lenses route from, folded with the changed-file count
448
- // the change set just produced. Best-effort: an absent checkpoint degrades
449
- // to `standard`. Depth tells the executor how deep each SELECTED lens runs;
450
- // it never changes the lens roster above.
451
- const resolveRunDepthFn = deps.resolveRunDepth ?? resolveRunDepth;
452
- const depth = await resolveRunDepthFn({
453
- epicId,
454
- provider,
455
- changedFileCount: changedFiles.length,
456
- sizing: resolveTaskSizing(cfg),
457
- readPlanState: deps.readPlanState,
458
- });
459
-
460
- return {
461
- exitCode: 0,
462
- result: {
463
- kind: 'envelope',
464
- envelope: {
465
- epicId,
466
- epicBranch,
467
- depth,
468
- selectedAudits,
469
- epicCloseLenses,
470
- changeSetAudits,
471
- riskRoutedAudits,
472
- globalLenses,
473
- changedFiles,
474
- changedFilesCount: changedFiles.length,
475
- substitutionsPayload: changedFiles.join('\n'),
476
- },
477
- },
478
- };
479
- }
480
-
481
- export async function main(argv = process.argv.slice(2)) {
482
- const values = parseArgv(argv);
483
- const { exitCode, result } = await runEpicAuditPrepare(values);
484
-
485
- if (result.kind === 'help') {
486
- process.stdout.write(result.text);
487
- return;
488
- }
489
- if (result.kind === 'validation-error') {
490
- process.stderr.write(`${result.message}\n${result.help}`);
491
- process.exit(exitCode);
492
- }
493
- process.stdout.write(`${JSON.stringify(result.envelope)}\n`);
494
- if (exitCode !== 0) process.exit(exitCode);
495
- }
496
-
497
- runAsCli(import.meta.url, main, { source: 'epic-audit-prepare' });