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,43 +1,19 @@
1
1
  /**
2
- * Central source of truth for all GitHub label names used by the orchestrator.
3
- *
4
- * Every other module (label-taxonomy, single-story-close.js,
5
- * stories-wave-tick.js, etc.) should import from here rather than using string literals. Renames
6
- * land in one place.
2
+ * Single source of truth for GitHub label names — import these rather than
3
+ * using string literals.
7
4
  */
8
5
 
9
6
  export const AGENT_LABELS = {
10
7
  REVIEW_SPEC: 'agent::review-spec',
11
8
  READY: 'agent::ready',
12
9
  EXECUTING: 'agent::executing',
13
- // Story #2144 — intermediate state owned by `single-story-close.js`. A Story
14
- // flips to `agent::closing` after preflight validation succeeds and
15
- // the Story PR is opened against `main`. It flips to
16
- // `agent::done` only after the close pipeline confirms the PR merge
17
- // landed; if the close is killed mid-flight, the Story remains at
18
- // `agent::closing` so `/mandrel-deliver` can pick up at the
19
- // post-merge phase rather than re-running preflight. The label is the
20
- // distinguishing signal between "hung close" and "finished work".
10
+ // PR open, merge unconfirmed; a killed close stays here so deliver resumes.
21
11
  CLOSING: 'agent::closing',
22
12
  DONE: 'agent::done',
23
13
  BLOCKED: 'agent::blocked',
24
14
  };
25
15
 
26
- /**
27
- * Allowed state-machine transitions across `agent::*` labels.
28
- *
29
- * The validator is permissive in the directions that pre-Story #2144
30
- * lifecycles relied on (e.g. `executing → done` for Tasks, which never
31
- * route through the closing chokepoint) and restrictive on the post-
32
- * `closing` exits: once a ticket is at `agent::closing` it may only
33
- * advance to `done` (merge landed) or fall back to `blocked` (close
34
- * failed and the operator must intervene).
35
- *
36
- * Each key is a source label; each value is the set of permitted target
37
- * labels reachable in a single transition. Transitions absent from this
38
- * map MUST be treated as invalid by the validator. Self-transitions
39
- * (e.g. `executing → executing`) are not permitted.
40
- */
16
+ /** Absent transitions (and self-transitions) are invalid. */
41
17
  export const VALID_TRANSITIONS = {
42
18
  'agent::review-spec': ['agent::ready', 'agent::blocked'],
43
19
  'agent::ready': ['agent::executing', 'agent::blocked'],
@@ -49,18 +25,13 @@ export const VALID_TRANSITIONS = {
49
25
  'agent::closing',
50
26
  'agent::done',
51
27
  ],
52
- // Terminal: no outbound transitions from done. (A ticket can be
53
- // reopened by the operator, which removes the label entirely; that
54
- // is not modelled as a transition because the from-state at re-open
55
- // is `null`, not `agent::done`.)
28
+ // Terminal. An operator re-open removes the label, so its from-state is
29
+ // `null`, not `done`.
56
30
  'agent::done': [],
57
31
  };
58
32
 
59
33
  /**
60
- * Returns true when transitioning from `fromState` to `toState` is allowed
61
- * by {@link VALID_TRANSITIONS}. A `null` / `undefined` `fromState` is
62
- * treated as the initial-entry edge and permits any state — the writer
63
- * is establishing a state where there was none.
34
+ * A `null` / `undefined` `fromState` is initial entry and permits any state.
64
35
  *
65
36
  * @param {string|null|undefined} fromState
66
37
  * @param {string} toState
@@ -75,21 +46,8 @@ export function isValidTransition(fromState, toState) {
75
46
  }
76
47
 
77
48
  /**
78
- * Ticket-type axis.
79
- *
80
- * `STORY` is the only type carrying an execution payload — it is what
81
- * `/mandrel-deliver` branches, implements and lands.
82
- *
83
- * `EPIC` (Story #5139) is a **pure container**: a grouping ticket that holds
84
- * a `## Goal` paragraph and a child checklist and nothing else. It is never
85
- * branched, never implemented, and never carries an `agent::*` label — that
86
- * absence is what keeps it out of the bare `/mandrel-deliver` ready list and
87
- * outside `lint-issue-body.js`, which is `type::story`-scoped.
88
- *
89
- * This is deliberately NOT a revival of the v1 Epic tier. Linkage runs
90
- * parent→child only (the Epic body's checklist plus native sub-issue edges),
91
- * so Story bodies stay untouched and the `Epic: #N` footer stays retired and
92
- * refused. See ADR `20260905-container-epic` in `docs/decisions.md`.
49
+ * `EPIC` is a pure container that never carries `agent::*`, keeping it out
50
+ * of the ready list; linkage is parent→child only.
93
51
  */
94
52
  export const TYPE_LABELS = {
95
53
  STORY: 'type::story',
@@ -100,89 +58,36 @@ export const STATUS_LABELS = {
100
58
  BLOCKED: 'status::blocked',
101
59
  };
102
60
 
103
- /**
104
- * Acceptance-axis labels for opt-out signalling on Epics that
105
- * intentionally have no acceptance-table coverage. (Story #4324 retired
106
- * the `context::tech-spec` / `context::acceptance-spec` label classes —
107
- * planning content now lives as managed sections of the Epic body. This
108
- * waiver survives with unchanged meaning: it waives the Epic body's
109
- * `## Acceptance Table` section instead of a ticket.)
110
- */
61
+ /** Waives the Epic body's `## Acceptance Table` section. */
111
62
  export const ACCEPTANCE_LABELS = {
112
63
  N_A: 'acceptance::n-a',
113
64
  };
114
65
 
115
66
  export const ACCEPTANCE_NA = ACCEPTANCE_LABELS.N_A;
116
67
 
117
- /**
118
- * Meta-axis labels for retrospective signal routing (Epic #2547 — feedback
119
- * loop). `meta::framework-gap` is applied to issues that surface a defect or
120
- * missing capability in the framework itself; `meta::consumer-improvement`
121
- * is applied to issues that surface improvements to a consumer project
122
- * (workflow tweaks, ergonomic asks, doc polish); `meta::platform-gap` is
123
- * applied to issues owned by neither — a shared base config, a runner fleet,
124
- * a cross-repo toolchain. The three mirror the ownership buckets in
125
- * `lib/github/framework-repo.js`, so a routed filing's label and its
126
- * destination repository cannot disagree. The `/mandrel-plan` Phase 0
127
- * fetcher (see `lib/feedback-loop/prior-feedback-fetcher.js`) reads open
128
- * issues carrying either label and surfaces them to the planner so retro
129
- * signals are routed into durable substrates rather than lost in chat.
130
- */
68
+ /** Mirror the ownership buckets in `lib/github/framework-repo.js`. */
131
69
  export const META_LABELS = {
132
70
  FRAMEWORK_GAP: 'meta::framework-gap',
133
71
  CONSUMER_IMPROVEMENT: 'meta::consumer-improvement',
134
72
  PLATFORM_GAP: 'meta::platform-gap',
135
73
  };
136
74
 
137
- /**
138
- * Risk-axis labels. Planning/audit metadata only — `risk::high` carries no
139
- * runtime behaviour (the single runtime pause point is `agent::blocked`, see
140
- * `.agents/instructions.md` § 1.J); it marks a ticket a human should look at
141
- * first. Applied by the audit filer to a Story whose merge contains a Critical
142
- * finding.
143
- *
144
- * Named here because it was a bare `'risk::high'` string literal in
145
- * `audit-to-stories/build-story-body.js` and defined by no taxonomy at all —
146
- * neither `LABEL_TAXONOMY` nor the audit bootstrap created it, so the audit
147
- * filer generated a label the repo did not have (Story #4877).
148
- */
75
+ /** Metadata only — the runtime pause is `agent::blocked`. */
149
76
  export const RISK_LABELS = {
150
77
  HIGH: 'risk::high',
151
78
  };
152
79
 
153
- /**
154
- * Planning-axis labels (Epic #2880 F7). Currently scoped to the
155
- * `planning::healthcheck-waived` operator-applied waiver — a historical
156
- * escape hatch for the retired post-plan readiness healthcheck. The
157
- * label remains in the taxonomy for tickets that still carry it; the
158
- * healthcheck CLI itself was deleted in the v2 epic-scripts sweep.
159
- *
160
- * Future planning-axis waivers (one per failing exit condition) extend
161
- * this enum so consumers can reference them by symbol.
162
- */
80
+ /** Legacy waiver for the retired post-plan healthcheck; kept for old tickets. */
163
81
  export const PLANNING_LABELS = {
164
82
  HEALTHCHECK_WAIVED: 'planning::healthcheck-waived',
165
83
  };
166
84
 
167
- /**
168
- * Convenience named export so callers can reach the constant without
169
- * indexing into PLANNING_LABELS — mirrors the ergonomics used by
170
- * ACCEPTANCE_NA. The literal value is
171
- * duplicated here (rather than aliased through PLANNING_LABELS) so a
172
- * grep for `PLANNING_HEALTHCHECK_WAIVED.*planning::healthcheck-waived`
173
- * matches a single line — see Story #2921 Task #2933 AC #1.
174
- */
85
+ /** Literal duplicated on purpose so a grep for name and value hits one line. */
175
86
  export const PLANNING_HEALTHCHECK_WAIVED = 'planning::healthcheck-waived';
176
87
 
177
88
  /**
178
- * Palette for the taxonomy; consumed by label-taxonomy.js and by the
179
- * feedback loop's just-in-time label mint (`graduator-core.ensureIssueLabels`).
180
- *
181
- * `META` and `FRICTION` are not in `LABEL_TAXONOMY`: the bootstrap runs once
182
- * at repo setup, but `friction::<category>` names are minted from live
183
- * telemetry and cannot be enumerated ahead of time. The graduator mints both
184
- * axes on demand instead — Story #4828, where their absence made every
185
- * `gh issue create` fail and the whole feedback loop file zero.
89
+ * `META`/`FRICTION` labels are minted on demand by the graduator (friction
90
+ * names come from live telemetry), not by the bootstrap taxonomy.
186
91
  */
187
92
  export const LABEL_COLORS = {
188
93
  TYPE: '#7057FF',
@@ -1,14 +1,6 @@
1
1
  /**
2
- * Shared data structures for GitHub labels and custom fields.
3
- * Used by the bootstrap script to idempotently configure the project.
4
- *
5
- * All label names are sourced from `label-constants.js` so renames only need
6
- * to happen in one place. Colors come from `LABEL_COLORS` in the same module.
7
- *
8
- * v2 deleted the behavioral persona concept (`.agents/personas/` +
9
- * `persona::*` labels). Role framing for spawns lives in `.agents/agents/`
10
- * via `delivery.routing.roleScopedAgents`; QA auth identities live in
11
- * `qa.personas` — neither is a GitHub label axis.
2
+ * GitHub label and project-field definitions the bootstrap applies
3
+ * idempotently. Names and colors come from `label-constants.js`.
12
4
  */
13
5
 
14
6
  import {
@@ -21,11 +13,6 @@ import {
21
13
  } from './label-constants.js';
22
14
 
23
15
  /**
24
- * The ticket-type axis. Both rows share one colour, so they are derived from
25
- * `[name, description]` pairs rather than restated as full literals — Story
26
- * #5139 added `type::epic` here, and the derived form absorbs it without
27
- * growing the file's structural weight.
28
- *
29
16
  * @type {Array<{ name: string, color: string, description: string }>}
30
17
  */
31
18
  const TYPE_LABEL_ROWS = [
@@ -39,10 +26,8 @@ const TYPE_LABEL_ROWS = [
39
26
 
40
27
  /** @type {Array<{ name: string, color: string, description: string }>} */
41
28
  export const LABEL_TAXONOMY = [
42
- // Type
43
29
  ...TYPE_LABEL_ROWS,
44
30
 
45
- // Agent State
46
31
  {
47
32
  name: AGENT_LABELS.REVIEW_SPEC,
48
33
  color: LABEL_COLORS.AGENT,
@@ -71,25 +56,18 @@ export const LABEL_TAXONOMY = [
71
56
  description: 'Agent work completed',
72
57
  },
73
58
 
74
- // Status
75
59
  {
76
60
  name: STATUS_LABELS.BLOCKED,
77
61
  color: LABEL_COLORS.STATUS_BLOCKED,
78
62
  description: 'Blocked by a dependency',
79
63
  },
80
64
 
81
- // Acceptance axis — explicit opt-out signal for Epics that
82
- // intentionally have no acceptance-table coverage (waives the Epic
83
- // body's ## Acceptance Table section — Story #4324).
84
65
  {
85
66
  name: ACCEPTANCE_LABELS.N_A,
86
67
  color: LABEL_COLORS.ACCEPTANCE,
87
68
  description: 'No acceptance specification required',
88
69
  },
89
70
 
90
- // Planning axis — operator-applied waivers for the planning → delivery
91
- // handoff gates. `healthcheck-waived` remains for tickets that still
92
- // carry the historical label; the healthcheck CLI was retired.
93
71
  {
94
72
  name: PLANNING_LABELS.HEALTHCHECK_WAIVED,
95
73
  color: LABEL_COLORS.PLANNING,
@@ -108,12 +86,8 @@ export const PROJECT_FIELD_DEFS = [
108
86
  ];
109
87
 
110
88
  /**
111
- * Canonical lifecycle options for the Status single-select field. These are
112
- * the three stock GitHub Projects v2 options; granular lifecycle state lives
113
- * in the `agent::*` labels and `ColumnSync` collapses each label onto one of
114
- * these three buckets via `LABEL_TO_COLUMN` in
115
- * `lib/orchestration/column-sync.js`. Order matches the order options appear
116
- * on a fresh GitHub board.
89
+ * The stock Projects v2 options, in board order; `column-sync.js` collapses
90
+ * each `agent::*` label onto one.
117
91
  *
118
92
  * @type {string[]}
119
93
  */
@@ -3,45 +3,14 @@ import { install as installAstCompat } from './escomplex-ast-compat.js';
3
3
  import { analyzeModule } from './escomplex-kernel.js';
4
4
  import { transpileIfNeeded } from './transpile.js';
5
5
 
6
- /**
7
- * Calculates the maintainability score of a JavaScript source file or string.
8
- * Uses `typhonjs-escomplex` internally, which provides a maintainability index
9
- * based on the Halstead Volume, Cyclomatic Complexity, and Lines of Code.
10
- *
11
- * The kernel's code generator predates the Babel AST its own parser emits, so
12
- * ordinary modern syntax (`?.`, `await` in a loop head, a regex in a loop
13
- * head, object spread in a default parameter) aborts the whole analysis.
14
- * `escomplex-ast-compat` repairs that before any scoring runs — see that
15
- * module for the defect and the upstream status.
16
- */
17
6
  installAstCompat();
18
7
 
19
- /**
20
- * Sentinel score for a file the kernel cannot analyse.
21
- *
22
- * A real maintainability index never reaches 0 for runnable code — the
23
- * escomplex floor is ~10–20 — so 0 has long been used as an out-of-band
24
- * "unscorable" marker. That overload is the bug: consumers drop `mi === 0`
25
- * rows, so an unscorable file silently vanishes from the baseline instead of
26
- * being reported, and no amount of re-seeding can ever give it a row.
27
- *
28
- * Deliberately module-private. The numeric return is kept for backwards
29
- * compatibility, but the *value* is not something a caller should branch on —
30
- * that is the overload this change exists to stop propagating. Callers that
31
- * need to tell "unscorable" from "genuinely terrible" read the `unscorable`
32
- * flag from {@link scoreSource} / {@link scoreFile}.
33
- */
8
+ /** Branch on the `unscorable` flag, never on this value. */
34
9
  const UNSCORABLE = 0;
35
10
 
36
11
  /**
37
- * Score a raw string, distinguishing "the kernel could not analyse this" from
38
- * "this scored badly".
39
- *
40
- * @param {string} sourceCode The JavaScript source code.
12
+ * @param {string} sourceCode
41
13
  * @returns {{ score: number, unscorable: boolean, reason: string|null }}
42
- * `score` is {@link UNSCORABLE} when `unscorable` is true; `reason` carries
43
- * the kernel's own error message so a consumer can report *why* rather than
44
- * just omitting the file.
45
14
  */
46
15
  export function scoreSource(sourceCode) {
47
16
  try {
@@ -65,42 +34,28 @@ function unscorable(reason) {
65
34
  }
66
35
 
67
36
  /**
68
- * Calculate score for a raw string of source code.
69
- *
70
- * Returns 0 for unscorable input, which is ambiguous by construction — see
71
- * {@link UNSCORABLE}. Prefer {@link scoreSource} in new code.
37
+ * Ambiguous 0 when unscorable — prefer {@link scoreSource}.
72
38
  *
73
- * @param {string} sourceCode The JavaScript source code.
74
- * @returns {number} Score between 0 and 171. Higher is better.
39
+ * @param {string} sourceCode
40
+ * @returns {number}
75
41
  */
76
42
  export function calculateForSource(sourceCode) {
77
43
  return scoreSource(sourceCode).score;
78
44
  }
79
45
 
80
46
  /**
81
- * Calculate score for a given file. TypeScript and TSX sources are
82
- * pre-transpiled in memory via `transpileIfNeeded` before being fed to
83
- * the JS-only escomplex kernel; the score for a TS file is identical to
84
- * the score the same logic would produce as plain JS, because TS type
85
- * annotations introduce no control flow.
86
- *
87
- * @param {string} filePath Path to the JS/TS source file.
88
- * @returns {number} Maintainability index, or 0 when the source cannot
89
- * be parsed (escomplex parse error or TS transpile failure).
47
+ * @param {string} filePath
48
+ * @returns {number}
90
49
  */
91
50
  export function calculateForFile(filePath) {
92
51
  return scoreFile(filePath).score;
93
52
  }
94
53
 
95
54
  /**
96
- * Score a file, distinguishing "unscorable" from "scored badly".
55
+ * TS is transpiled first. Transpile and kernel failures need different
56
+ * fixes, so they are reported separately.
97
57
  *
98
- * The transpile-failure and kernel-failure cases are reported separately
99
- * because they need different fixes: a transpile failure is usually the
100
- * consumer's own syntax or `tsconfig`, whereas a kernel failure is the
101
- * upstream generator gap described in `escomplex-ast-compat.js`.
102
- *
103
- * @param {string} filePath Path to the JS/TS source file.
58
+ * @param {string} filePath
104
59
  * @returns {{ score: number, unscorable: boolean, reason: string|null }}
105
60
  */
106
61
  export function scoreFile(filePath) {
@@ -120,15 +75,7 @@ export function scoreFile(filePath) {
120
75
  }
121
76
 
122
77
  /**
123
- * Produce a richer maintainability report that includes per-method scores.
124
- *
125
- * The module-level index from escomplex is heavily penalised by Halstead
126
- * volume, which means well-structured but long files (many small helpers)
127
- * score as "critical" even when no single function is complex. Consumers
128
- * that need to tier findings by real complexity should use `worstMethod`
129
- * (the lowest per-method maintainability) and fall back to `moduleScore`
130
- * for files that contain no methods (scripts that are purely top-level
131
- * statements).
78
+ * The module index is Halstead-volume dominated, so tier by `worstMethod`.
132
79
  *
133
80
  * @param {string} sourceCode
134
81
  * @returns {{
@@ -176,9 +123,6 @@ export function calculateReport(sourceCode) {
176
123
  }
177
124
 
178
125
  /**
179
- * Convenience wrapper that reads a file from disk and produces a report.
180
- * TypeScript and TSX sources are transpiled in memory before scoring.
181
- *
182
126
  * @param {string} filePath
183
127
  * @returns {ReturnType<typeof calculateReport>}
184
128
  */
@@ -205,19 +149,7 @@ export function calculateReportForFile(filePath) {
205
149
  }
206
150
 
207
151
  /**
208
- * Classify a maintainability report into a severity tier.
209
- *
210
- * Tiering rules (chosen after the v5.11 calibration issue where clean
211
- * multi-hundred-line scripts scored 0 at the module level):
212
- *
213
- * - 🔴 critical — a real hotspot: some method scores < 20, OR the file
214
- * contains no methods and the module scores < 40.
215
- * - 🟡 warning — size- or volume-driven signal: worst method < 50
216
- * OR module score < 65 (but no critical method).
217
- * - 🟢 healthy — every method scores ≥ 50 and module ≥ 65.
218
- *
219
- * File-size-driven module-score drops land in the warning tier, not the
220
- * critical tier — they should nudge the reviewer, not block the sprint.
152
+ * Size-driven module drops only reach `warning`; `critical` is a real hotspot.
221
153
  *
222
154
  * @param {ReturnType<typeof calculateReport>} report
223
155
  * @returns {'critical' | 'warning' | 'healthy' | 'parse-error'}
@@ -1,24 +1,12 @@
1
1
  /**
2
- * maintainability-unscorable.js — reporting for files the MI kernel cannot
3
- * analyse.
4
- *
5
- * A file the kernel throws on has no maintainability index, so it gets no
6
- * baseline row — a phantom `mi: 0` would poison the `min`/p50 rollup and let
7
- * real regressions hide behind it. Dropping the row is therefore correct; doing
8
- * it *silently* is not. Without a report, an unscorable file is
9
- * indistinguishable from a file nobody added yet: the scorer emits nothing, the
10
- * scope gate sees an absence it cannot explain, and re-seeding the baseline can
11
- * never produce the missing row no matter how many times it runs.
12
- *
13
- * Kept separate from `maintainability-utils.js` so the scoring path stays about
14
- * scoring and this stays about explaining.
2
+ * maintainability-unscorable.js — report files the MI kernel cannot analyse.
3
+ * They get no baseline row (a phantom `mi: 0` would poison the rollup), but
4
+ * dropping them silently makes them indistinguishable from unseeded files.
15
5
  */
16
6
 
17
7
  import { Logger } from './Logger.js';
18
8
 
19
9
  /**
20
- * Report every unscorable file, then summarise.
21
- *
22
10
  * @param {Array<{ relPath: string, unscorable?: boolean, reason?: string|null }>} perFile
23
11
  * @returns {number} how many files were unscorable, for the caller's own use.
24
12
  */
@@ -41,16 +29,8 @@ export function reportUnscorable(perFile) {
41
29
  }
42
30
 
43
31
  /**
44
- * Whether a per-file entry carries a real maintainability index and so belongs
45
- * in the baseline.
46
- *
47
- * An unscorable entry carries the sentinel score, not an index — letting it
48
- * through would write an `mi: 0` phantom and drag the rollup floor down with it
49
- * (Story #2467). `score === null` is the separate I/O-failure case.
50
- *
51
- * Tests for a *number* rather than `score !== null`, because the latter passes
52
- * anything absent: `undefined !== null` is true, so a missing entry or one with
53
- * no `score` key at all would have been treated as scored.
32
+ * Tests for a number, not `score !== null` (which lets `undefined` through);
33
+ * unscorable entries carry a sentinel, not an index.
54
34
  *
55
35
  * @param {{ score?: number|null, unscorable?: boolean }} entry
56
36
  * @returns {boolean}
@@ -13,8 +13,6 @@ const MAINTAINABILITY_WORKER_URL = new URL(
13
13
  import.meta.url,
14
14
  );
15
15
 
16
- // Pool-vs-serial cutover — single-sourced in cpu-pool.js (see the
17
- // POOL_SERIAL_THRESHOLD docstring for the tuning rationale).
18
16
  const SERIAL_THRESHOLD = POOL_SERIAL_THRESHOLD;
19
17
 
20
18
  const IGNORED_DIRS = new Set([
@@ -28,24 +26,9 @@ const IGNORED_DIRS = new Set([
28
26
  ]);
29
27
 
30
28
  /**
31
- * Compiled-matcher cache for `isIgnoredByGlobs`, keyed on the pattern list.
32
- *
33
- * `minimatch(path, glob)` re-parses `glob` into an AST on every call, so the
34
- * scan was paying O(files × globs) glob *compilations* to answer O(files ×
35
- * globs) glob *matches* — 12–17 ms over the 619-file tree against 0.5 ms
36
- * once the patterns are compiled (Story #5109). The number of distinct
37
- * pattern lists in a process is tiny (one per gate), and each list is
38
- * config-derived and immutable, so an unbounded `Map` keyed on the joined
39
- * patterns is bounded in practice.
40
- *
41
- * Each entry also memoises the per-path verdict. The baseline gates ask the
42
- * same question about the same path many times over — `crap.json` carries
43
- * thousands of method rows spread over a few hundred files, and the evaluate
44
- * phase filters every row — so the second and later asks about a path cost a
45
- * `Map` lookup instead of a globstar walk. Both caches are keyed on
46
- * config-derived, immutable inputs, and both are bounded by the tree the
47
- * process is scanning.
48
- *
29
+ * Compiled matchers plus a per-path verdict memo, keyed on the pattern list:
30
+ * functional `minimatch()` recompiles per call, and the gates ask about the
31
+ * same path once per CRAP row. Inputs are immutable config, so it is bounded.
49
32
  * `\u0000` is the join separator because it cannot occur in a glob, so two
50
33
  * different lists cannot collide onto one key.
51
34
  *
@@ -54,12 +37,7 @@ const IGNORED_DIRS = new Set([
54
37
  const IGNORE_MATCHER_CACHE = new Map();
55
38
 
56
39
  /**
57
- * Compile (once) the `Minimatch` instances for a pattern list, alongside the
58
- * per-path verdict memo that shares their lifetime.
59
- *
60
- * Non-string patterns are dropped rather than compiled — `minimatch()` would
61
- * have thrown on them, and the functional call site never fed it any, so
62
- * dropping preserves the observable result set.
40
+ * Non-string patterns are dropped rather than compiled.
63
41
  *
64
42
  * @param {string[]} ignoreGlobs
65
43
  * @returns {{matchers: import('minimatch').Minimatch[], verdicts: Map<string, boolean>}}
@@ -79,22 +57,10 @@ function ignoreMatcherEntry(ignoreGlobs) {
79
57
  }
80
58
 
81
59
  /**
82
- * Test whether an absolute (or repo-relative) file path matches any of the
83
- * configured `ignoreGlobs`. This is the single source of truth for how the
84
- * maintainability scorer decides a file is ignored: both the full-scope
85
- * directory walk (`scanDirectory` below) and the diff-scope file-list path
86
- * in `refresh-service.js` MUST funnel through it so an `ignoreGlobs`-listed
87
- * file is excluded identically in both scopes (a diff-scope refresh that
88
- * skipped this check would let an ignored file poison the `rollup["*"].min`
89
- * floor — see `buildDefaultMaintainabilityScorer`).
90
- *
91
- * Matching mirrors `scanDirectory`: the path is reduced to a canonicalised,
92
- * POSIX, repo-relative form and tested against each glob with minimatch's
93
- * `{ dot: true }` so dot-prefixed roots like `.agents/` match. The patterns
94
- * are compiled at most once per distinct list (see `IGNORE_MATCHER_CACHE`);
95
- * the matched set is identical to the functional `minimatch()` call this
96
- * replaced, which is what the `gate-scan-fast-path` test pins over the real
97
- * configured `ignoreGlobs`.
60
+ * The single ignore-glob test: the full-scope walk and the diff-scope refresh
61
+ * both funnel through it, or an ignored file could poison the
62
+ * `rollup["*"].min` floor in one scope. `{ dot: true }` lets `.agents/`
63
+ * match.
98
64
  *
99
65
  * @param {string} filePath absolute or relative path to the source file
100
66
  * @param {string[]} ignoreGlobs minimatch patterns; empty/absent is a no-op
@@ -102,9 +68,6 @@ function ignoreMatcherEntry(ignoreGlobs) {
102
68
  * @returns {boolean} true when the file matches at least one ignore glob
103
69
  */
104
70
  /**
105
- * Reduce an absolute-or-relative path to the canonicalised, POSIX,
106
- * repo-relative form the ignore patterns are written against.
107
- *
108
71
  * @param {string} filePath
109
72
  * @param {string} matchCwd
110
73
  * @returns {string}
@@ -118,14 +81,7 @@ function canonicalRelPath(filePath, matchCwd) {
118
81
  }
119
82
 
120
83
  /**
121
- * Answer "does this path match any of the entry's patterns", consulting and
122
- * populating the entry's verdict memo.
123
- *
124
- * Split out of `isIgnoredByGlobs` rather than inlined: the memo's
125
- * hit/miss test is a branch, and folding it into the caller pushed that
126
- * function from cyclomatic 4 to 5 — over the per-method CRAP contract the
127
- * pre-push preview enforces. The lookup belongs beside the cache it reads
128
- * anyway, and the hot function keeps a flat shape.
84
+ * Split out to keep `isIgnoredByGlobs` under the per-method CRAP contract.
129
85
  *
130
86
  * @param {{matchers: import('minimatch').Minimatch[], verdicts: Map<string, boolean>}} entry
131
87
  * @param {string} relPath Canonicalised, POSIX, repo-relative path.
@@ -149,22 +105,12 @@ export function isIgnoredByGlobs(filePath, ignoreGlobs = [], cwd) {
149
105
  }
150
106
 
151
107
  /**
152
- * Recursively scans a directory for JS/TS source files, selecting them by
153
- * the shared `SCORABLE_SOURCE_EXTENSIONS` set (`source-extensions.js`) so the
154
- * walk, the coverage-freshness check and the close-validation CRAP projection
155
- * cannot drift apart. Directories listed
156
- * in `IGNORED_DIRS` (including `coverage` and `.next`, added in 5.29.0
157
- * to skip vitest's istanbul HTML scaffolding and Next.js build output)
158
- * are skipped.
108
+ * Recursively collect scorable source files, using the shared extension set
109
+ * so the walk, coverage freshness and CRAP projection cannot drift apart.
159
110
  *
160
111
  * @param {string} dir
161
112
  * @param {string[]} fileList
162
113
  * @param {{ ignoreGlobs?: string[], cwd?: string }} [opts]
163
- * `ignoreGlobs` — minimatch patterns matched against the canonicalised
164
- * repo-relative path of each discovered file. Files whose path matches
165
- * any pattern are excluded before scoring. Absent/empty is a no-op.
166
- * `cwd` — root used to compute repo-relative paths for glob matching;
167
- * defaults to `process.cwd()` when omitted.
168
114
  * @returns {string[]}
169
115
  */
170
116
  export function scanDirectory(dir, fileList = [], opts = {}) {
@@ -195,35 +141,13 @@ export function scanDirectory(dir, fileList = [], opts = {}) {
195
141
  }
196
142
 
197
143
  /**
198
- * Calculates maintainability scores for a list of file paths.
199
- *
200
- * Each file's transpile-then-analyze unit is dispatched to a
201
- * worker_threads pool whose width `runOnPool` resolves. Workers
202
- * are recycled across files so TypeScript loads at most once per
203
- * worker. The pool is bypassed for batches of fewer than
204
- * `SERIAL_THRESHOLD` files because spawn overhead dominates at small
205
- * sizes — the in-process path matches the pre-pool serial behaviour
206
- * byte-for-byte.
207
- *
208
- * Output is sorted by relative file path so the returned object is
209
- * insertion-order-stable regardless of which worker happened to
210
- * finish first. Files that fail to read/transpile/parse are dropped
211
- * from the result (matching the pre-pool log-and-continue contract);
212
- * worker-side per-item failures surface as a `null` score that is
213
- * filtered out before assembly.
214
- *
215
- * A file the kernel cannot analyse is also dropped — a phantom `mi: 0` row
216
- * poisons the rollup — but it is **reported** on the way out, with the
217
- * kernel's own error text, and the count is summarised at the end of the run.
218
- * Silently omitting these is what let a file sit unmeasured indefinitely: the
219
- * scorer emitted no row, so no amount of re-seeding could ever produce one,
220
- * and nothing said so.
144
+ * Score files on a worker pool (serial below the cutover, where spawn cost
145
+ * dominates). Output is sorted by path so it is stable across worker timing.
146
+ * Failed and unscorable files are dropped — a phantom `mi: 0` poisons the
147
+ * rollup — but unscorable ones are reported, never silently omitted.
221
148
  *
222
149
  * @param {string[]} paths
223
- * @param {{serialThreshold?: number}} [opts] `serialThreshold` overrides the
224
- * pool-vs-serial cutover for this call only. Production callers omit it;
225
- * the parity tests use it to drive the pooled path on a small fixture set
226
- * rather than materialising 256 files to clear the cutover.
150
+ * @param {{serialThreshold?: number}} [opts] Test seam for the cutover.
227
151
  * @returns {Promise<Record<string, number>>}
228
152
  */
229
153
  export async function calculateAll(paths, opts = {}) {