mandrel 1.94.0 → 2.1.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 (560) hide show
  1. package/.agents/README.md +116 -99
  2. package/.agents/agents/acceptance-critic.md +9 -7
  3. package/.agents/agents/story-worker.md +45 -51
  4. package/.agents/audit-checklists/performance.md +1 -1
  5. package/.agents/docs/SDLC.md +498 -1287
  6. package/.agents/docs/agentrc-reference.json +185 -80
  7. package/.agents/docs/configuration.md +132 -190
  8. package/.agents/docs/execution-reference.md +51 -25
  9. package/.agents/docs/quality-gates.md +25 -33
  10. package/.agents/docs/workflows.md +8 -8
  11. package/.agents/instructions.md +113 -139
  12. package/.agents/rules/ci-remediation.md +11 -15
  13. package/.agents/rules/git-conventions-reference.md +48 -58
  14. package/.agents/rules/git-conventions.md +16 -22
  15. package/.agents/schemas/acceptance-eval-verdict.schema.json +1 -1
  16. package/.agents/schemas/agentrc.schema.json +83 -254
  17. package/.agents/schemas/audit-rules.json +59 -1
  18. package/.agents/schemas/audit-rules.schema.json +33 -1
  19. package/.agents/schemas/lifecycle/README.md +1 -2
  20. package/.agents/schemas/lifecycle/ledger-record.schema.json +1 -1
  21. package/.agents/schemas/lifecycle/merge.flip-failed.schema.json +33 -0
  22. package/.agents/schemas/lifecycle/merge.unlanded.schema.json +1 -0
  23. package/.agents/schemas/lifecycle/retro.end.schema.json +1 -1
  24. package/.agents/schemas/lifecycle/story.merged.schema.json +1 -1
  25. package/.agents/schemas/signal-event.schema.json +3 -3
  26. package/.agents/schemas/story-deliver-terminal.schema.json +152 -0
  27. package/.agents/schemas/validation-evidence.schema.json +1 -1
  28. package/.agents/scripts/acceptance-eval.js +22 -66
  29. package/.agents/scripts/agents-bootstrap-github.js +1 -1
  30. package/.agents/scripts/audit-to-stories.js +7 -7
  31. package/.agents/scripts/boot-sweep.js +1 -1
  32. package/.agents/scripts/bootstrap.js +3 -3
  33. package/.agents/scripts/check-dead-exports.js +43 -104
  34. package/.agents/scripts/check-doc-links.js +2 -2
  35. package/.agents/scripts/check-lifecycle-lint.js +7 -10
  36. package/.agents/scripts/check-workflow-cli-lint.js +91 -0
  37. package/.agents/scripts/cleanup-repo-test-temp.js +6 -1
  38. package/.agents/scripts/deliver-recover.js +122 -0
  39. package/.agents/scripts/drain-pending-cleanup.js +1 -1
  40. package/.agents/scripts/evidence-gate.js +20 -50
  41. package/.agents/scripts/generate-skills-index.js +17 -1
  42. package/.agents/scripts/generate-workflows-doc.js +4 -4
  43. package/.agents/scripts/lib/ITicketingProvider.js +1 -19
  44. package/.agents/scripts/lib/Logger.js +6 -10
  45. package/.agents/scripts/lib/audit-suite/runner.js +2 -2
  46. package/.agents/scripts/lib/audit-suite/selector.js +328 -28
  47. package/.agents/scripts/lib/audit-to-stories/{seed-epic-from-findings.js → seed-from-findings.js} +9 -9
  48. package/.agents/scripts/lib/baselines/kernel.js +206 -18
  49. package/.agents/scripts/lib/baselines/kinds/maintainability.js +0 -15
  50. package/.agents/scripts/lib/baselines/reader.js +1 -6
  51. package/.agents/scripts/lib/bdd-runner-detect.js +5 -9
  52. package/.agents/scripts/lib/bootstrap/ci-workflow-template.js +28 -33
  53. package/.agents/scripts/lib/bootstrap/issue-forms-template.js +32 -33
  54. package/.agents/scripts/lib/bootstrap/manifest.js +8 -11
  55. package/.agents/scripts/lib/bootstrap/project-bootstrap.js +30 -53
  56. package/.agents/scripts/lib/bootstrap/quality-bootstrap.js +0 -2
  57. package/.agents/scripts/lib/checks/core-bare-clean.js +6 -3
  58. package/.agents/scripts/lib/checks/index.js +3 -2
  59. package/.agents/scripts/lib/checks/loop-health.js +12 -11
  60. package/.agents/scripts/lib/checks/state.js +17 -248
  61. package/.agents/scripts/lib/checks/story-init-not-backgrounded.js +26 -24
  62. package/.agents/scripts/lib/checks/subagent-agent-tool-required.js +3 -4
  63. package/.agents/scripts/lib/checks/worktree-bootstrap-env.js +2 -2
  64. package/.agents/scripts/lib/checks/worktree-residue-biome.js +3 -3
  65. package/.agents/scripts/lib/cli/standard-args.js +13 -22
  66. package/.agents/scripts/lib/cli-args.js +39 -9
  67. package/.agents/scripts/lib/close-validation/gates.js +15 -15
  68. package/.agents/scripts/lib/close-validation/projections/inputs.js +7 -7
  69. package/.agents/scripts/lib/close-validation/projections/maintainability.js +12 -12
  70. package/.agents/scripts/lib/close-validation/runner.js +13 -21
  71. package/.agents/scripts/lib/close-validation/telemetry.js +17 -8
  72. package/.agents/scripts/lib/config/ci.js +6 -31
  73. package/.agents/scripts/lib/config/delivery-routing.js +52 -35
  74. package/.agents/scripts/lib/config/explain.js +61 -48
  75. package/.agents/scripts/lib/config/github.js +7 -5
  76. package/.agents/scripts/lib/config/limits.js +29 -80
  77. package/.agents/scripts/lib/config/paths.js +0 -2
  78. package/.agents/scripts/lib/config/quality.js +12 -15
  79. package/.agents/scripts/lib/config/runners.js +20 -66
  80. package/.agents/scripts/lib/config/temp-paths.js +30 -63
  81. package/.agents/scripts/lib/config/worktree-isolation.js +0 -5
  82. package/.agents/scripts/lib/config-resolver.js +2 -7
  83. package/.agents/scripts/lib/config-settings-schema-delivery.js +55 -161
  84. package/.agents/scripts/lib/config-settings-schema-quality.js +17 -16
  85. package/.agents/scripts/lib/config-settings-schema.js +100 -60
  86. package/.agents/scripts/lib/dead-exports-knip.js +105 -0
  87. package/.agents/scripts/lib/dead-exports-mode.js +51 -0
  88. package/.agents/scripts/lib/dependency-parser.js +3 -2
  89. package/.agents/scripts/lib/doc-tiers.js +2 -2
  90. package/.agents/scripts/lib/duplicate-search.js +242 -41
  91. package/.agents/scripts/lib/feedback-loop/retro-proposals-graduator.js +1 -1
  92. package/.agents/scripts/lib/findings/promote-finding.js +23 -14
  93. package/.agents/scripts/lib/format-generated-json.js +97 -0
  94. package/.agents/scripts/lib/framework-version.js +19 -190
  95. package/.agents/scripts/lib/gh-exec.js +8 -0
  96. package/.agents/scripts/lib/git-branch-cleanup.js +1 -10
  97. package/.agents/scripts/lib/git-branch-lifecycle.js +17 -180
  98. package/.agents/scripts/lib/git-utils.js +32 -20
  99. package/.agents/scripts/lib/github/framework-repo.js +6 -0
  100. package/.agents/scripts/lib/json-utils.js +1 -2
  101. package/.agents/scripts/lib/label-constants.js +10 -38
  102. package/.agents/scripts/lib/label-taxonomy.js +10 -55
  103. package/.agents/scripts/lib/observability/active-story-env.js +44 -165
  104. package/.agents/scripts/lib/observability/runtime-friction.js +243 -0
  105. package/.agents/scripts/lib/observability/signal-validator.js +4 -4
  106. package/.agents/scripts/lib/observability/signals-writer.js +6 -82
  107. package/.agents/scripts/lib/observability/source-classifier.js +5 -5
  108. package/.agents/scripts/lib/observability/tool-trace-hook.js +2 -12
  109. package/.agents/scripts/lib/onboard/init-tail.js +1 -3
  110. package/.agents/scripts/lib/orchestration/acceptance-clusters.js +1 -1
  111. package/.agents/scripts/lib/orchestration/acceptance-eval-decision.js +2 -2
  112. package/.agents/scripts/lib/orchestration/ceremony-routing.js +105 -44
  113. package/.agents/scripts/lib/orchestration/code-review.js +78 -436
  114. package/.agents/scripts/lib/orchestration/column-sync.js +1 -1
  115. package/.agents/scripts/lib/orchestration/consolidation-precondition.js +4 -4
  116. package/.agents/scripts/lib/orchestration/context-envelope.js +2 -5
  117. package/.agents/scripts/lib/orchestration/deliver-recover.js +328 -0
  118. package/.agents/scripts/lib/orchestration/detectors-phase.js +12 -6
  119. package/.agents/scripts/lib/orchestration/docs-digest.js +8 -8
  120. package/.agents/scripts/lib/orchestration/file-assumptions.js +7 -13
  121. package/.agents/scripts/lib/orchestration/git-cleanup/phases/cli.js +1 -1
  122. package/.agents/scripts/lib/orchestration/git-cleanup/phases/fast-forward.js +34 -0
  123. package/.agents/scripts/lib/orchestration/lease-guard-shared.js +3 -2
  124. package/.agents/scripts/lib/orchestration/lifecycle/emit-ledger-event.js +142 -0
  125. package/.agents/scripts/lib/orchestration/lifecycle/emit-loop-tick.js +17 -19
  126. package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-flip-failed.js +86 -0
  127. package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-unlanded.js +37 -103
  128. package/.agents/scripts/lib/orchestration/lifecycle/ledger-writer.js +6 -3
  129. package/.agents/scripts/lib/orchestration/lifecycle/listeners/README.md +21 -43
  130. package/.agents/scripts/lib/orchestration/lifecycle/listeners/watcher.js +50 -85
  131. package/.agents/scripts/lib/orchestration/lifecycle/trace-logger.js +3 -14
  132. package/.agents/scripts/lib/orchestration/lint-baseline-service.js +4 -4
  133. package/.agents/scripts/lib/orchestration/merge-block-class.js +77 -21
  134. package/.agents/scripts/lib/orchestration/merge-poll.js +104 -0
  135. package/.agents/scripts/lib/orchestration/phase-runner.js +3 -2
  136. package/.agents/scripts/lib/orchestration/plan-context.js +354 -282
  137. package/.agents/scripts/lib/orchestration/plan-critic-conditions.js +11 -22
  138. package/.agents/scripts/lib/orchestration/plan-critics-evaluate.js +4 -8
  139. package/.agents/scripts/lib/orchestration/plan-metrics.js +38 -6
  140. package/.agents/scripts/lib/orchestration/plan-navigation.js +92 -0
  141. package/.agents/scripts/lib/orchestration/plan-persist/fan-out-gate.js +71 -0
  142. package/.agents/scripts/lib/orchestration/plan-persist/persist-helpers.js +245 -0
  143. package/.agents/scripts/lib/orchestration/plan-persist/plan-context-source.js +116 -0
  144. package/.agents/scripts/lib/orchestration/plan-persist/run-plan-persist.js +432 -858
  145. package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +778 -0
  146. package/.agents/scripts/lib/orchestration/plan-persist/summary.js +47 -115
  147. package/.agents/scripts/lib/orchestration/plan-persist/supersede-ops.js +509 -0
  148. package/.agents/scripts/lib/orchestration/plan-reachability.js +9 -14
  149. package/.agents/scripts/lib/orchestration/plan-runner/worktree-sweep.js +1 -1
  150. package/.agents/scripts/lib/orchestration/{epic-plan-spec/phases → planning}/authoring-context.js +52 -51
  151. package/.agents/scripts/lib/orchestration/planning/decomposer-context.js +27 -0
  152. package/.agents/scripts/lib/orchestration/{epic-plan-spec/phases → planning}/spec-authoring-grounding.js +1 -1
  153. package/.agents/scripts/lib/orchestration/pr-base-guard.js +18 -28
  154. package/.agents/scripts/lib/orchestration/remote-verifier.js +1 -1
  155. package/.agents/scripts/lib/orchestration/resolve-stories.js +344 -0
  156. package/.agents/scripts/lib/orchestration/resolves-token.js +1 -1
  157. package/.agents/scripts/lib/orchestration/retro-proposals.js +140 -79
  158. package/.agents/scripts/lib/orchestration/review-depth.js +126 -47
  159. package/.agents/scripts/lib/orchestration/review-providers/codex.js +2 -2
  160. package/.agents/scripts/lib/orchestration/review-providers/findings-renderer.js +3 -13
  161. package/.agents/scripts/lib/orchestration/review-providers/native.js +1 -154
  162. package/.agents/scripts/lib/orchestration/review-providers/review-depth.js +3 -2
  163. package/.agents/scripts/lib/orchestration/review-providers/review-provider-factory.js +21 -56
  164. package/.agents/scripts/lib/orchestration/review-providers/security-review.js +1 -1
  165. package/.agents/scripts/lib/orchestration/review-providers/types.js +5 -4
  166. package/.agents/scripts/lib/orchestration/review-providers/ultrareview.js +1 -1
  167. package/.agents/scripts/lib/orchestration/run-epilogue.js +784 -0
  168. package/.agents/scripts/lib/orchestration/single-story-close/phases/auto-merge.js +25 -1
  169. package/.agents/scripts/lib/orchestration/single-story-close/phases/base-sync.js +11 -9
  170. package/.agents/scripts/lib/orchestration/single-story-close/phases/close-validation.js +4 -4
  171. package/.agents/scripts/lib/orchestration/single-story-close/phases/code-review.js +86 -41
  172. package/.agents/scripts/lib/orchestration/single-story-close/phases/confirm-merge.js +608 -152
  173. package/.agents/scripts/lib/orchestration/single-story-close/phases/options.js +77 -32
  174. package/.agents/scripts/lib/orchestration/single-story-close/phases/post-land.js +305 -0
  175. package/.agents/scripts/lib/orchestration/single-story-close/phases/pull-request.js +1 -1
  176. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-block.js +44 -0
  177. package/.agents/scripts/lib/orchestration/single-story-close/phases/worktree-reap.js +37 -4
  178. package/.agents/scripts/lib/orchestration/single-story-close/phases/wrong-tree-guard.js +2 -2
  179. package/.agents/scripts/lib/orchestration/single-story-close/runner.js +275 -46
  180. package/.agents/scripts/lib/orchestration/single-story-lease-guard.js +1 -1
  181. package/.agents/scripts/lib/orchestration/spec-freshness.js +14 -205
  182. package/.agents/scripts/lib/orchestration/spec-section-validator.js +4 -5
  183. package/.agents/scripts/lib/orchestration/spec-spill.js +60 -0
  184. package/.agents/scripts/lib/orchestration/split-policy-validator.js +188 -0
  185. package/.agents/scripts/lib/orchestration/story-close/emit-blocked.js +49 -0
  186. package/.agents/scripts/lib/orchestration/story-close/format-autofix.js +10 -10
  187. package/.agents/scripts/lib/orchestration/story-close/phases/code-review.js +28 -42
  188. package/.agents/scripts/lib/orchestration/story-deliver-terminal.js +360 -0
  189. package/.agents/scripts/lib/orchestration/story-follow-ups.js +298 -0
  190. package/.agents/scripts/lib/orchestration/story-init-remote.js +51 -0
  191. package/.agents/scripts/lib/orchestration/story-plan-state.js +33 -0
  192. package/.agents/scripts/lib/orchestration/structured-comment-parser.js +1 -1
  193. package/.agents/scripts/lib/orchestration/task-body-validator.js +60 -25
  194. package/.agents/scripts/lib/orchestration/ticket-lease.js +27 -74
  195. package/.agents/scripts/lib/orchestration/ticket-validator-conflicts.js +130 -75
  196. package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +192 -377
  197. package/.agents/scripts/lib/orchestration/ticket-validator.js +123 -25
  198. package/.agents/scripts/lib/orchestration/ticketing/bulk.js +14 -72
  199. package/.agents/scripts/lib/orchestration/ticketing/reads.js +45 -55
  200. package/.agents/scripts/lib/orchestration/ticketing/transition.js +66 -6
  201. package/.agents/scripts/lib/orchestration/ticketing.js +0 -1
  202. package/.agents/scripts/lib/plan-phase-cleanup.js +12 -14
  203. package/.agents/scripts/lib/planning-corpus.js +12 -281
  204. package/.agents/scripts/lib/preflight-runner.js +4 -4
  205. package/.agents/scripts/lib/qa/coverage-verdict.js +5 -5
  206. package/.agents/scripts/lib/qa/qa-context-hydrator.js +5 -5
  207. package/.agents/scripts/lib/signals/index.js +4 -17
  208. package/.agents/scripts/lib/signals/read.js +35 -35
  209. package/.agents/scripts/lib/signals/schema.js +8 -11
  210. package/.agents/scripts/lib/signals/span-tree.js +7 -7
  211. package/.agents/scripts/lib/signals/write.js +0 -1
  212. package/.agents/scripts/lib/single-story/story-merged-notify.js +13 -2
  213. package/.agents/scripts/lib/single-story-sweep/protection-ctx.js +1 -1
  214. package/.agents/scripts/lib/skills/parse-skill.js +16 -3
  215. package/.agents/scripts/lib/story-adjacency.js +17 -19
  216. package/.agents/scripts/lib/story-body/story-body.js +130 -75
  217. package/.agents/scripts/lib/story-plan.js +2 -4
  218. package/.agents/scripts/lib/templates/decomposer-prompts.js +51 -46
  219. package/.agents/scripts/lib/templates/spec-author-prompts.js +47 -45
  220. package/.agents/scripts/lib/test-env.js +14 -1
  221. package/.agents/scripts/lib/test-tiers.js +0 -3
  222. package/.agents/scripts/lib/{epic-body-sections.js → ticket-body-sections.js} +25 -39
  223. package/.agents/scripts/lib/validation-evidence.js +32 -60
  224. package/.agents/scripts/lib/wave-runner/ready-set.js +38 -12
  225. package/.agents/scripts/lib/workspace-provisioner.js +1 -1
  226. package/.agents/scripts/lib/worktree/lifecycle/pending-cleanup.js +1 -1
  227. package/.agents/scripts/lib/worktree/lifecycle/reap.js +72 -25
  228. package/.agents/scripts/lib/worktree/lifecycle-manager.js +1 -2
  229. package/.agents/scripts/lint-issue-body.js +71 -40
  230. package/.agents/scripts/mandrel-update-preflight.js +1 -1
  231. package/.agents/scripts/notify.js +4 -3
  232. package/.agents/scripts/plan-context.js +102 -80
  233. package/.agents/scripts/plan-persist.js +230 -279
  234. package/.agents/scripts/plan-run-epilogue.js +142 -0
  235. package/.agents/scripts/post-structured-comment.js +0 -38
  236. package/.agents/scripts/pr-watch-with-update.js +43 -22
  237. package/.agents/scripts/providers/github/compose.js +0 -1
  238. package/.agents/scripts/providers/github/errors.js +0 -19
  239. package/.agents/scripts/providers/github/issues.js +13 -39
  240. package/.agents/scripts/providers/github/mappers.js +5 -12
  241. package/.agents/scripts/providers/github/sub-issues.js +0 -47
  242. package/.agents/scripts/providers/github/tickets.js +33 -156
  243. package/.agents/scripts/providers/github.js +17 -6
  244. package/.agents/scripts/resolve-stories.js +236 -0
  245. package/.agents/scripts/run-coverage.js +4 -1
  246. package/.agents/scripts/run-lint.js +2 -2
  247. package/.agents/scripts/run-verify.js +31 -2
  248. package/.agents/scripts/signals-view.js +25 -21
  249. package/.agents/scripts/single-story-close.js +178 -26
  250. package/.agents/scripts/single-story-confirm-merge.js +313 -24
  251. package/.agents/scripts/single-story-init.js +35 -30
  252. package/.agents/scripts/stories-wave-tick.js +85 -10
  253. package/.agents/scripts/story-plan.js +28 -49
  254. package/.agents/scripts/update-ticket-state.js +14 -65
  255. package/.agents/skills/core/code-review-and-quality/SKILL.md +28 -450
  256. package/.agents/skills/core/code-review-and-quality/reference.md +458 -0
  257. package/.agents/skills/core/debugging-and-error-recovery/SKILL.md +22 -315
  258. package/.agents/skills/core/debugging-and-error-recovery/reference.md +323 -0
  259. package/.agents/skills/core/diagnose-friction/SKILL.md +14 -18
  260. package/.agents/skills/core/documentation-and-adrs/SKILL.md +25 -397
  261. package/.agents/skills/core/documentation-and-adrs/reference.md +403 -0
  262. package/.agents/skills/core/gates-and-baselines/SKILL.md +12 -12
  263. package/.agents/skills/core/idea-refinement/SKILL.md +9 -9
  264. package/.agents/skills/core/scope-triage/SKILL.md +31 -172
  265. package/.agents/skills/core/security-and-hardening/SKILL.md +22 -367
  266. package/.agents/skills/core/security-and-hardening/reference.md +375 -0
  267. package/.agents/skills/skills.index.json +3 -53
  268. package/.agents/skills/stack/qa/playwright-bdd/SKILL.md +2 -4
  269. package/.agents/skills/stack/qa/qa-explore-driving/SKILL.md +1 -1
  270. package/.agents/skills/stack/qa/qa-harness/SKILL.md +1 -3
  271. package/.agents/starter-agentrc.json +0 -5
  272. package/.agents/templates/agent-protocol.md +9 -10
  273. package/.agents/workflows/audit-architecture.md +6 -7
  274. package/.agents/workflows/audit-clean-code.md +7 -7
  275. package/.agents/workflows/audit-dependencies.md +3 -3
  276. package/.agents/workflows/audit-devops.md +3 -3
  277. package/.agents/workflows/audit-documentation.md +9 -10
  278. package/.agents/workflows/audit-lighthouse.md +11 -3
  279. package/.agents/workflows/audit-navigability.md +13 -2
  280. package/.agents/workflows/audit-performance.md +5 -6
  281. package/.agents/workflows/audit-privacy.md +3 -3
  282. package/.agents/workflows/audit-quality.md +11 -12
  283. package/.agents/workflows/audit-security.md +4 -5
  284. package/.agents/workflows/audit-seo.md +13 -3
  285. package/.agents/workflows/audit-sre.md +3 -3
  286. package/.agents/workflows/audit-to-stories.md +20 -20
  287. package/.agents/workflows/audit-ux-ui.md +10 -3
  288. package/.agents/workflows/deliver.md +177 -176
  289. package/.agents/workflows/git-cleanup.md +5 -6
  290. package/.agents/workflows/git-deliver.md +1 -1
  291. package/.agents/workflows/helpers/_merge-conflict-template.md +1 -1
  292. package/.agents/workflows/helpers/acceptance-self-eval.md +35 -40
  293. package/.agents/workflows/helpers/code-quality-guardrails.md +7 -7
  294. package/.agents/workflows/helpers/code-review.md +75 -196
  295. package/.agents/workflows/helpers/{single-story-deliver-reference.md → deliver-story-reference.md} +83 -44
  296. package/.agents/workflows/helpers/deliver-story.md +606 -0
  297. package/.agents/workflows/helpers/diagnose.md +10 -10
  298. package/.agents/workflows/helpers/parallel-tooling.md +3 -3
  299. package/.agents/workflows/helpers/signals.md +16 -16
  300. package/.agents/workflows/helpers/worktree-lifecycle.md +66 -86
  301. package/.agents/workflows/mandrel-update.md +2 -1
  302. package/.agents/workflows/plan.md +277 -145
  303. package/.agents/workflows/qa-assist.md +27 -33
  304. package/.agents/workflows/qa-explore.md +29 -38
  305. package/.agents/workflows/qa-run.md +2 -6
  306. package/README.md +9 -8
  307. package/bin/mandrel.js +12 -1
  308. package/docs/CHANGELOG.md +70 -0
  309. package/lib/cli/registry.js +262 -19
  310. package/lib/cli/sync-agents.js +157 -0
  311. package/lib/cli/sync-commands.js +115 -6
  312. package/lib/cli/sync.js +168 -6
  313. package/lib/cli/update.js +105 -8
  314. package/lib/cli/version-helpers.js +131 -0
  315. package/lib/migrations/README.md +7 -5
  316. package/lib/migrations/index.js +12 -8
  317. package/lib/migrations/steps/2.1.0-retire-mi-drop-knobs.js +100 -0
  318. package/lib/migrations/steps/2.1.0-retire-verify-concurrency-cap.js +101 -0
  319. package/package.json +2 -2
  320. package/.agents/agents/retro.md +0 -42
  321. package/.agents/personas/architect.md +0 -113
  322. package/.agents/personas/devops-engineer.md +0 -38
  323. package/.agents/personas/engineer.md +0 -33
  324. package/.agents/personas/project-manager.md +0 -114
  325. package/.agents/personas/qa-engineer.md +0 -95
  326. package/.agents/personas/security-engineer.md +0 -111
  327. package/.agents/personas/technical-writer.md +0 -101
  328. package/.agents/schemas/dispatch-manifest.json +0 -232
  329. package/.agents/schemas/epic-perf-report.schema.json +0 -89
  330. package/.agents/schemas/epic-spec.schema.json +0 -153
  331. package/.agents/schemas/lifecycle/acceptance.reconcile.failed.schema.json +0 -13
  332. package/.agents/schemas/lifecycle/acceptance.reconcile.ok.schema.json +0 -13
  333. package/.agents/schemas/lifecycle/acceptance.reconcile.skipped.schema.json +0 -13
  334. package/.agents/schemas/lifecycle/acceptance.reconcile.start.schema.json +0 -12
  335. package/.agents/schemas/lifecycle/acceptance.reconcile.waived.schema.json +0 -13
  336. package/.agents/schemas/lifecycle/epic.automerge.end.schema.json +0 -15
  337. package/.agents/schemas/lifecycle/epic.automerge.start.schema.json +0 -13
  338. package/.agents/schemas/lifecycle/epic.blocked.schema.json +0 -13
  339. package/.agents/schemas/lifecycle/epic.cleanup.end.schema.json +0 -12
  340. package/.agents/schemas/lifecycle/epic.cleanup.start.schema.json +0 -12
  341. package/.agents/schemas/lifecycle/epic.close.end.schema.json +0 -12
  342. package/.agents/schemas/lifecycle/epic.complete.schema.json +0 -13
  343. package/.agents/schemas/lifecycle/epic.finalize.end.schema.json +0 -13
  344. package/.agents/schemas/lifecycle/epic.finalize.start.schema.json +0 -12
  345. package/.agents/schemas/lifecycle/epic.merge.armed.schema.json +0 -13
  346. package/.agents/schemas/lifecycle/epic.merge.blocked.schema.json +0 -14
  347. package/.agents/schemas/lifecycle/epic.merge.confirmed.schema.json +0 -17
  348. package/.agents/schemas/lifecycle/epic.merge.ready.schema.json +0 -15
  349. package/.agents/schemas/lifecycle/epic.plan.end.schema.json +0 -18
  350. package/.agents/schemas/lifecycle/epic.plan.start.schema.json +0 -12
  351. package/.agents/schemas/lifecycle/epic.snapshot.end.schema.json +0 -16
  352. package/.agents/schemas/lifecycle/epic.snapshot.start.schema.json +0 -12
  353. package/.agents/schemas/lifecycle/epic.watch.end.schema.json +0 -29
  354. package/.agents/schemas/lifecycle/epic.watch.start.schema.json +0 -16
  355. package/.agents/schemas/lifecycle/slice.end.schema.json +0 -21
  356. package/.agents/schemas/lifecycle/slice.heartbeat.schema.json +0 -20
  357. package/.agents/schemas/lifecycle/slice.start.schema.json +0 -17
  358. package/.agents/schemas/lifecycle/story.heartbeat.schema.json +0 -20
  359. package/.agents/schemas/risk-verdict.schema.json +0 -66
  360. package/.agents/schemas/story-perf-summary.schema.json +0 -73
  361. package/.agents/scripts/acceptance-spec-reconciler.js +0 -642
  362. package/.agents/scripts/analyze-execution.js +0 -444
  363. package/.agents/scripts/bookkeeping-reconcile.js +0 -117
  364. package/.agents/scripts/check-prepush-recovery.js +0 -90
  365. package/.agents/scripts/dispatcher.js +0 -295
  366. package/.agents/scripts/epic-audit-prepare.js +0 -497
  367. package/.agents/scripts/epic-audit-recheck.js +0 -274
  368. package/.agents/scripts/epic-deliver-note-intervention.js +0 -192
  369. package/.agents/scripts/epic-deliver-preflight.js +0 -462
  370. package/.agents/scripts/epic-deliver-prepare.js +0 -852
  371. package/.agents/scripts/epic-execute-record-wave.js +0 -449
  372. package/.agents/scripts/epic-plan-clarity.js +0 -211
  373. package/.agents/scripts/epic-plan-healthcheck.js +0 -581
  374. package/.agents/scripts/epic-reconcile.js +0 -625
  375. package/.agents/scripts/lib/baseline-snapshot.js +0 -979
  376. package/.agents/scripts/lib/checks/epic-merge-lock-stale.js +0 -54
  377. package/.agents/scripts/lib/checks/stale-origin-epic.js +0 -49
  378. package/.agents/scripts/lib/config/lifecycle.js +0 -40
  379. package/.agents/scripts/lib/config/preflight.js +0 -58
  380. package/.agents/scripts/lib/config/retro.js +0 -77
  381. package/.agents/scripts/lib/epic-merge-lock.js +0 -322
  382. package/.agents/scripts/lib/epic-plan-clarity.js +0 -181
  383. package/.agents/scripts/lib/epic-plan-ideation.js +0 -261
  384. package/.agents/scripts/lib/git-merge-orchestrator.js +0 -261
  385. package/.agents/scripts/lib/observability/baseline-refresh-rate.js +0 -221
  386. package/.agents/scripts/lib/observability/hook-heartbeat.js +0 -219
  387. package/.agents/scripts/lib/observability/perf-aggregator.js +0 -813
  388. package/.agents/scripts/lib/observability/perf-report-readers.js +0 -328
  389. package/.agents/scripts/lib/observability/perf-report-render.js +0 -182
  390. package/.agents/scripts/lib/orchestration/bookkeeping-outbox.js +0 -270
  391. package/.agents/scripts/lib/orchestration/context-hydration-engine.js +0 -539
  392. package/.agents/scripts/lib/orchestration/deliver-route.js +0 -173
  393. package/.agents/scripts/lib/orchestration/dispatch-engine.js +0 -134
  394. package/.agents/scripts/lib/orchestration/dispatch-pipeline.js +0 -183
  395. package/.agents/scripts/lib/orchestration/epic-cleanup.js +0 -801
  396. package/.agents/scripts/lib/orchestration/epic-deliver-lease-guard.js +0 -310
  397. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/context.js +0 -163
  398. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/creation.js +0 -140
  399. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/dag.js +0 -64
  400. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/diagnostics.js +0 -72
  401. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/persist-helpers.js +0 -156
  402. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/persist.js +0 -345
  403. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/planning-artifacts.js +0 -41
  404. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/reconcile-spawn.js +0 -86
  405. package/.agents/scripts/lib/orchestration/epic-plan-lease-guard.js +0 -391
  406. package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/drain.js +0 -94
  407. package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/plan-epic.js +0 -236
  408. package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/risk-verdict.js +0 -105
  409. package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/run-spec-phase.js +0 -307
  410. package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/spec-freshness.js +0 -117
  411. package/.agents/scripts/lib/orchestration/epic-plan-state-store.js +0 -117
  412. package/.agents/scripts/lib/orchestration/epic-run-state-store.js +0 -621
  413. package/.agents/scripts/lib/orchestration/epic-runner/concurrency-gate.js +0 -186
  414. package/.agents/scripts/lib/orchestration/epic-runner/deliver-phases.js +0 -50
  415. package/.agents/scripts/lib/orchestration/epic-runner/phases/build-wave-dag.js +0 -129
  416. package/.agents/scripts/lib/orchestration/epic-runner/phases/snapshot.js +0 -103
  417. package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter/composition.js +0 -267
  418. package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter/signals.js +0 -210
  419. package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter/transport.js +0 -238
  420. package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/_bullet-format.js +0 -32
  421. package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/component-drift.js +0 -203
  422. package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/crap-drift.js +0 -227
  423. package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/maintainability-drift.js +0 -117
  424. package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/stalled-worktree.js +0 -37
  425. package/.agents/scripts/lib/orchestration/epic-runner/story-launcher.js +0 -127
  426. package/.agents/scripts/lib/orchestration/epic-runner/story-run-progress-writer.js +0 -400
  427. package/.agents/scripts/lib/orchestration/epic-runner/sub-agent-return.js +0 -276
  428. package/.agents/scripts/lib/orchestration/epic-runner/wave-scheduler.js +0 -66
  429. package/.agents/scripts/lib/orchestration/epic-spec-reconciler-apply.js +0 -789
  430. package/.agents/scripts/lib/orchestration/epic-spec-reconciler-diff.js +0 -676
  431. package/.agents/scripts/lib/orchestration/epic-spec-reconciler-discriminator.js +0 -389
  432. package/.agents/scripts/lib/orchestration/epic-spec-reconciler-format.js +0 -230
  433. package/.agents/scripts/lib/orchestration/epic-spec-reconciler-ops.js +0 -361
  434. package/.agents/scripts/lib/orchestration/error-journal.js +0 -139
  435. package/.agents/scripts/lib/orchestration/finalize/open-or-locate-pr.js +0 -306
  436. package/.agents/scripts/lib/orchestration/finalize/post-handoff-comment.js +0 -489
  437. package/.agents/scripts/lib/orchestration/finalize/sanitize-skip-ci.js +0 -88
  438. package/.agents/scripts/lib/orchestration/lifecycle/emit-slice-lifecycle.js +0 -270
  439. package/.agents/scripts/lib/orchestration/lifecycle/emit-story-dispatch-end.js +0 -147
  440. package/.agents/scripts/lib/orchestration/lifecycle/emit-story-heartbeat.js +0 -155
  441. package/.agents/scripts/lib/orchestration/lifecycle/ledger-diff.js +0 -140
  442. package/.agents/scripts/lib/orchestration/lifecycle/listeners/acceptance-reconciler.js +0 -465
  443. package/.agents/scripts/lib/orchestration/lifecycle/listeners/automerge-armer.js +0 -501
  444. package/.agents/scripts/lib/orchestration/lifecycle/listeners/automerge-predicate.js +0 -984
  445. package/.agents/scripts/lib/orchestration/lifecycle/listeners/branch-cleaner.js +0 -264
  446. package/.agents/scripts/lib/orchestration/lifecycle/listeners/checkpoint-pointer-writer.js +0 -284
  447. package/.agents/scripts/lib/orchestration/lifecycle/listeners/cleaner.js +0 -355
  448. package/.agents/scripts/lib/orchestration/lifecycle/listeners/finalizer.js +0 -673
  449. package/.agents/scripts/lib/orchestration/lifecycle/listeners/index.js +0 -378
  450. package/.agents/scripts/lib/orchestration/lifecycle/listeners/intervention-recorder.js +0 -140
  451. package/.agents/scripts/lib/orchestration/lifecycle/listeners/label-transitioner.js +0 -144
  452. package/.agents/scripts/lib/orchestration/lifecycle/listeners/merge-watcher.js +0 -665
  453. package/.agents/scripts/lib/orchestration/lifecycle/listeners/notify-dispatcher.js +0 -174
  454. package/.agents/scripts/lib/orchestration/manifest-builder.js +0 -222
  455. package/.agents/scripts/lib/orchestration/plan-persist/amend.js +0 -359
  456. package/.agents/scripts/lib/orchestration/plan-persist/delivery-mode.js +0 -127
  457. package/.agents/scripts/lib/orchestration/plan-review-routing.js +0 -63
  458. package/.agents/scripts/lib/orchestration/planning-context-budget.js +0 -213
  459. package/.agents/scripts/lib/orchestration/planning-risk.js +0 -194
  460. package/.agents/scripts/lib/orchestration/post-merge/phases/branch-cleanup.js +0 -56
  461. package/.agents/scripts/lib/orchestration/post-merge/phases/dashboard-refresh.js +0 -33
  462. package/.agents/scripts/lib/orchestration/post-merge/phases/notification.js +0 -78
  463. package/.agents/scripts/lib/orchestration/post-merge/phases/temp-cleanup.js +0 -68
  464. package/.agents/scripts/lib/orchestration/post-merge/phases/ticket-closure.js +0 -118
  465. package/.agents/scripts/lib/orchestration/post-merge/phases/worktree-reap.js +0 -396
  466. package/.agents/scripts/lib/orchestration/post-merge-pipeline.js +0 -205
  467. package/.agents/scripts/lib/orchestration/preflight-cache.js +0 -187
  468. package/.agents/scripts/lib/orchestration/recurring-failure-detector.js +0 -152
  469. package/.agents/scripts/lib/orchestration/retro/phases/checks.js +0 -94
  470. package/.agents/scripts/lib/orchestration/retro/phases/compose-body.js +0 -571
  471. package/.agents/scripts/lib/orchestration/retro/phases/gather-signals.js +0 -450
  472. package/.agents/scripts/lib/orchestration/retro/phases/post-and-mirror.js +0 -191
  473. package/.agents/scripts/lib/orchestration/retro-heuristics.js +0 -57
  474. package/.agents/scripts/lib/orchestration/retro-perf-heuristics.js +0 -275
  475. package/.agents/scripts/lib/orchestration/retro-runner.js +0 -197
  476. package/.agents/scripts/lib/orchestration/spec-renderer.js +0 -447
  477. package/.agents/scripts/lib/orchestration/story-close/auto-refresh-runner.js +0 -747
  478. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/gate-failure.js +0 -211
  479. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/pre-merge-attribution.js +0 -158
  480. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/refresh-commit.js +0 -446
  481. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/regression-projection.js +0 -297
  482. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/scope-discovery.js +0 -48
  483. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution-wiring.js +0 -67
  484. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution.js +0 -161
  485. package/.agents/scripts/lib/orchestration/story-close/baseline-friction-body.js +0 -117
  486. package/.agents/scripts/lib/orchestration/story-close/cd-out-guard.js +0 -86
  487. package/.agents/scripts/lib/orchestration/story-close/cleanup-reconciler.js +0 -147
  488. package/.agents/scripts/lib/orchestration/story-close/close-inputs.js +0 -142
  489. package/.agents/scripts/lib/orchestration/story-close/comment-bodies.js +0 -62
  490. package/.agents/scripts/lib/orchestration/story-close/merge-runner.js +0 -658
  491. package/.agents/scripts/lib/orchestration/story-close/merge-subject.js +0 -198
  492. package/.agents/scripts/lib/orchestration/story-close/phases/branch-restore.js +0 -105
  493. package/.agents/scripts/lib/orchestration/story-close/phases/close.js +0 -222
  494. package/.agents/scripts/lib/orchestration/story-close/phases/gates.js +0 -292
  495. package/.agents/scripts/lib/orchestration/story-close/phases/locked-pipeline.js +0 -270
  496. package/.agents/scripts/lib/orchestration/story-close/phases/preflight.js +0 -110
  497. package/.agents/scripts/lib/orchestration/story-close/phases/refresh.js +0 -86
  498. package/.agents/scripts/lib/orchestration/story-close/phases/timeout-blocked-emitter.js +0 -112
  499. package/.agents/scripts/lib/orchestration/story-close/phases/timeout-blocked.js +0 -157
  500. package/.agents/scripts/lib/orchestration/story-close/post-merge-close.js +0 -421
  501. package/.agents/scripts/lib/orchestration/story-close/pre-merge-validation.js +0 -302
  502. package/.agents/scripts/lib/orchestration/story-close/shared-checkout-guard.js +0 -163
  503. package/.agents/scripts/lib/orchestration/story-close-recovery.js +0 -690
  504. package/.agents/scripts/lib/orchestration/wave-marker.js +0 -28
  505. package/.agents/scripts/lib/orchestration/wave-record-io.js +0 -218
  506. package/.agents/scripts/lib/orchestration/wave-record-notifications.js +0 -145
  507. package/.agents/scripts/lib/orchestration/wave-record-projection.js +0 -212
  508. package/.agents/scripts/lib/presentation/dispatch-manifest-render.js +0 -111
  509. package/.agents/scripts/lib/presentation/manifest-builder.js +0 -239
  510. package/.agents/scripts/lib/presentation/manifest-formatter.js +0 -242
  511. package/.agents/scripts/lib/presentation/manifest-helpers.js +0 -213
  512. package/.agents/scripts/lib/presentation/manifest-persistence.js +0 -261
  513. package/.agents/scripts/lib/presentation/manifest-procedures.js +0 -55
  514. package/.agents/scripts/lib/presentation/manifest-render-waves.js +0 -306
  515. package/.agents/scripts/lib/presentation/manifest-renderer.js +0 -188
  516. package/.agents/scripts/lib/presentation/manifest-story-views.js +0 -110
  517. package/.agents/scripts/lib/push-epic-retry.js +0 -209
  518. package/.agents/scripts/lib/spec/index.js +0 -36
  519. package/.agents/scripts/lib/spec/loader.js +0 -425
  520. package/.agents/scripts/lib/spec/state.js +0 -208
  521. package/.agents/scripts/lib/story-init/blocker-validator.js +0 -68
  522. package/.agents/scripts/lib/story-init/branch-initializer.js +0 -408
  523. package/.agents/scripts/lib/story-init/context-resolver.js +0 -92
  524. package/.agents/scripts/lib/story-init/donor-precheck.js +0 -207
  525. package/.agents/scripts/lib/story-init/state-transitioner.js +0 -80
  526. package/.agents/scripts/lib/story-init/task-graph-builder.js +0 -124
  527. package/.agents/scripts/lib/story-init/transition-summary.js +0 -34
  528. package/.agents/scripts/lib/test-reserved-epic-temp-ids.js +0 -35
  529. package/.agents/scripts/lib/wave-runner/tick.js +0 -754
  530. package/.agents/scripts/lib/wave-runner/wave-runner-error.js +0 -20
  531. package/.agents/scripts/lifecycle-emit-story-dispatch.js +0 -194
  532. package/.agents/scripts/lifecycle-emit.js +0 -510
  533. package/.agents/scripts/retro-run.js +0 -218
  534. package/.agents/scripts/slice-phase.js +0 -361
  535. package/.agents/scripts/standalone-feedback-rollup.js +0 -188
  536. package/.agents/scripts/story-close.js +0 -294
  537. package/.agents/scripts/story-init.js +0 -599
  538. package/.agents/scripts/story-phase.js +0 -369
  539. package/.agents/scripts/wave-tick.js +0 -464
  540. package/.agents/skills/core/analyze-execution/SKILL.md +0 -98
  541. package/.agents/skills/core/epic-plan-consolidate/SKILL.md +0 -172
  542. package/.agents/skills/core/epic-plan-consolidate/examples.md +0 -51
  543. package/.agents/skills/core/epic-plan-decompose-author/SKILL.md +0 -441
  544. package/.agents/skills/core/epic-plan-decompose-author/examples.md +0 -47
  545. package/.agents/skills/core/epic-plan-premortem/SKILL.md +0 -146
  546. package/.agents/skills/core/epic-plan-premortem/examples.md +0 -53
  547. package/.agents/skills/core/epic-plan-spec-author/SKILL.md +0 -383
  548. package/.agents/skills/core/epic-plan-spec-author/examples.md +0 -91
  549. package/.agents/workflows/helpers/deliver-epic-reference.md +0 -547
  550. package/.agents/workflows/helpers/deliver-epic-single.md +0 -331
  551. package/.agents/workflows/helpers/deliver-epic.md +0 -998
  552. package/.agents/workflows/helpers/deliver-stories.md +0 -450
  553. package/.agents/workflows/helpers/epic-audit.md +0 -189
  554. package/.agents/workflows/helpers/epic-deliver-story.md +0 -436
  555. package/.agents/workflows/helpers/epic-testing.md +0 -125
  556. package/.agents/workflows/helpers/plan-epic-reference.md +0 -160
  557. package/.agents/workflows/helpers/plan-epic.md +0 -353
  558. package/.agents/workflows/helpers/plan-story.md +0 -251
  559. package/.agents/workflows/helpers/scope-triage-gate.md +0 -108
  560. package/.agents/workflows/helpers/single-story-deliver.md +0 -557
@@ -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' });