mandrel 2.59.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 (678) hide show
  1. package/.agents/README.md +21 -19
  2. package/.agents/agents/acceptance-critic.md +24 -43
  3. package/.agents/agents/story-worker.md +20 -21
  4. package/.agents/docs/agentrc-reference.json +5 -84
  5. package/.agents/docs/configuration.md +48 -132
  6. package/.agents/docs/workflows.md +2 -2
  7. package/.agents/instructions.md +5 -8
  8. package/.agents/rules/ci-remediation.md +41 -8
  9. package/.agents/rules/gherkin-standards.md +4 -0
  10. package/.agents/schemas/acceptance-eval-verdict.schema.json +1 -1
  11. package/.agents/schemas/agentrc.schema.json +16 -496
  12. package/.agents/schemas/story-deliver-terminal.schema.json +13 -3
  13. package/.agents/schemas/validation-evidence.schema.json +2 -1
  14. package/.agents/scripts/README.md +23 -13
  15. package/.agents/scripts/acceptance-eval.js +35 -169
  16. package/.agents/scripts/agents-bootstrap-github.js +27 -129
  17. package/.agents/scripts/apply-quality-bootstrap.js +4 -40
  18. package/.agents/scripts/audit-baselines.js +6 -27
  19. package/.agents/scripts/audit-labels-bootstrap.js +5 -29
  20. package/.agents/scripts/audit-to-stories.js +91 -361
  21. package/.agents/scripts/boot-sweep.js +19 -72
  22. package/.agents/scripts/bootstrap.js +74 -395
  23. package/.agents/scripts/ceremony-derive.js +10 -41
  24. package/.agents/scripts/check-arch-cycles.js +14 -64
  25. package/.agents/scripts/check-baselines.js +8 -48
  26. package/.agents/scripts/check-context-budget.js +105 -311
  27. package/.agents/scripts/check-cyclomatic.js +12 -44
  28. package/.agents/scripts/check-dead-exports.js +13 -64
  29. package/.agents/scripts/check-doc-links.js +38 -186
  30. package/.agents/scripts/check-gherkin-corpus.js +24 -127
  31. package/.agents/scripts/check-test-temp-hygiene.js +28 -169
  32. package/.agents/scripts/coverage-capture.js +34 -98
  33. package/.agents/scripts/deliver-light.js +25 -171
  34. package/.agents/scripts/deliver-recover.js +6 -42
  35. package/.agents/scripts/deliver-run.js +534 -0
  36. package/.agents/scripts/diagnose-friction.js +24 -116
  37. package/.agents/scripts/drain-pending-cleanup.js +1 -1
  38. package/.agents/scripts/evidence-gate.js +23 -85
  39. package/.agents/scripts/file-ci-gap.js +57 -49
  40. package/.agents/scripts/generate-config-docs.js +30 -170
  41. package/.agents/scripts/generate-lens-checklists.js +8 -52
  42. package/.agents/scripts/generate-skills-index.js +14 -112
  43. package/.agents/scripts/generate-workflows-doc.js +10 -70
  44. package/.agents/scripts/git-cleanup.js +2 -34
  45. package/.agents/scripts/lib/Graph.js +24 -81
  46. package/.agents/scripts/lib/ITicketingProvider.js +47 -143
  47. package/.agents/scripts/lib/Logger.js +14 -76
  48. package/.agents/scripts/lib/audit-baselines/engine.js +11 -31
  49. package/.agents/scripts/lib/audit-baselines/gate-surface.js +3 -17
  50. package/.agents/scripts/lib/audit-baselines/headroom.js +4 -20
  51. package/.agents/scripts/lib/audit-baselines/hotspots.js +3 -15
  52. package/.agents/scripts/lib/audit-baselines/kinds.js +23 -89
  53. package/.agents/scripts/lib/audit-baselines/outliers.js +6 -23
  54. package/.agents/scripts/lib/audit-baselines/read.js +3 -16
  55. package/.agents/scripts/lib/audit-baselines/staleness.js +7 -26
  56. package/.agents/scripts/lib/audit-baselines/surface-entry.js +7 -28
  57. package/.agents/scripts/lib/audit-baselines/trend.js +7 -20
  58. package/.agents/scripts/lib/audit-baselines/weights.js +9 -37
  59. package/.agents/scripts/lib/audit-suite/audit-rules-reader.js +3 -18
  60. package/.agents/scripts/lib/audit-suite/checklist-threading.js +26 -124
  61. package/.agents/scripts/lib/audit-suite/dispatch-checklist.js +14 -45
  62. package/.agents/scripts/lib/audit-suite/findings.js +12 -52
  63. package/.agents/scripts/lib/audit-suite/frontmatter.js +5 -29
  64. package/.agents/scripts/lib/audit-suite/index.js +1 -15
  65. package/.agents/scripts/lib/audit-suite/lens-checklist.js +10 -45
  66. package/.agents/scripts/lib/audit-suite/lens-diff-floor.js +11 -76
  67. package/.agents/scripts/lib/audit-suite/runner.js +13 -43
  68. package/.agents/scripts/lib/audit-suite/selector.js +49 -349
  69. package/.agents/scripts/lib/audit-suite/substitutions.js +12 -40
  70. package/.agents/scripts/lib/audit-suite/workflow-loader.js +3 -15
  71. package/.agents/scripts/lib/audit-to-stories/audit-label-taxonomy.js +11 -73
  72. package/.agents/scripts/lib/audit-to-stories/audit-lenses.js +8 -37
  73. package/.agents/scripts/lib/audit-to-stories/build-story-body.js +25 -143
  74. package/.agents/scripts/lib/audit-to-stories/dedupe-against-github.js +14 -80
  75. package/.agents/scripts/lib/audit-to-stories/epic-grouping-directive.js +4 -18
  76. package/.agents/scripts/lib/audit-to-stories/finding-adapter.js +7 -40
  77. package/.agents/scripts/lib/audit-to-stories/group-findings.js +9 -39
  78. package/.agents/scripts/lib/audit-to-stories/issue-corpus.js +10 -66
  79. package/.agents/scripts/lib/audit-to-stories/issue-index.js +6 -30
  80. package/.agents/scripts/lib/audit-to-stories/issues-file.js +6 -36
  81. package/.agents/scripts/lib/audit-to-stories/ledger-commit.js +17 -69
  82. package/.agents/scripts/lib/audit-to-stories/ledger-pr.js +17 -85
  83. package/.agents/scripts/lib/audit-to-stories/ledger-record.js +10 -48
  84. package/.agents/scripts/lib/audit-to-stories/parse-audit-md.js +38 -146
  85. package/.agents/scripts/lib/audit-to-stories/seed-from-findings.js +7 -42
  86. package/.agents/scripts/lib/audit-to-stories/wire-dependencies.js +10 -57
  87. package/.agents/scripts/lib/baseline-loader.js +12 -51
  88. package/.agents/scripts/lib/baseline-schema-registry.js +5 -22
  89. package/.agents/scripts/lib/baselines/component-matcher.js +3 -12
  90. package/.agents/scripts/lib/baselines/components.js +10 -61
  91. package/.agents/scripts/lib/baselines/coverage-updater-cli.js +7 -36
  92. package/.agents/scripts/lib/baselines/crap-preview-incremental.js +7 -19
  93. package/.agents/scripts/lib/baselines/crap-preview-scan.js +19 -45
  94. package/.agents/scripts/lib/baselines/crap-updater-cli.js +16 -65
  95. package/.agents/scripts/lib/baselines/diff-scope-cli.js +5 -33
  96. package/.agents/scripts/lib/baselines/duplication-scanner.js +11 -60
  97. package/.agents/scripts/lib/baselines/env-overrides.js +12 -67
  98. package/.agents/scripts/lib/baselines/envelope.js +13 -129
  99. package/.agents/scripts/lib/baselines/exit-codes.js +6 -49
  100. package/.agents/scripts/lib/baselines/git-base.js +23 -142
  101. package/.agents/scripts/lib/baselines/kernel.js +11 -111
  102. package/.agents/scripts/lib/baselines/kinds/_crap-new-method-gate.js +9 -47
  103. package/.agents/scripts/lib/baselines/kinds/_crap-read.js +8 -51
  104. package/.agents/scripts/lib/baselines/kinds/_shared-metric.js +7 -62
  105. package/.agents/scripts/lib/baselines/kinds/bundle-size.js +8 -29
  106. package/.agents/scripts/lib/baselines/kinds/coverage.js +3 -15
  107. package/.agents/scripts/lib/baselines/kinds/crap.js +94 -415
  108. package/.agents/scripts/lib/baselines/kinds/duplication.js +4 -30
  109. package/.agents/scripts/lib/baselines/kinds/kind-factory.js +7 -53
  110. package/.agents/scripts/lib/baselines/kinds/maintainability.js +15 -80
  111. package/.agents/scripts/lib/baselines/kinds/mutation.js +12 -72
  112. package/.agents/scripts/lib/baselines/maintainability-baseline-io.js +4 -11
  113. package/.agents/scripts/lib/baselines/merge-envelopes.js +30 -146
  114. package/.agents/scripts/lib/baselines/path-canon.js +19 -128
  115. package/.agents/scripts/lib/baselines/preview-gates.js +8 -37
  116. package/.agents/scripts/lib/baselines/reader.js +14 -107
  117. package/.agents/scripts/lib/baselines/refresh-service.js +35 -252
  118. package/.agents/scripts/lib/baselines/scope.js +11 -135
  119. package/.agents/scripts/lib/baselines/writer.js +16 -149
  120. package/.agents/scripts/lib/bdd-runner-detect.js +18 -113
  121. package/.agents/scripts/lib/bdd-scenario-budget.js +9 -36
  122. package/.agents/scripts/lib/bdd-scenario-scanner.js +11 -73
  123. package/.agents/scripts/lib/bdd-step-index.js +26 -100
  124. package/.agents/scripts/lib/bootstrap/baseline-merge-driver.js +23 -103
  125. package/.agents/scripts/lib/bootstrap/branch-protection.js +2 -5
  126. package/.agents/scripts/lib/bootstrap/commit-push.js +12 -50
  127. package/.agents/scripts/lib/bootstrap/gh-preflight.js +14 -101
  128. package/.agents/scripts/lib/bootstrap/hitl-confirm.js +5 -30
  129. package/.agents/scripts/lib/bootstrap/install-ledger.js +17 -73
  130. package/.agents/scripts/lib/bootstrap/issue-forms-template.js +17 -121
  131. package/.agents/scripts/lib/bootstrap/manifest.js +15 -86
  132. package/.agents/scripts/lib/bootstrap/merge-methods.js +4 -33
  133. package/.agents/scripts/lib/bootstrap/preflight.js +12 -61
  134. package/.agents/scripts/lib/bootstrap/project-bootstrap.js +34 -235
  135. package/.agents/scripts/lib/bootstrap/prompt.js +21 -129
  136. package/.agents/scripts/lib/bootstrap/quality-bootstrap.js +27 -141
  137. package/.agents/scripts/lib/bootstrap/summary.js +1 -8
  138. package/.agents/scripts/lib/bootstrap/workflow-audit.js +11 -84
  139. package/.agents/scripts/lib/branch-name-guard.js +4 -23
  140. package/.agents/scripts/lib/changed-files.js +39 -121
  141. package/.agents/scripts/lib/checks/core-bare-clean.js +4 -24
  142. package/.agents/scripts/lib/checks/index.js +18 -101
  143. package/.agents/scripts/lib/checks/loop-health.js +11 -53
  144. package/.agents/scripts/lib/checks/state.js +16 -91
  145. package/.agents/scripts/lib/checks/story-init-not-backgrounded.js +10 -61
  146. package/.agents/scripts/lib/checks/subagent-agent-tool-required.js +14 -83
  147. package/.agents/scripts/lib/child-exec.js +39 -108
  148. package/.agents/scripts/lib/cli/standard-args.js +9 -116
  149. package/.agents/scripts/lib/cli-args.js +31 -146
  150. package/.agents/scripts/lib/cli-usage.js +5 -27
  151. package/.agents/scripts/lib/cli-utils.js +2 -12
  152. package/.agents/scripts/lib/close-validation/commands.js +13 -76
  153. package/.agents/scripts/lib/close-validation/gates.js +92 -331
  154. package/.agents/scripts/lib/close-validation/process.js +121 -151
  155. package/.agents/scripts/lib/close-validation/projections/advisories.js +5 -31
  156. package/.agents/scripts/lib/close-validation/projections/crap.js +19 -67
  157. package/.agents/scripts/lib/close-validation/projections/head-sha.js +1 -17
  158. package/.agents/scripts/lib/close-validation/projections/inputs.js +4 -34
  159. package/.agents/scripts/lib/close-validation/projections/maintainability.js +11 -58
  160. package/.agents/scripts/lib/close-validation/runner.js +53 -110
  161. package/.agents/scripts/lib/command-header.js +6 -28
  162. package/.agents/scripts/lib/config/acceptance-eval.js +4 -30
  163. package/.agents/scripts/lib/config/baselines.js +3 -14
  164. package/.agents/scripts/lib/config/ci.js +8 -38
  165. package/.agents/scripts/lib/config/commands.js +1 -15
  166. package/.agents/scripts/lib/config/defaults.js +4 -33
  167. package/.agents/scripts/lib/config/delivery-routing.js +6 -34
  168. package/.agents/scripts/lib/config/explain.js +10 -83
  169. package/.agents/scripts/lib/config/gates/coverage.schema.js +0 -12
  170. package/.agents/scripts/lib/config/gates/crap-incremental-coverage.schema.js +3 -31
  171. package/.agents/scripts/lib/config/gates/crap.schema.js +1 -34
  172. package/.agents/scripts/lib/config/gates/duplication.schema.js +1 -8
  173. package/.agents/scripts/lib/config/gates/index.js +2 -17
  174. package/.agents/scripts/lib/config/gates/maintainability.schema.js +1 -20
  175. package/.agents/scripts/lib/config/gates/mutation.schema.js +1 -7
  176. package/.agents/scripts/lib/config/gates/shared.js +4 -64
  177. package/.agents/scripts/lib/config/github.js +4 -22
  178. package/.agents/scripts/lib/config/limits.js +4 -57
  179. package/.agents/scripts/lib/config/paths.js +2 -21
  180. package/.agents/scripts/lib/config/qa.js +4 -38
  181. package/.agents/scripts/lib/config/quality.js +76 -432
  182. package/.agents/scripts/lib/config/runners.js +12 -56
  183. package/.agents/scripts/lib/config/runtime.js +13 -57
  184. package/.agents/scripts/lib/config/shared.js +2 -16
  185. package/.agents/scripts/lib/config/sync-agentrc.js +9 -50
  186. package/.agents/scripts/lib/config/temp-paths.js +40 -280
  187. package/.agents/scripts/lib/config/validate-orchestration.js +5 -17
  188. package/.agents/scripts/lib/config/worktree-isolation.js +9 -28
  189. package/.agents/scripts/lib/config-resolver.js +11 -52
  190. package/.agents/scripts/lib/config-schema-shared.js +1 -4
  191. package/.agents/scripts/lib/config-settings-schema-delivery.js +16 -291
  192. package/.agents/scripts/lib/config-settings-schema-quality.js +7 -219
  193. package/.agents/scripts/lib/config-settings-schema.js +37 -274
  194. package/.agents/scripts/lib/coverage-baseline.js +20 -110
  195. package/.agents/scripts/lib/coverage-capture-fullscope.js +18 -35
  196. package/.agents/scripts/lib/coverage-capture-incremental.js +15 -45
  197. package/.agents/scripts/lib/coverage-capture-usage.js +8 -25
  198. package/.agents/scripts/lib/coverage-capture.js +99 -224
  199. package/.agents/scripts/lib/coverage-utils.js +14 -79
  200. package/.agents/scripts/lib/cpu-pool.js +17 -123
  201. package/.agents/scripts/lib/crap-baseline-join.js +16 -88
  202. package/.agents/scripts/lib/crap-coordinates.js +6 -25
  203. package/.agents/scripts/lib/crap-engine.js +40 -153
  204. package/.agents/scripts/lib/crap-method-identity.js +16 -78
  205. package/.agents/scripts/lib/crap-utils.js +31 -155
  206. package/.agents/scripts/lib/cyclomatic-ceiling.js +14 -87
  207. package/.agents/scripts/lib/cyclomatic-scope.js +10 -50
  208. package/.agents/scripts/lib/dead-exports-knip.js +18 -56
  209. package/.agents/scripts/lib/dead-exports-mode.js +5 -24
  210. package/.agents/scripts/lib/degraded-mode.js +3 -26
  211. package/.agents/scripts/lib/dependency-parser.js +8 -40
  212. package/.agents/scripts/lib/dependency-version.js +13 -35
  213. package/.agents/scripts/lib/detect-package-manager.js +6 -36
  214. package/.agents/scripts/lib/doc-tiers.js +22 -124
  215. package/.agents/scripts/lib/duplicate-search.js +8 -72
  216. package/.agents/scripts/lib/env-loader.js +5 -27
  217. package/.agents/scripts/lib/error-redactor.js +6 -31
  218. package/.agents/scripts/lib/errors/index.js +2 -22
  219. package/.agents/scripts/lib/escomplex-ast-compat.js +22 -163
  220. package/.agents/scripts/lib/escomplex-kernel.js +21 -123
  221. package/.agents/scripts/lib/feedback-loop/graduator-core.js +94 -419
  222. package/.agents/scripts/lib/feedback-loop/prior-feedback-fetcher.js +20 -98
  223. package/.agents/scripts/lib/feedback-loop/retro-proposals-graduator.js +27 -149
  224. package/.agents/scripts/lib/findings/audit-ledger.js +23 -97
  225. package/.agents/scripts/lib/findings/classify-finding.js +14 -69
  226. package/.agents/scripts/lib/findings/promote-finding.js +14 -112
  227. package/.agents/scripts/lib/findings/provenance-field.js +11 -52
  228. package/.agents/scripts/lib/findings/route-finding.js +37 -255
  229. package/.agents/scripts/lib/findings/semantic-issue-search.js +14 -59
  230. package/.agents/scripts/lib/findings/severity.js +18 -104
  231. package/.agents/scripts/lib/format-generated-json.js +12 -44
  232. package/.agents/scripts/lib/full-suite-lock.js +160 -429
  233. package/.agents/scripts/lib/full-suite-queue.js +213 -0
  234. package/.agents/scripts/lib/gates/baseline-store.js +5 -9
  235. package/.agents/scripts/lib/gates/friction.js +1 -3
  236. package/.agents/scripts/lib/generated/agentrc-validator.js +2 -2
  237. package/.agents/scripts/lib/gh-exec.js +123 -191
  238. package/.agents/scripts/lib/git/cached-fetch.js +9 -52
  239. package/.agents/scripts/lib/git/sync-from-base.js +15 -107
  240. package/.agents/scripts/lib/git-branch-cleanup.js +14 -61
  241. package/.agents/scripts/lib/git-branch-lifecycle.js +16 -87
  242. package/.agents/scripts/lib/git-utils.js +37 -161
  243. package/.agents/scripts/lib/github/framework-repo.js +8 -71
  244. package/.agents/scripts/lib/github-url.js +2 -17
  245. package/.agents/scripts/lib/import-graph.js +11 -38
  246. package/.agents/scripts/lib/install-cmd-parser.js +4 -13
  247. package/.agents/scripts/lib/json-utils.js +3 -18
  248. package/.agents/scripts/lib/label-constants.js +16 -111
  249. package/.agents/scripts/lib/label-taxonomy.js +4 -30
  250. package/.agents/scripts/lib/maintainability-engine.js +12 -80
  251. package/.agents/scripts/lib/maintainability-unscorable.js +5 -25
  252. package/.agents/scripts/lib/maintainability-utils.js +16 -92
  253. package/.agents/scripts/lib/mandrel-catalog.js +12 -70
  254. package/.agents/scripts/lib/notifications/notifier.js +13 -38
  255. package/.agents/scripts/lib/npm-scripts.js +4 -23
  256. package/.agents/scripts/lib/observability/metrics-ledger.js +16 -76
  257. package/.agents/scripts/lib/observability/runtime-friction.js +44 -286
  258. package/.agents/scripts/lib/observability/signal-validator.js +5 -37
  259. package/.agents/scripts/lib/observability/signals-writer.js +11 -121
  260. package/.agents/scripts/lib/observability/source-classifier.js +22 -203
  261. package/.agents/scripts/lib/observability/terse-result.js +14 -47
  262. package/.agents/scripts/lib/onboard/init-tail.js +13 -74
  263. package/.agents/scripts/lib/onboard/scaffold-docs.js +11 -34
  264. package/.agents/scripts/lib/orchestration/acceptance-eval-decision.js +25 -139
  265. package/.agents/scripts/lib/orchestration/auto-merge-cwd.js +11 -66
  266. package/.agents/scripts/lib/orchestration/behind-recovery.js +10 -55
  267. package/.agents/scripts/lib/orchestration/ceremony-routing.js +28 -156
  268. package/.agents/scripts/lib/orchestration/change-set.js +7 -36
  269. package/.agents/scripts/lib/orchestration/check-baselines/phases/compare.js +9 -46
  270. package/.agents/scripts/lib/orchestration/check-baselines/phases/evaluate.js +11 -44
  271. package/.agents/scripts/lib/orchestration/check-baselines/phases/floors.js +5 -24
  272. package/.agents/scripts/lib/orchestration/check-baselines/phases/friction.js +3 -12
  273. package/.agents/scripts/lib/orchestration/check-baselines/phases/parse-args.js +5 -38
  274. package/.agents/scripts/lib/orchestration/check-baselines/phases/pipeline.js +3 -8
  275. package/.agents/scripts/lib/orchestration/check-baselines/phases/refresh-ack.js +28 -136
  276. package/.agents/scripts/lib/orchestration/check-baselines/phases/report.js +3 -13
  277. package/.agents/scripts/lib/orchestration/check-state.js +92 -0
  278. package/.agents/scripts/lib/orchestration/ci-gap-intake.js +37 -144
  279. package/.agents/scripts/lib/orchestration/ci-rerun-guard.js +121 -157
  280. package/.agents/scripts/lib/orchestration/code-review.js +24 -128
  281. package/.agents/scripts/lib/orchestration/column-sync.js +23 -111
  282. package/.agents/scripts/lib/orchestration/complexity-gate.js +118 -462
  283. package/.agents/scripts/lib/orchestration/deliver-recover.js +36 -168
  284. package/.agents/scripts/lib/orchestration/dependency-analyzer.js +4 -35
  285. package/.agents/scripts/lib/orchestration/dependency-candidates.js +9 -41
  286. package/.agents/scripts/lib/orchestration/diff-magnitude.js +25 -115
  287. package/.agents/scripts/lib/orchestration/doc-reader.js +2 -6
  288. package/.agents/scripts/lib/orchestration/docs-digest.js +13 -51
  289. package/.agents/scripts/lib/orchestration/epic-candidates.js +13 -53
  290. package/.agents/scripts/lib/orchestration/epic-checklist.js +9 -33
  291. package/.agents/scripts/lib/orchestration/epic-container.js +41 -167
  292. package/.agents/scripts/lib/orchestration/epic-expansion.js +10 -40
  293. package/.agents/scripts/lib/orchestration/epic-rollup.js +55 -207
  294. package/.agents/scripts/lib/orchestration/file-assumption-enum.js +2 -22
  295. package/.agents/scripts/lib/orchestration/file-assumptions.js +45 -253
  296. package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-detect.js +9 -46
  297. package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-reap.js +7 -57
  298. package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches.js +21 -126
  299. package/.agents/scripts/lib/orchestration/git-cleanup/phases/cli.js +2 -6
  300. package/.agents/scripts/lib/orchestration/git-cleanup/phases/fast-forward.js +1 -4
  301. package/.agents/scripts/lib/orchestration/git-cleanup/phases/filters.js +1 -5
  302. package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes-ff.js +9 -34
  303. package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes.js +41 -190
  304. package/.agents/scripts/lib/orchestration/git-cleanup/phases/merged-tip.js +9 -45
  305. package/.agents/scripts/lib/orchestration/git-cleanup/phases/parse-args.js +1 -4
  306. package/.agents/scripts/lib/orchestration/git-cleanup/phases/phase-drivers.js +19 -85
  307. package/.agents/scripts/lib/orchestration/git-cleanup/phases/prompts.js +3 -17
  308. package/.agents/scripts/lib/orchestration/git-cleanup/phases/prune.js +1 -5
  309. package/.agents/scripts/lib/orchestration/git-cleanup/phases/render.js +16 -100
  310. package/.agents/scripts/lib/orchestration/git-cleanup/phases/stashes.js +1 -4
  311. package/.agents/scripts/lib/orchestration/lease-guard-shared.js +16 -67
  312. package/.agents/scripts/lib/orchestration/lifecycle/emit-ledger-event.js +9 -33
  313. package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-flip-failed.js +8 -29
  314. package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-unlanded.js +15 -68
  315. package/.agents/scripts/lib/orchestration/light-backstop.js +11 -49
  316. package/.agents/scripts/lib/orchestration/light-escalation.js +21 -89
  317. package/.agents/scripts/lib/orchestration/light-suitability.js +37 -307
  318. package/.agents/scripts/lib/orchestration/merge-block-class.js +39 -216
  319. package/.agents/scripts/lib/orchestration/merge-poll.js +104 -377
  320. package/.agents/scripts/lib/orchestration/pinned-identifier-lint.js +17 -57
  321. package/.agents/scripts/lib/orchestration/plan-context.js +55 -318
  322. package/.agents/scripts/lib/orchestration/plan-critic-conditions.js +22 -79
  323. package/.agents/scripts/lib/orchestration/plan-critics-evaluate.js +5 -31
  324. package/.agents/scripts/lib/orchestration/plan-metrics.js +29 -108
  325. package/.agents/scripts/lib/orchestration/plan-navigation.js +8 -27
  326. package/.agents/scripts/lib/orchestration/plan-persist/acceptance-handle-repair.js +12 -49
  327. package/.agents/scripts/lib/orchestration/plan-persist/audit-provenance.js +18 -73
  328. package/.agents/scripts/lib/orchestration/plan-persist/changes-repair.js +16 -78
  329. package/.agents/scripts/lib/orchestration/plan-persist/cross-plan-links.js +6 -30
  330. package/.agents/scripts/lib/orchestration/plan-persist/epic-adoption.js +14 -65
  331. package/.agents/scripts/lib/orchestration/plan-persist/epic-ops.js +21 -76
  332. package/.agents/scripts/lib/orchestration/plan-persist/external-deps.js +6 -43
  333. package/.agents/scripts/lib/orchestration/plan-persist/persist-helpers.js +14 -68
  334. package/.agents/scripts/lib/orchestration/plan-persist/plan-context-source.js +9 -41
  335. package/.agents/scripts/lib/orchestration/plan-persist/run-plan-persist.js +71 -289
  336. package/.agents/scripts/lib/orchestration/plan-persist/soft-findings.js +2 -12
  337. package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +96 -362
  338. package/.agents/scripts/lib/orchestration/plan-persist/summary.js +9 -39
  339. package/.agents/scripts/lib/orchestration/plan-persist/supersede-ops.js +60 -186
  340. package/.agents/scripts/lib/orchestration/plan-persist/wave-collision-gate.js +9 -49
  341. package/.agents/scripts/lib/orchestration/plan-persist/wave-serialisation.js +7 -28
  342. package/.agents/scripts/lib/orchestration/plan-reachability.js +13 -42
  343. package/.agents/scripts/lib/orchestration/plan-run-labels/reap.js +16 -91
  344. package/.agents/scripts/lib/orchestration/plan-runner/worktree-sweep.js +16 -54
  345. package/.agents/scripts/lib/orchestration/plan-text-hygiene.js +10 -52
  346. package/.agents/scripts/lib/orchestration/planning/authoring-context.js +14 -109
  347. package/.agents/scripts/lib/orchestration/planning/memory-pool-advisory.js +11 -83
  348. package/.agents/scripts/lib/orchestration/pr-watch.js +48 -306
  349. package/.agents/scripts/lib/orchestration/project-meta-cache.js +15 -80
  350. package/.agents/scripts/lib/orchestration/project-meta-resolver.js +10 -51
  351. package/.agents/scripts/lib/orchestration/reassert-status-column.js +12 -76
  352. package/.agents/scripts/lib/orchestration/remote-verifier.js +12 -36
  353. package/.agents/scripts/lib/orchestration/resolve-stories.js +33 -164
  354. package/.agents/scripts/lib/orchestration/retro-proposals.js +66 -361
  355. package/.agents/scripts/lib/orchestration/review-base-ref.js +9 -43
  356. package/.agents/scripts/lib/orchestration/review-depth.js +12 -91
  357. package/.agents/scripts/lib/orchestration/review-providers/codex.js +10 -111
  358. package/.agents/scripts/lib/orchestration/review-providers/degraded-gates.js +13 -71
  359. package/.agents/scripts/lib/orchestration/review-providers/findings-renderer.js +7 -51
  360. package/.agents/scripts/lib/orchestration/review-providers/mi-exemptions.js +8 -53
  361. package/.agents/scripts/lib/orchestration/review-providers/native.js +30 -214
  362. package/.agents/scripts/lib/orchestration/review-providers/parse-findings.js +7 -52
  363. package/.agents/scripts/lib/orchestration/review-providers/review-depth.js +4 -33
  364. package/.agents/scripts/lib/orchestration/review-providers/review-provider-factory.js +11 -71
  365. package/.agents/scripts/lib/orchestration/review-providers/scoped-lint.js +19 -131
  366. package/.agents/scripts/lib/orchestration/review-providers/security-review.js +6 -89
  367. package/.agents/scripts/lib/orchestration/review-providers/types.js +26 -56
  368. package/.agents/scripts/lib/orchestration/review-providers/ultrareview.js +3 -46
  369. package/.agents/scripts/lib/orchestration/run-epilogue.js +245 -326
  370. package/.agents/scripts/lib/orchestration/run-scoped-config.js +55 -159
  371. package/.agents/scripts/lib/orchestration/single-story-close/close-note.js +7 -34
  372. package/.agents/scripts/lib/orchestration/single-story-close/failed-terminal.js +16 -89
  373. package/.agents/scripts/lib/orchestration/single-story-close/gate-log.js +18 -109
  374. package/.agents/scripts/lib/orchestration/single-story-close/phases/auto-merge.js +83 -239
  375. package/.agents/scripts/lib/orchestration/single-story-close/phases/base-sync.js +20 -82
  376. package/.agents/scripts/lib/orchestration/single-story-close/phases/close-validation.js +103 -97
  377. package/.agents/scripts/lib/orchestration/single-story-close/phases/code-review.js +8 -64
  378. package/.agents/scripts/lib/orchestration/single-story-close/phases/confirm-merge.js +136 -486
  379. package/.agents/scripts/lib/orchestration/single-story-close/phases/conventional-subject.js +30 -134
  380. package/.agents/scripts/lib/orchestration/single-story-close/phases/graphql-preflight.js +96 -0
  381. package/.agents/scripts/lib/orchestration/single-story-close/phases/lock-wait-pending.js +49 -0
  382. package/.agents/scripts/lib/orchestration/single-story-close/phases/normalize-pr-title.js +13 -86
  383. package/.agents/scripts/lib/orchestration/single-story-close/phases/options.js +20 -95
  384. package/.agents/scripts/lib/orchestration/single-story-close/phases/post-land.js +46 -203
  385. package/.agents/scripts/lib/orchestration/single-story-close/phases/pre-gate-steps.js +8 -50
  386. package/.agents/scripts/lib/orchestration/single-story-close/phases/pull-request.js +12 -83
  387. package/.agents/scripts/lib/orchestration/single-story-close/phases/push.js +6 -39
  388. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-block.js +1 -6
  389. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-outcome.js +4 -28
  390. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-override.js +6 -51
  391. package/.agents/scripts/lib/orchestration/single-story-close/phases/worktree-reap.js +6 -34
  392. package/.agents/scripts/lib/orchestration/single-story-close/phases/wrong-tree-guard.js +23 -121
  393. package/.agents/scripts/lib/orchestration/single-story-close/runner.js +180 -273
  394. package/.agents/scripts/lib/orchestration/single-story-lease-guard.js +15 -69
  395. package/.agents/scripts/lib/orchestration/story-body-gate.js +4 -23
  396. package/.agents/scripts/lib/orchestration/story-close/baseline-upward-writeback.js +50 -179
  397. package/.agents/scripts/lib/orchestration/story-close/context-budget-writeback.js +11 -41
  398. package/.agents/scripts/lib/orchestration/story-close/format-autofix.js +23 -311
  399. package/.agents/scripts/lib/orchestration/story-close/phases/local-lens-review.js +22 -147
  400. package/.agents/scripts/lib/orchestration/story-close/phases/review-core.js +16 -67
  401. package/.agents/scripts/lib/orchestration/story-deliver-terminal-schema.js +12 -68
  402. package/.agents/scripts/lib/orchestration/story-deliver-terminal.js +42 -200
  403. package/.agents/scripts/lib/orchestration/story-follow-ups.js +167 -252
  404. package/.agents/scripts/lib/orchestration/story-init-envelope.js +52 -0
  405. package/.agents/scripts/lib/orchestration/story-init-remote.js +2 -6
  406. package/.agents/scripts/lib/orchestration/story-reachability.js +3 -23
  407. package/.agents/scripts/lib/orchestration/task-body-validator.js +12 -135
  408. package/.agents/scripts/lib/orchestration/ticket-lease.js +28 -131
  409. package/.agents/scripts/lib/orchestration/ticket-validator-conflicts.js +15 -149
  410. package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +5 -33
  411. package/.agents/scripts/lib/orchestration/ticket-validator.js +63 -344
  412. package/.agents/scripts/lib/orchestration/ticketing/bulk.js +51 -244
  413. package/.agents/scripts/lib/orchestration/ticketing/reads.js +39 -261
  414. package/.agents/scripts/lib/orchestration/ticketing/state.js +14 -68
  415. package/.agents/scripts/lib/orchestration/ticketing/transition.js +46 -263
  416. package/.agents/scripts/lib/orchestration/ticketing.js +2 -26
  417. package/.agents/scripts/lib/orchestration/verify-credit.js +18 -79
  418. package/.agents/scripts/lib/orchestration/worktree-dirty.js +5 -30
  419. package/.agents/scripts/lib/path-security.js +3 -6
  420. package/.agents/scripts/lib/plan-phase-cleanup.js +9 -49
  421. package/.agents/scripts/lib/preflight-runner.js +13 -69
  422. package/.agents/scripts/lib/process-group.js +143 -0
  423. package/.agents/scripts/lib/project-root.js +2 -8
  424. package/.agents/scripts/lib/provider-factory.js +2 -25
  425. package/.agents/scripts/lib/qa/console-allowlist.js +10 -59
  426. package/.agents/scripts/lib/qa/qa-session.js +15 -69
  427. package/.agents/scripts/lib/qa/redact-evidence.js +18 -129
  428. package/.agents/scripts/lib/qa/resolve-qa-contract.js +26 -135
  429. package/.agents/scripts/lib/qa/resolve-selection.js +16 -84
  430. package/.agents/scripts/lib/reserved-test-ids.js +9 -47
  431. package/.agents/scripts/lib/runtime-deps/dep-resolution.js +13 -53
  432. package/.agents/scripts/lib/runtime-deps/ensure-installed.js +10 -44
  433. package/.agents/scripts/lib/runtime-deps/manifest.js +10 -30
  434. package/.agents/scripts/lib/runtime-deps/parser-major.js +15 -51
  435. package/.agents/scripts/lib/runtime-deps/preflight.js +4 -22
  436. package/.agents/scripts/lib/runtime-deps/scan-imports.js +11 -55
  437. package/.agents/scripts/lib/signals/detectors/common.js +12 -38
  438. package/.agents/scripts/lib/signals/index.js +2 -19
  439. package/.agents/scripts/lib/signals/schema.js +14 -109
  440. package/.agents/scripts/lib/signals/write.js +2 -11
  441. package/.agents/scripts/lib/single-story/confirm-merge.js +31 -72
  442. package/.agents/scripts/lib/single-story/story-merged-notify.js +8 -49
  443. package/.agents/scripts/lib/single-story-sweep/protection-ctx.js +4 -26
  444. package/.agents/scripts/lib/single-story-sweep/protection.js +13 -100
  445. package/.agents/scripts/lib/single-story-sweep/sweep-lock.js +60 -258
  446. package/.agents/scripts/lib/single-story-sweep.js +14 -97
  447. package/.agents/scripts/lib/skills/parse-skill.js +13 -59
  448. package/.agents/scripts/lib/skills/skills-index.js +8 -29
  449. package/.agents/scripts/lib/skills/walk-skill-files.js +17 -78
  450. package/.agents/scripts/lib/source-extensions.js +11 -42
  451. package/.agents/scripts/lib/source-text/strip-js-comments.js +8 -41
  452. package/.agents/scripts/lib/stdio-flush.js +9 -36
  453. package/.agents/scripts/lib/story-adjacency.js +8 -40
  454. package/.agents/scripts/lib/story-body/body-format-lints.js +51 -66
  455. package/.agents/scripts/lib/story-body/footer-block.js +11 -44
  456. package/.agents/scripts/lib/story-body/story-body.js +123 -344
  457. package/.agents/scripts/lib/temp-retention.js +42 -143
  458. package/.agents/scripts/lib/templates/decomposer-prompts.js +18 -80
  459. package/.agents/scripts/lib/test-env.js +12 -65
  460. package/.agents/scripts/lib/test-run-credit.js +10 -65
  461. package/.agents/scripts/lib/test-runner-contract.js +19 -74
  462. package/.agents/scripts/lib/test-temp.js +38 -184
  463. package/.agents/scripts/lib/test-tiers.js +12 -96
  464. package/.agents/scripts/lib/ticket-body-sections.js +21 -96
  465. package/.agents/scripts/lib/transpile.js +15 -74
  466. package/.agents/scripts/lib/util/concurrent-map.js +6 -25
  467. package/.agents/scripts/lib/util/parse-id-list.js +8 -34
  468. package/.agents/scripts/lib/util/poll-loop.js +8 -28
  469. package/.agents/scripts/lib/util/with-timeout.js +2 -11
  470. package/.agents/scripts/lib/validation-evidence.js +21 -96
  471. package/.agents/scripts/lib/wave-runner/footprint.js +17 -70
  472. package/.agents/scripts/lib/wave-runner/live-probe.js +67 -209
  473. package/.agents/scripts/lib/wave-runner/ready-set.js +72 -301
  474. package/.agents/scripts/lib/workers/crap-worker.js +11 -64
  475. package/.agents/scripts/lib/workers/maintainability-report-worker.js +8 -45
  476. package/.agents/scripts/lib/workers/maintainability-worker.js +5 -21
  477. package/.agents/scripts/lib/workers/serve-worker-messages.js +2 -18
  478. package/.agents/scripts/lib/workflow-closure.js +22 -105
  479. package/.agents/scripts/lib/workspace-provisioner.js +16 -54
  480. package/.agents/scripts/lib/worktree/git-hooks.js +15 -60
  481. package/.agents/scripts/lib/worktree/lifecycle/force-drain.js +20 -60
  482. package/.agents/scripts/lib/worktree/lifecycle/merge-reachability.js +10 -62
  483. package/.agents/scripts/lib/worktree/lifecycle/pending-cleanup.js +22 -86
  484. package/.agents/scripts/lib/worktree/lifecycle/reap.js +24 -126
  485. package/.agents/scripts/lib/worktree/lifecycle-manager.js +2 -20
  486. package/.agents/scripts/lib/worktree/node-modules-strategy.js +46 -180
  487. package/.agents/scripts/lib/worktree-manager.js +15 -40
  488. package/.agents/scripts/lint-issue-body.js +12 -68
  489. package/.agents/scripts/mandrel-update-preflight.js +10 -70
  490. package/.agents/scripts/merge-baseline.js +30 -105
  491. package/.agents/scripts/nav-registry-diff.js +22 -108
  492. package/.agents/scripts/notify.js +12 -69
  493. package/.agents/scripts/plan-context.js +97 -92
  494. package/.agents/scripts/plan-critics.js +12 -66
  495. package/.agents/scripts/plan-persist.js +71 -137
  496. package/.agents/scripts/plan-run-epilogue.js +20 -43
  497. package/.agents/scripts/pr-watch-with-update.js +79 -263
  498. package/.agents/scripts/providers/github/auth.js +3 -8
  499. package/.agents/scripts/providers/github/blocked-by-add.js +14 -61
  500. package/.agents/scripts/providers/github/board-add.js +5 -21
  501. package/.agents/scripts/providers/github/branch-protection.js +11 -43
  502. package/.agents/scripts/providers/github/cache.js +2 -14
  503. package/.agents/scripts/providers/github/comments.js +7 -40
  504. package/.agents/scripts/providers/github/compose.js +3 -19
  505. package/.agents/scripts/providers/github/errors.js +22 -125
  506. package/.agents/scripts/providers/github/issues.js +31 -123
  507. package/.agents/scripts/providers/github/labels.js +24 -124
  508. package/.agents/scripts/providers/github/mappers.js +5 -27
  509. package/.agents/scripts/providers/github/merge-methods.js +3 -22
  510. package/.agents/scripts/providers/github/project-board.js +2 -17
  511. package/.agents/scripts/providers/github/projects-v2-graphql.js +3 -6
  512. package/.agents/scripts/providers/github/request-helpers.js +5 -32
  513. package/.agents/scripts/providers/github/search-budget.js +9 -39
  514. package/.agents/scripts/providers/github/search-query.js +5 -26
  515. package/.agents/scripts/providers/github/sub-issue-add.js +15 -65
  516. package/.agents/scripts/providers/github/sub-issues.js +7 -36
  517. package/.agents/scripts/providers/github/tickets.js +32 -134
  518. package/.agents/scripts/providers/github.js +18 -59
  519. package/.agents/scripts/prune-plan-run-labels.js +12 -46
  520. package/.agents/scripts/quality-preview.js +35 -220
  521. package/.agents/scripts/resolve-doc-tiers.js +3 -26
  522. package/.agents/scripts/resolve-stories.js +16 -67
  523. package/.agents/scripts/resync-status-column.js +6 -25
  524. package/.agents/scripts/run-tests.js +29 -104
  525. package/.agents/scripts/single-story-close.js +23 -135
  526. package/.agents/scripts/single-story-confirm-merge.js +32 -139
  527. package/.agents/scripts/single-story-init.js +47 -259
  528. package/.agents/scripts/stories-wave-tick.js +179 -415
  529. package/.agents/scripts/sync-agentrc.js +3 -21
  530. package/.agents/scripts/sync-claude-agents.js +9 -55
  531. package/.agents/scripts/sync-claude-commands.js +20 -110
  532. package/.agents/scripts/test-wrapper.js +6 -43
  533. package/.agents/scripts/update-coverage-baseline.js +5 -22
  534. package/.agents/scripts/update-crap-baseline.js +7 -30
  535. package/.agents/scripts/update-duplication-baseline.js +16 -92
  536. package/.agents/scripts/update-maintainability-baseline.js +8 -62
  537. package/.agents/scripts/update-ticket-state.js +1 -7
  538. package/.agents/scripts/validate-skills.js +6 -26
  539. package/.agents/skills/core/gates-and-baselines/reference.md +0 -1
  540. package/.agents/skills/skills.index.json +2 -2
  541. package/.agents/skills/stack/qa/playwright/SKILL.md +26 -0
  542. package/.agents/templates/agent-protocol.md +2 -2
  543. package/.agents/templates/docs/audit-sweep-runbook.md +3 -4
  544. package/.agents/workflows/audit-accessibility.md +4 -7
  545. package/.agents/workflows/audit-adrs.md +3 -6
  546. package/.agents/workflows/audit-architecture.md +3 -11
  547. package/.agents/workflows/audit-baselines.md +6 -9
  548. package/.agents/workflows/audit-clean-code.md +8 -12
  549. package/.agents/workflows/audit-data-model.md +3 -7
  550. package/.agents/workflows/audit-dependencies.md +4 -7
  551. package/.agents/workflows/audit-devops.md +4 -8
  552. package/.agents/workflows/audit-documentation.md +1 -4
  553. package/.agents/workflows/audit-mobile.md +4 -7
  554. package/.agents/workflows/audit-navigability.md +3 -6
  555. package/.agents/workflows/audit-performance.md +2 -4
  556. package/.agents/workflows/audit-privacy.md +4 -7
  557. package/.agents/workflows/audit-quality.md +4 -7
  558. package/.agents/workflows/audit-security.md +4 -7
  559. package/.agents/workflows/audit-seo.md +4 -7
  560. package/.agents/workflows/audit-sre.md +4 -7
  561. package/.agents/workflows/audit-to-stories.md +17 -30
  562. package/.agents/workflows/audit-ux-ui.md +4 -7
  563. package/.agents/workflows/helpers/acceptance-self-eval.md +84 -157
  564. package/.agents/workflows/helpers/audit-lens-core.md +1 -1
  565. package/.agents/workflows/helpers/code-quality-guardrails.md +12 -15
  566. package/.agents/workflows/helpers/code-review.md +4 -2
  567. package/.agents/workflows/helpers/deliver-digest.md +37 -28
  568. package/.agents/workflows/helpers/deliver-light.md +92 -101
  569. package/.agents/workflows/helpers/deliver-reference.md +162 -220
  570. package/.agents/workflows/helpers/deliver-story-reference.md +197 -607
  571. package/.agents/workflows/helpers/deliver-story.md +17 -18
  572. package/.agents/workflows/helpers/plan-reference.md +125 -167
  573. package/.agents/workflows/helpers/qa-core.md +12 -0
  574. package/.agents/workflows/mandrel-deliver.md +47 -31
  575. package/.agents/workflows/mandrel-plan.md +22 -21
  576. package/.agents/workflows/mandrel-update.md +36 -21
  577. package/.agents/workflows/memory-consolidate.md +1 -1
  578. package/.agents/workflows/qa-assist.md +27 -71
  579. package/.agents/workflows/qa-explore.md +19 -59
  580. package/.agents/workflows/qa-run.md +11 -33
  581. package/README.md +1 -1
  582. package/bin/mandrel.js +5 -46
  583. package/bin/postinstall.js +18 -107
  584. package/docs/CHANGELOG.md +60 -0
  585. package/lib/cli/doctor.js +11 -71
  586. package/lib/cli/init.js +26 -165
  587. package/lib/cli/migrate.js +5 -64
  588. package/lib/cli/registry.js +84 -467
  589. package/lib/cli/sync-agents.js +4 -64
  590. package/lib/cli/sync-commands.js +11 -64
  591. package/lib/cli/sync.js +34 -213
  592. package/lib/cli/uninstall.js +40 -219
  593. package/lib/cli/update.js +326 -523
  594. package/lib/cli/version-check.js +8 -72
  595. package/lib/cli/version-helpers.js +14 -87
  596. package/lib/migrations/helpers/retire-agentrc-key.js +11 -52
  597. package/lib/migrations/index.js +17 -92
  598. package/lib/migrations/steps/2.1.0-retire-mi-drop-knobs.js +2 -15
  599. package/lib/migrations/steps/2.1.0-retire-verify-concurrency-cap.js +1 -13
  600. package/lib/migrations/steps/2.11.0-retire-max-seed-words.js +2 -15
  601. package/lib/migrations/steps/2.2.0-retire-epic-ac-tags.js +9 -38
  602. package/lib/migrations/steps/2.20.0-retire-codebase-snapshot.js +1 -13
  603. package/lib/migrations/steps/2.32.0-retire-lint-baseline-command.js +2 -27
  604. package/lib/migrations/steps/2.57.0-retire-delivery-limit-knobs.js +2 -23
  605. package/lib/migrations/steps/2.57.0-retire-planning-limit-knobs.js +2 -27
  606. package/lib/migrations/steps/2.60.0-retire-audit-results-autofile.js +21 -0
  607. package/lib/migrations/steps/strip-removed-agentrc-keys.js +333 -0
  608. package/package.json +17 -14
  609. package/.agents/docs/SDLC.md +0 -590
  610. package/.agents/docs/quality-gates.md +0 -1179
  611. package/.agents/rules/known-tooling-behavior.md +0 -150
  612. package/.agents/rules/orchestration-error-handling.md +0 -61
  613. package/.agents/rules/test-seams.md +0 -59
  614. package/.agents/schemas/baselines/lighthouse.schema.json +0 -59
  615. package/.agents/schemas/baselines/lint.schema.json +0 -47
  616. package/.agents/schemas/model-attribution.schema.json +0 -53
  617. package/.agents/scripts/check-action-pinning.js +0 -260
  618. package/.agents/scripts/check-audit-attribution.js +0 -302
  619. package/.agents/scripts/check-baseline-drift.js +0 -211
  620. package/.agents/scripts/check-baseline-scope.js +0 -362
  621. package/.agents/scripts/check-generated-validator.js +0 -202
  622. package/.agents/scripts/check-knip-entries.js +0 -159
  623. package/.agents/scripts/check-lifecycle-lint.js +0 -294
  624. package/.agents/scripts/check-pinned-override-notes.js +0 -102
  625. package/.agents/scripts/check-schema-references.js +0 -366
  626. package/.agents/scripts/check-test-portability.js +0 -512
  627. package/.agents/scripts/check-workflow-citations.js +0 -332
  628. package/.agents/scripts/check-workflow-cli-lint.js +0 -299
  629. package/.agents/scripts/check-workflow-timeouts.js +0 -291
  630. package/.agents/scripts/install-matrix-assert.js +0 -326
  631. package/.agents/scripts/lib/audit-advisories.js +0 -195
  632. package/.agents/scripts/lib/audit-attribution.js +0 -134
  633. package/.agents/scripts/lib/baselines/drift-detector.js +0 -351
  634. package/.agents/scripts/lib/baselines/kinds/lighthouse.js +0 -87
  635. package/.agents/scripts/lib/baselines/kinds/lint.js +0 -184
  636. package/.agents/scripts/lib/baselines/orphan-pruner.js +0 -233
  637. package/.agents/scripts/lib/baselines/scope-assert.js +0 -223
  638. package/.agents/scripts/lib/baselines/scope-inventory.js +0 -314
  639. package/.agents/scripts/lib/c8-cli-path.js +0 -21
  640. package/.agents/scripts/lib/config/gates/lighthouse.schema.js +0 -51
  641. package/.agents/scripts/lib/config/gates/lint.schema.js +0 -18
  642. package/.agents/scripts/lib/dynamic-workflow/architecture-report-contract.js +0 -70
  643. package/.agents/scripts/lib/dynamic-workflow/audit-orchestrator.js +0 -284
  644. package/.agents/scripts/lib/dynamic-workflow/clean-code-report-contract.js +0 -80
  645. package/.agents/scripts/lib/dynamic-workflow/degraded-coverage.js +0 -81
  646. package/.agents/scripts/lib/dynamic-workflow/documentation-report-contract.js +0 -87
  647. package/.agents/scripts/lib/dynamic-workflow/performance-report-contract.js +0 -74
  648. package/.agents/scripts/lib/dynamic-workflow/quality-report-contract.js +0 -90
  649. package/.agents/scripts/lib/dynamic-workflow/report-contract-core.js +0 -43
  650. package/.agents/scripts/lib/dynamic-workflow/security-report-contract.js +0 -83
  651. package/.agents/scripts/lib/fs-walk.js +0 -52
  652. package/.agents/scripts/lib/knip-config-resolver.js +0 -181
  653. package/.agents/scripts/lib/knip-entry-sync.js +0 -452
  654. package/.agents/scripts/lib/orchestration/model-attribution.js +0 -418
  655. package/.agents/scripts/lib/orchestration/story-plan-state.js +0 -33
  656. package/.agents/scripts/lib/orchestration/structured-comment-parser.js +0 -67
  657. package/.agents/scripts/lib/pinned-override-notes.js +0 -88
  658. package/.agents/scripts/lib/pinned-override-resolve.js +0 -212
  659. package/.agents/scripts/lib/test-isolate/cli-options.js +0 -93
  660. package/.agents/scripts/lib/test-isolate/env-snapshot-loader.js +0 -52
  661. package/.agents/scripts/lib/test-isolate/list-files.js +0 -90
  662. package/.agents/scripts/lib/test-isolate/parse-tap.js +0 -75
  663. package/.agents/scripts/lib/test-isolate/progress-log.js +0 -45
  664. package/.agents/scripts/lib/test-isolate/render-report.js +0 -97
  665. package/.agents/scripts/lib/test-isolate/run-isolate.js +0 -87
  666. package/.agents/scripts/lib/test-isolate/runner.js +0 -483
  667. package/.agents/scripts/lib/test-profile/parse-tap.js +0 -136
  668. package/.agents/scripts/lib/test-profile/render-report.js +0 -45
  669. package/.agents/scripts/lint-label-vocabulary.js +0 -214
  670. package/.agents/scripts/post-structured-comment.js +0 -127
  671. package/.agents/scripts/provision-git-hooks.js +0 -85
  672. package/.agents/scripts/prune-baseline-orphans.js +0 -181
  673. package/.agents/scripts/run-coverage.js +0 -197
  674. package/.agents/scripts/run-lint.js +0 -133
  675. package/.agents/scripts/run-test-profile.js +0 -129
  676. package/.agents/scripts/run-verify.js +0 -118
  677. package/.agents/scripts/test-isolate.js +0 -55
  678. package/.agents/scripts/update-dead-exports-baseline.js +0 -321
@@ -1,15 +1,7 @@
1
1
  /**
2
- * review-providers/findings-renderer.js — single renderer for the
3
- * structured `code-review` comment body.
4
- *
5
- * Story #2825 (Epic #2815) — adapters return `Finding[]`; the renderer
6
- * is the sole source of truth for the markdown body posted to the
7
- * Story/Epic ticket. Adapters MUST NOT post comments themselves.
8
- *
9
- * Output is deterministic for a given `Finding[]` input: the input
10
- * order is preserved within each severity tier, and the tier sections
11
- * always appear in the canonical order critical → high → medium →
12
- * suggestion. This is what makes the snapshot test stable.
2
+ * review-providers/findings-renderer.js — the sole renderer of the
3
+ * `code-review` comment body (adapters never post). Deterministic: input
4
+ * order is kept within each tier, tiers in canonical order.
13
5
  *
14
6
  * @typedef {import('./types.js').Finding} Finding
15
7
  * @typedef {import('./types.js').Severity} Severity
@@ -23,10 +15,6 @@ import {
23
15
  } from './degraded-gates.js';
24
16
 
25
17
  /**
26
- * Canonical severity ordering. The render output always lists the
27
- * severity-tier counts in this order and emits the per-finding sections
28
- * in this order, so a stable input produces a byte-stable output.
29
- *
30
18
  * @type {ReadonlyArray<Severity>}
31
19
  */
32
20
  const SEVERITY_ORDER = Object.freeze([
@@ -37,10 +25,6 @@ const SEVERITY_ORDER = Object.freeze([
37
25
  ]);
38
26
 
39
27
  /**
40
- * Emoji + human label mapping. Mirrors the legacy
41
- * legacy epic-code-review vocabulary so downstream operators see the
42
- * same tier names regardless of which adapter produced the findings.
43
- *
44
28
  * @type {Readonly<Record<Severity, { emoji: string, label: string }>>}
45
29
  */
46
30
  const SEVERITY_META = Object.freeze({
@@ -51,9 +35,7 @@ const SEVERITY_META = Object.freeze({
51
35
  });
52
36
 
53
37
  /**
54
- * Pure: tally findings by severity. Unknown severities are ignored to
55
- * keep the renderer forgiving of adapter bugs (a misbehaving adapter
56
- * still produces a readable, if incomplete, report).
38
+ * Unknown severities are ignored, so a buggy adapter still renders.
57
39
  *
58
40
  * @param {ReadonlyArray<Finding>} findings
59
41
  * @returns {Record<Severity, number>}
@@ -70,13 +52,7 @@ export function countBySeverity(findings) {
70
52
  }
71
53
 
72
54
  /**
73
- * Pure: render a single Finding as a markdown subsection. Exported for
74
- * testability.
75
- *
76
- * The `file`/`line` attribution lives on the same line as the title so
77
- * GitHub renders a compact, scannable header. The `body` follows
78
- * verbatim — adapters own its markdown shape (it may contain code
79
- * fences, lists, etc.).
55
+ * The body is emitted verbatim; adapters own its markdown.
80
56
  *
81
57
  * @param {Finding} finding
82
58
  * @returns {string}
@@ -91,14 +67,6 @@ export function renderFinding(finding) {
91
67
  }
92
68
 
93
69
  /**
94
- * Pure: render the optional "Manual review suggestions" section.
95
- * Story #2871 — manual-prompt providers (e.g. ultrareview) contribute
96
- * one message each; the section is omitted entirely when the input
97
- * array is empty so the legacy snapshot stays byte-stable for chains
98
- * that carry no prompts.
99
- *
100
- * Exported for testing.
101
- *
102
70
  * @param {ReadonlyArray<string>} messages
103
71
  * @returns {string[]} lines to append (empty when no messages)
104
72
  */
@@ -116,17 +84,8 @@ function renderManualPromptsSection(messages) {
116
84
  }
117
85
 
118
86
  /**
119
- * Pure: render the full markdown body for a code-review comment.
120
- *
121
- * Story #2871 — accepts an optional `promptMessages` field carrying
122
- * manual-prompt provider output; rendered as a trailing section when
123
- * non-empty.
124
- *
125
- * Story #4839 — an optional `degradations` field names review gates that could
126
- * not execute. They are **not** findings and never enter `countBySeverity`; they
127
- * render as their own section and suppress the unqualified "no findings" claim,
128
- * because a review that could not run a gate has not established that the
129
- * gate's surface is clean.
87
+ * `degradations` are never findings: they render as their own section and
88
+ * suppress the unqualified "no findings" claim.
130
89
  *
131
90
  * @param {{
132
91
  * ticketId: number,
@@ -195,9 +154,6 @@ export function renderFindings(input) {
195
154
  }
196
155
 
197
156
  /**
198
- * Pure: build the `(file:line)` attribution suffix for a finding header.
199
- * Returns an empty string when no file is attributable.
200
- *
201
157
  * @param {Finding} finding
202
158
  * @returns {string}
203
159
  */
@@ -1,24 +1,7 @@
1
1
  /**
2
- * review-providers/mi-exemptions.js — the maintainability gate's exemption list,
3
- * as the native review provider reads it.
4
- *
5
- * `delivery.quality.gates.maintainability.ignoreGlobs` is the one declared
6
- * answer to "which files is the maintainability index meaningless for" —
7
- * declarative schema blobs, generated code, vendored trees. Every other MI
8
- * consumer already honours it: the baseline writer excludes those files
9
- * (`update-maintainability-baseline.js`), so the `check-baselines.js` ratchet
10
- * and the pre-merge MI advisory never see them either.
11
- *
12
- * `review-providers/native.js` did not, and the split produced a live
13
- * contradiction on Story #5007 / PR #5022: the ratchet PASSED while the review
14
- * lens raised a **critical blocker** on three exempted
15
- * `config-settings-schema*.js` modules in the same close run. Because a critical
16
- * finding halts `single-story-close.js` before auto-merge, the only way to land
17
- * legitimate work was to merge the PR by hand. A gate that must be
18
- * hand-bypassed to ship is not a gate.
19
- *
20
- * This module is that reconciliation, kept separate from the provider so the
21
- * exemption concern has one home and the provider keeps one reason to change.
2
+ * review-providers/mi-exemptions.js — the MI gate's `ignoreGlobs`, as the
3
+ * native review provider reads them, so the review never raises a critical
4
+ * finding on a file the ratchet itself exempts.
22
5
  */
23
6
 
24
7
  import { getQuality } from '../../config/quality.js';
@@ -26,13 +9,8 @@ import { resolveConfig } from '../../config-resolver.js';
26
9
  import { isIgnoredByGlobs } from '../../maintainability-utils.js';
27
10
 
28
11
  /**
29
- * Read `delivery.quality.gates.maintainability.ignoreGlobs` so a review's
30
- * maintainability dimension scores the same file set the ratchet does.
31
- *
32
- * Best-effort and total. A config that cannot be resolved yields `[]`, which
33
- * scores every changed JS file. That direction is deliberate: degrading to
34
- * "score everything" can only produce an advisory the operator must read,
35
- * whereas degrading to "score nothing" would silently retire the dimension.
12
+ * An unresolvable config yields `[]` (score everything) — deliberately, since
13
+ * scoring nothing would silently retire the dimension.
36
14
  *
37
15
  * @param {{ resolveConfigFn?: typeof resolveConfig, getQualityFn?: typeof getQuality }} [deps]
38
16
  * @returns {string[]} minimatch patterns; `[]` when unset or unresolvable.
@@ -50,17 +28,8 @@ export function resolveMaintainabilityIgnoreGlobs({
50
28
  }
51
29
 
52
30
  /**
53
- * Pure: split a changed-file list into the set to score and the set the
54
- * maintainability gate exempts.
55
- *
56
- * Matching funnels through `maintainability-utils.js#isIgnoredByGlobs` — the
57
- * declared single source of truth for how the MI scorer decides a file is
58
- * ignored — so an exempted file is excluded here by exactly the same rule that
59
- * kept it out of the baseline. Re-implementing the match with a local
60
- * `minimatch` call is what let the two surfaces disagree in the first place.
61
- *
62
- * Module-local: {@link scopeMaintainabilityFiles} is the single door, and its
63
- * `scored` / `ignored` split is where this behaviour is observable.
31
+ * Matches through `isIgnoredByGlobs`, the same rule the baseline uses; a
32
+ * local `minimatch` would let the two surfaces disagree.
64
33
  *
65
34
  * @param {string[]} files
66
35
  * @param {string[]} ignoreGlobs
@@ -81,14 +50,7 @@ function partitionByIgnoreGlobs(files, ignoreGlobs, cwd) {
81
50
  }
82
51
 
83
52
  /**
84
- * Render the operator-facing notice naming the files the gate exempted, or
85
- * `null` when nothing was exempted so the caller can `if` past the log call.
86
- *
87
- * The notice exists because silence is ambiguous: an operator reading a review
88
- * that says nothing about three changed schema modules cannot tell "scored and
89
- * healthy" from "never scored".
90
- *
91
- * Module-local: reached through {@link scopeMaintainabilityFiles}'s `notice`.
53
+ * Name the exempted files, since silence cannot tell "healthy" from "never scored".
92
54
  *
93
55
  * @param {string[]|undefined} ignoredFiles
94
56
  * @returns {string|null}
@@ -103,13 +65,6 @@ function formatExemptionNotice(ignoredFiles) {
103
65
  }
104
66
 
105
67
  /**
106
- * Resolve the exemption list and split a review's changed-file set into the
107
- * paths whose maintainability should be scored and the paths the gate exempts.
108
- *
109
- * This is the one door the native provider uses: it keeps the resolve → match →
110
- * report sequence here rather than spread across the provider, so the provider
111
- * carries no knowledge of how an exemption is decided.
112
- *
113
68
  * @param {string[]} changedFiles
114
69
  * @param {{
115
70
  * cwd: string,
@@ -1,49 +1,7 @@
1
1
  /**
2
- * review-providers/native.js — Native (in-process) ReviewProvider adapter.
3
- *
4
- * Story #2833 (Epic #2815) — extracts the findings-collection logic that
5
- * previously lived in the retired `.agents/scripts/epic-code-review` CLI into a
6
- * `ReviewProvider`-shaped adapter. The adapter:
7
- *
8
- * 1. Diffs `headRef` against `baseRef` to enumerate changed files.
9
- * 2. Runs scoped lint (biome + markdownlint) over the changed surface.
10
- * 3. Computes per-file maintainability reports for changed JS files, minus
11
- * the files the maintainability gate exempts (see below).
12
- * 4. Maps each signal to a `Finding` with a `severity` ∈ {critical, high,
13
- * medium, suggestion}.
14
- *
15
- * **The maintainability dimension honours the gate's exemption list**, read via
16
- * [`mi-exemptions.js`](mi-exemptions.js) — see that module for why this
17
- * provider disagreeing with the ratchet was a live delivery blocker. Exempted
18
- * files are named on the log rather than silently dropped.
19
- *
20
- * The lint dimension is deliberately NOT filtered through the same list:
21
- * lint carries its own exclusion surface (biome's `files.includes`,
22
- * `.markdownlintignore`), and a quality-gate ignore glob makes no claim about
23
- * whether a file should parse or format cleanly.
24
- *
25
- * The adapter does NOT post to GitHub and does NOT render a markdown body.
26
- * Those concerns belong to `runCodeReview()`, which calls the renderer + the
27
- * structured-comment upserter.
28
- *
29
- * Construction is intentionally zero-arg so the factory can instantiate
30
- * it without threading config through every call. Per-invocation config
31
- * (paths, runners, evidence store) is injected via the `runReview` arg or
32
- * the `createNativeProvider({ deps })` overload used by tests.
33
- *
34
- * **Depth is deliberately ignored here (Story #3937).** The pluggable review
35
- * contract threads a risk-derived `depth` lever (`light` / `standard` /
36
- * `deep`) on `ReviewInput` so LLM-backed providers can dial their thoroughness
37
- * up or down with the Epic's judged risk. This native adapter does not read
38
- * `input.depth` and does not branch on it: its work is a *mechanical* lint +
39
- * maintainability sweep whose cost already scales with the diff — every
40
- * changed file is linted once and every changed JS file is scored once,
41
- * regardless of risk tier. There is no "review harder" knob a deterministic
42
- * scorer can turn: a high-risk diff and a low-risk diff of the same size do
43
- * exactly the same amount of work. The contract is therefore explicit rather
44
- * than silently dropping the field — `depth` is a no-op for this provider by
45
- * design, and the LLM-backed providers (codex, security-review, ultrareview)
46
- * are where the lever actually changes behaviour.
2
+ * review-providers/native.js — in-process ReviewProvider: scoped lint plus
3
+ * maintainability scoring of the changed files. MI honours the gate's
4
+ * exemptions (lint has its own); `input.depth` is ignored by design.
47
5
  *
48
6
  * @typedef {import('./types.js').Finding} Finding
49
7
  * @typedef {import('./types.js').ReviewInput} ReviewInput
@@ -73,56 +31,25 @@ import {
73
31
  runScopedLint,
74
32
  } from './scoped-lint.js';
75
33
 
76
- /**
77
- * The scoped-lint surface lives in [`scoped-lint.js`](scoped-lint.js), which
78
- * owns runner resolution, per-surface classification, and the merge. Story
79
- * #4839 moved it there while fixing the three invocation defects that made this
80
- * gate fail open on ~78% of deliveries; the module docstring there carries the
81
- * diagnosis. The three names stay part of this provider's published lint seam.
82
- */
83
34
  export { parseLintOutput, partitionFilesForLint, runScopedLint };
84
35
 
85
- /** Worker entry that scores one file into a full maintainability report. */
86
36
  const MAINTAINABILITY_REPORT_WORKER_URL = new URL(
87
37
  '../../workers/maintainability-report-worker.js',
88
38
  import.meta.url,
89
39
  );
90
40
 
91
- /**
92
- * Below this JS-file count the worker pool's spawn overhead dominates, so
93
- * `analyzeChangedFiles` scores in-process (the pre-pool serial path). At or
94
- * above it, per-file `calculateReportForFile` scoring is offloaded to the
95
- * shared worker pool so the event loop is not blocked during epic-scoped
96
- * reviews (f-performance). Single-sourced in `cpu-pool.js` (see the
97
- * `POOL_SERIAL_THRESHOLD` docstring for the tuning rationale); the
98
- * `SERIAL_THRESHOLD` export name is preserved as this module's public API.
99
- */
41
+ /** Below this JS-file count scoring runs in-process; at or above, on the worker pool. */
100
42
  export const SERIAL_THRESHOLD = POOL_SERIAL_THRESHOLD;
101
43
 
102
44
  const JS_MAINTAINABILITY_EXTS = new Set(['.js', '.mjs', '.cjs']);
103
45
 
104
46
  /**
105
- * Read a changed file's content as it exists at `headRef` via
106
- * `git show <headRef>:<relPath>`, rather than reading the on-disk copy at
107
- * `PROJECT_ROOT`.
108
- *
109
- * This is the fix for Story #3696: the native review previously scored the
110
- * working-tree copy at `PROJECT_ROOT`, which — when the review runs from the
111
- * main checkout (the common case for story/epic close) — is the **base**
112
- * (pre-change) content, not the **head** (PR-branch) content the PR actually
113
- * produces. Scoring the base copy made MI-*improving* refactors emit a
114
- * false-positive "Size/Volume Warning" citing the very debt they removed.
115
- * Sourcing from `headRef` makes the score reflect the PR branch regardless of
116
- * which tree happens to be checked out on disk.
47
+ * Read the file at `headRef`, never from disk: close runs from the main
48
+ * checkout, where disk holds the BASE content. `null` when absent at head.
117
49
  *
118
- * Returns `null` when the file does not exist at `headRef` (deleted by the PR,
119
- * a brand-new untracked path not yet committed, or a `git show` failure). A
120
- * `null` source is dropped downstream exactly like a `reportFn` throw — the
121
- * provider does not warn about a file it cannot read at head.
122
- *
123
- * @param {string} relPath Repo-relative path of the changed file.
124
- * @param {string} headRef Git ref under review (e.g. 'story-3696', 'epic/42').
125
- * @param {typeof gitSpawn} [gitSpawnFn] Injected git runner (test seam).
50
+ * @param {string} relPath
51
+ * @param {string} headRef
52
+ * @param {typeof gitSpawn} [gitSpawnFn]
126
53
  * @returns {string|null}
127
54
  */
128
55
  export function readHeadSource(relPath, headRef, gitSpawnFn = gitSpawn) {
@@ -132,16 +59,11 @@ export function readHeadSource(relPath, headRef, gitSpawnFn = gitSpawn) {
132
59
  }
133
60
 
134
61
  /**
135
- * Pure: score a raw source string into a maintainability report, applying the
136
- * in-memory TS/TSX transpile shim first so a changed `.ts`/`.tsx` file scores
137
- * the same as the JS the engine would otherwise see. Returns a parse-error
138
- * report (never throws) when the source cannot be transpiled, matching the
139
- * disk-based `calculateReportForFile` contract.
140
- *
141
- * Exported for testing.
62
+ * Score a source string (TS transpiled first). Returns a parse-error report
63
+ * rather than throwing.
142
64
  *
143
- * @param {string} source File content at head.
144
- * @param {string} relPath Path (used only to pick the transpile mode).
65
+ * @param {string} source
66
+ * @param {string} relPath Used only to pick the transpile mode.
145
67
  * @returns {ReturnType<typeof calculateReport>}
146
68
  */
147
69
  export function scoreSourceReport(source, relPath) {
@@ -159,10 +81,8 @@ export function scoreSourceReport(source, relPath) {
159
81
  }
160
82
 
161
83
  /**
162
- * Pure: classify a single file's maintainability report into a row + optional
163
- * Finding-shaped entries. `reportFn` is the thunk that produces the file's
164
- * report (it closes over the file's head-ref source — see
165
- * {@link analyzeChangedFiles}); a throw is treated as "drop this file".
84
+ * Classify one file's report into a row plus optional findings. A `reportFn`
85
+ * throw drops the file.
166
86
  *
167
87
  * @returns {{ row: object|null, criticalFinding: Finding|null, mediumFinding: Finding|null }}
168
88
  */
@@ -219,9 +139,7 @@ export function classifyChangedFile(relPath, { reportFn, classifier } = {}) {
219
139
  }
220
140
 
221
141
  /**
222
- * Pure: fold one classified file into the running analysis tally. Shared by
223
- * the serial and pooled scoring paths so both produce byte-for-byte identical
224
- * `maintainability` rows and `critical`/`medium` findings.
142
+ * Shared by the serial and pooled paths so both emit identical output.
225
143
  *
226
144
  * @param {{ totalFiles: number, jsFiles: number, maintainability: object[], criticalFindings: Finding[], mediumFindings: Finding[] }} results
227
145
  * @param {{ row: object|null, criticalFinding: Finding|null, mediumFinding: Finding|null }} classified
@@ -239,39 +157,8 @@ function isJsMaintainabilityFile(relPath) {
239
157
  }
240
158
 
241
159
  /**
242
- * Walk every changed JS file and accumulate the analysis tally.
243
- *
244
- * For small JS-file sets (below {@link SERIAL_THRESHOLD}) scoring runs
245
- * in-process — the worker pool's spawn overhead dominates at small sizes and
246
- * the in-process path matches the pre-pool behaviour byte-for-byte. At or
247
- * above the threshold, each file's `calculateReportForFile` call is offloaded
248
- * to the shared worker pool (`maintainability-report-worker`) so the native
249
- * provider no longer blocks the event loop during epic-scoped reviews
250
- * (f-performance). Either way the pure classification core
251
- * ({@link classifyChangedFile} + {@link classifyReport}) runs in-process, so
252
- * the two paths emit identical rows and findings.
253
- *
254
- * **Head sourcing (Story #3696).** Each changed JS file is scored against the
255
- * content it has at `headRef` — sourced via `git show <headRef>:<relPath>` —
256
- * not the on-disk copy at `PROJECT_ROOT`. When the review runs from the main
257
- * checkout (the common story/epic close case) the on-disk copy is the *base*
258
- * (pre-change) content, so scoring it made MI-improving refactors emit a
259
- * false-positive size/volume warning citing the debt they remove. Sourcing
260
- * from head makes the score reflect the PR branch regardless of the checked-out
261
- * tree. A file with no content at head (deleted by the PR, or unreadable) is
262
- * dropped — the provider never warns about a file it cannot read at head.
263
- *
264
- * `classifier` is injected for testability. Tests may also inject `reportFn`
265
- * to bypass head sourcing entirely (it receives the head source string and the
266
- * relPath); production callers omit it and get the git-head scorer. Injecting
267
- * `reportFn` forces the serial path (the injected scorer cannot cross the
268
- * worker boundary).
269
- *
270
- * `serialThreshold` overrides the pool-vs-serial cutover for one call. It is
271
- * the seam the parity test uses to drive the pooled branch: Story #5109
272
- * retuned `POOL_SERIAL_THRESHOLD` from 8 to 256 against measured data, and a
273
- * fixture sized to clear the old number would otherwise have gone quietly
274
- * serial while still claiming to cover the pool.
160
+ * Pooled at or above `serialThreshold`. An injected `reportFn` forces the
161
+ * serial path (a closure cannot cross the worker boundary).
275
162
  *
276
163
  * @param {string[]} changedFiles
277
164
  * @param {{ reportFn?: Function, classifier?: Function, runOnPoolFn?: typeof runOnPool, headRef?: string|null, gitSpawnFn?: typeof gitSpawn, readHeadSourceFn?: typeof readHeadSource, serialThreshold?: number }} [deps]
@@ -301,20 +188,14 @@ export async function analyzeChangedFiles(
301
188
  results.jsFiles = jsFiles.length;
302
189
  if (jsFiles.length === 0) return results;
303
190
 
304
- // Resolve each file's head-ref source up front. `null` source (deleted at
305
- // head / unreadable) is dropped — it carries no head report to warn about.
306
191
  const sources = jsFiles.map((relPath) =>
307
192
  headRef == null ? '' : readHeadSourceFn(relPath, headRef, gitSpawnFn),
308
193
  );
309
194
 
310
- // Default scorer: score the head source string. A test-injected `reportFn`
311
- // overrides it (receives the head source + relPath) and forces the serial
312
- // path because the closure cannot be cloned into a worker thread.
313
195
  const scoreReport =
314
196
  reportFn ?? ((source, relPath) => scoreSourceReport(source, relPath));
315
197
  const customReportFn = reportFn != null;
316
198
 
317
- // Serial path: small batches, or whenever a caller injects its own scorer.
318
199
  if (jsFiles.length < serialThreshold || customReportFn) {
319
200
  for (let i = 0; i < jsFiles.length; i += 1) {
320
201
  const relPath = jsFiles[i];
@@ -331,12 +212,7 @@ export async function analyzeChangedFiles(
331
212
  return results;
332
213
  }
333
214
 
334
- // Pooled path: offload `scoreSourceReport` to the worker pool by sending the
335
- // pre-sourced head content (not a disk path) so the worker scores the same
336
- // head string the serial path does. Files with `null` head source are not
337
- // sent to the pool; their slot is reconstructed by mapping pool results back
338
- // onto the non-null subset in input order. The pure classification core runs
339
- // in-process so both paths emit identical rows and findings.
215
+ // Send head content (not a disk path) so the worker scores what the serial path does.
340
216
  const poolItems = [];
341
217
  const poolIndex = []; // poolItems[k] corresponds to jsFiles[poolIndex[k]]
342
218
  for (let i = 0; i < jsFiles.length; i += 1) {
@@ -353,8 +229,7 @@ export async function analyzeChangedFiles(
353
229
  for (let k = 0; k < poolIndex.length; k += 1) {
354
230
  const relPath = jsFiles[poolIndex[k]];
355
231
  const poolEntry = poolResults[k];
356
- // A host-level pool error or a null report (the worker's parse/I/O
357
- // sentinel) maps to the serial path's "reportFn threw" → dropped file.
232
+ // A pool error or null report drops the file, as a serial throw does.
358
233
  if (!poolEntry || poolEntry.__cpuPoolError || poolEntry.report == null) {
359
234
  continue;
360
235
  }
@@ -370,27 +245,8 @@ export async function analyzeChangedFiles(
370
245
  }
371
246
 
372
247
  /**
373
- * Pure: turn a lint summary into Finding(s). Lint errors collapse into a
374
- * single high-risk finding (the structured comment shows the count); lint
375
- * warnings collapse into a single suggestion.
376
- *
377
- * **Findings come from the parsed counts, never from the execution flag**
378
- * (Story #5282). `executionFailed` is the OR across the biome and markdownlint
379
- * surfaces, so gating findings on it let *one* absent runner discard the
380
- * *other* surface's real errors — and since the code surface's disk probe
381
- * (#5193) degrades in every checkout without `node_modules/.bin/biome`, that
382
- * was the default state of a consumer checkout: markdownlint errors reached
383
- * neither the findings nor the severity tally while the outcome read clean
384
- * apart from a degradation line.
385
- *
386
- * Story #4699's intent is preserved exactly, because it was never about the
387
- * flag: a degradation is still not a `Finding` — it has no counts to report,
388
- * so a surface that could not execute contributes `parsed: false` and zero
389
- * counts and produces nothing here, while travelling on the degradation and
390
- * friction-telemetry channels under its own name. A summary that explicitly
391
- * reports `parsed: false` therefore yields no findings whatever its counts
392
- * claim; a summary omitting `parsed` (an injected or pre-#4839 shape) is
393
- * scored on its counts as before.
248
+ * Findings come from parsed counts, never `executionFailed` (an OR across
249
+ * surfaces), so one absent runner cannot discard the other's errors.
394
250
  *
395
251
  * @param {{ errors: number, warnings: number, parsed?: boolean, skipped?: boolean, mode?: string, executionFailed?: boolean, evidenceSkipped?: boolean }} lintSummary
396
252
  * @returns {Finding[]}
@@ -452,13 +308,8 @@ async function runLintPhase({
452
308
  }
453
309
 
454
310
  /**
455
- * Pure: turn an `executionFailed` lint summary into the degradation records the
456
- * review outcome carries beside its findings (Story #4839).
457
- *
458
- * A summary from `runScopedLint` names each failed surface; an injected or
459
- * legacy summary that sets only `executionFailed` degrades to one record for
460
- * the gate as a whole, so the outcome is never silent about a gate that did not
461
- * run just because the summary predates the per-surface contract.
311
+ * Degradation records for an `executionFailed` summary; one without
312
+ * per-surface rows degrades to a single gate-wide record, never silence.
462
313
  *
463
314
  * @param {{ executionFailed?: boolean, degradations?: Array<{ surface: string, reason: string }> }} lintSummary
464
315
  * @returns {Array<{ tool: string, gate: string, surface: string, reason: string }>}
@@ -481,12 +332,6 @@ function buildLintDegradations(lintSummary) {
481
332
  }
482
333
 
483
334
  /**
484
- * Build a `ReviewProvider` instance backed by the native in-process pipeline.
485
- *
486
- * The `deps` overload is the test seam — production callers (the factory)
487
- * invoke `createNativeProvider()` with no arguments and get the default
488
- * dependency chain (real git, real lint, real maintainability engine).
489
- *
490
335
  * @param {{
491
336
  * gitSpawnFn?: typeof gitSpawn,
492
337
  * runScopedLintFn?: typeof runScopedLint,
@@ -506,20 +351,13 @@ export function createNativeProvider(deps = {}) {
506
351
  analyzeChangedFilesFn = analyzeChangedFiles,
507
352
  buildLintFindingsFn = buildLintFindings,
508
353
  emitToolDegradationFn = emitRuntimeFriction,
509
- // The maintainability-gate exemption seam. The resolution itself — gate-key
510
- // read and fail-open — is unit-tested in `mi-exemptions.js`; this dep is
511
- // here so a provider test can pin the WIRING without a config on disk.
512
354
  resolveIgnoreGlobsFn = resolveMaintainabilityIgnoreGlobs,
513
355
  logger,
514
356
  scopeLint = 'changed-only',
515
357
  } = deps;
516
358
 
517
359
  /**
518
- * Degradations recorded by the most recent `runReview`. Read through
519
- * `getDegradations()` after the run, mirroring how `getPromptMessages` is
520
- * feature-detected by the orchestrator — findings and degradations travel
521
- * side by side, so an unexecutable tool never has to become a `Finding` to
522
- * be visible (Story #4699's intent; Story #4839's fix).
360
+ * Degradations from the latest `runReview`, travelling beside findings.
523
361
  *
524
362
  * @type {Array<{ tool: string, gate: string, surface: string, reason: string }>}
525
363
  */
@@ -527,9 +365,6 @@ export function createNativeProvider(deps = {}) {
527
365
 
528
366
  return {
529
367
  /**
530
- * Gate degradations from the last `runReview`. Never a `Finding`, so
531
- * severity counts stay code-findings-only.
532
- *
533
368
  * @returns {Array<{ tool: string, gate: string, surface: string, reason: string }>}
534
369
  */
535
370
  getDegradations() {
@@ -600,19 +435,8 @@ export function createNativeProvider(deps = {}) {
600
435
  });
601
436
 
602
437
  if (lintSummary.executionFailed) {
603
- // Story #4699 — a tool that could not execute is an operational
604
- // degradation, not a code finding. Route it to friction telemetry
605
- // (best-effort) so severity counts reflect code findings only.
606
- //
607
- // Story #4839 — telemetry alone left the review's own verdict unable to
608
- // distinguish "lint ran and found nothing" from "lint never ran", so
609
- // the same degradation is also recorded on the outcome channel. It is
610
- // still never a `Finding`: the friction emission below is unchanged.
611
- //
612
- // Story #5282 — this branch is about the degraded surface only. A
613
- // sibling surface that *did* run still contributes its parsed counts
614
- // to `buildLintFindings` below, so a degradation here no longer
615
- // suppresses the other surface's errors.
438
+ // A tool that could not execute is a degradation, recorded on the
439
+ // outcome and in friction telemetry — never a finding.
616
440
  recordedDegradations = buildLintDegradations(lintSummary);
617
441
  logger?.warn?.(
618
442
  `[native-review] Lint runner could not execute (${recordedDegradations
@@ -633,19 +457,13 @@ export function createNativeProvider(deps = {}) {
633
457
  },
634
458
  });
635
459
  } catch {
636
- // Observability must never fail the review (best-effort contract).
460
+ // Observability must never fail the review.
637
461
  }
638
462
  }
639
463
 
640
464
  const lintFindings = buildLintFindingsFn(lintSummary);
641
465
 
642
- // Canonical ordering: critical (maintainability) first, then high
643
- // (lint errors), then medium (size/volume warnings), then suggestion
644
- // (lint warnings). An execution failure contributes no counts of its
645
- // own to these tiers — it travels on the degradation channel — but it
646
- // no longer suppresses a sibling surface's. The renderer
647
- // re-bucketizes by severity tier, so this order only matters for
648
- // stability of fixture outputs.
466
+ // Severity order; only matters for fixture stability.
649
467
  return [
650
468
  ...results.criticalFindings,
651
469
  ...lintFindings.filter((f) => f.severity === 'high'),
@@ -657,9 +475,7 @@ export function createNativeProvider(deps = {}) {
657
475
  }
658
476
 
659
477
  /**
660
- * Zero-arg factory entry point used by the `review-provider-factory`. Kept
661
- * separate from `createNativeProvider({ deps })` so the registry signature
662
- * stays `() => ReviewProvider`.
478
+ * Zero-arg registry entry point.
663
479
  *
664
480
  * @returns {ReviewProvider}
665
481
  */