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,47 +1,15 @@
1
1
  /**
2
- * review-providers/parse-findings.js — shared JSON-findings parser.
3
- *
4
- * Story #3981 — extracts the verbatim-duplicated parsing logic from
5
- * `parseCodexFindings` (codex.js) and `parseSecurityReviewFindings`
6
- * (security-review.js) into one templated parser. Both adapters emit
7
- * JSON; the parser is liberal in what it accepts:
8
- * - A bare array of finding objects.
9
- * - An object with a `findings` array.
10
- * - Either shape wrapped in an outer envelope with a `result` or
11
- * `data` key (covers minor wire-format drift across versions
12
- * without re-shimming).
13
- *
14
- * Each entry's severity is funnelled through the caller-supplied
15
- * `mapSeverity` so the canonical enum is the only thing that reaches
16
- * the renderer. Entries without a `title` or `body` are skipped — the
17
- * orchestrator cannot post an empty finding, and silently dropping the
18
- * entry is safer than fabricating one.
19
- *
20
- * Per-provider deltas ride in as options:
21
- * - `errorPrefix` — prefix for the JSON-parse failure message.
22
- * - `mapSeverity` — provider severity vocabulary → canonical enum.
23
- * - `defaultCategory` — when set, entries missing a `category` get
24
- * this value (security-review defaults to `'security'`); when
25
- * omitted, `category` is only set when present (codex behavior).
26
- *
27
- * Story #4074 — the parser body was a CC-30 ternary thicket. The
28
- * per-field branching now lives in three small, independently-testable
29
- * pure helpers (`unwrapEnvelope`, `coerceString`, `buildFinding`), so the
30
- * orchestration body collapses to: unwrap → `Array.isArray` guard →
31
- * `map(buildFinding).filter(Boolean)`.
2
+ * review-providers/parse-findings.js — the JSON-findings parser shared by the
3
+ * LLM-backed providers. Entries without a title or body are dropped rather
4
+ * than fabricated.
32
5
  *
33
6
  * @typedef {import('./types.js').Finding} Finding
34
7
  * @typedef {import('./types.js').Severity} Severity
35
8
  */
36
9
 
37
10
  /**
38
- * Unwrap up to two layers of envelope around a findings array.
39
- *
40
- * Accepts a bare array unchanged, an object with a `findings` array, or
41
- * either shape nested one level deep under a `result` / `data` key. The
42
- * second pass resolves `{ result: { findings: [] } }`-style
43
- * double-envelopes. Anything that does not resolve to an array is
44
- * returned as-is for the caller's `Array.isArray` guard to reject.
11
+ * Unwrap a bare array, `{ findings }`, or either under `result`/`data`.
12
+ * A non-array result is returned for the caller to reject.
45
13
  *
46
14
  * @param {unknown} parsed
47
15
  * @returns {unknown}
@@ -60,11 +28,6 @@ export function unwrapEnvelope(parsed) {
60
28
  }
61
29
 
62
30
  /**
63
- * Coerce a value to a non-empty trimmed string, or null.
64
- *
65
- * Returns the trimmed string when `value` is a string with
66
- * non-whitespace content; otherwise null.
67
- *
68
31
  * @param {unknown} value
69
32
  * @returns {string | null}
70
33
  */
@@ -75,14 +38,8 @@ export function coerceString(value) {
75
38
  }
76
39
 
77
40
  /**
78
- * Build a single `Finding` from a raw entry, or null when the entry is
79
- * unusable (not an object, or missing a title/body).
80
- *
81
- * `title` is trimmed; `body` falls back to a non-empty `message` alias
82
- * and is preserved verbatim (untrimmed) to match the historical
83
- * behavior. `category` is set from the entry when present, else from
84
- * `defaultCategory` when supplied. `file` / `line` are included only
85
- * when present and well-formed.
41
+ * `body` (or its `message` alias) is kept untrimmed; `category` falls back
42
+ * to `defaultCategory`.
86
43
  *
87
44
  * @param {unknown} entry
88
45
  * @param {{
@@ -121,8 +78,6 @@ export function buildFinding(entry, { mapSeverity, defaultCategory }) {
121
78
  }
122
79
 
123
80
  /**
124
- * Parse a provider's raw stdout into `Finding[]`.
125
- *
126
81
  * @param {string} rawStdout
127
82
  * @param {{
128
83
  * errorPrefix: string,
@@ -1,31 +1,11 @@
1
1
  /**
2
- * review-providers/review-depth.js — Shared depth-prompt vocabulary for the
3
- * LLM-backed review providers.
4
- *
5
- * Story #3937 / #3938 — the depth lever (`light` / `standard` / `deep`,
6
- * derived from the diff's observable width and sensitive-path hits by
7
- * `lib/orchestration/review-depth.js`; #4542 retired the judged-risk
8
- * input) is threaded into every
9
- * provider's `runReview` input. LLM-backed providers (codex, security-review,
10
- * ultrareview) must render that lever into the prompt/instructions they emit so
11
- * the model actually changes its thoroughness; the native (mechanical) provider
12
- * documents in its own JSDoc why depth does not change its lint +
13
- * maintainability sweep. This module is the single home for the depth → prose
14
- * mapping so the three LLM providers share one wording rather than each
15
- * re-spelling the semantics (which would cross the duplication gate).
16
- *
17
- * The mapping is intentionally model-agnostic: it describes *how thorough* the
18
- * review should be, not which tool runs it. A provider appends
19
- * `renderDepthDirective(depth)` to its prompt to instruct the model.
2
+ * review-providers/review-depth.js — the one depth → prompt-prose mapping the
3
+ * LLM-backed providers share; model-agnostic, it says how thorough to be.
20
4
  *
21
5
  * @typedef {import('./types.js').ReviewDepth} ReviewDepth
22
6
  */
23
7
 
24
8
  /**
25
- * Canonical per-depth review directive sentences. Keyed by the canonical
26
- * `ReviewDepth` enum. Exported so tests and doc tooling can assert against the
27
- * exact wording rather than free-text matching.
28
- *
29
9
  * @type {Readonly<Record<ReviewDepth, string>>}
30
10
  */
31
11
  const DEPTH_DIRECTIVES = Object.freeze({
@@ -45,11 +25,7 @@ const DEPTH_DIRECTIVES = Object.freeze({
45
25
  });
46
26
 
47
27
  /**
48
- * Normalize an arbitrary depth value to the canonical enum, defaulting to
49
- * `standard` for anything unrecognised (including `undefined` — providers may
50
- * receive an input without a depth from a caller that did not resolve one).
51
- *
52
- * Pure. Exported for testing.
28
+ * Anything unrecognised, including `undefined`, is `standard`.
53
29
  *
54
30
  * @param {unknown} depth
55
31
  * @returns {ReviewDepth}
@@ -59,12 +35,7 @@ function normalizeDepth(depth) {
59
35
  }
60
36
 
61
37
  /**
62
- * Render the depth directive sentence(s) for a given depth value, ready to
63
- * append to a provider's prompt. Always returns a non-empty string carrying a
64
- * `Review depth:` marker so connectivity tests can assert the lever reached the
65
- * prompt regardless of which tier resolved.
66
- *
67
- * Pure. Exported for testing.
38
+ * Always non-empty and carrying a `Review depth:` marker.
68
39
  *
69
40
  * @param {ReviewDepth|undefined} depth
70
41
  * @returns {string}
@@ -1,27 +1,7 @@
1
1
  /**
2
- * review-providers/review-provider-factory.js — resolve
3
- * `codeReview.providers` to a concrete `ReviewProvider` instance.
4
- *
5
- * Story #2825 (Epic #2815) — the factory is the only entry point.
6
- * `runCodeReview()` never references a specific adapter directly;
7
- * adding a backend is (1) implement the interface, (2) register here,
8
- * (3) extend the schema enum.
9
- *
10
- * Story #2871 — the factory always returns a `ChainProvider` that
11
- * fans out `runReview` across every inline entry (merging `Finding[]`
12
- * in declaration order) and exposes `getPromptMessages` so the
13
- * orchestrator can render the trailing "Manual review suggestions"
14
- * section without knowing about per-provider mechanics.
15
- *
16
- * Behaviour:
17
- * - Unset / empty `codeReview.providers` defaults to a single-entry
18
- * chain `[{ name: 'native' }]`.
19
- * - Unknown provider name throws an Error with remediation text
20
- * naming the supported values.
21
- * - Adapters that throw at construction time (e.g. `codex` probing
22
- * for an absent plugin command) bubble their error verbatim —
23
- * EXCEPT when the chain entry carries `optional: true`, in which
24
- * case the chain logs a warning and skips that entry.
2
+ * review-providers/review-provider-factory.js — resolves
3
+ * `codeReview.providers` into a `ChainProvider`. A failing entry throws
4
+ * unless it is `optional`.
25
5
  *
26
6
  * @typedef {import('./types.js').ReviewProvider} ReviewProvider
27
7
  * @typedef {import('./types.js').ManualPromptProvider} ManualPromptProvider
@@ -40,12 +20,7 @@ import { createNativeProviderForRegistry } from './native.js';
40
20
  import { createSecurityReviewProviderForRegistry } from './security-review.js';
41
21
  import { createUltrareviewProviderForRegistry } from './ultrareview.js';
42
22
 
43
- /**
44
- * Inline provider registry — entries return a `ReviewProvider` that
45
- * produces `Finding[]` from a git diff.
46
- *
47
- * @type {Readonly<Record<string, () => ReviewProvider>>}
48
- */
23
+ /** @type {Readonly<Record<string, () => ReviewProvider>>} */
49
24
  const INLINE_PROVIDERS = Object.freeze({
50
25
  codex: createCodexProviderForRegistry,
51
26
  native: createNativeProviderForRegistry,
@@ -53,9 +28,7 @@ const INLINE_PROVIDERS = Object.freeze({
53
28
  });
54
29
 
55
30
  /**
56
- * Manual-prompt provider registry — entries return a
57
- * `ManualPromptProvider` that contributes a non-blocking operator
58
- * suggestion to the structured comment without running a review.
31
+ * Non-blocking operator suggestions; they run no review.
59
32
  *
60
33
  * @type {Readonly<Record<string, () => ManualPromptProvider>>}
61
34
  */
@@ -63,18 +36,10 @@ const PROMPT_PROVIDERS = Object.freeze({
63
36
  ultrareview: createUltrareviewProviderForRegistry,
64
37
  });
65
38
 
66
- /**
67
- * The inline provider name used when `codeReview.providers` is unset,
68
- * empty, or the `codeReview` block is absent entirely.
69
- */
70
39
  export const DEFAULT_PROVIDER_NAME = 'native';
71
40
 
72
41
  /**
73
- * Pure: build a gate predicate from a chain entry's `when` clause.
74
- * Currently supports `label` (single string) and `labelAny`
75
- * (string[]); other keys are rejected at the schema layer.
76
- *
77
- * `when` absent → gate is "always true".
42
+ * Gate predicate from a `when` clause (`label` / `labelAny`); absent → always true.
78
43
  *
79
44
  * @param {{ label?: string, labelAny?: string[] }|undefined} when
80
45
  * @returns {ProviderGate}
@@ -100,10 +65,7 @@ export function buildGate(when) {
100
65
  }
101
66
 
102
67
  /**
103
- * Pure: scope filter — true when the entry's declared scope list
104
- * includes the current invocation scope. Default (no `scopes`) is
105
- * "fires on both" so unattended chains keep working at story-close
106
- * and epic-finalize alike.
68
+ * No declared `scopes` fires on every scope.
107
69
  *
108
70
  * @param {string[]|undefined} declaredScopes
109
71
  * @param {string} currentScope
@@ -117,12 +79,7 @@ export function isScopeApplicable(declaredScopes, currentScope) {
117
79
  }
118
80
 
119
81
  /**
120
- * Resolve a `ReviewProvider` instance from the resolved agentrc
121
- * config block. Pass the `codeReview` sub-object (not the full
122
- * config) so callers can compose with their own config readers.
123
- *
124
- * Always returns a `ChainProvider`. When `codeReviewConfig.providers`
125
- * is unset or empty, the chain defaults to `[{ name: 'native' }]`.
82
+ * Takes the `codeReview` sub-object; unset/empty `providers` defaults to native.
126
83
  *
127
84
  * @param {{
128
85
  * providers?: Array<object>,
@@ -159,11 +116,6 @@ export function createReviewProvider(codeReviewConfig, opts = {}) {
159
116
  }
160
117
 
161
118
  /**
162
- * Build the inline + prompt entry list from a `providers: []` config.
163
- * Pure with respect to registry inputs — the registry is the only
164
- * side-effectful surface (provider constructors may probe disk or
165
- * spawn binaries).
166
- *
167
119
  * @param {Array<object>} entries
168
120
  * @param {{
169
121
  * inlineRegistry: Readonly<Record<string, () => ReviewProvider>>,
@@ -242,10 +194,8 @@ export function buildProviderChain(entries, ctx) {
242
194
  }
243
195
 
244
196
  /**
245
- * Wrap a resolved chain in a single `ReviewProvider`-compatible
246
- * object that the orchestrator can call uniformly. Inline adapters
247
- * fan out via `runReview`; prompt adapters fan out via
248
- * `getPromptMessages` (a method the orchestrator feature-detects).
197
+ * Inline findings merge in declaration order; prompt entries render via
198
+ * `getPromptMessages`.
249
199
  *
250
200
  * @param {ProviderChain} chain
251
201
  * @param {{ logger?: { info?: Function, warn?: Function } }} [opts]
@@ -290,8 +240,7 @@ export function createChainProvider(chain, opts = {}) {
290
240
  return merged;
291
241
  },
292
242
  /**
293
- * Degraded gates across the inline chain (Story #4839). Called after
294
- * `runReview`.
243
+ * Called after `runReview`.
295
244
  *
296
245
  * @returns {Promise<Array<object>>}
297
246
  */
@@ -337,9 +286,6 @@ export function createChainProvider(chain, opts = {}) {
337
286
  }
338
287
 
339
288
  /**
340
- * Expose the registered provider names — primarily for diagnostics
341
- * and test fixtures. Lists both inline and prompt providers.
342
- *
343
289
  * @returns {string[]}
344
290
  */
345
291
  export function listRegisteredProviders() {
@@ -351,10 +297,6 @@ export function listRegisteredProviders() {
351
297
  }
352
298
 
353
299
  /**
354
- * Expose the inline-only provider names — used by adapter tests that
355
- * need to assert against the inline registry without coupling to
356
- * manual-prompt entries.
357
- *
358
300
  * @returns {string[]}
359
301
  */
360
302
  export function listInlineProviders() {
@@ -362,8 +304,6 @@ export function listInlineProviders() {
362
304
  }
363
305
 
364
306
  /**
365
- * Expose the manual-prompt-only provider names.
366
- *
367
307
  * @returns {string[]}
368
308
  */
369
309
  export function listPromptProviders() {
@@ -1,98 +1,30 @@
1
1
  /**
2
- * review-providers/scoped-lint.js — the scoped-lint surface of the native
3
- * review provider (extracted from `native.js` by Story #4839).
4
- *
5
- * ## Why this module exists
6
- *
7
- * The scoped-lint gate reported `executionFailed` — and therefore emitted zero
8
- * findings while the review reported clean — on 18 of 23 Beestera/swarm-os
9
- * Stories carrying friction (78%) and on 5 mandrel Stories. Measured
10
- * 2026-07-29, the cause was **not** environmental and **not** a parse failure.
11
- * Three defects in how the runners were invoked and reconciled produced the
12
- * same symptom:
13
- *
14
- * 1. **The markdown runner was never resolvable.** The provider spawned
15
- * `npx --no markdownlint`, but the binary this project (and the consumer)
16
- * installs is `markdownlint-cli2` — `markdownlint-cli2` is the package and
17
- * the bin name; a bare `markdownlint` bin does not exist. `npx --no` with an
18
- * unresolvable bin exits 1 printing `could not determine executable to run`
19
- * and nothing else, so the summary parsed nothing and the gate degraded.
20
- * The parser was already written for **cli2's** `Summary: N error(s)` line,
21
- * so the invocation and the parser had never agreed. The `--ignore
22
- * node_modules` flag was likewise `markdownlint-cli` (v1) syntax, which
23
- * cli2 does not accept. Fix: resolve the runner from what is actually
24
- * installed and pass each candidate its own argument shape.
25
- *
26
- * 2. **One runner's failure poisoned the other's verdict.** The two runs were
27
- * folded into a *single* `parseLintOutput` call over concatenated output and
28
- * the maximum exit status. So the unresolvable markdown runner's exit 1
29
- * became the verdict for biome too: any change set containing at least one
30
- * `.md` file degraded the whole gate whenever biome itself had nothing to
31
- * report — i.e. exactly the clean case the gate exists to confirm. Fix:
32
- * classify each surface independently and merge structurally.
33
- *
34
- * 3. **Biome's "nothing in scope" exit was read as a failure.** `biome lint`
35
- * exits 1 with `No files were processed in the specified paths.` when every
36
- * supplied path is excluded by `biome.json` (`temp/`, `dist/`,
37
- * `.worktrees/`, anything in the VCS ignore file). That is an empty scope,
38
- * not a runner that could not execute. Fix: recognise the sentinel.
39
- *
40
- * ## What a degraded surface now produces
41
- *
42
- * `runScopedLint` still reports `executionFailed` — the friction-telemetry
43
- * emission in `native.js` is deliberately unchanged (Story #4699 routed an
44
- * unexecutable tool to telemetry so severity tiers reflect code findings only,
45
- * and that intent stands). It additionally reports a `degradations[]` array
46
- * naming **which** surface could not run and **why**, so the review outcome can
47
- * say "this gate did not run" instead of silently reading clean.
48
- *
49
- * ## The code surface never got the same treatment (Story #5193)
50
- *
51
- * Story #4839 gave the *markdown* surface a disk probe and left the code
52
- * surface spawning `npx --no biome` and classifying the exit code. On npm 11.x
53
- * that spawn exits **0 with empty output** when biome is absent, so
54
- * `parseLintOutput` saw no failure, produced no degradation, and the surface
55
- * contributed `errors: 0, warnings: 0` — a *silent false clean*, which is
56
- * strictly worse than a degradation: a degraded surface announces itself, a
57
- * falsely-clean one is trusted. Since nothing in the framework requires either
58
- * runner, "absent" is the default state of a consumer checkout.
59
- *
60
- * Fix: runner resolution is a **precondition** for every surface, not an
61
- * outcome inferred from an exit code. Both surfaces now resolve through
62
- * {@link resolveRunner}, and an unresolved runner is never spawned.
63
- *
64
- * The same measurement invalidated the `NPX_UNRESOLVABLE` sentinel: current npm
65
- * answers an unresolvable bin with `npm error code E404`, not `could not
66
- * determine executable to run`, so every genuinely-unresolvable runner was
67
- * being labelled `unparseable-output`. The sentinel now recognises both shapes.
68
- * It still earns its keep after the disk probe: the probe only sees
69
- * `node_modules/.bin`, so a runner resolvable some other way can still fail.
2
+ * review-providers/scoped-lint.js — scoped biome + markdownlint over the
3
+ * changed surface. Runners resolve on disk before spawning (`npx --no biome`
4
+ * exits 0 silently when biome is absent), and each surface is classified
5
+ * independently so one failure cannot become the other's verdict.
70
6
  */
71
7
 
72
8
  import { spawnSync } from 'node:child_process';
73
9
  import { existsSync } from 'node:fs';
74
10
  import path from 'node:path';
75
11
 
76
- /** Paths these extensions land on the biome (code) runner. */
77
12
  const CODE_EXTENSIONS = /\.(js|mjs|cjs|jsx|ts|tsx|json|jsonc)$/i;
78
13
 
79
14
  /**
80
- * npx's output when the requested bin cannot be resolved. Two shapes: the
81
- * legacy message, and the `E404` current npm answers with instead (measured
82
- * 2026-09-07 on npm 11.13.0). Matching the E404 *code* rather than any
83
- * `npm error` line keeps a genuine runner error out of this classification.
15
+ * npx's unresolvable-bin output: the legacy message or current npm's E404.
16
+ * Matching the E404 code, not any `npm error` line, keeps genuine runner
17
+ * errors out.
84
18
  */
85
19
  const NPX_UNRESOLVABLE =
86
20
  /could not determine executable to run|npm (?:error|ERR!)\s+code\s+E404/i;
87
21
 
88
- /** Biome's exit-1 message when every supplied path is config-excluded. */
22
+ /** Biome's exit-1 when every path is config-excluded: an empty scope, not a failure. */
89
23
  const BIOME_EMPTY_SCOPE = /No files were processed in the specified paths/i;
90
24
 
91
25
  /**
92
- * Markdown runners in preference order, each with the argument shape *it*
93
- * accepts. `markdownlint-cli2` takes bare paths/globs and rejects `--ignore`;
94
- * `markdownlint` (cli v1) takes `--ignore`. Explicit changed-file paths are
95
- * passed either way, so the v1 ignore flag is belt-and-braces only.
26
+ * Markdown runners in preference order, each with its own argument shape:
27
+ * cli2 rejects `--ignore`, which cli v1 takes.
96
28
  */
97
29
  const MARKDOWN_RUNNERS = Object.freeze([
98
30
  Object.freeze({ bin: 'markdownlint-cli2', extraArgs: Object.freeze([]) }),
@@ -102,16 +34,10 @@ const MARKDOWN_RUNNERS = Object.freeze([
102
34
  }),
103
35
  ]);
104
36
 
105
- /**
106
- * Code runners in preference order. `@biomejs/biome` installs a bare `biome`
107
- * bin, which is also the canonical name this surface reports itself under when
108
- * nothing resolves.
109
- */
110
37
  const CODE_RUNNERS = Object.freeze([
111
38
  Object.freeze({ bin: 'biome', extraArgs: Object.freeze([]) }),
112
39
  ]);
113
40
 
114
- /** Reason codes carried on a degradation record. */
115
41
  const DEGRADATION_REASONS = Object.freeze({
116
42
  RUNNER_NOT_INSTALLED: 'runner-not-installed',
117
43
  RUNNER_NOT_RESOLVABLE: 'runner-not-resolvable',
@@ -140,22 +66,9 @@ function spawnLintRunner(bin, args, cwd) {
140
66
  }
141
67
 
142
68
  /**
143
- * Pure-ish: pick the first candidate whose bin is actually installed under
144
- * `<cwd>/node_modules/.bin`. Returns `null` when none is — an honest "this
145
- * surface has no runner" that the caller reports rather than silently folding
146
- * into a generic parse failure.
147
- *
148
- * The disk probe (rather than "spawn and see") is what makes the failure
149
- * *nameable*, and — since Story #5193 — what makes it *visible at all* on the
150
- * code surface: `npx --no <missing-bin>` answers with a generic npm error at
151
- * best and an empty exit 0 at worst, which is precisely how both defects hid.
152
- *
153
- * Probing `node_modules/.bin` only is a deliberate bound: a globally-installed
154
- * runner reads as absent here, which degrades the gate honestly rather than
155
- * trusting a spawn nobody resolved.
156
- *
157
- * Not exported: it is reachable — and asserted — through {@link runScopedLint},
158
- * whose `existsFn` seam drives every resolution branch.
69
+ * First candidate installed under `<cwd>/node_modules/.bin`, else `null`.
70
+ * Deliberately local-only: a global runner reads as absent and degrades
71
+ * honestly rather than trusting an unresolved spawn.
159
72
  *
160
73
  * @param {ReadonlyArray<{ bin: string, extraArgs: ReadonlyArray<string> }>} candidates
161
74
  * @param {string} cwd
@@ -177,9 +90,7 @@ function resolveRunner(candidates, cwd, existsFn) {
177
90
  }
178
91
 
179
92
  /**
180
- * Pure: the summary a surface reports when it has no runner to spawn. Counts
181
- * are zero *and* `executionFailed` is true, so the row can never be read as a
182
- * clean result — the invariant Story #5193 restored.
93
+ * Zero counts with `executionFailed: true`, so it can never read as clean.
183
94
  *
184
95
  * @returns {ReturnType<typeof parseLintOutput>}
185
96
  */
@@ -196,7 +107,6 @@ function unresolvedRunnerSummary() {
196
107
 
197
108
  /**
198
109
  * Resolve one surface's runner and, only if it resolved, spawn and classify it.
199
- * Shared by both surfaces so neither can drift back into spawn-and-see.
200
110
  *
201
111
  * @param {{
202
112
  * label: string,
@@ -220,8 +130,6 @@ function runSurface({ label, candidates, buildArgs, cwd, runnerFn, existsFn }) {
220
130
  }
221
131
 
222
132
  /**
223
- * Pure: split changed paths into the file lists each lint runner consumes.
224
- *
225
133
  * @param {string[]} changedFiles
226
134
  * @returns {{ code: string[], md: string[] }}
227
135
  */
@@ -236,16 +144,8 @@ export function partitionFilesForLint(changedFiles) {
236
144
  }
237
145
 
238
146
  /**
239
- * Pure: classify **one** runner's result into a summary.
240
- *
241
- * Handles the reporter formats composing `npm run lint` here:
242
- * - Biome: `Found N error(s).` / `Found N warning(s).`
243
- * - markdownlint-cli2: a trailing `Summary: N error(s)` line.
244
- *
245
- * A non-zero exit whose output matches no known reporter format is "could not
246
- * classify" → `executionFailed: true`, with `reason` naming what was actually
247
- * observed. Biome's empty-scope exit is recognised separately as
248
- * `emptyScope` — nothing to lint is not a broken runner.
147
+ * A non-zero exit matching no reporter format is `executionFailed`, except
148
+ * biome's empty-scope exit.
249
149
  *
250
150
  * @param {{ status?: number, stdout?: string, stderr?: string }} result
251
151
  * @returns {{ errors: number, warnings: number, parsed: boolean, executionFailed: boolean, emptyScope: boolean, reason: string|null }}
@@ -284,18 +184,8 @@ export function parseLintOutput(result) {
284
184
  }
285
185
 
286
186
  /**
287
- * Pure: merge per-surface summaries into the gate's single summary. Counts add;
288
- * `executionFailed` is the OR across surfaces; each failed surface contributes
289
- * one degradation record naming itself. Merging *summaries* rather than raw
290
- * output is what stops one runner's failure from becoming the other's verdict.
291
- *
292
- * The OR is deliberately lossy — it answers "did any surface fail?", which is
293
- * the only question the degradation channel asks. Story #5282 added the
294
- * `surfaces[]` rows so a consumer can ask the *other* questions the OR cannot
295
- * answer: which surface the merged counts came from, and — via each row's
296
- * `parsed` and `executionFailed` — whether an absent biome or a biome run that
297
- * simply reported nothing is behind a zero. Consumers that read the flat
298
- * counts are unaffected; the rows are additive.
187
+ * Counts add and `executionFailed` is the OR; `surfaces[]` keeps what the
188
+ * lossy OR cannot answer.
299
189
  *
300
190
  * @param {Array<{ surface: string, summary: ReturnType<typeof parseLintOutput> }>} surfaces
301
191
  */
@@ -325,12 +215,10 @@ function mergeSurfaceSummaries(surfaces) {
325
215
  }
326
216
 
327
217
  /**
328
- * Run lint scoped to the changed surface only.
329
- *
330
218
  * @param {string[]} changedFiles
331
219
  * @param {string} cwd
332
220
  * @param {typeof spawnLintRunner} [runnerFn]
333
- * @param {{ existsFn?: (p: string) => boolean }} [deps] Test seam for runner resolution.
221
+ * @param {{ existsFn?: (p: string) => boolean }} [deps]
334
222
  * @returns {{ errors: number, warnings: number, parsed: boolean, skipped: boolean, mode: 'changed-only'|'off', executionFailed: boolean, degradations: Array<{ surface: string, reason: string }>, surfaces: Array<{ surface: string, parsed: boolean, errors: number, warnings: number, executionFailed: boolean }> }}
335
223
  */
336
224
  export function runScopedLint(