mandrel 2.59.0 → 2.61.0

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