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,10 +1,4 @@
1
- /**
2
- * close-validation/gates.js — Gate construction and partitioning.
3
- *
4
- * Owns the canonical close-validation gate list (`buildDefaultGates` /
5
- * `DEFAULT_GATES`) and the parallel-vs-serial partitioning used by the
6
- * runner (`INDEPENDENT_GATE_NAMES` / `partitionGates`).
7
- */
1
+ /** Close-validation gate list construction and parallel/serial partitioning. */
8
2
 
9
3
  import { existsSync } from 'node:fs';
10
4
 
@@ -26,26 +20,15 @@ import {
26
20
 
27
21
  /**
28
22
  * @typedef {Object} Gate
29
- * @property {string} name - Short label used in progress logs.
30
- * @property {string} cmd - Executable to run.
31
- * @property {string[]} args - Arguments passed to `cmd`.
23
+ * @property {string} name
24
+ * @property {string} cmd
25
+ * @property {string[]} args
32
26
  * @property {string} [hint] - Remediation hint shown on failure.
33
- * @property {{ baseRef: string }} [changedFileScope] - Optional Story-diff scope.
34
- * @property {{ reason: string }} [skip] - Pre-decided skip (Story #5278). The
35
- * runner records the gate as skipped with this reason and never spawns it.
36
- * Used for the `coverage-capture` gate when the incremental-coverage skip
37
- * is already known to fire, so the gate list can register a real `npm test`
38
- * gate in its place instead of the close silently running no test gate.
39
- * @property {Record<string, string>} [env] - Optional per-gate environment
40
- * overlay. Merged over `process.env` for this gate's spawned child only.
41
- * Used to thread the epic baseRef into the `check-baselines` gate via
42
- * `BASELINE_REF` (Story #3890) so baseline regressions compare against the
43
- * epic integration branch rather than `origin/main`.
27
+ * @property {{ baseRef: string }} [changedFileScope]
28
+ * @property {{ reason: string }} [skip] - Pre-decided skip: recorded, never spawned.
29
+ * @property {Record<string, string>} [env] - Overlay merged over `process.env` for this gate's child only.
44
30
  * @property {(cmd: string, args: string[], opts: { cwd: string, gateName?: string, log?: (m: string) => void, signal?: AbortSignal, env?: Record<string, string> }) => Promise<{ status: number }> | { status: number }} [run]
45
- * - Optional in-process runner. Story #1973: when present, the gate
46
- * executes via this callable instead of spawning `cmd`/`args` through
47
- * the default runner — used for per-kind baseline gates that import
48
- * `compare(head, base)` directly.
31
+ * - In-process runner used instead of spawning `cmd`/`args`.
49
32
  */
50
33
 
51
34
  const TYPECHECK_HINT =
@@ -57,21 +40,10 @@ function buildChangedFileScope(baseRef) {
57
40
  }
58
41
 
59
42
  /**
60
- * Derive the per-gate `env` overlay that pins the `check-baselines`
61
- * regression-compare base to the close run's integration branch
62
- * (Story #3890).
63
- *
64
- * The baselines gate resolves its compare ref through `resolveScope`,
65
- * whose environment layer reads `BASELINE_REF`. Threading
66
- * `origin/<baseBranch>` here makes the gate diff head against the epic
67
- * integration branch instead of the framework-default `origin/main`, so
68
- * drift that already landed on `main` but is outside the Story's own diff
69
- * does not surface as a phantom regression. The same convention
70
- * (`origin/<baseBranch>`) is used by the baseline-attribution and
71
- * auto-refresh paths, keeping read/compare bases aligned.
72
- *
73
- * Returns `null` when no integration branch is supplied (the gate then
74
- * keeps its existing default-ref / consumer-config behaviour untouched).
43
+ * Pin the `check-baselines` compare base to `origin/<baseBranch>` via
44
+ * `BASELINE_REF`, so drift outside the Story's diff is not a phantom
45
+ * regression; matches the attribution and auto-refresh bases. `null` keeps
46
+ * the gate's default ref.
75
47
  *
76
48
  * @param {string|undefined|null} baseBranch
77
49
  * @returns {{ BASELINE_REF: string } | null}
@@ -82,15 +54,8 @@ function buildBaselinesGateEnv(baseBranch) {
82
54
  }
83
55
 
84
56
  /**
85
- * Resolve whether the CRAP gate is enabled. When enabled, the close-
86
- * validation graph drops the standalone `test` gate because coverage-
87
- * capture already runs the suite under c8 instrumentation (Story #1798).
88
- *
89
- * Reads the single canonical shape `delivery.quality.gates.crap.enabled`
90
- * from the resolved config. Defaults to `true` so an omitted setting
91
- * matches `CRAP_GATE_DEFAULTS.enabled`. We deliberately do NOT round-trip
92
- * through `getQuality()` here because that resolver expects the unresolved
93
- * `gates.crap.*` shape.
57
+ * Defaults to `true` (matches `CRAP_GATE_DEFAULTS.enabled`). Not routed
58
+ * through `getQuality()`, which expects the unresolved `gates.crap.*` shape.
94
59
  *
95
60
  * @param {object|undefined|null} config - Canonical resolved config.
96
61
  * @returns {boolean}
@@ -102,41 +67,16 @@ function isCrapGateEnabled(config) {
102
67
  }
103
68
 
104
69
  /**
105
- * The gates run in the Story worktree, whose `package.json` is the committed
106
- * one the consumer ships — the presence of a `test:coverage` script is a
107
- * committed fact, so probing at the gate cwd is authoritative. See
108
- * `lib/npm-scripts.js` for the shared reader.
109
- */
110
-
111
- /**
112
- * Conditionally produce the standalone `test` gate entry.
113
- *
114
- * The plain `test` gate is the canonical test runner UNLESS the
115
- * coverage-capture gate is taking that role — which happens only when the
116
- * CRAP gate is enabled (Story #1798) AND the consumer actually ships a
117
- * `test:coverage` script for coverage-capture to run (#4473). When CRAP is
118
- * enabled but `test:coverage` is absent, coverage-capture is dropped from
119
- * the gate list, so the `test` gate MUST come back — otherwise the consumer
120
- * has NO working test gate at all. Splitting this out keeps
121
- * `buildDefaultGates` flat for the CRAP-cyclomatic gate.
70
+ * The plain `test` gate, unless coverage-capture will run the suite — every
71
+ * close must keep exactly one working test gate.
122
72
  *
123
- * Story #5278 adds a third way for coverage-capture to stop being the test
124
- * runner: it is registered, but its own incremental-coverage skip is already
125
- * known to fire (nothing changed under `crap.targetDirs`), so it will exit 0
126
- * without running anything. A tests-only Story hits that on every close, and
127
- * before #5278 the close then recorded a suite it never ran as `passed`.
128
- *
129
- * @param {boolean} coverageCaptureRunsSuite - Whether the coverage-capture
130
- * gate will actually run the suite for this build.
73
+ * @param {boolean} coverageCaptureRunsSuite
131
74
  * @returns {Gate[]}
132
75
  */
133
76
  function buildTestGateEntry(coverageCaptureRunsSuite) {
134
77
  if (coverageCaptureRunsSuite) return [];
135
- // Story #5173 — `fullSuiteLock` marks the one gate here that spawns a whole
136
- // suite, so `defaultGateRunner` serializes it behind the host lock. It is
137
- // set on this entry alone precisely because the two full-suite gates are
138
- // mutually exclusive: when `coverage-capture` is registered instead, the
139
- // lock is taken one level down, inside `runCapture`.
78
+ // `fullSuiteLock` serializes this suite behind the host lock; when
79
+ // coverage-capture runs instead, `runCapture` takes the lock itself.
140
80
  return [{ name: 'test', cmd: 'npm', args: ['test'], fullSuiteLock: true }];
141
81
  }
142
82
 
@@ -144,19 +84,10 @@ const CHECK_BASELINES_HINT =
144
84
  'Unified baselines gate breached. Inspect the JSON report (`node .agents/scripts/check-baselines.js`) to see which kind/component/axis fell below floor; remediate the underlying file(s) or — when the regression is intentional — refresh the relevant baseline through its per-kind update script and commit with a `baseline-refresh:` tagged subject.';
145
85
 
146
86
  /**
147
- * The names the unified baselines gate can register under (Story #5172).
148
- *
149
- * `single` is the unsplit entry — the historical name, and the fail-closed
150
- * fallback used whenever the enabled-kind set cannot be resolved into two
151
- * buckets. `independent` and `coverage` are the split pair: the first reads no
152
- * coverage artifact and therefore fails alongside `lint` / `format` /
153
- * `typecheck` in the parallel partition, the second consumes the artifact
154
- * `coverage-capture` writes and therefore stays serial behind it.
155
- *
156
- * Every name here MUST also be a member of the `gateName` enum in
157
- * `.agents/schemas/validation-evidence.schema.json` — the close pipeline keys
158
- * per-gate evidence on it. `tests/close-validation-gates-enum.test.js` pins
159
- * that ⊆ invariant.
87
+ * Baselines gate names. `single` is the unsplit fail-closed fallback;
88
+ * `independent` runs in the parallel partition, `coverage` stays serial
89
+ * behind coverage-capture. Every name MUST be in the `gateName` enum of
90
+ * `validation-evidence.schema.json`.
160
91
  */
161
92
  export const BASELINES_GATE_NAMES = Object.freeze({
162
93
  single: 'check-baselines',
@@ -164,28 +95,12 @@ export const BASELINES_GATE_NAMES = Object.freeze({
164
95
  coverage: 'check-baselines-coverage',
165
96
  });
166
97
 
167
- /**
168
- * The baseline kinds whose evaluation reads the coverage artifact written by
169
- * the `coverage-capture` gate (`coverage` scores it directly; `crap` divides
170
- * complexity by it). They are the only kinds that have to wait for the
171
- * capture — every other kind scores the source tree and can run as early as
172
- * the cheapest gates do.
173
- */
98
+ /** Kinds that read the coverage-capture artifact and so must wait for it. */
174
99
  const COVERAGE_CONSUMING_KINDS = new Set(['coverage', 'crap']);
175
100
 
176
101
  /**
177
- * Baseline kinds the resolved config enables for the unified
178
- * `check-baselines` gate. Mirrors `selectEnabledGates` in the check-baselines
179
- * pipeline (a kind runs when its `gates.<kind>` block is present and not
180
- * explicitly disabled) so the registration probe's view of "what will run"
181
- * matches the gate's own view exactly — and so the Story #5172 partition is
182
- * derived from the pipeline's own view of what runs rather than a hardcoded
183
- * kind list that a consumer's config could silently contradict.
184
- *
185
- * Returns `null` when that view cannot be resolved at all (a config object
186
- * whose `delivery.quality` access throws). Callers MUST read `null` as
187
- * "unknown" and fall back to the single unsplit gate: a partition that cannot
188
- * be computed must never silently drop enforcement.
102
+ * Enabled baseline kinds, mirroring `selectEnabledGates` in check-baselines.
103
+ * `null` means unresolvable; callers MUST fall back to the single unsplit gate.
189
104
  *
190
105
  * @param {object|undefined|null} config canonical resolved config
191
106
  * @returns {string[]|null}
@@ -203,11 +118,7 @@ function enabledBaselineKinds(config) {
203
118
  }
204
119
 
205
120
  /**
206
- * Whether the consumer opted into fail-closed baseline enforcement via
207
- * `delivery.quality.requireBaselines: true`. Default false — a consumer that
208
- * enables baseline gates but has not committed baseline artifacts gets a
209
- * clean skip (see `probeBaselinesGate`) rather than a deterministic first-try
210
- * close failure. Fail-closed baseline posture (#4495).
121
+ * `delivery.quality.requireBaselines: true` opts into fail-closed enforcement.
211
122
  *
212
123
  * @param {object|undefined|null} config
213
124
  * @returns {boolean}
@@ -223,33 +134,14 @@ function toKindSet(presentBaselines) {
223
134
  }
224
135
 
225
136
  /**
226
- * Probe whether the `check-baselines` consumer contract is satisfied before
227
- * registering the gate (#4495 — mirrors the #4473/#4480 coverage-capture
228
- * remedy). The contract: every enabled baseline kind carries a committed
229
- * baseline artifact on disk (the same path the gate's reader resolves).
230
- *
231
- * Decision shape:
232
- * - `{ register: false, reason }` — skip (caller logs the reason). Baseline
233
- * gates ARE enabled but none of the enabled kinds carry a committed
234
- * baseline artifact and the consumer has not set `requireBaselines`. This
235
- * is the bench/greenfield case: the gate would otherwise fail
236
- * deterministically on first try reading a non-existent
237
- * `baselines/<kind>.json`.
238
- * - `{ register: true }` — at least one committed baseline artifact is
239
- * present, OR no baseline kinds are enabled at all (the gate then self-
240
- * skips every kind and exits a clean empty PASS — no failure to avoid, so
241
- * the gate stays registered exactly as pre-#4495); run the gate.
242
- * - `{ register: true, hint }` — baselines are required-by-config
243
- * (`requireBaselines: true`) but absent; keep the gate registered so it
244
- * fails, with a preflight hint naming the fix.
137
+ * Decide whether to register `check-baselines`. Skip (with `reason`) only when
138
+ * kinds are enabled, none has a committed `baselines/<kind>.json`, and
139
+ * baselines are not required — the gate would otherwise fail deterministically.
140
+ * Required-but-absent stays registered with a fix `hint`; no enabled kinds
141
+ * registers (the gate exits a clean empty PASS).
245
142
  *
246
143
  * @param {{ config?: object, cwd?: string, enabledKinds?: string[]|null, presentBaselines?: string[]|Set<string> }} opts
247
- * `enabledKinds` is `enabledBaselineKinds(config)` computed once by the
248
- * caller (so the probe and the partition below read the same view).
249
- * A `null` — the unresolvable set — reads as "no enabled kinds", which is
250
- * the fail-closed path: the gate stays registered under its single
251
- * historical name. `presentBaselines` injects the set of kinds whose
252
- * baseline artifact exists (tests), short-circuiting the on-disk probe.
144
+ * `enabledKinds: null` (unresolvable) reads as none — the fail-closed path.
253
145
  * @returns {{ register: boolean, reason?: string, hint?: string }}
254
146
  */
255
147
  function probeBaselinesGate({
@@ -260,10 +152,6 @@ function probeBaselinesGate({
260
152
  } = {}) {
261
153
  const enabled = enabledKinds ?? [];
262
154
  if (enabled.length === 0) {
263
- // No enabled baseline kinds → `check-baselines.js` self-skips every kind
264
- // and exits clean (an empty PASS). There is no deterministic-failure risk
265
- // to avoid, so keep the gate registered exactly as it was pre-#4495; the
266
- // #4495 skip is confined strictly to the read-miss-would-fail case below.
267
155
  return { register: true };
268
156
  }
269
157
  const injected =
@@ -291,30 +179,10 @@ function probeBaselinesGate({
291
179
  }
292
180
 
293
181
  /**
294
- * Build the `check-baselines` gate entries for this run (Story #5172).
295
- *
296
- * One registration decision, one `BASELINE_REF` overlay, one remediation
297
- * hint — fanned out across however many entries the enabled-kind set splits
298
- * into. Keeping the fan-out here is what makes the #3890 (`BASELINE_REF`)
299
- * and #4495 (`probeBaselinesGate`) invariants structurally impossible to
300
- * apply to one entry and forget on the other.
301
- *
302
- * Three shapes:
303
- * - decision says skip → no entries at all (#4495's greenfield skip).
304
- * - `kinds` is null (unresolvable) or empty → ONE entry under the single
305
- * historical name with no `--gate` filter, in its historical serial
306
- * position. Fail closed: a partition that cannot be computed must never
307
- * silently drop enforcement, and an empty set means the gate self-skips
308
- * every kind and exits a clean empty PASS exactly as it did pre-split.
309
- * - otherwise → the split pair, each pinned to its own `--gate` list.
310
- * Neither bucket is ever registered with an empty kind set, so a consumer
311
- * running only coverage-consuming kinds gets no parallel entry and one
312
- * running none of them gets no serial entry.
313
- *
314
- * The independent entry is emitted first so a reader of the gate list sees
315
- * the order the runner actually walks; `partitionGates` is what routes it
316
- * into the parallel phase, and the coverage entry keeps its declared
317
- * position after `coverage-capture`.
182
+ * Fan one registration decision, `BASELINE_REF` overlay and hint out across
183
+ * the baselines entries, so no entry can miss one. Null/empty `kinds` yields
184
+ * ONE unfiltered `single` entry (fail closed); otherwise the non-empty
185
+ * buckets of the split pair, each pinned to its own `--gate` list.
318
186
  *
319
187
  * @param {{ decision: { register: boolean, hint?: string }, kinds: string[]|null, env: { BASELINE_REF: string }|null }} args
320
188
  * @returns {Gate[]}
@@ -351,10 +219,7 @@ function buildBaselinesGateEntries({ decision, kinds, env }) {
351
219
  }
352
220
 
353
221
  /**
354
- * Split a resolved command string into the `{ cmd, args }` pair a gate entry
355
- * carries. Whitespace-separated, so `npm run lint` yields the argv the gate
356
- * spawned before any of these commands were configurable — which is what
357
- * keeps an unconfigured consumer's `commandConfigHash` unchanged.
222
+ * Whitespace split; keeps an unconfigured consumer's `commandConfigHash` stable.
358
223
  *
359
224
  * @param {string} commandString
360
225
  * @returns {{ cmd: string, args: string[] }}
@@ -365,23 +230,10 @@ function splitCommand(commandString) {
365
230
  }
366
231
 
367
232
  /**
368
- * Will the `coverage-capture` gate skip its own capture before running
369
- * anything? (Story #5278.)
370
- *
371
- * `coverage-capture-incremental.js` exits 0 without a suite when no changed
372
- * file lives under `crap.targetDirs` — the saving that makes incremental mode
373
- * worth having. The gate list has to know that in advance, because the
374
- * consequence is not "coverage-capture is cheap today" but "there is no test
375
- * gate in this close at all": the plain `test` gate is dropped precisely
376
- * because coverage-capture was going to carry test-failure signalling. A
377
- * tests-only Story therefore closed green over a red suite.
378
- *
379
- * Predicting the skip is safe in one direction only, so every uncertainty
380
- * resolves to `false` (coverage-capture runs, no extra `test` gate — the
381
- * pre-#5278 shape): an unresolvable ref, a missing cwd, a git error, or the
382
- * mode being off. A wrong `false` costs one redundant capture; a wrong `true`
383
- * would register a `test` gate beside a coverage-capture that also runs the
384
- * suite, which is the double-spend the credit economy exists to prevent.
233
+ * Will coverage-capture take its incremental skip (no changed file under
234
+ * `crap.targetDirs`)? If so the close would otherwise have no test gate at all.
235
+ * Every uncertainty resolves to `false`: a wrong `false` costs one redundant
236
+ * capture, a wrong `true` runs the suite twice.
385
237
  *
386
238
  * @param {{
387
239
  * config?: object,
@@ -397,8 +249,7 @@ function predictsIncrementalCaptureSkip({
397
249
  baseBranch,
398
250
  getChangedFilesImpl = getChangedFiles,
399
251
  }) {
400
- // No cwd is the module-load `DEFAULT_GATES` case: never spawn git at import
401
- // time just to answer a question that caller cannot act on.
252
+ // No cwd is the module-load `DEFAULT_GATES` case: never spawn git at import.
402
253
  if (typeof cwd !== 'string' || cwd.length === 0) return false;
403
254
  const { crap } = getQuality(config);
404
255
  if (crap?.incrementalCoverage?.skipWhenUnchanged !== true) return false;
@@ -406,9 +257,8 @@ function predictsIncrementalCaptureSkip({
406
257
  if (typeof ref !== 'string' || ref.length === 0) return false;
407
258
  try {
408
259
  const changed = getChangedFilesImpl({ ref, cwd });
409
- // Not an array is "the change set is unknown", not "the change set is
410
- // empty" — and `filterFilesUnderTargets` flattens both to `[]`, so the
411
- // shape has to be checked here or an unknown diff reads as a skip.
260
+ // Non-array is "unknown", which `filterFilesUnderTargets` would flatten to
261
+ // `[]` and misread as a skip.
412
262
  if (!Array.isArray(changed)) return false;
413
263
  return filterFilesUnderTargets(changed, crap.targetDirs).length === 0;
414
264
  } catch {
@@ -417,9 +267,7 @@ function predictsIncrementalCaptureSkip({
417
267
  }
418
268
 
419
269
  /**
420
- * Is the `test` gate already credited for this build? Only consulted when
421
- * coverage-capture is the active runner; a consumer without one gets the
422
- * plain `test` gate regardless (Story #5313).
270
+ * Is the `test` gate already credited? Only consulted when coverage-capture is active.
423
271
  *
424
272
  * @param {{ coverageCaptureActive: boolean } & Parameters<typeof predictsTestEvidenceCredit>[0]} opts
425
273
  * @returns {boolean}
@@ -429,10 +277,7 @@ function resolveTestCredited({ coverageCaptureActive, ...probe }) {
429
277
  }
430
278
 
431
279
  /**
432
- * Will the `coverage-capture` gate be the one that runs the suite for this
433
- * build — so the plain `test` gate is dropped? It is not when it is inactive,
434
- * when its incremental skip is pre-decided (Story #5278), or when a green
435
- * bare `npm test` already deposited the test credit (Story #5313).
280
+ * Does coverage-capture run the suite (so the plain `test` gate is dropped)?
436
281
  *
437
282
  * @param {{ coverageCaptureActive: boolean, captureSkipPredicted: boolean, testCredited: boolean }} opts
438
283
  * @returns {boolean}
@@ -445,91 +290,47 @@ function coverageCaptureRunsSuite({
445
290
  return coverageCaptureActive && !captureSkipPredicted && !testCredited;
446
291
  }
447
292
 
293
+ const COVERAGE_CAPTURE_ARGS = Object.freeze([
294
+ '.agents/scripts/coverage-capture.js',
295
+ ]);
296
+
297
+ /** The close gate that replays the `pre-push` hook's CRAP-scope preview. */
298
+ const QUALITY_PREVIEW_GATE_NAME = 'quality-preview';
299
+
300
+ const QUALITY_PREVIEW_HINT =
301
+ "Quality preview failed — the same per-file maintainability / CRAP check the `pre-push` hook runs, scored against the base branch. Reduce the flagged methods' complexity or cover them, then re-run close; a close that skipped this gate would have died at push instead.";
302
+
448
303
  /**
449
- * The `coverage-capture` gate's argv.
450
- *
451
- * Story #5278 — `--require-credited` is passed here, and only here, when the
452
- * consumer has set `delivery.execution.requireCreditedCapture`. The CLI no
453
- * longer reads that key, so the worker's pre-push deposit invocation always
454
- * runs while the close gate refuses to pay for a suite the worker should
455
- * already have banked.
304
+ * Replays the `pre-push` CRAP-scope preview so its breach fails close, not
305
+ * the push. Registered exactly when coverage-capture is, and after it, so it
306
+ * scores a fresh artifact.
456
307
  *
457
- * @param {object} [config]
458
- * @returns {string[]}
308
+ * @param {{ coverageCaptureActive: boolean, baseBranch?: string }} opts
309
+ * @returns {Gate[]}
459
310
  */
460
- function buildCoverageCaptureArgs(config) {
461
- const args = ['.agents/scripts/coverage-capture.js'];
462
- if (config?.delivery?.execution?.requireCreditedCapture === true) {
463
- args.push('--require-credited');
464
- }
465
- return args;
311
+ function buildQualityPreviewGateEntry({ coverageCaptureActive, baseBranch }) {
312
+ if (!coverageCaptureActive) return [];
313
+ const ref = `origin/${baseBranch || 'main'}`;
314
+ return [
315
+ {
316
+ name: QUALITY_PREVIEW_GATE_NAME,
317
+ cmd: 'node',
318
+ args: ['.agents/scripts/quality-preview.js', '--changed-since', ref],
319
+ hint: QUALITY_PREVIEW_HINT,
320
+ },
321
+ ];
466
322
  }
467
323
 
468
324
  /**
469
- * Build the canonical close-validation gate list.
470
- *
471
- * Ordering (cheapest fast-fail first): typecheck → lint → [test] →
472
- * format → [coverage-capture] → check-baselines. The standalone `test`
473
- * gate is dropped when coverage-capture is the active test runner — i.e.
474
- * `crap.enabled === true` (Story #1798) AND a `test:coverage` script
475
- * exists (Story #4473) — because coverage-capture then carries
476
- * test-failure signalling under c8. When CRAP is on but `test:coverage` is
477
- * absent, coverage-capture is dropped and the `test` gate is restored so
478
- * there is always a working test gate.
479
- *
480
- * `typecheck` and `lint` are mandatory; consumers may customise either
481
- * command via `project.commands.typecheck` / `project.commands.lint`
482
- * (defaults `npm run typecheck` / `npm run lint`). Customising `lint` is how
483
- * a consumer whose hooks and CI already lint the diff stops paying for a
484
- * third whole-repo pass at close: `lint` runs in the parallel partition, so
485
- * a slow whole-repo lint sets the floor for that whole phase.
486
- *
487
- * Story #2210 retired the legacy per-kind in-process regression gates
488
- * (`check-maintainability`, `check-crap`, `check-mutation`) and their
489
- * shared in-process runner. The unified `check-baselines` gate is now the
490
- * single source of truth for per-kind regression enforcement
491
- * (attribution-wired floor + tolerance + schema).
492
- * The `baseBranch` parameter threads the close run's integration branch
493
- * into two gates: the `format` gate's `changedFileScope` (existing) and —
494
- * since Story #3890 — the `check-baselines` gate's `BASELINE_REF` env, so
495
- * the baselines regression compare diffs head against the epic integration
496
- * branch (`origin/<baseBranch>`) rather than the framework-default
497
- * `origin/main`. Without this, every child Story on an `epic/<id>` branch
498
- * re-discovered inherited main-vs-epic drift in untouched files as phantom
499
- * regressions and worked around it by hand-setting `BASELINE_REF`.
500
- *
501
- * Story #4473 — the coverage-capture gate spawns `npm run test:coverage`,
502
- * so it is registered ONLY when the consumer actually ships that script.
503
- * When CRAP is enabled but `test:coverage` is absent, coverage-capture is
504
- * dropped and the plain `test` gate is restored (see `buildTestGateEntry`),
505
- * so a consumer without a coverage script gets a working degraded test gate
506
- * instead of a deterministic close failure with no test gate at all. The
507
- * probe reads `package.json` at `cwd` (the gate execution directory).
508
- *
509
- * Story #4495 — the unified `check-baselines` gate reads a committed
510
- * `baselines/<kind>.json` for each enabled kind; a consumer that enables
511
- * baseline gates but ships no `baselines/` tree (every bench sandbox, any
512
- * greenfield consumer) failed the gate deterministically on first try. The
513
- * gate is now registered only when its consumer contract is satisfied
514
- * (`probeBaselinesGate`): at least one enabled kind carries a committed
515
- * baseline, OR the consumer opted into fail-closed enforcement via
516
- * `delivery.quality.requireBaselines`. When no baselines are committed and
517
- * none are required, the gate is skipped with a logged reason (via `log`)
518
- * instead of a blocking failure.
325
+ * Build the close-validation gate list, cheapest fast-fail first: typecheck →
326
+ * lint → [test] → format → [coverage-capture → quality-preview] →
327
+ * check-baselines. Coverage-capture registers only when CRAP is enabled AND a
328
+ * `test:coverage` script exists; it then carries test-failure signalling and
329
+ * the plain `test` gate is dropped, so there is always exactly one test gate.
519
330
  *
520
331
  * @param {{ config?: object, baseBranch?: string, cwd?: string, packageScripts?: Record<string, string>, presentBaselines?: string[]|Set<string>, log?: (message: string) => void, getChangedFilesImpl?: typeof getChangedFiles }} [opts]
521
- * `config` is the canonical resolved config (`{ project, delivery, ... }`);
522
- * gate commands resolve from `project.commands` and the CRAP toggle from
523
- * `delivery.quality.gates.crap.enabled`. `baseBranch` is the close run's
524
- * integration branch (`epic/<id>` for Epic-attached Stories, the base
525
- * branch for standalone Stories). `cwd` is where the `package.json`
526
- * coverage-script probe and the `baselines/<kind>.json` presence probe
527
- * read from (defaults to `process.cwd()`); `packageScripts` injects the
528
- * scripts map directly (tests) and short-circuits the coverage-script disk
529
- * read; `presentBaselines` injects the set of kinds whose baseline artifact
530
- * exists (tests) and short-circuits the baseline-presence disk read; `log`
531
- * receives the skip reason when the `check-baselines` gate is not
532
- * registered.
332
+ * `cwd` is where the `package.json` and baseline-presence probes read;
333
+ * `packageScripts` / `presentBaselines` inject those probes (tests).
533
334
  * @returns {Gate[]}
534
335
  */
535
336
  export function buildDefaultGates({
@@ -548,8 +349,8 @@ export function buildDefaultGates({
548
349
  const scripts = packageScripts ?? readPackageScripts(cwd);
549
350
  const coverageCaptureActive =
550
351
  isCrapGateEnabled(config) && hasNpmScript(scripts, 'test:coverage');
551
- // Story #5313 — a credited bare `npm test` registers the plain `test` gate
552
- // beside the capture so the credit is reported, never re-spent.
352
+ // A credited bare `npm test` registers the plain `test` gate beside the
353
+ // capture so the credit is reported, never re-spent.
553
354
  const testCredited = resolveTestCredited({
554
355
  coverageCaptureActive,
555
356
  storyId,
@@ -559,10 +360,8 @@ export function buildDefaultGates({
559
360
  shouldSkipImpl,
560
361
  log,
561
362
  });
562
- // Story #5278 — a registered coverage-capture gate that is going to take
563
- // its own incremental skip is not the test runner for this close, so the
564
- // plain `test` gate comes back beside it and the capture gate registers as
565
- // a pre-decided skip rather than as a suite that silently did not run.
363
+ // A predicted incremental skip registers the capture as a pre-decided skip
364
+ // and brings the plain `test` gate back.
566
365
  const captureSkipPredicted =
567
366
  coverageCaptureActive &&
568
367
  predictsIncrementalCaptureSkip({
@@ -603,10 +402,8 @@ export function buildDefaultGates({
603
402
  args: typecheck.args,
604
403
  hint: TYPECHECK_HINT,
605
404
  },
606
- // Gate name kept generic ("lint") for the same reason the format gate's
607
- // is: the command resolves from config, so a consumer pointing it at a
608
- // scoped pair does not shift the close-orchestrator log line, the
609
- // evidence keyspace, or the parallel-partition membership below.
405
+ // Gate names stay generic though commands resolve from config, so the
406
+ // log line, evidence keyspace and partition membership never shift.
610
407
  { name: 'lint', cmd: lint.cmd, args: lint.args },
611
408
  ...buildTestGateEntry(
612
409
  coverageCaptureRunsSuite({
@@ -616,10 +413,6 @@ export function buildDefaultGates({
616
413
  }),
617
414
  ),
618
415
  {
619
- // Gate name kept generic ("format") so the close-orchestrator log line
620
- // doesn't shift when a repo swaps biome for Prettier / dprint via
621
- // `project.commands.formatCheck`. The
622
- // actual command and the remediation hint resolve from config.
623
416
  name: 'format',
624
417
  cmd: format.cmd,
625
418
  args: format.args,
@@ -633,7 +426,7 @@ export function buildDefaultGates({
633
426
  {
634
427
  name: 'coverage-capture',
635
428
  cmd: 'node',
636
- args: buildCoverageCaptureArgs(config),
429
+ args: [...COVERAGE_CAPTURE_ARGS],
637
430
  hint: 'Coverage capture failed — `npm run test:coverage` exited non-zero. Fix failing tests or coverage-threshold breaches, then re-run close.',
638
431
  ...(captureSkipPredicted
639
432
  ? { skip: { reason: 'incremental-no-crap-changes' } }
@@ -641,28 +434,7 @@ export function buildDefaultGates({
641
434
  },
642
435
  ]
643
436
  : []),
644
- // Story #2210 — unified `check-baselines` gate is the only path for
645
- // per-kind regression enforcement. The legacy per-kind in-process gates
646
- // were retired because their regression-compare semantics are fully
647
- // subsumed by this gate's attribution-wired floor + tolerance + schema
648
- // enforcement, and running both paths in series was redundant and
649
- // conflict-prone.
650
- //
651
- // `check-baselines.js` self-skips per-kind gates whose `enabled === false`
652
- // is configured. Story #4495: it is now also skipped entirely when the
653
- // consumer enables baseline gates but ships no committed baseline artifact
654
- // (and has not set `delivery.quality.requireBaselines`) — otherwise the
655
- // gate fails deterministically on first try reading a non-existent
656
- // `baselines/<kind>.json` (`probeBaselinesGate`). When required-by-config
657
- // but absent, it stays registered with a preflight hint naming the fix.
658
- //
659
- // Story #5172: the gate registers as up to TWO entries. The kinds that
660
- // read no coverage artifact run in the parallel independent partition so
661
- // a baseline breach fails beside `lint` / `format` / `typecheck` instead
662
- // of minutes later behind `coverage-capture`; the coverage-consuming
663
- // kinds keep the serial slot after it. `buildBaselinesGateEntries` owns
664
- // that fan-out so both entries inherit ONE registration decision, ONE
665
- // `BASELINE_REF` overlay and ONE hint.
437
+ ...buildQualityPreviewGateEntry({ coverageCaptureActive, baseBranch }),
666
438
  ...buildBaselinesGateEntries({
667
439
  decision: baselinesDecision,
668
440
  kinds: baselineKinds,
@@ -672,36 +444,25 @@ export function buildDefaultGates({
672
444
  }
673
445
 
674
446
  /**
675
- * Default gate list resolved with no consumer config — uses the
676
- * `npm run typecheck` fallback for the typecheck gate. Call sites that have a
677
- * resolved config object in scope (e.g. `single-story-close.js`) should
678
- * prefer `buildDefaultGates({ config })` so a configured
679
- * `project.commands.typecheck` is honoured.
447
+ * Config-less gate list; callers holding a config should use `buildDefaultGates({ config })`.
680
448
  *
681
449
  * @type {Gate[]}
682
450
  */
683
451
  export const DEFAULT_GATES = buildDefaultGates();
684
452
 
685
453
  /**
686
- * Gates whose I/O is read-only against the working tree (no shared mutable
687
- * state, no overlapping ports/sockets). Safe to run concurrently — see
688
- * `runCloseValidation` for the Promise.all + AbortController plumbing.
454
+ * Gates that are read-only against the working tree and share no ports, so
455
+ * they may run concurrently.
689
456
  */
690
457
  const INDEPENDENT_GATE_NAMES = new Set([
691
458
  'lint',
692
459
  'format',
693
460
  'typecheck',
694
- // Story #5172 — the coverage-independent half of the baselines gate. It
695
- // reads the committed `baselines/<kind>.json` files and scores the source
696
- // tree in-process; it writes nothing and shares no port, so it satisfies
697
- // the same read-only contract as the three gates above.
698
461
  BASELINES_GATE_NAMES.independent,
699
462
  ]);
700
463
 
701
464
  /**
702
- * Partition a gate list into the parallel-safe set and the order-sensitive
703
- * remainder. Order is preserved within each bucket so the serial walk stays
704
- * cheapest-fast-fail-first (test → coverage-capture → check-baselines).
465
+ * Order is preserved within each bucket.
705
466
  *
706
467
  * @param {Gate[]} gates
707
468
  * @returns {{ independent: Gate[], serial: Gate[] }}