mandrel 2.59.0 → 2.61.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (678) hide show
  1. package/.agents/README.md +21 -19
  2. package/.agents/agents/acceptance-critic.md +24 -43
  3. package/.agents/agents/story-worker.md +20 -21
  4. package/.agents/docs/agentrc-reference.json +5 -84
  5. package/.agents/docs/configuration.md +48 -132
  6. package/.agents/docs/workflows.md +2 -2
  7. package/.agents/instructions.md +5 -8
  8. package/.agents/rules/ci-remediation.md +41 -8
  9. package/.agents/rules/gherkin-standards.md +4 -0
  10. package/.agents/schemas/acceptance-eval-verdict.schema.json +1 -1
  11. package/.agents/schemas/agentrc.schema.json +16 -496
  12. package/.agents/schemas/story-deliver-terminal.schema.json +13 -3
  13. package/.agents/schemas/validation-evidence.schema.json +2 -1
  14. package/.agents/scripts/README.md +23 -13
  15. package/.agents/scripts/acceptance-eval.js +35 -169
  16. package/.agents/scripts/agents-bootstrap-github.js +27 -129
  17. package/.agents/scripts/apply-quality-bootstrap.js +4 -40
  18. package/.agents/scripts/audit-baselines.js +6 -27
  19. package/.agents/scripts/audit-labels-bootstrap.js +5 -29
  20. package/.agents/scripts/audit-to-stories.js +91 -361
  21. package/.agents/scripts/boot-sweep.js +19 -72
  22. package/.agents/scripts/bootstrap.js +74 -395
  23. package/.agents/scripts/ceremony-derive.js +10 -41
  24. package/.agents/scripts/check-arch-cycles.js +14 -64
  25. package/.agents/scripts/check-baselines.js +8 -48
  26. package/.agents/scripts/check-context-budget.js +105 -311
  27. package/.agents/scripts/check-cyclomatic.js +12 -44
  28. package/.agents/scripts/check-dead-exports.js +13 -64
  29. package/.agents/scripts/check-doc-links.js +38 -186
  30. package/.agents/scripts/check-gherkin-corpus.js +24 -127
  31. package/.agents/scripts/check-test-temp-hygiene.js +28 -169
  32. package/.agents/scripts/coverage-capture.js +34 -98
  33. package/.agents/scripts/deliver-light.js +25 -171
  34. package/.agents/scripts/deliver-recover.js +6 -42
  35. package/.agents/scripts/deliver-run.js +534 -0
  36. package/.agents/scripts/diagnose-friction.js +24 -116
  37. package/.agents/scripts/drain-pending-cleanup.js +1 -1
  38. package/.agents/scripts/evidence-gate.js +23 -85
  39. package/.agents/scripts/file-ci-gap.js +57 -49
  40. package/.agents/scripts/generate-config-docs.js +30 -170
  41. package/.agents/scripts/generate-lens-checklists.js +8 -52
  42. package/.agents/scripts/generate-skills-index.js +14 -112
  43. package/.agents/scripts/generate-workflows-doc.js +10 -70
  44. package/.agents/scripts/git-cleanup.js +2 -34
  45. package/.agents/scripts/lib/Graph.js +24 -81
  46. package/.agents/scripts/lib/ITicketingProvider.js +47 -143
  47. package/.agents/scripts/lib/Logger.js +14 -76
  48. package/.agents/scripts/lib/audit-baselines/engine.js +11 -31
  49. package/.agents/scripts/lib/audit-baselines/gate-surface.js +3 -17
  50. package/.agents/scripts/lib/audit-baselines/headroom.js +4 -20
  51. package/.agents/scripts/lib/audit-baselines/hotspots.js +3 -15
  52. package/.agents/scripts/lib/audit-baselines/kinds.js +23 -89
  53. package/.agents/scripts/lib/audit-baselines/outliers.js +6 -23
  54. package/.agents/scripts/lib/audit-baselines/read.js +3 -16
  55. package/.agents/scripts/lib/audit-baselines/staleness.js +7 -26
  56. package/.agents/scripts/lib/audit-baselines/surface-entry.js +7 -28
  57. package/.agents/scripts/lib/audit-baselines/trend.js +7 -20
  58. package/.agents/scripts/lib/audit-baselines/weights.js +9 -37
  59. package/.agents/scripts/lib/audit-suite/audit-rules-reader.js +3 -18
  60. package/.agents/scripts/lib/audit-suite/checklist-threading.js +26 -124
  61. package/.agents/scripts/lib/audit-suite/dispatch-checklist.js +14 -45
  62. package/.agents/scripts/lib/audit-suite/findings.js +12 -52
  63. package/.agents/scripts/lib/audit-suite/frontmatter.js +5 -29
  64. package/.agents/scripts/lib/audit-suite/index.js +1 -15
  65. package/.agents/scripts/lib/audit-suite/lens-checklist.js +10 -45
  66. package/.agents/scripts/lib/audit-suite/lens-diff-floor.js +11 -76
  67. package/.agents/scripts/lib/audit-suite/runner.js +13 -43
  68. package/.agents/scripts/lib/audit-suite/selector.js +49 -349
  69. package/.agents/scripts/lib/audit-suite/substitutions.js +12 -40
  70. package/.agents/scripts/lib/audit-suite/workflow-loader.js +3 -15
  71. package/.agents/scripts/lib/audit-to-stories/audit-label-taxonomy.js +11 -73
  72. package/.agents/scripts/lib/audit-to-stories/audit-lenses.js +8 -37
  73. package/.agents/scripts/lib/audit-to-stories/build-story-body.js +25 -143
  74. package/.agents/scripts/lib/audit-to-stories/dedupe-against-github.js +14 -80
  75. package/.agents/scripts/lib/audit-to-stories/epic-grouping-directive.js +4 -18
  76. package/.agents/scripts/lib/audit-to-stories/finding-adapter.js +7 -40
  77. package/.agents/scripts/lib/audit-to-stories/group-findings.js +9 -39
  78. package/.agents/scripts/lib/audit-to-stories/issue-corpus.js +10 -66
  79. package/.agents/scripts/lib/audit-to-stories/issue-index.js +6 -30
  80. package/.agents/scripts/lib/audit-to-stories/issues-file.js +6 -36
  81. package/.agents/scripts/lib/audit-to-stories/ledger-commit.js +17 -69
  82. package/.agents/scripts/lib/audit-to-stories/ledger-pr.js +17 -85
  83. package/.agents/scripts/lib/audit-to-stories/ledger-record.js +10 -48
  84. package/.agents/scripts/lib/audit-to-stories/parse-audit-md.js +38 -146
  85. package/.agents/scripts/lib/audit-to-stories/seed-from-findings.js +7 -42
  86. package/.agents/scripts/lib/audit-to-stories/wire-dependencies.js +10 -57
  87. package/.agents/scripts/lib/baseline-loader.js +12 -51
  88. package/.agents/scripts/lib/baseline-schema-registry.js +5 -22
  89. package/.agents/scripts/lib/baselines/component-matcher.js +3 -12
  90. package/.agents/scripts/lib/baselines/components.js +10 -61
  91. package/.agents/scripts/lib/baselines/coverage-updater-cli.js +7 -36
  92. package/.agents/scripts/lib/baselines/crap-preview-incremental.js +7 -19
  93. package/.agents/scripts/lib/baselines/crap-preview-scan.js +19 -45
  94. package/.agents/scripts/lib/baselines/crap-updater-cli.js +16 -65
  95. package/.agents/scripts/lib/baselines/diff-scope-cli.js +5 -33
  96. package/.agents/scripts/lib/baselines/duplication-scanner.js +11 -60
  97. package/.agents/scripts/lib/baselines/env-overrides.js +12 -67
  98. package/.agents/scripts/lib/baselines/envelope.js +13 -129
  99. package/.agents/scripts/lib/baselines/exit-codes.js +6 -49
  100. package/.agents/scripts/lib/baselines/git-base.js +23 -142
  101. package/.agents/scripts/lib/baselines/kernel.js +11 -111
  102. package/.agents/scripts/lib/baselines/kinds/_crap-new-method-gate.js +9 -47
  103. package/.agents/scripts/lib/baselines/kinds/_crap-read.js +8 -51
  104. package/.agents/scripts/lib/baselines/kinds/_shared-metric.js +7 -62
  105. package/.agents/scripts/lib/baselines/kinds/bundle-size.js +8 -29
  106. package/.agents/scripts/lib/baselines/kinds/coverage.js +3 -15
  107. package/.agents/scripts/lib/baselines/kinds/crap.js +94 -415
  108. package/.agents/scripts/lib/baselines/kinds/duplication.js +4 -30
  109. package/.agents/scripts/lib/baselines/kinds/kind-factory.js +7 -53
  110. package/.agents/scripts/lib/baselines/kinds/maintainability.js +15 -80
  111. package/.agents/scripts/lib/baselines/kinds/mutation.js +12 -72
  112. package/.agents/scripts/lib/baselines/maintainability-baseline-io.js +4 -11
  113. package/.agents/scripts/lib/baselines/merge-envelopes.js +30 -146
  114. package/.agents/scripts/lib/baselines/path-canon.js +19 -128
  115. package/.agents/scripts/lib/baselines/preview-gates.js +8 -37
  116. package/.agents/scripts/lib/baselines/reader.js +14 -107
  117. package/.agents/scripts/lib/baselines/refresh-service.js +35 -252
  118. package/.agents/scripts/lib/baselines/scope.js +11 -135
  119. package/.agents/scripts/lib/baselines/writer.js +16 -149
  120. package/.agents/scripts/lib/bdd-runner-detect.js +18 -113
  121. package/.agents/scripts/lib/bdd-scenario-budget.js +9 -36
  122. package/.agents/scripts/lib/bdd-scenario-scanner.js +11 -73
  123. package/.agents/scripts/lib/bdd-step-index.js +26 -100
  124. package/.agents/scripts/lib/bootstrap/baseline-merge-driver.js +23 -103
  125. package/.agents/scripts/lib/bootstrap/branch-protection.js +2 -5
  126. package/.agents/scripts/lib/bootstrap/commit-push.js +12 -50
  127. package/.agents/scripts/lib/bootstrap/gh-preflight.js +14 -101
  128. package/.agents/scripts/lib/bootstrap/hitl-confirm.js +5 -30
  129. package/.agents/scripts/lib/bootstrap/install-ledger.js +17 -73
  130. package/.agents/scripts/lib/bootstrap/issue-forms-template.js +17 -121
  131. package/.agents/scripts/lib/bootstrap/manifest.js +15 -86
  132. package/.agents/scripts/lib/bootstrap/merge-methods.js +4 -33
  133. package/.agents/scripts/lib/bootstrap/preflight.js +12 -61
  134. package/.agents/scripts/lib/bootstrap/project-bootstrap.js +34 -235
  135. package/.agents/scripts/lib/bootstrap/prompt.js +21 -129
  136. package/.agents/scripts/lib/bootstrap/quality-bootstrap.js +27 -141
  137. package/.agents/scripts/lib/bootstrap/summary.js +1 -8
  138. package/.agents/scripts/lib/bootstrap/workflow-audit.js +11 -84
  139. package/.agents/scripts/lib/branch-name-guard.js +4 -23
  140. package/.agents/scripts/lib/changed-files.js +39 -121
  141. package/.agents/scripts/lib/checks/core-bare-clean.js +4 -24
  142. package/.agents/scripts/lib/checks/index.js +18 -101
  143. package/.agents/scripts/lib/checks/loop-health.js +11 -53
  144. package/.agents/scripts/lib/checks/state.js +16 -91
  145. package/.agents/scripts/lib/checks/story-init-not-backgrounded.js +10 -61
  146. package/.agents/scripts/lib/checks/subagent-agent-tool-required.js +14 -83
  147. package/.agents/scripts/lib/child-exec.js +39 -108
  148. package/.agents/scripts/lib/cli/standard-args.js +9 -116
  149. package/.agents/scripts/lib/cli-args.js +31 -146
  150. package/.agents/scripts/lib/cli-usage.js +5 -27
  151. package/.agents/scripts/lib/cli-utils.js +2 -12
  152. package/.agents/scripts/lib/close-validation/commands.js +13 -76
  153. package/.agents/scripts/lib/close-validation/gates.js +92 -331
  154. package/.agents/scripts/lib/close-validation/process.js +121 -151
  155. package/.agents/scripts/lib/close-validation/projections/advisories.js +5 -31
  156. package/.agents/scripts/lib/close-validation/projections/crap.js +19 -67
  157. package/.agents/scripts/lib/close-validation/projections/head-sha.js +1 -17
  158. package/.agents/scripts/lib/close-validation/projections/inputs.js +4 -34
  159. package/.agents/scripts/lib/close-validation/projections/maintainability.js +11 -58
  160. package/.agents/scripts/lib/close-validation/runner.js +53 -110
  161. package/.agents/scripts/lib/command-header.js +6 -28
  162. package/.agents/scripts/lib/config/acceptance-eval.js +4 -30
  163. package/.agents/scripts/lib/config/baselines.js +3 -14
  164. package/.agents/scripts/lib/config/ci.js +8 -38
  165. package/.agents/scripts/lib/config/commands.js +1 -15
  166. package/.agents/scripts/lib/config/defaults.js +4 -33
  167. package/.agents/scripts/lib/config/delivery-routing.js +6 -34
  168. package/.agents/scripts/lib/config/explain.js +10 -83
  169. package/.agents/scripts/lib/config/gates/coverage.schema.js +0 -12
  170. package/.agents/scripts/lib/config/gates/crap-incremental-coverage.schema.js +3 -31
  171. package/.agents/scripts/lib/config/gates/crap.schema.js +1 -34
  172. package/.agents/scripts/lib/config/gates/duplication.schema.js +1 -8
  173. package/.agents/scripts/lib/config/gates/index.js +2 -17
  174. package/.agents/scripts/lib/config/gates/maintainability.schema.js +1 -20
  175. package/.agents/scripts/lib/config/gates/mutation.schema.js +1 -7
  176. package/.agents/scripts/lib/config/gates/shared.js +4 -64
  177. package/.agents/scripts/lib/config/github.js +4 -22
  178. package/.agents/scripts/lib/config/limits.js +4 -57
  179. package/.agents/scripts/lib/config/paths.js +2 -21
  180. package/.agents/scripts/lib/config/qa.js +4 -38
  181. package/.agents/scripts/lib/config/quality.js +76 -432
  182. package/.agents/scripts/lib/config/runners.js +12 -56
  183. package/.agents/scripts/lib/config/runtime.js +13 -57
  184. package/.agents/scripts/lib/config/shared.js +2 -16
  185. package/.agents/scripts/lib/config/sync-agentrc.js +9 -50
  186. package/.agents/scripts/lib/config/temp-paths.js +40 -280
  187. package/.agents/scripts/lib/config/validate-orchestration.js +5 -17
  188. package/.agents/scripts/lib/config/worktree-isolation.js +9 -28
  189. package/.agents/scripts/lib/config-resolver.js +11 -52
  190. package/.agents/scripts/lib/config-schema-shared.js +1 -4
  191. package/.agents/scripts/lib/config-settings-schema-delivery.js +16 -291
  192. package/.agents/scripts/lib/config-settings-schema-quality.js +7 -219
  193. package/.agents/scripts/lib/config-settings-schema.js +37 -274
  194. package/.agents/scripts/lib/coverage-baseline.js +20 -110
  195. package/.agents/scripts/lib/coverage-capture-fullscope.js +18 -35
  196. package/.agents/scripts/lib/coverage-capture-incremental.js +15 -45
  197. package/.agents/scripts/lib/coverage-capture-usage.js +8 -25
  198. package/.agents/scripts/lib/coverage-capture.js +99 -224
  199. package/.agents/scripts/lib/coverage-utils.js +14 -79
  200. package/.agents/scripts/lib/cpu-pool.js +17 -123
  201. package/.agents/scripts/lib/crap-baseline-join.js +16 -88
  202. package/.agents/scripts/lib/crap-coordinates.js +6 -25
  203. package/.agents/scripts/lib/crap-engine.js +40 -153
  204. package/.agents/scripts/lib/crap-method-identity.js +16 -78
  205. package/.agents/scripts/lib/crap-utils.js +31 -155
  206. package/.agents/scripts/lib/cyclomatic-ceiling.js +14 -87
  207. package/.agents/scripts/lib/cyclomatic-scope.js +10 -50
  208. package/.agents/scripts/lib/dead-exports-knip.js +18 -56
  209. package/.agents/scripts/lib/dead-exports-mode.js +5 -24
  210. package/.agents/scripts/lib/degraded-mode.js +3 -26
  211. package/.agents/scripts/lib/dependency-parser.js +8 -40
  212. package/.agents/scripts/lib/dependency-version.js +13 -35
  213. package/.agents/scripts/lib/detect-package-manager.js +6 -36
  214. package/.agents/scripts/lib/doc-tiers.js +22 -124
  215. package/.agents/scripts/lib/duplicate-search.js +8 -72
  216. package/.agents/scripts/lib/env-loader.js +5 -27
  217. package/.agents/scripts/lib/error-redactor.js +6 -31
  218. package/.agents/scripts/lib/errors/index.js +2 -22
  219. package/.agents/scripts/lib/escomplex-ast-compat.js +22 -163
  220. package/.agents/scripts/lib/escomplex-kernel.js +21 -123
  221. package/.agents/scripts/lib/feedback-loop/graduator-core.js +94 -419
  222. package/.agents/scripts/lib/feedback-loop/prior-feedback-fetcher.js +20 -98
  223. package/.agents/scripts/lib/feedback-loop/retro-proposals-graduator.js +27 -149
  224. package/.agents/scripts/lib/findings/audit-ledger.js +23 -97
  225. package/.agents/scripts/lib/findings/classify-finding.js +14 -69
  226. package/.agents/scripts/lib/findings/promote-finding.js +14 -112
  227. package/.agents/scripts/lib/findings/provenance-field.js +11 -52
  228. package/.agents/scripts/lib/findings/route-finding.js +37 -255
  229. package/.agents/scripts/lib/findings/semantic-issue-search.js +14 -59
  230. package/.agents/scripts/lib/findings/severity.js +18 -104
  231. package/.agents/scripts/lib/format-generated-json.js +12 -44
  232. package/.agents/scripts/lib/full-suite-lock.js +160 -429
  233. package/.agents/scripts/lib/full-suite-queue.js +213 -0
  234. package/.agents/scripts/lib/gates/baseline-store.js +5 -9
  235. package/.agents/scripts/lib/gates/friction.js +1 -3
  236. package/.agents/scripts/lib/generated/agentrc-validator.js +2 -2
  237. package/.agents/scripts/lib/gh-exec.js +123 -191
  238. package/.agents/scripts/lib/git/cached-fetch.js +9 -52
  239. package/.agents/scripts/lib/git/sync-from-base.js +15 -107
  240. package/.agents/scripts/lib/git-branch-cleanup.js +14 -61
  241. package/.agents/scripts/lib/git-branch-lifecycle.js +16 -87
  242. package/.agents/scripts/lib/git-utils.js +37 -161
  243. package/.agents/scripts/lib/github/framework-repo.js +8 -71
  244. package/.agents/scripts/lib/github-url.js +2 -17
  245. package/.agents/scripts/lib/import-graph.js +11 -38
  246. package/.agents/scripts/lib/install-cmd-parser.js +4 -13
  247. package/.agents/scripts/lib/json-utils.js +3 -18
  248. package/.agents/scripts/lib/label-constants.js +16 -111
  249. package/.agents/scripts/lib/label-taxonomy.js +4 -30
  250. package/.agents/scripts/lib/maintainability-engine.js +12 -80
  251. package/.agents/scripts/lib/maintainability-unscorable.js +5 -25
  252. package/.agents/scripts/lib/maintainability-utils.js +16 -92
  253. package/.agents/scripts/lib/mandrel-catalog.js +12 -70
  254. package/.agents/scripts/lib/notifications/notifier.js +13 -38
  255. package/.agents/scripts/lib/npm-scripts.js +4 -23
  256. package/.agents/scripts/lib/observability/metrics-ledger.js +16 -76
  257. package/.agents/scripts/lib/observability/runtime-friction.js +44 -286
  258. package/.agents/scripts/lib/observability/signal-validator.js +5 -37
  259. package/.agents/scripts/lib/observability/signals-writer.js +11 -121
  260. package/.agents/scripts/lib/observability/source-classifier.js +22 -203
  261. package/.agents/scripts/lib/observability/terse-result.js +14 -47
  262. package/.agents/scripts/lib/onboard/init-tail.js +13 -74
  263. package/.agents/scripts/lib/onboard/scaffold-docs.js +11 -34
  264. package/.agents/scripts/lib/orchestration/acceptance-eval-decision.js +25 -139
  265. package/.agents/scripts/lib/orchestration/auto-merge-cwd.js +11 -66
  266. package/.agents/scripts/lib/orchestration/behind-recovery.js +10 -55
  267. package/.agents/scripts/lib/orchestration/ceremony-routing.js +28 -156
  268. package/.agents/scripts/lib/orchestration/change-set.js +7 -36
  269. package/.agents/scripts/lib/orchestration/check-baselines/phases/compare.js +9 -46
  270. package/.agents/scripts/lib/orchestration/check-baselines/phases/evaluate.js +11 -44
  271. package/.agents/scripts/lib/orchestration/check-baselines/phases/floors.js +5 -24
  272. package/.agents/scripts/lib/orchestration/check-baselines/phases/friction.js +3 -12
  273. package/.agents/scripts/lib/orchestration/check-baselines/phases/parse-args.js +5 -38
  274. package/.agents/scripts/lib/orchestration/check-baselines/phases/pipeline.js +3 -8
  275. package/.agents/scripts/lib/orchestration/check-baselines/phases/refresh-ack.js +28 -136
  276. package/.agents/scripts/lib/orchestration/check-baselines/phases/report.js +3 -13
  277. package/.agents/scripts/lib/orchestration/check-state.js +92 -0
  278. package/.agents/scripts/lib/orchestration/ci-gap-intake.js +37 -144
  279. package/.agents/scripts/lib/orchestration/ci-rerun-guard.js +121 -157
  280. package/.agents/scripts/lib/orchestration/code-review.js +24 -128
  281. package/.agents/scripts/lib/orchestration/column-sync.js +23 -111
  282. package/.agents/scripts/lib/orchestration/complexity-gate.js +118 -462
  283. package/.agents/scripts/lib/orchestration/deliver-recover.js +36 -168
  284. package/.agents/scripts/lib/orchestration/dependency-analyzer.js +4 -35
  285. package/.agents/scripts/lib/orchestration/dependency-candidates.js +9 -41
  286. package/.agents/scripts/lib/orchestration/diff-magnitude.js +25 -115
  287. package/.agents/scripts/lib/orchestration/doc-reader.js +2 -6
  288. package/.agents/scripts/lib/orchestration/docs-digest.js +13 -51
  289. package/.agents/scripts/lib/orchestration/epic-candidates.js +13 -53
  290. package/.agents/scripts/lib/orchestration/epic-checklist.js +9 -33
  291. package/.agents/scripts/lib/orchestration/epic-container.js +41 -167
  292. package/.agents/scripts/lib/orchestration/epic-expansion.js +10 -40
  293. package/.agents/scripts/lib/orchestration/epic-rollup.js +55 -207
  294. package/.agents/scripts/lib/orchestration/file-assumption-enum.js +2 -22
  295. package/.agents/scripts/lib/orchestration/file-assumptions.js +45 -253
  296. package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-detect.js +9 -46
  297. package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-reap.js +7 -57
  298. package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches.js +21 -126
  299. package/.agents/scripts/lib/orchestration/git-cleanup/phases/cli.js +2 -6
  300. package/.agents/scripts/lib/orchestration/git-cleanup/phases/fast-forward.js +1 -4
  301. package/.agents/scripts/lib/orchestration/git-cleanup/phases/filters.js +1 -5
  302. package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes-ff.js +9 -34
  303. package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes.js +41 -190
  304. package/.agents/scripts/lib/orchestration/git-cleanup/phases/merged-tip.js +9 -45
  305. package/.agents/scripts/lib/orchestration/git-cleanup/phases/parse-args.js +1 -4
  306. package/.agents/scripts/lib/orchestration/git-cleanup/phases/phase-drivers.js +19 -85
  307. package/.agents/scripts/lib/orchestration/git-cleanup/phases/prompts.js +3 -17
  308. package/.agents/scripts/lib/orchestration/git-cleanup/phases/prune.js +1 -5
  309. package/.agents/scripts/lib/orchestration/git-cleanup/phases/render.js +16 -100
  310. package/.agents/scripts/lib/orchestration/git-cleanup/phases/stashes.js +1 -4
  311. package/.agents/scripts/lib/orchestration/lease-guard-shared.js +16 -67
  312. package/.agents/scripts/lib/orchestration/lifecycle/emit-ledger-event.js +9 -33
  313. package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-flip-failed.js +8 -29
  314. package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-unlanded.js +15 -68
  315. package/.agents/scripts/lib/orchestration/light-backstop.js +11 -49
  316. package/.agents/scripts/lib/orchestration/light-escalation.js +21 -89
  317. package/.agents/scripts/lib/orchestration/light-suitability.js +37 -307
  318. package/.agents/scripts/lib/orchestration/merge-block-class.js +39 -216
  319. package/.agents/scripts/lib/orchestration/merge-poll.js +104 -377
  320. package/.agents/scripts/lib/orchestration/pinned-identifier-lint.js +17 -57
  321. package/.agents/scripts/lib/orchestration/plan-context.js +55 -318
  322. package/.agents/scripts/lib/orchestration/plan-critic-conditions.js +22 -79
  323. package/.agents/scripts/lib/orchestration/plan-critics-evaluate.js +5 -31
  324. package/.agents/scripts/lib/orchestration/plan-metrics.js +29 -108
  325. package/.agents/scripts/lib/orchestration/plan-navigation.js +8 -27
  326. package/.agents/scripts/lib/orchestration/plan-persist/acceptance-handle-repair.js +12 -49
  327. package/.agents/scripts/lib/orchestration/plan-persist/audit-provenance.js +18 -73
  328. package/.agents/scripts/lib/orchestration/plan-persist/changes-repair.js +16 -78
  329. package/.agents/scripts/lib/orchestration/plan-persist/cross-plan-links.js +6 -30
  330. package/.agents/scripts/lib/orchestration/plan-persist/epic-adoption.js +14 -65
  331. package/.agents/scripts/lib/orchestration/plan-persist/epic-ops.js +21 -76
  332. package/.agents/scripts/lib/orchestration/plan-persist/external-deps.js +6 -43
  333. package/.agents/scripts/lib/orchestration/plan-persist/persist-helpers.js +14 -68
  334. package/.agents/scripts/lib/orchestration/plan-persist/plan-context-source.js +9 -41
  335. package/.agents/scripts/lib/orchestration/plan-persist/run-plan-persist.js +71 -289
  336. package/.agents/scripts/lib/orchestration/plan-persist/soft-findings.js +2 -12
  337. package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +96 -362
  338. package/.agents/scripts/lib/orchestration/plan-persist/summary.js +9 -39
  339. package/.agents/scripts/lib/orchestration/plan-persist/supersede-ops.js +60 -186
  340. package/.agents/scripts/lib/orchestration/plan-persist/wave-collision-gate.js +9 -49
  341. package/.agents/scripts/lib/orchestration/plan-persist/wave-serialisation.js +7 -28
  342. package/.agents/scripts/lib/orchestration/plan-reachability.js +13 -42
  343. package/.agents/scripts/lib/orchestration/plan-run-labels/reap.js +16 -91
  344. package/.agents/scripts/lib/orchestration/plan-runner/worktree-sweep.js +16 -54
  345. package/.agents/scripts/lib/orchestration/plan-text-hygiene.js +10 -52
  346. package/.agents/scripts/lib/orchestration/planning/authoring-context.js +14 -109
  347. package/.agents/scripts/lib/orchestration/planning/memory-pool-advisory.js +11 -83
  348. package/.agents/scripts/lib/orchestration/pr-watch.js +48 -306
  349. package/.agents/scripts/lib/orchestration/project-meta-cache.js +15 -80
  350. package/.agents/scripts/lib/orchestration/project-meta-resolver.js +10 -51
  351. package/.agents/scripts/lib/orchestration/reassert-status-column.js +12 -76
  352. package/.agents/scripts/lib/orchestration/remote-verifier.js +12 -36
  353. package/.agents/scripts/lib/orchestration/resolve-stories.js +33 -164
  354. package/.agents/scripts/lib/orchestration/retro-proposals.js +66 -361
  355. package/.agents/scripts/lib/orchestration/review-base-ref.js +9 -43
  356. package/.agents/scripts/lib/orchestration/review-depth.js +12 -91
  357. package/.agents/scripts/lib/orchestration/review-providers/codex.js +10 -111
  358. package/.agents/scripts/lib/orchestration/review-providers/degraded-gates.js +13 -71
  359. package/.agents/scripts/lib/orchestration/review-providers/findings-renderer.js +7 -51
  360. package/.agents/scripts/lib/orchestration/review-providers/mi-exemptions.js +8 -53
  361. package/.agents/scripts/lib/orchestration/review-providers/native.js +30 -214
  362. package/.agents/scripts/lib/orchestration/review-providers/parse-findings.js +7 -52
  363. package/.agents/scripts/lib/orchestration/review-providers/review-depth.js +4 -33
  364. package/.agents/scripts/lib/orchestration/review-providers/review-provider-factory.js +11 -71
  365. package/.agents/scripts/lib/orchestration/review-providers/scoped-lint.js +19 -131
  366. package/.agents/scripts/lib/orchestration/review-providers/security-review.js +6 -89
  367. package/.agents/scripts/lib/orchestration/review-providers/types.js +26 -56
  368. package/.agents/scripts/lib/orchestration/review-providers/ultrareview.js +3 -46
  369. package/.agents/scripts/lib/orchestration/run-epilogue.js +245 -326
  370. package/.agents/scripts/lib/orchestration/run-scoped-config.js +55 -159
  371. package/.agents/scripts/lib/orchestration/single-story-close/close-note.js +7 -34
  372. package/.agents/scripts/lib/orchestration/single-story-close/failed-terminal.js +16 -89
  373. package/.agents/scripts/lib/orchestration/single-story-close/gate-log.js +18 -109
  374. package/.agents/scripts/lib/orchestration/single-story-close/phases/auto-merge.js +83 -239
  375. package/.agents/scripts/lib/orchestration/single-story-close/phases/base-sync.js +20 -82
  376. package/.agents/scripts/lib/orchestration/single-story-close/phases/close-validation.js +103 -97
  377. package/.agents/scripts/lib/orchestration/single-story-close/phases/code-review.js +8 -64
  378. package/.agents/scripts/lib/orchestration/single-story-close/phases/confirm-merge.js +136 -486
  379. package/.agents/scripts/lib/orchestration/single-story-close/phases/conventional-subject.js +30 -134
  380. package/.agents/scripts/lib/orchestration/single-story-close/phases/graphql-preflight.js +96 -0
  381. package/.agents/scripts/lib/orchestration/single-story-close/phases/lock-wait-pending.js +49 -0
  382. package/.agents/scripts/lib/orchestration/single-story-close/phases/normalize-pr-title.js +13 -86
  383. package/.agents/scripts/lib/orchestration/single-story-close/phases/options.js +20 -95
  384. package/.agents/scripts/lib/orchestration/single-story-close/phases/post-land.js +46 -203
  385. package/.agents/scripts/lib/orchestration/single-story-close/phases/pre-gate-steps.js +8 -50
  386. package/.agents/scripts/lib/orchestration/single-story-close/phases/pull-request.js +12 -83
  387. package/.agents/scripts/lib/orchestration/single-story-close/phases/push.js +6 -39
  388. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-block.js +1 -6
  389. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-outcome.js +4 -28
  390. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-override.js +6 -51
  391. package/.agents/scripts/lib/orchestration/single-story-close/phases/worktree-reap.js +6 -34
  392. package/.agents/scripts/lib/orchestration/single-story-close/phases/wrong-tree-guard.js +23 -121
  393. package/.agents/scripts/lib/orchestration/single-story-close/runner.js +180 -273
  394. package/.agents/scripts/lib/orchestration/single-story-lease-guard.js +15 -69
  395. package/.agents/scripts/lib/orchestration/story-body-gate.js +4 -23
  396. package/.agents/scripts/lib/orchestration/story-close/baseline-upward-writeback.js +50 -179
  397. package/.agents/scripts/lib/orchestration/story-close/context-budget-writeback.js +11 -41
  398. package/.agents/scripts/lib/orchestration/story-close/format-autofix.js +23 -311
  399. package/.agents/scripts/lib/orchestration/story-close/phases/local-lens-review.js +22 -147
  400. package/.agents/scripts/lib/orchestration/story-close/phases/review-core.js +16 -67
  401. package/.agents/scripts/lib/orchestration/story-deliver-terminal-schema.js +12 -68
  402. package/.agents/scripts/lib/orchestration/story-deliver-terminal.js +42 -200
  403. package/.agents/scripts/lib/orchestration/story-follow-ups.js +167 -252
  404. package/.agents/scripts/lib/orchestration/story-init-envelope.js +52 -0
  405. package/.agents/scripts/lib/orchestration/story-init-remote.js +2 -6
  406. package/.agents/scripts/lib/orchestration/story-reachability.js +3 -23
  407. package/.agents/scripts/lib/orchestration/task-body-validator.js +12 -135
  408. package/.agents/scripts/lib/orchestration/ticket-lease.js +28 -131
  409. package/.agents/scripts/lib/orchestration/ticket-validator-conflicts.js +15 -149
  410. package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +5 -33
  411. package/.agents/scripts/lib/orchestration/ticket-validator.js +63 -344
  412. package/.agents/scripts/lib/orchestration/ticketing/bulk.js +51 -244
  413. package/.agents/scripts/lib/orchestration/ticketing/reads.js +39 -261
  414. package/.agents/scripts/lib/orchestration/ticketing/state.js +14 -68
  415. package/.agents/scripts/lib/orchestration/ticketing/transition.js +46 -263
  416. package/.agents/scripts/lib/orchestration/ticketing.js +2 -26
  417. package/.agents/scripts/lib/orchestration/verify-credit.js +18 -79
  418. package/.agents/scripts/lib/orchestration/worktree-dirty.js +5 -30
  419. package/.agents/scripts/lib/path-security.js +3 -6
  420. package/.agents/scripts/lib/plan-phase-cleanup.js +9 -49
  421. package/.agents/scripts/lib/preflight-runner.js +13 -69
  422. package/.agents/scripts/lib/process-group.js +143 -0
  423. package/.agents/scripts/lib/project-root.js +2 -8
  424. package/.agents/scripts/lib/provider-factory.js +2 -25
  425. package/.agents/scripts/lib/qa/console-allowlist.js +10 -59
  426. package/.agents/scripts/lib/qa/qa-session.js +15 -69
  427. package/.agents/scripts/lib/qa/redact-evidence.js +18 -129
  428. package/.agents/scripts/lib/qa/resolve-qa-contract.js +26 -135
  429. package/.agents/scripts/lib/qa/resolve-selection.js +16 -84
  430. package/.agents/scripts/lib/reserved-test-ids.js +9 -47
  431. package/.agents/scripts/lib/runtime-deps/dep-resolution.js +13 -53
  432. package/.agents/scripts/lib/runtime-deps/ensure-installed.js +10 -44
  433. package/.agents/scripts/lib/runtime-deps/manifest.js +10 -30
  434. package/.agents/scripts/lib/runtime-deps/parser-major.js +15 -51
  435. package/.agents/scripts/lib/runtime-deps/preflight.js +4 -22
  436. package/.agents/scripts/lib/runtime-deps/scan-imports.js +11 -55
  437. package/.agents/scripts/lib/signals/detectors/common.js +12 -38
  438. package/.agents/scripts/lib/signals/index.js +2 -19
  439. package/.agents/scripts/lib/signals/schema.js +14 -109
  440. package/.agents/scripts/lib/signals/write.js +2 -11
  441. package/.agents/scripts/lib/single-story/confirm-merge.js +31 -72
  442. package/.agents/scripts/lib/single-story/story-merged-notify.js +8 -49
  443. package/.agents/scripts/lib/single-story-sweep/protection-ctx.js +4 -26
  444. package/.agents/scripts/lib/single-story-sweep/protection.js +13 -100
  445. package/.agents/scripts/lib/single-story-sweep/sweep-lock.js +60 -258
  446. package/.agents/scripts/lib/single-story-sweep.js +14 -97
  447. package/.agents/scripts/lib/skills/parse-skill.js +13 -59
  448. package/.agents/scripts/lib/skills/skills-index.js +8 -29
  449. package/.agents/scripts/lib/skills/walk-skill-files.js +17 -78
  450. package/.agents/scripts/lib/source-extensions.js +11 -42
  451. package/.agents/scripts/lib/source-text/strip-js-comments.js +8 -41
  452. package/.agents/scripts/lib/stdio-flush.js +9 -36
  453. package/.agents/scripts/lib/story-adjacency.js +8 -40
  454. package/.agents/scripts/lib/story-body/body-format-lints.js +51 -66
  455. package/.agents/scripts/lib/story-body/footer-block.js +11 -44
  456. package/.agents/scripts/lib/story-body/story-body.js +123 -344
  457. package/.agents/scripts/lib/temp-retention.js +42 -143
  458. package/.agents/scripts/lib/templates/decomposer-prompts.js +18 -80
  459. package/.agents/scripts/lib/test-env.js +12 -65
  460. package/.agents/scripts/lib/test-run-credit.js +10 -65
  461. package/.agents/scripts/lib/test-runner-contract.js +19 -74
  462. package/.agents/scripts/lib/test-temp.js +38 -184
  463. package/.agents/scripts/lib/test-tiers.js +12 -96
  464. package/.agents/scripts/lib/ticket-body-sections.js +21 -96
  465. package/.agents/scripts/lib/transpile.js +15 -74
  466. package/.agents/scripts/lib/util/concurrent-map.js +6 -25
  467. package/.agents/scripts/lib/util/parse-id-list.js +8 -34
  468. package/.agents/scripts/lib/util/poll-loop.js +8 -28
  469. package/.agents/scripts/lib/util/with-timeout.js +2 -11
  470. package/.agents/scripts/lib/validation-evidence.js +21 -96
  471. package/.agents/scripts/lib/wave-runner/footprint.js +17 -70
  472. package/.agents/scripts/lib/wave-runner/live-probe.js +67 -209
  473. package/.agents/scripts/lib/wave-runner/ready-set.js +72 -301
  474. package/.agents/scripts/lib/workers/crap-worker.js +11 -64
  475. package/.agents/scripts/lib/workers/maintainability-report-worker.js +8 -45
  476. package/.agents/scripts/lib/workers/maintainability-worker.js +5 -21
  477. package/.agents/scripts/lib/workers/serve-worker-messages.js +2 -18
  478. package/.agents/scripts/lib/workflow-closure.js +22 -105
  479. package/.agents/scripts/lib/workspace-provisioner.js +16 -54
  480. package/.agents/scripts/lib/worktree/git-hooks.js +15 -60
  481. package/.agents/scripts/lib/worktree/lifecycle/force-drain.js +20 -60
  482. package/.agents/scripts/lib/worktree/lifecycle/merge-reachability.js +10 -62
  483. package/.agents/scripts/lib/worktree/lifecycle/pending-cleanup.js +22 -86
  484. package/.agents/scripts/lib/worktree/lifecycle/reap.js +24 -126
  485. package/.agents/scripts/lib/worktree/lifecycle-manager.js +2 -20
  486. package/.agents/scripts/lib/worktree/node-modules-strategy.js +46 -180
  487. package/.agents/scripts/lib/worktree-manager.js +15 -40
  488. package/.agents/scripts/lint-issue-body.js +12 -68
  489. package/.agents/scripts/mandrel-update-preflight.js +10 -70
  490. package/.agents/scripts/merge-baseline.js +30 -105
  491. package/.agents/scripts/nav-registry-diff.js +22 -108
  492. package/.agents/scripts/notify.js +12 -69
  493. package/.agents/scripts/plan-context.js +97 -92
  494. package/.agents/scripts/plan-critics.js +12 -66
  495. package/.agents/scripts/plan-persist.js +71 -137
  496. package/.agents/scripts/plan-run-epilogue.js +20 -43
  497. package/.agents/scripts/pr-watch-with-update.js +79 -263
  498. package/.agents/scripts/providers/github/auth.js +3 -8
  499. package/.agents/scripts/providers/github/blocked-by-add.js +14 -61
  500. package/.agents/scripts/providers/github/board-add.js +5 -21
  501. package/.agents/scripts/providers/github/branch-protection.js +11 -43
  502. package/.agents/scripts/providers/github/cache.js +2 -14
  503. package/.agents/scripts/providers/github/comments.js +7 -40
  504. package/.agents/scripts/providers/github/compose.js +3 -19
  505. package/.agents/scripts/providers/github/errors.js +22 -125
  506. package/.agents/scripts/providers/github/issues.js +31 -123
  507. package/.agents/scripts/providers/github/labels.js +24 -124
  508. package/.agents/scripts/providers/github/mappers.js +5 -27
  509. package/.agents/scripts/providers/github/merge-methods.js +3 -22
  510. package/.agents/scripts/providers/github/project-board.js +2 -17
  511. package/.agents/scripts/providers/github/projects-v2-graphql.js +3 -6
  512. package/.agents/scripts/providers/github/request-helpers.js +5 -32
  513. package/.agents/scripts/providers/github/search-budget.js +9 -39
  514. package/.agents/scripts/providers/github/search-query.js +5 -26
  515. package/.agents/scripts/providers/github/sub-issue-add.js +15 -65
  516. package/.agents/scripts/providers/github/sub-issues.js +7 -36
  517. package/.agents/scripts/providers/github/tickets.js +32 -134
  518. package/.agents/scripts/providers/github.js +18 -59
  519. package/.agents/scripts/prune-plan-run-labels.js +12 -46
  520. package/.agents/scripts/quality-preview.js +35 -220
  521. package/.agents/scripts/resolve-doc-tiers.js +3 -26
  522. package/.agents/scripts/resolve-stories.js +16 -67
  523. package/.agents/scripts/resync-status-column.js +6 -25
  524. package/.agents/scripts/run-tests.js +29 -104
  525. package/.agents/scripts/single-story-close.js +23 -135
  526. package/.agents/scripts/single-story-confirm-merge.js +32 -139
  527. package/.agents/scripts/single-story-init.js +47 -259
  528. package/.agents/scripts/stories-wave-tick.js +179 -415
  529. package/.agents/scripts/sync-agentrc.js +3 -21
  530. package/.agents/scripts/sync-claude-agents.js +9 -55
  531. package/.agents/scripts/sync-claude-commands.js +20 -110
  532. package/.agents/scripts/test-wrapper.js +6 -43
  533. package/.agents/scripts/update-coverage-baseline.js +5 -22
  534. package/.agents/scripts/update-crap-baseline.js +7 -30
  535. package/.agents/scripts/update-duplication-baseline.js +16 -92
  536. package/.agents/scripts/update-maintainability-baseline.js +8 -62
  537. package/.agents/scripts/update-ticket-state.js +1 -7
  538. package/.agents/scripts/validate-skills.js +6 -26
  539. package/.agents/skills/core/gates-and-baselines/reference.md +0 -1
  540. package/.agents/skills/skills.index.json +2 -2
  541. package/.agents/skills/stack/qa/playwright/SKILL.md +26 -0
  542. package/.agents/templates/agent-protocol.md +2 -2
  543. package/.agents/templates/docs/audit-sweep-runbook.md +3 -4
  544. package/.agents/workflows/audit-accessibility.md +4 -7
  545. package/.agents/workflows/audit-adrs.md +3 -6
  546. package/.agents/workflows/audit-architecture.md +3 -11
  547. package/.agents/workflows/audit-baselines.md +6 -9
  548. package/.agents/workflows/audit-clean-code.md +8 -12
  549. package/.agents/workflows/audit-data-model.md +3 -7
  550. package/.agents/workflows/audit-dependencies.md +4 -7
  551. package/.agents/workflows/audit-devops.md +4 -8
  552. package/.agents/workflows/audit-documentation.md +1 -4
  553. package/.agents/workflows/audit-mobile.md +4 -7
  554. package/.agents/workflows/audit-navigability.md +3 -6
  555. package/.agents/workflows/audit-performance.md +2 -4
  556. package/.agents/workflows/audit-privacy.md +4 -7
  557. package/.agents/workflows/audit-quality.md +4 -7
  558. package/.agents/workflows/audit-security.md +4 -7
  559. package/.agents/workflows/audit-seo.md +4 -7
  560. package/.agents/workflows/audit-sre.md +4 -7
  561. package/.agents/workflows/audit-to-stories.md +17 -30
  562. package/.agents/workflows/audit-ux-ui.md +4 -7
  563. package/.agents/workflows/helpers/acceptance-self-eval.md +84 -157
  564. package/.agents/workflows/helpers/audit-lens-core.md +1 -1
  565. package/.agents/workflows/helpers/code-quality-guardrails.md +12 -15
  566. package/.agents/workflows/helpers/code-review.md +4 -2
  567. package/.agents/workflows/helpers/deliver-digest.md +37 -28
  568. package/.agents/workflows/helpers/deliver-light.md +92 -101
  569. package/.agents/workflows/helpers/deliver-reference.md +162 -220
  570. package/.agents/workflows/helpers/deliver-story-reference.md +197 -607
  571. package/.agents/workflows/helpers/deliver-story.md +17 -18
  572. package/.agents/workflows/helpers/plan-reference.md +125 -167
  573. package/.agents/workflows/helpers/qa-core.md +12 -0
  574. package/.agents/workflows/mandrel-deliver.md +47 -31
  575. package/.agents/workflows/mandrel-plan.md +22 -21
  576. package/.agents/workflows/mandrel-update.md +36 -21
  577. package/.agents/workflows/memory-consolidate.md +1 -1
  578. package/.agents/workflows/qa-assist.md +27 -71
  579. package/.agents/workflows/qa-explore.md +19 -59
  580. package/.agents/workflows/qa-run.md +11 -33
  581. package/README.md +1 -1
  582. package/bin/mandrel.js +5 -46
  583. package/bin/postinstall.js +18 -107
  584. package/docs/CHANGELOG.md +60 -0
  585. package/lib/cli/doctor.js +11 -71
  586. package/lib/cli/init.js +26 -165
  587. package/lib/cli/migrate.js +5 -64
  588. package/lib/cli/registry.js +84 -467
  589. package/lib/cli/sync-agents.js +4 -64
  590. package/lib/cli/sync-commands.js +11 -64
  591. package/lib/cli/sync.js +34 -213
  592. package/lib/cli/uninstall.js +40 -219
  593. package/lib/cli/update.js +326 -523
  594. package/lib/cli/version-check.js +8 -72
  595. package/lib/cli/version-helpers.js +14 -87
  596. package/lib/migrations/helpers/retire-agentrc-key.js +11 -52
  597. package/lib/migrations/index.js +17 -92
  598. package/lib/migrations/steps/2.1.0-retire-mi-drop-knobs.js +2 -15
  599. package/lib/migrations/steps/2.1.0-retire-verify-concurrency-cap.js +1 -13
  600. package/lib/migrations/steps/2.11.0-retire-max-seed-words.js +2 -15
  601. package/lib/migrations/steps/2.2.0-retire-epic-ac-tags.js +9 -38
  602. package/lib/migrations/steps/2.20.0-retire-codebase-snapshot.js +1 -13
  603. package/lib/migrations/steps/2.32.0-retire-lint-baseline-command.js +2 -27
  604. package/lib/migrations/steps/2.57.0-retire-delivery-limit-knobs.js +2 -23
  605. package/lib/migrations/steps/2.57.0-retire-planning-limit-knobs.js +2 -27
  606. package/lib/migrations/steps/2.60.0-retire-audit-results-autofile.js +21 -0
  607. package/lib/migrations/steps/strip-removed-agentrc-keys.js +333 -0
  608. package/package.json +17 -14
  609. package/.agents/docs/SDLC.md +0 -590
  610. package/.agents/docs/quality-gates.md +0 -1179
  611. package/.agents/rules/known-tooling-behavior.md +0 -150
  612. package/.agents/rules/orchestration-error-handling.md +0 -61
  613. package/.agents/rules/test-seams.md +0 -59
  614. package/.agents/schemas/baselines/lighthouse.schema.json +0 -59
  615. package/.agents/schemas/baselines/lint.schema.json +0 -47
  616. package/.agents/schemas/model-attribution.schema.json +0 -53
  617. package/.agents/scripts/check-action-pinning.js +0 -260
  618. package/.agents/scripts/check-audit-attribution.js +0 -302
  619. package/.agents/scripts/check-baseline-drift.js +0 -211
  620. package/.agents/scripts/check-baseline-scope.js +0 -362
  621. package/.agents/scripts/check-generated-validator.js +0 -202
  622. package/.agents/scripts/check-knip-entries.js +0 -159
  623. package/.agents/scripts/check-lifecycle-lint.js +0 -294
  624. package/.agents/scripts/check-pinned-override-notes.js +0 -102
  625. package/.agents/scripts/check-schema-references.js +0 -366
  626. package/.agents/scripts/check-test-portability.js +0 -512
  627. package/.agents/scripts/check-workflow-citations.js +0 -332
  628. package/.agents/scripts/check-workflow-cli-lint.js +0 -299
  629. package/.agents/scripts/check-workflow-timeouts.js +0 -291
  630. package/.agents/scripts/install-matrix-assert.js +0 -326
  631. package/.agents/scripts/lib/audit-advisories.js +0 -195
  632. package/.agents/scripts/lib/audit-attribution.js +0 -134
  633. package/.agents/scripts/lib/baselines/drift-detector.js +0 -351
  634. package/.agents/scripts/lib/baselines/kinds/lighthouse.js +0 -87
  635. package/.agents/scripts/lib/baselines/kinds/lint.js +0 -184
  636. package/.agents/scripts/lib/baselines/orphan-pruner.js +0 -233
  637. package/.agents/scripts/lib/baselines/scope-assert.js +0 -223
  638. package/.agents/scripts/lib/baselines/scope-inventory.js +0 -314
  639. package/.agents/scripts/lib/c8-cli-path.js +0 -21
  640. package/.agents/scripts/lib/config/gates/lighthouse.schema.js +0 -51
  641. package/.agents/scripts/lib/config/gates/lint.schema.js +0 -18
  642. package/.agents/scripts/lib/dynamic-workflow/architecture-report-contract.js +0 -70
  643. package/.agents/scripts/lib/dynamic-workflow/audit-orchestrator.js +0 -284
  644. package/.agents/scripts/lib/dynamic-workflow/clean-code-report-contract.js +0 -80
  645. package/.agents/scripts/lib/dynamic-workflow/degraded-coverage.js +0 -81
  646. package/.agents/scripts/lib/dynamic-workflow/documentation-report-contract.js +0 -87
  647. package/.agents/scripts/lib/dynamic-workflow/performance-report-contract.js +0 -74
  648. package/.agents/scripts/lib/dynamic-workflow/quality-report-contract.js +0 -90
  649. package/.agents/scripts/lib/dynamic-workflow/report-contract-core.js +0 -43
  650. package/.agents/scripts/lib/dynamic-workflow/security-report-contract.js +0 -83
  651. package/.agents/scripts/lib/fs-walk.js +0 -52
  652. package/.agents/scripts/lib/knip-config-resolver.js +0 -181
  653. package/.agents/scripts/lib/knip-entry-sync.js +0 -452
  654. package/.agents/scripts/lib/orchestration/model-attribution.js +0 -418
  655. package/.agents/scripts/lib/orchestration/story-plan-state.js +0 -33
  656. package/.agents/scripts/lib/orchestration/structured-comment-parser.js +0 -67
  657. package/.agents/scripts/lib/pinned-override-notes.js +0 -88
  658. package/.agents/scripts/lib/pinned-override-resolve.js +0 -212
  659. package/.agents/scripts/lib/test-isolate/cli-options.js +0 -93
  660. package/.agents/scripts/lib/test-isolate/env-snapshot-loader.js +0 -52
  661. package/.agents/scripts/lib/test-isolate/list-files.js +0 -90
  662. package/.agents/scripts/lib/test-isolate/parse-tap.js +0 -75
  663. package/.agents/scripts/lib/test-isolate/progress-log.js +0 -45
  664. package/.agents/scripts/lib/test-isolate/render-report.js +0 -97
  665. package/.agents/scripts/lib/test-isolate/run-isolate.js +0 -87
  666. package/.agents/scripts/lib/test-isolate/runner.js +0 -483
  667. package/.agents/scripts/lib/test-profile/parse-tap.js +0 -136
  668. package/.agents/scripts/lib/test-profile/render-report.js +0 -45
  669. package/.agents/scripts/lint-label-vocabulary.js +0 -214
  670. package/.agents/scripts/post-structured-comment.js +0 -127
  671. package/.agents/scripts/provision-git-hooks.js +0 -85
  672. package/.agents/scripts/prune-baseline-orphans.js +0 -181
  673. package/.agents/scripts/run-coverage.js +0 -197
  674. package/.agents/scripts/run-lint.js +0 -133
  675. package/.agents/scripts/run-test-profile.js +0 -129
  676. package/.agents/scripts/run-verify.js +0 -118
  677. package/.agents/scripts/test-isolate.js +0 -55
  678. package/.agents/scripts/update-dead-exports-baseline.js +0 -321
@@ -1,58 +1,22 @@
1
1
  /**
2
- * `delivery.quality` accessor (Epic #1720 Story #1737 — uniform gate shape).
3
- *
4
- * The quality block under `delivery.quality.*` is now organised as a
5
- * `gates.<tier>` object where every tier (lint, coverage, crap,
6
- * maintainability, mutation, lighthouse, bundle-size) shares the same
7
- * four-field base:
8
- *
9
- * - `enabled` — when `false`, the checker exits 0 with a skip line.
10
- * - `baselinePath` — repo-root-relative path to the gate's baseline file.
11
- * - `tolerance` — `{ kind: 'absolute' | 'percent', value: number }`.
12
- * - `floors` — workspace-keyed `{ "*": { ... } }` floor object.
13
- *
14
- * Story #1737 changes (vs the Story #1739 mechanical relocation):
15
- *
16
- * - `gateScoping` is the single source of truth for diff scope / ref.
17
- * The duplicate `defaultScope` / `diffRef` keys on crap and
18
- * maintainability are gone — resolvers carry the scope through from
19
- * the lifted block.
20
- * - Scalar `tolerance` values became `{ kind, value }` objects.
21
- * - `coveragePath` moved from `gates.crap` to `gates.coverage`. CRAP
22
- * reads from the coverage gate instead of carrying its own.
23
- * - Flat `qualityFloors.*` shape is gone — every gate carries its own
24
- * workspace-keyed `floors` object.
25
- *
26
- * The resolver returns a flattened bag with the legacy field names
27
- * (`crap.tolerance` as a number, `crap.targetDirs`, `maintainability.targetDirs`,
28
- * `crap.coveragePath`, etc.) so existing call sites stay untouched.
29
- * The translation from gate shape → legacy bag happens here, in one
30
- * place.
2
+ * `delivery.quality` resolver. Every `gates.<tier>` shares `enabled`,
3
+ * `baselinePath`, `tolerance` (`{ kind, value }`) and workspace-keyed
4
+ * `floors`; the resolver flattens them into the legacy bag callers read
5
+ * (scalar `tolerance`, `crap.coveragePath` cross-read from the coverage gate).
31
6
  */
32
7
 
33
8
  import { Logger } from '../Logger.js';
34
9
  import { resolveListValue } from './shared.js';
35
10
 
36
- const DEFAULT_GATE_SCOPING = Object.freeze({ scope: 'diff', diffRef: 'main' });
11
+ const GATE_SCOPING = Object.freeze({ scope: 'diff', diffRef: 'main' });
12
+
13
+ /** Commit-subject substring acknowledging a deliberate baseline refresh. */
14
+ const BASELINE_REFRESH_TAG = 'baseline-refresh:';
37
15
 
38
- /**
39
- * Default object-shape tolerance for each gate. Values match the historical
40
- * scalar defaults so a consumer that omits `tolerance` keeps the prior
41
- * gate behaviour.
42
- */
43
16
  const DEFAULT_CRAP_TOLERANCE = Object.freeze({ kind: 'absolute', value: 0.05 });
44
17
  const DEFAULT_MI_TOLERANCE = Object.freeze({ kind: 'absolute', value: 0.5 });
45
18
 
46
- /**
47
- * Default floors per gate. Workspace-keyed so a single-workspace consumer
48
- * reads `floors["*"]` and a monorepo consumer can override per-workspace.
49
- *
50
- * Story #2125: these defaults are now injected by `resolveQuality` into
51
- * the resolved `gates.<kind>.floors` block when the consumer omits the
52
- * `'*'` workspace key, so `.agentrc.json` can carry `floors: {}` (or
53
- * omit the gate entirely) and still get framework-default enforcement
54
- * from the unified `check-baselines.js` dispatcher.
55
- */
19
+ /** Injected when a declared gate omits a workspace key (usually `'*'`). */
56
20
  const DEFAULT_COVERAGE_FLOORS = Object.freeze({
57
21
  '*': Object.freeze({ lines: 90, branches: 85, functions: 90 }),
58
22
  });
@@ -60,35 +24,18 @@ const DEFAULT_CRAP_FLOORS = Object.freeze({
60
24
  '*': Object.freeze({ max: 30, p95: 20, methodsAbove20: 50 }),
61
25
  });
62
26
  /**
63
- * Story #2193 — maintainability rollups expose the `min` / `p50` / `p95`
64
- * axes (see `.agents/schemas/baselines/maintainability.schema.json`). The
65
- * default floor therefore targets `min`, not the row-axis `maintainability`
66
- * name. The pre-#2193 default keyed on `maintainability` silently no-oped
67
- * inside `check-baselines.js#compareToFloor` because the rollup never
68
- * exposed that axis.
27
+ * Keyed on the rollup's `min` axis; a `maintainability` key silently
28
+ * no-ops because the rollup never exposes it.
69
29
  */
70
30
  const DEFAULT_MI_FLOORS = Object.freeze({
71
31
  '*': Object.freeze({ min: 70 }),
72
32
  });
73
33
 
74
34
  /**
75
- * Story #4981 / #5065 / #5173 — the two independent full-suite economies.
76
- *
77
- * `skipWhenUnchanged` decides *whether* to capture: no changed file under
78
- * `crap.targetDirs` versus `baseRef` means no capture at all. It is on by
79
- * default because it is gate-semantics-neutral — the gates score exactly what
80
- * they scored before, since nothing they score moved.
81
- *
82
- * `baselineJoin` lets the CRAP join resolve a method in an untouched file
83
- * from its committed baseline row instead of requiring fresh coverage for it.
84
- * That *loosens* the gate, so it stays off by default. Bundling the two under
85
- * one `enabled` switch is precisely what forced the earlier default flip to
86
- * be reverted (Story #5173).
87
- *
88
- * Neither switch shortens the capture run — a capture that does happen is the
89
- * ordinary full `npm run test:coverage` (Story #5065). `baseRef: null` means
90
- * "use the caller's own ref resolution" (the gate's `--ref` flag / `main`)
91
- * rather than a second, possibly-conflicting default.
35
+ * `skipWhenUnchanged` (on: gate-neutral) skips capture when nothing under
36
+ * `crap.targetDirs` changed vs `baseRef`. `baselineJoin` (off: it loosens the
37
+ * gate) resolves untouched files from committed baseline rows. The two must
38
+ * stay independent. `baseRef: null` defers to the caller's ref resolution.
92
39
  */
93
40
  const DEFAULT_INCREMENTAL_COVERAGE = Object.freeze({
94
41
  skipWhenUnchanged: true,
@@ -96,7 +43,6 @@ const DEFAULT_INCREMENTAL_COVERAGE = Object.freeze({
96
43
  baseRef: null,
97
44
  });
98
45
 
99
- /** Framework defaults for the CRAP gate (post-1737 uniform shape). */
100
46
  export const CRAP_GATE_DEFAULTS = Object.freeze({
101
47
  enabled: true,
102
48
  baselinePath: 'baselines/crap.json',
@@ -105,77 +51,37 @@ export const CRAP_GATE_DEFAULTS = Object.freeze({
105
51
  targetDirs: Object.freeze(['src']),
106
52
  newMethodCeiling: 30,
107
53
  requireCoverage: true,
108
- friction: Object.freeze({ markerKey: 'crap-baseline-regression' }),
109
- refreshTag: 'baseline-refresh:',
110
- // Story #2165 — bounded timeout (ms) for `npm run crap:update` spawned by
111
- // the baseline-attribution refresh path. Defaults to 60 s; mirrors
112
- // `gates.coverage.timeoutMs` (Story #2142) for shape and SIGKILL → 124
113
- // semantics.
114
- refreshTimeoutMs: 60_000,
54
+ refreshTag: BASELINE_REFRESH_TAG,
115
55
  ignoreGlobs: Object.freeze([]),
116
- // Story #4775 — fail-closed floor on the per-method coverage JOIN. The
117
- // fraction of methods that must resolve a coverage entry, counted only over
118
- // files that HAVE one, before `update-crap-baseline.js` will persist. A
119
- // broken join is silent by construction (unresolved methods are simply
120
- // absent from the baseline), so the updater refuses rather than writing a
121
- // thin baseline and logging it as success. 0.75 sits far above a healthy
122
- // run (a repo with fresh coverage resolves ~98%) and far below the 4–6%
123
- // signature of a coordinate-system mismatch.
56
+ // Fail-closed floor on the coverage join (over files that have coverage):
57
+ // a broken join is silent, so the updater refuses to persist below it.
58
+ // Healthy runs resolve ~98%; a coordinate mismatch resolves 4–6%.
124
59
  minMethodResolutionRate: 0.75,
125
60
  incrementalCoverage: DEFAULT_INCREMENTAL_COVERAGE,
126
61
  });
127
62
 
128
- /** Framework defaults for the coverage gate. */
129
63
  export const COVERAGE_GATE_DEFAULTS = Object.freeze({
130
64
  enabled: true,
131
65
  baselinePath: 'baselines/coverage.json',
132
66
  tolerance: Object.freeze({ kind: 'absolute', value: 0 }),
133
67
  floors: DEFAULT_COVERAGE_FLOORS,
134
68
  coveragePath: 'coverage/coverage-final.json',
135
- // Story #2136 — 10 minute wall clock on `npm run test:coverage`. Trips
136
- // `runCapture` to return exit 124 (GNU `timeout` convention) so the
137
- // close-validation caller can branch on hang-vs-failure.
69
+ // On expiry `runCapture` exits 124 so callers can tell a hang from a failure.
138
70
  timeoutMs: 600_000,
139
71
  });
140
72
 
141
- /** Framework defaults for the maintainability gate. */
142
73
  export const MAINTAINABILITY_GATE_DEFAULTS = Object.freeze({
143
74
  enabled: true,
144
75
  baselinePath: 'baselines/maintainability.json',
145
76
  tolerance: DEFAULT_MI_TOLERANCE,
146
77
  floors: DEFAULT_MI_FLOORS,
147
78
  targetDirs: Object.freeze([]),
148
- // Story #4731 — the commit-subject substring that acknowledges a deliberate
149
- // maintainability baseline refresh in the compared range. Mirrors the CRAP
150
- // gate's `refreshTag`; the evaluate phase demotes head-vs-base regressions
151
- // (floors still enforced) when a range commit carrying this tag touches the
152
- // baseline file. Kept identical to the CRAP default so one refresh commit
153
- // can acknowledge both gates.
154
- refreshTag: 'baseline-refresh:',
155
- // Story #2165 — bounded timeout (ms) for `npm run maintainability:update`
156
- // spawned by the baseline-attribution refresh path. Defaults to 60 s.
157
- refreshTimeoutMs: 60_000,
79
+ // Same tag as CRAP so one refresh commit acknowledges both gates.
80
+ refreshTag: BASELINE_REFRESH_TAG,
158
81
  ignoreGlobs: Object.freeze([]),
159
- // Story #4775 — fail-closed floor on the per-method coverage JOIN. The
160
- // fraction of methods that must resolve a coverage entry, counted only over
161
- // files that HAVE one, before `update-crap-baseline.js` will persist. A
162
- // broken join is silent by construction (unresolved methods are simply
163
- // absent from the baseline), so the updater refuses rather than writing a
164
- // thin baseline and logging it as success. 0.75 sits far above a healthy
165
- // run (a repo with fresh coverage resolves ~98%) and far below the 4–6%
166
- // signature of a coordinate-system mismatch.
167
82
  minMethodResolutionRate: 0.75,
168
83
  });
169
84
 
170
- /**
171
- * Story #2165 — framework defaults for the close-time `npx biome format
172
- * --write` autofix spawn. The SIGKILL → exit 124 mapping mirrors
173
- * `gates.coverage.timeoutMs` (Story #2142).
174
- */
175
- const FORMAT_AUTOFIX_DEFAULTS = Object.freeze({
176
- timeoutMs: 60_000,
177
- });
178
-
179
85
  const CRAP_GATE_KEYS = new Set([
180
86
  'enabled',
181
87
  'baselinePath',
@@ -184,9 +90,6 @@ const CRAP_GATE_KEYS = new Set([
184
90
  'targetDirs',
185
91
  'newMethodCeiling',
186
92
  'requireCoverage',
187
- 'friction',
188
- 'refreshTag',
189
- 'refreshTimeoutMs',
190
93
  'ignoreGlobs',
191
94
  'minMethodResolutionRate',
192
95
  'incrementalCoverage',
@@ -198,7 +101,6 @@ const COVERAGE_GATE_KEYS = new Set([
198
101
  'tolerance',
199
102
  'floors',
200
103
  'coveragePath',
201
- 'timeoutMs',
202
104
  ]);
203
105
 
204
106
  const MI_GATE_KEYS = new Set([
@@ -207,18 +109,12 @@ const MI_GATE_KEYS = new Set([
207
109
  'tolerance',
208
110
  'floors',
209
111
  'targetDirs',
210
- 'refreshTag',
211
- 'refreshTimeoutMs',
212
112
  'ignoreGlobs',
213
113
  ]);
214
114
 
215
115
  /**
216
- * Pure helper: coerce the object-shape tolerance to its scalar `value`
217
- * for call sites that still expect a plain number. Returns the default
218
- * scalar when the tolerance object is malformed.
219
- *
220
116
  * @param {{ kind?: string, value?: number } | undefined} tolerance
221
- * @param {number} fallback scalar tolerance
117
+ * @param {number} fallback
222
118
  * @returns {number}
223
119
  */
224
120
  function toleranceScalar(tolerance, fallback) {
@@ -242,20 +138,7 @@ function warnUnknownKeys(userBlock, knownKeys, blockLabel) {
242
138
  }
243
139
 
244
140
  /**
245
- * Resolve the CRAP gate. Accepts both the new `gates.crap.*` shape and
246
- * the resolved `coverage` gate (for the `coveragePath` cross-read). The
247
- * lifted `gateScoping` carries the diff scope and ref.
248
- *
249
- * @param {object | undefined} userCrap raw `delivery.quality.gates.crap`
250
- * @param {{ scope: string, diffRef: string }} gateScoping resolved scoping
251
- * @param {{ coveragePath: string }} coverageGate resolved coverage gate
252
- * @returns {object} flattened legacy-bag view that existing callers read
253
- */
254
- /**
255
- * Clamp a user-supplied method-resolution floor into `[0, 1]`. A
256
- * non-numeric, non-finite, or out-of-range value falls back to the framework
257
- * default rather than silently disabling the guard (a floor of `NaN` would
258
- * compare false against every rate and never fire).
141
+ * Out-of-range or non-finite falls back: a `NaN` floor would never fire.
259
142
  *
260
143
  * @param {unknown} value
261
144
  * @param {number} fallback
@@ -268,26 +151,14 @@ function resolveResolutionRate(value, fallback) {
268
151
  }
269
152
 
270
153
  /**
271
- * Resolve `gates.crap.incrementalCoverage` (Story #4981, split by #5173).
272
- *
273
- * Precedence, lowest to highest: the framework defaults
274
- * (`skipWhenUnchanged: true`, `baselineJoin: false`), then the deprecated
275
- * `enabled` alias which sets **both** switches to its value, then either
276
- * explicit switch. A malformed or absent user block resolves to the defaults,
277
- * so a consumer that never sets the key inherits the saving without the
278
- * loosening.
279
- *
280
- * @param {{ skipWhenUnchanged?: boolean, baselineJoin?: boolean, enabled?: boolean, baseRef?: string } | undefined} user
154
+ * @param {{ skipWhenUnchanged?: boolean, baselineJoin?: boolean, baseRef?: string } | undefined} user
281
155
  * @param {{ skipWhenUnchanged: boolean, baselineJoin: boolean, baseRef: string | null }} defaults
282
156
  * @returns {{ skipWhenUnchanged: boolean, baselineJoin: boolean, baseRef: string | null }}
283
157
  */
284
158
  function resolveIncrementalCoverage(user, defaults) {
285
159
  if (user == null || typeof user !== 'object') return { ...defaults };
286
- const alias = typeof user.enabled === 'boolean' ? user.enabled : null;
287
- const pick = (explicit, fallback) => {
288
- if (typeof explicit === 'boolean') return explicit;
289
- return alias === null ? fallback : alias;
290
- };
160
+ const pick = (explicit, fallback) =>
161
+ typeof explicit === 'boolean' ? explicit : fallback;
291
162
  return {
292
163
  skipWhenUnchanged: pick(user.skipWhenUnchanged, defaults.skipWhenUnchanged),
293
164
  baselineJoin: pick(user.baselineJoin, defaults.baselineJoin),
@@ -298,17 +169,19 @@ function resolveIncrementalCoverage(user, defaults) {
298
169
  };
299
170
  }
300
171
 
301
- export function resolveMaintainabilityCrap(
302
- userCrap,
303
- gateScoping,
304
- coverageGate,
305
- ) {
172
+ /**
173
+ * @param {object | undefined} userCrap
174
+ * @param {{ coveragePath: string }} coverageGate
175
+ * @returns {object}
176
+ */
177
+ export function resolveMaintainabilityCrap(userCrap, coverageGate) {
306
178
  const defaults = CRAP_GATE_DEFAULTS;
307
- const scoping = {
308
- defaultScope: gateScoping?.scope ?? DEFAULT_GATE_SCOPING.scope,
309
- diffRef: gateScoping?.diffRef ?? DEFAULT_GATE_SCOPING.diffRef,
310
- };
311
179
  const coverage = coverageGate ?? COVERAGE_GATE_DEFAULTS;
180
+ const fixed = {
181
+ refreshTag: defaults.refreshTag,
182
+ defaultScope: GATE_SCOPING.scope,
183
+ diffRef: GATE_SCOPING.diffRef,
184
+ };
312
185
  if (userCrap == null || typeof userCrap !== 'object') {
313
186
  return {
314
187
  enabled: defaults.enabled,
@@ -321,13 +194,9 @@ export function resolveMaintainabilityCrap(
321
194
  ),
322
195
  requireCoverage: defaults.requireCoverage,
323
196
  minMethodResolutionRate: defaults.minMethodResolutionRate,
324
- friction: { ...defaults.friction },
325
- refreshTag: defaults.refreshTag,
326
- refreshTimeoutMs: defaults.refreshTimeoutMs,
327
197
  ignoreGlobs: [...defaults.ignoreGlobs],
328
198
  incrementalCoverage: { ...defaults.incrementalCoverage },
329
- defaultScope: scoping.defaultScope,
330
- diffRef: scoping.diffRef,
199
+ ...fixed,
331
200
  };
332
201
  }
333
202
 
@@ -347,12 +216,6 @@ export function resolveMaintainabilityCrap(
347
216
  userCrap.minMethodResolutionRate,
348
217
  defaults.minMethodResolutionRate,
349
218
  ),
350
- friction: { ...defaults.friction, ...(userCrap.friction ?? {}) },
351
- refreshTag: userCrap.refreshTag ?? defaults.refreshTag,
352
- refreshTimeoutMs: resolvePositiveIntegerMs(
353
- userCrap.refreshTimeoutMs,
354
- defaults.refreshTimeoutMs,
355
- ),
356
219
  ignoreGlobs: Array.isArray(userCrap.ignoreGlobs)
357
220
  ? userCrap.ignoreGlobs.slice()
358
221
  : [...defaults.ignoreGlobs],
@@ -360,48 +223,31 @@ export function resolveMaintainabilityCrap(
360
223
  userCrap.incrementalCoverage,
361
224
  defaults.incrementalCoverage,
362
225
  ),
363
- defaultScope: scoping.defaultScope,
364
- diffRef: scoping.diffRef,
226
+ ...fixed,
365
227
  };
366
228
  }
367
229
 
368
- /**
369
- * Resolve the maintainability gate. Returns the legacy-bag shape with
370
- * `targetDirs` + a scalar `tolerance` (when set) + scoping inherited
371
- * from `gateScoping`.
372
- */
373
- function resolveMaintainabilityQuality(userBlock, gateScoping) {
230
+ function resolveMaintainabilityQuality(userBlock) {
374
231
  const defaults = MAINTAINABILITY_GATE_DEFAULTS;
375
- const scoping = {
376
- defaultScope: gateScoping?.scope ?? DEFAULT_GATE_SCOPING.scope,
377
- diffRef: gateScoping?.diffRef ?? DEFAULT_GATE_SCOPING.diffRef,
232
+ const fixed = {
233
+ refreshTag: defaults.refreshTag,
234
+ defaultScope: GATE_SCOPING.scope,
235
+ diffRef: GATE_SCOPING.diffRef,
378
236
  };
379
237
  if (userBlock == null || typeof userBlock !== 'object') {
380
238
  return {
381
239
  targetDirs: [...defaults.targetDirs],
382
- refreshTag: defaults.refreshTag,
383
- refreshTimeoutMs: defaults.refreshTimeoutMs,
384
240
  ignoreGlobs: [...defaults.ignoreGlobs],
385
- defaultScope: scoping.defaultScope,
386
- diffRef: scoping.diffRef,
241
+ ...fixed,
387
242
  };
388
243
  }
389
244
  warnUnknownKeys(userBlock, MI_GATE_KEYS, 'quality.gates.maintainability');
390
245
  const out = {
391
246
  targetDirs: resolveListValue(defaults.targetDirs, userBlock.targetDirs),
392
- refreshTag:
393
- typeof userBlock.refreshTag === 'string' && userBlock.refreshTag.length
394
- ? userBlock.refreshTag
395
- : defaults.refreshTag,
396
- refreshTimeoutMs: resolvePositiveIntegerMs(
397
- userBlock.refreshTimeoutMs,
398
- defaults.refreshTimeoutMs,
399
- ),
400
247
  ignoreGlobs: Array.isArray(userBlock.ignoreGlobs)
401
248
  ? userBlock.ignoreGlobs.slice()
402
249
  : [...defaults.ignoreGlobs],
403
- defaultScope: scoping.defaultScope,
404
- diffRef: scoping.diffRef,
250
+ ...fixed,
405
251
  };
406
252
  if (userBlock.tolerance !== undefined) {
407
253
  out.tolerance = toleranceScalar(
@@ -412,46 +258,6 @@ function resolveMaintainabilityQuality(userBlock, gateScoping) {
412
258
  return out;
413
259
  }
414
260
 
415
- /**
416
- * Story #2165 — accept a user-supplied positive-integer ms budget, falling
417
- * back to `defaultMs` when the value is missing, non-integer, or non-positive.
418
- * Mirrors the inlined guard in `resolveCoverageGate`.
419
- *
420
- * @param {*} value
421
- * @param {number} defaultMs
422
- * @returns {number}
423
- */
424
- function resolvePositiveIntegerMs(value, defaultMs) {
425
- if (typeof value === 'number' && Number.isInteger(value) && value > 0) {
426
- return value;
427
- }
428
- return defaultMs;
429
- }
430
-
431
- /**
432
- * Story #2165 — resolve `delivery.quality.formatAutofix`. Owns the bounded
433
- * timeout for the close-time `npx biome format --write` spawn.
434
- *
435
- * @param {object | undefined} userBlock
436
- * @returns {{ timeoutMs: number }}
437
- */
438
- const FORMAT_AUTOFIX_KEYS = new Set(['timeoutMs']);
439
-
440
- function resolveFormatAutofix(userBlock) {
441
- const defaults = FORMAT_AUTOFIX_DEFAULTS;
442
- if (userBlock == null || typeof userBlock !== 'object') {
443
- return { timeoutMs: defaults.timeoutMs };
444
- }
445
- warnUnknownKeys(userBlock, FORMAT_AUTOFIX_KEYS, 'quality.formatAutofix');
446
- return {
447
- timeoutMs: resolvePositiveIntegerMs(
448
- userBlock.timeoutMs,
449
- defaults.timeoutMs,
450
- ),
451
- };
452
- }
453
-
454
- /** Resolve the coverage gate. Owns `coveragePath` and `timeoutMs`. */
455
261
  function resolveCoverageGate(userBlock) {
456
262
  const defaults = COVERAGE_GATE_DEFAULTS;
457
263
  if (userBlock == null || typeof userBlock !== 'object') {
@@ -472,109 +278,39 @@ function resolveCoverageGate(userBlock) {
472
278
  userBlock.tolerance,
473
279
  toleranceScalar(defaults.tolerance, 0),
474
280
  ),
475
- timeoutMs:
476
- typeof userBlock.timeoutMs === 'number' &&
477
- Number.isInteger(userBlock.timeoutMs) &&
478
- userBlock.timeoutMs > 0
479
- ? userBlock.timeoutMs
480
- : defaults.timeoutMs,
281
+ timeoutMs: defaults.timeoutMs,
481
282
  };
482
283
  }
483
284
 
484
285
  /**
485
- * Framework defaults for `delivery.quality.codingGuardrails`.
486
- *
487
- * `miDropMustRefactor` was retired in Story #4531: schema-validated,
488
- * defaulted, and resolved, but never consumed — the gate it named
489
- * (`quality-preview.js`'s `computeExitCode`) short-circuits on `miExit`
490
- * (derived from the already-consumed `gates.maintainability.tolerance`)
491
- * before this value is ever read. `maintainability.tolerance` is the one
492
- * documented MI-drop control now; see `lib/migrations/index.js` for the
493
- * consumer-config migration that strips a leftover key on upgrade.
494
- *
495
- * `cyclomaticMustFix` was retired in Story #5313: the cyclomatic ratchet
496
- * (`check-cyclomatic.js`) keeps a fixed ceiling of 12
497
- * (`lib/cyclomatic-ceiling.js#CYCLOMATIC_CEILING`), and `cyclomaticFlag` is
498
- * the one advisory knob left — `quality-preview.js` reports over-flag
499
- * methods without failing on them.
286
+ * `cyclomaticFlag` is advisory only (`quality-preview.js`); the ratchet
287
+ * ceiling lives in `lib/cyclomatic-ceiling.js`.
500
288
  */
501
- export const CODING_GUARDRAILS_DEFAULTS = Object.freeze({
289
+ export const CODING_GUARDRAILS = Object.freeze({
502
290
  cyclomaticFlag: 8,
503
291
  requireSiblingTest: false,
504
292
  });
505
293
 
506
- const CODING_GUARDRAILS_KEYS = new Set(Object.keys(CODING_GUARDRAILS_DEFAULTS));
507
-
508
- export function resolveCodingGuardrails(userBlock) {
509
- const defaults = CODING_GUARDRAILS_DEFAULTS;
510
- if (userBlock == null || typeof userBlock !== 'object') {
511
- return { ...defaults };
512
- }
513
- warnUnknownKeys(
514
- userBlock,
515
- CODING_GUARDRAILS_KEYS,
516
- 'quality.codingGuardrails',
517
- );
518
- return {
519
- cyclomaticFlag: userBlock.cyclomaticFlag ?? defaults.cyclomaticFlag,
520
- requireSiblingTest:
521
- typeof userBlock.requireSiblingTest === 'boolean'
522
- ? userBlock.requireSiblingTest
523
- : defaults.requireSiblingTest,
524
- };
525
- }
526
-
527
- // autoRefresh.miDropCap was retired alongside codingGuardrails.
528
- // miDropMustRefactor in Story #4531 — same unconsumed-knob shape, same fix.
294
+ /** Only `enabled` is an operator switch. */
529
295
  const AUTO_REFRESH_DEFAULTS = Object.freeze({
530
296
  enabled: true,
531
297
  crapJumpCap: 5,
532
298
  scope: 'diff',
533
299
  });
534
300
 
535
- const AUTO_REFRESH_KEYS = new Set(Object.keys(AUTO_REFRESH_DEFAULTS));
536
-
537
301
  function resolveAutoRefresh(userBlock) {
538
- const defaults = AUTO_REFRESH_DEFAULTS;
539
- if (userBlock == null || typeof userBlock !== 'object') {
540
- return {
541
- enabled: defaults.enabled,
542
- crapJumpCap: defaults.crapJumpCap,
543
- scope: defaults.scope,
544
- };
545
- }
546
-
547
- warnUnknownKeys(userBlock, AUTO_REFRESH_KEYS, 'quality.autoRefresh');
548
-
549
302
  return {
303
+ ...AUTO_REFRESH_DEFAULTS,
550
304
  enabled:
551
- typeof userBlock.enabled === 'boolean'
305
+ typeof userBlock?.enabled === 'boolean'
552
306
  ? userBlock.enabled
553
- : defaults.enabled,
554
- crapJumpCap:
555
- typeof userBlock.crapJumpCap === 'number' &&
556
- Number.isFinite(userBlock.crapJumpCap) &&
557
- userBlock.crapJumpCap >= 0
558
- ? userBlock.crapJumpCap
559
- : defaults.crapJumpCap,
560
- scope:
561
- userBlock.scope === 'diff' || userBlock.scope === 'full'
562
- ? userBlock.scope
563
- : defaults.scope,
307
+ : AUTO_REFRESH_DEFAULTS.enabled,
564
308
  };
565
309
  }
566
310
 
567
- /**
568
- * Resolve the merged baselines block. Baselines now live alongside their
569
- * gates (`gates.<tier>.baselinePath`); this helper preserves the
570
- * historical flat `baselines.{lint, crap, maintainability}` shape so
571
- * existing readers (`getBaselines(config)` in `config-resolver.js`)
572
- * stay untouched. Each entry is synthesised from the resolved gate's
573
- * `baselinePath`.
574
- */
311
+ /** Flat `baselines.{crap, maintainability}` view over each gate's `baselinePath`. */
575
312
  function resolveBaselinesFromGates(gates) {
576
313
  return {
577
- lint: { path: gates?.lint?.baselinePath ?? 'baselines/lint.json' },
578
314
  crap: {
579
315
  path: gates?.crap?.baselinePath ?? CRAP_GATE_DEFAULTS.baselinePath,
580
316
  },
@@ -587,26 +323,12 @@ function resolveBaselinesFromGates(gates) {
587
323
  }
588
324
 
589
325
  /**
590
- * Merge the entire `delivery.quality` block with framework defaults.
591
- *
592
- * Returns the historical flattened bag (so the existing call sites that
593
- * read `q.crap.coveragePath`, `q.maintainability.targetDirs`, etc. keep
594
- * working) plus the new `gates` resolved object and `gateScoping`.
595
- *
596
- * @param {object|undefined} userQuality
597
- */
598
- /**
599
- * Story #2125: merge a consumer-supplied `floors` bag with the framework
600
- * default for that gate. Defaults supply any workspace key the consumer
601
- * didn't provide — most commonly the catch-all `'*'`. Consumer entries
602
- * always win over defaults at the workspace-key level.
326
+ * Consumer entries win per workspace key. Returns a fresh object so callers
327
+ * cannot mutate the frozen defaults.
603
328
  *
604
- * Returns a fresh plain object so downstream mutations can't poison the
605
- * frozen module-level defaults.
606
- *
607
- * @param {object | undefined | null} userFloors raw `gates.<kind>.floors`
608
- * @param {object} defaults frozen framework default (e.g. `DEFAULT_COVERAGE_FLOORS`)
609
- * @returns {object} merged workspace-keyed floors
329
+ * @param {object | undefined | null} userFloors
330
+ * @param {object} defaults
331
+ * @returns {object}
610
332
  */
611
333
  function mergeFloorsWithDefaults(userFloors, defaults) {
612
334
  const defaultsCopy = {};
@@ -631,21 +353,8 @@ const FLOOR_DEFAULTS_BY_KIND = Object.freeze({
631
353
  });
632
354
 
633
355
  /**
634
- * Build the resolved `gates` object that `resolveQuality` returns. For
635
- * each kind the consumer declared that has a framework-default floor
636
- * (coverage, crap, maintainability), the resolved block carries `floors`
637
- * merged with the kind's default — so `check-baselines.js` sees the
638
- * framework default at runtime even when `.agentrc.json` omits the
639
- * `floors` key.
640
- *
641
- * Kinds the consumer did NOT declare are passed through untouched —
642
- * `check-baselines.js` skips kinds whose gate block is absent, and this
643
- * function preserves that contract (synthesising a default block here
644
- * would silently enable gates the consumer never asked for).
645
- *
646
- * Other keys on a declared gate block (e.g. `enabled`, `targetDirs`,
647
- * `baselinePath`) are preserved as the consumer supplied them; this
648
- * function only injects the floors layer.
356
+ * Injects default floors into declared gates only; synthesising a block for
357
+ * an undeclared kind would silently enable a gate the consumer never asked for.
649
358
  */
650
359
  function resolveGatesWithFloors(gates) {
651
360
  const out = { ...gates };
@@ -661,118 +370,53 @@ function resolveGatesWithFloors(gates) {
661
370
  return out;
662
371
  }
663
372
 
373
+ /**
374
+ * @param {object|undefined} userQuality
375
+ */
664
376
  export function resolveQuality(userQuality) {
665
377
  const block =
666
378
  userQuality && typeof userQuality === 'object' ? userQuality : {};
667
379
  const gates =
668
380
  block.gates && typeof block.gates === 'object' ? block.gates : {};
669
- const gateScoping = {
670
- scope: block.gateScoping?.scope ?? DEFAULT_GATE_SCOPING.scope,
671
- diffRef: block.gateScoping?.diffRef ?? DEFAULT_GATE_SCOPING.diffRef,
672
- };
673
381
  const coverage = resolveCoverageGate(gates.coverage);
674
382
  const resolvedGates = resolveGatesWithFloors(gates);
675
383
  return {
676
- maintainability: resolveMaintainabilityQuality(
677
- gates.maintainability,
678
- gateScoping,
679
- ),
680
- crap: resolveMaintainabilityCrap(gates.crap, gateScoping, coverage),
384
+ maintainability: resolveMaintainabilityQuality(gates.maintainability),
385
+ crap: resolveMaintainabilityCrap(gates.crap, coverage),
681
386
  coverage,
682
387
  baselines: resolveBaselinesFromGates(gates),
683
- codingGuardrails: resolveCodingGuardrails(block.codingGuardrails),
388
+ codingGuardrails: { ...CODING_GUARDRAILS },
684
389
  autoRefresh: resolveAutoRefresh(block.autoRefresh),
685
- baselineEpsilon: resolveBaselineEpsilon(block.baselineEpsilon),
686
- // Story #2165 — `delivery.quality.formatAutofix.timeoutMs` for the
687
- // close-time `npx biome format --write` spawn.
688
- formatAutofix: resolveFormatAutofix(block.formatAutofix),
689
- gateScoping,
390
+ baselineEpsilon: { ...BASELINE_EPSILON },
690
391
  gates: resolvedGates,
691
392
  };
692
393
  }
693
394
 
694
395
  /**
695
- * Framework defaults for `delivery.quality.baselineEpsilon` (Story #1964 —
696
- * s-stability-epsilon). The writer folds sub-epsilon row deltas back to
697
- * the prior bytes so env variance never rewrites the on-disk baseline.
698
- *
699
- * Defaults match the AC: MI 0.5, CRAP 0.5, coverage 0.1, mutation 0.5,
700
- * lint 0 (counts are integer), lighthouse 1, bundle-size 1024 (bytes),
701
- * duplication 0.5 (percentage points, Story #3664).
396
+ * The writer folds sub-epsilon row deltas back to the prior bytes so env
397
+ * variance never rewrites a baseline. bundle-size is bytes.
702
398
  */
703
- export const BASELINE_EPSILON_DEFAULTS = Object.freeze({
399
+ const BASELINE_EPSILON = Object.freeze({
704
400
  maintainability: 0.5,
705
401
  crap: 0.5,
706
402
  coverage: 0.1,
707
403
  mutation: 0.5,
708
- lint: 0,
709
- lighthouse: 1,
710
404
  'bundle-size': 1024,
711
405
  duplication: 0.5,
712
406
  });
713
407
 
714
- const BASELINE_EPSILON_KINDS = new Set(Object.keys(BASELINE_EPSILON_DEFAULTS));
715
-
716
408
  /**
717
- * Resolve the merged `delivery.quality.baselineEpsilon` block. Returns a
718
- * frozen per-kind map keyed by the same kind names used by the per-kind
719
- * modules. Unknown keys raise a warning. Negative or non-numeric overrides
720
- * throw an `EXIT_CONFIG`-style error so a misconfigured project halts at
721
- * startup rather than silently dropping the override.
722
- *
723
- * @param {object | undefined} userBlock
724
- * @returns {{ [kind: string]: number }}
725
- */
726
- function assertEpsilonValue(kind, v) {
727
- if (typeof v !== 'number' || !Number.isFinite(v) || v < 0) {
728
- const err = new Error(
729
- `[config] quality.baselineEpsilon.${kind} must be a non-negative finite number (got ${JSON.stringify(v)})`,
730
- );
731
- err.code = 'EXIT_CONFIG';
732
- err.exitCode = 3;
733
- throw err;
734
- }
735
- }
736
-
737
- export function resolveBaselineEpsilon(userBlock) {
738
- if (userBlock == null || typeof userBlock !== 'object') {
739
- return { ...BASELINE_EPSILON_DEFAULTS };
740
- }
741
- warnUnknownKeys(userBlock, BASELINE_EPSILON_KINDS, 'quality.baselineEpsilon');
742
- const out = { ...BASELINE_EPSILON_DEFAULTS };
743
- for (const kind of BASELINE_EPSILON_KINDS) {
744
- if (!Object.hasOwn(userBlock, kind)) continue;
745
- assertEpsilonValue(kind, userBlock[kind]);
746
- out[kind] = userBlock[kind];
747
- }
748
- return out;
749
- }
750
-
751
- /**
752
- * Convenience accessor: resolve a single kind's epsilon from a config
753
- * (project override or framework default). Returns the framework default
754
- * when the user block is absent or omits the kind. Throws when the kind
755
- * is unknown.
756
- *
757
409
  * @param {string} kind
758
- * @param {object | null | undefined} config full resolved config OR
759
- * a `{ delivery: { quality: ... } }` / `{ quality: ... }` shape.
760
410
  * @returns {number}
761
411
  */
762
- export function getBaselineEpsilon(kind, config) {
763
- if (!BASELINE_EPSILON_KINDS.has(kind)) {
412
+ export function getBaselineEpsilon(kind) {
413
+ if (!Object.hasOwn(BASELINE_EPSILON, kind)) {
764
414
  throw new Error(`[config] getBaselineEpsilon: unknown kind '${kind}'`);
765
415
  }
766
- const userBlock = config?.delivery?.quality?.baselineEpsilon;
767
- const resolved = resolveBaselineEpsilon(userBlock);
768
- return resolved[kind];
416
+ return BASELINE_EPSILON[kind];
769
417
  }
770
418
 
771
419
  /**
772
- * Read the merged `delivery.quality` block. Accepts the full resolved
773
- * config — the canonical `delivery.quality` path is the single supported
774
- * shape.
775
- *
776
420
  * @param {object | null | undefined} config
777
421
  * @returns {ReturnType<typeof resolveQuality>}
778
422
  */