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,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(