mandrel 2.60.0 → 2.62.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (662) hide show
  1. package/.agents/README.md +10 -10
  2. package/.agents/agents/story-worker.md +1 -1
  3. package/.agents/docs/agentrc-reference.json +4 -82
  4. package/.agents/docs/configuration.md +20 -87
  5. package/.agents/docs/workflows.md +1 -1
  6. package/.agents/instructions.md +1 -3
  7. package/.agents/rules/gherkin-standards.md +4 -0
  8. package/.agents/schemas/agentrc.schema.json +11 -486
  9. package/.agents/schemas/story-deliver-terminal.schema.json +10 -0
  10. package/.agents/schemas/validation-evidence.schema.json +2 -1
  11. package/.agents/scripts/README.md +14 -14
  12. package/.agents/scripts/acceptance-eval.js +32 -164
  13. package/.agents/scripts/agents-bootstrap-github.js +27 -129
  14. package/.agents/scripts/apply-quality-bootstrap.js +4 -40
  15. package/.agents/scripts/audit-baselines.js +6 -27
  16. package/.agents/scripts/audit-labels-bootstrap.js +5 -29
  17. package/.agents/scripts/audit-to-stories.js +91 -361
  18. package/.agents/scripts/boot-sweep.js +19 -72
  19. package/.agents/scripts/bootstrap.js +74 -395
  20. package/.agents/scripts/ceremony-derive.js +9 -45
  21. package/.agents/scripts/check-arch-cycles.js +14 -64
  22. package/.agents/scripts/check-baselines.js +8 -48
  23. package/.agents/scripts/check-context-budget.js +46 -172
  24. package/.agents/scripts/check-cyclomatic.js +12 -44
  25. package/.agents/scripts/check-dead-exports.js +13 -64
  26. package/.agents/scripts/check-doc-links.js +38 -186
  27. package/.agents/scripts/check-gherkin-corpus.js +24 -127
  28. package/.agents/scripts/check-test-temp-hygiene.js +28 -169
  29. package/.agents/scripts/coverage-capture.js +32 -99
  30. package/.agents/scripts/deliver-light.js +14 -101
  31. package/.agents/scripts/deliver-recover.js +6 -42
  32. package/.agents/scripts/deliver-run.js +36 -133
  33. package/.agents/scripts/diagnose-friction.js +24 -116
  34. package/.agents/scripts/drain-pending-cleanup.js +1 -1
  35. package/.agents/scripts/evidence-gate.js +23 -85
  36. package/.agents/scripts/file-ci-gap.js +10 -50
  37. package/.agents/scripts/generate-config-docs.js +30 -170
  38. package/.agents/scripts/generate-lens-checklists.js +8 -52
  39. package/.agents/scripts/generate-skills-index.js +14 -112
  40. package/.agents/scripts/generate-workflows-doc.js +10 -70
  41. package/.agents/scripts/git-cleanup.js +2 -34
  42. package/.agents/scripts/lib/Graph.js +24 -81
  43. package/.agents/scripts/lib/ITicketingProvider.js +47 -143
  44. package/.agents/scripts/lib/Logger.js +14 -76
  45. package/.agents/scripts/lib/audit-baselines/engine.js +11 -31
  46. package/.agents/scripts/lib/audit-baselines/gate-surface.js +3 -17
  47. package/.agents/scripts/lib/audit-baselines/headroom.js +4 -20
  48. package/.agents/scripts/lib/audit-baselines/hotspots.js +3 -15
  49. package/.agents/scripts/lib/audit-baselines/kinds.js +23 -89
  50. package/.agents/scripts/lib/audit-baselines/outliers.js +6 -23
  51. package/.agents/scripts/lib/audit-baselines/read.js +3 -16
  52. package/.agents/scripts/lib/audit-baselines/staleness.js +7 -26
  53. package/.agents/scripts/lib/audit-baselines/surface-entry.js +7 -28
  54. package/.agents/scripts/lib/audit-baselines/trend.js +7 -20
  55. package/.agents/scripts/lib/audit-baselines/weights.js +9 -37
  56. package/.agents/scripts/lib/audit-suite/audit-rules-reader.js +3 -18
  57. package/.agents/scripts/lib/audit-suite/checklist-threading.js +26 -124
  58. package/.agents/scripts/lib/audit-suite/dispatch-checklist.js +14 -45
  59. package/.agents/scripts/lib/audit-suite/findings.js +12 -52
  60. package/.agents/scripts/lib/audit-suite/frontmatter.js +5 -29
  61. package/.agents/scripts/lib/audit-suite/index.js +1 -15
  62. package/.agents/scripts/lib/audit-suite/lens-checklist.js +10 -45
  63. package/.agents/scripts/lib/audit-suite/lens-diff-floor.js +11 -76
  64. package/.agents/scripts/lib/audit-suite/runner.js +13 -43
  65. package/.agents/scripts/lib/audit-suite/selector.js +49 -349
  66. package/.agents/scripts/lib/audit-suite/substitutions.js +12 -40
  67. package/.agents/scripts/lib/audit-suite/workflow-loader.js +3 -15
  68. package/.agents/scripts/lib/audit-to-stories/audit-label-taxonomy.js +11 -73
  69. package/.agents/scripts/lib/audit-to-stories/audit-lenses.js +8 -37
  70. package/.agents/scripts/lib/audit-to-stories/build-story-body.js +25 -143
  71. package/.agents/scripts/lib/audit-to-stories/dedupe-against-github.js +14 -80
  72. package/.agents/scripts/lib/audit-to-stories/epic-grouping-directive.js +4 -18
  73. package/.agents/scripts/lib/audit-to-stories/finding-adapter.js +7 -40
  74. package/.agents/scripts/lib/audit-to-stories/group-findings.js +9 -39
  75. package/.agents/scripts/lib/audit-to-stories/issue-corpus.js +10 -66
  76. package/.agents/scripts/lib/audit-to-stories/issue-index.js +6 -30
  77. package/.agents/scripts/lib/audit-to-stories/issues-file.js +6 -36
  78. package/.agents/scripts/lib/audit-to-stories/ledger-commit.js +17 -69
  79. package/.agents/scripts/lib/audit-to-stories/ledger-pr.js +17 -85
  80. package/.agents/scripts/lib/audit-to-stories/ledger-record.js +10 -48
  81. package/.agents/scripts/lib/audit-to-stories/parse-audit-md.js +38 -146
  82. package/.agents/scripts/lib/audit-to-stories/seed-from-findings.js +7 -42
  83. package/.agents/scripts/lib/audit-to-stories/wire-dependencies.js +10 -57
  84. package/.agents/scripts/lib/baseline-loader.js +12 -51
  85. package/.agents/scripts/lib/baseline-schema-registry.js +5 -22
  86. package/.agents/scripts/lib/baselines/component-matcher.js +3 -12
  87. package/.agents/scripts/lib/baselines/components.js +10 -61
  88. package/.agents/scripts/lib/baselines/coverage-updater-cli.js +7 -36
  89. package/.agents/scripts/lib/baselines/crap-preview-incremental.js +5 -21
  90. package/.agents/scripts/lib/baselines/crap-preview-scan.js +19 -45
  91. package/.agents/scripts/lib/baselines/crap-updater-cli.js +16 -65
  92. package/.agents/scripts/lib/baselines/diff-scope-cli.js +5 -33
  93. package/.agents/scripts/lib/baselines/duplication-scanner.js +11 -60
  94. package/.agents/scripts/lib/baselines/env-overrides.js +12 -67
  95. package/.agents/scripts/lib/baselines/envelope.js +13 -129
  96. package/.agents/scripts/lib/baselines/exit-codes.js +6 -49
  97. package/.agents/scripts/lib/baselines/git-base.js +23 -142
  98. package/.agents/scripts/lib/baselines/kernel.js +11 -111
  99. package/.agents/scripts/lib/baselines/kinds/_crap-new-method-gate.js +9 -47
  100. package/.agents/scripts/lib/baselines/kinds/_crap-read.js +8 -51
  101. package/.agents/scripts/lib/baselines/kinds/_shared-metric.js +7 -62
  102. package/.agents/scripts/lib/baselines/kinds/bundle-size.js +8 -29
  103. package/.agents/scripts/lib/baselines/kinds/coverage.js +3 -15
  104. package/.agents/scripts/lib/baselines/kinds/crap.js +94 -415
  105. package/.agents/scripts/lib/baselines/kinds/duplication.js +4 -30
  106. package/.agents/scripts/lib/baselines/kinds/kind-factory.js +7 -53
  107. package/.agents/scripts/lib/baselines/kinds/maintainability.js +15 -80
  108. package/.agents/scripts/lib/baselines/kinds/mutation.js +12 -72
  109. package/.agents/scripts/lib/baselines/maintainability-baseline-io.js +4 -11
  110. package/.agents/scripts/lib/baselines/merge-envelopes.js +30 -146
  111. package/.agents/scripts/lib/baselines/path-canon.js +19 -128
  112. package/.agents/scripts/lib/baselines/preview-gates.js +8 -37
  113. package/.agents/scripts/lib/baselines/reader.js +14 -107
  114. package/.agents/scripts/lib/baselines/refresh-service.js +35 -252
  115. package/.agents/scripts/lib/baselines/scope.js +11 -135
  116. package/.agents/scripts/lib/baselines/writer.js +16 -149
  117. package/.agents/scripts/lib/bdd-runner-detect.js +18 -113
  118. package/.agents/scripts/lib/bdd-scenario-budget.js +9 -36
  119. package/.agents/scripts/lib/bdd-scenario-scanner.js +11 -73
  120. package/.agents/scripts/lib/bdd-step-index.js +26 -100
  121. package/.agents/scripts/lib/bootstrap/baseline-merge-driver.js +23 -103
  122. package/.agents/scripts/lib/bootstrap/branch-protection.js +2 -5
  123. package/.agents/scripts/lib/bootstrap/commit-push.js +12 -50
  124. package/.agents/scripts/lib/bootstrap/gh-preflight.js +14 -101
  125. package/.agents/scripts/lib/bootstrap/hitl-confirm.js +5 -30
  126. package/.agents/scripts/lib/bootstrap/install-ledger.js +17 -73
  127. package/.agents/scripts/lib/bootstrap/issue-forms-template.js +17 -121
  128. package/.agents/scripts/lib/bootstrap/manifest.js +15 -86
  129. package/.agents/scripts/lib/bootstrap/merge-methods.js +4 -33
  130. package/.agents/scripts/lib/bootstrap/preflight.js +12 -61
  131. package/.agents/scripts/lib/bootstrap/project-bootstrap.js +34 -235
  132. package/.agents/scripts/lib/bootstrap/prompt.js +21 -129
  133. package/.agents/scripts/lib/bootstrap/quality-bootstrap.js +27 -141
  134. package/.agents/scripts/lib/bootstrap/summary.js +1 -8
  135. package/.agents/scripts/lib/bootstrap/workflow-audit.js +11 -84
  136. package/.agents/scripts/lib/branch-name-guard.js +4 -23
  137. package/.agents/scripts/lib/changed-files.js +31 -143
  138. package/.agents/scripts/lib/checks/core-bare-clean.js +4 -24
  139. package/.agents/scripts/lib/checks/index.js +18 -101
  140. package/.agents/scripts/lib/checks/loop-health.js +11 -53
  141. package/.agents/scripts/lib/checks/state.js +16 -91
  142. package/.agents/scripts/lib/checks/story-init-not-backgrounded.js +10 -61
  143. package/.agents/scripts/lib/checks/subagent-agent-tool-required.js +14 -83
  144. package/.agents/scripts/lib/child-exec.js +39 -108
  145. package/.agents/scripts/lib/cli/standard-args.js +9 -116
  146. package/.agents/scripts/lib/cli-args.js +31 -146
  147. package/.agents/scripts/lib/cli-usage.js +5 -27
  148. package/.agents/scripts/lib/cli-utils.js +2 -12
  149. package/.agents/scripts/lib/close-validation/commands.js +13 -76
  150. package/.agents/scripts/lib/close-validation/gates.js +92 -331
  151. package/.agents/scripts/lib/close-validation/process.js +121 -151
  152. package/.agents/scripts/lib/close-validation/projections/advisories.js +5 -31
  153. package/.agents/scripts/lib/close-validation/projections/crap.js +19 -67
  154. package/.agents/scripts/lib/close-validation/projections/head-sha.js +1 -17
  155. package/.agents/scripts/lib/close-validation/projections/inputs.js +4 -34
  156. package/.agents/scripts/lib/close-validation/projections/maintainability.js +11 -58
  157. package/.agents/scripts/lib/close-validation/runner.js +53 -110
  158. package/.agents/scripts/lib/command-header.js +6 -28
  159. package/.agents/scripts/lib/config/acceptance-eval.js +4 -30
  160. package/.agents/scripts/lib/config/baselines.js +3 -14
  161. package/.agents/scripts/lib/config/ci.js +8 -38
  162. package/.agents/scripts/lib/config/commands.js +1 -15
  163. package/.agents/scripts/lib/config/defaults.js +4 -33
  164. package/.agents/scripts/lib/config/delivery-routing.js +6 -35
  165. package/.agents/scripts/lib/config/explain.js +9 -80
  166. package/.agents/scripts/lib/config/gates/coverage.schema.js +0 -12
  167. package/.agents/scripts/lib/config/gates/crap-incremental-coverage.schema.js +2 -30
  168. package/.agents/scripts/lib/config/gates/crap.schema.js +1 -34
  169. package/.agents/scripts/lib/config/gates/duplication.schema.js +1 -8
  170. package/.agents/scripts/lib/config/gates/index.js +2 -17
  171. package/.agents/scripts/lib/config/gates/maintainability.schema.js +1 -20
  172. package/.agents/scripts/lib/config/gates/mutation.schema.js +1 -7
  173. package/.agents/scripts/lib/config/gates/shared.js +4 -64
  174. package/.agents/scripts/lib/config/github.js +4 -22
  175. package/.agents/scripts/lib/config/limits.js +4 -57
  176. package/.agents/scripts/lib/config/paths.js +2 -21
  177. package/.agents/scripts/lib/config/qa.js +4 -38
  178. package/.agents/scripts/lib/config/quality.js +76 -432
  179. package/.agents/scripts/lib/config/runners.js +12 -56
  180. package/.agents/scripts/lib/config/runtime.js +13 -57
  181. package/.agents/scripts/lib/config/shared.js +2 -16
  182. package/.agents/scripts/lib/config/sync-agentrc.js +9 -50
  183. package/.agents/scripts/lib/config/temp-paths.js +40 -280
  184. package/.agents/scripts/lib/config/validate-orchestration.js +5 -17
  185. package/.agents/scripts/lib/config/worktree-isolation.js +9 -28
  186. package/.agents/scripts/lib/config-resolver.js +10 -52
  187. package/.agents/scripts/lib/config-schema-shared.js +1 -4
  188. package/.agents/scripts/lib/config-settings-schema-delivery.js +12 -294
  189. package/.agents/scripts/lib/config-settings-schema-quality.js +7 -219
  190. package/.agents/scripts/lib/config-settings-schema.js +37 -274
  191. package/.agents/scripts/lib/coverage-baseline.js +20 -110
  192. package/.agents/scripts/lib/coverage-capture-fullscope.js +12 -37
  193. package/.agents/scripts/lib/coverage-capture-incremental.js +12 -43
  194. package/.agents/scripts/lib/coverage-capture-usage.js +4 -24
  195. package/.agents/scripts/lib/coverage-capture.js +99 -224
  196. package/.agents/scripts/lib/coverage-utils.js +14 -79
  197. package/.agents/scripts/lib/cpu-pool.js +17 -123
  198. package/.agents/scripts/lib/crap-baseline-join.js +16 -88
  199. package/.agents/scripts/lib/crap-coordinates.js +6 -25
  200. package/.agents/scripts/lib/crap-engine.js +40 -153
  201. package/.agents/scripts/lib/crap-method-identity.js +16 -78
  202. package/.agents/scripts/lib/crap-utils.js +31 -155
  203. package/.agents/scripts/lib/cyclomatic-ceiling.js +14 -87
  204. package/.agents/scripts/lib/cyclomatic-scope.js +10 -50
  205. package/.agents/scripts/lib/dead-exports-knip.js +18 -56
  206. package/.agents/scripts/lib/dead-exports-mode.js +5 -24
  207. package/.agents/scripts/lib/degraded-mode.js +3 -26
  208. package/.agents/scripts/lib/dependency-parser.js +8 -40
  209. package/.agents/scripts/lib/dependency-version.js +13 -35
  210. package/.agents/scripts/lib/detect-package-manager.js +6 -36
  211. package/.agents/scripts/lib/doc-tiers.js +22 -126
  212. package/.agents/scripts/lib/duplicate-search.js +8 -72
  213. package/.agents/scripts/lib/env-loader.js +5 -27
  214. package/.agents/scripts/lib/error-redactor.js +6 -31
  215. package/.agents/scripts/lib/errors/index.js +2 -22
  216. package/.agents/scripts/lib/escomplex-ast-compat.js +22 -163
  217. package/.agents/scripts/lib/escomplex-kernel.js +21 -123
  218. package/.agents/scripts/lib/feedback-loop/graduator-core.js +93 -419
  219. package/.agents/scripts/lib/feedback-loop/prior-feedback-fetcher.js +20 -98
  220. package/.agents/scripts/lib/feedback-loop/retro-proposals-graduator.js +27 -151
  221. package/.agents/scripts/lib/findings/audit-ledger.js +23 -97
  222. package/.agents/scripts/lib/findings/classify-finding.js +14 -69
  223. package/.agents/scripts/lib/findings/promote-finding.js +14 -112
  224. package/.agents/scripts/lib/findings/provenance-field.js +11 -52
  225. package/.agents/scripts/lib/findings/route-finding.js +37 -255
  226. package/.agents/scripts/lib/findings/semantic-issue-search.js +14 -59
  227. package/.agents/scripts/lib/findings/severity.js +18 -104
  228. package/.agents/scripts/lib/format-generated-json.js +12 -44
  229. package/.agents/scripts/lib/full-suite-lock.js +160 -429
  230. package/.agents/scripts/lib/full-suite-queue.js +213 -0
  231. package/.agents/scripts/lib/gates/baseline-store.js +5 -9
  232. package/.agents/scripts/lib/gates/friction.js +1 -3
  233. package/.agents/scripts/lib/generated/agentrc-validator.js +2 -2
  234. package/.agents/scripts/lib/gh-exec.js +31 -259
  235. package/.agents/scripts/lib/git/cached-fetch.js +9 -52
  236. package/.agents/scripts/lib/git/sync-from-base.js +15 -107
  237. package/.agents/scripts/lib/git-branch-cleanup.js +14 -61
  238. package/.agents/scripts/lib/git-branch-lifecycle.js +16 -87
  239. package/.agents/scripts/lib/git-utils.js +37 -161
  240. package/.agents/scripts/lib/github/framework-repo.js +8 -71
  241. package/.agents/scripts/lib/github-url.js +2 -17
  242. package/.agents/scripts/lib/import-graph.js +11 -38
  243. package/.agents/scripts/lib/install-cmd-parser.js +4 -13
  244. package/.agents/scripts/lib/json-utils.js +3 -18
  245. package/.agents/scripts/lib/label-constants.js +16 -111
  246. package/.agents/scripts/lib/label-taxonomy.js +4 -30
  247. package/.agents/scripts/lib/maintainability-engine.js +12 -80
  248. package/.agents/scripts/lib/maintainability-unscorable.js +5 -25
  249. package/.agents/scripts/lib/maintainability-utils.js +16 -92
  250. package/.agents/scripts/lib/mandrel-catalog.js +12 -70
  251. package/.agents/scripts/lib/notifications/notifier.js +13 -38
  252. package/.agents/scripts/lib/npm-scripts.js +4 -23
  253. package/.agents/scripts/lib/observability/metrics-ledger.js +16 -76
  254. package/.agents/scripts/lib/observability/runtime-friction.js +44 -286
  255. package/.agents/scripts/lib/observability/signal-validator.js +5 -37
  256. package/.agents/scripts/lib/observability/signals-writer.js +11 -121
  257. package/.agents/scripts/lib/observability/source-classifier.js +21 -203
  258. package/.agents/scripts/lib/observability/terse-result.js +14 -47
  259. package/.agents/scripts/lib/onboard/init-tail.js +13 -74
  260. package/.agents/scripts/lib/onboard/scaffold-docs.js +11 -34
  261. package/.agents/scripts/lib/orchestration/acceptance-eval-decision.js +25 -139
  262. package/.agents/scripts/lib/orchestration/auto-merge-cwd.js +11 -66
  263. package/.agents/scripts/lib/orchestration/behind-recovery.js +10 -55
  264. package/.agents/scripts/lib/orchestration/ceremony-routing.js +5 -75
  265. package/.agents/scripts/lib/orchestration/change-set.js +7 -36
  266. package/.agents/scripts/lib/orchestration/check-baselines/phases/compare.js +9 -46
  267. package/.agents/scripts/lib/orchestration/check-baselines/phases/evaluate.js +11 -44
  268. package/.agents/scripts/lib/orchestration/check-baselines/phases/floors.js +5 -24
  269. package/.agents/scripts/lib/orchestration/check-baselines/phases/friction.js +3 -12
  270. package/.agents/scripts/lib/orchestration/check-baselines/phases/parse-args.js +5 -38
  271. package/.agents/scripts/lib/orchestration/check-baselines/phases/pipeline.js +3 -8
  272. package/.agents/scripts/lib/orchestration/check-baselines/phases/refresh-ack.js +28 -136
  273. package/.agents/scripts/lib/orchestration/check-baselines/phases/report.js +3 -13
  274. package/.agents/scripts/lib/orchestration/check-state.js +92 -0
  275. package/.agents/scripts/lib/orchestration/ci-gap-intake.js +37 -144
  276. package/.agents/scripts/lib/orchestration/ci-rerun-guard.js +42 -189
  277. package/.agents/scripts/lib/orchestration/code-review.js +24 -128
  278. package/.agents/scripts/lib/orchestration/column-sync.js +23 -111
  279. package/.agents/scripts/lib/orchestration/complexity-gate.js +42 -214
  280. package/.agents/scripts/lib/orchestration/deliver-recover.js +36 -168
  281. package/.agents/scripts/lib/orchestration/dependency-analyzer.js +4 -35
  282. package/.agents/scripts/lib/orchestration/dependency-candidates.js +9 -41
  283. package/.agents/scripts/lib/orchestration/diff-magnitude.js +25 -115
  284. package/.agents/scripts/lib/orchestration/doc-reader.js +2 -6
  285. package/.agents/scripts/lib/orchestration/docs-digest.js +13 -51
  286. package/.agents/scripts/lib/orchestration/epic-candidates.js +13 -53
  287. package/.agents/scripts/lib/orchestration/epic-checklist.js +9 -33
  288. package/.agents/scripts/lib/orchestration/epic-container.js +41 -167
  289. package/.agents/scripts/lib/orchestration/epic-expansion.js +10 -40
  290. package/.agents/scripts/lib/orchestration/epic-rollup.js +55 -207
  291. package/.agents/scripts/lib/orchestration/file-assumption-enum.js +2 -22
  292. package/.agents/scripts/lib/orchestration/file-assumptions.js +45 -253
  293. package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-detect.js +9 -46
  294. package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-reap.js +7 -57
  295. package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches.js +21 -126
  296. package/.agents/scripts/lib/orchestration/git-cleanup/phases/cli.js +2 -6
  297. package/.agents/scripts/lib/orchestration/git-cleanup/phases/fast-forward.js +1 -4
  298. package/.agents/scripts/lib/orchestration/git-cleanup/phases/filters.js +1 -5
  299. package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes-ff.js +9 -34
  300. package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes.js +41 -190
  301. package/.agents/scripts/lib/orchestration/git-cleanup/phases/merged-tip.js +9 -45
  302. package/.agents/scripts/lib/orchestration/git-cleanup/phases/parse-args.js +1 -4
  303. package/.agents/scripts/lib/orchestration/git-cleanup/phases/phase-drivers.js +19 -85
  304. package/.agents/scripts/lib/orchestration/git-cleanup/phases/prompts.js +3 -17
  305. package/.agents/scripts/lib/orchestration/git-cleanup/phases/prune.js +1 -5
  306. package/.agents/scripts/lib/orchestration/git-cleanup/phases/render.js +16 -100
  307. package/.agents/scripts/lib/orchestration/git-cleanup/phases/stashes.js +1 -4
  308. package/.agents/scripts/lib/orchestration/lease-guard-shared.js +16 -67
  309. package/.agents/scripts/lib/orchestration/lifecycle/emit-ledger-event.js +9 -33
  310. package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-flip-failed.js +8 -29
  311. package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-unlanded.js +15 -68
  312. package/.agents/scripts/lib/orchestration/light-backstop.js +11 -49
  313. package/.agents/scripts/lib/orchestration/light-escalation.js +21 -89
  314. package/.agents/scripts/lib/orchestration/light-suitability.js +26 -231
  315. package/.agents/scripts/lib/orchestration/merge-block-class.js +39 -216
  316. package/.agents/scripts/lib/orchestration/merge-poll.js +104 -377
  317. package/.agents/scripts/lib/orchestration/merge-queue.js +158 -0
  318. package/.agents/scripts/lib/orchestration/pinned-identifier-lint.js +17 -57
  319. package/.agents/scripts/lib/orchestration/plan-context.js +52 -303
  320. package/.agents/scripts/lib/orchestration/plan-critic-conditions.js +22 -79
  321. package/.agents/scripts/lib/orchestration/plan-critics-evaluate.js +5 -31
  322. package/.agents/scripts/lib/orchestration/plan-metrics.js +29 -108
  323. package/.agents/scripts/lib/orchestration/plan-navigation.js +8 -27
  324. package/.agents/scripts/lib/orchestration/plan-persist/acceptance-handle-repair.js +12 -49
  325. package/.agents/scripts/lib/orchestration/plan-persist/audit-provenance.js +18 -73
  326. package/.agents/scripts/lib/orchestration/plan-persist/changes-repair.js +14 -78
  327. package/.agents/scripts/lib/orchestration/plan-persist/cross-plan-links.js +6 -30
  328. package/.agents/scripts/lib/orchestration/plan-persist/epic-adoption.js +14 -65
  329. package/.agents/scripts/lib/orchestration/plan-persist/epic-ops.js +21 -76
  330. package/.agents/scripts/lib/orchestration/plan-persist/external-deps.js +6 -43
  331. package/.agents/scripts/lib/orchestration/plan-persist/persist-helpers.js +14 -68
  332. package/.agents/scripts/lib/orchestration/plan-persist/plan-context-source.js +9 -41
  333. package/.agents/scripts/lib/orchestration/plan-persist/run-plan-persist.js +49 -248
  334. package/.agents/scripts/lib/orchestration/plan-persist/soft-findings.js +2 -12
  335. package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +85 -368
  336. package/.agents/scripts/lib/orchestration/plan-persist/summary.js +8 -38
  337. package/.agents/scripts/lib/orchestration/plan-persist/supersede-ops.js +30 -190
  338. package/.agents/scripts/lib/orchestration/plan-persist/wave-collision-gate.js +9 -49
  339. package/.agents/scripts/lib/orchestration/plan-persist/wave-serialisation.js +7 -28
  340. package/.agents/scripts/lib/orchestration/plan-reachability.js +13 -42
  341. package/.agents/scripts/lib/orchestration/plan-run-labels/reap.js +16 -91
  342. package/.agents/scripts/lib/orchestration/plan-runner/worktree-sweep.js +16 -54
  343. package/.agents/scripts/lib/orchestration/plan-text-hygiene.js +10 -52
  344. package/.agents/scripts/lib/orchestration/planning/authoring-context.js +14 -109
  345. package/.agents/scripts/lib/orchestration/planning/memory-pool-advisory.js +11 -83
  346. package/.agents/scripts/lib/orchestration/pr-watch.js +48 -306
  347. package/.agents/scripts/lib/orchestration/project-meta-cache.js +15 -80
  348. package/.agents/scripts/lib/orchestration/project-meta-resolver.js +10 -51
  349. package/.agents/scripts/lib/orchestration/reassert-status-column.js +12 -76
  350. package/.agents/scripts/lib/orchestration/remote-verifier.js +12 -36
  351. package/.agents/scripts/lib/orchestration/resolve-stories.js +33 -164
  352. package/.agents/scripts/lib/orchestration/retro-proposals.js +66 -361
  353. package/.agents/scripts/lib/orchestration/review-base-ref.js +9 -43
  354. package/.agents/scripts/lib/orchestration/review-depth.js +12 -94
  355. package/.agents/scripts/lib/orchestration/review-providers/codex.js +10 -111
  356. package/.agents/scripts/lib/orchestration/review-providers/degraded-gates.js +13 -71
  357. package/.agents/scripts/lib/orchestration/review-providers/findings-renderer.js +7 -51
  358. package/.agents/scripts/lib/orchestration/review-providers/mi-exemptions.js +8 -53
  359. package/.agents/scripts/lib/orchestration/review-providers/native.js +30 -214
  360. package/.agents/scripts/lib/orchestration/review-providers/parse-findings.js +7 -52
  361. package/.agents/scripts/lib/orchestration/review-providers/review-depth.js +4 -33
  362. package/.agents/scripts/lib/orchestration/review-providers/review-provider-factory.js +11 -71
  363. package/.agents/scripts/lib/orchestration/review-providers/scoped-lint.js +19 -131
  364. package/.agents/scripts/lib/orchestration/review-providers/security-review.js +6 -89
  365. package/.agents/scripts/lib/orchestration/review-providers/types.js +26 -56
  366. package/.agents/scripts/lib/orchestration/review-providers/ultrareview.js +3 -46
  367. package/.agents/scripts/lib/orchestration/run-epilogue.js +40 -199
  368. package/.agents/scripts/lib/orchestration/run-scoped-config.js +13 -81
  369. package/.agents/scripts/lib/orchestration/single-story-close/close-note.js +7 -34
  370. package/.agents/scripts/lib/orchestration/single-story-close/failed-terminal.js +16 -89
  371. package/.agents/scripts/lib/orchestration/single-story-close/gate-log.js +18 -109
  372. package/.agents/scripts/lib/orchestration/single-story-close/phases/auto-merge.js +190 -280
  373. package/.agents/scripts/lib/orchestration/single-story-close/phases/base-sync.js +18 -80
  374. package/.agents/scripts/lib/orchestration/single-story-close/phases/close-validation.js +103 -97
  375. package/.agents/scripts/lib/orchestration/single-story-close/phases/code-review.js +8 -64
  376. package/.agents/scripts/lib/orchestration/single-story-close/phases/confirm-merge.js +183 -485
  377. package/.agents/scripts/lib/orchestration/single-story-close/phases/conventional-subject.js +30 -134
  378. package/.agents/scripts/lib/orchestration/single-story-close/phases/graphql-preflight.js +9 -50
  379. package/.agents/scripts/lib/orchestration/single-story-close/phases/lock-wait-pending.js +49 -0
  380. package/.agents/scripts/lib/orchestration/single-story-close/phases/normalize-pr-title.js +13 -86
  381. package/.agents/scripts/lib/orchestration/single-story-close/phases/options.js +20 -95
  382. package/.agents/scripts/lib/orchestration/single-story-close/phases/post-land.js +46 -203
  383. package/.agents/scripts/lib/orchestration/single-story-close/phases/pre-gate-steps.js +8 -50
  384. package/.agents/scripts/lib/orchestration/single-story-close/phases/pull-request.js +12 -83
  385. package/.agents/scripts/lib/orchestration/single-story-close/phases/push.js +6 -39
  386. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-block.js +1 -6
  387. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-outcome.js +4 -28
  388. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-override.js +6 -51
  389. package/.agents/scripts/lib/orchestration/single-story-close/phases/worktree-reap.js +6 -34
  390. package/.agents/scripts/lib/orchestration/single-story-close/phases/wrong-tree-guard.js +23 -121
  391. package/.agents/scripts/lib/orchestration/single-story-close/runner.js +110 -290
  392. package/.agents/scripts/lib/orchestration/single-story-lease-guard.js +15 -69
  393. package/.agents/scripts/lib/orchestration/story-body-gate.js +4 -23
  394. package/.agents/scripts/lib/orchestration/story-close/baseline-upward-writeback.js +50 -179
  395. package/.agents/scripts/lib/orchestration/story-close/context-budget-writeback.js +11 -41
  396. package/.agents/scripts/lib/orchestration/story-close/format-autofix.js +23 -311
  397. package/.agents/scripts/lib/orchestration/story-close/phases/local-lens-review.js +22 -147
  398. package/.agents/scripts/lib/orchestration/story-close/phases/review-core.js +16 -67
  399. package/.agents/scripts/lib/orchestration/story-deliver-terminal-schema.js +12 -68
  400. package/.agents/scripts/lib/orchestration/story-deliver-terminal.js +42 -201
  401. package/.agents/scripts/lib/orchestration/story-follow-ups.js +43 -245
  402. package/.agents/scripts/lib/orchestration/story-init-envelope.js +4 -23
  403. package/.agents/scripts/lib/orchestration/story-init-remote.js +2 -6
  404. package/.agents/scripts/lib/orchestration/story-reachability.js +3 -23
  405. package/.agents/scripts/lib/orchestration/task-body-validator.js +12 -126
  406. package/.agents/scripts/lib/orchestration/ticket-lease.js +28 -131
  407. package/.agents/scripts/lib/orchestration/ticket-validator-conflicts.js +15 -149
  408. package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +5 -33
  409. package/.agents/scripts/lib/orchestration/ticket-validator.js +39 -181
  410. package/.agents/scripts/lib/orchestration/ticketing/bulk.js +51 -244
  411. package/.agents/scripts/lib/orchestration/ticketing/reads.js +39 -250
  412. package/.agents/scripts/lib/orchestration/ticketing/state.js +14 -68
  413. package/.agents/scripts/lib/orchestration/ticketing/transition.js +46 -263
  414. package/.agents/scripts/lib/orchestration/ticketing.js +2 -26
  415. package/.agents/scripts/lib/orchestration/verify-credit.js +18 -79
  416. package/.agents/scripts/lib/orchestration/worktree-dirty.js +5 -30
  417. package/.agents/scripts/lib/path-security.js +3 -6
  418. package/.agents/scripts/lib/plan-phase-cleanup.js +9 -49
  419. package/.agents/scripts/lib/preflight-runner.js +13 -69
  420. package/.agents/scripts/lib/process-group.js +143 -0
  421. package/.agents/scripts/lib/project-root.js +2 -8
  422. package/.agents/scripts/lib/provider-factory.js +2 -25
  423. package/.agents/scripts/lib/qa/console-allowlist.js +10 -59
  424. package/.agents/scripts/lib/qa/qa-session.js +15 -69
  425. package/.agents/scripts/lib/qa/redact-evidence.js +18 -129
  426. package/.agents/scripts/lib/qa/resolve-qa-contract.js +26 -135
  427. package/.agents/scripts/lib/qa/resolve-selection.js +16 -84
  428. package/.agents/scripts/lib/reserved-test-ids.js +9 -47
  429. package/.agents/scripts/lib/runtime-deps/dep-resolution.js +13 -53
  430. package/.agents/scripts/lib/runtime-deps/ensure-installed.js +10 -44
  431. package/.agents/scripts/lib/runtime-deps/manifest.js +10 -30
  432. package/.agents/scripts/lib/runtime-deps/parser-major.js +15 -51
  433. package/.agents/scripts/lib/runtime-deps/preflight.js +4 -22
  434. package/.agents/scripts/lib/runtime-deps/scan-imports.js +11 -55
  435. package/.agents/scripts/lib/signals/detectors/common.js +12 -38
  436. package/.agents/scripts/lib/signals/index.js +2 -19
  437. package/.agents/scripts/lib/signals/schema.js +14 -109
  438. package/.agents/scripts/lib/signals/write.js +2 -11
  439. package/.agents/scripts/lib/single-story/confirm-merge.js +31 -72
  440. package/.agents/scripts/lib/single-story/story-merged-notify.js +8 -49
  441. package/.agents/scripts/lib/single-story-sweep/protection-ctx.js +4 -26
  442. package/.agents/scripts/lib/single-story-sweep/protection.js +13 -100
  443. package/.agents/scripts/lib/single-story-sweep/sweep-lock.js +60 -258
  444. package/.agents/scripts/lib/single-story-sweep.js +14 -97
  445. package/.agents/scripts/lib/skills/parse-skill.js +13 -59
  446. package/.agents/scripts/lib/skills/skills-index.js +8 -29
  447. package/.agents/scripts/lib/skills/walk-skill-files.js +17 -78
  448. package/.agents/scripts/lib/source-extensions.js +11 -42
  449. package/.agents/scripts/lib/source-text/strip-js-comments.js +8 -41
  450. package/.agents/scripts/lib/stdio-flush.js +9 -36
  451. package/.agents/scripts/lib/story-adjacency.js +8 -40
  452. package/.agents/scripts/lib/story-body/body-format-lints.js +22 -83
  453. package/.agents/scripts/lib/story-body/footer-block.js +11 -44
  454. package/.agents/scripts/lib/story-body/story-body.js +83 -358
  455. package/.agents/scripts/lib/temp-retention.js +42 -143
  456. package/.agents/scripts/lib/templates/decomposer-prompts.js +11 -65
  457. package/.agents/scripts/lib/test-env.js +12 -65
  458. package/.agents/scripts/lib/test-run-credit.js +10 -65
  459. package/.agents/scripts/lib/test-runner-contract.js +19 -74
  460. package/.agents/scripts/lib/test-temp.js +38 -184
  461. package/.agents/scripts/lib/test-tiers.js +12 -96
  462. package/.agents/scripts/lib/ticket-body-sections.js +21 -96
  463. package/.agents/scripts/lib/transpile.js +15 -74
  464. package/.agents/scripts/lib/util/concurrent-map.js +6 -25
  465. package/.agents/scripts/lib/util/parse-id-list.js +8 -34
  466. package/.agents/scripts/lib/util/poll-loop.js +8 -28
  467. package/.agents/scripts/lib/util/with-timeout.js +2 -11
  468. package/.agents/scripts/lib/validation-evidence.js +21 -96
  469. package/.agents/scripts/lib/wave-runner/footprint.js +17 -70
  470. package/.agents/scripts/lib/wave-runner/live-probe.js +53 -221
  471. package/.agents/scripts/lib/wave-runner/ready-set.js +72 -301
  472. package/.agents/scripts/lib/workers/crap-worker.js +11 -64
  473. package/.agents/scripts/lib/workers/maintainability-report-worker.js +8 -45
  474. package/.agents/scripts/lib/workers/maintainability-worker.js +5 -21
  475. package/.agents/scripts/lib/workers/serve-worker-messages.js +2 -18
  476. package/.agents/scripts/lib/workflow-closure.js +22 -105
  477. package/.agents/scripts/lib/workspace-provisioner.js +16 -54
  478. package/.agents/scripts/lib/worktree/git-hooks.js +15 -60
  479. package/.agents/scripts/lib/worktree/lifecycle/force-drain.js +20 -60
  480. package/.agents/scripts/lib/worktree/lifecycle/merge-reachability.js +10 -62
  481. package/.agents/scripts/lib/worktree/lifecycle/pending-cleanup.js +22 -86
  482. package/.agents/scripts/lib/worktree/lifecycle/reap.js +24 -126
  483. package/.agents/scripts/lib/worktree/lifecycle-manager.js +2 -20
  484. package/.agents/scripts/lib/worktree/node-modules-strategy.js +46 -180
  485. package/.agents/scripts/lib/worktree-manager.js +15 -40
  486. package/.agents/scripts/lint-issue-body.js +12 -68
  487. package/.agents/scripts/mandrel-update-preflight.js +10 -70
  488. package/.agents/scripts/merge-baseline.js +30 -104
  489. package/.agents/scripts/nav-registry-diff.js +22 -108
  490. package/.agents/scripts/notify.js +12 -69
  491. package/.agents/scripts/plan-context.js +27 -111
  492. package/.agents/scripts/plan-critics.js +12 -66
  493. package/.agents/scripts/plan-persist.js +31 -148
  494. package/.agents/scripts/plan-run-epilogue.js +11 -37
  495. package/.agents/scripts/pr-watch-with-update.js +76 -267
  496. package/.agents/scripts/providers/github/auth.js +3 -8
  497. package/.agents/scripts/providers/github/blocked-by-add.js +14 -61
  498. package/.agents/scripts/providers/github/board-add.js +5 -21
  499. package/.agents/scripts/providers/github/branch-protection.js +11 -43
  500. package/.agents/scripts/providers/github/cache.js +2 -14
  501. package/.agents/scripts/providers/github/comments.js +7 -40
  502. package/.agents/scripts/providers/github/compose.js +3 -19
  503. package/.agents/scripts/providers/github/errors.js +22 -125
  504. package/.agents/scripts/providers/github/issues.js +31 -123
  505. package/.agents/scripts/providers/github/labels.js +24 -124
  506. package/.agents/scripts/providers/github/mappers.js +5 -27
  507. package/.agents/scripts/providers/github/merge-methods.js +3 -22
  508. package/.agents/scripts/providers/github/project-board.js +2 -17
  509. package/.agents/scripts/providers/github/projects-v2-graphql.js +3 -6
  510. package/.agents/scripts/providers/github/request-helpers.js +5 -32
  511. package/.agents/scripts/providers/github/search-budget.js +9 -39
  512. package/.agents/scripts/providers/github/search-query.js +5 -26
  513. package/.agents/scripts/providers/github/sub-issue-add.js +15 -65
  514. package/.agents/scripts/providers/github/sub-issues.js +7 -36
  515. package/.agents/scripts/providers/github/tickets.js +32 -134
  516. package/.agents/scripts/providers/github.js +18 -59
  517. package/.agents/scripts/prune-plan-run-labels.js +12 -46
  518. package/.agents/scripts/quality-preview.js +35 -220
  519. package/.agents/scripts/resolve-doc-tiers.js +3 -26
  520. package/.agents/scripts/resolve-stories.js +16 -67
  521. package/.agents/scripts/resync-status-column.js +6 -25
  522. package/.agents/scripts/run-tests.js +29 -104
  523. package/.agents/scripts/single-story-close.js +23 -135
  524. package/.agents/scripts/single-story-confirm-merge.js +32 -139
  525. package/.agents/scripts/single-story-init.js +47 -209
  526. package/.agents/scripts/stories-wave-tick.js +102 -472
  527. package/.agents/scripts/sync-agentrc.js +3 -21
  528. package/.agents/scripts/sync-claude-agents.js +9 -55
  529. package/.agents/scripts/sync-claude-commands.js +20 -110
  530. package/.agents/scripts/test-wrapper.js +6 -43
  531. package/.agents/scripts/update-coverage-baseline.js +5 -22
  532. package/.agents/scripts/update-crap-baseline.js +7 -30
  533. package/.agents/scripts/update-duplication-baseline.js +16 -92
  534. package/.agents/scripts/update-maintainability-baseline.js +8 -62
  535. package/.agents/scripts/update-ticket-state.js +1 -7
  536. package/.agents/scripts/validate-skills.js +6 -26
  537. package/.agents/templates/agent-protocol.md +2 -2
  538. package/.agents/templates/docs/audit-sweep-runbook.md +3 -4
  539. package/.agents/workflows/audit-accessibility.md +4 -7
  540. package/.agents/workflows/audit-adrs.md +3 -6
  541. package/.agents/workflows/audit-architecture.md +3 -11
  542. package/.agents/workflows/audit-baselines.md +6 -9
  543. package/.agents/workflows/audit-clean-code.md +8 -12
  544. package/.agents/workflows/audit-data-model.md +3 -7
  545. package/.agents/workflows/audit-dependencies.md +4 -7
  546. package/.agents/workflows/audit-devops.md +4 -8
  547. package/.agents/workflows/audit-documentation.md +1 -4
  548. package/.agents/workflows/audit-mobile.md +4 -7
  549. package/.agents/workflows/audit-navigability.md +3 -6
  550. package/.agents/workflows/audit-performance.md +2 -4
  551. package/.agents/workflows/audit-privacy.md +4 -7
  552. package/.agents/workflows/audit-quality.md +4 -7
  553. package/.agents/workflows/audit-security.md +4 -7
  554. package/.agents/workflows/audit-seo.md +4 -7
  555. package/.agents/workflows/audit-sre.md +4 -7
  556. package/.agents/workflows/audit-to-stories.md +17 -30
  557. package/.agents/workflows/audit-ux-ui.md +4 -7
  558. package/.agents/workflows/helpers/audit-lens-core.md +1 -1
  559. package/.agents/workflows/helpers/code-quality-guardrails.md +12 -15
  560. package/.agents/workflows/helpers/deliver-digest.md +6 -4
  561. package/.agents/workflows/helpers/deliver-reference.md +114 -188
  562. package/.agents/workflows/helpers/deliver-story-reference.md +189 -533
  563. package/.agents/workflows/helpers/plan-reference.md +86 -139
  564. package/.agents/workflows/helpers/qa-core.md +12 -0
  565. package/.agents/workflows/memory-consolidate.md +1 -1
  566. package/.agents/workflows/qa-assist.md +27 -71
  567. package/.agents/workflows/qa-explore.md +19 -59
  568. package/.agents/workflows/qa-run.md +11 -33
  569. package/README.md +1 -1
  570. package/bin/mandrel.js +5 -46
  571. package/bin/postinstall.js +18 -107
  572. package/docs/CHANGELOG.md +32 -0
  573. package/lib/cli/doctor.js +11 -71
  574. package/lib/cli/init.js +26 -165
  575. package/lib/cli/migrate.js +5 -64
  576. package/lib/cli/registry.js +84 -467
  577. package/lib/cli/sync-agents.js +4 -64
  578. package/lib/cli/sync-commands.js +11 -64
  579. package/lib/cli/sync.js +34 -213
  580. package/lib/cli/uninstall.js +40 -219
  581. package/lib/cli/update.js +105 -661
  582. package/lib/cli/version-check.js +8 -72
  583. package/lib/cli/version-helpers.js +14 -87
  584. package/lib/migrations/helpers/retire-agentrc-key.js +11 -52
  585. package/lib/migrations/index.js +15 -92
  586. package/lib/migrations/steps/2.1.0-retire-mi-drop-knobs.js +2 -15
  587. package/lib/migrations/steps/2.1.0-retire-verify-concurrency-cap.js +1 -13
  588. package/lib/migrations/steps/2.11.0-retire-max-seed-words.js +2 -15
  589. package/lib/migrations/steps/2.2.0-retire-epic-ac-tags.js +9 -38
  590. package/lib/migrations/steps/2.20.0-retire-codebase-snapshot.js +1 -13
  591. package/lib/migrations/steps/2.32.0-retire-lint-baseline-command.js +2 -27
  592. package/lib/migrations/steps/2.57.0-retire-delivery-limit-knobs.js +2 -23
  593. package/lib/migrations/steps/2.57.0-retire-planning-limit-knobs.js +2 -27
  594. package/lib/migrations/steps/2.60.0-retire-audit-results-autofile.js +2 -21
  595. package/lib/migrations/steps/strip-removed-agentrc-keys.js +333 -0
  596. package/package.json +16 -14
  597. package/.agents/docs/SDLC.md +0 -590
  598. package/.agents/docs/quality-gates.md +0 -1183
  599. package/.agents/rules/known-tooling-behavior.md +0 -200
  600. package/.agents/rules/orchestration-error-handling.md +0 -61
  601. package/.agents/rules/test-seams.md +0 -59
  602. package/.agents/schemas/baselines/lighthouse.schema.json +0 -59
  603. package/.agents/schemas/baselines/lint.schema.json +0 -47
  604. package/.agents/scripts/check-action-pinning.js +0 -260
  605. package/.agents/scripts/check-audit-attribution.js +0 -302
  606. package/.agents/scripts/check-baseline-drift.js +0 -211
  607. package/.agents/scripts/check-baseline-scope.js +0 -362
  608. package/.agents/scripts/check-generated-validator.js +0 -202
  609. package/.agents/scripts/check-knip-entries.js +0 -159
  610. package/.agents/scripts/check-lifecycle-lint.js +0 -294
  611. package/.agents/scripts/check-pinned-override-notes.js +0 -102
  612. package/.agents/scripts/check-schema-references.js +0 -368
  613. package/.agents/scripts/check-test-portability.js +0 -512
  614. package/.agents/scripts/check-workflow-citations.js +0 -218
  615. package/.agents/scripts/check-workflow-cli-lint.js +0 -299
  616. package/.agents/scripts/check-workflow-timeouts.js +0 -291
  617. package/.agents/scripts/install-matrix-assert.js +0 -326
  618. package/.agents/scripts/lib/audit-advisories.js +0 -195
  619. package/.agents/scripts/lib/audit-attribution.js +0 -134
  620. package/.agents/scripts/lib/baselines/drift-detector.js +0 -351
  621. package/.agents/scripts/lib/baselines/kinds/lighthouse.js +0 -87
  622. package/.agents/scripts/lib/baselines/kinds/lint.js +0 -184
  623. package/.agents/scripts/lib/baselines/orphan-pruner.js +0 -233
  624. package/.agents/scripts/lib/baselines/scope-assert.js +0 -223
  625. package/.agents/scripts/lib/baselines/scope-inventory.js +0 -314
  626. package/.agents/scripts/lib/c8-cli-path.js +0 -21
  627. package/.agents/scripts/lib/config/gates/lighthouse.schema.js +0 -51
  628. package/.agents/scripts/lib/config/gates/lint.schema.js +0 -18
  629. package/.agents/scripts/lib/dynamic-workflow/architecture-report-contract.js +0 -70
  630. package/.agents/scripts/lib/dynamic-workflow/audit-orchestrator.js +0 -284
  631. package/.agents/scripts/lib/dynamic-workflow/clean-code-report-contract.js +0 -80
  632. package/.agents/scripts/lib/dynamic-workflow/degraded-coverage.js +0 -81
  633. package/.agents/scripts/lib/dynamic-workflow/documentation-report-contract.js +0 -87
  634. package/.agents/scripts/lib/dynamic-workflow/performance-report-contract.js +0 -74
  635. package/.agents/scripts/lib/dynamic-workflow/quality-report-contract.js +0 -90
  636. package/.agents/scripts/lib/dynamic-workflow/report-contract-core.js +0 -43
  637. package/.agents/scripts/lib/dynamic-workflow/security-report-contract.js +0 -83
  638. package/.agents/scripts/lib/fs-walk.js +0 -52
  639. package/.agents/scripts/lib/knip-config-resolver.js +0 -181
  640. package/.agents/scripts/lib/knip-entry-sync.js +0 -452
  641. package/.agents/scripts/lib/pinned-override-notes.js +0 -88
  642. package/.agents/scripts/lib/pinned-override-resolve.js +0 -212
  643. package/.agents/scripts/lib/test-isolate/cli-options.js +0 -93
  644. package/.agents/scripts/lib/test-isolate/env-snapshot-loader.js +0 -52
  645. package/.agents/scripts/lib/test-isolate/list-files.js +0 -90
  646. package/.agents/scripts/lib/test-isolate/parse-tap.js +0 -75
  647. package/.agents/scripts/lib/test-isolate/progress-log.js +0 -45
  648. package/.agents/scripts/lib/test-isolate/render-report.js +0 -97
  649. package/.agents/scripts/lib/test-isolate/run-isolate.js +0 -87
  650. package/.agents/scripts/lib/test-isolate/runner.js +0 -483
  651. package/.agents/scripts/lib/test-profile/parse-tap.js +0 -136
  652. package/.agents/scripts/lib/test-profile/render-report.js +0 -45
  653. package/.agents/scripts/lint-label-vocabulary.js +0 -214
  654. package/.agents/scripts/post-structured-comment.js +0 -127
  655. package/.agents/scripts/provision-git-hooks.js +0 -85
  656. package/.agents/scripts/prune-baseline-orphans.js +0 -181
  657. package/.agents/scripts/run-coverage.js +0 -197
  658. package/.agents/scripts/run-lint.js +0 -133
  659. package/.agents/scripts/run-test-profile.js +0 -129
  660. package/.agents/scripts/run-verify.js +0 -125
  661. package/.agents/scripts/test-isolate.js +0 -55
  662. package/.agents/scripts/update-dead-exports-baseline.js +0 -321
@@ -1,47 +1,20 @@
1
- // .agents/scripts/lib/baselines/components.js
2
- //
3
- // Story #1892 / Task #1902 — shared component resolver and row grouper.
4
- //
5
- // The "components" model lets a gate slice a baseline into named buckets
6
- // (e.g. `app`, `worker`, `infra`) so per-component floors and tolerances
7
- // can be evaluated independently. The shape is:
8
- //
9
- // components: { [name: string]: string[] } // map of name → glob list
10
- //
11
- // The canonical default — used when a gate omits `components` from its
12
- // agentrc config — is `{ '*': ['**'] }`, meaning "one bucket called `*`
13
- // matching every row". This keeps backwards compatibility with the
14
- // pre-components rollup contract: a baseline that ships only `rollup['*']`
15
- // continues to work without operator intervention.
16
- //
17
- // Globs are matched with minimatch. Overlap is allowed by design — a row
18
- // matched by two components is reported under both. Components keyed by
19
- // the literal `*` are treated as the whole-repo rollup and always match
20
- // every row regardless of declared globs.
1
+ // Component resolver and row grouper: slice a baseline into named glob
2
+ // buckets for per-component floors. The `*` component is the whole-repo
3
+ // rollup and matches every row; overlap between components is allowed.
21
4
 
22
5
  import { Minimatch } from 'minimatch';
23
6
 
24
- /** The default components map, used when a gate omits `components`. */
25
7
  const DEFAULT_COMPONENTS = Object.freeze({ '*': Object.freeze(['**']) });
26
8
 
27
9
  /**
28
- * Compiled-matcher cache for `groupRows`, keyed on the glob string.
29
- *
30
- * `groupRows` is called once per gate over the whole baseline row set — tens
31
- * of thousands of rows for `crap.json` — and the functional `minimatch()` it
32
- * used re-parsed each component glob for every single row. The component
33
- * globs come from config, so the distinct set is small and immutable; caching
34
- * the compiled matcher turns an O(rows × globs) parse into an O(globs) one
35
- * (Story #5109). Matching semantics are unchanged: same patterns, same
36
- * `{ dot: true }`.
10
+ * Compiled matchers keyed by glob: `groupRows` runs over tens of thousands of
11
+ * rows, and re-parsing each glob per row dominated its cost.
37
12
  *
38
13
  * @type {Map<string, import('minimatch').Minimatch>}
39
14
  */
40
15
  const GLOB_MATCHER_CACHE = new Map();
41
16
 
42
17
  /**
43
- * Compile (once) the `Minimatch` for one glob.
44
- *
45
18
  * @param {string} glob
46
19
  * @returns {import('minimatch').Minimatch}
47
20
  */
@@ -55,21 +28,10 @@ function matcherFor(glob) {
55
28
  }
56
29
 
57
30
  /**
58
- * Resolve the components map for a single gate config.
31
+ * Absent or empty `components` → `{ '*': ['**'] }`; non-array glob lists
32
+ * coerce to `[]`.
59
33
  *
60
- * Behaviour:
61
- * - If the gate config has no `components` key (or it's not a plain
62
- * object), return the default `{ '*': ['**'] }`.
63
- * - If `components` is present but contains no entries, also return the
64
- * default — a writer that emitted an empty `components: {}` is
65
- * functionally equivalent to "no components declared".
66
- * - Otherwise pass the operator-declared map through unchanged. Each
67
- * value MUST be an array of glob strings; non-array values are
68
- * coerced to an empty array so the grouper's caller can't crash on
69
- * malformed input.
70
- *
71
- * @param {object} [gateConfig] A single gate config slice, e.g.
72
- * `delivery.quality.gates.coverage`.
34
+ * @param {object} [gateConfig]
73
35
  * @returns {Record<string, string[]>} Components map, never null.
74
36
  */
75
37
  export function resolveComponents(gateConfig) {
@@ -96,25 +58,12 @@ function cloneDefault() {
96
58
  }
97
59
 
98
60
  /**
99
- * Group rows by component using the resolved components map.
100
- *
101
- * Matching rules:
102
- * - The component literally named `*` is the whole-repo bucket and
103
- * captures every row regardless of declared globs.
104
- * - For every other component, the row's `keyField` value is matched
105
- * against each declared glob with minimatch (using `dot: true` so
106
- * leading-dot paths participate). A row joins the bucket on first
107
- * match — but a row CAN appear in multiple buckets because we evaluate
108
- * every component (overlap is allowed).
109
- * - Rows whose `keyField` is not a non-empty string never match
110
- * any non-`*` bucket; they still land in `*`.
61
+ * A row without a string `keyField` lands only in `*`.
111
62
  *
112
63
  * @param {Array<Record<string, unknown>>} rows
113
64
  * @param {Record<string, string[]>} components
114
65
  * @param {string} [keyField='path']
115
- * The row field to feed into the matcher. Defaults to `path` (used by
116
- * lint / coverage / crap / maintainability / mutation). Use `'route'`
117
- * for lighthouse and `'bundle'` for bundle-size.
66
+ * `route` for lighthouse, `bundle` for bundle-size.
118
67
  * @returns {Record<string, Array<Record<string, unknown>>>}
119
68
  * Map of component name → matching rows, in input order.
120
69
  */
@@ -1,33 +1,15 @@
1
1
  /**
2
- * lib/baselines/coverage-updater-cli.js — the `update-coverage-baseline` CLI's
3
- * scope-flag reconciliation and its bespoke scorer.
4
- *
5
- * Story #5316: both lived inside `update-coverage-baseline.js#main`, which no
6
- * test imports, so `main` scored CRAP 30 and the inlined scorer another 30 —
7
- * two of the ten methods Story #5311's honest re-anchor made visible, both at
8
- * 0% coverage.
9
- *
10
- * **Why this is NOT the `refresh-service.js` default scorer.** Story #4293's
11
- * idiom — drop the bespoke scorer, let `refreshBaseline` resolve the canonical
12
- * default — was the obvious move here, and `buildDefaultCoverageScorer` is
13
- * behaviour-equivalent line for line. It was rejected for one reason: the
14
- * default is silent where this one speaks. A missing or unreadable coverage
15
- * artifact makes any scorer return `[]`, and `refresh-service.js` has no
16
- * empty-rows guard, so a full-scope refresh then writes an emptied baseline at
17
- * exit 0. This scorer's `[Coverage] ❌` line is currently the only signal an
18
- * operator gets that it happened. Converging would have traded a CRAP row for
19
- * a quieter failure. (The fail-open itself is real and wants its own Story —
20
- * it changes `refreshBaseline` semantics for every caller.)
2
+ * The `update-coverage-baseline` CLI's testable logic. The scorer stays
3
+ * bespoke (not the refresh-service default) because it logs when the coverage
4
+ * artifact is missing: `refreshBaseline` has no empty-rows guard, so that line
5
+ * is the only signal a full-scope refresh just wrote an empty baseline.
21
6
  */
22
7
 
23
8
  import { Logger } from '../Logger.js';
24
9
  import { parseDiffScopeFlag } from './diff-scope-cli.js';
25
10
 
26
11
  /**
27
- * Reconcile the two scope flags.
28
- *
29
- * Throws when both are present: they describe incompatible scopes, and
30
- * silently preferring one would write a baseline the operator did not ask for.
12
+ * Throws when both scope flags are present.
31
13
  *
32
14
  * @param {string[]} [argv]
33
15
  * @returns {{fullScope: boolean, diffScopeRef: string|null}}
@@ -44,16 +26,8 @@ export function resolveCoverageUpdaterScope(argv = []) {
44
26
  }
45
27
 
46
28
  /**
47
- * Build the scorer `refreshBaseline` invokes.
48
- *
49
- * Reads `coverage-final.json`, narrows to the c8 include/exclude scope so the
50
- * baseline records exactly the files coverage is measured over, and — in diff
51
- * mode — narrows again to the service-resolved in-scope list so untouched rows
52
- * are preserved rather than re-scored.
53
- *
54
- * The three collaborators are named seams (`rules/test-seams.md`) so a test
55
- * drives the whole scorer with no coverage artifact and no `.c8rc.cjs` on
56
- * disk.
29
+ * Narrows to the c8 include/exclude scope, and in diff mode to the in-scope
30
+ * files so untouched rows are preserved rather than re-scored.
57
31
  *
58
32
  * @param {string} cwd
59
33
  * @param {{readCoverage: Function, loadScope: Function, buildScope: Function,
@@ -70,8 +44,6 @@ export function buildCoverageUpdaterScorer(
70
44
  try {
71
45
  raw = readCoverage(effectiveCwd);
72
46
  } catch (err) {
73
- // The only operator-facing signal that the refresh is about to record
74
- // nothing — see this module's header.
75
47
  logger.error(`[Coverage] ❌ ${err.message}`);
76
48
  return [];
77
49
  }
@@ -86,7 +58,6 @@ export function buildCoverageUpdaterScorer(
86
58
  }),
87
59
  });
88
60
 
89
- // In diff mode, further narrow to the service-resolved in-scope file list.
90
61
  const inScope =
91
62
  !opts?.fullScope && Array.isArray(files) && files.length > 0
92
63
  ? new Set(files)
@@ -1,27 +1,11 @@
1
- /**
2
- * crap-preview-incremental.js — resolve `runCrapPreview`'s incremental-join
3
- * `scanAndScore` input (Story #4981).
4
- *
5
- * Split into its own file (rather than added inline to `preview-gates.js`)
6
- * so the Story's opt-in wiring lands as new code, not a same-file expansion
7
- * of the pre-existing preview runner.
8
- */
9
1
  import { getChangedFiles, resolveChangedFilesRef } from '../changed-files.js';
10
2
 
11
3
  /**
12
- * Resolve the `incremental` option `scanAndScore` (`crap-utils.js`) expects,
13
- * or `null` when incremental mode is disabled or the changed-files ref could
14
- * not be resolved — a resolution failure falls back to full-scope rather
15
- * than silently relaxing the gate.
16
- *
17
- * The join's ref comes from `resolveChangedFilesRef` (Story #5365), the same
18
- * rule capture applies: the `--changed-since` ref the preview was handed wins
19
- * over a configured `baseRef`, so one hook invocation cannot resolve two.
20
- *
21
- * Gated by `incrementalCoverage.baselineJoin` alone (Story #5173). It MUST
22
- * NOT consult `skipWhenUnchanged`: the join loosens what the gate demands,
23
- * while the skip only decides whether a capture runs, so a consumer that took
24
- * the saving has not thereby asked for the loosening.
4
+ * The `incremental` option for `scanAndScore`, or `null` (full scope) when
5
+ * disabled or the changed-files ref fails — never a silently relaxed gate.
6
+ * The preview's `--changed-since` ref wins over configured `baseRef`, so one
7
+ * hook invocation resolves one ref. Gated by `baselineJoin` alone, never
8
+ * `skipWhenUnchanged`: skipping a capture is not consent to loosen the gate.
25
9
  *
26
10
  * @param {{
27
11
  * crap: { incrementalCoverage?: { baselineJoin?: boolean, baseRef?: string } },
@@ -1,13 +1,6 @@
1
1
  /**
2
- * crap-preview-scan.js — the scan → compare → report tail of
3
- * `preview-gates.js#runCrapPreview`, once its baseline is loaded and judged
4
- * compatible.
5
- *
6
- * Hoisted out of `runCrapPreview` verbatim (Story #4981) so that function's
7
- * cyclomatic complexity does not grow with the incremental-mode wiring
8
- * alongside it — this is a relocation of pre-existing logic, not new
9
- * behaviour; the incremental resolution itself is the only Story #4981
10
- * addition (see `resolveCrapPreviewIncremental`).
2
+ * The scan → compare → report tail of `preview-gates.js#runCrapPreview`, once
3
+ * its baseline is loaded and judged compatible.
11
4
  */
12
5
  import path from 'node:path';
13
6
  import { loadCoverage } from '../coverage-utils.js';
@@ -28,9 +21,6 @@ import {
28
21
  } from './kinds/crap.js';
29
22
 
30
23
  /**
31
- * Narrow a CRAP baseline to the rows whose file path is in `scopeSet`,
32
- * or return all rows when no diff-scope filter is active.
33
- *
34
24
  * @param {{ rows: object[] }} baseline
35
25
  * @param {Set<string>|null|undefined} scopeSet
36
26
  * @returns {object[]}
@@ -42,9 +32,6 @@ function resolveBaselineRows(baseline, scopeSet) {
42
32
  }
43
33
 
44
34
  /**
45
- * Return true when the CRAP compare result contains regressions or new
46
- * violations — i.e. when the preview gate should exit non-zero.
47
- *
48
35
  * @param {{ regressions: number, newViolations: number }} result
49
36
  * @returns {boolean}
50
37
  */
@@ -53,25 +40,8 @@ function hasCrapRegressions(result) {
53
40
  }
54
41
 
55
42
  /**
56
- * Scan `crap.targetDirs`, compare against the (already compatibility-judged)
57
- * baseline, and build the `--json` envelope — the exact pre-#4981 tail of
58
- * `runCrapPreview`, now including the Story #4981 incremental-join opt-in.
59
- *
60
- * @param {{
61
- * crap: object,
62
- * cwd: string,
63
- * scopeSet: Set<string>|null,
64
- * scope: string,
65
- * diffRef: string|null,
66
- * baseline: { rows: object[] },
67
- * }} opts
68
- * @returns {Promise<{ exitCode: number, envelope: object }>}
69
- */
70
- /**
71
- * The scanned methods at or over the fixed cyclomatic ceiling (Story #5313),
72
- * as advisories: `quality-preview.js` lists them and exits 0 on them, so the
73
- * reading reaches the author without the preview ever refusing a commit on
74
- * complexity alone. Pure.
43
+ * Methods at or over the cyclomatic ceiling, as advisories only: the preview
44
+ * never refuses a commit on complexity; `check-cyclomatic.js` enforces. Pure.
75
45
  *
76
46
  * @param {Array<{ file: string, method: string, startLine: number, cyclomatic: number }>} rows
77
47
  * @returns {Array<{ file: string, method: string, startLine: number, cyclomatic: number }>}
@@ -87,6 +57,17 @@ export function listCyclomaticAdvisories(rows) {
87
57
  }));
88
58
  }
89
59
 
60
+ /**
61
+ * @param {{
62
+ * crap: object,
63
+ * cwd: string,
64
+ * scopeSet: Set<string>|null,
65
+ * scope: string,
66
+ * diffRef: string|null,
67
+ * baseline: { rows: object[] },
68
+ * }} opts
69
+ * @returns {Promise<{ exitCode: number, envelope: object }>}
70
+ */
90
71
  export async function computeCrapPreviewScan({
91
72
  crap,
92
73
  cwd,
@@ -102,11 +83,8 @@ export async function computeCrapPreviewScan({
102
83
  const requireCoverage = crap.requireCoverage !== false;
103
84
  const coveragePath = crap.coveragePath ?? 'coverage/coverage-final.json';
104
85
  const coverage = loadCoverage(path.resolve(cwd, coveragePath));
105
- // Story #4731 (AC-3) — feed the CRAP regression compare the *configured*
106
- // crap tolerance (env override → `gates.crap.tolerance` → framework default)
107
- // so `compareCrap` demotes positive deltas at or under tolerance rather than
108
- // failing on any positive delta; over-tolerance deltas still fail. This keeps
109
- // the pre-commit/pre-push preview aligned with the authoritative gate.
86
+ // The configured tolerance keeps the preview aligned with the authoritative
87
+ // gate: deltas at or under it are demoted, not failed.
110
88
  const { newMethodCeiling, tolerance } = resolveCrapEnvOverrides(
111
89
  crap,
112
90
  process.env,
@@ -141,13 +119,9 @@ export async function computeCrapPreviewScan({
141
119
  newMethodCeiling,
142
120
  scopeInfo: { scope, diffRef },
143
121
  });
144
- // Story #5313: a method at or over the cyclomatic ceiling is an ADVISORY
145
- // on the preview — reported, never a verdict. The ratchet in
146
- // `check-cyclomatic.js` owns enforcement.
147
122
  envelope.cyclomaticAdvisories = listCyclomaticAdvisories(scan.rows);
148
- // Story #4866 (AC-5): above the drifted-row ratio the basis is self-
149
- // evidently unsound and every per-method verdict below it is an artefact of
150
- // a mis-keyed join. Say so once, by name, and fail open.
123
+ // Above the drifted-row ratio every verdict is an artefact of a mis-keyed
124
+ // join: say so once and fail open.
151
125
  const basis = assessComparisonBasis(result);
152
126
  if (!basis.sound) {
153
127
  return {
@@ -1,26 +1,8 @@
1
1
  /**
2
- * lib/baselines/crap-updater-cli.js — the `update-crap-baseline` CLI's own
3
- * logic: flag parsing, option defaulting, and the bespoke scorer it hands
4
- * `refreshBaseline`.
5
- *
6
- * Story #5316: all three lived inside `update-crap-baseline.js#main`, which no
7
- * test imports. `parseCliArgs` scored CRAP 56, the inlined scorer 72, and
8
- * `main` itself 90 — three of the ten methods Story #5311's honest re-anchor
9
- * made visible, every one at 0% coverage. They sit here for the same reason
10
- * `diff-scope-cli.js` does: a CLI shell is unreachable from a test, and the
11
- * import from the CLI is what keeps these off the `dead-exports:production`
12
- * ratchet.
13
- *
14
- * **Why this is NOT the `refresh-service.js` default scorer.** The service
15
- * already resolves a `buildDefaultCrapScorer`, and Story #4293 made
16
- * `update-maintainability-baseline.js` drop its bespoke scorer in favour of
17
- * exactly that. This one cannot follow: it carries `checkResolutionFloor`, a
18
- * fail-closed refusal that throws before anything is written when too few
19
- * methods resolved a coverage entry — the guard that stops a broken join being
20
- * persisted as a sparse baseline (Story #4775). Moving that into the shared
21
- * default would change behaviour for `refresh-commit.js` and close-validation,
22
- * which resolve the same default. So the scorer stays bespoke, and is tested
23
- * here instead.
2
+ * The `update-crap-baseline` CLI's testable logic: flags, options and its
3
+ * scorer. The scorer stays bespoke (not the refresh-service default) because
4
+ * its fail-closed resolution floor must not change behaviour for the other
5
+ * callers of that default.
24
6
  */
25
7
 
26
8
  import path from 'node:path';
@@ -28,18 +10,13 @@ import { checkResolutionFloor, scanAndScore } from '../crap-utils.js';
28
10
  import { Logger } from '../Logger.js';
29
11
  import { parseDiffScopeFlag } from './diff-scope-cli.js';
30
12
 
31
- /** Coverage artifact read when neither the flag nor config names one. */
32
13
  const DEFAULT_COVERAGE_PATH = 'coverage/coverage-final.json';
33
14
 
34
- /** Resolution-rate floor applied when config does not set one. */
35
15
  const DEFAULT_MIN_RESOLUTION_RATE = 0.75;
36
16
 
37
17
  /**
38
- * Parse the updater's argv.
39
- *
40
- * `--full-scope` and `--diff-scope <ref>` are read here but deliberately NOT
41
- * reconciled — {@link resolveCrapUpdaterOptions} owns the refusal, so a caller
42
- * cannot get a half-validated shape by calling only this.
18
+ * Scope flags are not reconciled here; {@link resolveCrapUpdaterOptions} owns
19
+ * that refusal.
43
20
  *
44
21
  * @param {string[]} [argv]
45
22
  * @returns {{baselinePath: string|undefined, coveragePath: string|undefined,
@@ -67,22 +44,13 @@ export function parseCrapUpdaterArgs(argv = []) {
67
44
  }
68
45
 
69
46
  /**
70
- * Fold parsed args over the project's quality config into the one shape the
71
- * CLI and the scorer both read.
72
- *
73
- * Every flag wins over config, and config over the built-in default — the
74
- * precedence that used to be a chain of `??` inside `main`, which is most of
75
- * why `main` was cyclomatic 9.
76
- *
77
- * Throws on `--full-scope` together with `--diff-scope`: the two describe
78
- * incompatible scopes and silently preferring one would write a baseline the
79
- * operator did not ask for.
47
+ * Flag → config → default. Throws on `--full-scope` with `--diff-scope`:
48
+ * silently preferring one would write a baseline nobody asked for.
80
49
  *
81
50
  * @param {{baselinePath?: string, coveragePath?: string, fullScope?: boolean,
82
- * diffScopeRef?: string|null}} args From {@link parseCrapUpdaterArgs}.
83
- * @param {{crap?: object, baselines?: object}} sources Resolved config slices:
84
- * `crap` is the quality block, `baselines` the baselines block.
85
- * @param {string} [cwd] Root the baseline path is resolved against.
51
+ * diffScopeRef?: string|null}} args
52
+ * @param {{crap?: object, baselines?: object}} sources
53
+ * @param {string} [cwd]
86
54
  * @returns {{targetDirs: string[], ignoreGlobs: string[],
87
55
  * requireCoverage: boolean, minMethodResolutionRate: number,
88
56
  * coveragePath: string, baselinePath: string, absBaselinePath: string,
@@ -118,13 +86,8 @@ export function resolveCrapUpdaterOptions(
118
86
  }
119
87
 
120
88
  /**
121
- * Report a scan's drop counters. Each earns a line only when it moved, so a
122
- * clean scan stays quiet.
123
- *
124
- * `unscorableFiles` (Story #5311) is the one that must never be silent: a file
125
- * the scan could not read, transpile or parse contributes no rows, so without
126
- * a line of its own the run reads as a clean scan of a tree with fewer methods
127
- * than it has.
89
+ * Non-zero drop counters only. `unscorableFiles` must be reported, or the run
90
+ * reads as a clean scan of a smaller tree.
128
91
  *
129
92
  * @param {{skippedFilesNoCoverage?: number, skippedMethodsNoCoverage?: number,
130
93
  * unscorableFiles?: number, resolution?: object}} summary
@@ -158,19 +121,9 @@ function reportScanSummary(summary, logger = Logger) {
158
121
  }
159
122
 
160
123
  /**
161
- * Build the scorer `refreshBaseline` invokes.
162
- *
163
- * Fails closed twice, and both refusals are the point of keeping this bespoke:
164
- *
165
- * - **No coverage artifact under `requireCoverage`** — every file would be
166
- * skipped, so the scan is abandoned with an operator-facing warning rather
167
- * than returning a confidently empty row set.
168
- * - **Resolution rate below the floor** — `checkResolutionFloor` throws
169
- * BEFORE the service writes anything. A baseline built from a broken join
170
- * is not sparse, it is wrong.
171
- *
172
- * `loadCoverage` and the logger are named seams so a test drives the whole
173
- * scorer without a coverage artifact on disk (`rules/test-seams.md`).
124
+ * Fails closed on a missing coverage artifact under `requireCoverage` (warn,
125
+ * no rows) and on a resolution rate below the floor (throws before anything is
126
+ * written: a broken join is wrong, not sparse).
174
127
  *
175
128
  * @param {ReturnType<typeof resolveCrapUpdaterOptions>} options
176
129
  * @param {{loadCoverage: Function, scan?: Function, logger?: object}} deps
@@ -208,8 +161,6 @@ export function buildCrapUpdaterScorer(
208
161
  logger.info(`[CRAP] Scanned ${summary.scannedFiles} file(s).`);
209
162
  reportScanSummary(summary, logger);
210
163
 
211
- // Fail closed BEFORE the service persists anything — a thin baseline is
212
- // never written and then apologised for.
213
164
  const refusal = checkResolutionFloor(
214
165
  summary.resolution,
215
166
  options.minMethodResolutionRate,
@@ -1,40 +1,12 @@
1
1
  /**
2
- * lib/baselines/diff-scope-cli.js — shared `--diff-scope <ref>` parser for
3
- * the manual baseline-update CLIs (Story #1974 / Task #1986, Epic #1943).
4
- *
5
- * `update-coverage-baseline.js`, `update-crap-baseline.js`,
6
- * `update-maintainability-baseline.js`, and
7
- * `update-duplication-baseline.js` all accept an opt-in `--diff-scope <ref>`
8
- * flag. When supplied, the baseline write narrows to files changed since
9
- * `<ref>`; out-of-scope rows are preserved verbatim from the prior on-disk
10
- * baseline.
11
- *
12
- * The helper is shared to keep the flag's contract identical across the four
13
- * scripts: one argv parser, one spelling, one error message.
14
- *
15
- * **Scope of this module, post-Story #4944.** It parses the flag and nothing
16
- * else. Everything downstream of the parse — resolving the changed-file set,
17
- * reading the prior envelope, and assembling the writer call — used to live
18
- * here too, in `buildWriterScopeArgs` and its helpers. Those were the
19
- * pre-service path; `lib/baselines/refresh-service.js` owns all of it now
20
- * (`resolveScope`, `readPriorEnvelope`, and the `writer.write()` handoff),
21
- * and `refreshBaseline()` derives its own diff via `execFile` rather than
22
- * `spawnSync`. `update-duplication-baseline.js` was the last caller of the
23
- * legacy path; when it migrated, the whole write-side half of this module
24
- * became unreachable and was removed rather than left shipped-but-uncalled.
25
- *
26
- * Note for anyone tracing the per-kind prior-row reader that used to live
27
- * here: it is gone, not relocated. The service reads the prior envelope
28
- * kind-agnostically (any `{ rows: [], rollup: {} }` document), so the
29
- * per-kind row-shape filter it needed no longer has a job to do.
2
+ * The shared `--diff-scope <ref>` flag parser for the baseline-update CLIs:
3
+ * one spelling, one error message. Scope resolution lives in
4
+ * `refresh-service.js`.
30
5
  */
31
6
 
32
7
  /**
33
- * Parse `--diff-scope <ref>` (and the legacy `--diff-scope=<ref>` form)
34
- * from an argv slice. Returns `null` when the flag is absent. Throws a
35
- * TypeError when the flag is supplied without a value.
36
- *
37
- * Pure; no I/O.
8
+ * Accepts `--diff-scope <ref>` and `--diff-scope=<ref>`; `null` when absent.
9
+ * Throws a TypeError when the value is missing. Pure.
38
10
  *
39
11
  * @param {string[]} argv
40
12
  * @returns {string | null}
@@ -1,28 +1,5 @@
1
1
  /**
2
- * duplication-scanner.js — code-duplication (DRY) scanner for the
3
- * duplication baseline (Story #3664).
4
- *
5
- * Wraps the jscpd clone detector behind two pure-ish seams so the
6
- * refresh script and its unit tests can exercise the parse→envelope path
7
- * without spawning a real scan:
8
- *
9
- * - `buildDuplicationRows(clones, fileLineCounts, cwd)` — PURE. Folds
10
- * jscpd's clone-pair output into per-file `{ path, duplicatedLines,
11
- * totalLines, percentage }` rows. Overlapping clones on the same file
12
- * are unioned (line-set), so a line duplicated by two different clones
13
- * counts once. Every file the scan visited gets a row — files with no
14
- * clones land at `duplicatedLines: 0` so the baseline records the full
15
- * denominator and a later regression on a previously-clean file is
16
- * visible.
17
- *
18
- * - `scanDuplication({ targetDirs, cwd, minTokens, detect, readLineCount })`
19
- * — the I/O wrapper. Walks `targetDirs`, runs the injected `detect`
20
- * (jscpd's `detectClones` by default), reads per-file line counts, and
21
- * returns the projected rows. The `detect` and `readLineCount` seams
22
- * are injectable so tests run fully offline.
23
- *
24
- * Lower duplication is better — see `kinds/duplication.js` and the gate's
25
- * `lte` floor direction in `check-baselines/phases/floors.js`.
2
+ * jscpd-backed scanner for the duplication baseline (lower is better).
26
3
  */
27
4
 
28
5
  import { readFileSync } from 'node:fs';
@@ -35,16 +12,9 @@ const DEFAULT_FORMATS = Object.freeze(['javascript']);
35
12
  const require = createRequire(import.meta.url);
36
13
 
37
14
  /**
38
- * Resolve jscpd's `detectClones` lazily. The jscpd ESM entrypoint has a
39
- * broken transitive `colors/safe` specifier under Node's strict ESM
40
- * resolver, so we load the CJS build via `createRequire`. Isolated behind a
41
- * function so the rest of the module stays import-pure and testable — no
42
- * importer of this file pays the jscpd load unless it actually scans.
43
- *
44
- * Lives here rather than in `update-duplication-baseline.js` since Story
45
- * #4944: the refresh service's default duplication scorer needs the same
46
- * seam, and a second copy in the CLI would be the classic "two
47
- * implementations of one probe" divergence.
15
+ * Lazy CJS load: jscpd's ESM entry has a broken transitive `colors/safe`
16
+ * specifier under strict ESM resolution, and importers that never scan should
17
+ * not pay the load.
48
18
  *
49
19
  * @returns {(opts: object) => Promise<Array<object>>}
50
20
  */
@@ -59,9 +29,7 @@ export function resolveDetectClones() {
59
29
  }
60
30
 
61
31
  /**
62
- * Normalise a jscpd `sourceId` (or any path) to a canonical POSIX
63
- * repo-relative path. jscpd already emits cwd-relative paths, but a future
64
- * jscpd bump (or an absolute `sourceId`) is defended against here.
32
+ * POSIX repo-relative path, defending against an absolute `sourceId`.
65
33
  *
66
34
  * @param {string} sourceId
67
35
  * @param {string} cwd
@@ -76,9 +44,6 @@ export function relativisePath(sourceId, cwd) {
76
44
  }
77
45
 
78
46
  /**
79
- * Count the inclusive line span a clone covers: `end.line - start.line + 1`.
80
- * jscpd reports 1-based line numbers; a single-line clone spans one line.
81
- *
82
47
  * @param {{ start?: { line?: number }, end?: { line?: number } }} dup
83
48
  * @returns {Array<number>} the 1-based line numbers the clone covers
84
49
  */
@@ -94,16 +59,12 @@ function cloneLineNumbers(dup) {
94
59
  }
95
60
 
96
61
  /**
97
- * PURE: fold jscpd clone pairs + per-file line counts into canonical
98
- * duplication rows. Both sides of every clone pair (`duplicationA` and
99
- * `duplicationB`) contribute their covered lines to their respective
100
- * file's duplicated-line set, so a file that is only ever the "B" side of
101
- * a clone still accrues duplication.
62
+ * Pure. Both sides of each clone pair accrue lines; overlapping clones are
63
+ * unioned per file so a line counts once. Every counted file gets a row.
102
64
  *
103
65
  * @param {Array<{duplicationA?: object, duplicationB?: object}>} clones
104
66
  * @param {Map<string, number>|Record<string, number>} fileLineCounts
105
- * per-file total line counts keyed by canonical POSIX repo-relative path
106
- * @param {string} [cwd] used to relativise absolute sourceIds
67
+ * @param {string} [cwd]
107
68
  * @returns {Array<{path: string, duplicatedLines: number, totalLines: number, percentage: number}>}
108
69
  */
109
70
  export function buildDuplicationRows(
@@ -155,10 +116,6 @@ function toLineCountMap(fileLineCounts) {
155
116
  }
156
117
 
157
118
  /**
158
- * Default per-file line counter — reads the file off disk and counts
159
- * newline-delimited lines. Injectable via `scanDuplication`'s
160
- * `readLineCount` seam so tests never touch the filesystem.
161
- *
162
119
  * @param {string} absPath
163
120
  * @returns {number}
164
121
  */
@@ -166,15 +123,12 @@ export function readLineCount(absPath) {
166
123
  const text = readFileSync(absPath, 'utf8');
167
124
  if (text.length === 0) return 0;
168
125
  const lines = text.split(/\r\n|\r|\n/);
169
- // A trailing newline produces a final empty element — drop it so the
170
- // count matches the editor's line count.
126
+ // Drop the empty element after a trailing newline.
171
127
  if (lines.length > 0 && lines[lines.length - 1] === '') lines.pop();
172
128
  return lines.length;
173
129
  }
174
130
 
175
131
  /**
176
- * Run a duplication scan over `targetDirs` and return canonical rows.
177
- *
178
132
  * @param {{
179
133
  * targetDirs: string[],
180
134
  * cwd?: string,
@@ -224,11 +178,8 @@ export async function scanDuplication({
224
178
  }
225
179
 
226
180
  /**
227
- * Collect the set of files that appear on either side of any clone pair.
228
- * jscpd's `detectClones` only reports files that participate in at least
229
- * one clone, so the scanned-but-clean files are not enumerable from the
230
- * clone list alone — the baseline therefore records exactly the files
231
- * with detected duplication. Pure helper, exported for tests.
181
+ * Files on either side of any clone. jscpd reports only participating files,
182
+ * so the baseline records exactly the files with detected duplication.
232
183
  *
233
184
  * @param {Array<object>} clones
234
185
  * @param {string} cwd