mandrel 2.60.0 → 2.62.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 (662) hide show
  1. package/.agents/README.md +10 -10
  2. package/.agents/agents/story-worker.md +1 -1
  3. package/.agents/docs/agentrc-reference.json +4 -82
  4. package/.agents/docs/configuration.md +20 -87
  5. package/.agents/docs/workflows.md +1 -1
  6. package/.agents/instructions.md +1 -3
  7. package/.agents/rules/gherkin-standards.md +4 -0
  8. package/.agents/schemas/agentrc.schema.json +11 -486
  9. package/.agents/schemas/story-deliver-terminal.schema.json +10 -0
  10. package/.agents/schemas/validation-evidence.schema.json +2 -1
  11. package/.agents/scripts/README.md +14 -14
  12. package/.agents/scripts/acceptance-eval.js +32 -164
  13. package/.agents/scripts/agents-bootstrap-github.js +27 -129
  14. package/.agents/scripts/apply-quality-bootstrap.js +4 -40
  15. package/.agents/scripts/audit-baselines.js +6 -27
  16. package/.agents/scripts/audit-labels-bootstrap.js +5 -29
  17. package/.agents/scripts/audit-to-stories.js +91 -361
  18. package/.agents/scripts/boot-sweep.js +19 -72
  19. package/.agents/scripts/bootstrap.js +74 -395
  20. package/.agents/scripts/ceremony-derive.js +9 -45
  21. package/.agents/scripts/check-arch-cycles.js +14 -64
  22. package/.agents/scripts/check-baselines.js +8 -48
  23. package/.agents/scripts/check-context-budget.js +46 -172
  24. package/.agents/scripts/check-cyclomatic.js +12 -44
  25. package/.agents/scripts/check-dead-exports.js +13 -64
  26. package/.agents/scripts/check-doc-links.js +38 -186
  27. package/.agents/scripts/check-gherkin-corpus.js +24 -127
  28. package/.agents/scripts/check-test-temp-hygiene.js +28 -169
  29. package/.agents/scripts/coverage-capture.js +32 -99
  30. package/.agents/scripts/deliver-light.js +14 -101
  31. package/.agents/scripts/deliver-recover.js +6 -42
  32. package/.agents/scripts/deliver-run.js +36 -133
  33. package/.agents/scripts/diagnose-friction.js +24 -116
  34. package/.agents/scripts/drain-pending-cleanup.js +1 -1
  35. package/.agents/scripts/evidence-gate.js +23 -85
  36. package/.agents/scripts/file-ci-gap.js +10 -50
  37. package/.agents/scripts/generate-config-docs.js +30 -170
  38. package/.agents/scripts/generate-lens-checklists.js +8 -52
  39. package/.agents/scripts/generate-skills-index.js +14 -112
  40. package/.agents/scripts/generate-workflows-doc.js +10 -70
  41. package/.agents/scripts/git-cleanup.js +2 -34
  42. package/.agents/scripts/lib/Graph.js +24 -81
  43. package/.agents/scripts/lib/ITicketingProvider.js +47 -143
  44. package/.agents/scripts/lib/Logger.js +14 -76
  45. package/.agents/scripts/lib/audit-baselines/engine.js +11 -31
  46. package/.agents/scripts/lib/audit-baselines/gate-surface.js +3 -17
  47. package/.agents/scripts/lib/audit-baselines/headroom.js +4 -20
  48. package/.agents/scripts/lib/audit-baselines/hotspots.js +3 -15
  49. package/.agents/scripts/lib/audit-baselines/kinds.js +23 -89
  50. package/.agents/scripts/lib/audit-baselines/outliers.js +6 -23
  51. package/.agents/scripts/lib/audit-baselines/read.js +3 -16
  52. package/.agents/scripts/lib/audit-baselines/staleness.js +7 -26
  53. package/.agents/scripts/lib/audit-baselines/surface-entry.js +7 -28
  54. package/.agents/scripts/lib/audit-baselines/trend.js +7 -20
  55. package/.agents/scripts/lib/audit-baselines/weights.js +9 -37
  56. package/.agents/scripts/lib/audit-suite/audit-rules-reader.js +3 -18
  57. package/.agents/scripts/lib/audit-suite/checklist-threading.js +26 -124
  58. package/.agents/scripts/lib/audit-suite/dispatch-checklist.js +14 -45
  59. package/.agents/scripts/lib/audit-suite/findings.js +12 -52
  60. package/.agents/scripts/lib/audit-suite/frontmatter.js +5 -29
  61. package/.agents/scripts/lib/audit-suite/index.js +1 -15
  62. package/.agents/scripts/lib/audit-suite/lens-checklist.js +10 -45
  63. package/.agents/scripts/lib/audit-suite/lens-diff-floor.js +11 -76
  64. package/.agents/scripts/lib/audit-suite/runner.js +13 -43
  65. package/.agents/scripts/lib/audit-suite/selector.js +49 -349
  66. package/.agents/scripts/lib/audit-suite/substitutions.js +12 -40
  67. package/.agents/scripts/lib/audit-suite/workflow-loader.js +3 -15
  68. package/.agents/scripts/lib/audit-to-stories/audit-label-taxonomy.js +11 -73
  69. package/.agents/scripts/lib/audit-to-stories/audit-lenses.js +8 -37
  70. package/.agents/scripts/lib/audit-to-stories/build-story-body.js +25 -143
  71. package/.agents/scripts/lib/audit-to-stories/dedupe-against-github.js +14 -80
  72. package/.agents/scripts/lib/audit-to-stories/epic-grouping-directive.js +4 -18
  73. package/.agents/scripts/lib/audit-to-stories/finding-adapter.js +7 -40
  74. package/.agents/scripts/lib/audit-to-stories/group-findings.js +9 -39
  75. package/.agents/scripts/lib/audit-to-stories/issue-corpus.js +10 -66
  76. package/.agents/scripts/lib/audit-to-stories/issue-index.js +6 -30
  77. package/.agents/scripts/lib/audit-to-stories/issues-file.js +6 -36
  78. package/.agents/scripts/lib/audit-to-stories/ledger-commit.js +17 -69
  79. package/.agents/scripts/lib/audit-to-stories/ledger-pr.js +17 -85
  80. package/.agents/scripts/lib/audit-to-stories/ledger-record.js +10 -48
  81. package/.agents/scripts/lib/audit-to-stories/parse-audit-md.js +38 -146
  82. package/.agents/scripts/lib/audit-to-stories/seed-from-findings.js +7 -42
  83. package/.agents/scripts/lib/audit-to-stories/wire-dependencies.js +10 -57
  84. package/.agents/scripts/lib/baseline-loader.js +12 -51
  85. package/.agents/scripts/lib/baseline-schema-registry.js +5 -22
  86. package/.agents/scripts/lib/baselines/component-matcher.js +3 -12
  87. package/.agents/scripts/lib/baselines/components.js +10 -61
  88. package/.agents/scripts/lib/baselines/coverage-updater-cli.js +7 -36
  89. package/.agents/scripts/lib/baselines/crap-preview-incremental.js +5 -21
  90. package/.agents/scripts/lib/baselines/crap-preview-scan.js +19 -45
  91. package/.agents/scripts/lib/baselines/crap-updater-cli.js +16 -65
  92. package/.agents/scripts/lib/baselines/diff-scope-cli.js +5 -33
  93. package/.agents/scripts/lib/baselines/duplication-scanner.js +11 -60
  94. package/.agents/scripts/lib/baselines/env-overrides.js +12 -67
  95. package/.agents/scripts/lib/baselines/envelope.js +13 -129
  96. package/.agents/scripts/lib/baselines/exit-codes.js +6 -49
  97. package/.agents/scripts/lib/baselines/git-base.js +23 -142
  98. package/.agents/scripts/lib/baselines/kernel.js +11 -111
  99. package/.agents/scripts/lib/baselines/kinds/_crap-new-method-gate.js +9 -47
  100. package/.agents/scripts/lib/baselines/kinds/_crap-read.js +8 -51
  101. package/.agents/scripts/lib/baselines/kinds/_shared-metric.js +7 -62
  102. package/.agents/scripts/lib/baselines/kinds/bundle-size.js +8 -29
  103. package/.agents/scripts/lib/baselines/kinds/coverage.js +3 -15
  104. package/.agents/scripts/lib/baselines/kinds/crap.js +94 -415
  105. package/.agents/scripts/lib/baselines/kinds/duplication.js +4 -30
  106. package/.agents/scripts/lib/baselines/kinds/kind-factory.js +7 -53
  107. package/.agents/scripts/lib/baselines/kinds/maintainability.js +15 -80
  108. package/.agents/scripts/lib/baselines/kinds/mutation.js +12 -72
  109. package/.agents/scripts/lib/baselines/maintainability-baseline-io.js +4 -11
  110. package/.agents/scripts/lib/baselines/merge-envelopes.js +30 -146
  111. package/.agents/scripts/lib/baselines/path-canon.js +19 -128
  112. package/.agents/scripts/lib/baselines/preview-gates.js +8 -37
  113. package/.agents/scripts/lib/baselines/reader.js +14 -107
  114. package/.agents/scripts/lib/baselines/refresh-service.js +35 -252
  115. package/.agents/scripts/lib/baselines/scope.js +11 -135
  116. package/.agents/scripts/lib/baselines/writer.js +16 -149
  117. package/.agents/scripts/lib/bdd-runner-detect.js +18 -113
  118. package/.agents/scripts/lib/bdd-scenario-budget.js +9 -36
  119. package/.agents/scripts/lib/bdd-scenario-scanner.js +11 -73
  120. package/.agents/scripts/lib/bdd-step-index.js +26 -100
  121. package/.agents/scripts/lib/bootstrap/baseline-merge-driver.js +23 -103
  122. package/.agents/scripts/lib/bootstrap/branch-protection.js +2 -5
  123. package/.agents/scripts/lib/bootstrap/commit-push.js +12 -50
  124. package/.agents/scripts/lib/bootstrap/gh-preflight.js +14 -101
  125. package/.agents/scripts/lib/bootstrap/hitl-confirm.js +5 -30
  126. package/.agents/scripts/lib/bootstrap/install-ledger.js +17 -73
  127. package/.agents/scripts/lib/bootstrap/issue-forms-template.js +17 -121
  128. package/.agents/scripts/lib/bootstrap/manifest.js +15 -86
  129. package/.agents/scripts/lib/bootstrap/merge-methods.js +4 -33
  130. package/.agents/scripts/lib/bootstrap/preflight.js +12 -61
  131. package/.agents/scripts/lib/bootstrap/project-bootstrap.js +34 -235
  132. package/.agents/scripts/lib/bootstrap/prompt.js +21 -129
  133. package/.agents/scripts/lib/bootstrap/quality-bootstrap.js +27 -141
  134. package/.agents/scripts/lib/bootstrap/summary.js +1 -8
  135. package/.agents/scripts/lib/bootstrap/workflow-audit.js +11 -84
  136. package/.agents/scripts/lib/branch-name-guard.js +4 -23
  137. package/.agents/scripts/lib/changed-files.js +31 -143
  138. package/.agents/scripts/lib/checks/core-bare-clean.js +4 -24
  139. package/.agents/scripts/lib/checks/index.js +18 -101
  140. package/.agents/scripts/lib/checks/loop-health.js +11 -53
  141. package/.agents/scripts/lib/checks/state.js +16 -91
  142. package/.agents/scripts/lib/checks/story-init-not-backgrounded.js +10 -61
  143. package/.agents/scripts/lib/checks/subagent-agent-tool-required.js +14 -83
  144. package/.agents/scripts/lib/child-exec.js +39 -108
  145. package/.agents/scripts/lib/cli/standard-args.js +9 -116
  146. package/.agents/scripts/lib/cli-args.js +31 -146
  147. package/.agents/scripts/lib/cli-usage.js +5 -27
  148. package/.agents/scripts/lib/cli-utils.js +2 -12
  149. package/.agents/scripts/lib/close-validation/commands.js +13 -76
  150. package/.agents/scripts/lib/close-validation/gates.js +92 -331
  151. package/.agents/scripts/lib/close-validation/process.js +121 -151
  152. package/.agents/scripts/lib/close-validation/projections/advisories.js +5 -31
  153. package/.agents/scripts/lib/close-validation/projections/crap.js +19 -67
  154. package/.agents/scripts/lib/close-validation/projections/head-sha.js +1 -17
  155. package/.agents/scripts/lib/close-validation/projections/inputs.js +4 -34
  156. package/.agents/scripts/lib/close-validation/projections/maintainability.js +11 -58
  157. package/.agents/scripts/lib/close-validation/runner.js +53 -110
  158. package/.agents/scripts/lib/command-header.js +6 -28
  159. package/.agents/scripts/lib/config/acceptance-eval.js +4 -30
  160. package/.agents/scripts/lib/config/baselines.js +3 -14
  161. package/.agents/scripts/lib/config/ci.js +8 -38
  162. package/.agents/scripts/lib/config/commands.js +1 -15
  163. package/.agents/scripts/lib/config/defaults.js +4 -33
  164. package/.agents/scripts/lib/config/delivery-routing.js +6 -35
  165. package/.agents/scripts/lib/config/explain.js +9 -80
  166. package/.agents/scripts/lib/config/gates/coverage.schema.js +0 -12
  167. package/.agents/scripts/lib/config/gates/crap-incremental-coverage.schema.js +2 -30
  168. package/.agents/scripts/lib/config/gates/crap.schema.js +1 -34
  169. package/.agents/scripts/lib/config/gates/duplication.schema.js +1 -8
  170. package/.agents/scripts/lib/config/gates/index.js +2 -17
  171. package/.agents/scripts/lib/config/gates/maintainability.schema.js +1 -20
  172. package/.agents/scripts/lib/config/gates/mutation.schema.js +1 -7
  173. package/.agents/scripts/lib/config/gates/shared.js +4 -64
  174. package/.agents/scripts/lib/config/github.js +4 -22
  175. package/.agents/scripts/lib/config/limits.js +4 -57
  176. package/.agents/scripts/lib/config/paths.js +2 -21
  177. package/.agents/scripts/lib/config/qa.js +4 -38
  178. package/.agents/scripts/lib/config/quality.js +76 -432
  179. package/.agents/scripts/lib/config/runners.js +12 -56
  180. package/.agents/scripts/lib/config/runtime.js +13 -57
  181. package/.agents/scripts/lib/config/shared.js +2 -16
  182. package/.agents/scripts/lib/config/sync-agentrc.js +9 -50
  183. package/.agents/scripts/lib/config/temp-paths.js +40 -280
  184. package/.agents/scripts/lib/config/validate-orchestration.js +5 -17
  185. package/.agents/scripts/lib/config/worktree-isolation.js +9 -28
  186. package/.agents/scripts/lib/config-resolver.js +10 -52
  187. package/.agents/scripts/lib/config-schema-shared.js +1 -4
  188. package/.agents/scripts/lib/config-settings-schema-delivery.js +12 -294
  189. package/.agents/scripts/lib/config-settings-schema-quality.js +7 -219
  190. package/.agents/scripts/lib/config-settings-schema.js +37 -274
  191. package/.agents/scripts/lib/coverage-baseline.js +20 -110
  192. package/.agents/scripts/lib/coverage-capture-fullscope.js +12 -37
  193. package/.agents/scripts/lib/coverage-capture-incremental.js +12 -43
  194. package/.agents/scripts/lib/coverage-capture-usage.js +4 -24
  195. package/.agents/scripts/lib/coverage-capture.js +99 -224
  196. package/.agents/scripts/lib/coverage-utils.js +14 -79
  197. package/.agents/scripts/lib/cpu-pool.js +17 -123
  198. package/.agents/scripts/lib/crap-baseline-join.js +16 -88
  199. package/.agents/scripts/lib/crap-coordinates.js +6 -25
  200. package/.agents/scripts/lib/crap-engine.js +40 -153
  201. package/.agents/scripts/lib/crap-method-identity.js +16 -78
  202. package/.agents/scripts/lib/crap-utils.js +31 -155
  203. package/.agents/scripts/lib/cyclomatic-ceiling.js +14 -87
  204. package/.agents/scripts/lib/cyclomatic-scope.js +10 -50
  205. package/.agents/scripts/lib/dead-exports-knip.js +18 -56
  206. package/.agents/scripts/lib/dead-exports-mode.js +5 -24
  207. package/.agents/scripts/lib/degraded-mode.js +3 -26
  208. package/.agents/scripts/lib/dependency-parser.js +8 -40
  209. package/.agents/scripts/lib/dependency-version.js +13 -35
  210. package/.agents/scripts/lib/detect-package-manager.js +6 -36
  211. package/.agents/scripts/lib/doc-tiers.js +22 -126
  212. package/.agents/scripts/lib/duplicate-search.js +8 -72
  213. package/.agents/scripts/lib/env-loader.js +5 -27
  214. package/.agents/scripts/lib/error-redactor.js +6 -31
  215. package/.agents/scripts/lib/errors/index.js +2 -22
  216. package/.agents/scripts/lib/escomplex-ast-compat.js +22 -163
  217. package/.agents/scripts/lib/escomplex-kernel.js +21 -123
  218. package/.agents/scripts/lib/feedback-loop/graduator-core.js +93 -419
  219. package/.agents/scripts/lib/feedback-loop/prior-feedback-fetcher.js +20 -98
  220. package/.agents/scripts/lib/feedback-loop/retro-proposals-graduator.js +27 -151
  221. package/.agents/scripts/lib/findings/audit-ledger.js +23 -97
  222. package/.agents/scripts/lib/findings/classify-finding.js +14 -69
  223. package/.agents/scripts/lib/findings/promote-finding.js +14 -112
  224. package/.agents/scripts/lib/findings/provenance-field.js +11 -52
  225. package/.agents/scripts/lib/findings/route-finding.js +37 -255
  226. package/.agents/scripts/lib/findings/semantic-issue-search.js +14 -59
  227. package/.agents/scripts/lib/findings/severity.js +18 -104
  228. package/.agents/scripts/lib/format-generated-json.js +12 -44
  229. package/.agents/scripts/lib/full-suite-lock.js +160 -429
  230. package/.agents/scripts/lib/full-suite-queue.js +213 -0
  231. package/.agents/scripts/lib/gates/baseline-store.js +5 -9
  232. package/.agents/scripts/lib/gates/friction.js +1 -3
  233. package/.agents/scripts/lib/generated/agentrc-validator.js +2 -2
  234. package/.agents/scripts/lib/gh-exec.js +31 -259
  235. package/.agents/scripts/lib/git/cached-fetch.js +9 -52
  236. package/.agents/scripts/lib/git/sync-from-base.js +15 -107
  237. package/.agents/scripts/lib/git-branch-cleanup.js +14 -61
  238. package/.agents/scripts/lib/git-branch-lifecycle.js +16 -87
  239. package/.agents/scripts/lib/git-utils.js +37 -161
  240. package/.agents/scripts/lib/github/framework-repo.js +8 -71
  241. package/.agents/scripts/lib/github-url.js +2 -17
  242. package/.agents/scripts/lib/import-graph.js +11 -38
  243. package/.agents/scripts/lib/install-cmd-parser.js +4 -13
  244. package/.agents/scripts/lib/json-utils.js +3 -18
  245. package/.agents/scripts/lib/label-constants.js +16 -111
  246. package/.agents/scripts/lib/label-taxonomy.js +4 -30
  247. package/.agents/scripts/lib/maintainability-engine.js +12 -80
  248. package/.agents/scripts/lib/maintainability-unscorable.js +5 -25
  249. package/.agents/scripts/lib/maintainability-utils.js +16 -92
  250. package/.agents/scripts/lib/mandrel-catalog.js +12 -70
  251. package/.agents/scripts/lib/notifications/notifier.js +13 -38
  252. package/.agents/scripts/lib/npm-scripts.js +4 -23
  253. package/.agents/scripts/lib/observability/metrics-ledger.js +16 -76
  254. package/.agents/scripts/lib/observability/runtime-friction.js +44 -286
  255. package/.agents/scripts/lib/observability/signal-validator.js +5 -37
  256. package/.agents/scripts/lib/observability/signals-writer.js +11 -121
  257. package/.agents/scripts/lib/observability/source-classifier.js +21 -203
  258. package/.agents/scripts/lib/observability/terse-result.js +14 -47
  259. package/.agents/scripts/lib/onboard/init-tail.js +13 -74
  260. package/.agents/scripts/lib/onboard/scaffold-docs.js +11 -34
  261. package/.agents/scripts/lib/orchestration/acceptance-eval-decision.js +25 -139
  262. package/.agents/scripts/lib/orchestration/auto-merge-cwd.js +11 -66
  263. package/.agents/scripts/lib/orchestration/behind-recovery.js +10 -55
  264. package/.agents/scripts/lib/orchestration/ceremony-routing.js +5 -75
  265. package/.agents/scripts/lib/orchestration/change-set.js +7 -36
  266. package/.agents/scripts/lib/orchestration/check-baselines/phases/compare.js +9 -46
  267. package/.agents/scripts/lib/orchestration/check-baselines/phases/evaluate.js +11 -44
  268. package/.agents/scripts/lib/orchestration/check-baselines/phases/floors.js +5 -24
  269. package/.agents/scripts/lib/orchestration/check-baselines/phases/friction.js +3 -12
  270. package/.agents/scripts/lib/orchestration/check-baselines/phases/parse-args.js +5 -38
  271. package/.agents/scripts/lib/orchestration/check-baselines/phases/pipeline.js +3 -8
  272. package/.agents/scripts/lib/orchestration/check-baselines/phases/refresh-ack.js +28 -136
  273. package/.agents/scripts/lib/orchestration/check-baselines/phases/report.js +3 -13
  274. package/.agents/scripts/lib/orchestration/check-state.js +92 -0
  275. package/.agents/scripts/lib/orchestration/ci-gap-intake.js +37 -144
  276. package/.agents/scripts/lib/orchestration/ci-rerun-guard.js +42 -189
  277. package/.agents/scripts/lib/orchestration/code-review.js +24 -128
  278. package/.agents/scripts/lib/orchestration/column-sync.js +23 -111
  279. package/.agents/scripts/lib/orchestration/complexity-gate.js +42 -214
  280. package/.agents/scripts/lib/orchestration/deliver-recover.js +36 -168
  281. package/.agents/scripts/lib/orchestration/dependency-analyzer.js +4 -35
  282. package/.agents/scripts/lib/orchestration/dependency-candidates.js +9 -41
  283. package/.agents/scripts/lib/orchestration/diff-magnitude.js +25 -115
  284. package/.agents/scripts/lib/orchestration/doc-reader.js +2 -6
  285. package/.agents/scripts/lib/orchestration/docs-digest.js +13 -51
  286. package/.agents/scripts/lib/orchestration/epic-candidates.js +13 -53
  287. package/.agents/scripts/lib/orchestration/epic-checklist.js +9 -33
  288. package/.agents/scripts/lib/orchestration/epic-container.js +41 -167
  289. package/.agents/scripts/lib/orchestration/epic-expansion.js +10 -40
  290. package/.agents/scripts/lib/orchestration/epic-rollup.js +55 -207
  291. package/.agents/scripts/lib/orchestration/file-assumption-enum.js +2 -22
  292. package/.agents/scripts/lib/orchestration/file-assumptions.js +45 -253
  293. package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-detect.js +9 -46
  294. package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-reap.js +7 -57
  295. package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches.js +21 -126
  296. package/.agents/scripts/lib/orchestration/git-cleanup/phases/cli.js +2 -6
  297. package/.agents/scripts/lib/orchestration/git-cleanup/phases/fast-forward.js +1 -4
  298. package/.agents/scripts/lib/orchestration/git-cleanup/phases/filters.js +1 -5
  299. package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes-ff.js +9 -34
  300. package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes.js +41 -190
  301. package/.agents/scripts/lib/orchestration/git-cleanup/phases/merged-tip.js +9 -45
  302. package/.agents/scripts/lib/orchestration/git-cleanup/phases/parse-args.js +1 -4
  303. package/.agents/scripts/lib/orchestration/git-cleanup/phases/phase-drivers.js +19 -85
  304. package/.agents/scripts/lib/orchestration/git-cleanup/phases/prompts.js +3 -17
  305. package/.agents/scripts/lib/orchestration/git-cleanup/phases/prune.js +1 -5
  306. package/.agents/scripts/lib/orchestration/git-cleanup/phases/render.js +16 -100
  307. package/.agents/scripts/lib/orchestration/git-cleanup/phases/stashes.js +1 -4
  308. package/.agents/scripts/lib/orchestration/lease-guard-shared.js +16 -67
  309. package/.agents/scripts/lib/orchestration/lifecycle/emit-ledger-event.js +9 -33
  310. package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-flip-failed.js +8 -29
  311. package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-unlanded.js +15 -68
  312. package/.agents/scripts/lib/orchestration/light-backstop.js +11 -49
  313. package/.agents/scripts/lib/orchestration/light-escalation.js +21 -89
  314. package/.agents/scripts/lib/orchestration/light-suitability.js +26 -231
  315. package/.agents/scripts/lib/orchestration/merge-block-class.js +39 -216
  316. package/.agents/scripts/lib/orchestration/merge-poll.js +104 -377
  317. package/.agents/scripts/lib/orchestration/merge-queue.js +158 -0
  318. package/.agents/scripts/lib/orchestration/pinned-identifier-lint.js +17 -57
  319. package/.agents/scripts/lib/orchestration/plan-context.js +52 -303
  320. package/.agents/scripts/lib/orchestration/plan-critic-conditions.js +22 -79
  321. package/.agents/scripts/lib/orchestration/plan-critics-evaluate.js +5 -31
  322. package/.agents/scripts/lib/orchestration/plan-metrics.js +29 -108
  323. package/.agents/scripts/lib/orchestration/plan-navigation.js +8 -27
  324. package/.agents/scripts/lib/orchestration/plan-persist/acceptance-handle-repair.js +12 -49
  325. package/.agents/scripts/lib/orchestration/plan-persist/audit-provenance.js +18 -73
  326. package/.agents/scripts/lib/orchestration/plan-persist/changes-repair.js +14 -78
  327. package/.agents/scripts/lib/orchestration/plan-persist/cross-plan-links.js +6 -30
  328. package/.agents/scripts/lib/orchestration/plan-persist/epic-adoption.js +14 -65
  329. package/.agents/scripts/lib/orchestration/plan-persist/epic-ops.js +21 -76
  330. package/.agents/scripts/lib/orchestration/plan-persist/external-deps.js +6 -43
  331. package/.agents/scripts/lib/orchestration/plan-persist/persist-helpers.js +14 -68
  332. package/.agents/scripts/lib/orchestration/plan-persist/plan-context-source.js +9 -41
  333. package/.agents/scripts/lib/orchestration/plan-persist/run-plan-persist.js +49 -248
  334. package/.agents/scripts/lib/orchestration/plan-persist/soft-findings.js +2 -12
  335. package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +85 -368
  336. package/.agents/scripts/lib/orchestration/plan-persist/summary.js +8 -38
  337. package/.agents/scripts/lib/orchestration/plan-persist/supersede-ops.js +30 -190
  338. package/.agents/scripts/lib/orchestration/plan-persist/wave-collision-gate.js +9 -49
  339. package/.agents/scripts/lib/orchestration/plan-persist/wave-serialisation.js +7 -28
  340. package/.agents/scripts/lib/orchestration/plan-reachability.js +13 -42
  341. package/.agents/scripts/lib/orchestration/plan-run-labels/reap.js +16 -91
  342. package/.agents/scripts/lib/orchestration/plan-runner/worktree-sweep.js +16 -54
  343. package/.agents/scripts/lib/orchestration/plan-text-hygiene.js +10 -52
  344. package/.agents/scripts/lib/orchestration/planning/authoring-context.js +14 -109
  345. package/.agents/scripts/lib/orchestration/planning/memory-pool-advisory.js +11 -83
  346. package/.agents/scripts/lib/orchestration/pr-watch.js +48 -306
  347. package/.agents/scripts/lib/orchestration/project-meta-cache.js +15 -80
  348. package/.agents/scripts/lib/orchestration/project-meta-resolver.js +10 -51
  349. package/.agents/scripts/lib/orchestration/reassert-status-column.js +12 -76
  350. package/.agents/scripts/lib/orchestration/remote-verifier.js +12 -36
  351. package/.agents/scripts/lib/orchestration/resolve-stories.js +33 -164
  352. package/.agents/scripts/lib/orchestration/retro-proposals.js +66 -361
  353. package/.agents/scripts/lib/orchestration/review-base-ref.js +9 -43
  354. package/.agents/scripts/lib/orchestration/review-depth.js +12 -94
  355. package/.agents/scripts/lib/orchestration/review-providers/codex.js +10 -111
  356. package/.agents/scripts/lib/orchestration/review-providers/degraded-gates.js +13 -71
  357. package/.agents/scripts/lib/orchestration/review-providers/findings-renderer.js +7 -51
  358. package/.agents/scripts/lib/orchestration/review-providers/mi-exemptions.js +8 -53
  359. package/.agents/scripts/lib/orchestration/review-providers/native.js +30 -214
  360. package/.agents/scripts/lib/orchestration/review-providers/parse-findings.js +7 -52
  361. package/.agents/scripts/lib/orchestration/review-providers/review-depth.js +4 -33
  362. package/.agents/scripts/lib/orchestration/review-providers/review-provider-factory.js +11 -71
  363. package/.agents/scripts/lib/orchestration/review-providers/scoped-lint.js +19 -131
  364. package/.agents/scripts/lib/orchestration/review-providers/security-review.js +6 -89
  365. package/.agents/scripts/lib/orchestration/review-providers/types.js +26 -56
  366. package/.agents/scripts/lib/orchestration/review-providers/ultrareview.js +3 -46
  367. package/.agents/scripts/lib/orchestration/run-epilogue.js +40 -199
  368. package/.agents/scripts/lib/orchestration/run-scoped-config.js +13 -81
  369. package/.agents/scripts/lib/orchestration/single-story-close/close-note.js +7 -34
  370. package/.agents/scripts/lib/orchestration/single-story-close/failed-terminal.js +16 -89
  371. package/.agents/scripts/lib/orchestration/single-story-close/gate-log.js +18 -109
  372. package/.agents/scripts/lib/orchestration/single-story-close/phases/auto-merge.js +190 -280
  373. package/.agents/scripts/lib/orchestration/single-story-close/phases/base-sync.js +18 -80
  374. package/.agents/scripts/lib/orchestration/single-story-close/phases/close-validation.js +103 -97
  375. package/.agents/scripts/lib/orchestration/single-story-close/phases/code-review.js +8 -64
  376. package/.agents/scripts/lib/orchestration/single-story-close/phases/confirm-merge.js +183 -485
  377. package/.agents/scripts/lib/orchestration/single-story-close/phases/conventional-subject.js +30 -134
  378. package/.agents/scripts/lib/orchestration/single-story-close/phases/graphql-preflight.js +9 -50
  379. package/.agents/scripts/lib/orchestration/single-story-close/phases/lock-wait-pending.js +49 -0
  380. package/.agents/scripts/lib/orchestration/single-story-close/phases/normalize-pr-title.js +13 -86
  381. package/.agents/scripts/lib/orchestration/single-story-close/phases/options.js +20 -95
  382. package/.agents/scripts/lib/orchestration/single-story-close/phases/post-land.js +46 -203
  383. package/.agents/scripts/lib/orchestration/single-story-close/phases/pre-gate-steps.js +8 -50
  384. package/.agents/scripts/lib/orchestration/single-story-close/phases/pull-request.js +12 -83
  385. package/.agents/scripts/lib/orchestration/single-story-close/phases/push.js +6 -39
  386. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-block.js +1 -6
  387. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-outcome.js +4 -28
  388. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-override.js +6 -51
  389. package/.agents/scripts/lib/orchestration/single-story-close/phases/worktree-reap.js +6 -34
  390. package/.agents/scripts/lib/orchestration/single-story-close/phases/wrong-tree-guard.js +23 -121
  391. package/.agents/scripts/lib/orchestration/single-story-close/runner.js +110 -290
  392. package/.agents/scripts/lib/orchestration/single-story-lease-guard.js +15 -69
  393. package/.agents/scripts/lib/orchestration/story-body-gate.js +4 -23
  394. package/.agents/scripts/lib/orchestration/story-close/baseline-upward-writeback.js +50 -179
  395. package/.agents/scripts/lib/orchestration/story-close/context-budget-writeback.js +11 -41
  396. package/.agents/scripts/lib/orchestration/story-close/format-autofix.js +23 -311
  397. package/.agents/scripts/lib/orchestration/story-close/phases/local-lens-review.js +22 -147
  398. package/.agents/scripts/lib/orchestration/story-close/phases/review-core.js +16 -67
  399. package/.agents/scripts/lib/orchestration/story-deliver-terminal-schema.js +12 -68
  400. package/.agents/scripts/lib/orchestration/story-deliver-terminal.js +42 -201
  401. package/.agents/scripts/lib/orchestration/story-follow-ups.js +43 -245
  402. package/.agents/scripts/lib/orchestration/story-init-envelope.js +4 -23
  403. package/.agents/scripts/lib/orchestration/story-init-remote.js +2 -6
  404. package/.agents/scripts/lib/orchestration/story-reachability.js +3 -23
  405. package/.agents/scripts/lib/orchestration/task-body-validator.js +12 -126
  406. package/.agents/scripts/lib/orchestration/ticket-lease.js +28 -131
  407. package/.agents/scripts/lib/orchestration/ticket-validator-conflicts.js +15 -149
  408. package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +5 -33
  409. package/.agents/scripts/lib/orchestration/ticket-validator.js +39 -181
  410. package/.agents/scripts/lib/orchestration/ticketing/bulk.js +51 -244
  411. package/.agents/scripts/lib/orchestration/ticketing/reads.js +39 -250
  412. package/.agents/scripts/lib/orchestration/ticketing/state.js +14 -68
  413. package/.agents/scripts/lib/orchestration/ticketing/transition.js +46 -263
  414. package/.agents/scripts/lib/orchestration/ticketing.js +2 -26
  415. package/.agents/scripts/lib/orchestration/verify-credit.js +18 -79
  416. package/.agents/scripts/lib/orchestration/worktree-dirty.js +5 -30
  417. package/.agents/scripts/lib/path-security.js +3 -6
  418. package/.agents/scripts/lib/plan-phase-cleanup.js +9 -49
  419. package/.agents/scripts/lib/preflight-runner.js +13 -69
  420. package/.agents/scripts/lib/process-group.js +143 -0
  421. package/.agents/scripts/lib/project-root.js +2 -8
  422. package/.agents/scripts/lib/provider-factory.js +2 -25
  423. package/.agents/scripts/lib/qa/console-allowlist.js +10 -59
  424. package/.agents/scripts/lib/qa/qa-session.js +15 -69
  425. package/.agents/scripts/lib/qa/redact-evidence.js +18 -129
  426. package/.agents/scripts/lib/qa/resolve-qa-contract.js +26 -135
  427. package/.agents/scripts/lib/qa/resolve-selection.js +16 -84
  428. package/.agents/scripts/lib/reserved-test-ids.js +9 -47
  429. package/.agents/scripts/lib/runtime-deps/dep-resolution.js +13 -53
  430. package/.agents/scripts/lib/runtime-deps/ensure-installed.js +10 -44
  431. package/.agents/scripts/lib/runtime-deps/manifest.js +10 -30
  432. package/.agents/scripts/lib/runtime-deps/parser-major.js +15 -51
  433. package/.agents/scripts/lib/runtime-deps/preflight.js +4 -22
  434. package/.agents/scripts/lib/runtime-deps/scan-imports.js +11 -55
  435. package/.agents/scripts/lib/signals/detectors/common.js +12 -38
  436. package/.agents/scripts/lib/signals/index.js +2 -19
  437. package/.agents/scripts/lib/signals/schema.js +14 -109
  438. package/.agents/scripts/lib/signals/write.js +2 -11
  439. package/.agents/scripts/lib/single-story/confirm-merge.js +31 -72
  440. package/.agents/scripts/lib/single-story/story-merged-notify.js +8 -49
  441. package/.agents/scripts/lib/single-story-sweep/protection-ctx.js +4 -26
  442. package/.agents/scripts/lib/single-story-sweep/protection.js +13 -100
  443. package/.agents/scripts/lib/single-story-sweep/sweep-lock.js +60 -258
  444. package/.agents/scripts/lib/single-story-sweep.js +14 -97
  445. package/.agents/scripts/lib/skills/parse-skill.js +13 -59
  446. package/.agents/scripts/lib/skills/skills-index.js +8 -29
  447. package/.agents/scripts/lib/skills/walk-skill-files.js +17 -78
  448. package/.agents/scripts/lib/source-extensions.js +11 -42
  449. package/.agents/scripts/lib/source-text/strip-js-comments.js +8 -41
  450. package/.agents/scripts/lib/stdio-flush.js +9 -36
  451. package/.agents/scripts/lib/story-adjacency.js +8 -40
  452. package/.agents/scripts/lib/story-body/body-format-lints.js +22 -83
  453. package/.agents/scripts/lib/story-body/footer-block.js +11 -44
  454. package/.agents/scripts/lib/story-body/story-body.js +83 -358
  455. package/.agents/scripts/lib/temp-retention.js +42 -143
  456. package/.agents/scripts/lib/templates/decomposer-prompts.js +11 -65
  457. package/.agents/scripts/lib/test-env.js +12 -65
  458. package/.agents/scripts/lib/test-run-credit.js +10 -65
  459. package/.agents/scripts/lib/test-runner-contract.js +19 -74
  460. package/.agents/scripts/lib/test-temp.js +38 -184
  461. package/.agents/scripts/lib/test-tiers.js +12 -96
  462. package/.agents/scripts/lib/ticket-body-sections.js +21 -96
  463. package/.agents/scripts/lib/transpile.js +15 -74
  464. package/.agents/scripts/lib/util/concurrent-map.js +6 -25
  465. package/.agents/scripts/lib/util/parse-id-list.js +8 -34
  466. package/.agents/scripts/lib/util/poll-loop.js +8 -28
  467. package/.agents/scripts/lib/util/with-timeout.js +2 -11
  468. package/.agents/scripts/lib/validation-evidence.js +21 -96
  469. package/.agents/scripts/lib/wave-runner/footprint.js +17 -70
  470. package/.agents/scripts/lib/wave-runner/live-probe.js +53 -221
  471. package/.agents/scripts/lib/wave-runner/ready-set.js +72 -301
  472. package/.agents/scripts/lib/workers/crap-worker.js +11 -64
  473. package/.agents/scripts/lib/workers/maintainability-report-worker.js +8 -45
  474. package/.agents/scripts/lib/workers/maintainability-worker.js +5 -21
  475. package/.agents/scripts/lib/workers/serve-worker-messages.js +2 -18
  476. package/.agents/scripts/lib/workflow-closure.js +22 -105
  477. package/.agents/scripts/lib/workspace-provisioner.js +16 -54
  478. package/.agents/scripts/lib/worktree/git-hooks.js +15 -60
  479. package/.agents/scripts/lib/worktree/lifecycle/force-drain.js +20 -60
  480. package/.agents/scripts/lib/worktree/lifecycle/merge-reachability.js +10 -62
  481. package/.agents/scripts/lib/worktree/lifecycle/pending-cleanup.js +22 -86
  482. package/.agents/scripts/lib/worktree/lifecycle/reap.js +24 -126
  483. package/.agents/scripts/lib/worktree/lifecycle-manager.js +2 -20
  484. package/.agents/scripts/lib/worktree/node-modules-strategy.js +46 -180
  485. package/.agents/scripts/lib/worktree-manager.js +15 -40
  486. package/.agents/scripts/lint-issue-body.js +12 -68
  487. package/.agents/scripts/mandrel-update-preflight.js +10 -70
  488. package/.agents/scripts/merge-baseline.js +30 -104
  489. package/.agents/scripts/nav-registry-diff.js +22 -108
  490. package/.agents/scripts/notify.js +12 -69
  491. package/.agents/scripts/plan-context.js +27 -111
  492. package/.agents/scripts/plan-critics.js +12 -66
  493. package/.agents/scripts/plan-persist.js +31 -148
  494. package/.agents/scripts/plan-run-epilogue.js +11 -37
  495. package/.agents/scripts/pr-watch-with-update.js +76 -267
  496. package/.agents/scripts/providers/github/auth.js +3 -8
  497. package/.agents/scripts/providers/github/blocked-by-add.js +14 -61
  498. package/.agents/scripts/providers/github/board-add.js +5 -21
  499. package/.agents/scripts/providers/github/branch-protection.js +11 -43
  500. package/.agents/scripts/providers/github/cache.js +2 -14
  501. package/.agents/scripts/providers/github/comments.js +7 -40
  502. package/.agents/scripts/providers/github/compose.js +3 -19
  503. package/.agents/scripts/providers/github/errors.js +22 -125
  504. package/.agents/scripts/providers/github/issues.js +31 -123
  505. package/.agents/scripts/providers/github/labels.js +24 -124
  506. package/.agents/scripts/providers/github/mappers.js +5 -27
  507. package/.agents/scripts/providers/github/merge-methods.js +3 -22
  508. package/.agents/scripts/providers/github/project-board.js +2 -17
  509. package/.agents/scripts/providers/github/projects-v2-graphql.js +3 -6
  510. package/.agents/scripts/providers/github/request-helpers.js +5 -32
  511. package/.agents/scripts/providers/github/search-budget.js +9 -39
  512. package/.agents/scripts/providers/github/search-query.js +5 -26
  513. package/.agents/scripts/providers/github/sub-issue-add.js +15 -65
  514. package/.agents/scripts/providers/github/sub-issues.js +7 -36
  515. package/.agents/scripts/providers/github/tickets.js +32 -134
  516. package/.agents/scripts/providers/github.js +18 -59
  517. package/.agents/scripts/prune-plan-run-labels.js +12 -46
  518. package/.agents/scripts/quality-preview.js +35 -220
  519. package/.agents/scripts/resolve-doc-tiers.js +3 -26
  520. package/.agents/scripts/resolve-stories.js +16 -67
  521. package/.agents/scripts/resync-status-column.js +6 -25
  522. package/.agents/scripts/run-tests.js +29 -104
  523. package/.agents/scripts/single-story-close.js +23 -135
  524. package/.agents/scripts/single-story-confirm-merge.js +32 -139
  525. package/.agents/scripts/single-story-init.js +47 -209
  526. package/.agents/scripts/stories-wave-tick.js +102 -472
  527. package/.agents/scripts/sync-agentrc.js +3 -21
  528. package/.agents/scripts/sync-claude-agents.js +9 -55
  529. package/.agents/scripts/sync-claude-commands.js +20 -110
  530. package/.agents/scripts/test-wrapper.js +6 -43
  531. package/.agents/scripts/update-coverage-baseline.js +5 -22
  532. package/.agents/scripts/update-crap-baseline.js +7 -30
  533. package/.agents/scripts/update-duplication-baseline.js +16 -92
  534. package/.agents/scripts/update-maintainability-baseline.js +8 -62
  535. package/.agents/scripts/update-ticket-state.js +1 -7
  536. package/.agents/scripts/validate-skills.js +6 -26
  537. package/.agents/templates/agent-protocol.md +2 -2
  538. package/.agents/templates/docs/audit-sweep-runbook.md +3 -4
  539. package/.agents/workflows/audit-accessibility.md +4 -7
  540. package/.agents/workflows/audit-adrs.md +3 -6
  541. package/.agents/workflows/audit-architecture.md +3 -11
  542. package/.agents/workflows/audit-baselines.md +6 -9
  543. package/.agents/workflows/audit-clean-code.md +8 -12
  544. package/.agents/workflows/audit-data-model.md +3 -7
  545. package/.agents/workflows/audit-dependencies.md +4 -7
  546. package/.agents/workflows/audit-devops.md +4 -8
  547. package/.agents/workflows/audit-documentation.md +1 -4
  548. package/.agents/workflows/audit-mobile.md +4 -7
  549. package/.agents/workflows/audit-navigability.md +3 -6
  550. package/.agents/workflows/audit-performance.md +2 -4
  551. package/.agents/workflows/audit-privacy.md +4 -7
  552. package/.agents/workflows/audit-quality.md +4 -7
  553. package/.agents/workflows/audit-security.md +4 -7
  554. package/.agents/workflows/audit-seo.md +4 -7
  555. package/.agents/workflows/audit-sre.md +4 -7
  556. package/.agents/workflows/audit-to-stories.md +17 -30
  557. package/.agents/workflows/audit-ux-ui.md +4 -7
  558. package/.agents/workflows/helpers/audit-lens-core.md +1 -1
  559. package/.agents/workflows/helpers/code-quality-guardrails.md +12 -15
  560. package/.agents/workflows/helpers/deliver-digest.md +6 -4
  561. package/.agents/workflows/helpers/deliver-reference.md +114 -188
  562. package/.agents/workflows/helpers/deliver-story-reference.md +189 -533
  563. package/.agents/workflows/helpers/plan-reference.md +86 -139
  564. package/.agents/workflows/helpers/qa-core.md +12 -0
  565. package/.agents/workflows/memory-consolidate.md +1 -1
  566. package/.agents/workflows/qa-assist.md +27 -71
  567. package/.agents/workflows/qa-explore.md +19 -59
  568. package/.agents/workflows/qa-run.md +11 -33
  569. package/README.md +1 -1
  570. package/bin/mandrel.js +5 -46
  571. package/bin/postinstall.js +18 -107
  572. package/docs/CHANGELOG.md +32 -0
  573. package/lib/cli/doctor.js +11 -71
  574. package/lib/cli/init.js +26 -165
  575. package/lib/cli/migrate.js +5 -64
  576. package/lib/cli/registry.js +84 -467
  577. package/lib/cli/sync-agents.js +4 -64
  578. package/lib/cli/sync-commands.js +11 -64
  579. package/lib/cli/sync.js +34 -213
  580. package/lib/cli/uninstall.js +40 -219
  581. package/lib/cli/update.js +105 -661
  582. package/lib/cli/version-check.js +8 -72
  583. package/lib/cli/version-helpers.js +14 -87
  584. package/lib/migrations/helpers/retire-agentrc-key.js +11 -52
  585. package/lib/migrations/index.js +15 -92
  586. package/lib/migrations/steps/2.1.0-retire-mi-drop-knobs.js +2 -15
  587. package/lib/migrations/steps/2.1.0-retire-verify-concurrency-cap.js +1 -13
  588. package/lib/migrations/steps/2.11.0-retire-max-seed-words.js +2 -15
  589. package/lib/migrations/steps/2.2.0-retire-epic-ac-tags.js +9 -38
  590. package/lib/migrations/steps/2.20.0-retire-codebase-snapshot.js +1 -13
  591. package/lib/migrations/steps/2.32.0-retire-lint-baseline-command.js +2 -27
  592. package/lib/migrations/steps/2.57.0-retire-delivery-limit-knobs.js +2 -23
  593. package/lib/migrations/steps/2.57.0-retire-planning-limit-knobs.js +2 -27
  594. package/lib/migrations/steps/2.60.0-retire-audit-results-autofile.js +2 -21
  595. package/lib/migrations/steps/strip-removed-agentrc-keys.js +333 -0
  596. package/package.json +16 -14
  597. package/.agents/docs/SDLC.md +0 -590
  598. package/.agents/docs/quality-gates.md +0 -1183
  599. package/.agents/rules/known-tooling-behavior.md +0 -200
  600. package/.agents/rules/orchestration-error-handling.md +0 -61
  601. package/.agents/rules/test-seams.md +0 -59
  602. package/.agents/schemas/baselines/lighthouse.schema.json +0 -59
  603. package/.agents/schemas/baselines/lint.schema.json +0 -47
  604. package/.agents/scripts/check-action-pinning.js +0 -260
  605. package/.agents/scripts/check-audit-attribution.js +0 -302
  606. package/.agents/scripts/check-baseline-drift.js +0 -211
  607. package/.agents/scripts/check-baseline-scope.js +0 -362
  608. package/.agents/scripts/check-generated-validator.js +0 -202
  609. package/.agents/scripts/check-knip-entries.js +0 -159
  610. package/.agents/scripts/check-lifecycle-lint.js +0 -294
  611. package/.agents/scripts/check-pinned-override-notes.js +0 -102
  612. package/.agents/scripts/check-schema-references.js +0 -368
  613. package/.agents/scripts/check-test-portability.js +0 -512
  614. package/.agents/scripts/check-workflow-citations.js +0 -218
  615. package/.agents/scripts/check-workflow-cli-lint.js +0 -299
  616. package/.agents/scripts/check-workflow-timeouts.js +0 -291
  617. package/.agents/scripts/install-matrix-assert.js +0 -326
  618. package/.agents/scripts/lib/audit-advisories.js +0 -195
  619. package/.agents/scripts/lib/audit-attribution.js +0 -134
  620. package/.agents/scripts/lib/baselines/drift-detector.js +0 -351
  621. package/.agents/scripts/lib/baselines/kinds/lighthouse.js +0 -87
  622. package/.agents/scripts/lib/baselines/kinds/lint.js +0 -184
  623. package/.agents/scripts/lib/baselines/orphan-pruner.js +0 -233
  624. package/.agents/scripts/lib/baselines/scope-assert.js +0 -223
  625. package/.agents/scripts/lib/baselines/scope-inventory.js +0 -314
  626. package/.agents/scripts/lib/c8-cli-path.js +0 -21
  627. package/.agents/scripts/lib/config/gates/lighthouse.schema.js +0 -51
  628. package/.agents/scripts/lib/config/gates/lint.schema.js +0 -18
  629. package/.agents/scripts/lib/dynamic-workflow/architecture-report-contract.js +0 -70
  630. package/.agents/scripts/lib/dynamic-workflow/audit-orchestrator.js +0 -284
  631. package/.agents/scripts/lib/dynamic-workflow/clean-code-report-contract.js +0 -80
  632. package/.agents/scripts/lib/dynamic-workflow/degraded-coverage.js +0 -81
  633. package/.agents/scripts/lib/dynamic-workflow/documentation-report-contract.js +0 -87
  634. package/.agents/scripts/lib/dynamic-workflow/performance-report-contract.js +0 -74
  635. package/.agents/scripts/lib/dynamic-workflow/quality-report-contract.js +0 -90
  636. package/.agents/scripts/lib/dynamic-workflow/report-contract-core.js +0 -43
  637. package/.agents/scripts/lib/dynamic-workflow/security-report-contract.js +0 -83
  638. package/.agents/scripts/lib/fs-walk.js +0 -52
  639. package/.agents/scripts/lib/knip-config-resolver.js +0 -181
  640. package/.agents/scripts/lib/knip-entry-sync.js +0 -452
  641. package/.agents/scripts/lib/pinned-override-notes.js +0 -88
  642. package/.agents/scripts/lib/pinned-override-resolve.js +0 -212
  643. package/.agents/scripts/lib/test-isolate/cli-options.js +0 -93
  644. package/.agents/scripts/lib/test-isolate/env-snapshot-loader.js +0 -52
  645. package/.agents/scripts/lib/test-isolate/list-files.js +0 -90
  646. package/.agents/scripts/lib/test-isolate/parse-tap.js +0 -75
  647. package/.agents/scripts/lib/test-isolate/progress-log.js +0 -45
  648. package/.agents/scripts/lib/test-isolate/render-report.js +0 -97
  649. package/.agents/scripts/lib/test-isolate/run-isolate.js +0 -87
  650. package/.agents/scripts/lib/test-isolate/runner.js +0 -483
  651. package/.agents/scripts/lib/test-profile/parse-tap.js +0 -136
  652. package/.agents/scripts/lib/test-profile/render-report.js +0 -45
  653. package/.agents/scripts/lint-label-vocabulary.js +0 -214
  654. package/.agents/scripts/post-structured-comment.js +0 -127
  655. package/.agents/scripts/provision-git-hooks.js +0 -85
  656. package/.agents/scripts/prune-baseline-orphans.js +0 -181
  657. package/.agents/scripts/run-coverage.js +0 -197
  658. package/.agents/scripts/run-lint.js +0 -133
  659. package/.agents/scripts/run-test-profile.js +0 -129
  660. package/.agents/scripts/run-verify.js +0 -125
  661. package/.agents/scripts/test-isolate.js +0 -55
  662. package/.agents/scripts/update-dead-exports-baseline.js +0 -321
@@ -1,48 +1,16 @@
1
1
  // .agents/scripts/lib/orchestration/ci-rerun-guard.js
2
2
  /**
3
- * ci-rerun-guard.js — the machine enforcement behind the no-rerun MUST in
4
- * [`rules/ci-remediation.md`](../../../rules/ci-remediation.md) § Verifier
5
- * (Story #4865). Owns the CI failure digest (write / read / retire), the
6
- * head-SHA discriminator, the auto-merge disarm, and the blocked-delivery
7
- * escalation. `pr-watch-with-update.js` is the enforcement point; this
8
- * module is the mechanism it drives.
3
+ * ci-rerun-guard.js — mechanism behind the no-rerun MUST in
4
+ * `rules/ci-remediation.md` § Verifier, driven by `pr-watch-with-update.js`:
5
+ * the CI failure digest, the head-SHA discriminator, and the block.
9
6
  *
10
- * **Why the first red, and not the rerun-green.** The obvious design —
11
- * observe a green that arrives on a re-run of the same commit, then disarm
12
- * auto-merge and block — cannot enforce anything. GitHub's native
13
- * auto-merge fires server-side the moment branch protection is satisfied,
14
- * so it races the watcher's next poll: by the time the rerun-green is
15
- * observed, the PR may already be merged. The only race-free observation
16
- * point is the **first red**, which necessarily precedes any green. So the
17
- * watcher disarms on red and records the PR head SHA; the head SHA is then
18
- * read at **re-arm** time, not at merge time.
19
- *
20
- * **Head SHA is the discriminator.** A green on a *different* head SHA is a
21
- * fix at source — legal, and it retires the digest. A green on the *same*
22
- * head SHA is a re-run of a failed job, which the rule forbids: the
23
- * delivery hard-stops at `agent::blocked` and a CI-gap intake filing
24
- * (`file-ci-gap.js`, carrying the run link and failure signature the digest
25
- * already holds) is required before it can proceed.
26
- *
27
- * **One rerun after a recorded verdict (Story #5343).** The single exception,
28
- * and it is evidence-gated rather than discretionary: once `file-ci-gap.js`
29
- * has filed a `capacity` or `unreproducible-tier` verdict **for the current
30
- * head SHA**, it stamps a `rerunAllowance` on the digest, and exactly one
31
- * same-SHA green is then admitted — the digest is retired and the delivery
32
- * proceeds. This closes the one shape where the rule stranded a correct
33
- * delivery: a runner that ran out of something has no fix at source to make,
34
- * so the branch could never move its head SHA and the block needed a human to
35
- * clear. Every other same-SHA green is still a violation, the allowance is
36
- * spent the moment it is honoured (it dies with the digest), and a second red
37
- * after the rerun is real: it writes a fresh digest with no allowance, so it
38
- * routes to Option 1 like any other red.
39
- *
40
- * **Fail closed on an unverifiable green.** A digest whose head SHA is
41
- * missing, or a current head SHA that `gh` could not resolve, leaves no
42
- * evidence that the red was fixed at source. An unresolved red plus no
43
- * evidence of a new commit is treated as a violation rather than waved
44
- * through — the same unknown-is-blocking posture the arming probe takes on
45
- * an unrecognized check state.
7
+ * Enforcement happens at the first red, not the rerun-green: native
8
+ * auto-merge fires server-side and races the watcher, so only the red is a
9
+ * race-free observation point. The watcher disarms on red and records the
10
+ * head SHA. A later green on a different SHA is a fix at source; on the
11
+ * same SHA it is a forbidden rerun, unless `file-ci-gap.js` recorded a
12
+ * `capacity`/`unreproducible-tier` allowance for that SHA (one rerun; it
13
+ * dies with the digest). A missing SHA on either side fails closed.
46
14
  */
47
15
 
48
16
  import {
@@ -57,6 +25,7 @@ import { spawnChild } from '../child-exec.js';
57
25
  import { resolveConfig } from '../config-resolver.js';
58
26
  import { Logger } from '../Logger.js';
59
27
  import { createProvider } from '../provider-factory.js';
28
+ import { isRerunPermitted } from './check-state.js';
60
29
  import {
61
30
  STATE_LABELS,
62
31
  transitionTicketState,
@@ -67,11 +36,8 @@ import {
67
36
  const MAX_PRIOR_REDS = 10;
68
37
 
69
38
  /**
70
- * The verdicts that earn the one same-SHA rerun (Story #5343). Both mean the
71
- * failure is a property of the *environment*, proven — so no commit on the
72
- * branch can move the head SHA to clear it. `pre-existing` is deliberately
73
- * excluded: it reproduces on `main`, which is a real defect someone owns and
74
- * a rerun cannot make go away.
39
+ * Verdicts earning the one same-SHA rerun: proven environment faults no
40
+ * commit can fix. `pre-existing` is excluded — a real defect on `main`.
75
41
  *
76
42
  * @type {readonly ['capacity', 'unreproducible-tier']}
77
43
  */
@@ -81,13 +47,6 @@ export const RERUN_ALLOWANCE_VERDICTS = Object.freeze([
81
47
  ]);
82
48
 
83
49
  /**
84
- * Resolve which ticket the digest is keyed to. Story #4539: the digest used
85
- * to be Epic-scoped by filename and returned `null` without an epic id — so
86
- * on the v2 Story path (which has no Epic and invokes the watch with `--pr`
87
- * alone) a red check wrote no digest at all, despite the module header
88
- * advertising one. v2.0.0 removed the Epic tier; Story scope is the only
89
- * scope.
90
- *
91
50
  * @param {{ storyId?: number|string|null }} opts
92
51
  * @returns {{ kind: 'story', id: number } | null}
93
52
  */
@@ -100,9 +59,8 @@ export function resolveDigestScope({ storyId = null } = {}) {
100
59
  }
101
60
 
102
61
  /**
103
- * Coarse failure classification from a failing-check name. Pure —
104
- * exported for tests. Deliberately shallow: it steers the operator's
105
- * next move (which `/loop` unit to reach for), not a root-cause verdict.
62
+ * Coarse classification from a check name; steers the next move, not a
63
+ * root-cause verdict.
106
64
  *
107
65
  * @param {string} name failing required-check name.
108
66
  * @returns {'test'|'lint'|'baseline'|'build'|'unknown'}
@@ -117,13 +75,7 @@ export function classifyFailure(name) {
117
75
  }
118
76
 
119
77
  /**
120
- * Resolve the `.json` / `.md` digest paths for a scope. Returns `null` when
121
- * no scope can be keyed (the digest is scoped by filename and has nothing
122
- * to key on).
123
- *
124
- * Module-private: `writeCiDigest` / `readCiDigest` / `retireCiDigest` are the
125
- * only callers and are the surface worth pinning, so the keying is asserted
126
- * through them rather than through an export nothing in production reaches.
78
+ * Digest paths for a scope; `null` without a Story id to key on.
127
79
  *
128
80
  * @param {{ storyId?: number|string|null, tempRoot: string, cwd: string }} opts
129
81
  * @returns {{ scope: { kind: 'story', id: number }, jsonPath: string, mdPath: string } | null}
@@ -141,10 +93,7 @@ function ciDigestPaths({ storyId = null, tempRoot, cwd }) {
141
93
  }
142
94
 
143
95
  /**
144
- * Default `gh run view --log-failed` spawn — pulls the tail of the failed
145
- * job log so the digest carries an actionable excerpt. Best-effort:
146
- * returns an empty tail when the run id is unknown or `gh` errors.
147
- * Injected into `writeCiDigest` so tests never shell out.
96
+ * Tail of the failed job log; best-effort, empty on any failure.
148
97
  */
149
98
  function ghRunLogTail({ runId, cwd, spawnFn, maxLines = 40 }) {
150
99
  if (!runId) return '';
@@ -160,11 +109,8 @@ function ghRunLogTail({ runId, cwd, spawnFn, maxLines = 40 }) {
160
109
  }
161
110
 
162
111
  /**
163
- * Resolve the failing check's run identity — the GitHub Actions run id AND
164
- * the run URL. Best-effort via `gh pr checks --json name,link`: the `link`
165
- * field carries the run URL whose trailing path segment is the run id. The
166
- * URL matters as much as the id, because the intake issue a
167
- * rerun violation demands must carry a run **link**.
112
+ * The failing check's run id and URL (the intake filing needs the link).
113
+ * Best-effort.
168
114
  *
169
115
  * @returns {{ runId: string|null, url: string|null }}
170
116
  */
@@ -188,10 +134,8 @@ function resolveFailingCheckRun({ prRef, checkName, cwd, spawnFn }) {
188
134
  }
189
135
 
190
136
  /**
191
- * Resolve the PR's current head SHA (`headRefOid`) — the discriminator
192
- * between a legal fix-at-source green and a forbidden rerun green. Returns
193
- * `null` when `gh` fails or the payload is unparseable; callers treat an
194
- * unresolvable head as unverifiable, never as "changed".
137
+ * The PR's head SHA; `null` on failure, which callers treat as
138
+ * unverifiable, never as "changed".
195
139
  *
196
140
  * @param {{ prRef: string, cwd: string, spawnFn?: Function }} opts
197
141
  * @returns {string|null}
@@ -216,60 +160,8 @@ export function resolvePrHeadSha({ prRef, cwd, spawnFn }) {
216
160
  }
217
161
 
218
162
  /**
219
- * A `gh` refusal that means auto-merge was never armed in the first place —
220
- * there is nothing to disarm, so the PR is already in the un-armed posture
221
- * the guard wants. Distinguishing this from a genuine disarm failure is
222
- * load-bearing: an armed PR that could not be disarmed is a blocker, while
223
- * a never-armed PR is the desired end state.
224
- */
225
- const NOT_ARMED = /not enabled|isn't enabled|is not set|no auto-?merge/i;
226
-
227
- /**
228
- * Disarm GitHub native auto-merge for the PR — the race-free response to the
229
- * first red. Never throws.
230
- *
231
- * @param {{ prRef: string, cwd: string, spawnFn?: Function }} opts
232
- * @returns {{ disarmed: boolean, alreadyUnarmed: boolean, detail: string }}
233
- * `disarmed` is true when the PR is (now) un-armed; `alreadyUnarmed`
234
- * distinguishes "there was nothing armed" from an executed disarm.
235
- */
236
- export function disarmAutoMerge({ prRef, cwd, spawnFn }) {
237
- let result;
238
- try {
239
- result = spawnChild('gh', ['pr', 'merge', prRef, '--disable-auto'], {
240
- run: spawnFn,
241
- cwd,
242
- });
243
- } catch (err) {
244
- return {
245
- disarmed: false,
246
- alreadyUnarmed: false,
247
- detail: `gh-spawn-error: ${err?.message ?? err}`,
248
- };
249
- }
250
- const status = result?.status ?? 1;
251
- const stderr = String(result?.stderr ?? '').trim();
252
- if (status === 0) {
253
- return { disarmed: true, alreadyUnarmed: false, detail: 'disarmed' };
254
- }
255
- if (NOT_ARMED.test(stderr)) {
256
- return {
257
- disarmed: true,
258
- alreadyUnarmed: true,
259
- detail: `auto-merge was not armed: ${stderr.slice(0, 160)}`,
260
- };
261
- }
262
- return {
263
- disarmed: false,
264
- alreadyUnarmed: false,
265
- detail: `gh-exit-${status}: ${stderr.slice(0, 200)}`,
266
- };
267
- }
268
-
269
- /**
270
- * Read the CI failure digest for a scope, or `null` when none exists (or it
271
- * is unreadable / malformed — an unparseable digest carries no enforceable
272
- * evidence, so it is treated as absent).
163
+ * The digest, or `null`; a malformed one carries no evidence and counts as
164
+ * absent.
273
165
  *
274
166
  * @param {{ storyId?: number|string|null, tempRoot: string, cwd: string }} opts
275
167
  * @returns {object|null}
@@ -286,8 +178,7 @@ export function readCiDigest({ storyId = null, tempRoot, cwd }) {
286
178
  }
287
179
 
288
180
  /**
289
- * Retire the digest for a scope — the red it recorded was resolved at
290
- * source. Best-effort; returns the paths removed (or `null`).
181
+ * Retire the digest once its red is resolved.
291
182
  *
292
183
  * @param {{ storyId?: number|string|null, tempRoot: string, cwd: string }} opts
293
184
  * @returns {{ jsonPath: string, mdPath: string } | null}
@@ -301,9 +192,7 @@ export function retireCiDigest({ storyId = null, tempRoot, cwd }) {
301
192
  }
302
193
 
303
194
  /**
304
- * Condense a digest into the record kept in a successor digest's
305
- * `priorReds`, so a second red on a new head never silently erases the
306
- * evidence of an unresolved earlier one.
195
+ * Summary kept in `priorReds` so a new red never erases an unresolved one.
307
196
  */
308
197
  function summarizeRed(digest) {
309
198
  return {
@@ -316,9 +205,7 @@ function summarizeRed(digest) {
316
205
  }
317
206
 
318
207
  /**
319
- * Carry forward the unresolved reds an incoming digest must not lose. A
320
- * re-red on the SAME head is the same unresolved red observed again, so it
321
- * is not duplicated into the history.
208
+ * A re-red on the same head is not duplicated into history.
322
209
  */
323
210
  function carryPriorReds(previous, headSha) {
324
211
  if (!previous) return [];
@@ -330,10 +217,6 @@ function carryPriorReds(previous, headSha) {
330
217
  return history.slice(-MAX_PRIOR_REDS);
331
218
  }
332
219
 
333
- /**
334
- * Render the human-readable digest. Names the head SHA, because that is the
335
- * field the green path adjudicates on.
336
- */
337
220
  function renderDigestMarkdown(digest, failures) {
338
221
  return [
339
222
  `# CI failure digest — Story #${digest.storyId} (PR #${digest.prNumber})`,
@@ -373,9 +256,7 @@ function renderDigestMarkdown(digest, failures) {
373
256
  }
374
257
 
375
258
  /**
376
- * Write the CI failure digest (`.json` + `.md`) for a red watch. Returns
377
- * the two paths written, or `null` when no story id was supplied (the
378
- * digest is scoped by filename and has nothing to key on).
259
+ * Write the digest (`.json` + `.md`); `null` without a Story id.
379
260
  *
380
261
  * @param {object} opts
381
262
  * @param {number|string|null} [opts.storyId] The v2 delivery scope.
@@ -387,9 +268,7 @@ function renderDigestMarkdown(digest, failures) {
387
268
  * @param {string} opts.prRef
388
269
  * @param {Function} [opts.checkRunFn]
389
270
  * @param {Function} [opts.logTailFn]
390
- * @param {Function} [opts.spawnFn] Child runner handed to the two default
391
- * `gh` probes, so their real bodies can be exercised without shelling out.
392
- * Ignored when `checkRunFn` / `logTailFn` are replaced outright.
271
+ * @param {Function} [opts.spawnFn] Child runner for the default `gh` probes.
393
272
  * @returns {{ jsonPath: string, mdPath: string } | null}
394
273
  */
395
274
  export function writeCiDigest({
@@ -438,18 +317,9 @@ export function writeCiDigest({
438
317
  }
439
318
 
440
319
  /**
441
- * Stamp the one-rerun allowance on the scope's digest (Story #5343).
442
- *
443
- * Called by `file-ci-gap.js` after it has filed the intake issue, so the
444
- * allowance exists only where the evidence the filing carries does. It is
445
- * keyed on the digest's own head SHA — the head the red was recorded
446
- * against — so an allowance can never be honoured on a later head it was not
447
- * earned for.
448
- *
449
- * Best-effort and non-throwing: a digest that cannot be re-read or re-written
450
- * simply records no allowance, and the guard keeps blocking. Returns the
451
- * recorded allowance, or `null` when none was written (no digest, an
452
- * ineligible verdict, or an unresolved head SHA).
320
+ * Stamp the one-rerun allowance, called by `file-ci-gap.js` after filing.
321
+ * Keyed on the digest's own head SHA so it cannot apply to a later head.
322
+ * Non-throwing; `null` when nothing was written (the guard keeps blocking).
453
323
  *
454
324
  * @param {{
455
325
  * storyId?: number|string|null,
@@ -488,10 +358,6 @@ export function recordRerunAllowance({
488
358
  }
489
359
 
490
360
  /**
491
- * The allowance a digest carries for `headSha`, or `null`. An allowance
492
- * recorded against a different head is not one: the red it was filed for is
493
- * not the red being adjudicated.
494
- *
495
361
  * @param {object|null} digest
496
362
  * @param {string|null} headSha
497
363
  * @returns {{ verdict: string, headSha: string } | null}
@@ -508,18 +374,10 @@ function allowanceFor(digest, headSha) {
508
374
  }
509
375
 
510
376
  /**
511
- * Adjudicate an all-green watch against any digest recorded for the scope.
377
+ * Adjudicate an all-green watch against the scope's digest (see header).
512
378
  *
513
379
  * @param {{ digest: object|null, headSha: string|null }} opts
514
380
  * @returns {{ verdict: 'clean'|'fix-at-source'|'rerun-permitted'|'rerun'|'unverifiable', reason: string }}
515
- * - `clean` — no digest: this delivery never went red.
516
- * - `fix-at-source` — the head SHA moved since the red; legal.
517
- * - `rerun-permitted` — same head SHA, but `file-ci-gap.js` recorded a
518
- * `capacity` / `unreproducible-tier` verdict for it;
519
- * the one sanctioned rerun (Story #5343).
520
- * - `rerun` — green on the SAME head SHA; forbidden.
521
- * - `unverifiable` — an unresolved red with no head-SHA evidence either
522
- * side; fail closed and treat it as a rerun.
523
381
  */
524
382
  export function classifyGreenVerdict({ digest, headSha }) {
525
383
  if (!digest) return { verdict: 'clean', reason: 'no digest for this scope' };
@@ -531,8 +389,12 @@ export function classifyGreenVerdict({ digest, headSha }) {
531
389
  };
532
390
  }
533
391
  if (recorded === headSha) {
392
+ // Digests only record required checks.
534
393
  const allowance = allowanceFor(digest, headSha);
535
- return allowance
394
+ return isRerunPermitted({
395
+ required: true,
396
+ allowanceRecorded: allowance !== null,
397
+ })
536
398
  ? {
537
399
  verdict: 'rerun-permitted',
538
400
  reason: `one rerun admitted: \`${allowance.verdict}\` verdict recorded for this head SHA (${headSha})`,
@@ -548,11 +410,7 @@ export function classifyGreenVerdict({ digest, headSha }) {
548
410
  };
549
411
  }
550
412
 
551
- /**
552
- * The failure signature an intake filing must carry (see `file-ci-gap.js`):
553
- * the first
554
- * distinctive line of the captured failed-job log.
555
- */
413
+ /** First non-blank failed-log line: the signature an intake filing carries. */
556
414
  function failureSignature(digest) {
557
415
  const tail = String(digest?.logTail ?? '');
558
416
  const line = tail
@@ -563,8 +421,7 @@ function failureSignature(digest) {
563
421
  }
564
422
 
565
423
  /**
566
- * Render the rerun-violation report — used verbatim as the friction comment
567
- * body and, line by line, as the watcher's stderr report.
424
+ * The friction comment body, also the watcher's stderr report.
568
425
  *
569
426
  * @param {{ digest: object, headSha: string|null, prNumber: number, reason: string }} opts
570
427
  * @returns {string}
@@ -603,13 +460,9 @@ export function formatRerunViolation({ digest, headSha, prNumber, reason }) {
603
460
  }
604
461
 
605
462
  /**
606
- * Hard-stop the delivery: post the `friction` comment and flip the Story to
607
- * `agent::blocked`. Both halves are best-effort — a failure to reach GitHub
608
- * must not turn the block into a crash, and the watcher's non-zero exit is
609
- * what actually stops the delivery.
610
- *
611
- * Routed through `transitionTicketState` rather than a bare label write so
612
- * the Projects v2 column sync runs (Story #2548 / #4539).
463
+ * Post the `friction` comment and flip to `agent::blocked` (via
464
+ * `transitionTicketState` so the board column syncs). Best-effort: the
465
+ * watcher's non-zero exit is what actually stops delivery.
613
466
  *
614
467
  * @param {{
615
468
  * storyId: number|string,
@@ -1,42 +1,8 @@
1
1
  /**
2
- * lib/orchestration/code-review.js — In-process Code Review module.
3
- *
4
- * Story #1155 (Epic #1142, 5.40.0) — extracted the helper-driven
5
- * `epic-code-review` invocation into a callable module so the
6
- * `/mandrel-deliver` runner can run Phase D without spawning a child
7
- * process or routing through an LLM-driven helper.
8
- *
9
- * Story #2831 (Epic #2815, Pluggable Code Review) — refactored to load
10
- * the review provider through `review-provider-factory`, call the
11
- * adapter's `runReview()` to collect a `Finding[]`, render the
12
- * structured-comment body via `findings-renderer`, and post the
13
- * comment through the GitHub provider here (the adapter is post-free
14
- * by design).
15
- *
16
- * v2.0.0 removed the Epic tier. The Epic-scope envelope and the
17
- * Epic-scoped `code-review.start` / `.end` lifecycle emits (whose schema
18
- * requires `epicId`) went with it; Story scope is the only scope. Story #5024
19
- * deleted those schemas along with the bus that was their only publish path.
20
- *
21
- * Public API:
22
- * - `runCodeReview({ ticketId, headRef, provider, logger, ... })` →
23
- * `{ status, severity, posted, report, halted, blockerReason }`.
24
- *
25
- * Behaviour:
26
- * - Loads the configured review adapter via the factory; defaults to
27
- * a single `native` chain entry when `delivery.codeReview.providers`
28
- * is unset or empty.
29
- * - Always posts the unified `verification-results` structured comment on
30
- * the target issue/PR (the adapter never posts; the orchestrator owns
31
- * persistence). Story #4411 (Epic #4405) unified the former
32
- * `code-review` and `audit-results` findings contracts into this one
33
- * `verification-results` marker.
34
- * - Treats severity.critical > 0 as a halting blocker — the merged
35
- * `/mandrel-deliver` runner consults `halted` and refuses to advance
36
- * to Phase E (retro) when set.
37
- *
38
- * Halting on critical findings is the in-process replacement for the
39
- * helper's "operator must remediate before /mandrel-deliver" gate.
2
+ * lib/orchestration/code-review.js — in-process Story-scope code review:
3
+ * load the configured review adapter (default `native`), collect its
4
+ * `Finding[]`, render and post the `verification-results` comment (adapters
5
+ * never post), and report `halted` on any surviving critical finding.
40
6
  */
41
7
 
42
8
  import { hasSurvivingCritical } from '../audit-suite/findings.js';
@@ -56,26 +22,16 @@ import { createReviewProvider } from './review-providers/review-provider-factory
56
22
  import { upsertStructuredComment } from './ticketing.js';
57
23
 
58
24
  /**
59
- * Review depth tiers, ordered light → standard → deep. The depth is resolved
60
- * by the shared {@link resolveDepth} resolver from two observable properties of
61
- * the diff under review — whether its changed files touch a registered
62
- * sensitive path ({@link deriveChangeLevel}) and their mechanical count — then
63
- * threaded into the review provider's `runReview` input so a sensitive *or*
64
- * wide-footprint change gets a deeper pass than a small, unremarkable one.
65
- * Depth is an **input** signal only — it never changes the
66
- * `{ status, severity, posted, report, halted, blockerReason }` output
67
- * envelope nor the `verification-results` structured-comment body (Story #3876,
68
- * extended by Story #3938; re-based off the diff by Story #4542).
25
+ * Review depth (light → standard → deep), from the diff's sensitivity and
26
+ * width. An input to `runReview` only; never changes the output envelope or
27
+ * the posted comment.
69
28
  *
70
29
  * @typedef {import('./review-depth.js').ReviewDepth} ReviewDepth
71
30
  */
72
31
 
73
32
  /**
74
- * Resolve the base ref used when a caller omits `baseRef`. Remote-qualified,
75
- * never the bare branch name — a caller that does not name a base must not
76
- * silently inherit the local ref's drift (Story #5325). An unfetched remote
77
- * then yields an unenumerable diff, which every downstream consumer already
78
- * fails safe on, instead of a confidently-wrong wide one.
33
+ * Default base is remote-qualified so it cannot inherit local-ref drift; an
34
+ * unfetched remote yields an unenumerable diff, which consumers fail safe on.
79
35
  */
80
36
  function resolveConfigBase(config) {
81
37
  return remoteBaseRef(config?.project?.baseBranch ?? 'main');
@@ -89,9 +45,6 @@ function resolveCommentTargetId(commentTargetId, fallback) {
89
45
  }
90
46
 
91
47
  /**
92
- * Resolve the Story-scope envelope from the parameterized
93
- * `{ scope: 'story', ticketId, baseRef, headRef, commentTargetId }` shape.
94
- *
95
48
  * @returns {{
96
49
  * scope: 'story',
97
50
  * ticketId: number,
@@ -123,40 +76,15 @@ function resolveStoryScope(opts, config) {
123
76
  };
124
77
  }
125
78
 
126
- /**
127
- * Resolve the scope envelope
128
- * (`{ scope, ticketId, baseRef, headRef, commentTargetId }`). v2.0.0
129
- * removed the Epic tier, so `'story'` is the only scope.
130
- */
79
+ /** `'story'` is the only scope. */
131
80
  function resolveScopeEnvelope(opts, config) {
132
81
  return resolveStoryScope(opts, config);
133
82
  }
134
83
 
135
84
  /**
136
- * In-process wrapper that the `/mandrel-deliver` runner and the
137
- * `/single-story-deliver` close path consume.
138
- *
139
- * Story #2252 — emits `code-review.start` immediately on entry and
140
- * `code-review.end` immediately before returning the envelope (success
141
- * or halt). On runner throw, emits `code-review.end` with the canonical
142
- * structure (`status: 'invalid'`) before re-throwing so the ledger
143
- * always carries the closing boundary.
144
- *
145
- * Story #2831 — the runner loads its adapter through the factory; the
146
- * `reviewProvider` opt overrides the factory for tests. Severity is
147
- * derived from the `Finding[]` returned by the adapter (no separate
148
- * severity field on the runner result).
149
- *
150
- * Story #2839 (Epic #2815) — the Story closer requests a Story-scope
151
- * review against `main`, posts the structured findings comment to the PR
152
- * (via `commentTargetId`), and surfaces critical findings to the caller
153
- * as `halted: true`.
154
- *
155
- * Argument shape:
156
- * `{ ticketId, baseRef, headRef, [commentTargetId], provider }`
157
- * `baseRef` defaults to the project base branch; `headRef` is required.
158
- * `commentTargetId` overrides the post target (e.g. PR number) while
159
- * `ticketId` continues to label the rendered header ("Story #N").
85
+ * Run a Story-scope review. `headRef` is required; `baseRef` defaults to
86
+ * the remote base branch; `commentTargetId` (e.g. a PR number) overrides
87
+ * the post target while `ticketId` still labels the header.
160
88
  *
161
89
  * @param {{
162
90
  * scope?: 'story',
@@ -188,12 +116,7 @@ function resolveScopeEnvelope(opts, config) {
188
116
  * blockerReason: string|null,
189
117
  * }>}
190
118
  */
191
- /**
192
- * Resolve the human-facing provider name from the resolved code-review
193
- * config. Multi-entry chains render as `chain[a,b,...]`; a single-entry
194
- * chain (including the unset/empty default) renders that entry's name;
195
- * everything else falls back to `'native'`.
196
- */
119
+ /** Display name: the single entry's name, `chain[a,b]`, or `'native'`. */
197
120
  function resolveProviderName(codeReviewConfig) {
198
121
  const providers =
199
122
  codeReviewConfig && Array.isArray(codeReviewConfig.providers)
@@ -209,17 +132,10 @@ function resolveProviderName(codeReviewConfig) {
209
132
  }
210
133
 
211
134
  /**
212
- * Resolve the change set the depth derivation reads (Story #4593).
213
- *
214
- * `opts.changedFiles` is an injection with three distinct states,
215
- * and the difference is load-bearing: an **array** is the change set to use
216
- * verbatim; an explicit **null** is a caller (`runStoryReviewCore`) reporting
217
- * that it already tried and the diff is unenumerable — re-running git here would
218
- * only fail again, so it degrades straight to the fail-safe tier; **absent**
219
- * means no caller enumerated at all, so the shared {@link computeChangeSet}
220
- * enumerator runs as the fallback (standalone CLI use). On the close path the
221
- * spine always injects, so the diff is enumerated exactly once per delivery and
222
- * this pillar can never disagree with the lens pass about what changed.
135
+ * `opts.changedFiles` has three states: an array is used verbatim; `null`
136
+ * means the caller already found the diff unenumerable (fail-safe tier, no
137
+ * retry); absent means enumerate here. The close path always injects, so
138
+ * review and lens pass agree on what changed.
223
139
  */
224
140
  function resolveInjectedChangedFiles({ opts, baseRef, headRef }) {
225
141
  if (opts.changedFiles === undefined) {
@@ -230,12 +146,8 @@ function resolveInjectedChangedFiles({ opts, baseRef, headRef }) {
230
146
  }
231
147
 
232
148
  /**
233
- * Build the provider `runReview` input, resolving the review depth from the
234
- * diff under review: its changed files derive the change level (sensitive path
235
- * touched or not — Story #4542) and their count supplies the width. The depth
236
- * is an input-only signal (light → standard → deep) and never touches the
237
- * output envelope or the posted comment. An unenumerable diff → `standard`.
238
- * Story #4075 — extracted from `runCodeReview`.
149
+ * Build the `runReview` input with its depth; an unenumerable diff yields
150
+ * `standard`.
239
151
  */
240
152
  function buildReviewInput({ opts, scope, ticketId, baseRef, headRef }) {
241
153
  const changedFiles = resolveInjectedChangedFiles({ opts, baseRef, headRef });
@@ -243,9 +155,7 @@ function buildReviewInput({ opts, scope, ticketId, baseRef, headRef }) {
243
155
  typeof opts.changedFileCount === 'number'
244
156
  ? opts.changedFileCount
245
157
  : (changedFiles?.length ?? null);
246
- // v2 Stage 2: review depth uses DEFAULT_DIFF_WIDTH (mechanical file count
247
- // of the diff under review). It is deliberately decoupled from the
248
- // planning model-capacity advisory (`DEFAULT_MODEL_CAPACITY`).
158
+ // Width is the diff's file count, decoupled from planning model capacity.
249
159
  const { level } = deriveChangeLevel({ changedFiles });
250
160
  const depth = resolveDepth({
251
161
  derivedLevel: level,
@@ -262,10 +172,7 @@ function buildReviewInput({ opts, scope, ticketId, baseRef, headRef }) {
262
172
  }
263
173
 
264
174
  /**
265
- * Feature-detect manual-prompt providers (Story #2871). Legacy
266
- * single-adapter providers don't carry `getPromptMessages`, so the
267
- * empty-array fallback keeps the old snapshot byte-stable; a throw is
268
- * logged and degraded to empty.
175
+ * Optional `getPromptMessages`; absent or throwing yields `[]`.
269
176
  */
270
177
  async function resolvePromptMessages(reviewProvider, reviewInput, logger) {
271
178
  if (typeof reviewProvider.getPromptMessages !== 'function') return [];
@@ -283,9 +190,7 @@ async function resolvePromptMessages(reviewProvider, reviewInput, logger) {
283
190
  }
284
191
 
285
192
  /**
286
- * Upsert the rendered report as a structured comment. Posting failure is
287
- * non-fatal: it is logged and surfaced via `posted: false`. Story #4075 —
288
- * extracted from `runCodeReview`.
193
+ * Posting failure is non-fatal and surfaces as `posted: false`.
289
194
  */
290
195
  async function postReviewComment({
291
196
  upsertCommentFn,
@@ -319,12 +224,6 @@ async function postReviewComment({
319
224
  }
320
225
  }
321
226
 
322
- /**
323
- * Run the review pipeline (resolve provider → runReview → prompt messages →
324
- * render → post comment) and shape the `status: 'ok'` result. Pure of the
325
- * lifecycle-boundary concern — `runCodeReview` owns the start/end emit pair.
326
- * Story #4075 — extracted to keep both bodies below the CC must-fix band.
327
- */
328
227
  async function executeReviewPipeline({ opts, config, envelope }) {
329
228
  const {
330
229
  provider,
@@ -366,7 +265,7 @@ async function executeReviewPipeline({ opts, config, envelope }) {
366
265
  logger,
367
266
  );
368
267
 
369
- // Story #4839 — degraded gates ride beside the findings, never inside them.
268
+ // Degraded gates ride beside the findings, never inside them.
370
269
  const degradations = await collectProviderDegradations(
371
270
  reviewProvider,
372
271
  logger,
@@ -413,8 +312,5 @@ export async function runCodeReview(opts = {}) {
413
312
  const config = resolveConfigFn();
414
313
  const envelope = resolveScopeEnvelope(opts, config);
415
314
 
416
- // No lifecycle-bus emit: the `code-review.start` / `.end` ledger pair was
417
- // Epic-scoped (its schema requires `epicId`), and v2.0.0 removed the Epic
418
- // tier. Story-scope review sits outside the lifecycle ledger entirely.
419
315
  return executeReviewPipeline({ opts, config, envelope });
420
316
  }