mandrel 2.60.0 → 2.61.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 (661) 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/pinned-identifier-lint.js +17 -57
  318. package/.agents/scripts/lib/orchestration/plan-context.js +52 -303
  319. package/.agents/scripts/lib/orchestration/plan-critic-conditions.js +22 -79
  320. package/.agents/scripts/lib/orchestration/plan-critics-evaluate.js +5 -31
  321. package/.agents/scripts/lib/orchestration/plan-metrics.js +29 -108
  322. package/.agents/scripts/lib/orchestration/plan-navigation.js +8 -27
  323. package/.agents/scripts/lib/orchestration/plan-persist/acceptance-handle-repair.js +12 -49
  324. package/.agents/scripts/lib/orchestration/plan-persist/audit-provenance.js +18 -73
  325. package/.agents/scripts/lib/orchestration/plan-persist/changes-repair.js +14 -78
  326. package/.agents/scripts/lib/orchestration/plan-persist/cross-plan-links.js +6 -30
  327. package/.agents/scripts/lib/orchestration/plan-persist/epic-adoption.js +14 -65
  328. package/.agents/scripts/lib/orchestration/plan-persist/epic-ops.js +21 -76
  329. package/.agents/scripts/lib/orchestration/plan-persist/external-deps.js +6 -43
  330. package/.agents/scripts/lib/orchestration/plan-persist/persist-helpers.js +14 -68
  331. package/.agents/scripts/lib/orchestration/plan-persist/plan-context-source.js +9 -41
  332. package/.agents/scripts/lib/orchestration/plan-persist/run-plan-persist.js +49 -248
  333. package/.agents/scripts/lib/orchestration/plan-persist/soft-findings.js +2 -12
  334. package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +85 -368
  335. package/.agents/scripts/lib/orchestration/plan-persist/summary.js +8 -38
  336. package/.agents/scripts/lib/orchestration/plan-persist/supersede-ops.js +30 -190
  337. package/.agents/scripts/lib/orchestration/plan-persist/wave-collision-gate.js +9 -49
  338. package/.agents/scripts/lib/orchestration/plan-persist/wave-serialisation.js +7 -28
  339. package/.agents/scripts/lib/orchestration/plan-reachability.js +13 -42
  340. package/.agents/scripts/lib/orchestration/plan-run-labels/reap.js +16 -91
  341. package/.agents/scripts/lib/orchestration/plan-runner/worktree-sweep.js +16 -54
  342. package/.agents/scripts/lib/orchestration/plan-text-hygiene.js +10 -52
  343. package/.agents/scripts/lib/orchestration/planning/authoring-context.js +14 -109
  344. package/.agents/scripts/lib/orchestration/planning/memory-pool-advisory.js +11 -83
  345. package/.agents/scripts/lib/orchestration/pr-watch.js +48 -306
  346. package/.agents/scripts/lib/orchestration/project-meta-cache.js +15 -80
  347. package/.agents/scripts/lib/orchestration/project-meta-resolver.js +10 -51
  348. package/.agents/scripts/lib/orchestration/reassert-status-column.js +12 -76
  349. package/.agents/scripts/lib/orchestration/remote-verifier.js +12 -36
  350. package/.agents/scripts/lib/orchestration/resolve-stories.js +33 -164
  351. package/.agents/scripts/lib/orchestration/retro-proposals.js +66 -361
  352. package/.agents/scripts/lib/orchestration/review-base-ref.js +9 -43
  353. package/.agents/scripts/lib/orchestration/review-depth.js +12 -94
  354. package/.agents/scripts/lib/orchestration/review-providers/codex.js +10 -111
  355. package/.agents/scripts/lib/orchestration/review-providers/degraded-gates.js +13 -71
  356. package/.agents/scripts/lib/orchestration/review-providers/findings-renderer.js +7 -51
  357. package/.agents/scripts/lib/orchestration/review-providers/mi-exemptions.js +8 -53
  358. package/.agents/scripts/lib/orchestration/review-providers/native.js +30 -214
  359. package/.agents/scripts/lib/orchestration/review-providers/parse-findings.js +7 -52
  360. package/.agents/scripts/lib/orchestration/review-providers/review-depth.js +4 -33
  361. package/.agents/scripts/lib/orchestration/review-providers/review-provider-factory.js +11 -71
  362. package/.agents/scripts/lib/orchestration/review-providers/scoped-lint.js +19 -131
  363. package/.agents/scripts/lib/orchestration/review-providers/security-review.js +6 -89
  364. package/.agents/scripts/lib/orchestration/review-providers/types.js +26 -56
  365. package/.agents/scripts/lib/orchestration/review-providers/ultrareview.js +3 -46
  366. package/.agents/scripts/lib/orchestration/run-epilogue.js +40 -199
  367. package/.agents/scripts/lib/orchestration/run-scoped-config.js +13 -81
  368. package/.agents/scripts/lib/orchestration/single-story-close/close-note.js +7 -34
  369. package/.agents/scripts/lib/orchestration/single-story-close/failed-terminal.js +16 -89
  370. package/.agents/scripts/lib/orchestration/single-story-close/gate-log.js +18 -109
  371. package/.agents/scripts/lib/orchestration/single-story-close/phases/auto-merge.js +83 -239
  372. package/.agents/scripts/lib/orchestration/single-story-close/phases/base-sync.js +18 -80
  373. package/.agents/scripts/lib/orchestration/single-story-close/phases/close-validation.js +103 -97
  374. package/.agents/scripts/lib/orchestration/single-story-close/phases/code-review.js +8 -64
  375. package/.agents/scripts/lib/orchestration/single-story-close/phases/confirm-merge.js +136 -486
  376. package/.agents/scripts/lib/orchestration/single-story-close/phases/conventional-subject.js +30 -134
  377. package/.agents/scripts/lib/orchestration/single-story-close/phases/graphql-preflight.js +9 -50
  378. package/.agents/scripts/lib/orchestration/single-story-close/phases/lock-wait-pending.js +49 -0
  379. package/.agents/scripts/lib/orchestration/single-story-close/phases/normalize-pr-title.js +13 -86
  380. package/.agents/scripts/lib/orchestration/single-story-close/phases/options.js +20 -95
  381. package/.agents/scripts/lib/orchestration/single-story-close/phases/post-land.js +46 -203
  382. package/.agents/scripts/lib/orchestration/single-story-close/phases/pre-gate-steps.js +8 -50
  383. package/.agents/scripts/lib/orchestration/single-story-close/phases/pull-request.js +12 -83
  384. package/.agents/scripts/lib/orchestration/single-story-close/phases/push.js +6 -39
  385. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-block.js +1 -6
  386. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-outcome.js +4 -28
  387. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-override.js +6 -51
  388. package/.agents/scripts/lib/orchestration/single-story-close/phases/worktree-reap.js +6 -34
  389. package/.agents/scripts/lib/orchestration/single-story-close/phases/wrong-tree-guard.js +23 -121
  390. package/.agents/scripts/lib/orchestration/single-story-close/runner.js +110 -290
  391. package/.agents/scripts/lib/orchestration/single-story-lease-guard.js +15 -69
  392. package/.agents/scripts/lib/orchestration/story-body-gate.js +4 -23
  393. package/.agents/scripts/lib/orchestration/story-close/baseline-upward-writeback.js +50 -179
  394. package/.agents/scripts/lib/orchestration/story-close/context-budget-writeback.js +11 -41
  395. package/.agents/scripts/lib/orchestration/story-close/format-autofix.js +23 -311
  396. package/.agents/scripts/lib/orchestration/story-close/phases/local-lens-review.js +22 -147
  397. package/.agents/scripts/lib/orchestration/story-close/phases/review-core.js +16 -67
  398. package/.agents/scripts/lib/orchestration/story-deliver-terminal-schema.js +12 -68
  399. package/.agents/scripts/lib/orchestration/story-deliver-terminal.js +42 -201
  400. package/.agents/scripts/lib/orchestration/story-follow-ups.js +43 -245
  401. package/.agents/scripts/lib/orchestration/story-init-envelope.js +4 -23
  402. package/.agents/scripts/lib/orchestration/story-init-remote.js +2 -6
  403. package/.agents/scripts/lib/orchestration/story-reachability.js +3 -23
  404. package/.agents/scripts/lib/orchestration/task-body-validator.js +12 -126
  405. package/.agents/scripts/lib/orchestration/ticket-lease.js +28 -131
  406. package/.agents/scripts/lib/orchestration/ticket-validator-conflicts.js +15 -149
  407. package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +5 -33
  408. package/.agents/scripts/lib/orchestration/ticket-validator.js +39 -181
  409. package/.agents/scripts/lib/orchestration/ticketing/bulk.js +51 -244
  410. package/.agents/scripts/lib/orchestration/ticketing/reads.js +39 -250
  411. package/.agents/scripts/lib/orchestration/ticketing/state.js +14 -68
  412. package/.agents/scripts/lib/orchestration/ticketing/transition.js +46 -263
  413. package/.agents/scripts/lib/orchestration/ticketing.js +2 -26
  414. package/.agents/scripts/lib/orchestration/verify-credit.js +18 -79
  415. package/.agents/scripts/lib/orchestration/worktree-dirty.js +5 -30
  416. package/.agents/scripts/lib/path-security.js +3 -6
  417. package/.agents/scripts/lib/plan-phase-cleanup.js +9 -49
  418. package/.agents/scripts/lib/preflight-runner.js +13 -69
  419. package/.agents/scripts/lib/process-group.js +143 -0
  420. package/.agents/scripts/lib/project-root.js +2 -8
  421. package/.agents/scripts/lib/provider-factory.js +2 -25
  422. package/.agents/scripts/lib/qa/console-allowlist.js +10 -59
  423. package/.agents/scripts/lib/qa/qa-session.js +15 -69
  424. package/.agents/scripts/lib/qa/redact-evidence.js +18 -129
  425. package/.agents/scripts/lib/qa/resolve-qa-contract.js +26 -135
  426. package/.agents/scripts/lib/qa/resolve-selection.js +16 -84
  427. package/.agents/scripts/lib/reserved-test-ids.js +9 -47
  428. package/.agents/scripts/lib/runtime-deps/dep-resolution.js +13 -53
  429. package/.agents/scripts/lib/runtime-deps/ensure-installed.js +10 -44
  430. package/.agents/scripts/lib/runtime-deps/manifest.js +10 -30
  431. package/.agents/scripts/lib/runtime-deps/parser-major.js +15 -51
  432. package/.agents/scripts/lib/runtime-deps/preflight.js +4 -22
  433. package/.agents/scripts/lib/runtime-deps/scan-imports.js +11 -55
  434. package/.agents/scripts/lib/signals/detectors/common.js +12 -38
  435. package/.agents/scripts/lib/signals/index.js +2 -19
  436. package/.agents/scripts/lib/signals/schema.js +14 -109
  437. package/.agents/scripts/lib/signals/write.js +2 -11
  438. package/.agents/scripts/lib/single-story/confirm-merge.js +31 -72
  439. package/.agents/scripts/lib/single-story/story-merged-notify.js +8 -49
  440. package/.agents/scripts/lib/single-story-sweep/protection-ctx.js +4 -26
  441. package/.agents/scripts/lib/single-story-sweep/protection.js +13 -100
  442. package/.agents/scripts/lib/single-story-sweep/sweep-lock.js +60 -258
  443. package/.agents/scripts/lib/single-story-sweep.js +14 -97
  444. package/.agents/scripts/lib/skills/parse-skill.js +13 -59
  445. package/.agents/scripts/lib/skills/skills-index.js +8 -29
  446. package/.agents/scripts/lib/skills/walk-skill-files.js +17 -78
  447. package/.agents/scripts/lib/source-extensions.js +11 -42
  448. package/.agents/scripts/lib/source-text/strip-js-comments.js +8 -41
  449. package/.agents/scripts/lib/stdio-flush.js +9 -36
  450. package/.agents/scripts/lib/story-adjacency.js +8 -40
  451. package/.agents/scripts/lib/story-body/body-format-lints.js +22 -83
  452. package/.agents/scripts/lib/story-body/footer-block.js +11 -44
  453. package/.agents/scripts/lib/story-body/story-body.js +83 -358
  454. package/.agents/scripts/lib/temp-retention.js +42 -143
  455. package/.agents/scripts/lib/templates/decomposer-prompts.js +11 -65
  456. package/.agents/scripts/lib/test-env.js +12 -65
  457. package/.agents/scripts/lib/test-run-credit.js +10 -65
  458. package/.agents/scripts/lib/test-runner-contract.js +19 -74
  459. package/.agents/scripts/lib/test-temp.js +38 -184
  460. package/.agents/scripts/lib/test-tiers.js +12 -96
  461. package/.agents/scripts/lib/ticket-body-sections.js +21 -96
  462. package/.agents/scripts/lib/transpile.js +15 -74
  463. package/.agents/scripts/lib/util/concurrent-map.js +6 -25
  464. package/.agents/scripts/lib/util/parse-id-list.js +8 -34
  465. package/.agents/scripts/lib/util/poll-loop.js +8 -28
  466. package/.agents/scripts/lib/util/with-timeout.js +2 -11
  467. package/.agents/scripts/lib/validation-evidence.js +21 -96
  468. package/.agents/scripts/lib/wave-runner/footprint.js +17 -70
  469. package/.agents/scripts/lib/wave-runner/live-probe.js +53 -221
  470. package/.agents/scripts/lib/wave-runner/ready-set.js +72 -301
  471. package/.agents/scripts/lib/workers/crap-worker.js +11 -64
  472. package/.agents/scripts/lib/workers/maintainability-report-worker.js +8 -45
  473. package/.agents/scripts/lib/workers/maintainability-worker.js +5 -21
  474. package/.agents/scripts/lib/workers/serve-worker-messages.js +2 -18
  475. package/.agents/scripts/lib/workflow-closure.js +22 -105
  476. package/.agents/scripts/lib/workspace-provisioner.js +16 -54
  477. package/.agents/scripts/lib/worktree/git-hooks.js +15 -60
  478. package/.agents/scripts/lib/worktree/lifecycle/force-drain.js +20 -60
  479. package/.agents/scripts/lib/worktree/lifecycle/merge-reachability.js +10 -62
  480. package/.agents/scripts/lib/worktree/lifecycle/pending-cleanup.js +22 -86
  481. package/.agents/scripts/lib/worktree/lifecycle/reap.js +24 -126
  482. package/.agents/scripts/lib/worktree/lifecycle-manager.js +2 -20
  483. package/.agents/scripts/lib/worktree/node-modules-strategy.js +46 -180
  484. package/.agents/scripts/lib/worktree-manager.js +15 -40
  485. package/.agents/scripts/lint-issue-body.js +12 -68
  486. package/.agents/scripts/mandrel-update-preflight.js +10 -70
  487. package/.agents/scripts/merge-baseline.js +30 -104
  488. package/.agents/scripts/nav-registry-diff.js +22 -108
  489. package/.agents/scripts/notify.js +12 -69
  490. package/.agents/scripts/plan-context.js +27 -111
  491. package/.agents/scripts/plan-critics.js +12 -66
  492. package/.agents/scripts/plan-persist.js +31 -148
  493. package/.agents/scripts/plan-run-epilogue.js +11 -37
  494. package/.agents/scripts/pr-watch-with-update.js +76 -267
  495. package/.agents/scripts/providers/github/auth.js +3 -8
  496. package/.agents/scripts/providers/github/blocked-by-add.js +14 -61
  497. package/.agents/scripts/providers/github/board-add.js +5 -21
  498. package/.agents/scripts/providers/github/branch-protection.js +11 -43
  499. package/.agents/scripts/providers/github/cache.js +2 -14
  500. package/.agents/scripts/providers/github/comments.js +7 -40
  501. package/.agents/scripts/providers/github/compose.js +3 -19
  502. package/.agents/scripts/providers/github/errors.js +22 -125
  503. package/.agents/scripts/providers/github/issues.js +31 -123
  504. package/.agents/scripts/providers/github/labels.js +24 -124
  505. package/.agents/scripts/providers/github/mappers.js +5 -27
  506. package/.agents/scripts/providers/github/merge-methods.js +3 -22
  507. package/.agents/scripts/providers/github/project-board.js +2 -17
  508. package/.agents/scripts/providers/github/projects-v2-graphql.js +3 -6
  509. package/.agents/scripts/providers/github/request-helpers.js +5 -32
  510. package/.agents/scripts/providers/github/search-budget.js +9 -39
  511. package/.agents/scripts/providers/github/search-query.js +5 -26
  512. package/.agents/scripts/providers/github/sub-issue-add.js +15 -65
  513. package/.agents/scripts/providers/github/sub-issues.js +7 -36
  514. package/.agents/scripts/providers/github/tickets.js +32 -134
  515. package/.agents/scripts/providers/github.js +18 -59
  516. package/.agents/scripts/prune-plan-run-labels.js +12 -46
  517. package/.agents/scripts/quality-preview.js +35 -220
  518. package/.agents/scripts/resolve-doc-tiers.js +3 -26
  519. package/.agents/scripts/resolve-stories.js +16 -67
  520. package/.agents/scripts/resync-status-column.js +6 -25
  521. package/.agents/scripts/run-tests.js +29 -104
  522. package/.agents/scripts/single-story-close.js +23 -135
  523. package/.agents/scripts/single-story-confirm-merge.js +32 -139
  524. package/.agents/scripts/single-story-init.js +47 -209
  525. package/.agents/scripts/stories-wave-tick.js +102 -472
  526. package/.agents/scripts/sync-agentrc.js +3 -21
  527. package/.agents/scripts/sync-claude-agents.js +9 -55
  528. package/.agents/scripts/sync-claude-commands.js +20 -110
  529. package/.agents/scripts/test-wrapper.js +6 -43
  530. package/.agents/scripts/update-coverage-baseline.js +5 -22
  531. package/.agents/scripts/update-crap-baseline.js +7 -30
  532. package/.agents/scripts/update-duplication-baseline.js +16 -92
  533. package/.agents/scripts/update-maintainability-baseline.js +8 -62
  534. package/.agents/scripts/update-ticket-state.js +1 -7
  535. package/.agents/scripts/validate-skills.js +6 -26
  536. package/.agents/templates/agent-protocol.md +2 -2
  537. package/.agents/templates/docs/audit-sweep-runbook.md +3 -4
  538. package/.agents/workflows/audit-accessibility.md +4 -7
  539. package/.agents/workflows/audit-adrs.md +3 -6
  540. package/.agents/workflows/audit-architecture.md +3 -11
  541. package/.agents/workflows/audit-baselines.md +6 -9
  542. package/.agents/workflows/audit-clean-code.md +8 -12
  543. package/.agents/workflows/audit-data-model.md +3 -7
  544. package/.agents/workflows/audit-dependencies.md +4 -7
  545. package/.agents/workflows/audit-devops.md +4 -8
  546. package/.agents/workflows/audit-documentation.md +1 -4
  547. package/.agents/workflows/audit-mobile.md +4 -7
  548. package/.agents/workflows/audit-navigability.md +3 -6
  549. package/.agents/workflows/audit-performance.md +2 -4
  550. package/.agents/workflows/audit-privacy.md +4 -7
  551. package/.agents/workflows/audit-quality.md +4 -7
  552. package/.agents/workflows/audit-security.md +4 -7
  553. package/.agents/workflows/audit-seo.md +4 -7
  554. package/.agents/workflows/audit-sre.md +4 -7
  555. package/.agents/workflows/audit-to-stories.md +17 -30
  556. package/.agents/workflows/audit-ux-ui.md +4 -7
  557. package/.agents/workflows/helpers/audit-lens-core.md +1 -1
  558. package/.agents/workflows/helpers/code-quality-guardrails.md +12 -15
  559. package/.agents/workflows/helpers/deliver-digest.md +6 -4
  560. package/.agents/workflows/helpers/deliver-reference.md +114 -188
  561. package/.agents/workflows/helpers/deliver-story-reference.md +189 -533
  562. package/.agents/workflows/helpers/plan-reference.md +86 -139
  563. package/.agents/workflows/helpers/qa-core.md +12 -0
  564. package/.agents/workflows/memory-consolidate.md +1 -1
  565. package/.agents/workflows/qa-assist.md +27 -71
  566. package/.agents/workflows/qa-explore.md +19 -59
  567. package/.agents/workflows/qa-run.md +11 -33
  568. package/README.md +1 -1
  569. package/bin/mandrel.js +5 -46
  570. package/bin/postinstall.js +18 -107
  571. package/docs/CHANGELOG.md +25 -0
  572. package/lib/cli/doctor.js +11 -71
  573. package/lib/cli/init.js +26 -165
  574. package/lib/cli/migrate.js +5 -64
  575. package/lib/cli/registry.js +84 -467
  576. package/lib/cli/sync-agents.js +4 -64
  577. package/lib/cli/sync-commands.js +11 -64
  578. package/lib/cli/sync.js +34 -213
  579. package/lib/cli/uninstall.js +40 -219
  580. package/lib/cli/update.js +105 -661
  581. package/lib/cli/version-check.js +8 -72
  582. package/lib/cli/version-helpers.js +14 -87
  583. package/lib/migrations/helpers/retire-agentrc-key.js +11 -52
  584. package/lib/migrations/index.js +15 -92
  585. package/lib/migrations/steps/2.1.0-retire-mi-drop-knobs.js +2 -15
  586. package/lib/migrations/steps/2.1.0-retire-verify-concurrency-cap.js +1 -13
  587. package/lib/migrations/steps/2.11.0-retire-max-seed-words.js +2 -15
  588. package/lib/migrations/steps/2.2.0-retire-epic-ac-tags.js +9 -38
  589. package/lib/migrations/steps/2.20.0-retire-codebase-snapshot.js +1 -13
  590. package/lib/migrations/steps/2.32.0-retire-lint-baseline-command.js +2 -27
  591. package/lib/migrations/steps/2.57.0-retire-delivery-limit-knobs.js +2 -23
  592. package/lib/migrations/steps/2.57.0-retire-planning-limit-knobs.js +2 -27
  593. package/lib/migrations/steps/2.60.0-retire-audit-results-autofile.js +2 -21
  594. package/lib/migrations/steps/strip-removed-agentrc-keys.js +333 -0
  595. package/package.json +16 -14
  596. package/.agents/docs/SDLC.md +0 -590
  597. package/.agents/docs/quality-gates.md +0 -1183
  598. package/.agents/rules/known-tooling-behavior.md +0 -200
  599. package/.agents/rules/orchestration-error-handling.md +0 -61
  600. package/.agents/rules/test-seams.md +0 -59
  601. package/.agents/schemas/baselines/lighthouse.schema.json +0 -59
  602. package/.agents/schemas/baselines/lint.schema.json +0 -47
  603. package/.agents/scripts/check-action-pinning.js +0 -260
  604. package/.agents/scripts/check-audit-attribution.js +0 -302
  605. package/.agents/scripts/check-baseline-drift.js +0 -211
  606. package/.agents/scripts/check-baseline-scope.js +0 -362
  607. package/.agents/scripts/check-generated-validator.js +0 -202
  608. package/.agents/scripts/check-knip-entries.js +0 -159
  609. package/.agents/scripts/check-lifecycle-lint.js +0 -294
  610. package/.agents/scripts/check-pinned-override-notes.js +0 -102
  611. package/.agents/scripts/check-schema-references.js +0 -368
  612. package/.agents/scripts/check-test-portability.js +0 -512
  613. package/.agents/scripts/check-workflow-citations.js +0 -218
  614. package/.agents/scripts/check-workflow-cli-lint.js +0 -299
  615. package/.agents/scripts/check-workflow-timeouts.js +0 -291
  616. package/.agents/scripts/install-matrix-assert.js +0 -326
  617. package/.agents/scripts/lib/audit-advisories.js +0 -195
  618. package/.agents/scripts/lib/audit-attribution.js +0 -134
  619. package/.agents/scripts/lib/baselines/drift-detector.js +0 -351
  620. package/.agents/scripts/lib/baselines/kinds/lighthouse.js +0 -87
  621. package/.agents/scripts/lib/baselines/kinds/lint.js +0 -184
  622. package/.agents/scripts/lib/baselines/orphan-pruner.js +0 -233
  623. package/.agents/scripts/lib/baselines/scope-assert.js +0 -223
  624. package/.agents/scripts/lib/baselines/scope-inventory.js +0 -314
  625. package/.agents/scripts/lib/c8-cli-path.js +0 -21
  626. package/.agents/scripts/lib/config/gates/lighthouse.schema.js +0 -51
  627. package/.agents/scripts/lib/config/gates/lint.schema.js +0 -18
  628. package/.agents/scripts/lib/dynamic-workflow/architecture-report-contract.js +0 -70
  629. package/.agents/scripts/lib/dynamic-workflow/audit-orchestrator.js +0 -284
  630. package/.agents/scripts/lib/dynamic-workflow/clean-code-report-contract.js +0 -80
  631. package/.agents/scripts/lib/dynamic-workflow/degraded-coverage.js +0 -81
  632. package/.agents/scripts/lib/dynamic-workflow/documentation-report-contract.js +0 -87
  633. package/.agents/scripts/lib/dynamic-workflow/performance-report-contract.js +0 -74
  634. package/.agents/scripts/lib/dynamic-workflow/quality-report-contract.js +0 -90
  635. package/.agents/scripts/lib/dynamic-workflow/report-contract-core.js +0 -43
  636. package/.agents/scripts/lib/dynamic-workflow/security-report-contract.js +0 -83
  637. package/.agents/scripts/lib/fs-walk.js +0 -52
  638. package/.agents/scripts/lib/knip-config-resolver.js +0 -181
  639. package/.agents/scripts/lib/knip-entry-sync.js +0 -452
  640. package/.agents/scripts/lib/pinned-override-notes.js +0 -88
  641. package/.agents/scripts/lib/pinned-override-resolve.js +0 -212
  642. package/.agents/scripts/lib/test-isolate/cli-options.js +0 -93
  643. package/.agents/scripts/lib/test-isolate/env-snapshot-loader.js +0 -52
  644. package/.agents/scripts/lib/test-isolate/list-files.js +0 -90
  645. package/.agents/scripts/lib/test-isolate/parse-tap.js +0 -75
  646. package/.agents/scripts/lib/test-isolate/progress-log.js +0 -45
  647. package/.agents/scripts/lib/test-isolate/render-report.js +0 -97
  648. package/.agents/scripts/lib/test-isolate/run-isolate.js +0 -87
  649. package/.agents/scripts/lib/test-isolate/runner.js +0 -483
  650. package/.agents/scripts/lib/test-profile/parse-tap.js +0 -136
  651. package/.agents/scripts/lib/test-profile/render-report.js +0 -45
  652. package/.agents/scripts/lint-label-vocabulary.js +0 -214
  653. package/.agents/scripts/post-structured-comment.js +0 -127
  654. package/.agents/scripts/provision-git-hooks.js +0 -85
  655. package/.agents/scripts/prune-baseline-orphans.js +0 -181
  656. package/.agents/scripts/run-coverage.js +0 -197
  657. package/.agents/scripts/run-lint.js +0 -133
  658. package/.agents/scripts/run-test-profile.js +0 -129
  659. package/.agents/scripts/run-verify.js +0 -125
  660. package/.agents/scripts/test-isolate.js +0 -55
  661. 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
  }