mandrel 1.93.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 (463) hide show
  1. package/.agents/README.md +59 -73
  2. package/.agents/agents/acceptance-critic.md +129 -0
  3. package/.agents/agents/story-worker.md +161 -0
  4. package/.agents/docs/SDLC.md +489 -1285
  5. package/.agents/docs/agentrc-reference.json +177 -67
  6. package/.agents/docs/configuration.md +108 -136
  7. package/.agents/docs/execution-reference.md +44 -22
  8. package/.agents/docs/quality-gates.md +13 -19
  9. package/.agents/docs/workflows.md +3 -3
  10. package/.agents/instructions.md +107 -108
  11. package/.agents/rules/ci-remediation.md +8 -12
  12. package/.agents/rules/git-conventions-reference.md +224 -0
  13. package/.agents/rules/git-conventions.md +42 -223
  14. package/.agents/rules/security-baseline.md +5 -0
  15. package/.agents/rules/testing-standards.md +106 -13
  16. package/.agents/schemas/acceptance-eval-verdict.schema.json +1 -1
  17. package/.agents/schemas/agentrc.schema.json +71 -201
  18. package/.agents/schemas/lifecycle/ledger-record.schema.json +1 -1
  19. package/.agents/schemas/lifecycle/retro.end.schema.json +1 -1
  20. package/.agents/schemas/risk-verdict.schema.json +0 -13
  21. package/.agents/scripts/acceptance-eval.js +62 -18
  22. package/.agents/scripts/agents-bootstrap-github.js +1 -1
  23. package/.agents/scripts/analyze-execution.js +1 -1
  24. package/.agents/scripts/audit-to-stories.js +7 -7
  25. package/.agents/scripts/boot-sweep.js +1 -1
  26. package/.agents/scripts/check-context-budget.js +62 -5
  27. package/.agents/scripts/check-lifecycle-lint.js +6 -9
  28. package/.agents/scripts/check-prepush-recovery.js +1 -1
  29. package/.agents/scripts/cleanup-repo-test-temp.js +6 -1
  30. package/.agents/scripts/diagnose-friction.js +0 -6
  31. package/.agents/scripts/lib/Logger.js +6 -10
  32. package/.agents/scripts/lib/audit-suite/runner.js +2 -2
  33. package/.agents/scripts/lib/audit-suite/selector.js +5 -5
  34. package/.agents/scripts/lib/audit-to-stories/{seed-epic-from-findings.js → seed-from-findings.js} +9 -9
  35. package/.agents/scripts/lib/baselines/kernel.js +206 -18
  36. package/.agents/scripts/lib/baselines/kinds/maintainability.js +0 -4
  37. package/.agents/scripts/lib/baselines/reader.js +1 -6
  38. package/.agents/scripts/lib/bdd-runner-detect.js +5 -9
  39. package/.agents/scripts/lib/bootstrap/issue-forms-template.js +32 -33
  40. package/.agents/scripts/lib/bootstrap/project-bootstrap.js +56 -18
  41. package/.agents/scripts/lib/checks/core-bare-clean.js +2 -2
  42. package/.agents/scripts/lib/checks/index.js +2 -1
  43. package/.agents/scripts/lib/checks/story-init-not-backgrounded.js +23 -21
  44. package/.agents/scripts/lib/cli/standard-args.js +13 -22
  45. package/.agents/scripts/lib/cli-args.js +16 -7
  46. package/.agents/scripts/lib/close-validation/gates.js +160 -22
  47. package/.agents/scripts/lib/config/acceptance-eval.js +52 -5
  48. package/.agents/scripts/lib/config/ci.js +6 -31
  49. package/.agents/scripts/lib/config/delivery-routing.js +103 -0
  50. package/.agents/scripts/lib/config/explain.js +57 -36
  51. package/.agents/scripts/lib/config/limits.js +17 -58
  52. package/.agents/scripts/lib/config/paths.js +0 -2
  53. package/.agents/scripts/lib/config/quality.js +1 -1
  54. package/.agents/scripts/lib/config/runners.js +17 -50
  55. package/.agents/scripts/lib/config/temp-paths.js +19 -14
  56. package/.agents/scripts/lib/config/worktree-isolation.js +0 -5
  57. package/.agents/scripts/lib/config-resolver.js +3 -8
  58. package/.agents/scripts/lib/config-settings-schema-delivery.js +46 -136
  59. package/.agents/scripts/lib/config-settings-schema-quality.js +17 -14
  60. package/.agents/scripts/lib/config-settings-schema.js +52 -38
  61. package/.agents/scripts/lib/dependency-parser.js +3 -2
  62. package/.agents/scripts/lib/doc-tiers.js +39 -4
  63. package/.agents/scripts/lib/duplicate-search.js +211 -41
  64. package/.agents/scripts/lib/feedback-loop/retro-proposals-graduator.js +1 -1
  65. package/.agents/scripts/lib/findings/promote-finding.js +5 -5
  66. package/.agents/scripts/lib/framework-version.js +2 -3
  67. package/.agents/scripts/lib/git-branch-cleanup.js +1 -10
  68. package/.agents/scripts/lib/git-branch-lifecycle.js +17 -22
  69. package/.agents/scripts/lib/git-utils.js +32 -6
  70. package/.agents/scripts/lib/github/framework-repo.js +6 -0
  71. package/.agents/scripts/lib/label-constants.js +10 -23
  72. package/.agents/scripts/lib/label-taxonomy.js +9 -43
  73. package/.agents/scripts/lib/observability/active-story-env.js +112 -3
  74. package/.agents/scripts/lib/observability/hook-heartbeat.js +187 -0
  75. package/.agents/scripts/lib/observability/source-classifier.js +3 -3
  76. package/.agents/scripts/lib/observability/tool-trace-hook.js +15 -4
  77. package/.agents/scripts/lib/onboard/init-tail.js +1 -3
  78. package/.agents/scripts/lib/orchestration/acceptance-clusters.js +111 -0
  79. package/.agents/scripts/lib/orchestration/acceptance-eval-decision.js +32 -4
  80. package/.agents/scripts/lib/orchestration/audit-lens-routing.js +128 -0
  81. package/.agents/scripts/lib/orchestration/bookkeeping-outbox.js +273 -0
  82. package/.agents/scripts/lib/orchestration/ceremony-routing.js +204 -0
  83. package/.agents/scripts/lib/orchestration/code-review.js +20 -268
  84. package/.agents/scripts/lib/orchestration/column-sync.js +1 -1
  85. package/.agents/scripts/lib/orchestration/consolidation-precondition.js +1 -1
  86. package/.agents/scripts/lib/orchestration/context-envelope.js +2 -5
  87. package/.agents/scripts/lib/orchestration/docs-digest.js +8 -8
  88. package/.agents/scripts/lib/orchestration/file-assumptions.js +7 -13
  89. package/.agents/scripts/lib/orchestration/git-cleanup/phases/cli.js +1 -1
  90. package/.agents/scripts/lib/orchestration/lifecycle/emit-loop-tick.js +8 -8
  91. package/.agents/scripts/lib/orchestration/lifecycle/emit-story-heartbeat.js +2 -2
  92. package/.agents/scripts/lib/orchestration/lifecycle/ledger-writer.js +6 -3
  93. package/.agents/scripts/lib/orchestration/lifecycle/listeners/README.md +17 -43
  94. package/.agents/scripts/lib/orchestration/lint-baseline-service.js +4 -4
  95. package/.agents/scripts/lib/orchestration/merge-block-class.js +1 -1
  96. package/.agents/scripts/lib/orchestration/phase-runner.js +3 -2
  97. package/.agents/scripts/lib/orchestration/plan-context.js +248 -266
  98. package/.agents/scripts/lib/orchestration/plan-critic-conditions.js +3 -2
  99. package/.agents/scripts/lib/orchestration/plan-critics-evaluate.js +1 -1
  100. package/.agents/scripts/lib/orchestration/plan-navigation.js +92 -0
  101. package/.agents/scripts/lib/orchestration/plan-persist/fan-out-gate.js +61 -0
  102. package/.agents/scripts/lib/orchestration/plan-persist/persist-helpers.js +97 -0
  103. package/.agents/scripts/lib/orchestration/plan-persist/run-plan-persist.js +223 -854
  104. package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +361 -0
  105. package/.agents/scripts/lib/orchestration/plan-persist/summary.js +35 -108
  106. package/.agents/scripts/lib/orchestration/plan-reachability.js +9 -14
  107. package/.agents/scripts/lib/orchestration/plan-runner/worktree-sweep.js +1 -1
  108. package/.agents/scripts/lib/orchestration/{epic-plan-spec/phases → planning}/authoring-context.js +14 -14
  109. package/.agents/scripts/lib/orchestration/planning/decomposer-context.js +27 -0
  110. package/.agents/scripts/lib/orchestration/{epic-plan-spec/phases → planning}/risk-verdict.js +3 -4
  111. package/.agents/scripts/lib/orchestration/post-merge/phases/branch-cleanup.js +2 -2
  112. package/.agents/scripts/lib/orchestration/post-merge/phases/dashboard-refresh.js +8 -20
  113. package/.agents/scripts/lib/orchestration/post-merge/phases/worktree-reap.js +3 -2
  114. package/.agents/scripts/lib/orchestration/pr-base-guard.js +18 -28
  115. package/.agents/scripts/lib/orchestration/preflight-cache.js +5 -5
  116. package/.agents/scripts/lib/orchestration/remote-verifier.js +1 -1
  117. package/.agents/scripts/lib/orchestration/resolve-plan-run.js +155 -0
  118. package/.agents/scripts/lib/orchestration/resolves-token.js +1 -1
  119. package/.agents/scripts/lib/orchestration/retro-perf-heuristics.js +8 -8
  120. package/.agents/scripts/lib/orchestration/retro-proposals.js +140 -79
  121. package/.agents/scripts/lib/orchestration/review-depth.js +26 -12
  122. package/.agents/scripts/lib/orchestration/review-providers/codex.js +2 -2
  123. package/.agents/scripts/lib/orchestration/review-providers/review-provider-factory.js +21 -56
  124. package/.agents/scripts/lib/orchestration/run-epilogue.js +426 -0
  125. package/.agents/scripts/lib/orchestration/single-story-close/phases/auto-merge.js +1 -1
  126. package/.agents/scripts/lib/orchestration/single-story-close/phases/close-validation.js +1 -0
  127. package/.agents/scripts/lib/orchestration/single-story-close/phases/code-review.js +95 -41
  128. package/.agents/scripts/lib/orchestration/single-story-close/phases/options.js +16 -13
  129. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-block.js +40 -0
  130. package/.agents/scripts/lib/orchestration/single-story-close/runner.js +11 -3
  131. package/.agents/scripts/lib/orchestration/spec-freshness.js +14 -205
  132. package/.agents/scripts/lib/orchestration/spec-section-validator.js +4 -5
  133. package/.agents/scripts/lib/orchestration/spec-spill.js +60 -0
  134. package/.agents/scripts/lib/orchestration/split-policy-validator.js +188 -0
  135. package/.agents/scripts/lib/orchestration/story-close/emit-blocked.js +49 -0
  136. package/.agents/scripts/lib/orchestration/story-close/phases/code-review.js +15 -12
  137. package/.agents/scripts/lib/orchestration/story-follow-ups.js +237 -0
  138. package/.agents/scripts/lib/orchestration/story-init-remote.js +47 -0
  139. package/.agents/scripts/lib/orchestration/story-plan-state.js +48 -0
  140. package/.agents/scripts/lib/orchestration/{epic-runner → story-progress}/story-run-progress-writer.js +3 -3
  141. package/.agents/scripts/lib/orchestration/structured-comment-parser.js +1 -1
  142. package/.agents/scripts/lib/orchestration/task-body-validator.js +8 -18
  143. package/.agents/scripts/lib/orchestration/ticket-validator-conflicts.js +11 -61
  144. package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +189 -373
  145. package/.agents/scripts/lib/orchestration/ticket-validator.js +3 -8
  146. package/.agents/scripts/lib/orchestration/ticketing/bulk.js +0 -25
  147. package/.agents/scripts/lib/orchestration/ticketing/reads.js +29 -26
  148. package/.agents/scripts/lib/orchestration/ticketing/transition.js +5 -5
  149. package/.agents/scripts/lib/planning-corpus.js +16 -11
  150. package/.agents/scripts/lib/preflight-runner.js +2 -2
  151. package/.agents/scripts/lib/provider-factory.js +1 -1
  152. package/.agents/scripts/lib/qa/coverage-verdict.js +5 -5
  153. package/.agents/scripts/lib/single-story/confirm-merge-follow-ups.js +36 -0
  154. package/.agents/scripts/lib/single-story-sweep/protection-ctx.js +1 -1
  155. package/.agents/scripts/lib/story-adjacency.js +11 -14
  156. package/.agents/scripts/lib/story-body/story-body.js +124 -70
  157. package/.agents/scripts/lib/story-plan.js +2 -4
  158. package/.agents/scripts/lib/templates/decomposer-prompts.js +46 -45
  159. package/.agents/scripts/lib/templates/spec-author-prompts.js +47 -45
  160. package/.agents/scripts/lib/{epic-body-sections.js → ticket-body-sections.js} +26 -26
  161. package/.agents/scripts/lib/validation-evidence.js +1 -1
  162. package/.agents/scripts/lib/wave-runner/ready-set.js +6 -6
  163. package/.agents/scripts/lib/workspace-provisioner.js +1 -1
  164. package/.agents/scripts/lib/worktree/lifecycle/reap.js +5 -7
  165. package/.agents/scripts/lint-issue-body.js +71 -40
  166. package/.agents/scripts/mandrel-update-preflight.js +1 -1
  167. package/.agents/scripts/notify.js +4 -3
  168. package/.agents/scripts/plan-context.js +64 -74
  169. package/.agents/scripts/plan-persist.js +121 -280
  170. package/.agents/scripts/plan-run-epilogue.js +97 -0
  171. package/.agents/scripts/post-structured-comment.js +38 -0
  172. package/.agents/scripts/providers/github/issues.js +17 -33
  173. package/.agents/scripts/providers/github/mappers.js +0 -12
  174. package/.agents/scripts/providers/github/tickets.js +2 -5
  175. package/.agents/scripts/resolve-plan-run.js +117 -0
  176. package/.agents/scripts/signals-view.js +24 -19
  177. package/.agents/scripts/single-story-close.js +11 -14
  178. package/.agents/scripts/single-story-confirm-merge.js +39 -23
  179. package/.agents/scripts/single-story-init.js +29 -20
  180. package/.agents/scripts/stories-wave-tick.js +6 -6
  181. package/.agents/scripts/story-plan.js +26 -47
  182. package/.agents/scripts/sync-claude-agents.js +165 -0
  183. package/.agents/scripts/update-ticket-state.js +37 -15
  184. package/.agents/skills/core/analyze-execution/SKILL.md +21 -18
  185. package/.agents/skills/core/api-and-interface-design/SKILL.md +5 -3
  186. package/.agents/skills/core/code-review-and-quality/SKILL.md +63 -7
  187. package/.agents/skills/core/debugging-and-error-recovery/SKILL.md +1 -1
  188. package/.agents/skills/core/gates-and-baselines/SKILL.md +149 -0
  189. package/.agents/skills/core/idea-refinement/SKILL.md +8 -14
  190. package/.agents/skills/core/qa-coverage-mapping/SKILL.md +7 -7
  191. package/.agents/skills/core/scope-triage/SKILL.md +28 -172
  192. package/.agents/skills/skills.index.json +8 -418
  193. package/.agents/starter-agentrc.json +0 -5
  194. package/.agents/templates/agent-protocol.md +9 -10
  195. package/.agents/workflows/audit-architecture.md +3 -3
  196. package/.agents/workflows/audit-clean-code.md +3 -3
  197. package/.agents/workflows/audit-dependencies.md +3 -3
  198. package/.agents/workflows/audit-devops.md +3 -3
  199. package/.agents/workflows/audit-documentation.md +5 -5
  200. package/.agents/workflows/audit-lighthouse.md +3 -3
  201. package/.agents/workflows/audit-navigability.md +3 -2
  202. package/.agents/workflows/audit-performance.md +3 -3
  203. package/.agents/workflows/audit-privacy.md +3 -3
  204. package/.agents/workflows/audit-quality.md +3 -3
  205. package/.agents/workflows/audit-security.md +3 -3
  206. package/.agents/workflows/audit-seo.md +3 -3
  207. package/.agents/workflows/audit-sre.md +3 -3
  208. package/.agents/workflows/audit-to-stories.md +20 -20
  209. package/.agents/workflows/audit-ux-ui.md +3 -3
  210. package/.agents/workflows/deliver.md +122 -131
  211. package/.agents/workflows/git-cleanup.md +3 -4
  212. package/.agents/workflows/helpers/_merge-conflict-template.md +1 -1
  213. package/.agents/workflows/helpers/acceptance-self-eval.md +52 -40
  214. package/.agents/workflows/helpers/code-review.md +70 -193
  215. package/.agents/workflows/helpers/{single-story-deliver-reference.md → deliver-story-reference.md} +12 -14
  216. package/.agents/workflows/helpers/{single-story-deliver.md → deliver-story.md} +113 -139
  217. package/.agents/workflows/helpers/diagnose.md +10 -10
  218. package/.agents/workflows/helpers/mandrel-sync-config.md +1 -1
  219. package/.agents/workflows/helpers/parallel-tooling.md +1 -1
  220. package/.agents/workflows/helpers/signals.md +16 -16
  221. package/.agents/workflows/helpers/worktree-lifecycle.md +48 -64
  222. package/.agents/workflows/mandrel-update.md +3 -2
  223. package/.agents/workflows/plan.md +112 -145
  224. package/.agents/workflows/qa-assist.md +24 -30
  225. package/.agents/workflows/qa-explore.md +29 -38
  226. package/.agents/workflows/qa-run.md +2 -2
  227. package/README.md +9 -8
  228. package/docs/CHANGELOG.md +46 -0
  229. package/lib/cli/registry.js +95 -0
  230. package/lib/migrations/index.js +6 -5
  231. package/package.json +5 -3
  232. package/.agents/personas/architect.md +0 -113
  233. package/.agents/personas/devops-engineer.md +0 -38
  234. package/.agents/personas/engineer-mobile.md +0 -120
  235. package/.agents/personas/engineer-web.md +0 -111
  236. package/.agents/personas/engineer.md +0 -119
  237. package/.agents/personas/product.md +0 -94
  238. package/.agents/personas/project-manager.md +0 -114
  239. package/.agents/personas/qa-engineer.md +0 -95
  240. package/.agents/personas/refactorer.md +0 -113
  241. package/.agents/personas/security-engineer.md +0 -112
  242. package/.agents/personas/sre.md +0 -86
  243. package/.agents/personas/technical-writer.md +0 -101
  244. package/.agents/personas/ux-designer.md +0 -95
  245. package/.agents/schemas/dispatch-manifest.json +0 -232
  246. package/.agents/schemas/epic-spec.schema.json +0 -153
  247. package/.agents/scripts/acceptance-spec-reconciler.js +0 -642
  248. package/.agents/scripts/dispatcher.js +0 -295
  249. package/.agents/scripts/epic-audit-prepare.js +0 -497
  250. package/.agents/scripts/epic-audit-recheck.js +0 -274
  251. package/.agents/scripts/epic-deliver-note-intervention.js +0 -192
  252. package/.agents/scripts/epic-deliver-preflight.js +0 -462
  253. package/.agents/scripts/epic-deliver-prepare.js +0 -590
  254. package/.agents/scripts/epic-execute-record-wave.js +0 -449
  255. package/.agents/scripts/epic-plan-clarity.js +0 -211
  256. package/.agents/scripts/epic-plan-decompose.js +0 -54
  257. package/.agents/scripts/epic-plan-healthcheck.js +0 -581
  258. package/.agents/scripts/epic-plan-spec.js +0 -64
  259. package/.agents/scripts/epic-reconcile.js +0 -625
  260. package/.agents/scripts/lib/baseline-snapshot.js +0 -979
  261. package/.agents/scripts/lib/checks/epic-merge-lock-stale.js +0 -54
  262. package/.agents/scripts/lib/checks/stale-origin-epic.js +0 -49
  263. package/.agents/scripts/lib/config/lifecycle.js +0 -40
  264. package/.agents/scripts/lib/config/preflight.js +0 -58
  265. package/.agents/scripts/lib/config/retro.js +0 -77
  266. package/.agents/scripts/lib/epic-merge-lock.js +0 -322
  267. package/.agents/scripts/lib/epic-plan-clarity.js +0 -181
  268. package/.agents/scripts/lib/epic-plan-ideation.js +0 -261
  269. package/.agents/scripts/lib/orchestration/context-hydration-engine.js +0 -660
  270. package/.agents/scripts/lib/orchestration/dispatch-engine.js +0 -134
  271. package/.agents/scripts/lib/orchestration/dispatch-pipeline.js +0 -183
  272. package/.agents/scripts/lib/orchestration/epic-cleanup.js +0 -801
  273. package/.agents/scripts/lib/orchestration/epic-deliver-lease-guard.js +0 -310
  274. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/context.js +0 -163
  275. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/creation.js +0 -140
  276. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/dag.js +0 -64
  277. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/diagnostics.js +0 -72
  278. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/persist-helpers.js +0 -156
  279. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/persist.js +0 -345
  280. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/planning-artifacts.js +0 -41
  281. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/reconcile-spawn.js +0 -86
  282. package/.agents/scripts/lib/orchestration/epic-plan-lease-guard.js +0 -391
  283. package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/drain.js +0 -94
  284. package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/plan-epic.js +0 -236
  285. package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/run-spec-phase.js +0 -307
  286. package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/spec-freshness.js +0 -117
  287. package/.agents/scripts/lib/orchestration/epic-plan-state-store.js +0 -117
  288. package/.agents/scripts/lib/orchestration/epic-run-state-store.js +0 -388
  289. package/.agents/scripts/lib/orchestration/epic-runner/concurrency-gate.js +0 -186
  290. package/.agents/scripts/lib/orchestration/epic-runner/deliver-phases.js +0 -50
  291. package/.agents/scripts/lib/orchestration/epic-runner/phases/build-wave-dag.js +0 -129
  292. package/.agents/scripts/lib/orchestration/epic-runner/phases/snapshot.js +0 -103
  293. package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter/composition.js +0 -267
  294. package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter/signals.js +0 -210
  295. package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter/transport.js +0 -238
  296. package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/_bullet-format.js +0 -32
  297. package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/component-drift.js +0 -203
  298. package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/crap-drift.js +0 -227
  299. package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/maintainability-drift.js +0 -117
  300. package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/stalled-worktree.js +0 -37
  301. package/.agents/scripts/lib/orchestration/epic-runner/story-launcher.js +0 -127
  302. package/.agents/scripts/lib/orchestration/epic-runner/sub-agent-return.js +0 -276
  303. package/.agents/scripts/lib/orchestration/epic-runner/wave-scheduler.js +0 -66
  304. package/.agents/scripts/lib/orchestration/epic-spec-reconciler-apply.js +0 -789
  305. package/.agents/scripts/lib/orchestration/epic-spec-reconciler-diff.js +0 -676
  306. package/.agents/scripts/lib/orchestration/epic-spec-reconciler-discriminator.js +0 -389
  307. package/.agents/scripts/lib/orchestration/epic-spec-reconciler-format.js +0 -230
  308. package/.agents/scripts/lib/orchestration/epic-spec-reconciler-ops.js +0 -361
  309. package/.agents/scripts/lib/orchestration/finalize/open-or-locate-pr.js +0 -306
  310. package/.agents/scripts/lib/orchestration/finalize/post-handoff-comment.js +0 -489
  311. package/.agents/scripts/lib/orchestration/finalize/sanitize-skip-ci.js +0 -88
  312. package/.agents/scripts/lib/orchestration/lifecycle/emit-story-dispatch-end.js +0 -147
  313. package/.agents/scripts/lib/orchestration/lifecycle/listeners/acceptance-reconciler.js +0 -384
  314. package/.agents/scripts/lib/orchestration/lifecycle/listeners/automerge-armer.js +0 -501
  315. package/.agents/scripts/lib/orchestration/lifecycle/listeners/automerge-predicate.js +0 -984
  316. package/.agents/scripts/lib/orchestration/lifecycle/listeners/branch-cleaner.js +0 -264
  317. package/.agents/scripts/lib/orchestration/lifecycle/listeners/checkpoint-pointer-writer.js +0 -278
  318. package/.agents/scripts/lib/orchestration/lifecycle/listeners/cleaner.js +0 -355
  319. package/.agents/scripts/lib/orchestration/lifecycle/listeners/finalizer.js +0 -673
  320. package/.agents/scripts/lib/orchestration/lifecycle/listeners/index.js +0 -378
  321. package/.agents/scripts/lib/orchestration/lifecycle/listeners/intervention-recorder.js +0 -140
  322. package/.agents/scripts/lib/orchestration/lifecycle/listeners/label-transitioner.js +0 -144
  323. package/.agents/scripts/lib/orchestration/lifecycle/listeners/notify-dispatcher.js +0 -174
  324. package/.agents/scripts/lib/orchestration/manifest-builder.js +0 -222
  325. package/.agents/scripts/lib/orchestration/plan-persist/amend.js +0 -359
  326. package/.agents/scripts/lib/orchestration/plan-persist/delivery-mode.js +0 -127
  327. package/.agents/scripts/lib/orchestration/post-merge-pipeline.js +0 -205
  328. package/.agents/scripts/lib/orchestration/recurring-failure-detector.js +0 -152
  329. package/.agents/scripts/lib/orchestration/retro/phases/checks.js +0 -94
  330. package/.agents/scripts/lib/orchestration/retro/phases/compose-body.js +0 -571
  331. package/.agents/scripts/lib/orchestration/retro/phases/gather-signals.js +0 -450
  332. package/.agents/scripts/lib/orchestration/retro/phases/post-and-mirror.js +0 -191
  333. package/.agents/scripts/lib/orchestration/retro-heuristics.js +0 -57
  334. package/.agents/scripts/lib/orchestration/retro-runner.js +0 -197
  335. package/.agents/scripts/lib/orchestration/skill-capsule-loader.js +0 -109
  336. package/.agents/scripts/lib/orchestration/spec-renderer.js +0 -447
  337. package/.agents/scripts/lib/orchestration/story-close/auto-refresh-runner.js +0 -747
  338. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/gate-failure.js +0 -211
  339. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/pre-merge-attribution.js +0 -158
  340. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/refresh-commit.js +0 -446
  341. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/regression-projection.js +0 -297
  342. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/scope-discovery.js +0 -48
  343. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution-wiring.js +0 -67
  344. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution.js +0 -161
  345. package/.agents/scripts/lib/orchestration/story-close/baseline-friction-body.js +0 -117
  346. package/.agents/scripts/lib/orchestration/story-close/cd-out-guard.js +0 -86
  347. package/.agents/scripts/lib/orchestration/story-close/cleanup-reconciler.js +0 -147
  348. package/.agents/scripts/lib/orchestration/story-close/close-inputs.js +0 -142
  349. package/.agents/scripts/lib/orchestration/story-close/comment-bodies.js +0 -62
  350. package/.agents/scripts/lib/orchestration/story-close/merge-runner.js +0 -658
  351. package/.agents/scripts/lib/orchestration/story-close/merge-subject.js +0 -198
  352. package/.agents/scripts/lib/orchestration/story-close/phases/branch-restore.js +0 -105
  353. package/.agents/scripts/lib/orchestration/story-close/phases/close.js +0 -222
  354. package/.agents/scripts/lib/orchestration/story-close/phases/gates.js +0 -292
  355. package/.agents/scripts/lib/orchestration/story-close/phases/locked-pipeline.js +0 -270
  356. package/.agents/scripts/lib/orchestration/story-close/phases/preflight.js +0 -110
  357. package/.agents/scripts/lib/orchestration/story-close/phases/refresh.js +0 -86
  358. package/.agents/scripts/lib/orchestration/story-close/phases/timeout-blocked-emitter.js +0 -112
  359. package/.agents/scripts/lib/orchestration/story-close/phases/timeout-blocked.js +0 -157
  360. package/.agents/scripts/lib/orchestration/story-close/post-merge-close.js +0 -421
  361. package/.agents/scripts/lib/orchestration/story-close/pre-merge-validation.js +0 -301
  362. package/.agents/scripts/lib/orchestration/story-close/shared-checkout-guard.js +0 -163
  363. package/.agents/scripts/lib/orchestration/story-close-recovery.js +0 -690
  364. package/.agents/scripts/lib/orchestration/wave-marker.js +0 -28
  365. package/.agents/scripts/lib/orchestration/wave-record-io.js +0 -218
  366. package/.agents/scripts/lib/orchestration/wave-record-notifications.js +0 -145
  367. package/.agents/scripts/lib/orchestration/wave-record-projection.js +0 -212
  368. package/.agents/scripts/lib/presentation/dispatch-manifest-render.js +0 -111
  369. package/.agents/scripts/lib/presentation/manifest-builder.js +0 -239
  370. package/.agents/scripts/lib/presentation/manifest-formatter.js +0 -242
  371. package/.agents/scripts/lib/presentation/manifest-helpers.js +0 -213
  372. package/.agents/scripts/lib/presentation/manifest-persistence.js +0 -261
  373. package/.agents/scripts/lib/presentation/manifest-procedures.js +0 -55
  374. package/.agents/scripts/lib/presentation/manifest-render-waves.js +0 -306
  375. package/.agents/scripts/lib/presentation/manifest-renderer.js +0 -188
  376. package/.agents/scripts/lib/presentation/manifest-story-views.js +0 -110
  377. package/.agents/scripts/lib/push-epic-retry.js +0 -209
  378. package/.agents/scripts/lib/spec/index.js +0 -36
  379. package/.agents/scripts/lib/spec/loader.js +0 -425
  380. package/.agents/scripts/lib/spec/state.js +0 -208
  381. package/.agents/scripts/lib/story-init/blocker-validator.js +0 -68
  382. package/.agents/scripts/lib/story-init/branch-initializer.js +0 -408
  383. package/.agents/scripts/lib/story-init/context-resolver.js +0 -92
  384. package/.agents/scripts/lib/story-init/donor-precheck.js +0 -207
  385. package/.agents/scripts/lib/story-init/state-transitioner.js +0 -80
  386. package/.agents/scripts/lib/story-init/task-graph-builder.js +0 -124
  387. package/.agents/scripts/lib/story-init/transition-summary.js +0 -34
  388. package/.agents/scripts/lib/test-reserved-epic-temp-ids.js +0 -35
  389. package/.agents/scripts/lib/wave-runner/tick.js +0 -754
  390. package/.agents/scripts/lib/wave-runner/wave-runner-error.js +0 -20
  391. package/.agents/scripts/lifecycle-emit-story-dispatch.js +0 -194
  392. package/.agents/scripts/lifecycle-emit.js +0 -510
  393. package/.agents/scripts/plan-critics.js +0 -199
  394. package/.agents/scripts/retro-run.js +0 -218
  395. package/.agents/scripts/standalone-feedback-rollup.js +0 -188
  396. package/.agents/scripts/story-close.js +0 -294
  397. package/.agents/scripts/story-init.js +0 -599
  398. package/.agents/scripts/story-phase.js +0 -369
  399. package/.agents/scripts/wave-tick.js +0 -335
  400. package/.agents/skills/core/baseline-refresh/SKILL.md +0 -181
  401. package/.agents/skills/core/ci-cd-and-automation/SKILL.md +0 -274
  402. package/.agents/skills/core/ci-cd-and-automation/examples.md +0 -211
  403. package/.agents/skills/core/code-simplification/SKILL.md +0 -389
  404. package/.agents/skills/core/context-engineering/SKILL.md +0 -309
  405. package/.agents/skills/core/context-engineering/examples.md +0 -58
  406. package/.agents/skills/core/deprecation-and-migration/SKILL.md +0 -250
  407. package/.agents/skills/core/epic-plan-consolidate/SKILL.md +0 -172
  408. package/.agents/skills/core/epic-plan-consolidate/examples.md +0 -51
  409. package/.agents/skills/core/epic-plan-decompose-author/SKILL.md +0 -441
  410. package/.agents/skills/core/epic-plan-decompose-author/examples.md +0 -47
  411. package/.agents/skills/core/epic-plan-premortem/SKILL.md +0 -146
  412. package/.agents/skills/core/epic-plan-premortem/examples.md +0 -53
  413. package/.agents/skills/core/epic-plan-spec-author/SKILL.md +0 -413
  414. package/.agents/skills/core/epic-plan-spec-author/examples.md +0 -91
  415. package/.agents/skills/core/frontend-ui-engineering/SKILL.md +0 -357
  416. package/.agents/skills/core/hydrate-context/SKILL.md +0 -123
  417. package/.agents/skills/core/idea-refinement/examples.md +0 -437
  418. package/.agents/skills/core/idea-refinement/frameworks.md +0 -135
  419. package/.agents/skills/core/incremental-implementation/SKILL.md +0 -271
  420. package/.agents/skills/core/introducing-a-baseline-gate/SKILL.md +0 -213
  421. package/.agents/skills/core/knowledge-transfer/SKILL.md +0 -180
  422. package/.agents/skills/core/mutation-survivor-remediation/SKILL.md +0 -117
  423. package/.agents/skills/core/performance-optimization/SKILL.md +0 -314
  424. package/.agents/skills/core/planning-and-task-breakdown/SKILL.md +0 -277
  425. package/.agents/skills/core/property-based-testing/SKILL.md +0 -148
  426. package/.agents/skills/core/refactoring-discipline/SKILL.md +0 -111
  427. package/.agents/skills/core/shipping-and-launch/SKILL.md +0 -328
  428. package/.agents/skills/core/spec-driven-development/SKILL.md +0 -252
  429. package/.agents/skills/core/test-driven-development/SKILL.md +0 -475
  430. package/.agents/skills/core/using-agent-skills/SKILL.md +0 -232
  431. package/.agents/skills/stack/architecture/monorepo-path-strategist/SKILL.md +0 -31
  432. package/.agents/skills/stack/architecture/structured-output-zod/SKILL.md +0 -51
  433. package/.agents/skills/stack/architecture/subagent-orchestration/SKILL.md +0 -76
  434. package/.agents/skills/stack/backend/cloudflare-hono-architect/SKILL.md +0 -31
  435. package/.agents/skills/stack/backend/cloudflare-hono-architect/examples/route-template.ts +0 -33
  436. package/.agents/skills/stack/backend/cloudflare-queue-manager/SKILL.md +0 -31
  437. package/.agents/skills/stack/backend/cloudflare-workers/SKILL.md +0 -51
  438. package/.agents/skills/stack/backend/highlevel-crm/SKILL.md +0 -54
  439. package/.agents/skills/stack/backend/sqlite-drizzle-expert/SKILL.md +0 -29
  440. package/.agents/skills/stack/backend/sqlite-drizzle-expert/examples/schema-template.ts +0 -30
  441. package/.agents/skills/stack/backend/stripe-integration/SKILL.md +0 -57
  442. package/.agents/skills/stack/backend/stripe-integration/scripts/listen-stripe.sh +0 -9
  443. package/.agents/skills/stack/backend/turso-sqlite/SKILL.md +0 -48
  444. package/.agents/skills/stack/frontend/astro/SKILL.md +0 -62
  445. package/.agents/skills/stack/frontend/astro-react-island-strategist/SKILL.md +0 -30
  446. package/.agents/skills/stack/frontend/expo-react-native-developer/SKILL.md +0 -29
  447. package/.agents/skills/stack/frontend/google-analytics-v4/SKILL.md +0 -50
  448. package/.agents/skills/stack/frontend/tailwind-v4/SKILL.md +0 -58
  449. package/.agents/skills/stack/frontend/ui-accessibility-engineer/SKILL.md +0 -34
  450. package/.agents/skills/stack/qa/audit-accessibility/SKILL.md +0 -51
  451. package/.agents/skills/stack/qa/lighthouse-baseline/SKILL.md +0 -199
  452. package/.agents/skills/stack/security/backend-security-patterns/SKILL.md +0 -68
  453. package/.agents/workflows/helpers/deliver-epic-reference.md +0 -534
  454. package/.agents/workflows/helpers/deliver-epic.md +0 -955
  455. package/.agents/workflows/helpers/deliver-stories.md +0 -440
  456. package/.agents/workflows/helpers/epic-audit.md +0 -189
  457. package/.agents/workflows/helpers/epic-deliver-story.md +0 -427
  458. package/.agents/workflows/helpers/epic-testing.md +0 -125
  459. package/.agents/workflows/helpers/plan-epic-reference.md +0 -160
  460. package/.agents/workflows/helpers/plan-epic.md +0 -351
  461. package/.agents/workflows/helpers/plan-story.md +0 -251
  462. package/.agents/workflows/helpers/scope-triage-gate.md +0 -108
  463. /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' });