mandrel 2.60.0 → 2.61.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (661) hide show
  1. package/.agents/README.md +10 -10
  2. package/.agents/agents/story-worker.md +1 -1
  3. package/.agents/docs/agentrc-reference.json +4 -82
  4. package/.agents/docs/configuration.md +20 -87
  5. package/.agents/docs/workflows.md +1 -1
  6. package/.agents/instructions.md +1 -3
  7. package/.agents/rules/gherkin-standards.md +4 -0
  8. package/.agents/schemas/agentrc.schema.json +11 -486
  9. package/.agents/schemas/story-deliver-terminal.schema.json +10 -0
  10. package/.agents/schemas/validation-evidence.schema.json +2 -1
  11. package/.agents/scripts/README.md +14 -14
  12. package/.agents/scripts/acceptance-eval.js +32 -164
  13. package/.agents/scripts/agents-bootstrap-github.js +27 -129
  14. package/.agents/scripts/apply-quality-bootstrap.js +4 -40
  15. package/.agents/scripts/audit-baselines.js +6 -27
  16. package/.agents/scripts/audit-labels-bootstrap.js +5 -29
  17. package/.agents/scripts/audit-to-stories.js +91 -361
  18. package/.agents/scripts/boot-sweep.js +19 -72
  19. package/.agents/scripts/bootstrap.js +74 -395
  20. package/.agents/scripts/ceremony-derive.js +9 -45
  21. package/.agents/scripts/check-arch-cycles.js +14 -64
  22. package/.agents/scripts/check-baselines.js +8 -48
  23. package/.agents/scripts/check-context-budget.js +46 -172
  24. package/.agents/scripts/check-cyclomatic.js +12 -44
  25. package/.agents/scripts/check-dead-exports.js +13 -64
  26. package/.agents/scripts/check-doc-links.js +38 -186
  27. package/.agents/scripts/check-gherkin-corpus.js +24 -127
  28. package/.agents/scripts/check-test-temp-hygiene.js +28 -169
  29. package/.agents/scripts/coverage-capture.js +32 -99
  30. package/.agents/scripts/deliver-light.js +14 -101
  31. package/.agents/scripts/deliver-recover.js +6 -42
  32. package/.agents/scripts/deliver-run.js +36 -133
  33. package/.agents/scripts/diagnose-friction.js +24 -116
  34. package/.agents/scripts/drain-pending-cleanup.js +1 -1
  35. package/.agents/scripts/evidence-gate.js +23 -85
  36. package/.agents/scripts/file-ci-gap.js +10 -50
  37. package/.agents/scripts/generate-config-docs.js +30 -170
  38. package/.agents/scripts/generate-lens-checklists.js +8 -52
  39. package/.agents/scripts/generate-skills-index.js +14 -112
  40. package/.agents/scripts/generate-workflows-doc.js +10 -70
  41. package/.agents/scripts/git-cleanup.js +2 -34
  42. package/.agents/scripts/lib/Graph.js +24 -81
  43. package/.agents/scripts/lib/ITicketingProvider.js +47 -143
  44. package/.agents/scripts/lib/Logger.js +14 -76
  45. package/.agents/scripts/lib/audit-baselines/engine.js +11 -31
  46. package/.agents/scripts/lib/audit-baselines/gate-surface.js +3 -17
  47. package/.agents/scripts/lib/audit-baselines/headroom.js +4 -20
  48. package/.agents/scripts/lib/audit-baselines/hotspots.js +3 -15
  49. package/.agents/scripts/lib/audit-baselines/kinds.js +23 -89
  50. package/.agents/scripts/lib/audit-baselines/outliers.js +6 -23
  51. package/.agents/scripts/lib/audit-baselines/read.js +3 -16
  52. package/.agents/scripts/lib/audit-baselines/staleness.js +7 -26
  53. package/.agents/scripts/lib/audit-baselines/surface-entry.js +7 -28
  54. package/.agents/scripts/lib/audit-baselines/trend.js +7 -20
  55. package/.agents/scripts/lib/audit-baselines/weights.js +9 -37
  56. package/.agents/scripts/lib/audit-suite/audit-rules-reader.js +3 -18
  57. package/.agents/scripts/lib/audit-suite/checklist-threading.js +26 -124
  58. package/.agents/scripts/lib/audit-suite/dispatch-checklist.js +14 -45
  59. package/.agents/scripts/lib/audit-suite/findings.js +12 -52
  60. package/.agents/scripts/lib/audit-suite/frontmatter.js +5 -29
  61. package/.agents/scripts/lib/audit-suite/index.js +1 -15
  62. package/.agents/scripts/lib/audit-suite/lens-checklist.js +10 -45
  63. package/.agents/scripts/lib/audit-suite/lens-diff-floor.js +11 -76
  64. package/.agents/scripts/lib/audit-suite/runner.js +13 -43
  65. package/.agents/scripts/lib/audit-suite/selector.js +49 -349
  66. package/.agents/scripts/lib/audit-suite/substitutions.js +12 -40
  67. package/.agents/scripts/lib/audit-suite/workflow-loader.js +3 -15
  68. package/.agents/scripts/lib/audit-to-stories/audit-label-taxonomy.js +11 -73
  69. package/.agents/scripts/lib/audit-to-stories/audit-lenses.js +8 -37
  70. package/.agents/scripts/lib/audit-to-stories/build-story-body.js +25 -143
  71. package/.agents/scripts/lib/audit-to-stories/dedupe-against-github.js +14 -80
  72. package/.agents/scripts/lib/audit-to-stories/epic-grouping-directive.js +4 -18
  73. package/.agents/scripts/lib/audit-to-stories/finding-adapter.js +7 -40
  74. package/.agents/scripts/lib/audit-to-stories/group-findings.js +9 -39
  75. package/.agents/scripts/lib/audit-to-stories/issue-corpus.js +10 -66
  76. package/.agents/scripts/lib/audit-to-stories/issue-index.js +6 -30
  77. package/.agents/scripts/lib/audit-to-stories/issues-file.js +6 -36
  78. package/.agents/scripts/lib/audit-to-stories/ledger-commit.js +17 -69
  79. package/.agents/scripts/lib/audit-to-stories/ledger-pr.js +17 -85
  80. package/.agents/scripts/lib/audit-to-stories/ledger-record.js +10 -48
  81. package/.agents/scripts/lib/audit-to-stories/parse-audit-md.js +38 -146
  82. package/.agents/scripts/lib/audit-to-stories/seed-from-findings.js +7 -42
  83. package/.agents/scripts/lib/audit-to-stories/wire-dependencies.js +10 -57
  84. package/.agents/scripts/lib/baseline-loader.js +12 -51
  85. package/.agents/scripts/lib/baseline-schema-registry.js +5 -22
  86. package/.agents/scripts/lib/baselines/component-matcher.js +3 -12
  87. package/.agents/scripts/lib/baselines/components.js +10 -61
  88. package/.agents/scripts/lib/baselines/coverage-updater-cli.js +7 -36
  89. package/.agents/scripts/lib/baselines/crap-preview-incremental.js +5 -21
  90. package/.agents/scripts/lib/baselines/crap-preview-scan.js +19 -45
  91. package/.agents/scripts/lib/baselines/crap-updater-cli.js +16 -65
  92. package/.agents/scripts/lib/baselines/diff-scope-cli.js +5 -33
  93. package/.agents/scripts/lib/baselines/duplication-scanner.js +11 -60
  94. package/.agents/scripts/lib/baselines/env-overrides.js +12 -67
  95. package/.agents/scripts/lib/baselines/envelope.js +13 -129
  96. package/.agents/scripts/lib/baselines/exit-codes.js +6 -49
  97. package/.agents/scripts/lib/baselines/git-base.js +23 -142
  98. package/.agents/scripts/lib/baselines/kernel.js +11 -111
  99. package/.agents/scripts/lib/baselines/kinds/_crap-new-method-gate.js +9 -47
  100. package/.agents/scripts/lib/baselines/kinds/_crap-read.js +8 -51
  101. package/.agents/scripts/lib/baselines/kinds/_shared-metric.js +7 -62
  102. package/.agents/scripts/lib/baselines/kinds/bundle-size.js +8 -29
  103. package/.agents/scripts/lib/baselines/kinds/coverage.js +3 -15
  104. package/.agents/scripts/lib/baselines/kinds/crap.js +94 -415
  105. package/.agents/scripts/lib/baselines/kinds/duplication.js +4 -30
  106. package/.agents/scripts/lib/baselines/kinds/kind-factory.js +7 -53
  107. package/.agents/scripts/lib/baselines/kinds/maintainability.js +15 -80
  108. package/.agents/scripts/lib/baselines/kinds/mutation.js +12 -72
  109. package/.agents/scripts/lib/baselines/maintainability-baseline-io.js +4 -11
  110. package/.agents/scripts/lib/baselines/merge-envelopes.js +30 -146
  111. package/.agents/scripts/lib/baselines/path-canon.js +19 -128
  112. package/.agents/scripts/lib/baselines/preview-gates.js +8 -37
  113. package/.agents/scripts/lib/baselines/reader.js +14 -107
  114. package/.agents/scripts/lib/baselines/refresh-service.js +35 -252
  115. package/.agents/scripts/lib/baselines/scope.js +11 -135
  116. package/.agents/scripts/lib/baselines/writer.js +16 -149
  117. package/.agents/scripts/lib/bdd-runner-detect.js +18 -113
  118. package/.agents/scripts/lib/bdd-scenario-budget.js +9 -36
  119. package/.agents/scripts/lib/bdd-scenario-scanner.js +11 -73
  120. package/.agents/scripts/lib/bdd-step-index.js +26 -100
  121. package/.agents/scripts/lib/bootstrap/baseline-merge-driver.js +23 -103
  122. package/.agents/scripts/lib/bootstrap/branch-protection.js +2 -5
  123. package/.agents/scripts/lib/bootstrap/commit-push.js +12 -50
  124. package/.agents/scripts/lib/bootstrap/gh-preflight.js +14 -101
  125. package/.agents/scripts/lib/bootstrap/hitl-confirm.js +5 -30
  126. package/.agents/scripts/lib/bootstrap/install-ledger.js +17 -73
  127. package/.agents/scripts/lib/bootstrap/issue-forms-template.js +17 -121
  128. package/.agents/scripts/lib/bootstrap/manifest.js +15 -86
  129. package/.agents/scripts/lib/bootstrap/merge-methods.js +4 -33
  130. package/.agents/scripts/lib/bootstrap/preflight.js +12 -61
  131. package/.agents/scripts/lib/bootstrap/project-bootstrap.js +34 -235
  132. package/.agents/scripts/lib/bootstrap/prompt.js +21 -129
  133. package/.agents/scripts/lib/bootstrap/quality-bootstrap.js +27 -141
  134. package/.agents/scripts/lib/bootstrap/summary.js +1 -8
  135. package/.agents/scripts/lib/bootstrap/workflow-audit.js +11 -84
  136. package/.agents/scripts/lib/branch-name-guard.js +4 -23
  137. package/.agents/scripts/lib/changed-files.js +31 -143
  138. package/.agents/scripts/lib/checks/core-bare-clean.js +4 -24
  139. package/.agents/scripts/lib/checks/index.js +18 -101
  140. package/.agents/scripts/lib/checks/loop-health.js +11 -53
  141. package/.agents/scripts/lib/checks/state.js +16 -91
  142. package/.agents/scripts/lib/checks/story-init-not-backgrounded.js +10 -61
  143. package/.agents/scripts/lib/checks/subagent-agent-tool-required.js +14 -83
  144. package/.agents/scripts/lib/child-exec.js +39 -108
  145. package/.agents/scripts/lib/cli/standard-args.js +9 -116
  146. package/.agents/scripts/lib/cli-args.js +31 -146
  147. package/.agents/scripts/lib/cli-usage.js +5 -27
  148. package/.agents/scripts/lib/cli-utils.js +2 -12
  149. package/.agents/scripts/lib/close-validation/commands.js +13 -76
  150. package/.agents/scripts/lib/close-validation/gates.js +92 -331
  151. package/.agents/scripts/lib/close-validation/process.js +121 -151
  152. package/.agents/scripts/lib/close-validation/projections/advisories.js +5 -31
  153. package/.agents/scripts/lib/close-validation/projections/crap.js +19 -67
  154. package/.agents/scripts/lib/close-validation/projections/head-sha.js +1 -17
  155. package/.agents/scripts/lib/close-validation/projections/inputs.js +4 -34
  156. package/.agents/scripts/lib/close-validation/projections/maintainability.js +11 -58
  157. package/.agents/scripts/lib/close-validation/runner.js +53 -110
  158. package/.agents/scripts/lib/command-header.js +6 -28
  159. package/.agents/scripts/lib/config/acceptance-eval.js +4 -30
  160. package/.agents/scripts/lib/config/baselines.js +3 -14
  161. package/.agents/scripts/lib/config/ci.js +8 -38
  162. package/.agents/scripts/lib/config/commands.js +1 -15
  163. package/.agents/scripts/lib/config/defaults.js +4 -33
  164. package/.agents/scripts/lib/config/delivery-routing.js +6 -35
  165. package/.agents/scripts/lib/config/explain.js +9 -80
  166. package/.agents/scripts/lib/config/gates/coverage.schema.js +0 -12
  167. package/.agents/scripts/lib/config/gates/crap-incremental-coverage.schema.js +2 -30
  168. package/.agents/scripts/lib/config/gates/crap.schema.js +1 -34
  169. package/.agents/scripts/lib/config/gates/duplication.schema.js +1 -8
  170. package/.agents/scripts/lib/config/gates/index.js +2 -17
  171. package/.agents/scripts/lib/config/gates/maintainability.schema.js +1 -20
  172. package/.agents/scripts/lib/config/gates/mutation.schema.js +1 -7
  173. package/.agents/scripts/lib/config/gates/shared.js +4 -64
  174. package/.agents/scripts/lib/config/github.js +4 -22
  175. package/.agents/scripts/lib/config/limits.js +4 -57
  176. package/.agents/scripts/lib/config/paths.js +2 -21
  177. package/.agents/scripts/lib/config/qa.js +4 -38
  178. package/.agents/scripts/lib/config/quality.js +76 -432
  179. package/.agents/scripts/lib/config/runners.js +12 -56
  180. package/.agents/scripts/lib/config/runtime.js +13 -57
  181. package/.agents/scripts/lib/config/shared.js +2 -16
  182. package/.agents/scripts/lib/config/sync-agentrc.js +9 -50
  183. package/.agents/scripts/lib/config/temp-paths.js +40 -280
  184. package/.agents/scripts/lib/config/validate-orchestration.js +5 -17
  185. package/.agents/scripts/lib/config/worktree-isolation.js +9 -28
  186. package/.agents/scripts/lib/config-resolver.js +10 -52
  187. package/.agents/scripts/lib/config-schema-shared.js +1 -4
  188. package/.agents/scripts/lib/config-settings-schema-delivery.js +12 -294
  189. package/.agents/scripts/lib/config-settings-schema-quality.js +7 -219
  190. package/.agents/scripts/lib/config-settings-schema.js +37 -274
  191. package/.agents/scripts/lib/coverage-baseline.js +20 -110
  192. package/.agents/scripts/lib/coverage-capture-fullscope.js +12 -37
  193. package/.agents/scripts/lib/coverage-capture-incremental.js +12 -43
  194. package/.agents/scripts/lib/coverage-capture-usage.js +4 -24
  195. package/.agents/scripts/lib/coverage-capture.js +99 -224
  196. package/.agents/scripts/lib/coverage-utils.js +14 -79
  197. package/.agents/scripts/lib/cpu-pool.js +17 -123
  198. package/.agents/scripts/lib/crap-baseline-join.js +16 -88
  199. package/.agents/scripts/lib/crap-coordinates.js +6 -25
  200. package/.agents/scripts/lib/crap-engine.js +40 -153
  201. package/.agents/scripts/lib/crap-method-identity.js +16 -78
  202. package/.agents/scripts/lib/crap-utils.js +31 -155
  203. package/.agents/scripts/lib/cyclomatic-ceiling.js +14 -87
  204. package/.agents/scripts/lib/cyclomatic-scope.js +10 -50
  205. package/.agents/scripts/lib/dead-exports-knip.js +18 -56
  206. package/.agents/scripts/lib/dead-exports-mode.js +5 -24
  207. package/.agents/scripts/lib/degraded-mode.js +3 -26
  208. package/.agents/scripts/lib/dependency-parser.js +8 -40
  209. package/.agents/scripts/lib/dependency-version.js +13 -35
  210. package/.agents/scripts/lib/detect-package-manager.js +6 -36
  211. package/.agents/scripts/lib/doc-tiers.js +22 -126
  212. package/.agents/scripts/lib/duplicate-search.js +8 -72
  213. package/.agents/scripts/lib/env-loader.js +5 -27
  214. package/.agents/scripts/lib/error-redactor.js +6 -31
  215. package/.agents/scripts/lib/errors/index.js +2 -22
  216. package/.agents/scripts/lib/escomplex-ast-compat.js +22 -163
  217. package/.agents/scripts/lib/escomplex-kernel.js +21 -123
  218. package/.agents/scripts/lib/feedback-loop/graduator-core.js +93 -419
  219. package/.agents/scripts/lib/feedback-loop/prior-feedback-fetcher.js +20 -98
  220. package/.agents/scripts/lib/feedback-loop/retro-proposals-graduator.js +27 -151
  221. package/.agents/scripts/lib/findings/audit-ledger.js +23 -97
  222. package/.agents/scripts/lib/findings/classify-finding.js +14 -69
  223. package/.agents/scripts/lib/findings/promote-finding.js +14 -112
  224. package/.agents/scripts/lib/findings/provenance-field.js +11 -52
  225. package/.agents/scripts/lib/findings/route-finding.js +37 -255
  226. package/.agents/scripts/lib/findings/semantic-issue-search.js +14 -59
  227. package/.agents/scripts/lib/findings/severity.js +18 -104
  228. package/.agents/scripts/lib/format-generated-json.js +12 -44
  229. package/.agents/scripts/lib/full-suite-lock.js +160 -429
  230. package/.agents/scripts/lib/full-suite-queue.js +213 -0
  231. package/.agents/scripts/lib/gates/baseline-store.js +5 -9
  232. package/.agents/scripts/lib/gates/friction.js +1 -3
  233. package/.agents/scripts/lib/generated/agentrc-validator.js +2 -2
  234. package/.agents/scripts/lib/gh-exec.js +31 -259
  235. package/.agents/scripts/lib/git/cached-fetch.js +9 -52
  236. package/.agents/scripts/lib/git/sync-from-base.js +15 -107
  237. package/.agents/scripts/lib/git-branch-cleanup.js +14 -61
  238. package/.agents/scripts/lib/git-branch-lifecycle.js +16 -87
  239. package/.agents/scripts/lib/git-utils.js +37 -161
  240. package/.agents/scripts/lib/github/framework-repo.js +8 -71
  241. package/.agents/scripts/lib/github-url.js +2 -17
  242. package/.agents/scripts/lib/import-graph.js +11 -38
  243. package/.agents/scripts/lib/install-cmd-parser.js +4 -13
  244. package/.agents/scripts/lib/json-utils.js +3 -18
  245. package/.agents/scripts/lib/label-constants.js +16 -111
  246. package/.agents/scripts/lib/label-taxonomy.js +4 -30
  247. package/.agents/scripts/lib/maintainability-engine.js +12 -80
  248. package/.agents/scripts/lib/maintainability-unscorable.js +5 -25
  249. package/.agents/scripts/lib/maintainability-utils.js +16 -92
  250. package/.agents/scripts/lib/mandrel-catalog.js +12 -70
  251. package/.agents/scripts/lib/notifications/notifier.js +13 -38
  252. package/.agents/scripts/lib/npm-scripts.js +4 -23
  253. package/.agents/scripts/lib/observability/metrics-ledger.js +16 -76
  254. package/.agents/scripts/lib/observability/runtime-friction.js +44 -286
  255. package/.agents/scripts/lib/observability/signal-validator.js +5 -37
  256. package/.agents/scripts/lib/observability/signals-writer.js +11 -121
  257. package/.agents/scripts/lib/observability/source-classifier.js +21 -203
  258. package/.agents/scripts/lib/observability/terse-result.js +14 -47
  259. package/.agents/scripts/lib/onboard/init-tail.js +13 -74
  260. package/.agents/scripts/lib/onboard/scaffold-docs.js +11 -34
  261. package/.agents/scripts/lib/orchestration/acceptance-eval-decision.js +25 -139
  262. package/.agents/scripts/lib/orchestration/auto-merge-cwd.js +11 -66
  263. package/.agents/scripts/lib/orchestration/behind-recovery.js +10 -55
  264. package/.agents/scripts/lib/orchestration/ceremony-routing.js +5 -75
  265. package/.agents/scripts/lib/orchestration/change-set.js +7 -36
  266. package/.agents/scripts/lib/orchestration/check-baselines/phases/compare.js +9 -46
  267. package/.agents/scripts/lib/orchestration/check-baselines/phases/evaluate.js +11 -44
  268. package/.agents/scripts/lib/orchestration/check-baselines/phases/floors.js +5 -24
  269. package/.agents/scripts/lib/orchestration/check-baselines/phases/friction.js +3 -12
  270. package/.agents/scripts/lib/orchestration/check-baselines/phases/parse-args.js +5 -38
  271. package/.agents/scripts/lib/orchestration/check-baselines/phases/pipeline.js +3 -8
  272. package/.agents/scripts/lib/orchestration/check-baselines/phases/refresh-ack.js +28 -136
  273. package/.agents/scripts/lib/orchestration/check-baselines/phases/report.js +3 -13
  274. package/.agents/scripts/lib/orchestration/check-state.js +92 -0
  275. package/.agents/scripts/lib/orchestration/ci-gap-intake.js +37 -144
  276. package/.agents/scripts/lib/orchestration/ci-rerun-guard.js +42 -189
  277. package/.agents/scripts/lib/orchestration/code-review.js +24 -128
  278. package/.agents/scripts/lib/orchestration/column-sync.js +23 -111
  279. package/.agents/scripts/lib/orchestration/complexity-gate.js +42 -214
  280. package/.agents/scripts/lib/orchestration/deliver-recover.js +36 -168
  281. package/.agents/scripts/lib/orchestration/dependency-analyzer.js +4 -35
  282. package/.agents/scripts/lib/orchestration/dependency-candidates.js +9 -41
  283. package/.agents/scripts/lib/orchestration/diff-magnitude.js +25 -115
  284. package/.agents/scripts/lib/orchestration/doc-reader.js +2 -6
  285. package/.agents/scripts/lib/orchestration/docs-digest.js +13 -51
  286. package/.agents/scripts/lib/orchestration/epic-candidates.js +13 -53
  287. package/.agents/scripts/lib/orchestration/epic-checklist.js +9 -33
  288. package/.agents/scripts/lib/orchestration/epic-container.js +41 -167
  289. package/.agents/scripts/lib/orchestration/epic-expansion.js +10 -40
  290. package/.agents/scripts/lib/orchestration/epic-rollup.js +55 -207
  291. package/.agents/scripts/lib/orchestration/file-assumption-enum.js +2 -22
  292. package/.agents/scripts/lib/orchestration/file-assumptions.js +45 -253
  293. package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-detect.js +9 -46
  294. package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-reap.js +7 -57
  295. package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches.js +21 -126
  296. package/.agents/scripts/lib/orchestration/git-cleanup/phases/cli.js +2 -6
  297. package/.agents/scripts/lib/orchestration/git-cleanup/phases/fast-forward.js +1 -4
  298. package/.agents/scripts/lib/orchestration/git-cleanup/phases/filters.js +1 -5
  299. package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes-ff.js +9 -34
  300. package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes.js +41 -190
  301. package/.agents/scripts/lib/orchestration/git-cleanup/phases/merged-tip.js +9 -45
  302. package/.agents/scripts/lib/orchestration/git-cleanup/phases/parse-args.js +1 -4
  303. package/.agents/scripts/lib/orchestration/git-cleanup/phases/phase-drivers.js +19 -85
  304. package/.agents/scripts/lib/orchestration/git-cleanup/phases/prompts.js +3 -17
  305. package/.agents/scripts/lib/orchestration/git-cleanup/phases/prune.js +1 -5
  306. package/.agents/scripts/lib/orchestration/git-cleanup/phases/render.js +16 -100
  307. package/.agents/scripts/lib/orchestration/git-cleanup/phases/stashes.js +1 -4
  308. package/.agents/scripts/lib/orchestration/lease-guard-shared.js +16 -67
  309. package/.agents/scripts/lib/orchestration/lifecycle/emit-ledger-event.js +9 -33
  310. package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-flip-failed.js +8 -29
  311. package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-unlanded.js +15 -68
  312. package/.agents/scripts/lib/orchestration/light-backstop.js +11 -49
  313. package/.agents/scripts/lib/orchestration/light-escalation.js +21 -89
  314. package/.agents/scripts/lib/orchestration/light-suitability.js +26 -231
  315. package/.agents/scripts/lib/orchestration/merge-block-class.js +39 -216
  316. package/.agents/scripts/lib/orchestration/merge-poll.js +104 -377
  317. package/.agents/scripts/lib/orchestration/pinned-identifier-lint.js +17 -57
  318. package/.agents/scripts/lib/orchestration/plan-context.js +52 -303
  319. package/.agents/scripts/lib/orchestration/plan-critic-conditions.js +22 -79
  320. package/.agents/scripts/lib/orchestration/plan-critics-evaluate.js +5 -31
  321. package/.agents/scripts/lib/orchestration/plan-metrics.js +29 -108
  322. package/.agents/scripts/lib/orchestration/plan-navigation.js +8 -27
  323. package/.agents/scripts/lib/orchestration/plan-persist/acceptance-handle-repair.js +12 -49
  324. package/.agents/scripts/lib/orchestration/plan-persist/audit-provenance.js +18 -73
  325. package/.agents/scripts/lib/orchestration/plan-persist/changes-repair.js +14 -78
  326. package/.agents/scripts/lib/orchestration/plan-persist/cross-plan-links.js +6 -30
  327. package/.agents/scripts/lib/orchestration/plan-persist/epic-adoption.js +14 -65
  328. package/.agents/scripts/lib/orchestration/plan-persist/epic-ops.js +21 -76
  329. package/.agents/scripts/lib/orchestration/plan-persist/external-deps.js +6 -43
  330. package/.agents/scripts/lib/orchestration/plan-persist/persist-helpers.js +14 -68
  331. package/.agents/scripts/lib/orchestration/plan-persist/plan-context-source.js +9 -41
  332. package/.agents/scripts/lib/orchestration/plan-persist/run-plan-persist.js +49 -248
  333. package/.agents/scripts/lib/orchestration/plan-persist/soft-findings.js +2 -12
  334. package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +85 -368
  335. package/.agents/scripts/lib/orchestration/plan-persist/summary.js +8 -38
  336. package/.agents/scripts/lib/orchestration/plan-persist/supersede-ops.js +30 -190
  337. package/.agents/scripts/lib/orchestration/plan-persist/wave-collision-gate.js +9 -49
  338. package/.agents/scripts/lib/orchestration/plan-persist/wave-serialisation.js +7 -28
  339. package/.agents/scripts/lib/orchestration/plan-reachability.js +13 -42
  340. package/.agents/scripts/lib/orchestration/plan-run-labels/reap.js +16 -91
  341. package/.agents/scripts/lib/orchestration/plan-runner/worktree-sweep.js +16 -54
  342. package/.agents/scripts/lib/orchestration/plan-text-hygiene.js +10 -52
  343. package/.agents/scripts/lib/orchestration/planning/authoring-context.js +14 -109
  344. package/.agents/scripts/lib/orchestration/planning/memory-pool-advisory.js +11 -83
  345. package/.agents/scripts/lib/orchestration/pr-watch.js +48 -306
  346. package/.agents/scripts/lib/orchestration/project-meta-cache.js +15 -80
  347. package/.agents/scripts/lib/orchestration/project-meta-resolver.js +10 -51
  348. package/.agents/scripts/lib/orchestration/reassert-status-column.js +12 -76
  349. package/.agents/scripts/lib/orchestration/remote-verifier.js +12 -36
  350. package/.agents/scripts/lib/orchestration/resolve-stories.js +33 -164
  351. package/.agents/scripts/lib/orchestration/retro-proposals.js +66 -361
  352. package/.agents/scripts/lib/orchestration/review-base-ref.js +9 -43
  353. package/.agents/scripts/lib/orchestration/review-depth.js +12 -94
  354. package/.agents/scripts/lib/orchestration/review-providers/codex.js +10 -111
  355. package/.agents/scripts/lib/orchestration/review-providers/degraded-gates.js +13 -71
  356. package/.agents/scripts/lib/orchestration/review-providers/findings-renderer.js +7 -51
  357. package/.agents/scripts/lib/orchestration/review-providers/mi-exemptions.js +8 -53
  358. package/.agents/scripts/lib/orchestration/review-providers/native.js +30 -214
  359. package/.agents/scripts/lib/orchestration/review-providers/parse-findings.js +7 -52
  360. package/.agents/scripts/lib/orchestration/review-providers/review-depth.js +4 -33
  361. package/.agents/scripts/lib/orchestration/review-providers/review-provider-factory.js +11 -71
  362. package/.agents/scripts/lib/orchestration/review-providers/scoped-lint.js +19 -131
  363. package/.agents/scripts/lib/orchestration/review-providers/security-review.js +6 -89
  364. package/.agents/scripts/lib/orchestration/review-providers/types.js +26 -56
  365. package/.agents/scripts/lib/orchestration/review-providers/ultrareview.js +3 -46
  366. package/.agents/scripts/lib/orchestration/run-epilogue.js +40 -199
  367. package/.agents/scripts/lib/orchestration/run-scoped-config.js +13 -81
  368. package/.agents/scripts/lib/orchestration/single-story-close/close-note.js +7 -34
  369. package/.agents/scripts/lib/orchestration/single-story-close/failed-terminal.js +16 -89
  370. package/.agents/scripts/lib/orchestration/single-story-close/gate-log.js +18 -109
  371. package/.agents/scripts/lib/orchestration/single-story-close/phases/auto-merge.js +83 -239
  372. package/.agents/scripts/lib/orchestration/single-story-close/phases/base-sync.js +18 -80
  373. package/.agents/scripts/lib/orchestration/single-story-close/phases/close-validation.js +103 -97
  374. package/.agents/scripts/lib/orchestration/single-story-close/phases/code-review.js +8 -64
  375. package/.agents/scripts/lib/orchestration/single-story-close/phases/confirm-merge.js +136 -486
  376. package/.agents/scripts/lib/orchestration/single-story-close/phases/conventional-subject.js +30 -134
  377. package/.agents/scripts/lib/orchestration/single-story-close/phases/graphql-preflight.js +9 -50
  378. package/.agents/scripts/lib/orchestration/single-story-close/phases/lock-wait-pending.js +49 -0
  379. package/.agents/scripts/lib/orchestration/single-story-close/phases/normalize-pr-title.js +13 -86
  380. package/.agents/scripts/lib/orchestration/single-story-close/phases/options.js +20 -95
  381. package/.agents/scripts/lib/orchestration/single-story-close/phases/post-land.js +46 -203
  382. package/.agents/scripts/lib/orchestration/single-story-close/phases/pre-gate-steps.js +8 -50
  383. package/.agents/scripts/lib/orchestration/single-story-close/phases/pull-request.js +12 -83
  384. package/.agents/scripts/lib/orchestration/single-story-close/phases/push.js +6 -39
  385. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-block.js +1 -6
  386. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-outcome.js +4 -28
  387. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-override.js +6 -51
  388. package/.agents/scripts/lib/orchestration/single-story-close/phases/worktree-reap.js +6 -34
  389. package/.agents/scripts/lib/orchestration/single-story-close/phases/wrong-tree-guard.js +23 -121
  390. package/.agents/scripts/lib/orchestration/single-story-close/runner.js +110 -290
  391. package/.agents/scripts/lib/orchestration/single-story-lease-guard.js +15 -69
  392. package/.agents/scripts/lib/orchestration/story-body-gate.js +4 -23
  393. package/.agents/scripts/lib/orchestration/story-close/baseline-upward-writeback.js +50 -179
  394. package/.agents/scripts/lib/orchestration/story-close/context-budget-writeback.js +11 -41
  395. package/.agents/scripts/lib/orchestration/story-close/format-autofix.js +23 -311
  396. package/.agents/scripts/lib/orchestration/story-close/phases/local-lens-review.js +22 -147
  397. package/.agents/scripts/lib/orchestration/story-close/phases/review-core.js +16 -67
  398. package/.agents/scripts/lib/orchestration/story-deliver-terminal-schema.js +12 -68
  399. package/.agents/scripts/lib/orchestration/story-deliver-terminal.js +42 -201
  400. package/.agents/scripts/lib/orchestration/story-follow-ups.js +43 -245
  401. package/.agents/scripts/lib/orchestration/story-init-envelope.js +4 -23
  402. package/.agents/scripts/lib/orchestration/story-init-remote.js +2 -6
  403. package/.agents/scripts/lib/orchestration/story-reachability.js +3 -23
  404. package/.agents/scripts/lib/orchestration/task-body-validator.js +12 -126
  405. package/.agents/scripts/lib/orchestration/ticket-lease.js +28 -131
  406. package/.agents/scripts/lib/orchestration/ticket-validator-conflicts.js +15 -149
  407. package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +5 -33
  408. package/.agents/scripts/lib/orchestration/ticket-validator.js +39 -181
  409. package/.agents/scripts/lib/orchestration/ticketing/bulk.js +51 -244
  410. package/.agents/scripts/lib/orchestration/ticketing/reads.js +39 -250
  411. package/.agents/scripts/lib/orchestration/ticketing/state.js +14 -68
  412. package/.agents/scripts/lib/orchestration/ticketing/transition.js +46 -263
  413. package/.agents/scripts/lib/orchestration/ticketing.js +2 -26
  414. package/.agents/scripts/lib/orchestration/verify-credit.js +18 -79
  415. package/.agents/scripts/lib/orchestration/worktree-dirty.js +5 -30
  416. package/.agents/scripts/lib/path-security.js +3 -6
  417. package/.agents/scripts/lib/plan-phase-cleanup.js +9 -49
  418. package/.agents/scripts/lib/preflight-runner.js +13 -69
  419. package/.agents/scripts/lib/process-group.js +143 -0
  420. package/.agents/scripts/lib/project-root.js +2 -8
  421. package/.agents/scripts/lib/provider-factory.js +2 -25
  422. package/.agents/scripts/lib/qa/console-allowlist.js +10 -59
  423. package/.agents/scripts/lib/qa/qa-session.js +15 -69
  424. package/.agents/scripts/lib/qa/redact-evidence.js +18 -129
  425. package/.agents/scripts/lib/qa/resolve-qa-contract.js +26 -135
  426. package/.agents/scripts/lib/qa/resolve-selection.js +16 -84
  427. package/.agents/scripts/lib/reserved-test-ids.js +9 -47
  428. package/.agents/scripts/lib/runtime-deps/dep-resolution.js +13 -53
  429. package/.agents/scripts/lib/runtime-deps/ensure-installed.js +10 -44
  430. package/.agents/scripts/lib/runtime-deps/manifest.js +10 -30
  431. package/.agents/scripts/lib/runtime-deps/parser-major.js +15 -51
  432. package/.agents/scripts/lib/runtime-deps/preflight.js +4 -22
  433. package/.agents/scripts/lib/runtime-deps/scan-imports.js +11 -55
  434. package/.agents/scripts/lib/signals/detectors/common.js +12 -38
  435. package/.agents/scripts/lib/signals/index.js +2 -19
  436. package/.agents/scripts/lib/signals/schema.js +14 -109
  437. package/.agents/scripts/lib/signals/write.js +2 -11
  438. package/.agents/scripts/lib/single-story/confirm-merge.js +31 -72
  439. package/.agents/scripts/lib/single-story/story-merged-notify.js +8 -49
  440. package/.agents/scripts/lib/single-story-sweep/protection-ctx.js +4 -26
  441. package/.agents/scripts/lib/single-story-sweep/protection.js +13 -100
  442. package/.agents/scripts/lib/single-story-sweep/sweep-lock.js +60 -258
  443. package/.agents/scripts/lib/single-story-sweep.js +14 -97
  444. package/.agents/scripts/lib/skills/parse-skill.js +13 -59
  445. package/.agents/scripts/lib/skills/skills-index.js +8 -29
  446. package/.agents/scripts/lib/skills/walk-skill-files.js +17 -78
  447. package/.agents/scripts/lib/source-extensions.js +11 -42
  448. package/.agents/scripts/lib/source-text/strip-js-comments.js +8 -41
  449. package/.agents/scripts/lib/stdio-flush.js +9 -36
  450. package/.agents/scripts/lib/story-adjacency.js +8 -40
  451. package/.agents/scripts/lib/story-body/body-format-lints.js +22 -83
  452. package/.agents/scripts/lib/story-body/footer-block.js +11 -44
  453. package/.agents/scripts/lib/story-body/story-body.js +83 -358
  454. package/.agents/scripts/lib/temp-retention.js +42 -143
  455. package/.agents/scripts/lib/templates/decomposer-prompts.js +11 -65
  456. package/.agents/scripts/lib/test-env.js +12 -65
  457. package/.agents/scripts/lib/test-run-credit.js +10 -65
  458. package/.agents/scripts/lib/test-runner-contract.js +19 -74
  459. package/.agents/scripts/lib/test-temp.js +38 -184
  460. package/.agents/scripts/lib/test-tiers.js +12 -96
  461. package/.agents/scripts/lib/ticket-body-sections.js +21 -96
  462. package/.agents/scripts/lib/transpile.js +15 -74
  463. package/.agents/scripts/lib/util/concurrent-map.js +6 -25
  464. package/.agents/scripts/lib/util/parse-id-list.js +8 -34
  465. package/.agents/scripts/lib/util/poll-loop.js +8 -28
  466. package/.agents/scripts/lib/util/with-timeout.js +2 -11
  467. package/.agents/scripts/lib/validation-evidence.js +21 -96
  468. package/.agents/scripts/lib/wave-runner/footprint.js +17 -70
  469. package/.agents/scripts/lib/wave-runner/live-probe.js +53 -221
  470. package/.agents/scripts/lib/wave-runner/ready-set.js +72 -301
  471. package/.agents/scripts/lib/workers/crap-worker.js +11 -64
  472. package/.agents/scripts/lib/workers/maintainability-report-worker.js +8 -45
  473. package/.agents/scripts/lib/workers/maintainability-worker.js +5 -21
  474. package/.agents/scripts/lib/workers/serve-worker-messages.js +2 -18
  475. package/.agents/scripts/lib/workflow-closure.js +22 -105
  476. package/.agents/scripts/lib/workspace-provisioner.js +16 -54
  477. package/.agents/scripts/lib/worktree/git-hooks.js +15 -60
  478. package/.agents/scripts/lib/worktree/lifecycle/force-drain.js +20 -60
  479. package/.agents/scripts/lib/worktree/lifecycle/merge-reachability.js +10 -62
  480. package/.agents/scripts/lib/worktree/lifecycle/pending-cleanup.js +22 -86
  481. package/.agents/scripts/lib/worktree/lifecycle/reap.js +24 -126
  482. package/.agents/scripts/lib/worktree/lifecycle-manager.js +2 -20
  483. package/.agents/scripts/lib/worktree/node-modules-strategy.js +46 -180
  484. package/.agents/scripts/lib/worktree-manager.js +15 -40
  485. package/.agents/scripts/lint-issue-body.js +12 -68
  486. package/.agents/scripts/mandrel-update-preflight.js +10 -70
  487. package/.agents/scripts/merge-baseline.js +30 -104
  488. package/.agents/scripts/nav-registry-diff.js +22 -108
  489. package/.agents/scripts/notify.js +12 -69
  490. package/.agents/scripts/plan-context.js +27 -111
  491. package/.agents/scripts/plan-critics.js +12 -66
  492. package/.agents/scripts/plan-persist.js +31 -148
  493. package/.agents/scripts/plan-run-epilogue.js +11 -37
  494. package/.agents/scripts/pr-watch-with-update.js +76 -267
  495. package/.agents/scripts/providers/github/auth.js +3 -8
  496. package/.agents/scripts/providers/github/blocked-by-add.js +14 -61
  497. package/.agents/scripts/providers/github/board-add.js +5 -21
  498. package/.agents/scripts/providers/github/branch-protection.js +11 -43
  499. package/.agents/scripts/providers/github/cache.js +2 -14
  500. package/.agents/scripts/providers/github/comments.js +7 -40
  501. package/.agents/scripts/providers/github/compose.js +3 -19
  502. package/.agents/scripts/providers/github/errors.js +22 -125
  503. package/.agents/scripts/providers/github/issues.js +31 -123
  504. package/.agents/scripts/providers/github/labels.js +24 -124
  505. package/.agents/scripts/providers/github/mappers.js +5 -27
  506. package/.agents/scripts/providers/github/merge-methods.js +3 -22
  507. package/.agents/scripts/providers/github/project-board.js +2 -17
  508. package/.agents/scripts/providers/github/projects-v2-graphql.js +3 -6
  509. package/.agents/scripts/providers/github/request-helpers.js +5 -32
  510. package/.agents/scripts/providers/github/search-budget.js +9 -39
  511. package/.agents/scripts/providers/github/search-query.js +5 -26
  512. package/.agents/scripts/providers/github/sub-issue-add.js +15 -65
  513. package/.agents/scripts/providers/github/sub-issues.js +7 -36
  514. package/.agents/scripts/providers/github/tickets.js +32 -134
  515. package/.agents/scripts/providers/github.js +18 -59
  516. package/.agents/scripts/prune-plan-run-labels.js +12 -46
  517. package/.agents/scripts/quality-preview.js +35 -220
  518. package/.agents/scripts/resolve-doc-tiers.js +3 -26
  519. package/.agents/scripts/resolve-stories.js +16 -67
  520. package/.agents/scripts/resync-status-column.js +6 -25
  521. package/.agents/scripts/run-tests.js +29 -104
  522. package/.agents/scripts/single-story-close.js +23 -135
  523. package/.agents/scripts/single-story-confirm-merge.js +32 -139
  524. package/.agents/scripts/single-story-init.js +47 -209
  525. package/.agents/scripts/stories-wave-tick.js +102 -472
  526. package/.agents/scripts/sync-agentrc.js +3 -21
  527. package/.agents/scripts/sync-claude-agents.js +9 -55
  528. package/.agents/scripts/sync-claude-commands.js +20 -110
  529. package/.agents/scripts/test-wrapper.js +6 -43
  530. package/.agents/scripts/update-coverage-baseline.js +5 -22
  531. package/.agents/scripts/update-crap-baseline.js +7 -30
  532. package/.agents/scripts/update-duplication-baseline.js +16 -92
  533. package/.agents/scripts/update-maintainability-baseline.js +8 -62
  534. package/.agents/scripts/update-ticket-state.js +1 -7
  535. package/.agents/scripts/validate-skills.js +6 -26
  536. package/.agents/templates/agent-protocol.md +2 -2
  537. package/.agents/templates/docs/audit-sweep-runbook.md +3 -4
  538. package/.agents/workflows/audit-accessibility.md +4 -7
  539. package/.agents/workflows/audit-adrs.md +3 -6
  540. package/.agents/workflows/audit-architecture.md +3 -11
  541. package/.agents/workflows/audit-baselines.md +6 -9
  542. package/.agents/workflows/audit-clean-code.md +8 -12
  543. package/.agents/workflows/audit-data-model.md +3 -7
  544. package/.agents/workflows/audit-dependencies.md +4 -7
  545. package/.agents/workflows/audit-devops.md +4 -8
  546. package/.agents/workflows/audit-documentation.md +1 -4
  547. package/.agents/workflows/audit-mobile.md +4 -7
  548. package/.agents/workflows/audit-navigability.md +3 -6
  549. package/.agents/workflows/audit-performance.md +2 -4
  550. package/.agents/workflows/audit-privacy.md +4 -7
  551. package/.agents/workflows/audit-quality.md +4 -7
  552. package/.agents/workflows/audit-security.md +4 -7
  553. package/.agents/workflows/audit-seo.md +4 -7
  554. package/.agents/workflows/audit-sre.md +4 -7
  555. package/.agents/workflows/audit-to-stories.md +17 -30
  556. package/.agents/workflows/audit-ux-ui.md +4 -7
  557. package/.agents/workflows/helpers/audit-lens-core.md +1 -1
  558. package/.agents/workflows/helpers/code-quality-guardrails.md +12 -15
  559. package/.agents/workflows/helpers/deliver-digest.md +6 -4
  560. package/.agents/workflows/helpers/deliver-reference.md +114 -188
  561. package/.agents/workflows/helpers/deliver-story-reference.md +189 -533
  562. package/.agents/workflows/helpers/plan-reference.md +86 -139
  563. package/.agents/workflows/helpers/qa-core.md +12 -0
  564. package/.agents/workflows/memory-consolidate.md +1 -1
  565. package/.agents/workflows/qa-assist.md +27 -71
  566. package/.agents/workflows/qa-explore.md +19 -59
  567. package/.agents/workflows/qa-run.md +11 -33
  568. package/README.md +1 -1
  569. package/bin/mandrel.js +5 -46
  570. package/bin/postinstall.js +18 -107
  571. package/docs/CHANGELOG.md +25 -0
  572. package/lib/cli/doctor.js +11 -71
  573. package/lib/cli/init.js +26 -165
  574. package/lib/cli/migrate.js +5 -64
  575. package/lib/cli/registry.js +84 -467
  576. package/lib/cli/sync-agents.js +4 -64
  577. package/lib/cli/sync-commands.js +11 -64
  578. package/lib/cli/sync.js +34 -213
  579. package/lib/cli/uninstall.js +40 -219
  580. package/lib/cli/update.js +105 -661
  581. package/lib/cli/version-check.js +8 -72
  582. package/lib/cli/version-helpers.js +14 -87
  583. package/lib/migrations/helpers/retire-agentrc-key.js +11 -52
  584. package/lib/migrations/index.js +15 -92
  585. package/lib/migrations/steps/2.1.0-retire-mi-drop-knobs.js +2 -15
  586. package/lib/migrations/steps/2.1.0-retire-verify-concurrency-cap.js +1 -13
  587. package/lib/migrations/steps/2.11.0-retire-max-seed-words.js +2 -15
  588. package/lib/migrations/steps/2.2.0-retire-epic-ac-tags.js +9 -38
  589. package/lib/migrations/steps/2.20.0-retire-codebase-snapshot.js +1 -13
  590. package/lib/migrations/steps/2.32.0-retire-lint-baseline-command.js +2 -27
  591. package/lib/migrations/steps/2.57.0-retire-delivery-limit-knobs.js +2 -23
  592. package/lib/migrations/steps/2.57.0-retire-planning-limit-knobs.js +2 -27
  593. package/lib/migrations/steps/2.60.0-retire-audit-results-autofile.js +2 -21
  594. package/lib/migrations/steps/strip-removed-agentrc-keys.js +333 -0
  595. package/package.json +16 -14
  596. package/.agents/docs/SDLC.md +0 -590
  597. package/.agents/docs/quality-gates.md +0 -1183
  598. package/.agents/rules/known-tooling-behavior.md +0 -200
  599. package/.agents/rules/orchestration-error-handling.md +0 -61
  600. package/.agents/rules/test-seams.md +0 -59
  601. package/.agents/schemas/baselines/lighthouse.schema.json +0 -59
  602. package/.agents/schemas/baselines/lint.schema.json +0 -47
  603. package/.agents/scripts/check-action-pinning.js +0 -260
  604. package/.agents/scripts/check-audit-attribution.js +0 -302
  605. package/.agents/scripts/check-baseline-drift.js +0 -211
  606. package/.agents/scripts/check-baseline-scope.js +0 -362
  607. package/.agents/scripts/check-generated-validator.js +0 -202
  608. package/.agents/scripts/check-knip-entries.js +0 -159
  609. package/.agents/scripts/check-lifecycle-lint.js +0 -294
  610. package/.agents/scripts/check-pinned-override-notes.js +0 -102
  611. package/.agents/scripts/check-schema-references.js +0 -368
  612. package/.agents/scripts/check-test-portability.js +0 -512
  613. package/.agents/scripts/check-workflow-citations.js +0 -218
  614. package/.agents/scripts/check-workflow-cli-lint.js +0 -299
  615. package/.agents/scripts/check-workflow-timeouts.js +0 -291
  616. package/.agents/scripts/install-matrix-assert.js +0 -326
  617. package/.agents/scripts/lib/audit-advisories.js +0 -195
  618. package/.agents/scripts/lib/audit-attribution.js +0 -134
  619. package/.agents/scripts/lib/baselines/drift-detector.js +0 -351
  620. package/.agents/scripts/lib/baselines/kinds/lighthouse.js +0 -87
  621. package/.agents/scripts/lib/baselines/kinds/lint.js +0 -184
  622. package/.agents/scripts/lib/baselines/orphan-pruner.js +0 -233
  623. package/.agents/scripts/lib/baselines/scope-assert.js +0 -223
  624. package/.agents/scripts/lib/baselines/scope-inventory.js +0 -314
  625. package/.agents/scripts/lib/c8-cli-path.js +0 -21
  626. package/.agents/scripts/lib/config/gates/lighthouse.schema.js +0 -51
  627. package/.agents/scripts/lib/config/gates/lint.schema.js +0 -18
  628. package/.agents/scripts/lib/dynamic-workflow/architecture-report-contract.js +0 -70
  629. package/.agents/scripts/lib/dynamic-workflow/audit-orchestrator.js +0 -284
  630. package/.agents/scripts/lib/dynamic-workflow/clean-code-report-contract.js +0 -80
  631. package/.agents/scripts/lib/dynamic-workflow/degraded-coverage.js +0 -81
  632. package/.agents/scripts/lib/dynamic-workflow/documentation-report-contract.js +0 -87
  633. package/.agents/scripts/lib/dynamic-workflow/performance-report-contract.js +0 -74
  634. package/.agents/scripts/lib/dynamic-workflow/quality-report-contract.js +0 -90
  635. package/.agents/scripts/lib/dynamic-workflow/report-contract-core.js +0 -43
  636. package/.agents/scripts/lib/dynamic-workflow/security-report-contract.js +0 -83
  637. package/.agents/scripts/lib/fs-walk.js +0 -52
  638. package/.agents/scripts/lib/knip-config-resolver.js +0 -181
  639. package/.agents/scripts/lib/knip-entry-sync.js +0 -452
  640. package/.agents/scripts/lib/pinned-override-notes.js +0 -88
  641. package/.agents/scripts/lib/pinned-override-resolve.js +0 -212
  642. package/.agents/scripts/lib/test-isolate/cli-options.js +0 -93
  643. package/.agents/scripts/lib/test-isolate/env-snapshot-loader.js +0 -52
  644. package/.agents/scripts/lib/test-isolate/list-files.js +0 -90
  645. package/.agents/scripts/lib/test-isolate/parse-tap.js +0 -75
  646. package/.agents/scripts/lib/test-isolate/progress-log.js +0 -45
  647. package/.agents/scripts/lib/test-isolate/render-report.js +0 -97
  648. package/.agents/scripts/lib/test-isolate/run-isolate.js +0 -87
  649. package/.agents/scripts/lib/test-isolate/runner.js +0 -483
  650. package/.agents/scripts/lib/test-profile/parse-tap.js +0 -136
  651. package/.agents/scripts/lib/test-profile/render-report.js +0 -45
  652. package/.agents/scripts/lint-label-vocabulary.js +0 -214
  653. package/.agents/scripts/post-structured-comment.js +0 -127
  654. package/.agents/scripts/provision-git-hooks.js +0 -85
  655. package/.agents/scripts/prune-baseline-orphans.js +0 -181
  656. package/.agents/scripts/run-coverage.js +0 -197
  657. package/.agents/scripts/run-lint.js +0 -133
  658. package/.agents/scripts/run-test-profile.js +0 -129
  659. package/.agents/scripts/run-verify.js +0 -125
  660. package/.agents/scripts/test-isolate.js +0 -55
  661. package/.agents/scripts/update-dead-exports-baseline.js +0 -321
@@ -1,12 +1,6 @@
1
1
  /**
2
- * read.js — tolerant, strictly read-only filesystem access for the baseline
3
- * hotspot engine (Story #4902).
4
- *
5
- * The engine's job is to *report on* the baseline surface, including the
6
- * parts of it that are missing or malformed. So no read here throws: a
7
- * missing file, an unreadable directory, or a JSON parse error is evidence
8
- * the envelope carries, not a crash. Nothing in this module opens a file for
9
- * writing — the read-only invariant over `baselines/` starts here.
2
+ * Tolerant, strictly read-only fs access: a missing or malformed file is
3
+ * evidence for the envelope, never a throw.
10
4
  *
11
5
  * @module lib/audit-baselines/read
12
6
  */
@@ -15,8 +9,6 @@ import fs from 'node:fs';
15
9
  import path from 'node:path';
16
10
 
17
11
  /**
18
- * Read and parse a JSON file without throwing.
19
- *
20
12
  * @param {string} absolutePath
21
13
  * @returns {{ exists: boolean, parsed: object | null, parseError: string | null }}
22
14
  */
@@ -39,10 +31,6 @@ export function readJsonFile(absolutePath) {
39
31
  }
40
32
 
41
33
  /**
42
- * List every file under `rootDir` as a posix repo-relative path, skipping
43
- * `node_modules`, `.git`, and `.worktrees`. Returns `[]` for an absent or
44
- * unreadable root rather than throwing.
45
- *
46
34
  * @param {string} repoRoot
47
35
  * @param {string} rootDir repo-relative directory to walk
48
36
  * @returns {string[]} sorted repo-relative posix paths
@@ -72,8 +60,7 @@ export function listFilesUnder(repoRoot, rootDir) {
72
60
  }
73
61
 
74
62
  /**
75
- * Age in whole days between `generatedAt` and `now`. Null when the stamp is
76
- * absent or unparseable — the engine reports "unknown", never a fabricated 0.
63
+ * Whole days; `null` (unknown) rather than a fabricated 0.
77
64
  *
78
65
  * @param {unknown} generatedAt
79
66
  * @param {Date} now
@@ -1,17 +1,7 @@
1
1
  /**
2
- * staleness.js — the two clocks a baseline is stale against (Story #4962).
3
- *
4
- * Wall-clock age answers the wrong question on a busy repository.
5
- * `coverage.json` and `maintainability.json` both read `staleDays: 0` while
6
- * already predating merges that had rescored files they still carry rows for:
7
- * refreshed an hour ago, and behind already. The second clock is the one that
8
- * matters — how many commits have touched the **measured surface** since the
9
- * baseline was last committed. A baseline older than the surface it scores is
10
- * stale at zero wall-clock days.
11
- *
12
- * Read-only and degrading, like the rest of this engine: a shallow clone, an
13
- * untracked baseline, or a surface that is not path-keyed all report `null`.
14
- * Unknown is never rounded down to a reassuring 0.
2
+ * Baseline staleness on two clocks: wall-clock age, and commits touching the
3
+ * measured surface since the baseline was committed — a baseline behind its
4
+ * surface is stale at zero days. Unknown reports `null`, never a reassuring 0.
15
5
  *
16
6
  * @module lib/audit-baselines/staleness
17
7
  */
@@ -21,9 +11,7 @@ import { KIND_SPECS } from './kinds.js';
21
11
  import { ageInDays } from './read.js';
22
12
 
23
13
  /**
24
- * Run a git command under `cwd`, returning trimmed stdout, or `null` on any
25
- * failure or empty result. Buffer and shell policy come from the shared
26
- * child-process surface ([`child-exec.js`](../child-exec.js)).
14
+ * Trimmed stdout, or `null` on failure or empty output.
27
15
  *
28
16
  * @param {string[]} args
29
17
  * @param {{ cwd: string, run?: Function }} io
@@ -45,11 +33,8 @@ function git(args, { cwd, run }) {
45
33
  }
46
34
 
47
35
  /**
48
- * The repo-relative paths whose commits would invalidate this baseline: the
49
- * gate's declared `targetDirs` when it has them, else the baseline's own row
50
- * ids — which are file paths for every kind but `lighthouse` (routes) and
51
- * `bundle-size` (bundle names). Those two get an empty surface rather than a
52
- * route name handed to git as a pathspec.
36
+ * `targetDirs`, else path-keyed row ids; non-path kinds get an empty surface
37
+ * rather than a bundle name as a git pathspec.
53
38
  *
54
39
  * @param {{ kind: string, gateBlock: object | null, rows: Array<{id: string}> }} args
55
40
  * @returns {string[]}
@@ -64,9 +49,7 @@ function measuredSurfaceOf({ kind, gateBlock, rows }) {
64
49
  }
65
50
 
66
51
  /**
67
- * Commits touching `surfacePaths` since `relPath` was last committed. An
68
- * empty surface yields `null` too: nothing was checked, so nothing can be
69
- * claimed.
52
+ * Empty surface → `null`: nothing checked, nothing claimed.
70
53
  *
71
54
  * @param {{ relPath: string, surfacePaths: string[], io: object }} args
72
55
  * @returns {number | null}
@@ -84,8 +67,6 @@ function commitsSinceBaseline({ relPath, surfacePaths, io }) {
84
67
  }
85
68
 
86
69
  /**
87
- * The four staleness fields of one `gateSurface[]` entry, on both clocks.
88
- *
89
70
  * @param {{
90
71
  * kind: string, gateBlock: object | null, rows: Array<{id: string}>,
91
72
  * relPath: string, baseline: object | null, now: Date,
@@ -1,16 +1,6 @@
1
1
  /**
2
- * surface-entry.js — the health report for one measuring instrument
3
- * (Story #4902, split out in #4962).
4
- *
5
- * A baseline review that only reads the numbers cannot see the failure mode
6
- * that matters most: an instrument that is not measuring anything. A gate can
7
- * be unconfigured, its baseline file can be missing, it can be a **stub**
8
- * (committed with no rows and an all-zero rollup, so it passes every run
9
- * vacuously), it can be stale on either clock, and its `ignoreGlobs` can name
10
- * paths that no longer exist — each of which reads as "green" from the gate's
11
- * exit code. This module turns all of that into declarative fields for one
12
- * kind; [`gate-surface.js`](gate-surface.js) walks the kinds and
13
- * [`staleness.js`](staleness.js) owns the two clocks.
2
+ * Health of one measuring instrument: unconfigured, missing, stub, stale, or
3
+ * dead `ignoreGlobs` — each of which reads green from the gate's exit code.
14
4
  *
15
5
  * @module lib/audit-baselines/surface-entry
16
6
  */
@@ -20,9 +10,7 @@ import { GATE_KINDS, KIND_SPECS, measuredTotalOf, rollupOf } from './kinds.js';
20
10
  import { stalenessOf } from './staleness.js';
21
11
 
22
12
  /**
23
- * True when every numeric leaf of the rollup is zero. A rollup with no
24
- * numeric leaves at all is not all-zero — it carries no measurement to call
25
- * zero, and treating it as such would flag shapes this engine cannot read.
13
+ * A rollup with no numeric leaves is not all-zero.
26
14
  *
27
15
  * @param {object | null} rollup
28
16
  * @returns {boolean}
@@ -34,10 +22,8 @@ function isAllZeroRollup(rollup) {
34
22
  }
35
23
 
36
24
  /**
37
- * A **stub instrument**: zero rows AND an all-zero rollup. Both halves are
38
- * required. Ratchet baselines carry no rollup, so a clean `arch-cycles`
39
- * allowlist — genuinely zero cycles, the success state — is never mistaken
40
- * for a dead instrument.
25
+ * Zero rows AND an all-zero rollup, so a clean ratchet (no rollup) is never
26
+ * called a stub.
41
27
  *
42
28
  * @param {{ rowCount: number, rollup: object | null }} args
43
29
  * @returns {boolean}
@@ -47,11 +33,9 @@ function isStubInstrument({ rowCount, rollup }) {
47
33
  }
48
34
 
49
35
  /**
50
- * Which of a gate's configured `ignoreGlobs` match zero files on disk.
51
- *
52
36
  * @param {string[]} ignoreGlobs
53
37
  * @param {string[]} files repo-relative posix paths
54
- * @returns {string[]}
38
+ * @returns {string[]} globs matching zero files
55
39
  */
56
40
  function findDeadIgnoreGlobs(ignoreGlobs, files) {
57
41
  const dead = [];
@@ -64,12 +48,7 @@ function findDeadIgnoreGlobs(ignoreGlobs, files) {
64
48
  }
65
49
 
66
50
  /**
67
- * Assemble one `gateSurface[]` entry from an already-read baseline.
68
- *
69
- * `rowCount` and `measured` both appear because they legitimately disagree:
70
- * rows are counted after the kind's per-file aggregation, while `measured` is
71
- * the quantity the instrument reports in its own unit — 589 dead-export
72
- * symbols sit in 187 files.
51
+ * `rowCount` (per-file) and `measured` (own unit) legitimately differ.
73
52
  *
74
53
  * @param {{
75
54
  * kind: string, quality: object, read: object, relPath: string,
@@ -1,17 +1,7 @@
1
1
  /**
2
- * trend.js — per-kind rollup deltas read out of each baseline file's own git
3
- * history (Story #4902).
4
- *
5
- * A ratchet only tells you whether today is worse than yesterday. The
6
- * question a baseline review asks is the other one: which direction has this
7
- * number been moving, and is the ratchet actually ratcheting? That answer is
8
- * already committed — every baseline refresh is a commit against the same
9
- * path — so it is read with `git log` + `git show`, never recomputed by
10
- * re-running an instrument.
11
- *
12
- * Degradation: any git failure (shallow clone, no history for the path, not
13
- * a work tree) yields an empty `trend[]` and exit 0. A missing history is
14
- * missing evidence, not an error.
2
+ * Per-kind rollup direction of travel, read from each baseline's own git
3
+ * history — never recomputed. Any git failure yields no trend entry: missing
4
+ * history is missing evidence, not an error.
15
5
  *
16
6
  * @module lib/audit-baselines/trend
17
7
  */
@@ -20,7 +10,7 @@ import { execFileCapture } from '../child-exec.js';
20
10
  import { trendRollupOf } from './kinds.js';
21
11
 
22
12
  /**
23
- * List the most recent commits touching `relPath`, newest first.
13
+ * Newest first.
24
14
  *
25
15
  * @param {{ cwd: string, relPath: string, limit: number, run?: Function }} args
26
16
  * @returns {Array<{ sha: string, committedAt: string }>}
@@ -47,8 +37,6 @@ function listCommits({ cwd, relPath, limit, run }) {
47
37
  }
48
38
 
49
39
  /**
50
- * Read the comparable rollup of a baseline as it existed at `sha`.
51
- *
52
40
  * @param {{ cwd: string, kind: string, sha: string, relPath: string, run?: Function }} args
53
41
  * @returns {object | null}
54
42
  */
@@ -71,9 +59,8 @@ function rollupAt({ cwd, kind, sha, relPath, run }) {
71
59
  }
72
60
 
73
61
  /**
74
- * Numeric axis-by-axis difference `to - from`. Axes missing from either side
75
- * are omitted rather than defaulted — a rollup that gained an axis has no
76
- * delta on it, and inventing one would read as a regression.
62
+ * `to - from` per axis; an axis missing on either side is omitted, since an
63
+ * invented delta would read as a regression.
77
64
  *
78
65
  * @param {object} from
79
66
  * @param {object} to
@@ -91,7 +78,7 @@ function rollupDelta(from, to) {
91
78
  }
92
79
 
93
80
  /**
94
- * Build the `trend[]` section: newest-vs-previous rollup deltas per kind.
81
+ * Newest-vs-previous rollup deltas per kind.
95
82
  *
96
83
  * @param {{
97
84
  * cwd: string, kinds: string[], pathFor: (kind: string) => string,
@@ -1,17 +1,7 @@
1
1
  /**
2
- * weights.js — the three ranking multipliers, and their degradations
3
- * (Story #4902).
4
- *
5
- * A hotspot's severity says how bad the code measures. These three say how
6
- * much that badness costs: how often the file changes (churn), how much of
7
- * the repository depends on it (import in-degree), and how often agents have
8
- * actually tripped over it (friction signals).
9
- *
10
- * All three are **optional inputs**. A shallow clone has no git history, a
11
- * fresh checkout has no friction ledger, and a consumer whose sources live
12
- * outside the scanned roots has no resolvable import graph. Each degrades to
13
- * a neutral multiplier of exactly 1.0 — never 0 (which would erase the
14
- * hotspot) and never a guess. The engine exits 0 in every degraded case.
2
+ * Hotspot ranking multipliers — churn, import in-degree, friction signals.
3
+ * Each input is optional and degrades to exactly 1.0: never 0 (which would
4
+ * erase the hotspot), never a guess.
15
5
  *
16
6
  * @module lib/audit-baselines/weights
17
7
  */
@@ -21,14 +11,11 @@ import path from 'node:path';
21
11
  import { execFileCapture } from '../child-exec.js';
22
12
  import { computeInDegree, resolveRepoGraph } from '../import-graph.js';
23
13
 
24
- /** Neutral multiplier every degraded weight collapses to. */
25
14
  const NEUTRAL_WEIGHT = 1.0;
26
15
 
27
16
  /**
28
- * Saturating count → multiplier in `[1, 2)`. Zero observations gives exactly
29
- * `NEUTRAL_WEIGHT`, so "no signal" and "signal says nothing notable" are the
30
- * same number — the degradation is indistinguishable from an honest zero,
31
- * which is the point: neither should move the ranking.
17
+ * Saturating count → `[1, 2)`; zero equals the degraded weight, so neither
18
+ * moves the ranking.
32
19
  *
33
20
  * @param {number} count
34
21
  * @param {number} half count at which the multiplier reaches 1.5
@@ -40,12 +27,10 @@ function saturate(count, half) {
40
27
  }
41
28
 
42
29
  /**
43
- * Count commits touching each file in the recent history window.
30
+ * Commits per file in the window; `degraded` when git cannot answer at all.
44
31
  *
45
32
  * @param {{ cwd: string, windowDays?: number, run?: Function }} args
46
33
  * @returns {{ counts: Map<string, number>, degraded: boolean }}
47
- * `degraded` is true when git could not answer at all — not a git work
48
- * tree, no commits yet, or the binary is unavailable.
49
34
  */
50
35
  export function readChurn({ cwd, windowDays = 180, run }) {
51
36
  let stdout;
@@ -62,8 +47,7 @@ export function readChurn({ cwd, windowDays = 180, run }) {
62
47
  {
63
48
  run,
64
49
  cwd,
65
- // git narrates "not a git repository" on stderr; the degradation is
66
- // reported in the envelope, not shouted at the operator.
50
+ // Degradation is reported in the envelope, not on stderr.
67
51
  stdio: ['ignore', 'pipe', 'ignore'],
68
52
  },
69
53
  );
@@ -80,8 +64,6 @@ export function readChurn({ cwd, windowDays = 180, run }) {
80
64
  }
81
65
 
82
66
  /**
83
- * Import in-degree per module, keyed by repo-relative posix path.
84
- *
85
67
  * @param {{ cwd: string, graph?: Map<string, string[]> | null }} args
86
68
  * @returns {{ degrees: Map<string, number>, degraded: boolean }}
87
69
  */
@@ -91,12 +73,9 @@ export function readCentrality({ cwd, graph }) {
91
73
  return { degrees: computeInDegree(resolved), degraded: false };
92
74
  }
93
75
 
94
- /** Path tokens that look like repository files, harvested from signal text. */
95
76
  const PATH_TOKEN_RE = /[\w@][\w./@-]*\.(?:js|mjs|cjs|ts|tsx|json|md)\b/g;
96
77
 
97
78
  /**
98
- * Collect every `signals.ndjson` under `tempRoot`. Absent tree → empty list.
99
- *
100
79
  * @param {string} tempRootAbs
101
80
  * @returns {string[]} absolute paths
102
81
  */
@@ -121,12 +100,8 @@ function findSignalStreams(tempRootAbs) {
121
100
  }
122
101
 
123
102
  /**
124
- * Count friction signals blaming each file.
125
- *
126
- * Signal records carry no dedicated path field — the blamed file surfaces
127
- * inside free-form `details` / `emitter.command` text — so paths are
128
- * harvested by token scan over each record's serialized form. A malformed
129
- * line is skipped, never fatal.
103
+ * Friction signals per blamed file. Records have no path field, so paths are
104
+ * token-scanned from `details` / `emitter.command`; bad lines are skipped.
130
105
  *
131
106
  * @param {{ tempRootAbs: string, kinds?: Set<string> }} args
132
107
  * @returns {{ counts: Map<string, number>, degraded: boolean, streams: number }}
@@ -167,9 +142,6 @@ export function readFriction({
167
142
  }
168
143
 
169
144
  /**
170
- * Bundle the three weight lookups into one resolver the hotspot builder can
171
- * call per cluster id, plus the degradation flags the envelope reports.
172
- *
173
145
  * @param {{
174
146
  * churn: { counts: Map<string, number>, degraded: boolean },
175
147
  * centrality: { degrees: Map<string, number>, degraded: boolean },
@@ -1,31 +1,16 @@
1
1
  /**
2
- * lib/audit-suite/audit-rules-reader.js — the one synchronous reader of the
3
- * `audit-rules.json` manifest, memoized for the process lifetime.
4
- *
5
- * The manifest is shipped framework configuration resolved from one fixed
6
- * path per process, and the shape-derivation path reads it once per Story at
7
- * resolve AND persist — an un-memoized read is pure repeated I/O (measured
8
- * 221 µs/op raw vs 5.5 µs seamed on the run adhoc-4722-4723 audit). Only a
9
- * successful parse is cached: a read failure stays a per-call throw so a
10
- * caller can observe a manifest that becomes readable later. Tests never
11
- * reach this read — they inject fixture rules through the callers'
12
- * `injectedRules` seam.
2
+ * The one synchronous `audit-rules.json` reader, memoized per process. Only a
3
+ * successful parse is cached, so a failure stays a per-call throw and a
4
+ * manifest that later becomes readable is seen.
13
5
  */
14
6
 
15
7
  import { readFileSync } from 'node:fs';
16
8
  import path from 'node:path';
17
9
  import { getPaths, PROJECT_ROOT, resolveConfig } from '../config-resolver.js';
18
10
 
19
- /** Process-lifetime memo of the parsed manifest (successful parses only). */
20
11
  let auditRulesCache = null;
21
12
 
22
13
  /**
23
- * Read and parse the `audit-rules.json` manifest synchronously from the
24
- * project's configured `schemasRoot`. Shared by the synchronous, ticket-free
25
- * readers (`resolveLensTier`, `selectLocalLenses`,
26
- * `selectSensitivePathClasses`) so the path resolution and read-failure
27
- * handling live in one place rather than being duplicated per reader.
28
- *
29
14
  * @returns {{ audits?: Record<string, object> }} Parsed manifest.
30
15
  * @throws {Error} When the manifest cannot be read or parsed.
31
16
  */
@@ -1,39 +1,7 @@
1
1
  /**
2
- * lib/audit-suite/checklist-threading.js — write-time local-lens checklist
3
- * threading (Epic #4405, Story #4410).
4
- *
5
- * Given a Story's predicted footprint (its `changes[]` / `references[]` path
6
- * list), select the distilled authoring checklists for the **footprint-matched
7
- * LOCAL lenses only** and assemble them into one payload the dispatch/hydrator
8
- * seam threads into the Story maker prompt. This moves each local-lens concern
9
- * to the innermost, write-time tier so makers author against it on fresh
10
- * context instead of paying an Epic-close remediation loop on stale context.
11
- *
12
- * Matching is the **light** path, deliberately NOT `selectAudits`:
13
- * - tier gate — a lens is in scope only when `resolveLensTier(lens) ===
14
- * 'local'` (the pure `scope`-field read; cumulative/global
15
- * lenses are owned by the Epic-close tier, never threaded
16
- * here).
17
- * - file gate — the pure `matchesAnyFilePattern` matcher runs the lens's
18
- * own `triggers.filePatterns` (from `audit-rules.json`)
19
- * against the predicted footprint.
20
- *
21
- * `selectAudits` is the wrong tool here: it is gate-aware and provider-backed
22
- * (it reads the ticket through an `ITicketingProvider` and diffs the working
23
- * tree via `git`). The write-time path has a *predicted* footprint, not a git
24
- * diff, and no ticket to fetch — so this module reaches for the two pure
25
- * primitives directly and never touches a provider or `git`. That purity is
26
- * load-bearing (asserted by the test): the threading path must be a pure
27
- * function of the footprint and the on-disk manifest/checklists.
28
- *
29
- * A hard token budget caps the assembled payload. When the matched lenses'
30
- * checklists together exceed the budget, the payload is truncated
31
- * deterministically (a stable prefix in {@link AUDIT_LENSES} order is kept;
32
- * the overflowing tail is dropped) and every dropped lens is logged so the
33
- * elision is never silent.
34
- *
35
- * Pure (modulo the default disk reads for `audit-rules.json` and the checklist
36
- * artifacts, both injectable seams). No git, no provider, no network.
2
+ * Write-time checklists for LOCAL lenses matching a predicted footprint,
3
+ * under a token budget. Not `selectAudits`: this must stay a pure function of
4
+ * footprint + on-disk files — no git, provider, or network (tested).
37
5
  */
38
6
 
39
7
  import fs from 'node:fs';
@@ -48,11 +16,7 @@ import {
48
16
  } from './selector.js';
49
17
 
50
18
  /**
51
- * Rough token estimate: ~4 characters per token. Deliberately cheap and
52
- * deterministic — this budget is the one surviving ceiling that speaks in
53
- * tokens (Story #5312 deleted the plan-time sizing ceilings that shared the
54
- * estimator), so the approximation matters far less than the payload and
55
- * the cap agreeing on one number.
19
+ * ~4 chars per token; what matters is that payload and cap agree on one number.
56
20
  *
57
21
  * @param {string} text
58
22
  * @returns {number}
@@ -62,24 +26,14 @@ function estimateTokens(text) {
62
26
  }
63
27
 
64
28
  /**
65
- * Hard cap on the assembled checklist payload, in the ≈4-char/token estimate
66
- * above ({@link estimateTokens}). Generous
67
- * relative to the real checklist sizes (each distilled lens checklist is
68
- * ~130–190 tokens, and at most the seven local lenses can match), so a normal
69
- * Story is never truncated — the cap is a safety ceiling against a pathological
70
- * footprint that matches every local lens, not a routine squeeze. Callers may
71
- * override per-invocation via `tokenBudget`.
29
+ * Safety ceiling, not a routine squeeze: all seven local lenses together fit.
72
30
  */
73
31
  export const DEFAULT_CHECKLIST_TOKEN_BUDGET = 4000;
74
32
 
75
- /** Separator between concatenated per-lens checklist sections. */
76
33
  const SECTION_SEPARATOR = '\n\n';
77
34
 
78
35
  /**
79
- * The `audit-rules.json` / `resolveLensTier` lens key for a canonical lens
80
- * name. The taxonomy in {@link AUDIT_LENSES} carries bare names (`clean-code`);
81
- * the manifest and the tier resolver key off the `audit-`-prefixed form
82
- * (`audit-clean-code`).
36
+ * Manifest key for a bare taxonomy lens name (`clean-code` → `audit-clean-code`).
83
37
  *
84
38
  * @param {string} lens
85
39
  * @returns {string}
@@ -89,13 +43,9 @@ function lensKeyFor(lens) {
89
43
  }
90
44
 
91
45
  /**
92
- * Absolute path to the committed distilled-checklist directory. Mirrors the
93
- * SSOT the generator writes to (`generate-lens-checklists.js` →
94
- * `<agentRoot>/audit-checklists/<lens>.md`), resolved through the same
95
- * `agentRoot` the rest of the config surface uses so a consumer that relocates
96
- * `.agents` reads its checklists from the relocated tree.
46
+ * `<agentRoot>/audit-checklists`, honouring a relocated agent root.
97
47
  *
98
- * @param {object} [config] resolved config wrapper (defaults to a fresh read).
48
+ * @param {object} [config]
99
49
  * @returns {string}
100
50
  */
101
51
  function checklistsDir(config = resolveConfig()) {
@@ -107,12 +57,9 @@ function checklistsDir(config = resolveConfig()) {
107
57
  }
108
58
 
109
59
  /**
110
- * Read and parse `audit-rules.json` (the same manifest {@link selectAudits}
111
- * and {@link resolveLensTier} consume), resolved through the configured
112
- * `schemasRoot`. Synchronous — this is a pure-ish read with no git and no
113
- * provider.
60
+ * Parse `audit-rules.json` from the configured `schemasRoot`.
114
61
  *
115
- * @param {object} [config] resolved config wrapper (defaults to a fresh read).
62
+ * @param {object} [config]
116
63
  * @returns {{ audits?: Record<string, { triggers?: { filePatterns?: string[] } }> }}
117
64
  */
118
65
  export function readAuditRules(config = resolveConfig()) {
@@ -125,12 +72,6 @@ export function readAuditRules(config = resolveConfig()) {
125
72
  }
126
73
 
127
74
  /**
128
- * The `triggers.filePatterns` a lens declares in the manifest, or `[]` when
129
- * the lens declares none. (`audit-clean-code` carries the universal
130
- * match-everything glob, so it footprint-matches every non-empty change
131
- * set — the selector.js twin comment documents the same post-#4405
132
- * follow-up fix.)
133
- *
134
75
  * @param {object} rules parsed `audit-rules.json`.
135
76
  * @param {string} lens canonical lens name.
136
77
  * @returns {string[]}
@@ -140,9 +81,6 @@ function filePatternsFor(rules, lens) {
140
81
  }
141
82
 
142
83
  /**
143
- * The full `triggers` block a lens declares in the manifest (or `undefined`).
144
- * Used to read non-glob trigger fields (e.g. `sourceWithoutSiblingTest`).
145
- *
146
84
  * @param {object} rules parsed `audit-rules.json`.
147
85
  * @param {string} lens canonical lens name.
148
86
  * @returns {object|undefined}
@@ -152,10 +90,6 @@ function triggerFor(rules, lens) {
152
90
  }
153
91
 
154
92
  /**
155
- * Normalize a predicted footprint into a clean path list. Accepts a plain
156
- * `string[]` (the shape the caller derives from a Story's `changes[]` /
157
- * `references[]` entries); drops empty and non-string entries.
158
- *
159
93
  * @param {unknown} footprint
160
94
  * @returns {string[]}
161
95
  */
@@ -168,21 +102,13 @@ function normalizeFootprint(footprint) {
168
102
  }
169
103
 
170
104
  /**
171
- * Select, in stable {@link AUDIT_LENSES} order, the LOCAL lenses whose
172
- * `filePatterns` match the predicted footprint. This is the whole matching
173
- * contract — `resolveLensTier(lens) === 'local'` for the tier gate plus the
174
- * pure `matchesAnyFilePattern` matcher for the file gate — with no provider and
175
- * no git diff.
176
- *
177
- * A lens whose tier cannot be resolved (not registered / malformed scope) is
178
- * skipped rather than allowed to throw the whole selection; the generator and
179
- * schema keep the manifest well-formed, so this only guards against drift.
105
+ * LOCAL lenses matching the footprint, in {@link AUDIT_LENSES} order. A lens
106
+ * whose tier cannot be resolved is skipped rather than failing the selection.
180
107
  *
181
108
  * @param {object} params
182
109
  * @param {string[]} params.footprint predicted footprint path list.
183
- * @param {object} [params.rules] parsed `audit-rules.json` (injectable seam).
184
- * @param {(lens: string) => string} [params.resolveTier] tier resolver
185
- * (injectable seam; defaults to {@link resolveLensTier}).
110
+ * @param {object} [params.rules] parsed `audit-rules.json`.
111
+ * @param {(lens: string) => string} [params.resolveTier]
186
112
  * @returns {string[]} matched local lens names, in taxonomy order.
187
113
  */
188
114
  export function matchLocalLenses({
@@ -206,9 +132,8 @@ export function matchLocalLenses({
206
132
  const patterns = filePatternsFor(rules, lens);
207
133
  const fileMatch =
208
134
  patterns.length > 0 && matchesAnyFilePattern(patterns, paths);
209
- // Coverage-gap routing (#4628): thread the quality checklist at write-time
210
- // on the same sibling-test predicate the selector uses, so a source change
211
- // that ships without a test is reminded of the quality lens up front.
135
+ // Same sibling-test predicate as the selector: a source change without a
136
+ // test gets the quality checklist up front.
212
137
  const siblingMatch =
213
138
  triggerFor(rules, lens)?.sourceWithoutSiblingTest === true &&
214
139
  changeSetLacksSiblingTest(paths);
@@ -218,13 +143,9 @@ export function matchLocalLenses({
218
143
  }
219
144
 
220
145
  /**
221
- * Default checklist reader: read `<agentRoot>/audit-checklists/<lens>.md`.
222
- * Returns `null` when the artifact is absent (a matched lens with no committed
223
- * checklist), so the caller skips it rather than crashing.
224
- *
225
146
  * @param {string} lens
226
147
  * @param {object} [config]
227
- * @returns {string|null}
148
+ * @returns {string|null} `null` when the checklist artifact is absent
228
149
  */
229
150
  function readChecklistFile(lens, config = resolveConfig()) {
230
151
  const file = path.join(checklistsDir(config), `${lens}.md`);
@@ -236,31 +157,16 @@ function readChecklistFile(lens, config = resolveConfig()) {
236
157
  }
237
158
 
238
159
  /**
239
- * Build the write-time checklist payload for a Story's predicted footprint.
240
- *
241
- * Returns the assembled payload string plus the accounting the caller (and the
242
- * test) asserts against: which lenses were included, which were dropped by the
243
- * budget, the full matched set, and the payload's estimated token count.
244
- *
245
- * Truncation is deterministic prefix truncation: lenses are considered in
246
- * stable {@link AUDIT_LENSES} order and appended while the running payload
247
- * estimate stays within `tokenBudget`; the first lens that would overflow — and
248
- * every remaining matched lens — is dropped, and the drop is logged. The
249
- * returned `payload` therefore always satisfies
250
- * `estimateTokens(payload) <= tokenBudget`.
160
+ * Prefix truncation: the first overflowing lens and all later ones are
161
+ * dropped and logged.
251
162
  *
252
163
  * @param {object} params
253
- * @param {string[]} params.footprint predicted footprint (`changes[]` /
254
- * `references[]` path list).
255
- * @param {number} [params.tokenBudget] hard cap (defaults to
256
- * {@link DEFAULT_CHECKLIST_TOKEN_BUDGET}).
257
- * @param {object} [params.rules] parsed `audit-rules.json` (injectable seam).
258
- * @param {(lens: string) => string} [params.resolveTier] tier resolver
259
- * (injectable seam).
260
- * @param {(lens: string) => (string|null)} [params.readChecklist] checklist
261
- * reader (injectable seam; defaults to the on-disk reader).
262
- * @param {{ warn?: (msg: string) => void }} [params.logger] logger for the drop
263
- * record (defaults to {@link Logger}).
164
+ * @param {string[]} params.footprint predicted footprint path list.
165
+ * @param {number} [params.tokenBudget]
166
+ * @param {object} [params.rules] parsed `audit-rules.json`.
167
+ * @param {(lens: string) => string} [params.resolveTier]
168
+ * @param {(lens: string) => (string|null)} [params.readChecklist]
169
+ * @param {{ warn?: (msg: string) => void }} [params.logger]
264
170
  * @returns {{
265
171
  * payload: string,
266
172
  * includedLenses: string[],
@@ -294,9 +200,7 @@ export function buildChecklistPayload({
294
200
  const lens = matchedLenses[i];
295
201
  const content = readChecklist(lens);
296
202
  if (content == null) {
297
- // Matched a lens with no committed checklist artifact — skip it (never a
298
- // budget drop). The generator keeps every lens's checklist in tree, so
299
- // this only trips on drift, which we surface rather than swallow.
203
+ // Missing artifact is drift, not a budget drop: surface and skip.
300
204
  logger?.warn?.(
301
205
  `[checklist-threading] no checklist artifact for matched local lens '${lens}' — skipping`,
302
206
  );
@@ -306,8 +210,6 @@ export function buildChecklistPayload({
306
210
  const trimmed = content.trim();
307
211
  const candidate = [...sections, trimmed].join(SECTION_SEPARATOR);
308
212
  if (estimateTokens(candidate) > tokenBudget) {
309
- // Deterministic prefix truncation: this lens and every remaining matched
310
- // lens are dropped, keeping the payload within budget.
311
213
  droppedLenses.push(...matchedLenses.slice(i));
312
214
  break;
313
215
  }