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,52 +1,24 @@
1
1
  /**
2
- * Logger conventions (see `docs/patterns.md` → "Error Handling Convention"):
3
- *
4
- * - `debug`: verbose trace; only emitted when the logger level is `verbose`.
5
- * - `info`: normal progress.
6
- * - `warn`: recoverable issue the operator should notice.
7
- * - `error`: non-fatal failure; caller continues. Use when `throw` would
8
- * be too loud (e.g. best-effort cleanup paths).
9
- * - `fatal`: unrecoverable; exits the process. Use only at CLI
10
- * boundaries, never inside library code.
11
- *
12
- * Level is resolved **lazily on every emit** from `AGENT_LOG_LEVEL` (or a
13
- * `setLevel` override). Resolving per emit — rather than once at module
14
- * load — lets tests exercise every level branch in-process via `setLevel`
15
- * or a live `AGENT_LOG_LEVEL` flip, without spawning a child process per
16
- * level (Story #3329):
17
- *
18
- * - `silent` → only `fatal` emits.
19
- * - `info` → default. Emits `info` and above; suppresses `debug`.
20
- * - `verbose` → emits everything (including `debug`).
2
+ * `error` is non-fatal (the caller continues); `fatal` exits and belongs only
3
+ * at CLI boundaries. The level (`silent` = fatal only, `info` default,
4
+ * `verbose` adds debug) is resolved from `AGENT_LOG_LEVEL` on every emit, not
5
+ * at load, so tests can flip it in-process.
21
6
  */
22
7
  /**
23
- * Recognized log levels, lowest-noise first. Anything outside this set
24
- * resolves to `info`.
8
+ * Anything else resolves to `info`.
25
9
  *
26
10
  * @type {ReadonlySet<string>}
27
11
  */
28
12
  const VALID_LEVELS = Object.freeze(new Set(['silent', 'info', 'verbose']));
29
13
 
30
14
  /**
31
- * Process-wide level override. `null` means "no explicit override — read
32
- * `AGENT_LOG_LEVEL` from the environment on each resolve". `setLevel`
33
- * pins this so tests (and embedders) can exercise every level branch
34
- * in-process without spawning a child whose module-load reads a different
35
- * env var. `setLevel(null)` clears the pin and restores env-driven
36
- * resolution.
15
+ * `null` means read `AGENT_LOG_LEVEL` on each resolve.
37
16
  *
38
17
  * @type {string|null}
39
18
  */
40
19
  let levelOverride = null;
41
20
 
42
21
  /**
43
- * Resolve the active log level lazily. Honors an explicit `setLevel`
44
- * override first, otherwise reads `AGENT_LOG_LEVEL` from the environment
45
- * on every call. Resolving per emit (rather than once at module load)
46
- * means a test can flip `AGENT_LOG_LEVEL` — or call `setLevel` — and see
47
- * the level branches react in-process, without a child process per level
48
- * (Story #3329).
49
- *
50
22
  * @returns {'silent'|'info'|'verbose'}
51
23
  */
52
24
  export function resolveLevel() {
@@ -59,11 +31,8 @@ export function resolveLevel() {
59
31
  }
60
32
 
61
33
  /**
62
- * Pin the process-wide log level, bypassing `AGENT_LOG_LEVEL`. Pass a
63
- * recognized level (`silent` / `info` / `verbose`) to force it,
64
- * or `null` to clear the pin and restore env-driven resolution. An
65
- * unrecognized non-null value throws so callers cannot silently pin a
66
- * level that resolves to `info`.
34
+ * Pin the level (`null` clears it). An unrecognized value throws rather than
35
+ * silently pinning `info`.
67
36
  *
68
37
  * @param {('silent'|'info'|'verbose')|null} level
69
38
  * @returns {void}
@@ -89,24 +58,12 @@ function infoEnabled() {
89
58
  return resolveLevel() === 'info' || debugEnabled();
90
59
  }
91
60
 
92
- // Mutable sinks for `info` (defaults to stdout via console.log) and the
93
- // stdout branch of `createProgress` (defaults to console.log). `warn` already
94
- // uses console.warn which Node routes to stderr, but we expose a sink for it
95
- // too so a single `routeAllOutputToStderr()` call gives a uniform guarantee
96
- // to callers that "no Logger output lands on stdout" (Story #2278).
61
+ // Swappable so `routeAllOutputToStderr()` can guarantee nothing hits stdout.
97
62
  let infoSink = (msg) => console.log(msg);
98
63
  let warnSink = (msg) => console.warn(msg);
99
64
  let progressStdoutSink = (msg) => console.log(msg);
100
65
 
101
- /**
102
- * Flip every Logger output that can land on stdout (`info`, `warn`, and the
103
- * stdout branch of `createProgress`) to stderr for the lifetime of the
104
- * process. Idempotent. Use when stdout is reserved for a structured payload
105
- * — for example the JSON envelope emitted by
106
- * `plan-context.js`, where any interleaved
107
- * `[Orchestrator] ℹ️ …` log line corrupts the captured file
108
- * (Story #2278).
109
- */
66
+ /** For processes whose stdout is a structured payload. Idempotent. */
110
67
  export function routeAllOutputToStderr() {
111
68
  infoSink = (msg) => console.error(msg);
112
69
  warnSink = (msg) => console.error(msg);
@@ -114,11 +71,7 @@ export function routeAllOutputToStderr() {
114
71
  }
115
72
 
116
73
  export const Logger = {
117
- /**
118
- * The currently-resolved level. A getter (not a frozen snapshot) so it
119
- * reflects `setLevel` overrides and live `AGENT_LOG_LEVEL` changes —
120
- * reading `Logger.level` always returns what the next emit will use.
121
- */
74
+ /** A getter, so it always reports what the next emit will use. */
122
75
  get level() {
123
76
  return resolveLevel();
124
77
  },
@@ -155,16 +108,8 @@ export const Logger = {
155
108
  };
156
109
 
157
110
  /**
158
- * Frozen no-op logger shaped like the public `Logger` surface (minus `fatal`,
159
- * which must never be silenced — silencing process-exit is a footgun). Use
160
- * this as the default-argument value when a function accepts an optional
161
- * logger; consumers that don't pass one get a uniform shape without each
162
- * call site re-declaring its own inline literal.
163
- *
164
- * Deliberately omits `fatal` so that any code path tempted to call
165
- * `logger.fatal(...)` against the no-op fails loudly rather than silently
166
- * skipping a process-exit that would otherwise have surfaced an
167
- * unrecoverable error.
111
+ * Default for an optional logger. Omits `fatal` deliberately: a silenced
112
+ * process-exit would hide an unrecoverable error, so calling it throws.
168
113
  */
169
114
  export const NOOP_LOGGER = Object.freeze({
170
115
  silent: true,
@@ -174,14 +119,7 @@ export const NOOP_LOGGER = Object.freeze({
174
119
  error() {},
175
120
  });
176
121
 
177
- /**
178
- * Frozen logger that routes every level to **stderr**. Use this when a
179
- * caller's stdout is a structured payload (e.g. the authoring-context JSON
180
- * envelope from `plan-context.js`) and any
181
- * progress/telemetry log must not interleave with the payload. Mirrors the
182
- * `{ info, warn, error, debug }` shape that the orchestration helpers
183
- * accept via optional `logger` arguments.
184
- */
122
+ /** Every level to stderr, for callers whose stdout is a structured payload. */
185
123
  export const STDERR_LOGGER = Object.freeze({
186
124
  debug: (message) => console.error(message),
187
125
  info: (message) => console.error(message),
@@ -1,16 +1,7 @@
1
1
  /**
2
- * engine.js — assemble the `/audit-baselines` evidence envelope
3
- * (Story #4902).
4
- *
5
- * Strictly read-only and strictly offline: it reads committed baselines, the
6
- * resolved config, git history, the static import graph, and any friction
7
- * ledger it finds. It never writes under `baselines/`, never refreshes a
8
- * baseline, and never runs a test, coverage, or mutation suite — the whole
9
- * point is that a baseline review costs a file read, not a CI run.
10
- *
11
- * Findings are evidence, not a verdict: assembling the envelope is success,
12
- * however alarming its contents, so the CLI exits 0 whenever it got this far.
13
- * Judgment belongs to the lens that reads the envelope.
2
+ * Assembles the `/audit-baselines` evidence envelope. Read-only and offline:
3
+ * never writes baselines or runs a suite — a review costs a file read, not a
4
+ * CI run. Evidence, not a verdict: assembling it is success (exit 0).
14
5
  *
15
6
  * @module lib/audit-baselines/engine
16
7
  */
@@ -31,19 +22,16 @@ import {
31
22
  readFriction,
32
23
  } from './weights.js';
33
24
 
34
- /** Envelope `kind` discriminator; matches the shipped schema's const. */
25
+ /** Matches the shipped schema's const. */
35
26
  const ENVELOPE_KIND = 'audit-baselines-envelope';
36
27
 
37
- /** Envelope schema version — bumped on any breaking shape change. */
28
+ /** Bump on any breaking shape change. */
38
29
  const ENVELOPE_SCHEMA_VERSION = '1';
39
30
 
40
- /** Cap on emitted hotspot clusters, independent of the per-gate `topN`. */
41
31
  export const DEFAULT_HOTSPOT_LIMIT = 50;
42
32
 
43
33
  /**
44
- * Resolve the repository config without letting a broken `.agentrc.json`
45
- * abort the run — an unreadable config still leaves the baseline files
46
- * themselves readable at their default paths.
34
+ * A broken `.agentrc.json` must not abort: default baseline paths still read.
47
35
  *
48
36
  * @param {string} cwd
49
37
  * @returns {{ quality: object, configError: string | null }}
@@ -57,11 +45,8 @@ function resolveQualityBlock(cwd) {
57
45
  }
58
46
 
59
47
  /**
60
- * Absolute temp root the friction ledger is searched under, anchored to the
61
- * **analysed** repository rather than the process cwd. `resolvedTempRoot()`
62
- * anchors to whichever checkout the current process sits in, which is the
63
- * right answer for a writer and the wrong one here: an engine pointed at
64
- * another repo with `--cwd` must read that repo's ledger, not this one's.
48
+ * Anchored to the analysed repo (`--cwd`), not the process's checkout as
49
+ * `resolvedTempRoot()` would be.
65
50
  *
66
51
  * @param {string} cwd
67
52
  * @returns {string}
@@ -71,17 +56,13 @@ function tempRootFor(cwd) {
71
56
  try {
72
57
  relative = tempRootFrom(resolveConfig({ cwd }));
73
58
  } catch {
74
- // Unreadable config — the framework default root is still worth probing.
59
+ // Unreadable config: probe the default root.
75
60
  }
76
61
  if (path.isAbsolute(relative)) return relative;
77
62
  return path.join(mainCheckoutRoot(cwd) ?? cwd, relative);
78
63
  }
79
64
 
80
65
  /**
81
- * Run the engine and return the envelope object. Pure with respect to the
82
- * filesystem apart from the reads named in the module docstring — writing
83
- * the result is the caller's job.
84
- *
85
66
  * @param {{
86
67
  * cwd: string,
87
68
  * topN?: number,
@@ -138,11 +119,10 @@ export function runEngine({
138
119
  }
139
120
 
140
121
  /**
141
- * Condense an envelope into the pure-JSON stdout summary. Small enough to
142
- * read in a terminal, and never carrying a row set.
122
+ * Terminal-sized stdout summary; never carries a row set.
143
123
  *
144
124
  * @param {object} envelope
145
- * @param {string} outPath absolute path the full envelope was written to
125
+ * @param {string} outPath
146
126
  * @returns {object}
147
127
  */
148
128
  export function summarize(envelope, outPath) {
@@ -1,11 +1,5 @@
1
1
  /**
2
- * gate-surface.js — walk both halves of the baseline surface (Story #4902).
3
- *
4
- * The closed `delivery.quality.gates` kinds and the out-of-band ratchet
5
- * baselines are one surface, and an engine that walks only the first silently
6
- * drops the second. This module owns that walk and the file universe an
7
- * `ignoreGlobs` entry is checked against; [`surface-entry.js`](surface-entry.js)
8
- * turns each kind into its health report.
2
+ * Walks both halves of the baseline surface (gates and ratchets).
9
3
  *
10
4
  * @module lib/audit-baselines/gate-surface
11
5
  */
@@ -16,9 +10,7 @@ import { listFilesUnder, readJsonFile } from './read.js';
16
10
  import { surfaceEntryFor } from './surface-entry.js';
17
11
 
18
12
  /**
19
- * Every `targetDirs` entry declared by any gate, deduplicated. This is the
20
- * file universe an `ignoreGlobs` entry is checked against — a glob that
21
- * matches nothing inside the dirs its own gate scans is dead weight.
13
+ * The file universe `ignoreGlobs` are checked against.
22
14
  *
23
15
  * @param {object | null | undefined} quality
24
16
  * @returns {string[]}
@@ -34,15 +26,9 @@ function declaredTargetDirs(quality) {
34
26
  }
35
27
 
36
28
  /**
37
- * Walk both halves of the gate surface — the closed `delivery.quality.gates`
38
- * kinds and the out-of-band ratchet baselines — and report each instrument's
39
- * health.
40
- *
41
29
  * @param {{ cwd: string, quality: object, now?: Date, run?: Function }} args
42
- * `run` overrides the git spawn; `staleness.js` owns the real default.
43
30
  * @returns {{ entries: object[], baselines: Map<string, object|null> }}
44
- * `baselines` carries each parsed envelope forward so the hotspot, trend,
45
- * and headroom sections never re-read a 650KB file off disk.
31
+ * `baselines` is carried forward so later sections never re-read from disk.
46
32
  */
47
33
  export function buildGateSurface({ cwd, quality, now = new Date(), run }) {
48
34
  const files = declaredTargetDirs(quality).flatMap((dir) =>
@@ -1,18 +1,7 @@
1
1
  /**
2
- * headroom.js — how much slack sits between each configured floor and the
3
- * number actually measured (Story #4902).
4
- *
5
- * A floor set far from reality is a gate that cannot fail. Headroom is the
6
- * distance the measurement could still drift before the gate notices, and it
7
- * is the direct input to the only remediation this lens ever recommends:
8
- * tighten the floor to what the repo already achieves.
9
- *
10
- * Both sides come from the repository, never from this module: the floor
11
- * from `resolveQuality()` over `.agentrc.json` (so a consumer's own floors
12
- * are the ones reported), and the measurement from the committed baseline's
13
- * whole-repo rollup. Polarity comes from `axisDirection` in the gate's own
14
- * floors phase, so "better" always means the same thing here as it does when
15
- * `check-baselines.js` decides pass or fail.
2
+ * Slack between each configured floor and the measured rollup — a floor far
3
+ * from reality is a gate that cannot fail. Polarity comes from the gate's own
4
+ * `axisDirection`, so "better" means what `check-baselines.js` means.
16
5
  *
17
6
  * @module lib/audit-baselines/headroom
18
7
  */
@@ -21,8 +10,7 @@ import { axisDirection } from '../orchestration/check-baselines/phases/floors.js
21
10
  import { rollupOf } from './kinds.js';
22
11
 
23
12
  /**
24
- * Signed distance from the floor, positive when the measurement sits on the
25
- * good side of it. Null when the baseline carries no value for the axis.
13
+ * Positive on the good side of the floor, negative when breached.
26
14
  *
27
15
  * @param {number | undefined} measured
28
16
  * @param {number} floor
@@ -35,8 +23,6 @@ function headroomFor(measured, floor, direction) {
35
23
  }
36
24
 
37
25
  /**
38
- * Build the `headroom[]` section across every configured gate kind.
39
- *
40
26
  * @param {{
41
27
  * kinds: string[],
42
28
  * quality: object,
@@ -60,8 +46,6 @@ export function buildHeadroom({ kinds, quality, baselines }) {
60
46
  floor,
61
47
  measured: typeof measured === 'number' ? measured : null,
62
48
  direction,
63
- // Positive headroom = the measurement is on the good side of the
64
- // floor by this much; negative = the floor is already breached.
65
49
  headroom: headroomFor(measured, floor, direction),
66
50
  });
67
51
  }
@@ -1,24 +1,12 @@
1
1
  /**
2
- * hotspots.js — join per-gate outliers into ranked, per-file clusters
3
- * (Story #4902).
4
- *
5
- * The signal a baseline review is looking for is *convergence*: the file that
6
- * is simultaneously a CRAP outlier, a maintainability outlier, and a
7
- * duplication outlier is a different kind of problem from three unrelated
8
- * files each bad at one thing. Reading the baselines one at a time cannot see
9
- * it, because each gate's own top-20 is a different list.
10
- *
11
- * So severity **adds across gate memberships** and the three cost
12
- * multipliers apply to the sum. Two gate memberships of severity s therefore
13
- * outrank one membership of severity s at equal churn, centrality, and
14
- * friction — which is the ranking property this section exists to provide.
2
+ * Per-file clusters of per-gate outliers. Severity adds across gate
3
+ * memberships before the cost multipliers apply, so convergence (one file bad
4
+ * on several gates) outranks a single membership.
15
5
  *
16
6
  * @module lib/audit-baselines/hotspots
17
7
  */
18
8
 
19
9
  /**
20
- * Group per-gate outlier rows by cluster id and rank them.
21
- *
22
10
  * @param {{
23
11
  * outliers: Array<object>,
24
12
  * weightsFor: (id: string) => {
@@ -1,31 +1,18 @@
1
1
  /**
2
- * kinds.js — the two halves of the gate surface, and how to read a row out
3
- * of each (Story #4902).
4
- *
5
- * Mandrel's baseline surface is not one list. `delivery.quality.gates` is a
6
- * **closed** AJV schema of eight kinds, enforced by `check-baselines.js`.
7
- * Alongside it sit out-of-band **ratchet** baselines — dead exports (two
8
- * passes), import cycles, context budget — which no gate block declares and
9
- * only the CI baselines job runs. An engine that walks one half and calls it
10
- * "the baselines" silently drops the other; both halves are enumerated here.
11
- *
12
- * `GATE_KINDS` is derived from `GATES_SCHEMA` rather than re-typed, so a
13
- * ninth gate kind landing in the schema reaches this engine automatically.
2
+ * Both halves of the baseline surface (gate kinds and out-of-band ratchets)
3
+ * and how to read rows from each.
14
4
  *
15
5
  * @module lib/audit-baselines/kinds
16
6
  */
17
7
 
18
8
  import { GATES_SCHEMA } from '../config/gates/index.js';
19
9
 
20
- /** The closed `delivery.quality.gates` kind set, in stable order. */
10
+ /** Derived from the schema so a new gate kind arrives automatically. */
21
11
  export const GATE_KINDS = Object.freeze(
22
12
  Object.keys(GATES_SCHEMA.properties).sort(),
23
13
  );
24
14
 
25
- /**
26
- * Out-of-band ratchet baselines: committed under `baselines/` and enforced
27
- * only by the CI baselines job, never by `check-baselines.js`.
28
- */
15
+ /** Enforced only by the CI baselines job, never by `check-baselines.js`. */
29
16
  const RATCHET_KINDS = Object.freeze([
30
17
  'arch-cycles',
31
18
  'context-budget',
@@ -34,13 +21,10 @@ const RATCHET_KINDS = Object.freeze([
34
21
  'dead-exports-production',
35
22
  ]);
36
23
 
37
- /** Every kind the engine walks, gates first then ratchets. */
38
24
  export const ALL_KINDS = Object.freeze([...GATE_KINDS, ...RATCHET_KINDS]);
39
25
 
40
26
  /**
41
- * Resolve a kind's baseline path from config, falling back to the framework
42
- * default layout. Never hardcodes a consumer's location: a repo that moved
43
- * `baselines/crap.json` via `gates.crap.baselinePath` is followed.
27
+ * Honours `gates.<kind>.baselinePath`, else `baselines/<kind>.json`.
44
28
  *
45
29
  * @param {string} kind
46
30
  * @param {object | null | undefined} quality resolved `delivery.quality`
@@ -55,9 +39,8 @@ export function baselinePathFor(kind, quality) {
55
39
  }
56
40
 
57
41
  /**
58
- * Flatten `context-budget.json` into `{ id, value }` rows. Its three
59
- * sections all measure the same axis (bytes of context a file costs) under
60
- * different keys, so they fold into one row set rather than three.
42
+ * All three `context-budget.json` sections measure bytes, so they fold into
43
+ * one row set.
61
44
  *
62
45
  * @param {object} baseline
63
46
  * @returns {Array<{ id: string, value: number }>}
@@ -79,8 +62,7 @@ function contextBudgetRows(baseline) {
79
62
  }
80
63
 
81
64
  /**
82
- * Count how many allowlisted cycles each module participates in. A module in
83
- * three cycles is a worse architectural hotspot than one in a single cycle.
65
+ * Allowlisted-cycle memberships per module.
84
66
  *
85
67
  * @param {object} baseline
86
68
  * @returns {Array<{ id: string, value: number }>}
@@ -96,8 +78,7 @@ function archCycleRows(baseline) {
96
78
  }
97
79
 
98
80
  /**
99
- * Count dead exports per file. The row grain is `{ file, symbol }`; the
100
- * hotspot grain is the file.
81
+ * Dead exports per file (rows are per symbol).
101
82
  *
102
83
  * @param {object} baseline
103
84
  * @returns {Array<{ id: string, value: number }>}
@@ -112,10 +93,8 @@ function deadExportRows(baseline) {
112
93
  }
113
94
 
114
95
  /**
115
- * Build the `{ id, value }` extractor for an envelope-shaped gate kind.
116
- *
117
- * @param {string} idKey row property carrying the cluster identity
118
- * @param {string} metric row property carrying the measured value
96
+ * @param {string} idKey
97
+ * @param {string} metric
119
98
  * @returns {(baseline: object) => Array<{ id: string, value: number }>}
120
99
  */
121
100
  function envelopeRows(idKey, metric) {
@@ -126,36 +105,21 @@ function envelopeRows(idKey, metric) {
126
105
  }
127
106
 
128
107
  /**
129
- * Fold `{ id, value }` rows into one whole-repo number.
130
- *
131
- * `TOTAL` is for **additive** metrics — dead-export symbols, context bytes,
132
- * lint errors — where the sum is the quantity the instrument measures.
133
- * `TALLY` is for **non-additive** ones — percentages, indices, scores — where
134
- * summing per-file values would fabricate a statistic; the honest whole-repo
135
- * number is how many rows are tracked, and the unit name says so.
108
+ * `TOTAL` sums additive metrics; `TALLY` counts rows for non-additive ones
109
+ * (percentages, indices), where a sum would fabricate a statistic.
136
110
  */
137
111
  const TOTAL = (rows) => rows.reduce((sum, row) => sum + row.value, 0);
138
112
  const TALLY = (rows) => rows.length;
139
113
 
140
114
  /**
141
- * `[unit, fold]` per kind: the unit each kind's whole-repo total is
142
- * denominated in, and how its rows fold into it.
143
- *
144
- * This is the fix for the roll-up that counted **files** for every kind
145
- * (Story #4962). `dead-exports-production` moving 590 → 589 *symbols* across
146
- * 187 files on both sides read as a delta of 0, and a 421-byte context-budget
147
- * growth read as 0 too, because the fallback counted rows — a grain finer than
148
- * the file for dead exports and coarser than the byte for context budget.
149
- * Naming the unit is half the fix: an axis called `symbols` or `bytes` cannot
150
- * be re-read as a file count the way a bare `rowCount` was.
115
+ * `[unit, fold]` per kind. The named unit keeps a whole-repo total from being
116
+ * misread as a file count.
151
117
  */
152
118
  const TREND_UNITS = Object.freeze({
153
119
  'bundle-size': ['rawKb', TOTAL],
154
120
  coverage: ['filesTracked', TALLY],
155
121
  crap: ['filesTracked', TALLY],
156
122
  duplication: ['filesTracked', TALLY],
157
- lighthouse: ['routesTracked', TALLY],
158
- lint: ['errorCount', TOTAL],
159
123
  maintainability: ['filesTracked', TALLY],
160
124
  mutation: ['filesTracked', TALLY],
161
125
  'arch-cycles': ['cycleMemberships', TOTAL],
@@ -166,16 +130,8 @@ const TREND_UNITS = Object.freeze({
166
130
  });
167
131
 
168
132
  /**
169
- * Per-kind row spec.
170
- *
171
- * - `metric` — the axis a hotspot is measured on.
172
- * - `worse` — which end of that axis is the bad end.
173
- * - `rows` — baseline → `{ id, value }` pairs, already aggregated where
174
- * the on-disk grain is finer than the file (dead exports,
175
- * cycles).
176
- * - `idKind` — what the cluster key names. Every kind but `lighthouse`
177
- * (routes) and `bundle-size` (bundle names) keys on a
178
- * repository file path.
133
+ * Per-kind row spec: hotspot `metric`, which end is `worse`, `rows`
134
+ * extractor (aggregated to file grain), and what the `idKind` key names.
179
135
  */
180
136
  export const KIND_SPECS = Object.freeze({
181
137
  'bundle-size': {
@@ -202,18 +158,6 @@ export const KIND_SPECS = Object.freeze({
202
158
  idKind: 'path',
203
159
  rows: envelopeRows('path', 'percentage'),
204
160
  },
205
- lighthouse: {
206
- metric: 'performance',
207
- worse: 'lower',
208
- idKind: 'route',
209
- rows: envelopeRows('route', 'performance'),
210
- },
211
- lint: {
212
- metric: 'errorCount',
213
- worse: 'higher',
214
- idKind: 'path',
215
- rows: envelopeRows('path', 'errorCount'),
216
- },
217
161
  maintainability: {
218
162
  metric: 'mi',
219
163
  worse: 'lower',
@@ -259,10 +203,8 @@ export const KIND_SPECS = Object.freeze({
259
203
  });
260
204
 
261
205
  /**
262
- * The whole-repo rollup for a kind, or `null` when the kind does not carry
263
- * one. Ratchet baselines have no rollup — which is why stub detection asks
264
- * for an all-zero rollup rather than merely empty rows: an `arch-cycles`
265
- * baseline with zero cycles is a passing gate, not a dead instrument.
206
+ * The `*` rollup, or `null` (ratchets carry none — a zero-cycle `arch-cycles`
207
+ * is a passing gate, not a stub).
266
208
  *
267
209
  * @param {object | null} baseline
268
210
  * @returns {object | null}
@@ -273,12 +215,8 @@ export function rollupOf(baseline) {
273
215
  }
274
216
 
275
217
  /**
276
- * The whole-repo quantity a kind measures, in the unit it measures it in —
277
- * `{ unit, value }`, or `null` when the kind or the baseline is unreadable.
278
- *
279
- * This sits beside `rowCount` in `gateSurface[]` precisely because the two
280
- * disagree: `dead-exports-production` carries 589 rows across 187 files, so a
281
- * lone `rowCount: 187` reads as a symbol count and is not one.
218
+ * Whole-repo quantity in its own unit; differs from `rowCount` whenever the
219
+ * row grain is not the unit.
282
220
  *
283
221
  * @param {string} kind
284
222
  * @param {object | null} baseline
@@ -293,12 +231,8 @@ export function measuredTotalOf(kind, baseline) {
293
231
  }
294
232
 
295
233
  /**
296
- * The rollup a trend sample compares on. Gate kinds carry their own, already
297
- * axis-named; ratchet baselines carry none, so the whole-repo total stands in
298
- * under its own unit — "dead exports went 590 → 589 **symbols**" is exactly
299
- * the direction-of-travel question trend answers, and skipping the ratchet
300
- * half here would leave it visible in `gateSurface[]` but invisible in
301
- * `trend[]`.
234
+ * Trend comparison rollup: the declared one, else (ratchets) the measured
235
+ * total under its unit, so ratchets appear in `trend[]` too.
302
236
  *
303
237
  * @param {string} kind
304
238
  * @param {object | null} baseline
@@ -1,31 +1,18 @@
1
1
  /**
2
- * outliers.js — bounded top-N outlier extraction per gate (Story #4902).
3
- *
4
- * `baselines/crap.json` alone is ~650KB of per-method rows. The engine must
5
- * never embed a whole baseline in its envelope, so every kind is narrowed to
6
- * at most `topN` rows here, before anything downstream sees them.
7
- *
8
- * Narrowing happens in two steps:
9
- *
10
- * 1. **Aggregate to the cluster grain.** Baseline rows are per-method
11
- * (crap) or per-symbol (dead exports); hotspots are per-file. Each id
12
- * keeps its single worst value, plus how many rows it contributed.
13
- * 2. **Score, then cut.** `severityWeight` is the row's position in its
14
- * own kind's distribution, from 0 (the best value present) to 1 (the
15
- * worst). Scoring within the kind is what makes CRAP 29 and MI 74
16
- * comparable at all — the two axes share no unit, and the whole point
17
- * of a cluster is to add them up.
2
+ * Bounded top-N outliers per gate, so no whole baseline enters the envelope.
3
+ * Rows fold to the file grain (worst value kept), then `severityWeight` is
4
+ * the position in the kind's own distribution (0 best … 1 worst) — which is
5
+ * what makes unit-less axes like CRAP and MI summable in a cluster.
18
6
  *
19
7
  * @module lib/audit-baselines/outliers
20
8
  */
21
9
 
22
10
  import { KIND_SPECS } from './kinds.js';
23
11
 
24
- /** Default bound on rows extracted per gate. */
25
12
  export const DEFAULT_TOP_N = 20;
26
13
 
27
14
  /**
28
- * Fold `{ id, value }` rows to one entry per id, keeping the worst value.
15
+ * One entry per id, worst value kept.
29
16
  *
30
17
  * @param {Array<{ id: string, value: number }>} rows
31
18
  * @param {'higher' | 'lower'} worse
@@ -48,9 +35,7 @@ function aggregateById(rows, worse) {
48
35
  }
49
36
 
50
37
  /**
51
- * Position of `value` in `[min, max]` normalized so 1 is always the worst
52
- * end. A degenerate distribution (every value identical) scores 1 for every
53
- * row: they are all equally the worst, and equally the best.
38
+ * 1 is always the worst end; a degenerate distribution scores all 1.
54
39
  *
55
40
  * @param {number} value
56
41
  * @param {number} min
@@ -65,8 +50,6 @@ function normalizeSeverity(value, min, max, worse) {
65
50
  }
66
51
 
67
52
  /**
68
- * Extract the bounded worst-N rows for one kind.
69
- *
70
53
  * @param {{ kind: string, baseline: object | null, topN?: number }} args
71
54
  * @returns {Array<{
72
55
  * kind: string, id: string, metric: string, value: number,