mandrel 2.60.0 → 2.62.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (662) hide show
  1. package/.agents/README.md +10 -10
  2. package/.agents/agents/story-worker.md +1 -1
  3. package/.agents/docs/agentrc-reference.json +4 -82
  4. package/.agents/docs/configuration.md +20 -87
  5. package/.agents/docs/workflows.md +1 -1
  6. package/.agents/instructions.md +1 -3
  7. package/.agents/rules/gherkin-standards.md +4 -0
  8. package/.agents/schemas/agentrc.schema.json +11 -486
  9. package/.agents/schemas/story-deliver-terminal.schema.json +10 -0
  10. package/.agents/schemas/validation-evidence.schema.json +2 -1
  11. package/.agents/scripts/README.md +14 -14
  12. package/.agents/scripts/acceptance-eval.js +32 -164
  13. package/.agents/scripts/agents-bootstrap-github.js +27 -129
  14. package/.agents/scripts/apply-quality-bootstrap.js +4 -40
  15. package/.agents/scripts/audit-baselines.js +6 -27
  16. package/.agents/scripts/audit-labels-bootstrap.js +5 -29
  17. package/.agents/scripts/audit-to-stories.js +91 -361
  18. package/.agents/scripts/boot-sweep.js +19 -72
  19. package/.agents/scripts/bootstrap.js +74 -395
  20. package/.agents/scripts/ceremony-derive.js +9 -45
  21. package/.agents/scripts/check-arch-cycles.js +14 -64
  22. package/.agents/scripts/check-baselines.js +8 -48
  23. package/.agents/scripts/check-context-budget.js +46 -172
  24. package/.agents/scripts/check-cyclomatic.js +12 -44
  25. package/.agents/scripts/check-dead-exports.js +13 -64
  26. package/.agents/scripts/check-doc-links.js +38 -186
  27. package/.agents/scripts/check-gherkin-corpus.js +24 -127
  28. package/.agents/scripts/check-test-temp-hygiene.js +28 -169
  29. package/.agents/scripts/coverage-capture.js +32 -99
  30. package/.agents/scripts/deliver-light.js +14 -101
  31. package/.agents/scripts/deliver-recover.js +6 -42
  32. package/.agents/scripts/deliver-run.js +36 -133
  33. package/.agents/scripts/diagnose-friction.js +24 -116
  34. package/.agents/scripts/drain-pending-cleanup.js +1 -1
  35. package/.agents/scripts/evidence-gate.js +23 -85
  36. package/.agents/scripts/file-ci-gap.js +10 -50
  37. package/.agents/scripts/generate-config-docs.js +30 -170
  38. package/.agents/scripts/generate-lens-checklists.js +8 -52
  39. package/.agents/scripts/generate-skills-index.js +14 -112
  40. package/.agents/scripts/generate-workflows-doc.js +10 -70
  41. package/.agents/scripts/git-cleanup.js +2 -34
  42. package/.agents/scripts/lib/Graph.js +24 -81
  43. package/.agents/scripts/lib/ITicketingProvider.js +47 -143
  44. package/.agents/scripts/lib/Logger.js +14 -76
  45. package/.agents/scripts/lib/audit-baselines/engine.js +11 -31
  46. package/.agents/scripts/lib/audit-baselines/gate-surface.js +3 -17
  47. package/.agents/scripts/lib/audit-baselines/headroom.js +4 -20
  48. package/.agents/scripts/lib/audit-baselines/hotspots.js +3 -15
  49. package/.agents/scripts/lib/audit-baselines/kinds.js +23 -89
  50. package/.agents/scripts/lib/audit-baselines/outliers.js +6 -23
  51. package/.agents/scripts/lib/audit-baselines/read.js +3 -16
  52. package/.agents/scripts/lib/audit-baselines/staleness.js +7 -26
  53. package/.agents/scripts/lib/audit-baselines/surface-entry.js +7 -28
  54. package/.agents/scripts/lib/audit-baselines/trend.js +7 -20
  55. package/.agents/scripts/lib/audit-baselines/weights.js +9 -37
  56. package/.agents/scripts/lib/audit-suite/audit-rules-reader.js +3 -18
  57. package/.agents/scripts/lib/audit-suite/checklist-threading.js +26 -124
  58. package/.agents/scripts/lib/audit-suite/dispatch-checklist.js +14 -45
  59. package/.agents/scripts/lib/audit-suite/findings.js +12 -52
  60. package/.agents/scripts/lib/audit-suite/frontmatter.js +5 -29
  61. package/.agents/scripts/lib/audit-suite/index.js +1 -15
  62. package/.agents/scripts/lib/audit-suite/lens-checklist.js +10 -45
  63. package/.agents/scripts/lib/audit-suite/lens-diff-floor.js +11 -76
  64. package/.agents/scripts/lib/audit-suite/runner.js +13 -43
  65. package/.agents/scripts/lib/audit-suite/selector.js +49 -349
  66. package/.agents/scripts/lib/audit-suite/substitutions.js +12 -40
  67. package/.agents/scripts/lib/audit-suite/workflow-loader.js +3 -15
  68. package/.agents/scripts/lib/audit-to-stories/audit-label-taxonomy.js +11 -73
  69. package/.agents/scripts/lib/audit-to-stories/audit-lenses.js +8 -37
  70. package/.agents/scripts/lib/audit-to-stories/build-story-body.js +25 -143
  71. package/.agents/scripts/lib/audit-to-stories/dedupe-against-github.js +14 -80
  72. package/.agents/scripts/lib/audit-to-stories/epic-grouping-directive.js +4 -18
  73. package/.agents/scripts/lib/audit-to-stories/finding-adapter.js +7 -40
  74. package/.agents/scripts/lib/audit-to-stories/group-findings.js +9 -39
  75. package/.agents/scripts/lib/audit-to-stories/issue-corpus.js +10 -66
  76. package/.agents/scripts/lib/audit-to-stories/issue-index.js +6 -30
  77. package/.agents/scripts/lib/audit-to-stories/issues-file.js +6 -36
  78. package/.agents/scripts/lib/audit-to-stories/ledger-commit.js +17 -69
  79. package/.agents/scripts/lib/audit-to-stories/ledger-pr.js +17 -85
  80. package/.agents/scripts/lib/audit-to-stories/ledger-record.js +10 -48
  81. package/.agents/scripts/lib/audit-to-stories/parse-audit-md.js +38 -146
  82. package/.agents/scripts/lib/audit-to-stories/seed-from-findings.js +7 -42
  83. package/.agents/scripts/lib/audit-to-stories/wire-dependencies.js +10 -57
  84. package/.agents/scripts/lib/baseline-loader.js +12 -51
  85. package/.agents/scripts/lib/baseline-schema-registry.js +5 -22
  86. package/.agents/scripts/lib/baselines/component-matcher.js +3 -12
  87. package/.agents/scripts/lib/baselines/components.js +10 -61
  88. package/.agents/scripts/lib/baselines/coverage-updater-cli.js +7 -36
  89. package/.agents/scripts/lib/baselines/crap-preview-incremental.js +5 -21
  90. package/.agents/scripts/lib/baselines/crap-preview-scan.js +19 -45
  91. package/.agents/scripts/lib/baselines/crap-updater-cli.js +16 -65
  92. package/.agents/scripts/lib/baselines/diff-scope-cli.js +5 -33
  93. package/.agents/scripts/lib/baselines/duplication-scanner.js +11 -60
  94. package/.agents/scripts/lib/baselines/env-overrides.js +12 -67
  95. package/.agents/scripts/lib/baselines/envelope.js +13 -129
  96. package/.agents/scripts/lib/baselines/exit-codes.js +6 -49
  97. package/.agents/scripts/lib/baselines/git-base.js +23 -142
  98. package/.agents/scripts/lib/baselines/kernel.js +11 -111
  99. package/.agents/scripts/lib/baselines/kinds/_crap-new-method-gate.js +9 -47
  100. package/.agents/scripts/lib/baselines/kinds/_crap-read.js +8 -51
  101. package/.agents/scripts/lib/baselines/kinds/_shared-metric.js +7 -62
  102. package/.agents/scripts/lib/baselines/kinds/bundle-size.js +8 -29
  103. package/.agents/scripts/lib/baselines/kinds/coverage.js +3 -15
  104. package/.agents/scripts/lib/baselines/kinds/crap.js +94 -415
  105. package/.agents/scripts/lib/baselines/kinds/duplication.js +4 -30
  106. package/.agents/scripts/lib/baselines/kinds/kind-factory.js +7 -53
  107. package/.agents/scripts/lib/baselines/kinds/maintainability.js +15 -80
  108. package/.agents/scripts/lib/baselines/kinds/mutation.js +12 -72
  109. package/.agents/scripts/lib/baselines/maintainability-baseline-io.js +4 -11
  110. package/.agents/scripts/lib/baselines/merge-envelopes.js +30 -146
  111. package/.agents/scripts/lib/baselines/path-canon.js +19 -128
  112. package/.agents/scripts/lib/baselines/preview-gates.js +8 -37
  113. package/.agents/scripts/lib/baselines/reader.js +14 -107
  114. package/.agents/scripts/lib/baselines/refresh-service.js +35 -252
  115. package/.agents/scripts/lib/baselines/scope.js +11 -135
  116. package/.agents/scripts/lib/baselines/writer.js +16 -149
  117. package/.agents/scripts/lib/bdd-runner-detect.js +18 -113
  118. package/.agents/scripts/lib/bdd-scenario-budget.js +9 -36
  119. package/.agents/scripts/lib/bdd-scenario-scanner.js +11 -73
  120. package/.agents/scripts/lib/bdd-step-index.js +26 -100
  121. package/.agents/scripts/lib/bootstrap/baseline-merge-driver.js +23 -103
  122. package/.agents/scripts/lib/bootstrap/branch-protection.js +2 -5
  123. package/.agents/scripts/lib/bootstrap/commit-push.js +12 -50
  124. package/.agents/scripts/lib/bootstrap/gh-preflight.js +14 -101
  125. package/.agents/scripts/lib/bootstrap/hitl-confirm.js +5 -30
  126. package/.agents/scripts/lib/bootstrap/install-ledger.js +17 -73
  127. package/.agents/scripts/lib/bootstrap/issue-forms-template.js +17 -121
  128. package/.agents/scripts/lib/bootstrap/manifest.js +15 -86
  129. package/.agents/scripts/lib/bootstrap/merge-methods.js +4 -33
  130. package/.agents/scripts/lib/bootstrap/preflight.js +12 -61
  131. package/.agents/scripts/lib/bootstrap/project-bootstrap.js +34 -235
  132. package/.agents/scripts/lib/bootstrap/prompt.js +21 -129
  133. package/.agents/scripts/lib/bootstrap/quality-bootstrap.js +27 -141
  134. package/.agents/scripts/lib/bootstrap/summary.js +1 -8
  135. package/.agents/scripts/lib/bootstrap/workflow-audit.js +11 -84
  136. package/.agents/scripts/lib/branch-name-guard.js +4 -23
  137. package/.agents/scripts/lib/changed-files.js +31 -143
  138. package/.agents/scripts/lib/checks/core-bare-clean.js +4 -24
  139. package/.agents/scripts/lib/checks/index.js +18 -101
  140. package/.agents/scripts/lib/checks/loop-health.js +11 -53
  141. package/.agents/scripts/lib/checks/state.js +16 -91
  142. package/.agents/scripts/lib/checks/story-init-not-backgrounded.js +10 -61
  143. package/.agents/scripts/lib/checks/subagent-agent-tool-required.js +14 -83
  144. package/.agents/scripts/lib/child-exec.js +39 -108
  145. package/.agents/scripts/lib/cli/standard-args.js +9 -116
  146. package/.agents/scripts/lib/cli-args.js +31 -146
  147. package/.agents/scripts/lib/cli-usage.js +5 -27
  148. package/.agents/scripts/lib/cli-utils.js +2 -12
  149. package/.agents/scripts/lib/close-validation/commands.js +13 -76
  150. package/.agents/scripts/lib/close-validation/gates.js +92 -331
  151. package/.agents/scripts/lib/close-validation/process.js +121 -151
  152. package/.agents/scripts/lib/close-validation/projections/advisories.js +5 -31
  153. package/.agents/scripts/lib/close-validation/projections/crap.js +19 -67
  154. package/.agents/scripts/lib/close-validation/projections/head-sha.js +1 -17
  155. package/.agents/scripts/lib/close-validation/projections/inputs.js +4 -34
  156. package/.agents/scripts/lib/close-validation/projections/maintainability.js +11 -58
  157. package/.agents/scripts/lib/close-validation/runner.js +53 -110
  158. package/.agents/scripts/lib/command-header.js +6 -28
  159. package/.agents/scripts/lib/config/acceptance-eval.js +4 -30
  160. package/.agents/scripts/lib/config/baselines.js +3 -14
  161. package/.agents/scripts/lib/config/ci.js +8 -38
  162. package/.agents/scripts/lib/config/commands.js +1 -15
  163. package/.agents/scripts/lib/config/defaults.js +4 -33
  164. package/.agents/scripts/lib/config/delivery-routing.js +6 -35
  165. package/.agents/scripts/lib/config/explain.js +9 -80
  166. package/.agents/scripts/lib/config/gates/coverage.schema.js +0 -12
  167. package/.agents/scripts/lib/config/gates/crap-incremental-coverage.schema.js +2 -30
  168. package/.agents/scripts/lib/config/gates/crap.schema.js +1 -34
  169. package/.agents/scripts/lib/config/gates/duplication.schema.js +1 -8
  170. package/.agents/scripts/lib/config/gates/index.js +2 -17
  171. package/.agents/scripts/lib/config/gates/maintainability.schema.js +1 -20
  172. package/.agents/scripts/lib/config/gates/mutation.schema.js +1 -7
  173. package/.agents/scripts/lib/config/gates/shared.js +4 -64
  174. package/.agents/scripts/lib/config/github.js +4 -22
  175. package/.agents/scripts/lib/config/limits.js +4 -57
  176. package/.agents/scripts/lib/config/paths.js +2 -21
  177. package/.agents/scripts/lib/config/qa.js +4 -38
  178. package/.agents/scripts/lib/config/quality.js +76 -432
  179. package/.agents/scripts/lib/config/runners.js +12 -56
  180. package/.agents/scripts/lib/config/runtime.js +13 -57
  181. package/.agents/scripts/lib/config/shared.js +2 -16
  182. package/.agents/scripts/lib/config/sync-agentrc.js +9 -50
  183. package/.agents/scripts/lib/config/temp-paths.js +40 -280
  184. package/.agents/scripts/lib/config/validate-orchestration.js +5 -17
  185. package/.agents/scripts/lib/config/worktree-isolation.js +9 -28
  186. package/.agents/scripts/lib/config-resolver.js +10 -52
  187. package/.agents/scripts/lib/config-schema-shared.js +1 -4
  188. package/.agents/scripts/lib/config-settings-schema-delivery.js +12 -294
  189. package/.agents/scripts/lib/config-settings-schema-quality.js +7 -219
  190. package/.agents/scripts/lib/config-settings-schema.js +37 -274
  191. package/.agents/scripts/lib/coverage-baseline.js +20 -110
  192. package/.agents/scripts/lib/coverage-capture-fullscope.js +12 -37
  193. package/.agents/scripts/lib/coverage-capture-incremental.js +12 -43
  194. package/.agents/scripts/lib/coverage-capture-usage.js +4 -24
  195. package/.agents/scripts/lib/coverage-capture.js +99 -224
  196. package/.agents/scripts/lib/coverage-utils.js +14 -79
  197. package/.agents/scripts/lib/cpu-pool.js +17 -123
  198. package/.agents/scripts/lib/crap-baseline-join.js +16 -88
  199. package/.agents/scripts/lib/crap-coordinates.js +6 -25
  200. package/.agents/scripts/lib/crap-engine.js +40 -153
  201. package/.agents/scripts/lib/crap-method-identity.js +16 -78
  202. package/.agents/scripts/lib/crap-utils.js +31 -155
  203. package/.agents/scripts/lib/cyclomatic-ceiling.js +14 -87
  204. package/.agents/scripts/lib/cyclomatic-scope.js +10 -50
  205. package/.agents/scripts/lib/dead-exports-knip.js +18 -56
  206. package/.agents/scripts/lib/dead-exports-mode.js +5 -24
  207. package/.agents/scripts/lib/degraded-mode.js +3 -26
  208. package/.agents/scripts/lib/dependency-parser.js +8 -40
  209. package/.agents/scripts/lib/dependency-version.js +13 -35
  210. package/.agents/scripts/lib/detect-package-manager.js +6 -36
  211. package/.agents/scripts/lib/doc-tiers.js +22 -126
  212. package/.agents/scripts/lib/duplicate-search.js +8 -72
  213. package/.agents/scripts/lib/env-loader.js +5 -27
  214. package/.agents/scripts/lib/error-redactor.js +6 -31
  215. package/.agents/scripts/lib/errors/index.js +2 -22
  216. package/.agents/scripts/lib/escomplex-ast-compat.js +22 -163
  217. package/.agents/scripts/lib/escomplex-kernel.js +21 -123
  218. package/.agents/scripts/lib/feedback-loop/graduator-core.js +93 -419
  219. package/.agents/scripts/lib/feedback-loop/prior-feedback-fetcher.js +20 -98
  220. package/.agents/scripts/lib/feedback-loop/retro-proposals-graduator.js +27 -151
  221. package/.agents/scripts/lib/findings/audit-ledger.js +23 -97
  222. package/.agents/scripts/lib/findings/classify-finding.js +14 -69
  223. package/.agents/scripts/lib/findings/promote-finding.js +14 -112
  224. package/.agents/scripts/lib/findings/provenance-field.js +11 -52
  225. package/.agents/scripts/lib/findings/route-finding.js +37 -255
  226. package/.agents/scripts/lib/findings/semantic-issue-search.js +14 -59
  227. package/.agents/scripts/lib/findings/severity.js +18 -104
  228. package/.agents/scripts/lib/format-generated-json.js +12 -44
  229. package/.agents/scripts/lib/full-suite-lock.js +160 -429
  230. package/.agents/scripts/lib/full-suite-queue.js +213 -0
  231. package/.agents/scripts/lib/gates/baseline-store.js +5 -9
  232. package/.agents/scripts/lib/gates/friction.js +1 -3
  233. package/.agents/scripts/lib/generated/agentrc-validator.js +2 -2
  234. package/.agents/scripts/lib/gh-exec.js +31 -259
  235. package/.agents/scripts/lib/git/cached-fetch.js +9 -52
  236. package/.agents/scripts/lib/git/sync-from-base.js +15 -107
  237. package/.agents/scripts/lib/git-branch-cleanup.js +14 -61
  238. package/.agents/scripts/lib/git-branch-lifecycle.js +16 -87
  239. package/.agents/scripts/lib/git-utils.js +37 -161
  240. package/.agents/scripts/lib/github/framework-repo.js +8 -71
  241. package/.agents/scripts/lib/github-url.js +2 -17
  242. package/.agents/scripts/lib/import-graph.js +11 -38
  243. package/.agents/scripts/lib/install-cmd-parser.js +4 -13
  244. package/.agents/scripts/lib/json-utils.js +3 -18
  245. package/.agents/scripts/lib/label-constants.js +16 -111
  246. package/.agents/scripts/lib/label-taxonomy.js +4 -30
  247. package/.agents/scripts/lib/maintainability-engine.js +12 -80
  248. package/.agents/scripts/lib/maintainability-unscorable.js +5 -25
  249. package/.agents/scripts/lib/maintainability-utils.js +16 -92
  250. package/.agents/scripts/lib/mandrel-catalog.js +12 -70
  251. package/.agents/scripts/lib/notifications/notifier.js +13 -38
  252. package/.agents/scripts/lib/npm-scripts.js +4 -23
  253. package/.agents/scripts/lib/observability/metrics-ledger.js +16 -76
  254. package/.agents/scripts/lib/observability/runtime-friction.js +44 -286
  255. package/.agents/scripts/lib/observability/signal-validator.js +5 -37
  256. package/.agents/scripts/lib/observability/signals-writer.js +11 -121
  257. package/.agents/scripts/lib/observability/source-classifier.js +21 -203
  258. package/.agents/scripts/lib/observability/terse-result.js +14 -47
  259. package/.agents/scripts/lib/onboard/init-tail.js +13 -74
  260. package/.agents/scripts/lib/onboard/scaffold-docs.js +11 -34
  261. package/.agents/scripts/lib/orchestration/acceptance-eval-decision.js +25 -139
  262. package/.agents/scripts/lib/orchestration/auto-merge-cwd.js +11 -66
  263. package/.agents/scripts/lib/orchestration/behind-recovery.js +10 -55
  264. package/.agents/scripts/lib/orchestration/ceremony-routing.js +5 -75
  265. package/.agents/scripts/lib/orchestration/change-set.js +7 -36
  266. package/.agents/scripts/lib/orchestration/check-baselines/phases/compare.js +9 -46
  267. package/.agents/scripts/lib/orchestration/check-baselines/phases/evaluate.js +11 -44
  268. package/.agents/scripts/lib/orchestration/check-baselines/phases/floors.js +5 -24
  269. package/.agents/scripts/lib/orchestration/check-baselines/phases/friction.js +3 -12
  270. package/.agents/scripts/lib/orchestration/check-baselines/phases/parse-args.js +5 -38
  271. package/.agents/scripts/lib/orchestration/check-baselines/phases/pipeline.js +3 -8
  272. package/.agents/scripts/lib/orchestration/check-baselines/phases/refresh-ack.js +28 -136
  273. package/.agents/scripts/lib/orchestration/check-baselines/phases/report.js +3 -13
  274. package/.agents/scripts/lib/orchestration/check-state.js +92 -0
  275. package/.agents/scripts/lib/orchestration/ci-gap-intake.js +37 -144
  276. package/.agents/scripts/lib/orchestration/ci-rerun-guard.js +42 -189
  277. package/.agents/scripts/lib/orchestration/code-review.js +24 -128
  278. package/.agents/scripts/lib/orchestration/column-sync.js +23 -111
  279. package/.agents/scripts/lib/orchestration/complexity-gate.js +42 -214
  280. package/.agents/scripts/lib/orchestration/deliver-recover.js +36 -168
  281. package/.agents/scripts/lib/orchestration/dependency-analyzer.js +4 -35
  282. package/.agents/scripts/lib/orchestration/dependency-candidates.js +9 -41
  283. package/.agents/scripts/lib/orchestration/diff-magnitude.js +25 -115
  284. package/.agents/scripts/lib/orchestration/doc-reader.js +2 -6
  285. package/.agents/scripts/lib/orchestration/docs-digest.js +13 -51
  286. package/.agents/scripts/lib/orchestration/epic-candidates.js +13 -53
  287. package/.agents/scripts/lib/orchestration/epic-checklist.js +9 -33
  288. package/.agents/scripts/lib/orchestration/epic-container.js +41 -167
  289. package/.agents/scripts/lib/orchestration/epic-expansion.js +10 -40
  290. package/.agents/scripts/lib/orchestration/epic-rollup.js +55 -207
  291. package/.agents/scripts/lib/orchestration/file-assumption-enum.js +2 -22
  292. package/.agents/scripts/lib/orchestration/file-assumptions.js +45 -253
  293. package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-detect.js +9 -46
  294. package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-reap.js +7 -57
  295. package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches.js +21 -126
  296. package/.agents/scripts/lib/orchestration/git-cleanup/phases/cli.js +2 -6
  297. package/.agents/scripts/lib/orchestration/git-cleanup/phases/fast-forward.js +1 -4
  298. package/.agents/scripts/lib/orchestration/git-cleanup/phases/filters.js +1 -5
  299. package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes-ff.js +9 -34
  300. package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes.js +41 -190
  301. package/.agents/scripts/lib/orchestration/git-cleanup/phases/merged-tip.js +9 -45
  302. package/.agents/scripts/lib/orchestration/git-cleanup/phases/parse-args.js +1 -4
  303. package/.agents/scripts/lib/orchestration/git-cleanup/phases/phase-drivers.js +19 -85
  304. package/.agents/scripts/lib/orchestration/git-cleanup/phases/prompts.js +3 -17
  305. package/.agents/scripts/lib/orchestration/git-cleanup/phases/prune.js +1 -5
  306. package/.agents/scripts/lib/orchestration/git-cleanup/phases/render.js +16 -100
  307. package/.agents/scripts/lib/orchestration/git-cleanup/phases/stashes.js +1 -4
  308. package/.agents/scripts/lib/orchestration/lease-guard-shared.js +16 -67
  309. package/.agents/scripts/lib/orchestration/lifecycle/emit-ledger-event.js +9 -33
  310. package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-flip-failed.js +8 -29
  311. package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-unlanded.js +15 -68
  312. package/.agents/scripts/lib/orchestration/light-backstop.js +11 -49
  313. package/.agents/scripts/lib/orchestration/light-escalation.js +21 -89
  314. package/.agents/scripts/lib/orchestration/light-suitability.js +26 -231
  315. package/.agents/scripts/lib/orchestration/merge-block-class.js +39 -216
  316. package/.agents/scripts/lib/orchestration/merge-poll.js +104 -377
  317. package/.agents/scripts/lib/orchestration/merge-queue.js +158 -0
  318. package/.agents/scripts/lib/orchestration/pinned-identifier-lint.js +17 -57
  319. package/.agents/scripts/lib/orchestration/plan-context.js +52 -303
  320. package/.agents/scripts/lib/orchestration/plan-critic-conditions.js +22 -79
  321. package/.agents/scripts/lib/orchestration/plan-critics-evaluate.js +5 -31
  322. package/.agents/scripts/lib/orchestration/plan-metrics.js +29 -108
  323. package/.agents/scripts/lib/orchestration/plan-navigation.js +8 -27
  324. package/.agents/scripts/lib/orchestration/plan-persist/acceptance-handle-repair.js +12 -49
  325. package/.agents/scripts/lib/orchestration/plan-persist/audit-provenance.js +18 -73
  326. package/.agents/scripts/lib/orchestration/plan-persist/changes-repair.js +14 -78
  327. package/.agents/scripts/lib/orchestration/plan-persist/cross-plan-links.js +6 -30
  328. package/.agents/scripts/lib/orchestration/plan-persist/epic-adoption.js +14 -65
  329. package/.agents/scripts/lib/orchestration/plan-persist/epic-ops.js +21 -76
  330. package/.agents/scripts/lib/orchestration/plan-persist/external-deps.js +6 -43
  331. package/.agents/scripts/lib/orchestration/plan-persist/persist-helpers.js +14 -68
  332. package/.agents/scripts/lib/orchestration/plan-persist/plan-context-source.js +9 -41
  333. package/.agents/scripts/lib/orchestration/plan-persist/run-plan-persist.js +49 -248
  334. package/.agents/scripts/lib/orchestration/plan-persist/soft-findings.js +2 -12
  335. package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +85 -368
  336. package/.agents/scripts/lib/orchestration/plan-persist/summary.js +8 -38
  337. package/.agents/scripts/lib/orchestration/plan-persist/supersede-ops.js +30 -190
  338. package/.agents/scripts/lib/orchestration/plan-persist/wave-collision-gate.js +9 -49
  339. package/.agents/scripts/lib/orchestration/plan-persist/wave-serialisation.js +7 -28
  340. package/.agents/scripts/lib/orchestration/plan-reachability.js +13 -42
  341. package/.agents/scripts/lib/orchestration/plan-run-labels/reap.js +16 -91
  342. package/.agents/scripts/lib/orchestration/plan-runner/worktree-sweep.js +16 -54
  343. package/.agents/scripts/lib/orchestration/plan-text-hygiene.js +10 -52
  344. package/.agents/scripts/lib/orchestration/planning/authoring-context.js +14 -109
  345. package/.agents/scripts/lib/orchestration/planning/memory-pool-advisory.js +11 -83
  346. package/.agents/scripts/lib/orchestration/pr-watch.js +48 -306
  347. package/.agents/scripts/lib/orchestration/project-meta-cache.js +15 -80
  348. package/.agents/scripts/lib/orchestration/project-meta-resolver.js +10 -51
  349. package/.agents/scripts/lib/orchestration/reassert-status-column.js +12 -76
  350. package/.agents/scripts/lib/orchestration/remote-verifier.js +12 -36
  351. package/.agents/scripts/lib/orchestration/resolve-stories.js +33 -164
  352. package/.agents/scripts/lib/orchestration/retro-proposals.js +66 -361
  353. package/.agents/scripts/lib/orchestration/review-base-ref.js +9 -43
  354. package/.agents/scripts/lib/orchestration/review-depth.js +12 -94
  355. package/.agents/scripts/lib/orchestration/review-providers/codex.js +10 -111
  356. package/.agents/scripts/lib/orchestration/review-providers/degraded-gates.js +13 -71
  357. package/.agents/scripts/lib/orchestration/review-providers/findings-renderer.js +7 -51
  358. package/.agents/scripts/lib/orchestration/review-providers/mi-exemptions.js +8 -53
  359. package/.agents/scripts/lib/orchestration/review-providers/native.js +30 -214
  360. package/.agents/scripts/lib/orchestration/review-providers/parse-findings.js +7 -52
  361. package/.agents/scripts/lib/orchestration/review-providers/review-depth.js +4 -33
  362. package/.agents/scripts/lib/orchestration/review-providers/review-provider-factory.js +11 -71
  363. package/.agents/scripts/lib/orchestration/review-providers/scoped-lint.js +19 -131
  364. package/.agents/scripts/lib/orchestration/review-providers/security-review.js +6 -89
  365. package/.agents/scripts/lib/orchestration/review-providers/types.js +26 -56
  366. package/.agents/scripts/lib/orchestration/review-providers/ultrareview.js +3 -46
  367. package/.agents/scripts/lib/orchestration/run-epilogue.js +40 -199
  368. package/.agents/scripts/lib/orchestration/run-scoped-config.js +13 -81
  369. package/.agents/scripts/lib/orchestration/single-story-close/close-note.js +7 -34
  370. package/.agents/scripts/lib/orchestration/single-story-close/failed-terminal.js +16 -89
  371. package/.agents/scripts/lib/orchestration/single-story-close/gate-log.js +18 -109
  372. package/.agents/scripts/lib/orchestration/single-story-close/phases/auto-merge.js +190 -280
  373. package/.agents/scripts/lib/orchestration/single-story-close/phases/base-sync.js +18 -80
  374. package/.agents/scripts/lib/orchestration/single-story-close/phases/close-validation.js +103 -97
  375. package/.agents/scripts/lib/orchestration/single-story-close/phases/code-review.js +8 -64
  376. package/.agents/scripts/lib/orchestration/single-story-close/phases/confirm-merge.js +183 -485
  377. package/.agents/scripts/lib/orchestration/single-story-close/phases/conventional-subject.js +30 -134
  378. package/.agents/scripts/lib/orchestration/single-story-close/phases/graphql-preflight.js +9 -50
  379. package/.agents/scripts/lib/orchestration/single-story-close/phases/lock-wait-pending.js +49 -0
  380. package/.agents/scripts/lib/orchestration/single-story-close/phases/normalize-pr-title.js +13 -86
  381. package/.agents/scripts/lib/orchestration/single-story-close/phases/options.js +20 -95
  382. package/.agents/scripts/lib/orchestration/single-story-close/phases/post-land.js +46 -203
  383. package/.agents/scripts/lib/orchestration/single-story-close/phases/pre-gate-steps.js +8 -50
  384. package/.agents/scripts/lib/orchestration/single-story-close/phases/pull-request.js +12 -83
  385. package/.agents/scripts/lib/orchestration/single-story-close/phases/push.js +6 -39
  386. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-block.js +1 -6
  387. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-outcome.js +4 -28
  388. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-override.js +6 -51
  389. package/.agents/scripts/lib/orchestration/single-story-close/phases/worktree-reap.js +6 -34
  390. package/.agents/scripts/lib/orchestration/single-story-close/phases/wrong-tree-guard.js +23 -121
  391. package/.agents/scripts/lib/orchestration/single-story-close/runner.js +110 -290
  392. package/.agents/scripts/lib/orchestration/single-story-lease-guard.js +15 -69
  393. package/.agents/scripts/lib/orchestration/story-body-gate.js +4 -23
  394. package/.agents/scripts/lib/orchestration/story-close/baseline-upward-writeback.js +50 -179
  395. package/.agents/scripts/lib/orchestration/story-close/context-budget-writeback.js +11 -41
  396. package/.agents/scripts/lib/orchestration/story-close/format-autofix.js +23 -311
  397. package/.agents/scripts/lib/orchestration/story-close/phases/local-lens-review.js +22 -147
  398. package/.agents/scripts/lib/orchestration/story-close/phases/review-core.js +16 -67
  399. package/.agents/scripts/lib/orchestration/story-deliver-terminal-schema.js +12 -68
  400. package/.agents/scripts/lib/orchestration/story-deliver-terminal.js +42 -201
  401. package/.agents/scripts/lib/orchestration/story-follow-ups.js +43 -245
  402. package/.agents/scripts/lib/orchestration/story-init-envelope.js +4 -23
  403. package/.agents/scripts/lib/orchestration/story-init-remote.js +2 -6
  404. package/.agents/scripts/lib/orchestration/story-reachability.js +3 -23
  405. package/.agents/scripts/lib/orchestration/task-body-validator.js +12 -126
  406. package/.agents/scripts/lib/orchestration/ticket-lease.js +28 -131
  407. package/.agents/scripts/lib/orchestration/ticket-validator-conflicts.js +15 -149
  408. package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +5 -33
  409. package/.agents/scripts/lib/orchestration/ticket-validator.js +39 -181
  410. package/.agents/scripts/lib/orchestration/ticketing/bulk.js +51 -244
  411. package/.agents/scripts/lib/orchestration/ticketing/reads.js +39 -250
  412. package/.agents/scripts/lib/orchestration/ticketing/state.js +14 -68
  413. package/.agents/scripts/lib/orchestration/ticketing/transition.js +46 -263
  414. package/.agents/scripts/lib/orchestration/ticketing.js +2 -26
  415. package/.agents/scripts/lib/orchestration/verify-credit.js +18 -79
  416. package/.agents/scripts/lib/orchestration/worktree-dirty.js +5 -30
  417. package/.agents/scripts/lib/path-security.js +3 -6
  418. package/.agents/scripts/lib/plan-phase-cleanup.js +9 -49
  419. package/.agents/scripts/lib/preflight-runner.js +13 -69
  420. package/.agents/scripts/lib/process-group.js +143 -0
  421. package/.agents/scripts/lib/project-root.js +2 -8
  422. package/.agents/scripts/lib/provider-factory.js +2 -25
  423. package/.agents/scripts/lib/qa/console-allowlist.js +10 -59
  424. package/.agents/scripts/lib/qa/qa-session.js +15 -69
  425. package/.agents/scripts/lib/qa/redact-evidence.js +18 -129
  426. package/.agents/scripts/lib/qa/resolve-qa-contract.js +26 -135
  427. package/.agents/scripts/lib/qa/resolve-selection.js +16 -84
  428. package/.agents/scripts/lib/reserved-test-ids.js +9 -47
  429. package/.agents/scripts/lib/runtime-deps/dep-resolution.js +13 -53
  430. package/.agents/scripts/lib/runtime-deps/ensure-installed.js +10 -44
  431. package/.agents/scripts/lib/runtime-deps/manifest.js +10 -30
  432. package/.agents/scripts/lib/runtime-deps/parser-major.js +15 -51
  433. package/.agents/scripts/lib/runtime-deps/preflight.js +4 -22
  434. package/.agents/scripts/lib/runtime-deps/scan-imports.js +11 -55
  435. package/.agents/scripts/lib/signals/detectors/common.js +12 -38
  436. package/.agents/scripts/lib/signals/index.js +2 -19
  437. package/.agents/scripts/lib/signals/schema.js +14 -109
  438. package/.agents/scripts/lib/signals/write.js +2 -11
  439. package/.agents/scripts/lib/single-story/confirm-merge.js +31 -72
  440. package/.agents/scripts/lib/single-story/story-merged-notify.js +8 -49
  441. package/.agents/scripts/lib/single-story-sweep/protection-ctx.js +4 -26
  442. package/.agents/scripts/lib/single-story-sweep/protection.js +13 -100
  443. package/.agents/scripts/lib/single-story-sweep/sweep-lock.js +60 -258
  444. package/.agents/scripts/lib/single-story-sweep.js +14 -97
  445. package/.agents/scripts/lib/skills/parse-skill.js +13 -59
  446. package/.agents/scripts/lib/skills/skills-index.js +8 -29
  447. package/.agents/scripts/lib/skills/walk-skill-files.js +17 -78
  448. package/.agents/scripts/lib/source-extensions.js +11 -42
  449. package/.agents/scripts/lib/source-text/strip-js-comments.js +8 -41
  450. package/.agents/scripts/lib/stdio-flush.js +9 -36
  451. package/.agents/scripts/lib/story-adjacency.js +8 -40
  452. package/.agents/scripts/lib/story-body/body-format-lints.js +22 -83
  453. package/.agents/scripts/lib/story-body/footer-block.js +11 -44
  454. package/.agents/scripts/lib/story-body/story-body.js +83 -358
  455. package/.agents/scripts/lib/temp-retention.js +42 -143
  456. package/.agents/scripts/lib/templates/decomposer-prompts.js +11 -65
  457. package/.agents/scripts/lib/test-env.js +12 -65
  458. package/.agents/scripts/lib/test-run-credit.js +10 -65
  459. package/.agents/scripts/lib/test-runner-contract.js +19 -74
  460. package/.agents/scripts/lib/test-temp.js +38 -184
  461. package/.agents/scripts/lib/test-tiers.js +12 -96
  462. package/.agents/scripts/lib/ticket-body-sections.js +21 -96
  463. package/.agents/scripts/lib/transpile.js +15 -74
  464. package/.agents/scripts/lib/util/concurrent-map.js +6 -25
  465. package/.agents/scripts/lib/util/parse-id-list.js +8 -34
  466. package/.agents/scripts/lib/util/poll-loop.js +8 -28
  467. package/.agents/scripts/lib/util/with-timeout.js +2 -11
  468. package/.agents/scripts/lib/validation-evidence.js +21 -96
  469. package/.agents/scripts/lib/wave-runner/footprint.js +17 -70
  470. package/.agents/scripts/lib/wave-runner/live-probe.js +53 -221
  471. package/.agents/scripts/lib/wave-runner/ready-set.js +72 -301
  472. package/.agents/scripts/lib/workers/crap-worker.js +11 -64
  473. package/.agents/scripts/lib/workers/maintainability-report-worker.js +8 -45
  474. package/.agents/scripts/lib/workers/maintainability-worker.js +5 -21
  475. package/.agents/scripts/lib/workers/serve-worker-messages.js +2 -18
  476. package/.agents/scripts/lib/workflow-closure.js +22 -105
  477. package/.agents/scripts/lib/workspace-provisioner.js +16 -54
  478. package/.agents/scripts/lib/worktree/git-hooks.js +15 -60
  479. package/.agents/scripts/lib/worktree/lifecycle/force-drain.js +20 -60
  480. package/.agents/scripts/lib/worktree/lifecycle/merge-reachability.js +10 -62
  481. package/.agents/scripts/lib/worktree/lifecycle/pending-cleanup.js +22 -86
  482. package/.agents/scripts/lib/worktree/lifecycle/reap.js +24 -126
  483. package/.agents/scripts/lib/worktree/lifecycle-manager.js +2 -20
  484. package/.agents/scripts/lib/worktree/node-modules-strategy.js +46 -180
  485. package/.agents/scripts/lib/worktree-manager.js +15 -40
  486. package/.agents/scripts/lint-issue-body.js +12 -68
  487. package/.agents/scripts/mandrel-update-preflight.js +10 -70
  488. package/.agents/scripts/merge-baseline.js +30 -104
  489. package/.agents/scripts/nav-registry-diff.js +22 -108
  490. package/.agents/scripts/notify.js +12 -69
  491. package/.agents/scripts/plan-context.js +27 -111
  492. package/.agents/scripts/plan-critics.js +12 -66
  493. package/.agents/scripts/plan-persist.js +31 -148
  494. package/.agents/scripts/plan-run-epilogue.js +11 -37
  495. package/.agents/scripts/pr-watch-with-update.js +76 -267
  496. package/.agents/scripts/providers/github/auth.js +3 -8
  497. package/.agents/scripts/providers/github/blocked-by-add.js +14 -61
  498. package/.agents/scripts/providers/github/board-add.js +5 -21
  499. package/.agents/scripts/providers/github/branch-protection.js +11 -43
  500. package/.agents/scripts/providers/github/cache.js +2 -14
  501. package/.agents/scripts/providers/github/comments.js +7 -40
  502. package/.agents/scripts/providers/github/compose.js +3 -19
  503. package/.agents/scripts/providers/github/errors.js +22 -125
  504. package/.agents/scripts/providers/github/issues.js +31 -123
  505. package/.agents/scripts/providers/github/labels.js +24 -124
  506. package/.agents/scripts/providers/github/mappers.js +5 -27
  507. package/.agents/scripts/providers/github/merge-methods.js +3 -22
  508. package/.agents/scripts/providers/github/project-board.js +2 -17
  509. package/.agents/scripts/providers/github/projects-v2-graphql.js +3 -6
  510. package/.agents/scripts/providers/github/request-helpers.js +5 -32
  511. package/.agents/scripts/providers/github/search-budget.js +9 -39
  512. package/.agents/scripts/providers/github/search-query.js +5 -26
  513. package/.agents/scripts/providers/github/sub-issue-add.js +15 -65
  514. package/.agents/scripts/providers/github/sub-issues.js +7 -36
  515. package/.agents/scripts/providers/github/tickets.js +32 -134
  516. package/.agents/scripts/providers/github.js +18 -59
  517. package/.agents/scripts/prune-plan-run-labels.js +12 -46
  518. package/.agents/scripts/quality-preview.js +35 -220
  519. package/.agents/scripts/resolve-doc-tiers.js +3 -26
  520. package/.agents/scripts/resolve-stories.js +16 -67
  521. package/.agents/scripts/resync-status-column.js +6 -25
  522. package/.agents/scripts/run-tests.js +29 -104
  523. package/.agents/scripts/single-story-close.js +23 -135
  524. package/.agents/scripts/single-story-confirm-merge.js +32 -139
  525. package/.agents/scripts/single-story-init.js +47 -209
  526. package/.agents/scripts/stories-wave-tick.js +102 -472
  527. package/.agents/scripts/sync-agentrc.js +3 -21
  528. package/.agents/scripts/sync-claude-agents.js +9 -55
  529. package/.agents/scripts/sync-claude-commands.js +20 -110
  530. package/.agents/scripts/test-wrapper.js +6 -43
  531. package/.agents/scripts/update-coverage-baseline.js +5 -22
  532. package/.agents/scripts/update-crap-baseline.js +7 -30
  533. package/.agents/scripts/update-duplication-baseline.js +16 -92
  534. package/.agents/scripts/update-maintainability-baseline.js +8 -62
  535. package/.agents/scripts/update-ticket-state.js +1 -7
  536. package/.agents/scripts/validate-skills.js +6 -26
  537. package/.agents/templates/agent-protocol.md +2 -2
  538. package/.agents/templates/docs/audit-sweep-runbook.md +3 -4
  539. package/.agents/workflows/audit-accessibility.md +4 -7
  540. package/.agents/workflows/audit-adrs.md +3 -6
  541. package/.agents/workflows/audit-architecture.md +3 -11
  542. package/.agents/workflows/audit-baselines.md +6 -9
  543. package/.agents/workflows/audit-clean-code.md +8 -12
  544. package/.agents/workflows/audit-data-model.md +3 -7
  545. package/.agents/workflows/audit-dependencies.md +4 -7
  546. package/.agents/workflows/audit-devops.md +4 -8
  547. package/.agents/workflows/audit-documentation.md +1 -4
  548. package/.agents/workflows/audit-mobile.md +4 -7
  549. package/.agents/workflows/audit-navigability.md +3 -6
  550. package/.agents/workflows/audit-performance.md +2 -4
  551. package/.agents/workflows/audit-privacy.md +4 -7
  552. package/.agents/workflows/audit-quality.md +4 -7
  553. package/.agents/workflows/audit-security.md +4 -7
  554. package/.agents/workflows/audit-seo.md +4 -7
  555. package/.agents/workflows/audit-sre.md +4 -7
  556. package/.agents/workflows/audit-to-stories.md +17 -30
  557. package/.agents/workflows/audit-ux-ui.md +4 -7
  558. package/.agents/workflows/helpers/audit-lens-core.md +1 -1
  559. package/.agents/workflows/helpers/code-quality-guardrails.md +12 -15
  560. package/.agents/workflows/helpers/deliver-digest.md +6 -4
  561. package/.agents/workflows/helpers/deliver-reference.md +114 -188
  562. package/.agents/workflows/helpers/deliver-story-reference.md +189 -533
  563. package/.agents/workflows/helpers/plan-reference.md +86 -139
  564. package/.agents/workflows/helpers/qa-core.md +12 -0
  565. package/.agents/workflows/memory-consolidate.md +1 -1
  566. package/.agents/workflows/qa-assist.md +27 -71
  567. package/.agents/workflows/qa-explore.md +19 -59
  568. package/.agents/workflows/qa-run.md +11 -33
  569. package/README.md +1 -1
  570. package/bin/mandrel.js +5 -46
  571. package/bin/postinstall.js +18 -107
  572. package/docs/CHANGELOG.md +32 -0
  573. package/lib/cli/doctor.js +11 -71
  574. package/lib/cli/init.js +26 -165
  575. package/lib/cli/migrate.js +5 -64
  576. package/lib/cli/registry.js +84 -467
  577. package/lib/cli/sync-agents.js +4 -64
  578. package/lib/cli/sync-commands.js +11 -64
  579. package/lib/cli/sync.js +34 -213
  580. package/lib/cli/uninstall.js +40 -219
  581. package/lib/cli/update.js +105 -661
  582. package/lib/cli/version-check.js +8 -72
  583. package/lib/cli/version-helpers.js +14 -87
  584. package/lib/migrations/helpers/retire-agentrc-key.js +11 -52
  585. package/lib/migrations/index.js +15 -92
  586. package/lib/migrations/steps/2.1.0-retire-mi-drop-knobs.js +2 -15
  587. package/lib/migrations/steps/2.1.0-retire-verify-concurrency-cap.js +1 -13
  588. package/lib/migrations/steps/2.11.0-retire-max-seed-words.js +2 -15
  589. package/lib/migrations/steps/2.2.0-retire-epic-ac-tags.js +9 -38
  590. package/lib/migrations/steps/2.20.0-retire-codebase-snapshot.js +1 -13
  591. package/lib/migrations/steps/2.32.0-retire-lint-baseline-command.js +2 -27
  592. package/lib/migrations/steps/2.57.0-retire-delivery-limit-knobs.js +2 -23
  593. package/lib/migrations/steps/2.57.0-retire-planning-limit-knobs.js +2 -27
  594. package/lib/migrations/steps/2.60.0-retire-audit-results-autofile.js +2 -21
  595. package/lib/migrations/steps/strip-removed-agentrc-keys.js +333 -0
  596. package/package.json +16 -14
  597. package/.agents/docs/SDLC.md +0 -590
  598. package/.agents/docs/quality-gates.md +0 -1183
  599. package/.agents/rules/known-tooling-behavior.md +0 -200
  600. package/.agents/rules/orchestration-error-handling.md +0 -61
  601. package/.agents/rules/test-seams.md +0 -59
  602. package/.agents/schemas/baselines/lighthouse.schema.json +0 -59
  603. package/.agents/schemas/baselines/lint.schema.json +0 -47
  604. package/.agents/scripts/check-action-pinning.js +0 -260
  605. package/.agents/scripts/check-audit-attribution.js +0 -302
  606. package/.agents/scripts/check-baseline-drift.js +0 -211
  607. package/.agents/scripts/check-baseline-scope.js +0 -362
  608. package/.agents/scripts/check-generated-validator.js +0 -202
  609. package/.agents/scripts/check-knip-entries.js +0 -159
  610. package/.agents/scripts/check-lifecycle-lint.js +0 -294
  611. package/.agents/scripts/check-pinned-override-notes.js +0 -102
  612. package/.agents/scripts/check-schema-references.js +0 -368
  613. package/.agents/scripts/check-test-portability.js +0 -512
  614. package/.agents/scripts/check-workflow-citations.js +0 -218
  615. package/.agents/scripts/check-workflow-cli-lint.js +0 -299
  616. package/.agents/scripts/check-workflow-timeouts.js +0 -291
  617. package/.agents/scripts/install-matrix-assert.js +0 -326
  618. package/.agents/scripts/lib/audit-advisories.js +0 -195
  619. package/.agents/scripts/lib/audit-attribution.js +0 -134
  620. package/.agents/scripts/lib/baselines/drift-detector.js +0 -351
  621. package/.agents/scripts/lib/baselines/kinds/lighthouse.js +0 -87
  622. package/.agents/scripts/lib/baselines/kinds/lint.js +0 -184
  623. package/.agents/scripts/lib/baselines/orphan-pruner.js +0 -233
  624. package/.agents/scripts/lib/baselines/scope-assert.js +0 -223
  625. package/.agents/scripts/lib/baselines/scope-inventory.js +0 -314
  626. package/.agents/scripts/lib/c8-cli-path.js +0 -21
  627. package/.agents/scripts/lib/config/gates/lighthouse.schema.js +0 -51
  628. package/.agents/scripts/lib/config/gates/lint.schema.js +0 -18
  629. package/.agents/scripts/lib/dynamic-workflow/architecture-report-contract.js +0 -70
  630. package/.agents/scripts/lib/dynamic-workflow/audit-orchestrator.js +0 -284
  631. package/.agents/scripts/lib/dynamic-workflow/clean-code-report-contract.js +0 -80
  632. package/.agents/scripts/lib/dynamic-workflow/degraded-coverage.js +0 -81
  633. package/.agents/scripts/lib/dynamic-workflow/documentation-report-contract.js +0 -87
  634. package/.agents/scripts/lib/dynamic-workflow/performance-report-contract.js +0 -74
  635. package/.agents/scripts/lib/dynamic-workflow/quality-report-contract.js +0 -90
  636. package/.agents/scripts/lib/dynamic-workflow/report-contract-core.js +0 -43
  637. package/.agents/scripts/lib/dynamic-workflow/security-report-contract.js +0 -83
  638. package/.agents/scripts/lib/fs-walk.js +0 -52
  639. package/.agents/scripts/lib/knip-config-resolver.js +0 -181
  640. package/.agents/scripts/lib/knip-entry-sync.js +0 -452
  641. package/.agents/scripts/lib/pinned-override-notes.js +0 -88
  642. package/.agents/scripts/lib/pinned-override-resolve.js +0 -212
  643. package/.agents/scripts/lib/test-isolate/cli-options.js +0 -93
  644. package/.agents/scripts/lib/test-isolate/env-snapshot-loader.js +0 -52
  645. package/.agents/scripts/lib/test-isolate/list-files.js +0 -90
  646. package/.agents/scripts/lib/test-isolate/parse-tap.js +0 -75
  647. package/.agents/scripts/lib/test-isolate/progress-log.js +0 -45
  648. package/.agents/scripts/lib/test-isolate/render-report.js +0 -97
  649. package/.agents/scripts/lib/test-isolate/run-isolate.js +0 -87
  650. package/.agents/scripts/lib/test-isolate/runner.js +0 -483
  651. package/.agents/scripts/lib/test-profile/parse-tap.js +0 -136
  652. package/.agents/scripts/lib/test-profile/render-report.js +0 -45
  653. package/.agents/scripts/lint-label-vocabulary.js +0 -214
  654. package/.agents/scripts/post-structured-comment.js +0 -127
  655. package/.agents/scripts/provision-git-hooks.js +0 -85
  656. package/.agents/scripts/prune-baseline-orphans.js +0 -181
  657. package/.agents/scripts/run-coverage.js +0 -197
  658. package/.agents/scripts/run-lint.js +0 -133
  659. package/.agents/scripts/run-test-profile.js +0 -129
  660. package/.agents/scripts/run-verify.js +0 -125
  661. package/.agents/scripts/test-isolate.js +0 -55
  662. package/.agents/scripts/update-dead-exports-baseline.js +0 -321
@@ -1,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,