mandrel 2.60.0 → 2.62.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (662) hide show
  1. package/.agents/README.md +10 -10
  2. package/.agents/agents/story-worker.md +1 -1
  3. package/.agents/docs/agentrc-reference.json +4 -82
  4. package/.agents/docs/configuration.md +20 -87
  5. package/.agents/docs/workflows.md +1 -1
  6. package/.agents/instructions.md +1 -3
  7. package/.agents/rules/gherkin-standards.md +4 -0
  8. package/.agents/schemas/agentrc.schema.json +11 -486
  9. package/.agents/schemas/story-deliver-terminal.schema.json +10 -0
  10. package/.agents/schemas/validation-evidence.schema.json +2 -1
  11. package/.agents/scripts/README.md +14 -14
  12. package/.agents/scripts/acceptance-eval.js +32 -164
  13. package/.agents/scripts/agents-bootstrap-github.js +27 -129
  14. package/.agents/scripts/apply-quality-bootstrap.js +4 -40
  15. package/.agents/scripts/audit-baselines.js +6 -27
  16. package/.agents/scripts/audit-labels-bootstrap.js +5 -29
  17. package/.agents/scripts/audit-to-stories.js +91 -361
  18. package/.agents/scripts/boot-sweep.js +19 -72
  19. package/.agents/scripts/bootstrap.js +74 -395
  20. package/.agents/scripts/ceremony-derive.js +9 -45
  21. package/.agents/scripts/check-arch-cycles.js +14 -64
  22. package/.agents/scripts/check-baselines.js +8 -48
  23. package/.agents/scripts/check-context-budget.js +46 -172
  24. package/.agents/scripts/check-cyclomatic.js +12 -44
  25. package/.agents/scripts/check-dead-exports.js +13 -64
  26. package/.agents/scripts/check-doc-links.js +38 -186
  27. package/.agents/scripts/check-gherkin-corpus.js +24 -127
  28. package/.agents/scripts/check-test-temp-hygiene.js +28 -169
  29. package/.agents/scripts/coverage-capture.js +32 -99
  30. package/.agents/scripts/deliver-light.js +14 -101
  31. package/.agents/scripts/deliver-recover.js +6 -42
  32. package/.agents/scripts/deliver-run.js +36 -133
  33. package/.agents/scripts/diagnose-friction.js +24 -116
  34. package/.agents/scripts/drain-pending-cleanup.js +1 -1
  35. package/.agents/scripts/evidence-gate.js +23 -85
  36. package/.agents/scripts/file-ci-gap.js +10 -50
  37. package/.agents/scripts/generate-config-docs.js +30 -170
  38. package/.agents/scripts/generate-lens-checklists.js +8 -52
  39. package/.agents/scripts/generate-skills-index.js +14 -112
  40. package/.agents/scripts/generate-workflows-doc.js +10 -70
  41. package/.agents/scripts/git-cleanup.js +2 -34
  42. package/.agents/scripts/lib/Graph.js +24 -81
  43. package/.agents/scripts/lib/ITicketingProvider.js +47 -143
  44. package/.agents/scripts/lib/Logger.js +14 -76
  45. package/.agents/scripts/lib/audit-baselines/engine.js +11 -31
  46. package/.agents/scripts/lib/audit-baselines/gate-surface.js +3 -17
  47. package/.agents/scripts/lib/audit-baselines/headroom.js +4 -20
  48. package/.agents/scripts/lib/audit-baselines/hotspots.js +3 -15
  49. package/.agents/scripts/lib/audit-baselines/kinds.js +23 -89
  50. package/.agents/scripts/lib/audit-baselines/outliers.js +6 -23
  51. package/.agents/scripts/lib/audit-baselines/read.js +3 -16
  52. package/.agents/scripts/lib/audit-baselines/staleness.js +7 -26
  53. package/.agents/scripts/lib/audit-baselines/surface-entry.js +7 -28
  54. package/.agents/scripts/lib/audit-baselines/trend.js +7 -20
  55. package/.agents/scripts/lib/audit-baselines/weights.js +9 -37
  56. package/.agents/scripts/lib/audit-suite/audit-rules-reader.js +3 -18
  57. package/.agents/scripts/lib/audit-suite/checklist-threading.js +26 -124
  58. package/.agents/scripts/lib/audit-suite/dispatch-checklist.js +14 -45
  59. package/.agents/scripts/lib/audit-suite/findings.js +12 -52
  60. package/.agents/scripts/lib/audit-suite/frontmatter.js +5 -29
  61. package/.agents/scripts/lib/audit-suite/index.js +1 -15
  62. package/.agents/scripts/lib/audit-suite/lens-checklist.js +10 -45
  63. package/.agents/scripts/lib/audit-suite/lens-diff-floor.js +11 -76
  64. package/.agents/scripts/lib/audit-suite/runner.js +13 -43
  65. package/.agents/scripts/lib/audit-suite/selector.js +49 -349
  66. package/.agents/scripts/lib/audit-suite/substitutions.js +12 -40
  67. package/.agents/scripts/lib/audit-suite/workflow-loader.js +3 -15
  68. package/.agents/scripts/lib/audit-to-stories/audit-label-taxonomy.js +11 -73
  69. package/.agents/scripts/lib/audit-to-stories/audit-lenses.js +8 -37
  70. package/.agents/scripts/lib/audit-to-stories/build-story-body.js +25 -143
  71. package/.agents/scripts/lib/audit-to-stories/dedupe-against-github.js +14 -80
  72. package/.agents/scripts/lib/audit-to-stories/epic-grouping-directive.js +4 -18
  73. package/.agents/scripts/lib/audit-to-stories/finding-adapter.js +7 -40
  74. package/.agents/scripts/lib/audit-to-stories/group-findings.js +9 -39
  75. package/.agents/scripts/lib/audit-to-stories/issue-corpus.js +10 -66
  76. package/.agents/scripts/lib/audit-to-stories/issue-index.js +6 -30
  77. package/.agents/scripts/lib/audit-to-stories/issues-file.js +6 -36
  78. package/.agents/scripts/lib/audit-to-stories/ledger-commit.js +17 -69
  79. package/.agents/scripts/lib/audit-to-stories/ledger-pr.js +17 -85
  80. package/.agents/scripts/lib/audit-to-stories/ledger-record.js +10 -48
  81. package/.agents/scripts/lib/audit-to-stories/parse-audit-md.js +38 -146
  82. package/.agents/scripts/lib/audit-to-stories/seed-from-findings.js +7 -42
  83. package/.agents/scripts/lib/audit-to-stories/wire-dependencies.js +10 -57
  84. package/.agents/scripts/lib/baseline-loader.js +12 -51
  85. package/.agents/scripts/lib/baseline-schema-registry.js +5 -22
  86. package/.agents/scripts/lib/baselines/component-matcher.js +3 -12
  87. package/.agents/scripts/lib/baselines/components.js +10 -61
  88. package/.agents/scripts/lib/baselines/coverage-updater-cli.js +7 -36
  89. package/.agents/scripts/lib/baselines/crap-preview-incremental.js +5 -21
  90. package/.agents/scripts/lib/baselines/crap-preview-scan.js +19 -45
  91. package/.agents/scripts/lib/baselines/crap-updater-cli.js +16 -65
  92. package/.agents/scripts/lib/baselines/diff-scope-cli.js +5 -33
  93. package/.agents/scripts/lib/baselines/duplication-scanner.js +11 -60
  94. package/.agents/scripts/lib/baselines/env-overrides.js +12 -67
  95. package/.agents/scripts/lib/baselines/envelope.js +13 -129
  96. package/.agents/scripts/lib/baselines/exit-codes.js +6 -49
  97. package/.agents/scripts/lib/baselines/git-base.js +23 -142
  98. package/.agents/scripts/lib/baselines/kernel.js +11 -111
  99. package/.agents/scripts/lib/baselines/kinds/_crap-new-method-gate.js +9 -47
  100. package/.agents/scripts/lib/baselines/kinds/_crap-read.js +8 -51
  101. package/.agents/scripts/lib/baselines/kinds/_shared-metric.js +7 -62
  102. package/.agents/scripts/lib/baselines/kinds/bundle-size.js +8 -29
  103. package/.agents/scripts/lib/baselines/kinds/coverage.js +3 -15
  104. package/.agents/scripts/lib/baselines/kinds/crap.js +94 -415
  105. package/.agents/scripts/lib/baselines/kinds/duplication.js +4 -30
  106. package/.agents/scripts/lib/baselines/kinds/kind-factory.js +7 -53
  107. package/.agents/scripts/lib/baselines/kinds/maintainability.js +15 -80
  108. package/.agents/scripts/lib/baselines/kinds/mutation.js +12 -72
  109. package/.agents/scripts/lib/baselines/maintainability-baseline-io.js +4 -11
  110. package/.agents/scripts/lib/baselines/merge-envelopes.js +30 -146
  111. package/.agents/scripts/lib/baselines/path-canon.js +19 -128
  112. package/.agents/scripts/lib/baselines/preview-gates.js +8 -37
  113. package/.agents/scripts/lib/baselines/reader.js +14 -107
  114. package/.agents/scripts/lib/baselines/refresh-service.js +35 -252
  115. package/.agents/scripts/lib/baselines/scope.js +11 -135
  116. package/.agents/scripts/lib/baselines/writer.js +16 -149
  117. package/.agents/scripts/lib/bdd-runner-detect.js +18 -113
  118. package/.agents/scripts/lib/bdd-scenario-budget.js +9 -36
  119. package/.agents/scripts/lib/bdd-scenario-scanner.js +11 -73
  120. package/.agents/scripts/lib/bdd-step-index.js +26 -100
  121. package/.agents/scripts/lib/bootstrap/baseline-merge-driver.js +23 -103
  122. package/.agents/scripts/lib/bootstrap/branch-protection.js +2 -5
  123. package/.agents/scripts/lib/bootstrap/commit-push.js +12 -50
  124. package/.agents/scripts/lib/bootstrap/gh-preflight.js +14 -101
  125. package/.agents/scripts/lib/bootstrap/hitl-confirm.js +5 -30
  126. package/.agents/scripts/lib/bootstrap/install-ledger.js +17 -73
  127. package/.agents/scripts/lib/bootstrap/issue-forms-template.js +17 -121
  128. package/.agents/scripts/lib/bootstrap/manifest.js +15 -86
  129. package/.agents/scripts/lib/bootstrap/merge-methods.js +4 -33
  130. package/.agents/scripts/lib/bootstrap/preflight.js +12 -61
  131. package/.agents/scripts/lib/bootstrap/project-bootstrap.js +34 -235
  132. package/.agents/scripts/lib/bootstrap/prompt.js +21 -129
  133. package/.agents/scripts/lib/bootstrap/quality-bootstrap.js +27 -141
  134. package/.agents/scripts/lib/bootstrap/summary.js +1 -8
  135. package/.agents/scripts/lib/bootstrap/workflow-audit.js +11 -84
  136. package/.agents/scripts/lib/branch-name-guard.js +4 -23
  137. package/.agents/scripts/lib/changed-files.js +31 -143
  138. package/.agents/scripts/lib/checks/core-bare-clean.js +4 -24
  139. package/.agents/scripts/lib/checks/index.js +18 -101
  140. package/.agents/scripts/lib/checks/loop-health.js +11 -53
  141. package/.agents/scripts/lib/checks/state.js +16 -91
  142. package/.agents/scripts/lib/checks/story-init-not-backgrounded.js +10 -61
  143. package/.agents/scripts/lib/checks/subagent-agent-tool-required.js +14 -83
  144. package/.agents/scripts/lib/child-exec.js +39 -108
  145. package/.agents/scripts/lib/cli/standard-args.js +9 -116
  146. package/.agents/scripts/lib/cli-args.js +31 -146
  147. package/.agents/scripts/lib/cli-usage.js +5 -27
  148. package/.agents/scripts/lib/cli-utils.js +2 -12
  149. package/.agents/scripts/lib/close-validation/commands.js +13 -76
  150. package/.agents/scripts/lib/close-validation/gates.js +92 -331
  151. package/.agents/scripts/lib/close-validation/process.js +121 -151
  152. package/.agents/scripts/lib/close-validation/projections/advisories.js +5 -31
  153. package/.agents/scripts/lib/close-validation/projections/crap.js +19 -67
  154. package/.agents/scripts/lib/close-validation/projections/head-sha.js +1 -17
  155. package/.agents/scripts/lib/close-validation/projections/inputs.js +4 -34
  156. package/.agents/scripts/lib/close-validation/projections/maintainability.js +11 -58
  157. package/.agents/scripts/lib/close-validation/runner.js +53 -110
  158. package/.agents/scripts/lib/command-header.js +6 -28
  159. package/.agents/scripts/lib/config/acceptance-eval.js +4 -30
  160. package/.agents/scripts/lib/config/baselines.js +3 -14
  161. package/.agents/scripts/lib/config/ci.js +8 -38
  162. package/.agents/scripts/lib/config/commands.js +1 -15
  163. package/.agents/scripts/lib/config/defaults.js +4 -33
  164. package/.agents/scripts/lib/config/delivery-routing.js +6 -35
  165. package/.agents/scripts/lib/config/explain.js +9 -80
  166. package/.agents/scripts/lib/config/gates/coverage.schema.js +0 -12
  167. package/.agents/scripts/lib/config/gates/crap-incremental-coverage.schema.js +2 -30
  168. package/.agents/scripts/lib/config/gates/crap.schema.js +1 -34
  169. package/.agents/scripts/lib/config/gates/duplication.schema.js +1 -8
  170. package/.agents/scripts/lib/config/gates/index.js +2 -17
  171. package/.agents/scripts/lib/config/gates/maintainability.schema.js +1 -20
  172. package/.agents/scripts/lib/config/gates/mutation.schema.js +1 -7
  173. package/.agents/scripts/lib/config/gates/shared.js +4 -64
  174. package/.agents/scripts/lib/config/github.js +4 -22
  175. package/.agents/scripts/lib/config/limits.js +4 -57
  176. package/.agents/scripts/lib/config/paths.js +2 -21
  177. package/.agents/scripts/lib/config/qa.js +4 -38
  178. package/.agents/scripts/lib/config/quality.js +76 -432
  179. package/.agents/scripts/lib/config/runners.js +12 -56
  180. package/.agents/scripts/lib/config/runtime.js +13 -57
  181. package/.agents/scripts/lib/config/shared.js +2 -16
  182. package/.agents/scripts/lib/config/sync-agentrc.js +9 -50
  183. package/.agents/scripts/lib/config/temp-paths.js +40 -280
  184. package/.agents/scripts/lib/config/validate-orchestration.js +5 -17
  185. package/.agents/scripts/lib/config/worktree-isolation.js +9 -28
  186. package/.agents/scripts/lib/config-resolver.js +10 -52
  187. package/.agents/scripts/lib/config-schema-shared.js +1 -4
  188. package/.agents/scripts/lib/config-settings-schema-delivery.js +12 -294
  189. package/.agents/scripts/lib/config-settings-schema-quality.js +7 -219
  190. package/.agents/scripts/lib/config-settings-schema.js +37 -274
  191. package/.agents/scripts/lib/coverage-baseline.js +20 -110
  192. package/.agents/scripts/lib/coverage-capture-fullscope.js +12 -37
  193. package/.agents/scripts/lib/coverage-capture-incremental.js +12 -43
  194. package/.agents/scripts/lib/coverage-capture-usage.js +4 -24
  195. package/.agents/scripts/lib/coverage-capture.js +99 -224
  196. package/.agents/scripts/lib/coverage-utils.js +14 -79
  197. package/.agents/scripts/lib/cpu-pool.js +17 -123
  198. package/.agents/scripts/lib/crap-baseline-join.js +16 -88
  199. package/.agents/scripts/lib/crap-coordinates.js +6 -25
  200. package/.agents/scripts/lib/crap-engine.js +40 -153
  201. package/.agents/scripts/lib/crap-method-identity.js +16 -78
  202. package/.agents/scripts/lib/crap-utils.js +31 -155
  203. package/.agents/scripts/lib/cyclomatic-ceiling.js +14 -87
  204. package/.agents/scripts/lib/cyclomatic-scope.js +10 -50
  205. package/.agents/scripts/lib/dead-exports-knip.js +18 -56
  206. package/.agents/scripts/lib/dead-exports-mode.js +5 -24
  207. package/.agents/scripts/lib/degraded-mode.js +3 -26
  208. package/.agents/scripts/lib/dependency-parser.js +8 -40
  209. package/.agents/scripts/lib/dependency-version.js +13 -35
  210. package/.agents/scripts/lib/detect-package-manager.js +6 -36
  211. package/.agents/scripts/lib/doc-tiers.js +22 -126
  212. package/.agents/scripts/lib/duplicate-search.js +8 -72
  213. package/.agents/scripts/lib/env-loader.js +5 -27
  214. package/.agents/scripts/lib/error-redactor.js +6 -31
  215. package/.agents/scripts/lib/errors/index.js +2 -22
  216. package/.agents/scripts/lib/escomplex-ast-compat.js +22 -163
  217. package/.agents/scripts/lib/escomplex-kernel.js +21 -123
  218. package/.agents/scripts/lib/feedback-loop/graduator-core.js +93 -419
  219. package/.agents/scripts/lib/feedback-loop/prior-feedback-fetcher.js +20 -98
  220. package/.agents/scripts/lib/feedback-loop/retro-proposals-graduator.js +27 -151
  221. package/.agents/scripts/lib/findings/audit-ledger.js +23 -97
  222. package/.agents/scripts/lib/findings/classify-finding.js +14 -69
  223. package/.agents/scripts/lib/findings/promote-finding.js +14 -112
  224. package/.agents/scripts/lib/findings/provenance-field.js +11 -52
  225. package/.agents/scripts/lib/findings/route-finding.js +37 -255
  226. package/.agents/scripts/lib/findings/semantic-issue-search.js +14 -59
  227. package/.agents/scripts/lib/findings/severity.js +18 -104
  228. package/.agents/scripts/lib/format-generated-json.js +12 -44
  229. package/.agents/scripts/lib/full-suite-lock.js +160 -429
  230. package/.agents/scripts/lib/full-suite-queue.js +213 -0
  231. package/.agents/scripts/lib/gates/baseline-store.js +5 -9
  232. package/.agents/scripts/lib/gates/friction.js +1 -3
  233. package/.agents/scripts/lib/generated/agentrc-validator.js +2 -2
  234. package/.agents/scripts/lib/gh-exec.js +31 -259
  235. package/.agents/scripts/lib/git/cached-fetch.js +9 -52
  236. package/.agents/scripts/lib/git/sync-from-base.js +15 -107
  237. package/.agents/scripts/lib/git-branch-cleanup.js +14 -61
  238. package/.agents/scripts/lib/git-branch-lifecycle.js +16 -87
  239. package/.agents/scripts/lib/git-utils.js +37 -161
  240. package/.agents/scripts/lib/github/framework-repo.js +8 -71
  241. package/.agents/scripts/lib/github-url.js +2 -17
  242. package/.agents/scripts/lib/import-graph.js +11 -38
  243. package/.agents/scripts/lib/install-cmd-parser.js +4 -13
  244. package/.agents/scripts/lib/json-utils.js +3 -18
  245. package/.agents/scripts/lib/label-constants.js +16 -111
  246. package/.agents/scripts/lib/label-taxonomy.js +4 -30
  247. package/.agents/scripts/lib/maintainability-engine.js +12 -80
  248. package/.agents/scripts/lib/maintainability-unscorable.js +5 -25
  249. package/.agents/scripts/lib/maintainability-utils.js +16 -92
  250. package/.agents/scripts/lib/mandrel-catalog.js +12 -70
  251. package/.agents/scripts/lib/notifications/notifier.js +13 -38
  252. package/.agents/scripts/lib/npm-scripts.js +4 -23
  253. package/.agents/scripts/lib/observability/metrics-ledger.js +16 -76
  254. package/.agents/scripts/lib/observability/runtime-friction.js +44 -286
  255. package/.agents/scripts/lib/observability/signal-validator.js +5 -37
  256. package/.agents/scripts/lib/observability/signals-writer.js +11 -121
  257. package/.agents/scripts/lib/observability/source-classifier.js +21 -203
  258. package/.agents/scripts/lib/observability/terse-result.js +14 -47
  259. package/.agents/scripts/lib/onboard/init-tail.js +13 -74
  260. package/.agents/scripts/lib/onboard/scaffold-docs.js +11 -34
  261. package/.agents/scripts/lib/orchestration/acceptance-eval-decision.js +25 -139
  262. package/.agents/scripts/lib/orchestration/auto-merge-cwd.js +11 -66
  263. package/.agents/scripts/lib/orchestration/behind-recovery.js +10 -55
  264. package/.agents/scripts/lib/orchestration/ceremony-routing.js +5 -75
  265. package/.agents/scripts/lib/orchestration/change-set.js +7 -36
  266. package/.agents/scripts/lib/orchestration/check-baselines/phases/compare.js +9 -46
  267. package/.agents/scripts/lib/orchestration/check-baselines/phases/evaluate.js +11 -44
  268. package/.agents/scripts/lib/orchestration/check-baselines/phases/floors.js +5 -24
  269. package/.agents/scripts/lib/orchestration/check-baselines/phases/friction.js +3 -12
  270. package/.agents/scripts/lib/orchestration/check-baselines/phases/parse-args.js +5 -38
  271. package/.agents/scripts/lib/orchestration/check-baselines/phases/pipeline.js +3 -8
  272. package/.agents/scripts/lib/orchestration/check-baselines/phases/refresh-ack.js +28 -136
  273. package/.agents/scripts/lib/orchestration/check-baselines/phases/report.js +3 -13
  274. package/.agents/scripts/lib/orchestration/check-state.js +92 -0
  275. package/.agents/scripts/lib/orchestration/ci-gap-intake.js +37 -144
  276. package/.agents/scripts/lib/orchestration/ci-rerun-guard.js +42 -189
  277. package/.agents/scripts/lib/orchestration/code-review.js +24 -128
  278. package/.agents/scripts/lib/orchestration/column-sync.js +23 -111
  279. package/.agents/scripts/lib/orchestration/complexity-gate.js +42 -214
  280. package/.agents/scripts/lib/orchestration/deliver-recover.js +36 -168
  281. package/.agents/scripts/lib/orchestration/dependency-analyzer.js +4 -35
  282. package/.agents/scripts/lib/orchestration/dependency-candidates.js +9 -41
  283. package/.agents/scripts/lib/orchestration/diff-magnitude.js +25 -115
  284. package/.agents/scripts/lib/orchestration/doc-reader.js +2 -6
  285. package/.agents/scripts/lib/orchestration/docs-digest.js +13 -51
  286. package/.agents/scripts/lib/orchestration/epic-candidates.js +13 -53
  287. package/.agents/scripts/lib/orchestration/epic-checklist.js +9 -33
  288. package/.agents/scripts/lib/orchestration/epic-container.js +41 -167
  289. package/.agents/scripts/lib/orchestration/epic-expansion.js +10 -40
  290. package/.agents/scripts/lib/orchestration/epic-rollup.js +55 -207
  291. package/.agents/scripts/lib/orchestration/file-assumption-enum.js +2 -22
  292. package/.agents/scripts/lib/orchestration/file-assumptions.js +45 -253
  293. package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-detect.js +9 -46
  294. package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-reap.js +7 -57
  295. package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches.js +21 -126
  296. package/.agents/scripts/lib/orchestration/git-cleanup/phases/cli.js +2 -6
  297. package/.agents/scripts/lib/orchestration/git-cleanup/phases/fast-forward.js +1 -4
  298. package/.agents/scripts/lib/orchestration/git-cleanup/phases/filters.js +1 -5
  299. package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes-ff.js +9 -34
  300. package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes.js +41 -190
  301. package/.agents/scripts/lib/orchestration/git-cleanup/phases/merged-tip.js +9 -45
  302. package/.agents/scripts/lib/orchestration/git-cleanup/phases/parse-args.js +1 -4
  303. package/.agents/scripts/lib/orchestration/git-cleanup/phases/phase-drivers.js +19 -85
  304. package/.agents/scripts/lib/orchestration/git-cleanup/phases/prompts.js +3 -17
  305. package/.agents/scripts/lib/orchestration/git-cleanup/phases/prune.js +1 -5
  306. package/.agents/scripts/lib/orchestration/git-cleanup/phases/render.js +16 -100
  307. package/.agents/scripts/lib/orchestration/git-cleanup/phases/stashes.js +1 -4
  308. package/.agents/scripts/lib/orchestration/lease-guard-shared.js +16 -67
  309. package/.agents/scripts/lib/orchestration/lifecycle/emit-ledger-event.js +9 -33
  310. package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-flip-failed.js +8 -29
  311. package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-unlanded.js +15 -68
  312. package/.agents/scripts/lib/orchestration/light-backstop.js +11 -49
  313. package/.agents/scripts/lib/orchestration/light-escalation.js +21 -89
  314. package/.agents/scripts/lib/orchestration/light-suitability.js +26 -231
  315. package/.agents/scripts/lib/orchestration/merge-block-class.js +39 -216
  316. package/.agents/scripts/lib/orchestration/merge-poll.js +104 -377
  317. package/.agents/scripts/lib/orchestration/merge-queue.js +158 -0
  318. package/.agents/scripts/lib/orchestration/pinned-identifier-lint.js +17 -57
  319. package/.agents/scripts/lib/orchestration/plan-context.js +52 -303
  320. package/.agents/scripts/lib/orchestration/plan-critic-conditions.js +22 -79
  321. package/.agents/scripts/lib/orchestration/plan-critics-evaluate.js +5 -31
  322. package/.agents/scripts/lib/orchestration/plan-metrics.js +29 -108
  323. package/.agents/scripts/lib/orchestration/plan-navigation.js +8 -27
  324. package/.agents/scripts/lib/orchestration/plan-persist/acceptance-handle-repair.js +12 -49
  325. package/.agents/scripts/lib/orchestration/plan-persist/audit-provenance.js +18 -73
  326. package/.agents/scripts/lib/orchestration/plan-persist/changes-repair.js +14 -78
  327. package/.agents/scripts/lib/orchestration/plan-persist/cross-plan-links.js +6 -30
  328. package/.agents/scripts/lib/orchestration/plan-persist/epic-adoption.js +14 -65
  329. package/.agents/scripts/lib/orchestration/plan-persist/epic-ops.js +21 -76
  330. package/.agents/scripts/lib/orchestration/plan-persist/external-deps.js +6 -43
  331. package/.agents/scripts/lib/orchestration/plan-persist/persist-helpers.js +14 -68
  332. package/.agents/scripts/lib/orchestration/plan-persist/plan-context-source.js +9 -41
  333. package/.agents/scripts/lib/orchestration/plan-persist/run-plan-persist.js +49 -248
  334. package/.agents/scripts/lib/orchestration/plan-persist/soft-findings.js +2 -12
  335. package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +85 -368
  336. package/.agents/scripts/lib/orchestration/plan-persist/summary.js +8 -38
  337. package/.agents/scripts/lib/orchestration/plan-persist/supersede-ops.js +30 -190
  338. package/.agents/scripts/lib/orchestration/plan-persist/wave-collision-gate.js +9 -49
  339. package/.agents/scripts/lib/orchestration/plan-persist/wave-serialisation.js +7 -28
  340. package/.agents/scripts/lib/orchestration/plan-reachability.js +13 -42
  341. package/.agents/scripts/lib/orchestration/plan-run-labels/reap.js +16 -91
  342. package/.agents/scripts/lib/orchestration/plan-runner/worktree-sweep.js +16 -54
  343. package/.agents/scripts/lib/orchestration/plan-text-hygiene.js +10 -52
  344. package/.agents/scripts/lib/orchestration/planning/authoring-context.js +14 -109
  345. package/.agents/scripts/lib/orchestration/planning/memory-pool-advisory.js +11 -83
  346. package/.agents/scripts/lib/orchestration/pr-watch.js +48 -306
  347. package/.agents/scripts/lib/orchestration/project-meta-cache.js +15 -80
  348. package/.agents/scripts/lib/orchestration/project-meta-resolver.js +10 -51
  349. package/.agents/scripts/lib/orchestration/reassert-status-column.js +12 -76
  350. package/.agents/scripts/lib/orchestration/remote-verifier.js +12 -36
  351. package/.agents/scripts/lib/orchestration/resolve-stories.js +33 -164
  352. package/.agents/scripts/lib/orchestration/retro-proposals.js +66 -361
  353. package/.agents/scripts/lib/orchestration/review-base-ref.js +9 -43
  354. package/.agents/scripts/lib/orchestration/review-depth.js +12 -94
  355. package/.agents/scripts/lib/orchestration/review-providers/codex.js +10 -111
  356. package/.agents/scripts/lib/orchestration/review-providers/degraded-gates.js +13 -71
  357. package/.agents/scripts/lib/orchestration/review-providers/findings-renderer.js +7 -51
  358. package/.agents/scripts/lib/orchestration/review-providers/mi-exemptions.js +8 -53
  359. package/.agents/scripts/lib/orchestration/review-providers/native.js +30 -214
  360. package/.agents/scripts/lib/orchestration/review-providers/parse-findings.js +7 -52
  361. package/.agents/scripts/lib/orchestration/review-providers/review-depth.js +4 -33
  362. package/.agents/scripts/lib/orchestration/review-providers/review-provider-factory.js +11 -71
  363. package/.agents/scripts/lib/orchestration/review-providers/scoped-lint.js +19 -131
  364. package/.agents/scripts/lib/orchestration/review-providers/security-review.js +6 -89
  365. package/.agents/scripts/lib/orchestration/review-providers/types.js +26 -56
  366. package/.agents/scripts/lib/orchestration/review-providers/ultrareview.js +3 -46
  367. package/.agents/scripts/lib/orchestration/run-epilogue.js +40 -199
  368. package/.agents/scripts/lib/orchestration/run-scoped-config.js +13 -81
  369. package/.agents/scripts/lib/orchestration/single-story-close/close-note.js +7 -34
  370. package/.agents/scripts/lib/orchestration/single-story-close/failed-terminal.js +16 -89
  371. package/.agents/scripts/lib/orchestration/single-story-close/gate-log.js +18 -109
  372. package/.agents/scripts/lib/orchestration/single-story-close/phases/auto-merge.js +190 -280
  373. package/.agents/scripts/lib/orchestration/single-story-close/phases/base-sync.js +18 -80
  374. package/.agents/scripts/lib/orchestration/single-story-close/phases/close-validation.js +103 -97
  375. package/.agents/scripts/lib/orchestration/single-story-close/phases/code-review.js +8 -64
  376. package/.agents/scripts/lib/orchestration/single-story-close/phases/confirm-merge.js +183 -485
  377. package/.agents/scripts/lib/orchestration/single-story-close/phases/conventional-subject.js +30 -134
  378. package/.agents/scripts/lib/orchestration/single-story-close/phases/graphql-preflight.js +9 -50
  379. package/.agents/scripts/lib/orchestration/single-story-close/phases/lock-wait-pending.js +49 -0
  380. package/.agents/scripts/lib/orchestration/single-story-close/phases/normalize-pr-title.js +13 -86
  381. package/.agents/scripts/lib/orchestration/single-story-close/phases/options.js +20 -95
  382. package/.agents/scripts/lib/orchestration/single-story-close/phases/post-land.js +46 -203
  383. package/.agents/scripts/lib/orchestration/single-story-close/phases/pre-gate-steps.js +8 -50
  384. package/.agents/scripts/lib/orchestration/single-story-close/phases/pull-request.js +12 -83
  385. package/.agents/scripts/lib/orchestration/single-story-close/phases/push.js +6 -39
  386. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-block.js +1 -6
  387. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-outcome.js +4 -28
  388. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-override.js +6 -51
  389. package/.agents/scripts/lib/orchestration/single-story-close/phases/worktree-reap.js +6 -34
  390. package/.agents/scripts/lib/orchestration/single-story-close/phases/wrong-tree-guard.js +23 -121
  391. package/.agents/scripts/lib/orchestration/single-story-close/runner.js +110 -290
  392. package/.agents/scripts/lib/orchestration/single-story-lease-guard.js +15 -69
  393. package/.agents/scripts/lib/orchestration/story-body-gate.js +4 -23
  394. package/.agents/scripts/lib/orchestration/story-close/baseline-upward-writeback.js +50 -179
  395. package/.agents/scripts/lib/orchestration/story-close/context-budget-writeback.js +11 -41
  396. package/.agents/scripts/lib/orchestration/story-close/format-autofix.js +23 -311
  397. package/.agents/scripts/lib/orchestration/story-close/phases/local-lens-review.js +22 -147
  398. package/.agents/scripts/lib/orchestration/story-close/phases/review-core.js +16 -67
  399. package/.agents/scripts/lib/orchestration/story-deliver-terminal-schema.js +12 -68
  400. package/.agents/scripts/lib/orchestration/story-deliver-terminal.js +42 -201
  401. package/.agents/scripts/lib/orchestration/story-follow-ups.js +43 -245
  402. package/.agents/scripts/lib/orchestration/story-init-envelope.js +4 -23
  403. package/.agents/scripts/lib/orchestration/story-init-remote.js +2 -6
  404. package/.agents/scripts/lib/orchestration/story-reachability.js +3 -23
  405. package/.agents/scripts/lib/orchestration/task-body-validator.js +12 -126
  406. package/.agents/scripts/lib/orchestration/ticket-lease.js +28 -131
  407. package/.agents/scripts/lib/orchestration/ticket-validator-conflicts.js +15 -149
  408. package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +5 -33
  409. package/.agents/scripts/lib/orchestration/ticket-validator.js +39 -181
  410. package/.agents/scripts/lib/orchestration/ticketing/bulk.js +51 -244
  411. package/.agents/scripts/lib/orchestration/ticketing/reads.js +39 -250
  412. package/.agents/scripts/lib/orchestration/ticketing/state.js +14 -68
  413. package/.agents/scripts/lib/orchestration/ticketing/transition.js +46 -263
  414. package/.agents/scripts/lib/orchestration/ticketing.js +2 -26
  415. package/.agents/scripts/lib/orchestration/verify-credit.js +18 -79
  416. package/.agents/scripts/lib/orchestration/worktree-dirty.js +5 -30
  417. package/.agents/scripts/lib/path-security.js +3 -6
  418. package/.agents/scripts/lib/plan-phase-cleanup.js +9 -49
  419. package/.agents/scripts/lib/preflight-runner.js +13 -69
  420. package/.agents/scripts/lib/process-group.js +143 -0
  421. package/.agents/scripts/lib/project-root.js +2 -8
  422. package/.agents/scripts/lib/provider-factory.js +2 -25
  423. package/.agents/scripts/lib/qa/console-allowlist.js +10 -59
  424. package/.agents/scripts/lib/qa/qa-session.js +15 -69
  425. package/.agents/scripts/lib/qa/redact-evidence.js +18 -129
  426. package/.agents/scripts/lib/qa/resolve-qa-contract.js +26 -135
  427. package/.agents/scripts/lib/qa/resolve-selection.js +16 -84
  428. package/.agents/scripts/lib/reserved-test-ids.js +9 -47
  429. package/.agents/scripts/lib/runtime-deps/dep-resolution.js +13 -53
  430. package/.agents/scripts/lib/runtime-deps/ensure-installed.js +10 -44
  431. package/.agents/scripts/lib/runtime-deps/manifest.js +10 -30
  432. package/.agents/scripts/lib/runtime-deps/parser-major.js +15 -51
  433. package/.agents/scripts/lib/runtime-deps/preflight.js +4 -22
  434. package/.agents/scripts/lib/runtime-deps/scan-imports.js +11 -55
  435. package/.agents/scripts/lib/signals/detectors/common.js +12 -38
  436. package/.agents/scripts/lib/signals/index.js +2 -19
  437. package/.agents/scripts/lib/signals/schema.js +14 -109
  438. package/.agents/scripts/lib/signals/write.js +2 -11
  439. package/.agents/scripts/lib/single-story/confirm-merge.js +31 -72
  440. package/.agents/scripts/lib/single-story/story-merged-notify.js +8 -49
  441. package/.agents/scripts/lib/single-story-sweep/protection-ctx.js +4 -26
  442. package/.agents/scripts/lib/single-story-sweep/protection.js +13 -100
  443. package/.agents/scripts/lib/single-story-sweep/sweep-lock.js +60 -258
  444. package/.agents/scripts/lib/single-story-sweep.js +14 -97
  445. package/.agents/scripts/lib/skills/parse-skill.js +13 -59
  446. package/.agents/scripts/lib/skills/skills-index.js +8 -29
  447. package/.agents/scripts/lib/skills/walk-skill-files.js +17 -78
  448. package/.agents/scripts/lib/source-extensions.js +11 -42
  449. package/.agents/scripts/lib/source-text/strip-js-comments.js +8 -41
  450. package/.agents/scripts/lib/stdio-flush.js +9 -36
  451. package/.agents/scripts/lib/story-adjacency.js +8 -40
  452. package/.agents/scripts/lib/story-body/body-format-lints.js +22 -83
  453. package/.agents/scripts/lib/story-body/footer-block.js +11 -44
  454. package/.agents/scripts/lib/story-body/story-body.js +83 -358
  455. package/.agents/scripts/lib/temp-retention.js +42 -143
  456. package/.agents/scripts/lib/templates/decomposer-prompts.js +11 -65
  457. package/.agents/scripts/lib/test-env.js +12 -65
  458. package/.agents/scripts/lib/test-run-credit.js +10 -65
  459. package/.agents/scripts/lib/test-runner-contract.js +19 -74
  460. package/.agents/scripts/lib/test-temp.js +38 -184
  461. package/.agents/scripts/lib/test-tiers.js +12 -96
  462. package/.agents/scripts/lib/ticket-body-sections.js +21 -96
  463. package/.agents/scripts/lib/transpile.js +15 -74
  464. package/.agents/scripts/lib/util/concurrent-map.js +6 -25
  465. package/.agents/scripts/lib/util/parse-id-list.js +8 -34
  466. package/.agents/scripts/lib/util/poll-loop.js +8 -28
  467. package/.agents/scripts/lib/util/with-timeout.js +2 -11
  468. package/.agents/scripts/lib/validation-evidence.js +21 -96
  469. package/.agents/scripts/lib/wave-runner/footprint.js +17 -70
  470. package/.agents/scripts/lib/wave-runner/live-probe.js +53 -221
  471. package/.agents/scripts/lib/wave-runner/ready-set.js +72 -301
  472. package/.agents/scripts/lib/workers/crap-worker.js +11 -64
  473. package/.agents/scripts/lib/workers/maintainability-report-worker.js +8 -45
  474. package/.agents/scripts/lib/workers/maintainability-worker.js +5 -21
  475. package/.agents/scripts/lib/workers/serve-worker-messages.js +2 -18
  476. package/.agents/scripts/lib/workflow-closure.js +22 -105
  477. package/.agents/scripts/lib/workspace-provisioner.js +16 -54
  478. package/.agents/scripts/lib/worktree/git-hooks.js +15 -60
  479. package/.agents/scripts/lib/worktree/lifecycle/force-drain.js +20 -60
  480. package/.agents/scripts/lib/worktree/lifecycle/merge-reachability.js +10 -62
  481. package/.agents/scripts/lib/worktree/lifecycle/pending-cleanup.js +22 -86
  482. package/.agents/scripts/lib/worktree/lifecycle/reap.js +24 -126
  483. package/.agents/scripts/lib/worktree/lifecycle-manager.js +2 -20
  484. package/.agents/scripts/lib/worktree/node-modules-strategy.js +46 -180
  485. package/.agents/scripts/lib/worktree-manager.js +15 -40
  486. package/.agents/scripts/lint-issue-body.js +12 -68
  487. package/.agents/scripts/mandrel-update-preflight.js +10 -70
  488. package/.agents/scripts/merge-baseline.js +30 -104
  489. package/.agents/scripts/nav-registry-diff.js +22 -108
  490. package/.agents/scripts/notify.js +12 -69
  491. package/.agents/scripts/plan-context.js +27 -111
  492. package/.agents/scripts/plan-critics.js +12 -66
  493. package/.agents/scripts/plan-persist.js +31 -148
  494. package/.agents/scripts/plan-run-epilogue.js +11 -37
  495. package/.agents/scripts/pr-watch-with-update.js +76 -267
  496. package/.agents/scripts/providers/github/auth.js +3 -8
  497. package/.agents/scripts/providers/github/blocked-by-add.js +14 -61
  498. package/.agents/scripts/providers/github/board-add.js +5 -21
  499. package/.agents/scripts/providers/github/branch-protection.js +11 -43
  500. package/.agents/scripts/providers/github/cache.js +2 -14
  501. package/.agents/scripts/providers/github/comments.js +7 -40
  502. package/.agents/scripts/providers/github/compose.js +3 -19
  503. package/.agents/scripts/providers/github/errors.js +22 -125
  504. package/.agents/scripts/providers/github/issues.js +31 -123
  505. package/.agents/scripts/providers/github/labels.js +24 -124
  506. package/.agents/scripts/providers/github/mappers.js +5 -27
  507. package/.agents/scripts/providers/github/merge-methods.js +3 -22
  508. package/.agents/scripts/providers/github/project-board.js +2 -17
  509. package/.agents/scripts/providers/github/projects-v2-graphql.js +3 -6
  510. package/.agents/scripts/providers/github/request-helpers.js +5 -32
  511. package/.agents/scripts/providers/github/search-budget.js +9 -39
  512. package/.agents/scripts/providers/github/search-query.js +5 -26
  513. package/.agents/scripts/providers/github/sub-issue-add.js +15 -65
  514. package/.agents/scripts/providers/github/sub-issues.js +7 -36
  515. package/.agents/scripts/providers/github/tickets.js +32 -134
  516. package/.agents/scripts/providers/github.js +18 -59
  517. package/.agents/scripts/prune-plan-run-labels.js +12 -46
  518. package/.agents/scripts/quality-preview.js +35 -220
  519. package/.agents/scripts/resolve-doc-tiers.js +3 -26
  520. package/.agents/scripts/resolve-stories.js +16 -67
  521. package/.agents/scripts/resync-status-column.js +6 -25
  522. package/.agents/scripts/run-tests.js +29 -104
  523. package/.agents/scripts/single-story-close.js +23 -135
  524. package/.agents/scripts/single-story-confirm-merge.js +32 -139
  525. package/.agents/scripts/single-story-init.js +47 -209
  526. package/.agents/scripts/stories-wave-tick.js +102 -472
  527. package/.agents/scripts/sync-agentrc.js +3 -21
  528. package/.agents/scripts/sync-claude-agents.js +9 -55
  529. package/.agents/scripts/sync-claude-commands.js +20 -110
  530. package/.agents/scripts/test-wrapper.js +6 -43
  531. package/.agents/scripts/update-coverage-baseline.js +5 -22
  532. package/.agents/scripts/update-crap-baseline.js +7 -30
  533. package/.agents/scripts/update-duplication-baseline.js +16 -92
  534. package/.agents/scripts/update-maintainability-baseline.js +8 -62
  535. package/.agents/scripts/update-ticket-state.js +1 -7
  536. package/.agents/scripts/validate-skills.js +6 -26
  537. package/.agents/templates/agent-protocol.md +2 -2
  538. package/.agents/templates/docs/audit-sweep-runbook.md +3 -4
  539. package/.agents/workflows/audit-accessibility.md +4 -7
  540. package/.agents/workflows/audit-adrs.md +3 -6
  541. package/.agents/workflows/audit-architecture.md +3 -11
  542. package/.agents/workflows/audit-baselines.md +6 -9
  543. package/.agents/workflows/audit-clean-code.md +8 -12
  544. package/.agents/workflows/audit-data-model.md +3 -7
  545. package/.agents/workflows/audit-dependencies.md +4 -7
  546. package/.agents/workflows/audit-devops.md +4 -8
  547. package/.agents/workflows/audit-documentation.md +1 -4
  548. package/.agents/workflows/audit-mobile.md +4 -7
  549. package/.agents/workflows/audit-navigability.md +3 -6
  550. package/.agents/workflows/audit-performance.md +2 -4
  551. package/.agents/workflows/audit-privacy.md +4 -7
  552. package/.agents/workflows/audit-quality.md +4 -7
  553. package/.agents/workflows/audit-security.md +4 -7
  554. package/.agents/workflows/audit-seo.md +4 -7
  555. package/.agents/workflows/audit-sre.md +4 -7
  556. package/.agents/workflows/audit-to-stories.md +17 -30
  557. package/.agents/workflows/audit-ux-ui.md +4 -7
  558. package/.agents/workflows/helpers/audit-lens-core.md +1 -1
  559. package/.agents/workflows/helpers/code-quality-guardrails.md +12 -15
  560. package/.agents/workflows/helpers/deliver-digest.md +6 -4
  561. package/.agents/workflows/helpers/deliver-reference.md +114 -188
  562. package/.agents/workflows/helpers/deliver-story-reference.md +189 -533
  563. package/.agents/workflows/helpers/plan-reference.md +86 -139
  564. package/.agents/workflows/helpers/qa-core.md +12 -0
  565. package/.agents/workflows/memory-consolidate.md +1 -1
  566. package/.agents/workflows/qa-assist.md +27 -71
  567. package/.agents/workflows/qa-explore.md +19 -59
  568. package/.agents/workflows/qa-run.md +11 -33
  569. package/README.md +1 -1
  570. package/bin/mandrel.js +5 -46
  571. package/bin/postinstall.js +18 -107
  572. package/docs/CHANGELOG.md +32 -0
  573. package/lib/cli/doctor.js +11 -71
  574. package/lib/cli/init.js +26 -165
  575. package/lib/cli/migrate.js +5 -64
  576. package/lib/cli/registry.js +84 -467
  577. package/lib/cli/sync-agents.js +4 -64
  578. package/lib/cli/sync-commands.js +11 -64
  579. package/lib/cli/sync.js +34 -213
  580. package/lib/cli/uninstall.js +40 -219
  581. package/lib/cli/update.js +105 -661
  582. package/lib/cli/version-check.js +8 -72
  583. package/lib/cli/version-helpers.js +14 -87
  584. package/lib/migrations/helpers/retire-agentrc-key.js +11 -52
  585. package/lib/migrations/index.js +15 -92
  586. package/lib/migrations/steps/2.1.0-retire-mi-drop-knobs.js +2 -15
  587. package/lib/migrations/steps/2.1.0-retire-verify-concurrency-cap.js +1 -13
  588. package/lib/migrations/steps/2.11.0-retire-max-seed-words.js +2 -15
  589. package/lib/migrations/steps/2.2.0-retire-epic-ac-tags.js +9 -38
  590. package/lib/migrations/steps/2.20.0-retire-codebase-snapshot.js +1 -13
  591. package/lib/migrations/steps/2.32.0-retire-lint-baseline-command.js +2 -27
  592. package/lib/migrations/steps/2.57.0-retire-delivery-limit-knobs.js +2 -23
  593. package/lib/migrations/steps/2.57.0-retire-planning-limit-knobs.js +2 -27
  594. package/lib/migrations/steps/2.60.0-retire-audit-results-autofile.js +2 -21
  595. package/lib/migrations/steps/strip-removed-agentrc-keys.js +333 -0
  596. package/package.json +16 -14
  597. package/.agents/docs/SDLC.md +0 -590
  598. package/.agents/docs/quality-gates.md +0 -1183
  599. package/.agents/rules/known-tooling-behavior.md +0 -200
  600. package/.agents/rules/orchestration-error-handling.md +0 -61
  601. package/.agents/rules/test-seams.md +0 -59
  602. package/.agents/schemas/baselines/lighthouse.schema.json +0 -59
  603. package/.agents/schemas/baselines/lint.schema.json +0 -47
  604. package/.agents/scripts/check-action-pinning.js +0 -260
  605. package/.agents/scripts/check-audit-attribution.js +0 -302
  606. package/.agents/scripts/check-baseline-drift.js +0 -211
  607. package/.agents/scripts/check-baseline-scope.js +0 -362
  608. package/.agents/scripts/check-generated-validator.js +0 -202
  609. package/.agents/scripts/check-knip-entries.js +0 -159
  610. package/.agents/scripts/check-lifecycle-lint.js +0 -294
  611. package/.agents/scripts/check-pinned-override-notes.js +0 -102
  612. package/.agents/scripts/check-schema-references.js +0 -368
  613. package/.agents/scripts/check-test-portability.js +0 -512
  614. package/.agents/scripts/check-workflow-citations.js +0 -218
  615. package/.agents/scripts/check-workflow-cli-lint.js +0 -299
  616. package/.agents/scripts/check-workflow-timeouts.js +0 -291
  617. package/.agents/scripts/install-matrix-assert.js +0 -326
  618. package/.agents/scripts/lib/audit-advisories.js +0 -195
  619. package/.agents/scripts/lib/audit-attribution.js +0 -134
  620. package/.agents/scripts/lib/baselines/drift-detector.js +0 -351
  621. package/.agents/scripts/lib/baselines/kinds/lighthouse.js +0 -87
  622. package/.agents/scripts/lib/baselines/kinds/lint.js +0 -184
  623. package/.agents/scripts/lib/baselines/orphan-pruner.js +0 -233
  624. package/.agents/scripts/lib/baselines/scope-assert.js +0 -223
  625. package/.agents/scripts/lib/baselines/scope-inventory.js +0 -314
  626. package/.agents/scripts/lib/c8-cli-path.js +0 -21
  627. package/.agents/scripts/lib/config/gates/lighthouse.schema.js +0 -51
  628. package/.agents/scripts/lib/config/gates/lint.schema.js +0 -18
  629. package/.agents/scripts/lib/dynamic-workflow/architecture-report-contract.js +0 -70
  630. package/.agents/scripts/lib/dynamic-workflow/audit-orchestrator.js +0 -284
  631. package/.agents/scripts/lib/dynamic-workflow/clean-code-report-contract.js +0 -80
  632. package/.agents/scripts/lib/dynamic-workflow/degraded-coverage.js +0 -81
  633. package/.agents/scripts/lib/dynamic-workflow/documentation-report-contract.js +0 -87
  634. package/.agents/scripts/lib/dynamic-workflow/performance-report-contract.js +0 -74
  635. package/.agents/scripts/lib/dynamic-workflow/quality-report-contract.js +0 -90
  636. package/.agents/scripts/lib/dynamic-workflow/report-contract-core.js +0 -43
  637. package/.agents/scripts/lib/dynamic-workflow/security-report-contract.js +0 -83
  638. package/.agents/scripts/lib/fs-walk.js +0 -52
  639. package/.agents/scripts/lib/knip-config-resolver.js +0 -181
  640. package/.agents/scripts/lib/knip-entry-sync.js +0 -452
  641. package/.agents/scripts/lib/pinned-override-notes.js +0 -88
  642. package/.agents/scripts/lib/pinned-override-resolve.js +0 -212
  643. package/.agents/scripts/lib/test-isolate/cli-options.js +0 -93
  644. package/.agents/scripts/lib/test-isolate/env-snapshot-loader.js +0 -52
  645. package/.agents/scripts/lib/test-isolate/list-files.js +0 -90
  646. package/.agents/scripts/lib/test-isolate/parse-tap.js +0 -75
  647. package/.agents/scripts/lib/test-isolate/progress-log.js +0 -45
  648. package/.agents/scripts/lib/test-isolate/render-report.js +0 -97
  649. package/.agents/scripts/lib/test-isolate/run-isolate.js +0 -87
  650. package/.agents/scripts/lib/test-isolate/runner.js +0 -483
  651. package/.agents/scripts/lib/test-profile/parse-tap.js +0 -136
  652. package/.agents/scripts/lib/test-profile/render-report.js +0 -45
  653. package/.agents/scripts/lint-label-vocabulary.js +0 -214
  654. package/.agents/scripts/post-structured-comment.js +0 -127
  655. package/.agents/scripts/provision-git-hooks.js +0 -85
  656. package/.agents/scripts/prune-baseline-orphans.js +0 -181
  657. package/.agents/scripts/run-coverage.js +0 -197
  658. package/.agents/scripts/run-lint.js +0 -133
  659. package/.agents/scripts/run-test-profile.js +0 -129
  660. package/.agents/scripts/run-verify.js +0 -125
  661. package/.agents/scripts/test-isolate.js +0 -55
  662. package/.agents/scripts/update-dead-exports-baseline.js +0 -321
@@ -1,36 +1,23 @@
1
- /**
2
- * close-validation/process.js — Child-process lifecycle plumbing for gates.
3
- *
4
- * Owns the default async gate runner (spawn + line-prefixed stdio piping)
5
- * and the AbortSignal / exit-code helpers it composes.
6
- */
1
+ /** Default async gate runner: spawn, line-prefixed stdio, abort and exit codes. */
7
2
 
8
3
  import { spawn } from 'node:child_process';
9
4
 
10
- import { withFullSuiteLockAsync } from '../full-suite-lock.js';
5
+ import {
6
+ LOCK_WAIT_EXPIRED_EXIT_CODE,
7
+ withFullSuiteLockAsync,
8
+ } from '../full-suite-lock.js';
9
+ import {
10
+ groupSpawnOptions,
11
+ superviseGroup,
12
+ TIMEOUT_EXIT_CODE,
13
+ } from '../process-group.js';
11
14
 
12
15
  /**
13
- * Pipe a child stream's output line-by-line through `emit`, prepending
14
- * `prefix` to each line. Tail bytes without a trailing newline flush on
15
- * `end` so the operator never loses the last line of a gate's output.
16
- *
17
- * ## The drain must stay cheap (Story #4766)
16
+ * Emit each line with `prefix`; the unterminated tail flushes on `end`.
18
17
  *
19
- * This handler runs on the reader side of the child's stdout/stderr pipe.
20
- * Every microsecond spent here is a microsecond the pipe is not being read,
21
- * and once the OS pipe buffer fills, the child's own write blocks — or, on a
22
- * non-blocking pipe, fails outright with `EAGAIN`. A gate child is not
23
- * obliged to survive that: Biome's `biome_console` `.unwrap()`s the error and
24
- * aborts the process with exit 101, so a green lint verdict presents as a
25
- * failed close. Two consequences bind everything on this path:
26
- *
27
- * 1. Splitting is O(chunk), not O(chunk × lines) — the scan advances a
28
- * `start` index instead of re-slicing the buffer once per line, so a
29
- * 64KB chunk carrying 500 lines does not copy 16MB.
30
- * 2. **`emit` MUST NOT block.** A synchronous per-line file write is
31
- * exactly the stall this path cannot afford; the close path's capture
32
- * sink (`single-story-close/gate-log.js`) buffers to an async stream for
33
- * that reason.
18
+ * The drain must stay cheap: a slow reader fills the pipe and the child's
19
+ * write fails with `EAGAIN` (Biome then aborts with exit 101, a false red).
20
+ * So splitting advances an index (O(chunk)), and `emit` MUST NOT block.
34
21
  */
35
22
  function pipePrefixed(stream, prefix, emit) {
36
23
  let buf = '';
@@ -57,24 +44,6 @@ function pipePrefixed(stream, prefix, emit) {
57
44
  stream.on('error', () => {});
58
45
  }
59
46
 
60
- /** Wire the AbortSignal so an abort kills the child. Returns the cleanup fn. */
61
- export function attachGateAbortHandler(child, signal) {
62
- if (!signal) return () => {};
63
- const killChild = () => {
64
- try {
65
- child.kill('SIGTERM');
66
- } catch {
67
- /* race: already exited */
68
- }
69
- };
70
- if (signal.aborted) {
71
- killChild();
72
- return () => {};
73
- }
74
- signal.addEventListener('abort', killChild, { once: true });
75
- return () => signal.removeEventListener('abort', killChild);
76
- }
77
-
78
47
  /** SIGTERM (no exit code) on abort → non-zero so the gate counts as failed. */
79
48
  export function gateExitCode(code, sig) {
80
49
  if (typeof code === 'number') return code;
@@ -82,37 +51,20 @@ export function gateExitCode(code, sig) {
82
51
  }
83
52
 
84
53
  /**
85
- * Biome's marker for "you handed me a path set, but every one of them is
86
- * excluded by my own config (`files.includes` allowlist / `files.ignore` /
87
- * `overrides`), so I processed nothing" — biome exits 1 in that case.
88
- *
89
- * The format gate scopes biome to the changed-file subset (Story #3410). When
90
- * that subset is non-empty by extension but every path is biome-config-ignored,
91
- * the scoped invocation reports this message and exits 1 even though
92
- * `biome format .` over the whole tree is clean — a false negative for the
93
- * gate (Story #4292). Detecting the marker lets the runner treat that exit as
94
- * a clean skip rather than a formatting failure.
54
+ * Biome exits 1 with this when every path handed to it is config-ignored — a
55
+ * false negative for the changed-file-scoped format gate, treated as a skip.
95
56
  */
96
57
  const BIOME_NO_FILES_PROCESSED =
97
58
  'No files were processed in the specified paths';
98
59
 
99
60
  /**
100
- * How many trailing gate lines the "No files were processed" probe retains.
101
- *
102
- * The marker only ever appears when biome processed nothing, and in that case
103
- * its whole output is a handful of lines — so a bounded tail always contains
104
- * it when it is there at all. Retaining a tail rather than the full transcript
105
- * keeps the drain path's per-line work O(1) in the volume of gate output
106
- * (Story #4766): the previous `captured += line` grew a string without limit,
107
- * on the one gate (biome/format) whose output is the loudest.
61
+ * The marker only appears in a few-line output, so a bounded tail always
62
+ * holds it and keeps per-line drain work O(1).
108
63
  */
109
64
  const MARKER_PROBE_TAIL_LINES = 32;
110
65
 
111
66
  /**
112
- * Whether biome's combined gate output carries the "No files were processed"
113
- * marker. Pure function — no I/O. Exported for unit coverage (Story #4292).
114
- *
115
- * @param {string} output - Combined stdout/stderr captured from the gate child.
67
+ * @param {string} output - Combined stdout/stderr.
116
68
  * @returns {boolean}
117
69
  */
118
70
  function isBiomeNoFilesProcessed(output) {
@@ -122,115 +74,133 @@ function isBiomeNoFilesProcessed(output) {
122
74
  }
123
75
 
124
76
  /**
125
- * Default async gate runner — used by `runCloseValidation` when no `runner`
126
- * is injected. Spawns the gate via `child_process.spawn`, prefixes every
127
- * stdout/stderr line with `[gate-name] ` (so concurrent gates don't bleed
128
- * into each other in the operator's terminal), and resolves only once the
129
- * child has exited and both stdio pipes are drained.
130
- *
131
- * `opts.log` is the drain sink and **must not block** — see `pipePrefixed`
132
- * above for what a synchronous per-line write costs the child (Story #4766).
133
- *
134
- * Honours `opts.signal`: a TERM is delivered to the child the moment the
135
- * signal fires, so a sibling gate's failure aborts the rest of the wave
136
- * promptly. The promise still resolves (rather than rejecting) on abort —
137
- * `runCloseValidation` sees a non-zero status and folds it into the
138
- * already-recorded first-failure.
139
- *
140
- * When `opts.tolerateNoFilesProcessed` is set (the biome-scoped format gate —
141
- * Story #4292), a non-zero exit whose combined output carries biome's
142
- * "No files were processed" marker is downgraded to a clean `status: 0`,
143
- * because that exit means every config-included path was already excluded,
144
- * not that formatting drifted.
77
+ * Spawn a gate with `[gate-name] `-prefixed output; resolves (never rejects)
78
+ * once the child exits and both pipes drain. `opts.log` must not block.
79
+ * An abort signal TERMs the child so a sibling failure stops the wave.
145
80
  *
146
- * When `opts.fullSuiteLock` is set — the standalone `test` gate, the one gate
147
- * here that runs a whole suite (Story #5173) — the spawn is serialized behind
148
- * the host-level advisory lock so two concurrent closes on one checkout do not
149
- * run two suites against the same cores. Best-effort: a wait that expires
150
- * spawns anyway. The async wrapper is used rather than the synchronous one
151
- * precisely because this runner drives sibling gates on the same event loop,
152
- * which a blocking wait would stall.
81
+ * `fullSuiteLock` serializes the spawn behind the host lock (async, so
82
+ * sibling gates on this event loop are not stalled). An expired wait spawns
83
+ * anyway unless `deferOnLockExpiry`, which returns
84
+ * `LOCK_WAIT_EXPIRED_EXIT_CODE` so close ends `pending`. Each child leads its
85
+ * own process group so a timeout, abort or parent signal kills its workers too.
153
86
  *
154
87
  * @param {string} cmd
155
88
  * @param {string[]} args
156
- * @param {{ cwd: string, signal?: AbortSignal, gateName?: string, log?: (m: string) => void, env?: Record<string, string>, tolerateNoFilesProcessed?: boolean, fullSuiteLock?: boolean, skipIfSatisfied?: () => {status: number}|undefined }} opts
89
+ * @param {{ cwd: string, signal?: AbortSignal, gateName?: string, log?: (m: string) => void, env?: Record<string, string>, tolerateNoFilesProcessed?: boolean, fullSuiteLock?: boolean, deferOnLockExpiry?: boolean, timeoutMs?: number, lockOptions?: object, skipIfSatisfied?: () => {status: number}|undefined }} opts
157
90
  * @returns {Promise<{ status: number }>}
158
91
  */
159
92
  export function defaultGateRunner(cmd, args, opts = {}) {
160
93
  if (!opts.fullSuiteLock) return spawnGate(cmd, args, opts);
161
- // `log` is passed through as-is: `withFullSuiteLockAsync` supplies its own
162
- // no-op default, so a second fallback here would be an untestable branch.
163
- // `skipIfSatisfied` (Story #5278) is the caller's post-wait re-probe: after
164
- // queueing behind another full suite, the gate re-asks whether its evidence
165
- // has since been deposited and returns that verdict instead of spawning.
166
- return withFullSuiteLockAsync(
167
- { cwd: opts.cwd, log: opts.log, skipIfSatisfied: opts.skipIfSatisfied },
168
- () => spawnGate(cmd, args, opts),
94
+ // `skipIfSatisfied` re-probes after the wait: evidence another suite
95
+ // deposited meanwhile is returned instead of spawning.
96
+ return withFullSuiteLockAsync(gateLockOptions(opts), () =>
97
+ spawnGate(cmd, args, opts),
169
98
  );
170
99
  }
171
100
 
101
+ function gateLockOptions(opts) {
102
+ return {
103
+ cwd: opts.cwd,
104
+ log: opts.log,
105
+ skipIfSatisfied: opts.skipIfSatisfied,
106
+ onWaitExpired: opts.deferOnLockExpiry ? deferredGateStatus : undefined,
107
+ ...opts.lockOptions, // test seam only
108
+ };
109
+ }
110
+
111
+ function deferredGateStatus() {
112
+ return { status: LOCK_WAIT_EXPIRED_EXIT_CODE };
113
+ }
114
+
172
115
  /**
173
- * The bare gate spawn — child process, prefixed drain, abort wiring, exit-code
174
- * normalisation. Split from {@link defaultGateRunner} so the full-suite lock
175
- * composes over one named unit.
176
- *
177
116
  * @param {string} cmd
178
117
  * @param {string[]} args
179
118
  * @param {Parameters<typeof defaultGateRunner>[2]} opts
180
119
  * @returns {Promise<{ status: number }>}
181
120
  */
182
121
  function spawnGate(cmd, args, opts) {
183
- const { cwd, signal, gateName, log, env, tolerateNoFilesProcessed } = opts;
184
- const child = spawn(cmd, args, {
122
+ const child = spawnGateChild(cmd, args, opts);
123
+ const output = gateOutput(opts);
124
+ pipePrefixed(child.stdout, output.prefix, output.tap);
125
+ pipePrefixed(child.stderr, output.prefix, output.tap);
126
+ // A bare suite has nothing to clean up, so it gets SIGKILL; other gates
127
+ // (a capture holding the lock) get SIGTERM to release and kill their suite.
128
+ const supervisor = superviseGroup(child, {
129
+ timeoutMs: opts.timeoutMs,
130
+ abortSignal: opts.signal,
131
+ signalOnParentSignal: opts.fullSuiteLock ? 'SIGKILL' : 'SIGTERM',
132
+ });
133
+ return new Promise((resolve) => {
134
+ // 'close', not 'exit': only 'close' waits for both pipes to drain.
135
+ child.on('close', (code, sig) => {
136
+ supervisor.release();
137
+ resolve({
138
+ status: settledGateStatus({ code, sig, supervisor, opts, output }),
139
+ });
140
+ });
141
+ child.on('error', () => {
142
+ supervisor.release();
143
+ resolve({ status: 1 });
144
+ });
145
+ });
146
+ }
147
+
148
+ /**
149
+ * @param {string} cmd
150
+ * @param {string[]} args
151
+ * @param {{ cwd: string, env?: Record<string, string> }} opts
152
+ */
153
+ function spawnGateChild(cmd, args, { cwd, env }) {
154
+ return spawn(cmd, args, {
185
155
  cwd,
186
156
  shell: process.platform === 'win32',
187
157
  stdio: ['ignore', 'pipe', 'pipe'],
188
- // Per-gate env overlay (Story #3890): merged over the inherited
189
- // environment so a gate-scoped `BASELINE_REF` reaches the spawned
190
- // `check-baselines` child without mutating the parent process env.
158
+ ...groupSpawnOptions(),
191
159
  ...(env ? { env: { ...process.env, ...env } } : {}),
192
160
  });
161
+ }
162
+
163
+ /**
164
+ * Retains a bounded tail only when the biome marker may need inspecting.
165
+ *
166
+ * @param {{ gateName?: string, log?: (m: string) => void, tolerateNoFilesProcessed?: boolean }} opts
167
+ */
168
+ function gateOutput({ gateName, log, tolerateNoFilesProcessed }) {
193
169
  const prefix = gateName ? `[${gateName}] ` : '';
194
170
  const emit =
195
171
  typeof log === 'function' ? log : (m) => process.stdout.write(`${m}\n`);
196
- // Retain a bounded tail only when we may need to inspect it for the biome
197
- // "No files were processed" marker — otherwise the stream is purely piped
198
- // through to the operator (no retained buffer).
199
172
  const recent = [];
200
- const tap = tolerateNoFilesProcessed
201
- ? (line) => {
202
- recent.push(line);
203
- if (recent.length > MARKER_PROBE_TAIL_LINES) recent.shift();
204
- emit(line);
205
- }
206
- : emit;
207
- pipePrefixed(child.stdout, prefix, tap);
208
- pipePrefixed(child.stderr, prefix, tap);
209
- const detach = attachGateAbortHandler(child, signal);
210
- return new Promise((resolve) => {
211
- // 'close', not 'exit' (Story #4766): 'close' fires only once the child has
212
- // exited AND both stdio pipes have been fully drained and closed, so no
213
- // gate ever reports its status while lines are still in flight. Resolving
214
- // on 'exit' raced the tail of a high-volume gate's output.
215
- child.on('close', (code, sig) => {
216
- detach();
217
- const status = gateExitCode(code, sig);
218
- if (
219
- status !== 0 &&
220
- tolerateNoFilesProcessed &&
221
- isBiomeNoFilesProcessed(recent.join('\n'))
222
- ) {
223
- emit(
224
- `${prefix}↳ biome processed zero files (all changed paths are config-ignored); treating as a clean skip`,
225
- );
226
- resolve({ status: 0 });
227
- return;
228
- }
229
- resolve({ status });
230
- });
231
- child.on('error', () => {
232
- detach();
233
- resolve({ status: 1 });
234
- });
235
- });
173
+ const tap = tolerateNoFilesProcessed ? retainTail(recent, emit) : emit;
174
+ return { prefix, emit, tap, recent };
175
+ }
176
+
177
+ function retainTail(recent, emit) {
178
+ return (line) => {
179
+ recent.push(line);
180
+ if (recent.length > MARKER_PROBE_TAIL_LINES) recent.shift();
181
+ emit(line);
182
+ };
183
+ }
184
+
185
+ function settledGateStatus(settled) {
186
+ return settled.supervisor.timedOut
187
+ ? timedOutStatus(settled)
188
+ : exitedStatus(settled);
189
+ }
190
+
191
+ function timedOutStatus({ opts, output }) {
192
+ output.emit(
193
+ `${output.prefix}⏱ exceeded ${opts.timeoutMs}ms — killed the gate's process group. Returning exit ${TIMEOUT_EXIT_CODE}.`,
194
+ );
195
+ return TIMEOUT_EXIT_CODE;
196
+ }
197
+
198
+ function exitedStatus({ code, sig, opts, output }) {
199
+ const status = gateExitCode(code, sig);
200
+ if (status === 0 || !opts.tolerateNoFilesProcessed) return status;
201
+ if (!isBiomeNoFilesProcessed(output.recent.join('\n'))) return status;
202
+ output.emit(
203
+ `${output.prefix}↳ biome processed zero files (all changed paths are config-ignored); treating as a clean skip`,
204
+ );
205
+ return 0;
236
206
  }
@@ -1,24 +1,8 @@
1
1
  // .agents/scripts/lib/close-validation/projections/advisories.js
2
2
  /**
3
- * advisories.js — the projection layer's single call site (Story #4776).
4
- *
5
- * `projections/maintainability.js` shipped fully written, fully unit-tested
6
- * and imported by nothing: the v2 Epic-tier collapse removed its caller and
7
- * left the module behind. The practical consequence was that the advisory
8
- * telling an operator to run `npm run maintainability:update` and commit a
9
- * `baseline-refresh:` subject had never fired in v2 — consumers refreshed
10
- * their baselines by hand or not at all.
11
- *
12
- * This module is that caller, for both projections. It is deliberately the
13
- * only door: `close-validation/runner.js` invokes `runProjectionAdvisories`
14
- * once, after the gate chain has passed, and every per-kind concern (gate
15
- * enablement, baseline path resolution, scorer construction, formatting)
16
- * lives here rather than being re-derived at the runner boundary.
17
- *
18
- * **Advisory, always.** Nothing in here can fail a close. `check-baselines`
19
- * already fails closed on a real regression; the projections add the refresh
20
- * half of the loop, not a second gate. Every projection is wrapped so a
21
- * throw becomes a logged skip.
3
+ * The projection layer's single call site, run once after the gate chain
4
+ * passes; owns every per-kind concern. Advisory only — nothing here can fail
5
+ * a close (`check-baselines` is the gate); a throw becomes a logged skip.
22
6
  */
23
7
 
24
8
  import path from 'node:path';
@@ -33,15 +17,12 @@ import {
33
17
  projectMaintainabilityRegressions,
34
18
  } from './maintainability.js';
35
19
 
36
- /** Default on-disk baseline locations, mirroring the per-gate defaults. */
37
20
  const DEFAULT_BASELINE_PATHS = Object.freeze({
38
21
  maintainability: 'baselines/maintainability.json',
39
22
  crap: 'baselines/crap.json',
40
23
  });
41
24
 
42
25
  /**
43
- * Resolve a gate's baseline file to an absolute path.
44
- *
45
26
  * @param {string} kind
46
27
  * @param {object} gate resolved `delivery.quality.gates.<kind>` block
47
28
  * @param {string} cwd
@@ -56,9 +37,7 @@ function resolveBaselinePath(kind, gate, cwd) {
56
37
  }
57
38
 
58
39
  /**
59
- * A gate is projected unless it is explicitly disabled. An absent gate
60
- * block means "framework defaults", which enable it — the same reading
61
- * `buildDefaultGates` applies.
40
+ * An absent gate block means defaults, which enable it.
62
41
  *
63
42
  * @param {object|undefined} gate
64
43
  * @returns {boolean}
@@ -68,9 +47,7 @@ function isEnabled(gate) {
68
47
  }
69
48
 
70
49
  /**
71
- * Run one projection with its formatter, swallowing every failure into a
72
- * logged skip. Returns the projection result (or `null` when it threw) so
73
- * callers and tests can inspect what happened without parsing log lines.
50
+ * `null` when the projection threw.
74
51
  *
75
52
  * @param {{ kind: string, log: (m: string) => void, run: () => Promise<object>|object, format: (r: object) => string|null }} opts
76
53
  * @returns {Promise<object|null>}
@@ -99,9 +76,6 @@ async function runOne({ kind, log, run, format }) {
99
76
  }
100
77
 
101
78
  /**
102
- * Run the maintainability and CRAP pre-merge projections and log their
103
- * advisories. Never throws; never affects the close verdict.
104
- *
105
79
  * @param {{
106
80
  * cwd: string,
107
81
  * baseBranch: string,
@@ -1,28 +1,11 @@
1
1
  // .agents/scripts/lib/close-validation/projections/crap.js
2
2
  /**
3
- * crap.js — pre-merge CRAP ceiling projection helper (Story #4776).
4
- *
5
- * The CRAP analogue of `projections/maintainability.js`. Both answer the
6
- * same operator question before the merge runs: *given what this branch
7
- * changed, which committed baseline rows would the post-merge tree breach,
8
- * and what is the exact remedy?*
9
- *
10
- * Advisory only. `check-baselines` already fails close-validation closed on
11
- * a real regression; duplicating that here would double-gate the same
12
- * defect. What this projection adds is the **refresh** half of the loop —
13
- * naming the breaching methods and the `npm run crap:update` +
14
- * `baseline-refresh:` remedy while the operator still has the branch in
15
- * hand, so a corrected baseline does not rot back into staleness.
16
- *
17
- * The helper never throws and never mutates anything. Every failure path
18
- * resolves to `{ ok: true, breaches: [], skipped: '<reason>' }` so the
19
- * caller can treat the advisory as best-effort.
20
- *
21
- * Post-merge approximation: CRAP needs a coverage join, so — unlike the MI
22
- * projection, which scores a `git show` blob — the scorer reads the working
23
- * tree. Close-validation runs inside the Story worktree at the branch tip,
24
- * which is exactly the content a squash-merge lands, so the approximation is
25
- * exact whenever the merge applies cleanly.
3
+ * Advisory pre-merge CRAP projection: names the methods the post-merge tree
4
+ * would breach and the `crap:update` + `baseline-refresh:` remedy
5
+ * (`check-baselines` already gates the real regression). Never throws;
6
+ * failures resolve to `{ ok: true, breaches: [], skipped }`. Scores the
7
+ * worktree (CRAP needs a coverage join), which at the branch tip is exactly
8
+ * what a clean squash-merge lands.
26
9
  */
27
10
 
28
11
  import path from 'node:path';
@@ -39,20 +22,13 @@ import { gitSpawn as defaultGitSpawn } from '../../git-utils.js';
39
22
  import { SCORABLE_SOURCE_EXT_RE } from '../../source-extensions.js';
40
23
  import { MISSING_ARG_REASONS, validateProjectionInputs } from './inputs.js';
41
24
 
42
- /**
43
- * Default absolute tolerance on a projected CRAP score, shared with
44
- * `check-crap`'s regression arm: floating-point noise must not register as
45
- * a breach.
46
- */
25
+ /** Absorbs floating-point noise. */
47
26
  export const DEFAULT_CRAP_TOLERANCE = 0.001;
48
27
 
49
- /** Framework default for the new-method ceiling (`gates.crap.newMethodCeiling`). */
50
28
  export const DEFAULT_NEW_METHOD_CEILING = 30;
51
29
 
52
30
  /**
53
- * Map the shared predicate's fine-grained `missing-*` reason onto the
54
- * `missing-args` skipped-reason the sibling MI projection reports, so both
55
- * projections speak one vocabulary at the advisory boundary.
31
+ * Collapse `missing-*` to `missing-args`, matching the MI projection.
56
32
  *
57
33
  * @param {string} reason
58
34
  * @returns {string}
@@ -62,17 +38,10 @@ function normaliseSkipReason(reason) {
62
38
  }
63
39
 
64
40
  /**
65
- * Read the committed CRAP baseline and re-key its rows onto the `file`
66
- * field `compareCrap` matches on (the on-disk v2 envelope keys on `path`).
67
- * Returns `[]` when the baseline is absent or unreadable — the caller maps
68
- * that to the `no-baseline` skip.
69
- *
70
- * Deliberately module-local: `projectCrapBreaches`'s `loadBaseline` default
71
- * is the single production door to it, and tests inject their own loader.
72
- * Exporting it would add a second entry point nothing in production reaches
73
- * — which is precisely the orphaning this Story exists to stop.
41
+ * Re-keys on-disk `path` to the `file` field `compareCrap` matches on;
42
+ * `[]` when absent or unreadable.
74
43
  *
75
- * @param {string} baselinePath absolute path to `baselines/crap.json`
44
+ * @param {string} baselinePath
76
45
  * @returns {Array<{file: string, method: string, startLine: number, crap: number}>}
77
46
  */
78
47
  function loadCrapBaselineRows(baselinePath) {
@@ -92,10 +61,8 @@ function loadCrapBaselineRows(baselinePath) {
92
61
  }
93
62
 
94
63
  /**
95
- * Build the default working-tree CRAP scorer. Returns an async callable
96
- * `(files) => rows | null`; `null` signals "coverage artifact missing under
97
- * `requireCoverage`", which the projection reports as the `no-coverage`
98
- * skip rather than as a clean run.
64
+ * The scorer resolves `null` when coverage is missing under
65
+ * `requireCoverage` (a `no-coverage` skip, not a clean run).
99
66
  *
100
67
  * @param {{
101
68
  * cwd: string,
@@ -132,9 +99,8 @@ export function createCrapScorer({
132
99
  }
133
100
 
134
101
  /**
135
- * Refresh `origin/<baseBranch>` so the diff range resolves even when close
136
- * has not reached its own base-sync step. Routed through the shared fetch
137
- * cache so a story-init fetch in the same run satisfies it for free.
102
+ * Close may not have base-synced yet; the fetch cache makes this free when
103
+ * story-init already fetched.
138
104
  *
139
105
  * @param {string} cwd
140
106
  * @param {string} baseBranch
@@ -153,10 +119,6 @@ function refreshBaseRef(cwd, baseBranch, git) {
153
119
  }
154
120
 
155
121
  /**
156
- * Enumerate the Story branch's changed files, narrowed by the shared
157
- * scorable-source extension set (`source-extensions.js`) so the projection
158
- * selects exactly the files the CRAP scanner walks.
159
- *
160
122
  * @param {{ cwd: string, baseBranch: string, storyBranch: string, git: { gitSpawn: typeof defaultGitSpawn } }} opts
161
123
  * @returns {{ ok: true, files: string[] } | { ok: false, detail: string }}
162
124
  */
@@ -177,13 +139,9 @@ function diffScorableFiles({ cwd, baseBranch, storyBranch, git }) {
177
139
  }
178
140
 
179
141
  /**
180
- * Project the post-merge CRAP scores for every file changed on the Story
181
- * branch and return the subset of methods that would breach either their
182
- * committed baseline row or, for methods with no baseline row, the
183
- * configured `newMethodCeiling`.
184
- *
185
- * Baseline rows are narrowed to the changed-file set before the compare so
186
- * every untouched file's rows are not spuriously reported as removed.
142
+ * Breaches are vs the baseline row, or `newMethodCeiling` for new methods.
143
+ * Baseline rows are narrowed to changed files so untouched rows do not read
144
+ * as removed.
187
145
  *
188
146
  * @param {{
189
147
  * cwd: string,
@@ -266,9 +224,6 @@ export async function projectCrapBreaches({
266
224
  }
267
225
 
268
226
  /**
269
- * Render one breach as an advisory bullet. New-method breaches name the
270
- * ceiling they cleared; regressions name the baseline row they exceeded.
271
- *
272
227
  * @param {object} b
273
228
  * @returns {string}
274
229
  */
@@ -283,10 +238,7 @@ function formatBreach(b) {
283
238
  }
284
239
 
285
240
  /**
286
- * Render the pre-merge CRAP advisory as a human-readable multi-line log
287
- * block, naming every breaching method and the exact refresh remedy.
288
- * Returns `null` when there is nothing to surface so callers can `if` past
289
- * the log call without a string-empty check.
241
+ * `null` when there is nothing to surface.
290
242
  *
291
243
  * @param {Awaited<ReturnType<typeof projectCrapBreaches>>} result
292
244
  * @returns {string | null}
@@ -1,21 +1,7 @@
1
1
  // .agents/scripts/lib/close-validation/projections/head-sha.js
2
- /**
3
- * head-sha.js — resolves the current working tree's HEAD commit SHA.
4
- *
5
- * Extracted from close-validation.js (Story #1850) to keep the parent
6
- * module below the 700-LOC target and to land the helper below CRAP 12
7
- * in `baselines/crap.json`. The implementation is unchanged — it shells
8
- * out via the injected git interface, returns `null` on any failure,
9
- * and never throws.
10
- */
11
-
12
2
  import { gitSpawn as defaultGitSpawn } from '../../git-utils.js';
13
3
 
14
4
  /**
15
- * Normalise a `git rev-parse HEAD` stdout buffer to the trimmed SHA string,
16
- * or `null` when the output is empty. Split out of `defaultGetHeadSha` so
17
- * the success-path is a single straight-line statement.
18
- *
19
5
  * @param {string|undefined|null} stdout
20
6
  * @returns {string|null}
21
7
  */
@@ -25,9 +11,7 @@ function parseHeadSha(stdout) {
25
11
  }
26
12
 
27
13
  /**
28
- * Resolve the current `git rev-parse HEAD` SHA inside `cwd`. Returns `null`
29
- * when git is unavailable or the call fails — callers treat that as
30
- * "evidence skip disabled" so the gate runs as before.
14
+ * Never throws; `null` disables the evidence skip so the gate runs.
31
15
  *
32
16
  * @param {string} cwd
33
17
  * @param {typeof defaultGitSpawn} [gitSpawn]
@@ -1,17 +1,5 @@
1
1
  // .agents/scripts/lib/close-validation/projections/inputs.js
2
- /**
3
- * inputs.js — shared input validator for close-validation projection helpers.
4
- *
5
- * Used by `projections/maintainability.js` (and any future projection that
6
- * shares the same `{ cwd, baseBranch, storyBranch, baselinePath }` argument
7
- * shape) to collapse the inline guard cascade into a single predicate that
8
- * returns a typed `reason` on failure.
9
- *
10
- * Pure function — no I/O, no side effects. Callers inject `loadBaseline`
11
- * when they need the predicate to also confirm the baseline file is non-
12
- * empty; omitting `loadBaseline` skips the baseline check (the predicate
13
- * still verifies the `baselinePath` argument is present).
14
- */
2
+ /** Shared argument validator for the close-validation projections. */
15
3
 
16
4
  /**
17
5
  * @typedef {Object} ProjectionInputs
@@ -24,9 +12,7 @@
24
12
  /**
25
13
  * @typedef {Object} ValidationOk
26
14
  * @property {true} ok
27
- * @property {Record<string, number>} [baseline] - When `loadBaseline` is
28
- * supplied, the parsed baseline map is forwarded so callers don't have to
29
- * re-read the file.
15
+ * @property {Record<string, number>} [baseline] - present when `loadBaseline` was supplied.
30
16
  */
31
17
 
32
18
  /**
@@ -36,18 +22,7 @@
36
22
  */
37
23
 
38
24
  /**
39
- * Validate the standard projection-helper argument set.
40
- *
41
- * Reason branches (in order):
42
- * - `missing-cwd` — cwd is falsy
43
- * - `missing-base-branch` — baseBranch is falsy
44
- * - `missing-story-branch` — storyBranch is falsy
45
- * - `missing-baseline-path` — baselinePath is falsy
46
- * - `no-baseline` — loadBaseline returned null/undefined/empty
47
- *
48
- * The fine-grained `missing-*` variants are normalised to the historical
49
- * `missing-args` reason by `maintainability.js` so the existing public
50
- * contract of `projectMaintainabilityRegressions` is preserved byte-for-byte.
25
+ * Pure. Without `loadBaseline` the baseline file itself is not checked.
51
26
  *
52
27
  * @param {ProjectionInputs} inputs
53
28
  * @param {{ loadBaseline?: (path: string) => Record<string, number>|null|undefined }} [opts]
@@ -72,12 +47,7 @@ export function validateProjectionInputs(inputs, opts = {}) {
72
47
  return { ok: true };
73
48
  }
74
49
 
75
- /**
76
- * The set of reason values returned by `validateProjectionInputs` that
77
- * represent "one of the required arguments was missing". Used by
78
- * projection helpers to normalise to the historical `missing-args`
79
- * skipped-reason without enumerating each variant at the call site.
80
- */
50
+ /** Reasons the projections collapse to `missing-args`. */
81
51
  export const MISSING_ARG_REASONS = new Set([
82
52
  'missing-cwd',
83
53
  'missing-base-branch',