mandrel 2.60.0 → 2.62.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (662) hide show
  1. package/.agents/README.md +10 -10
  2. package/.agents/agents/story-worker.md +1 -1
  3. package/.agents/docs/agentrc-reference.json +4 -82
  4. package/.agents/docs/configuration.md +20 -87
  5. package/.agents/docs/workflows.md +1 -1
  6. package/.agents/instructions.md +1 -3
  7. package/.agents/rules/gherkin-standards.md +4 -0
  8. package/.agents/schemas/agentrc.schema.json +11 -486
  9. package/.agents/schemas/story-deliver-terminal.schema.json +10 -0
  10. package/.agents/schemas/validation-evidence.schema.json +2 -1
  11. package/.agents/scripts/README.md +14 -14
  12. package/.agents/scripts/acceptance-eval.js +32 -164
  13. package/.agents/scripts/agents-bootstrap-github.js +27 -129
  14. package/.agents/scripts/apply-quality-bootstrap.js +4 -40
  15. package/.agents/scripts/audit-baselines.js +6 -27
  16. package/.agents/scripts/audit-labels-bootstrap.js +5 -29
  17. package/.agents/scripts/audit-to-stories.js +91 -361
  18. package/.agents/scripts/boot-sweep.js +19 -72
  19. package/.agents/scripts/bootstrap.js +74 -395
  20. package/.agents/scripts/ceremony-derive.js +9 -45
  21. package/.agents/scripts/check-arch-cycles.js +14 -64
  22. package/.agents/scripts/check-baselines.js +8 -48
  23. package/.agents/scripts/check-context-budget.js +46 -172
  24. package/.agents/scripts/check-cyclomatic.js +12 -44
  25. package/.agents/scripts/check-dead-exports.js +13 -64
  26. package/.agents/scripts/check-doc-links.js +38 -186
  27. package/.agents/scripts/check-gherkin-corpus.js +24 -127
  28. package/.agents/scripts/check-test-temp-hygiene.js +28 -169
  29. package/.agents/scripts/coverage-capture.js +32 -99
  30. package/.agents/scripts/deliver-light.js +14 -101
  31. package/.agents/scripts/deliver-recover.js +6 -42
  32. package/.agents/scripts/deliver-run.js +36 -133
  33. package/.agents/scripts/diagnose-friction.js +24 -116
  34. package/.agents/scripts/drain-pending-cleanup.js +1 -1
  35. package/.agents/scripts/evidence-gate.js +23 -85
  36. package/.agents/scripts/file-ci-gap.js +10 -50
  37. package/.agents/scripts/generate-config-docs.js +30 -170
  38. package/.agents/scripts/generate-lens-checklists.js +8 -52
  39. package/.agents/scripts/generate-skills-index.js +14 -112
  40. package/.agents/scripts/generate-workflows-doc.js +10 -70
  41. package/.agents/scripts/git-cleanup.js +2 -34
  42. package/.agents/scripts/lib/Graph.js +24 -81
  43. package/.agents/scripts/lib/ITicketingProvider.js +47 -143
  44. package/.agents/scripts/lib/Logger.js +14 -76
  45. package/.agents/scripts/lib/audit-baselines/engine.js +11 -31
  46. package/.agents/scripts/lib/audit-baselines/gate-surface.js +3 -17
  47. package/.agents/scripts/lib/audit-baselines/headroom.js +4 -20
  48. package/.agents/scripts/lib/audit-baselines/hotspots.js +3 -15
  49. package/.agents/scripts/lib/audit-baselines/kinds.js +23 -89
  50. package/.agents/scripts/lib/audit-baselines/outliers.js +6 -23
  51. package/.agents/scripts/lib/audit-baselines/read.js +3 -16
  52. package/.agents/scripts/lib/audit-baselines/staleness.js +7 -26
  53. package/.agents/scripts/lib/audit-baselines/surface-entry.js +7 -28
  54. package/.agents/scripts/lib/audit-baselines/trend.js +7 -20
  55. package/.agents/scripts/lib/audit-baselines/weights.js +9 -37
  56. package/.agents/scripts/lib/audit-suite/audit-rules-reader.js +3 -18
  57. package/.agents/scripts/lib/audit-suite/checklist-threading.js +26 -124
  58. package/.agents/scripts/lib/audit-suite/dispatch-checklist.js +14 -45
  59. package/.agents/scripts/lib/audit-suite/findings.js +12 -52
  60. package/.agents/scripts/lib/audit-suite/frontmatter.js +5 -29
  61. package/.agents/scripts/lib/audit-suite/index.js +1 -15
  62. package/.agents/scripts/lib/audit-suite/lens-checklist.js +10 -45
  63. package/.agents/scripts/lib/audit-suite/lens-diff-floor.js +11 -76
  64. package/.agents/scripts/lib/audit-suite/runner.js +13 -43
  65. package/.agents/scripts/lib/audit-suite/selector.js +49 -349
  66. package/.agents/scripts/lib/audit-suite/substitutions.js +12 -40
  67. package/.agents/scripts/lib/audit-suite/workflow-loader.js +3 -15
  68. package/.agents/scripts/lib/audit-to-stories/audit-label-taxonomy.js +11 -73
  69. package/.agents/scripts/lib/audit-to-stories/audit-lenses.js +8 -37
  70. package/.agents/scripts/lib/audit-to-stories/build-story-body.js +25 -143
  71. package/.agents/scripts/lib/audit-to-stories/dedupe-against-github.js +14 -80
  72. package/.agents/scripts/lib/audit-to-stories/epic-grouping-directive.js +4 -18
  73. package/.agents/scripts/lib/audit-to-stories/finding-adapter.js +7 -40
  74. package/.agents/scripts/lib/audit-to-stories/group-findings.js +9 -39
  75. package/.agents/scripts/lib/audit-to-stories/issue-corpus.js +10 -66
  76. package/.agents/scripts/lib/audit-to-stories/issue-index.js +6 -30
  77. package/.agents/scripts/lib/audit-to-stories/issues-file.js +6 -36
  78. package/.agents/scripts/lib/audit-to-stories/ledger-commit.js +17 -69
  79. package/.agents/scripts/lib/audit-to-stories/ledger-pr.js +17 -85
  80. package/.agents/scripts/lib/audit-to-stories/ledger-record.js +10 -48
  81. package/.agents/scripts/lib/audit-to-stories/parse-audit-md.js +38 -146
  82. package/.agents/scripts/lib/audit-to-stories/seed-from-findings.js +7 -42
  83. package/.agents/scripts/lib/audit-to-stories/wire-dependencies.js +10 -57
  84. package/.agents/scripts/lib/baseline-loader.js +12 -51
  85. package/.agents/scripts/lib/baseline-schema-registry.js +5 -22
  86. package/.agents/scripts/lib/baselines/component-matcher.js +3 -12
  87. package/.agents/scripts/lib/baselines/components.js +10 -61
  88. package/.agents/scripts/lib/baselines/coverage-updater-cli.js +7 -36
  89. package/.agents/scripts/lib/baselines/crap-preview-incremental.js +5 -21
  90. package/.agents/scripts/lib/baselines/crap-preview-scan.js +19 -45
  91. package/.agents/scripts/lib/baselines/crap-updater-cli.js +16 -65
  92. package/.agents/scripts/lib/baselines/diff-scope-cli.js +5 -33
  93. package/.agents/scripts/lib/baselines/duplication-scanner.js +11 -60
  94. package/.agents/scripts/lib/baselines/env-overrides.js +12 -67
  95. package/.agents/scripts/lib/baselines/envelope.js +13 -129
  96. package/.agents/scripts/lib/baselines/exit-codes.js +6 -49
  97. package/.agents/scripts/lib/baselines/git-base.js +23 -142
  98. package/.agents/scripts/lib/baselines/kernel.js +11 -111
  99. package/.agents/scripts/lib/baselines/kinds/_crap-new-method-gate.js +9 -47
  100. package/.agents/scripts/lib/baselines/kinds/_crap-read.js +8 -51
  101. package/.agents/scripts/lib/baselines/kinds/_shared-metric.js +7 -62
  102. package/.agents/scripts/lib/baselines/kinds/bundle-size.js +8 -29
  103. package/.agents/scripts/lib/baselines/kinds/coverage.js +3 -15
  104. package/.agents/scripts/lib/baselines/kinds/crap.js +94 -415
  105. package/.agents/scripts/lib/baselines/kinds/duplication.js +4 -30
  106. package/.agents/scripts/lib/baselines/kinds/kind-factory.js +7 -53
  107. package/.agents/scripts/lib/baselines/kinds/maintainability.js +15 -80
  108. package/.agents/scripts/lib/baselines/kinds/mutation.js +12 -72
  109. package/.agents/scripts/lib/baselines/maintainability-baseline-io.js +4 -11
  110. package/.agents/scripts/lib/baselines/merge-envelopes.js +30 -146
  111. package/.agents/scripts/lib/baselines/path-canon.js +19 -128
  112. package/.agents/scripts/lib/baselines/preview-gates.js +8 -37
  113. package/.agents/scripts/lib/baselines/reader.js +14 -107
  114. package/.agents/scripts/lib/baselines/refresh-service.js +35 -252
  115. package/.agents/scripts/lib/baselines/scope.js +11 -135
  116. package/.agents/scripts/lib/baselines/writer.js +16 -149
  117. package/.agents/scripts/lib/bdd-runner-detect.js +18 -113
  118. package/.agents/scripts/lib/bdd-scenario-budget.js +9 -36
  119. package/.agents/scripts/lib/bdd-scenario-scanner.js +11 -73
  120. package/.agents/scripts/lib/bdd-step-index.js +26 -100
  121. package/.agents/scripts/lib/bootstrap/baseline-merge-driver.js +23 -103
  122. package/.agents/scripts/lib/bootstrap/branch-protection.js +2 -5
  123. package/.agents/scripts/lib/bootstrap/commit-push.js +12 -50
  124. package/.agents/scripts/lib/bootstrap/gh-preflight.js +14 -101
  125. package/.agents/scripts/lib/bootstrap/hitl-confirm.js +5 -30
  126. package/.agents/scripts/lib/bootstrap/install-ledger.js +17 -73
  127. package/.agents/scripts/lib/bootstrap/issue-forms-template.js +17 -121
  128. package/.agents/scripts/lib/bootstrap/manifest.js +15 -86
  129. package/.agents/scripts/lib/bootstrap/merge-methods.js +4 -33
  130. package/.agents/scripts/lib/bootstrap/preflight.js +12 -61
  131. package/.agents/scripts/lib/bootstrap/project-bootstrap.js +34 -235
  132. package/.agents/scripts/lib/bootstrap/prompt.js +21 -129
  133. package/.agents/scripts/lib/bootstrap/quality-bootstrap.js +27 -141
  134. package/.agents/scripts/lib/bootstrap/summary.js +1 -8
  135. package/.agents/scripts/lib/bootstrap/workflow-audit.js +11 -84
  136. package/.agents/scripts/lib/branch-name-guard.js +4 -23
  137. package/.agents/scripts/lib/changed-files.js +31 -143
  138. package/.agents/scripts/lib/checks/core-bare-clean.js +4 -24
  139. package/.agents/scripts/lib/checks/index.js +18 -101
  140. package/.agents/scripts/lib/checks/loop-health.js +11 -53
  141. package/.agents/scripts/lib/checks/state.js +16 -91
  142. package/.agents/scripts/lib/checks/story-init-not-backgrounded.js +10 -61
  143. package/.agents/scripts/lib/checks/subagent-agent-tool-required.js +14 -83
  144. package/.agents/scripts/lib/child-exec.js +39 -108
  145. package/.agents/scripts/lib/cli/standard-args.js +9 -116
  146. package/.agents/scripts/lib/cli-args.js +31 -146
  147. package/.agents/scripts/lib/cli-usage.js +5 -27
  148. package/.agents/scripts/lib/cli-utils.js +2 -12
  149. package/.agents/scripts/lib/close-validation/commands.js +13 -76
  150. package/.agents/scripts/lib/close-validation/gates.js +92 -331
  151. package/.agents/scripts/lib/close-validation/process.js +121 -151
  152. package/.agents/scripts/lib/close-validation/projections/advisories.js +5 -31
  153. package/.agents/scripts/lib/close-validation/projections/crap.js +19 -67
  154. package/.agents/scripts/lib/close-validation/projections/head-sha.js +1 -17
  155. package/.agents/scripts/lib/close-validation/projections/inputs.js +4 -34
  156. package/.agents/scripts/lib/close-validation/projections/maintainability.js +11 -58
  157. package/.agents/scripts/lib/close-validation/runner.js +53 -110
  158. package/.agents/scripts/lib/command-header.js +6 -28
  159. package/.agents/scripts/lib/config/acceptance-eval.js +4 -30
  160. package/.agents/scripts/lib/config/baselines.js +3 -14
  161. package/.agents/scripts/lib/config/ci.js +8 -38
  162. package/.agents/scripts/lib/config/commands.js +1 -15
  163. package/.agents/scripts/lib/config/defaults.js +4 -33
  164. package/.agents/scripts/lib/config/delivery-routing.js +6 -35
  165. package/.agents/scripts/lib/config/explain.js +9 -80
  166. package/.agents/scripts/lib/config/gates/coverage.schema.js +0 -12
  167. package/.agents/scripts/lib/config/gates/crap-incremental-coverage.schema.js +2 -30
  168. package/.agents/scripts/lib/config/gates/crap.schema.js +1 -34
  169. package/.agents/scripts/lib/config/gates/duplication.schema.js +1 -8
  170. package/.agents/scripts/lib/config/gates/index.js +2 -17
  171. package/.agents/scripts/lib/config/gates/maintainability.schema.js +1 -20
  172. package/.agents/scripts/lib/config/gates/mutation.schema.js +1 -7
  173. package/.agents/scripts/lib/config/gates/shared.js +4 -64
  174. package/.agents/scripts/lib/config/github.js +4 -22
  175. package/.agents/scripts/lib/config/limits.js +4 -57
  176. package/.agents/scripts/lib/config/paths.js +2 -21
  177. package/.agents/scripts/lib/config/qa.js +4 -38
  178. package/.agents/scripts/lib/config/quality.js +76 -432
  179. package/.agents/scripts/lib/config/runners.js +12 -56
  180. package/.agents/scripts/lib/config/runtime.js +13 -57
  181. package/.agents/scripts/lib/config/shared.js +2 -16
  182. package/.agents/scripts/lib/config/sync-agentrc.js +9 -50
  183. package/.agents/scripts/lib/config/temp-paths.js +40 -280
  184. package/.agents/scripts/lib/config/validate-orchestration.js +5 -17
  185. package/.agents/scripts/lib/config/worktree-isolation.js +9 -28
  186. package/.agents/scripts/lib/config-resolver.js +10 -52
  187. package/.agents/scripts/lib/config-schema-shared.js +1 -4
  188. package/.agents/scripts/lib/config-settings-schema-delivery.js +12 -294
  189. package/.agents/scripts/lib/config-settings-schema-quality.js +7 -219
  190. package/.agents/scripts/lib/config-settings-schema.js +37 -274
  191. package/.agents/scripts/lib/coverage-baseline.js +20 -110
  192. package/.agents/scripts/lib/coverage-capture-fullscope.js +12 -37
  193. package/.agents/scripts/lib/coverage-capture-incremental.js +12 -43
  194. package/.agents/scripts/lib/coverage-capture-usage.js +4 -24
  195. package/.agents/scripts/lib/coverage-capture.js +99 -224
  196. package/.agents/scripts/lib/coverage-utils.js +14 -79
  197. package/.agents/scripts/lib/cpu-pool.js +17 -123
  198. package/.agents/scripts/lib/crap-baseline-join.js +16 -88
  199. package/.agents/scripts/lib/crap-coordinates.js +6 -25
  200. package/.agents/scripts/lib/crap-engine.js +40 -153
  201. package/.agents/scripts/lib/crap-method-identity.js +16 -78
  202. package/.agents/scripts/lib/crap-utils.js +31 -155
  203. package/.agents/scripts/lib/cyclomatic-ceiling.js +14 -87
  204. package/.agents/scripts/lib/cyclomatic-scope.js +10 -50
  205. package/.agents/scripts/lib/dead-exports-knip.js +18 -56
  206. package/.agents/scripts/lib/dead-exports-mode.js +5 -24
  207. package/.agents/scripts/lib/degraded-mode.js +3 -26
  208. package/.agents/scripts/lib/dependency-parser.js +8 -40
  209. package/.agents/scripts/lib/dependency-version.js +13 -35
  210. package/.agents/scripts/lib/detect-package-manager.js +6 -36
  211. package/.agents/scripts/lib/doc-tiers.js +22 -126
  212. package/.agents/scripts/lib/duplicate-search.js +8 -72
  213. package/.agents/scripts/lib/env-loader.js +5 -27
  214. package/.agents/scripts/lib/error-redactor.js +6 -31
  215. package/.agents/scripts/lib/errors/index.js +2 -22
  216. package/.agents/scripts/lib/escomplex-ast-compat.js +22 -163
  217. package/.agents/scripts/lib/escomplex-kernel.js +21 -123
  218. package/.agents/scripts/lib/feedback-loop/graduator-core.js +93 -419
  219. package/.agents/scripts/lib/feedback-loop/prior-feedback-fetcher.js +20 -98
  220. package/.agents/scripts/lib/feedback-loop/retro-proposals-graduator.js +27 -151
  221. package/.agents/scripts/lib/findings/audit-ledger.js +23 -97
  222. package/.agents/scripts/lib/findings/classify-finding.js +14 -69
  223. package/.agents/scripts/lib/findings/promote-finding.js +14 -112
  224. package/.agents/scripts/lib/findings/provenance-field.js +11 -52
  225. package/.agents/scripts/lib/findings/route-finding.js +37 -255
  226. package/.agents/scripts/lib/findings/semantic-issue-search.js +14 -59
  227. package/.agents/scripts/lib/findings/severity.js +18 -104
  228. package/.agents/scripts/lib/format-generated-json.js +12 -44
  229. package/.agents/scripts/lib/full-suite-lock.js +160 -429
  230. package/.agents/scripts/lib/full-suite-queue.js +213 -0
  231. package/.agents/scripts/lib/gates/baseline-store.js +5 -9
  232. package/.agents/scripts/lib/gates/friction.js +1 -3
  233. package/.agents/scripts/lib/generated/agentrc-validator.js +2 -2
  234. package/.agents/scripts/lib/gh-exec.js +31 -259
  235. package/.agents/scripts/lib/git/cached-fetch.js +9 -52
  236. package/.agents/scripts/lib/git/sync-from-base.js +15 -107
  237. package/.agents/scripts/lib/git-branch-cleanup.js +14 -61
  238. package/.agents/scripts/lib/git-branch-lifecycle.js +16 -87
  239. package/.agents/scripts/lib/git-utils.js +37 -161
  240. package/.agents/scripts/lib/github/framework-repo.js +8 -71
  241. package/.agents/scripts/lib/github-url.js +2 -17
  242. package/.agents/scripts/lib/import-graph.js +11 -38
  243. package/.agents/scripts/lib/install-cmd-parser.js +4 -13
  244. package/.agents/scripts/lib/json-utils.js +3 -18
  245. package/.agents/scripts/lib/label-constants.js +16 -111
  246. package/.agents/scripts/lib/label-taxonomy.js +4 -30
  247. package/.agents/scripts/lib/maintainability-engine.js +12 -80
  248. package/.agents/scripts/lib/maintainability-unscorable.js +5 -25
  249. package/.agents/scripts/lib/maintainability-utils.js +16 -92
  250. package/.agents/scripts/lib/mandrel-catalog.js +12 -70
  251. package/.agents/scripts/lib/notifications/notifier.js +13 -38
  252. package/.agents/scripts/lib/npm-scripts.js +4 -23
  253. package/.agents/scripts/lib/observability/metrics-ledger.js +16 -76
  254. package/.agents/scripts/lib/observability/runtime-friction.js +44 -286
  255. package/.agents/scripts/lib/observability/signal-validator.js +5 -37
  256. package/.agents/scripts/lib/observability/signals-writer.js +11 -121
  257. package/.agents/scripts/lib/observability/source-classifier.js +21 -203
  258. package/.agents/scripts/lib/observability/terse-result.js +14 -47
  259. package/.agents/scripts/lib/onboard/init-tail.js +13 -74
  260. package/.agents/scripts/lib/onboard/scaffold-docs.js +11 -34
  261. package/.agents/scripts/lib/orchestration/acceptance-eval-decision.js +25 -139
  262. package/.agents/scripts/lib/orchestration/auto-merge-cwd.js +11 -66
  263. package/.agents/scripts/lib/orchestration/behind-recovery.js +10 -55
  264. package/.agents/scripts/lib/orchestration/ceremony-routing.js +5 -75
  265. package/.agents/scripts/lib/orchestration/change-set.js +7 -36
  266. package/.agents/scripts/lib/orchestration/check-baselines/phases/compare.js +9 -46
  267. package/.agents/scripts/lib/orchestration/check-baselines/phases/evaluate.js +11 -44
  268. package/.agents/scripts/lib/orchestration/check-baselines/phases/floors.js +5 -24
  269. package/.agents/scripts/lib/orchestration/check-baselines/phases/friction.js +3 -12
  270. package/.agents/scripts/lib/orchestration/check-baselines/phases/parse-args.js +5 -38
  271. package/.agents/scripts/lib/orchestration/check-baselines/phases/pipeline.js +3 -8
  272. package/.agents/scripts/lib/orchestration/check-baselines/phases/refresh-ack.js +28 -136
  273. package/.agents/scripts/lib/orchestration/check-baselines/phases/report.js +3 -13
  274. package/.agents/scripts/lib/orchestration/check-state.js +92 -0
  275. package/.agents/scripts/lib/orchestration/ci-gap-intake.js +37 -144
  276. package/.agents/scripts/lib/orchestration/ci-rerun-guard.js +42 -189
  277. package/.agents/scripts/lib/orchestration/code-review.js +24 -128
  278. package/.agents/scripts/lib/orchestration/column-sync.js +23 -111
  279. package/.agents/scripts/lib/orchestration/complexity-gate.js +42 -214
  280. package/.agents/scripts/lib/orchestration/deliver-recover.js +36 -168
  281. package/.agents/scripts/lib/orchestration/dependency-analyzer.js +4 -35
  282. package/.agents/scripts/lib/orchestration/dependency-candidates.js +9 -41
  283. package/.agents/scripts/lib/orchestration/diff-magnitude.js +25 -115
  284. package/.agents/scripts/lib/orchestration/doc-reader.js +2 -6
  285. package/.agents/scripts/lib/orchestration/docs-digest.js +13 -51
  286. package/.agents/scripts/lib/orchestration/epic-candidates.js +13 -53
  287. package/.agents/scripts/lib/orchestration/epic-checklist.js +9 -33
  288. package/.agents/scripts/lib/orchestration/epic-container.js +41 -167
  289. package/.agents/scripts/lib/orchestration/epic-expansion.js +10 -40
  290. package/.agents/scripts/lib/orchestration/epic-rollup.js +55 -207
  291. package/.agents/scripts/lib/orchestration/file-assumption-enum.js +2 -22
  292. package/.agents/scripts/lib/orchestration/file-assumptions.js +45 -253
  293. package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-detect.js +9 -46
  294. package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-reap.js +7 -57
  295. package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches.js +21 -126
  296. package/.agents/scripts/lib/orchestration/git-cleanup/phases/cli.js +2 -6
  297. package/.agents/scripts/lib/orchestration/git-cleanup/phases/fast-forward.js +1 -4
  298. package/.agents/scripts/lib/orchestration/git-cleanup/phases/filters.js +1 -5
  299. package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes-ff.js +9 -34
  300. package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes.js +41 -190
  301. package/.agents/scripts/lib/orchestration/git-cleanup/phases/merged-tip.js +9 -45
  302. package/.agents/scripts/lib/orchestration/git-cleanup/phases/parse-args.js +1 -4
  303. package/.agents/scripts/lib/orchestration/git-cleanup/phases/phase-drivers.js +19 -85
  304. package/.agents/scripts/lib/orchestration/git-cleanup/phases/prompts.js +3 -17
  305. package/.agents/scripts/lib/orchestration/git-cleanup/phases/prune.js +1 -5
  306. package/.agents/scripts/lib/orchestration/git-cleanup/phases/render.js +16 -100
  307. package/.agents/scripts/lib/orchestration/git-cleanup/phases/stashes.js +1 -4
  308. package/.agents/scripts/lib/orchestration/lease-guard-shared.js +16 -67
  309. package/.agents/scripts/lib/orchestration/lifecycle/emit-ledger-event.js +9 -33
  310. package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-flip-failed.js +8 -29
  311. package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-unlanded.js +15 -68
  312. package/.agents/scripts/lib/orchestration/light-backstop.js +11 -49
  313. package/.agents/scripts/lib/orchestration/light-escalation.js +21 -89
  314. package/.agents/scripts/lib/orchestration/light-suitability.js +26 -231
  315. package/.agents/scripts/lib/orchestration/merge-block-class.js +39 -216
  316. package/.agents/scripts/lib/orchestration/merge-poll.js +104 -377
  317. package/.agents/scripts/lib/orchestration/merge-queue.js +158 -0
  318. package/.agents/scripts/lib/orchestration/pinned-identifier-lint.js +17 -57
  319. package/.agents/scripts/lib/orchestration/plan-context.js +52 -303
  320. package/.agents/scripts/lib/orchestration/plan-critic-conditions.js +22 -79
  321. package/.agents/scripts/lib/orchestration/plan-critics-evaluate.js +5 -31
  322. package/.agents/scripts/lib/orchestration/plan-metrics.js +29 -108
  323. package/.agents/scripts/lib/orchestration/plan-navigation.js +8 -27
  324. package/.agents/scripts/lib/orchestration/plan-persist/acceptance-handle-repair.js +12 -49
  325. package/.agents/scripts/lib/orchestration/plan-persist/audit-provenance.js +18 -73
  326. package/.agents/scripts/lib/orchestration/plan-persist/changes-repair.js +14 -78
  327. package/.agents/scripts/lib/orchestration/plan-persist/cross-plan-links.js +6 -30
  328. package/.agents/scripts/lib/orchestration/plan-persist/epic-adoption.js +14 -65
  329. package/.agents/scripts/lib/orchestration/plan-persist/epic-ops.js +21 -76
  330. package/.agents/scripts/lib/orchestration/plan-persist/external-deps.js +6 -43
  331. package/.agents/scripts/lib/orchestration/plan-persist/persist-helpers.js +14 -68
  332. package/.agents/scripts/lib/orchestration/plan-persist/plan-context-source.js +9 -41
  333. package/.agents/scripts/lib/orchestration/plan-persist/run-plan-persist.js +49 -248
  334. package/.agents/scripts/lib/orchestration/plan-persist/soft-findings.js +2 -12
  335. package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +85 -368
  336. package/.agents/scripts/lib/orchestration/plan-persist/summary.js +8 -38
  337. package/.agents/scripts/lib/orchestration/plan-persist/supersede-ops.js +30 -190
  338. package/.agents/scripts/lib/orchestration/plan-persist/wave-collision-gate.js +9 -49
  339. package/.agents/scripts/lib/orchestration/plan-persist/wave-serialisation.js +7 -28
  340. package/.agents/scripts/lib/orchestration/plan-reachability.js +13 -42
  341. package/.agents/scripts/lib/orchestration/plan-run-labels/reap.js +16 -91
  342. package/.agents/scripts/lib/orchestration/plan-runner/worktree-sweep.js +16 -54
  343. package/.agents/scripts/lib/orchestration/plan-text-hygiene.js +10 -52
  344. package/.agents/scripts/lib/orchestration/planning/authoring-context.js +14 -109
  345. package/.agents/scripts/lib/orchestration/planning/memory-pool-advisory.js +11 -83
  346. package/.agents/scripts/lib/orchestration/pr-watch.js +48 -306
  347. package/.agents/scripts/lib/orchestration/project-meta-cache.js +15 -80
  348. package/.agents/scripts/lib/orchestration/project-meta-resolver.js +10 -51
  349. package/.agents/scripts/lib/orchestration/reassert-status-column.js +12 -76
  350. package/.agents/scripts/lib/orchestration/remote-verifier.js +12 -36
  351. package/.agents/scripts/lib/orchestration/resolve-stories.js +33 -164
  352. package/.agents/scripts/lib/orchestration/retro-proposals.js +66 -361
  353. package/.agents/scripts/lib/orchestration/review-base-ref.js +9 -43
  354. package/.agents/scripts/lib/orchestration/review-depth.js +12 -94
  355. package/.agents/scripts/lib/orchestration/review-providers/codex.js +10 -111
  356. package/.agents/scripts/lib/orchestration/review-providers/degraded-gates.js +13 -71
  357. package/.agents/scripts/lib/orchestration/review-providers/findings-renderer.js +7 -51
  358. package/.agents/scripts/lib/orchestration/review-providers/mi-exemptions.js +8 -53
  359. package/.agents/scripts/lib/orchestration/review-providers/native.js +30 -214
  360. package/.agents/scripts/lib/orchestration/review-providers/parse-findings.js +7 -52
  361. package/.agents/scripts/lib/orchestration/review-providers/review-depth.js +4 -33
  362. package/.agents/scripts/lib/orchestration/review-providers/review-provider-factory.js +11 -71
  363. package/.agents/scripts/lib/orchestration/review-providers/scoped-lint.js +19 -131
  364. package/.agents/scripts/lib/orchestration/review-providers/security-review.js +6 -89
  365. package/.agents/scripts/lib/orchestration/review-providers/types.js +26 -56
  366. package/.agents/scripts/lib/orchestration/review-providers/ultrareview.js +3 -46
  367. package/.agents/scripts/lib/orchestration/run-epilogue.js +40 -199
  368. package/.agents/scripts/lib/orchestration/run-scoped-config.js +13 -81
  369. package/.agents/scripts/lib/orchestration/single-story-close/close-note.js +7 -34
  370. package/.agents/scripts/lib/orchestration/single-story-close/failed-terminal.js +16 -89
  371. package/.agents/scripts/lib/orchestration/single-story-close/gate-log.js +18 -109
  372. package/.agents/scripts/lib/orchestration/single-story-close/phases/auto-merge.js +190 -280
  373. package/.agents/scripts/lib/orchestration/single-story-close/phases/base-sync.js +18 -80
  374. package/.agents/scripts/lib/orchestration/single-story-close/phases/close-validation.js +103 -97
  375. package/.agents/scripts/lib/orchestration/single-story-close/phases/code-review.js +8 -64
  376. package/.agents/scripts/lib/orchestration/single-story-close/phases/confirm-merge.js +183 -485
  377. package/.agents/scripts/lib/orchestration/single-story-close/phases/conventional-subject.js +30 -134
  378. package/.agents/scripts/lib/orchestration/single-story-close/phases/graphql-preflight.js +9 -50
  379. package/.agents/scripts/lib/orchestration/single-story-close/phases/lock-wait-pending.js +49 -0
  380. package/.agents/scripts/lib/orchestration/single-story-close/phases/normalize-pr-title.js +13 -86
  381. package/.agents/scripts/lib/orchestration/single-story-close/phases/options.js +20 -95
  382. package/.agents/scripts/lib/orchestration/single-story-close/phases/post-land.js +46 -203
  383. package/.agents/scripts/lib/orchestration/single-story-close/phases/pre-gate-steps.js +8 -50
  384. package/.agents/scripts/lib/orchestration/single-story-close/phases/pull-request.js +12 -83
  385. package/.agents/scripts/lib/orchestration/single-story-close/phases/push.js +6 -39
  386. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-block.js +1 -6
  387. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-outcome.js +4 -28
  388. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-override.js +6 -51
  389. package/.agents/scripts/lib/orchestration/single-story-close/phases/worktree-reap.js +6 -34
  390. package/.agents/scripts/lib/orchestration/single-story-close/phases/wrong-tree-guard.js +23 -121
  391. package/.agents/scripts/lib/orchestration/single-story-close/runner.js +110 -290
  392. package/.agents/scripts/lib/orchestration/single-story-lease-guard.js +15 -69
  393. package/.agents/scripts/lib/orchestration/story-body-gate.js +4 -23
  394. package/.agents/scripts/lib/orchestration/story-close/baseline-upward-writeback.js +50 -179
  395. package/.agents/scripts/lib/orchestration/story-close/context-budget-writeback.js +11 -41
  396. package/.agents/scripts/lib/orchestration/story-close/format-autofix.js +23 -311
  397. package/.agents/scripts/lib/orchestration/story-close/phases/local-lens-review.js +22 -147
  398. package/.agents/scripts/lib/orchestration/story-close/phases/review-core.js +16 -67
  399. package/.agents/scripts/lib/orchestration/story-deliver-terminal-schema.js +12 -68
  400. package/.agents/scripts/lib/orchestration/story-deliver-terminal.js +42 -201
  401. package/.agents/scripts/lib/orchestration/story-follow-ups.js +43 -245
  402. package/.agents/scripts/lib/orchestration/story-init-envelope.js +4 -23
  403. package/.agents/scripts/lib/orchestration/story-init-remote.js +2 -6
  404. package/.agents/scripts/lib/orchestration/story-reachability.js +3 -23
  405. package/.agents/scripts/lib/orchestration/task-body-validator.js +12 -126
  406. package/.agents/scripts/lib/orchestration/ticket-lease.js +28 -131
  407. package/.agents/scripts/lib/orchestration/ticket-validator-conflicts.js +15 -149
  408. package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +5 -33
  409. package/.agents/scripts/lib/orchestration/ticket-validator.js +39 -181
  410. package/.agents/scripts/lib/orchestration/ticketing/bulk.js +51 -244
  411. package/.agents/scripts/lib/orchestration/ticketing/reads.js +39 -250
  412. package/.agents/scripts/lib/orchestration/ticketing/state.js +14 -68
  413. package/.agents/scripts/lib/orchestration/ticketing/transition.js +46 -263
  414. package/.agents/scripts/lib/orchestration/ticketing.js +2 -26
  415. package/.agents/scripts/lib/orchestration/verify-credit.js +18 -79
  416. package/.agents/scripts/lib/orchestration/worktree-dirty.js +5 -30
  417. package/.agents/scripts/lib/path-security.js +3 -6
  418. package/.agents/scripts/lib/plan-phase-cleanup.js +9 -49
  419. package/.agents/scripts/lib/preflight-runner.js +13 -69
  420. package/.agents/scripts/lib/process-group.js +143 -0
  421. package/.agents/scripts/lib/project-root.js +2 -8
  422. package/.agents/scripts/lib/provider-factory.js +2 -25
  423. package/.agents/scripts/lib/qa/console-allowlist.js +10 -59
  424. package/.agents/scripts/lib/qa/qa-session.js +15 -69
  425. package/.agents/scripts/lib/qa/redact-evidence.js +18 -129
  426. package/.agents/scripts/lib/qa/resolve-qa-contract.js +26 -135
  427. package/.agents/scripts/lib/qa/resolve-selection.js +16 -84
  428. package/.agents/scripts/lib/reserved-test-ids.js +9 -47
  429. package/.agents/scripts/lib/runtime-deps/dep-resolution.js +13 -53
  430. package/.agents/scripts/lib/runtime-deps/ensure-installed.js +10 -44
  431. package/.agents/scripts/lib/runtime-deps/manifest.js +10 -30
  432. package/.agents/scripts/lib/runtime-deps/parser-major.js +15 -51
  433. package/.agents/scripts/lib/runtime-deps/preflight.js +4 -22
  434. package/.agents/scripts/lib/runtime-deps/scan-imports.js +11 -55
  435. package/.agents/scripts/lib/signals/detectors/common.js +12 -38
  436. package/.agents/scripts/lib/signals/index.js +2 -19
  437. package/.agents/scripts/lib/signals/schema.js +14 -109
  438. package/.agents/scripts/lib/signals/write.js +2 -11
  439. package/.agents/scripts/lib/single-story/confirm-merge.js +31 -72
  440. package/.agents/scripts/lib/single-story/story-merged-notify.js +8 -49
  441. package/.agents/scripts/lib/single-story-sweep/protection-ctx.js +4 -26
  442. package/.agents/scripts/lib/single-story-sweep/protection.js +13 -100
  443. package/.agents/scripts/lib/single-story-sweep/sweep-lock.js +60 -258
  444. package/.agents/scripts/lib/single-story-sweep.js +14 -97
  445. package/.agents/scripts/lib/skills/parse-skill.js +13 -59
  446. package/.agents/scripts/lib/skills/skills-index.js +8 -29
  447. package/.agents/scripts/lib/skills/walk-skill-files.js +17 -78
  448. package/.agents/scripts/lib/source-extensions.js +11 -42
  449. package/.agents/scripts/lib/source-text/strip-js-comments.js +8 -41
  450. package/.agents/scripts/lib/stdio-flush.js +9 -36
  451. package/.agents/scripts/lib/story-adjacency.js +8 -40
  452. package/.agents/scripts/lib/story-body/body-format-lints.js +22 -83
  453. package/.agents/scripts/lib/story-body/footer-block.js +11 -44
  454. package/.agents/scripts/lib/story-body/story-body.js +83 -358
  455. package/.agents/scripts/lib/temp-retention.js +42 -143
  456. package/.agents/scripts/lib/templates/decomposer-prompts.js +11 -65
  457. package/.agents/scripts/lib/test-env.js +12 -65
  458. package/.agents/scripts/lib/test-run-credit.js +10 -65
  459. package/.agents/scripts/lib/test-runner-contract.js +19 -74
  460. package/.agents/scripts/lib/test-temp.js +38 -184
  461. package/.agents/scripts/lib/test-tiers.js +12 -96
  462. package/.agents/scripts/lib/ticket-body-sections.js +21 -96
  463. package/.agents/scripts/lib/transpile.js +15 -74
  464. package/.agents/scripts/lib/util/concurrent-map.js +6 -25
  465. package/.agents/scripts/lib/util/parse-id-list.js +8 -34
  466. package/.agents/scripts/lib/util/poll-loop.js +8 -28
  467. package/.agents/scripts/lib/util/with-timeout.js +2 -11
  468. package/.agents/scripts/lib/validation-evidence.js +21 -96
  469. package/.agents/scripts/lib/wave-runner/footprint.js +17 -70
  470. package/.agents/scripts/lib/wave-runner/live-probe.js +53 -221
  471. package/.agents/scripts/lib/wave-runner/ready-set.js +72 -301
  472. package/.agents/scripts/lib/workers/crap-worker.js +11 -64
  473. package/.agents/scripts/lib/workers/maintainability-report-worker.js +8 -45
  474. package/.agents/scripts/lib/workers/maintainability-worker.js +5 -21
  475. package/.agents/scripts/lib/workers/serve-worker-messages.js +2 -18
  476. package/.agents/scripts/lib/workflow-closure.js +22 -105
  477. package/.agents/scripts/lib/workspace-provisioner.js +16 -54
  478. package/.agents/scripts/lib/worktree/git-hooks.js +15 -60
  479. package/.agents/scripts/lib/worktree/lifecycle/force-drain.js +20 -60
  480. package/.agents/scripts/lib/worktree/lifecycle/merge-reachability.js +10 -62
  481. package/.agents/scripts/lib/worktree/lifecycle/pending-cleanup.js +22 -86
  482. package/.agents/scripts/lib/worktree/lifecycle/reap.js +24 -126
  483. package/.agents/scripts/lib/worktree/lifecycle-manager.js +2 -20
  484. package/.agents/scripts/lib/worktree/node-modules-strategy.js +46 -180
  485. package/.agents/scripts/lib/worktree-manager.js +15 -40
  486. package/.agents/scripts/lint-issue-body.js +12 -68
  487. package/.agents/scripts/mandrel-update-preflight.js +10 -70
  488. package/.agents/scripts/merge-baseline.js +30 -104
  489. package/.agents/scripts/nav-registry-diff.js +22 -108
  490. package/.agents/scripts/notify.js +12 -69
  491. package/.agents/scripts/plan-context.js +27 -111
  492. package/.agents/scripts/plan-critics.js +12 -66
  493. package/.agents/scripts/plan-persist.js +31 -148
  494. package/.agents/scripts/plan-run-epilogue.js +11 -37
  495. package/.agents/scripts/pr-watch-with-update.js +76 -267
  496. package/.agents/scripts/providers/github/auth.js +3 -8
  497. package/.agents/scripts/providers/github/blocked-by-add.js +14 -61
  498. package/.agents/scripts/providers/github/board-add.js +5 -21
  499. package/.agents/scripts/providers/github/branch-protection.js +11 -43
  500. package/.agents/scripts/providers/github/cache.js +2 -14
  501. package/.agents/scripts/providers/github/comments.js +7 -40
  502. package/.agents/scripts/providers/github/compose.js +3 -19
  503. package/.agents/scripts/providers/github/errors.js +22 -125
  504. package/.agents/scripts/providers/github/issues.js +31 -123
  505. package/.agents/scripts/providers/github/labels.js +24 -124
  506. package/.agents/scripts/providers/github/mappers.js +5 -27
  507. package/.agents/scripts/providers/github/merge-methods.js +3 -22
  508. package/.agents/scripts/providers/github/project-board.js +2 -17
  509. package/.agents/scripts/providers/github/projects-v2-graphql.js +3 -6
  510. package/.agents/scripts/providers/github/request-helpers.js +5 -32
  511. package/.agents/scripts/providers/github/search-budget.js +9 -39
  512. package/.agents/scripts/providers/github/search-query.js +5 -26
  513. package/.agents/scripts/providers/github/sub-issue-add.js +15 -65
  514. package/.agents/scripts/providers/github/sub-issues.js +7 -36
  515. package/.agents/scripts/providers/github/tickets.js +32 -134
  516. package/.agents/scripts/providers/github.js +18 -59
  517. package/.agents/scripts/prune-plan-run-labels.js +12 -46
  518. package/.agents/scripts/quality-preview.js +35 -220
  519. package/.agents/scripts/resolve-doc-tiers.js +3 -26
  520. package/.agents/scripts/resolve-stories.js +16 -67
  521. package/.agents/scripts/resync-status-column.js +6 -25
  522. package/.agents/scripts/run-tests.js +29 -104
  523. package/.agents/scripts/single-story-close.js +23 -135
  524. package/.agents/scripts/single-story-confirm-merge.js +32 -139
  525. package/.agents/scripts/single-story-init.js +47 -209
  526. package/.agents/scripts/stories-wave-tick.js +102 -472
  527. package/.agents/scripts/sync-agentrc.js +3 -21
  528. package/.agents/scripts/sync-claude-agents.js +9 -55
  529. package/.agents/scripts/sync-claude-commands.js +20 -110
  530. package/.agents/scripts/test-wrapper.js +6 -43
  531. package/.agents/scripts/update-coverage-baseline.js +5 -22
  532. package/.agents/scripts/update-crap-baseline.js +7 -30
  533. package/.agents/scripts/update-duplication-baseline.js +16 -92
  534. package/.agents/scripts/update-maintainability-baseline.js +8 -62
  535. package/.agents/scripts/update-ticket-state.js +1 -7
  536. package/.agents/scripts/validate-skills.js +6 -26
  537. package/.agents/templates/agent-protocol.md +2 -2
  538. package/.agents/templates/docs/audit-sweep-runbook.md +3 -4
  539. package/.agents/workflows/audit-accessibility.md +4 -7
  540. package/.agents/workflows/audit-adrs.md +3 -6
  541. package/.agents/workflows/audit-architecture.md +3 -11
  542. package/.agents/workflows/audit-baselines.md +6 -9
  543. package/.agents/workflows/audit-clean-code.md +8 -12
  544. package/.agents/workflows/audit-data-model.md +3 -7
  545. package/.agents/workflows/audit-dependencies.md +4 -7
  546. package/.agents/workflows/audit-devops.md +4 -8
  547. package/.agents/workflows/audit-documentation.md +1 -4
  548. package/.agents/workflows/audit-mobile.md +4 -7
  549. package/.agents/workflows/audit-navigability.md +3 -6
  550. package/.agents/workflows/audit-performance.md +2 -4
  551. package/.agents/workflows/audit-privacy.md +4 -7
  552. package/.agents/workflows/audit-quality.md +4 -7
  553. package/.agents/workflows/audit-security.md +4 -7
  554. package/.agents/workflows/audit-seo.md +4 -7
  555. package/.agents/workflows/audit-sre.md +4 -7
  556. package/.agents/workflows/audit-to-stories.md +17 -30
  557. package/.agents/workflows/audit-ux-ui.md +4 -7
  558. package/.agents/workflows/helpers/audit-lens-core.md +1 -1
  559. package/.agents/workflows/helpers/code-quality-guardrails.md +12 -15
  560. package/.agents/workflows/helpers/deliver-digest.md +6 -4
  561. package/.agents/workflows/helpers/deliver-reference.md +114 -188
  562. package/.agents/workflows/helpers/deliver-story-reference.md +189 -533
  563. package/.agents/workflows/helpers/plan-reference.md +86 -139
  564. package/.agents/workflows/helpers/qa-core.md +12 -0
  565. package/.agents/workflows/memory-consolidate.md +1 -1
  566. package/.agents/workflows/qa-assist.md +27 -71
  567. package/.agents/workflows/qa-explore.md +19 -59
  568. package/.agents/workflows/qa-run.md +11 -33
  569. package/README.md +1 -1
  570. package/bin/mandrel.js +5 -46
  571. package/bin/postinstall.js +18 -107
  572. package/docs/CHANGELOG.md +32 -0
  573. package/lib/cli/doctor.js +11 -71
  574. package/lib/cli/init.js +26 -165
  575. package/lib/cli/migrate.js +5 -64
  576. package/lib/cli/registry.js +84 -467
  577. package/lib/cli/sync-agents.js +4 -64
  578. package/lib/cli/sync-commands.js +11 -64
  579. package/lib/cli/sync.js +34 -213
  580. package/lib/cli/uninstall.js +40 -219
  581. package/lib/cli/update.js +105 -661
  582. package/lib/cli/version-check.js +8 -72
  583. package/lib/cli/version-helpers.js +14 -87
  584. package/lib/migrations/helpers/retire-agentrc-key.js +11 -52
  585. package/lib/migrations/index.js +15 -92
  586. package/lib/migrations/steps/2.1.0-retire-mi-drop-knobs.js +2 -15
  587. package/lib/migrations/steps/2.1.0-retire-verify-concurrency-cap.js +1 -13
  588. package/lib/migrations/steps/2.11.0-retire-max-seed-words.js +2 -15
  589. package/lib/migrations/steps/2.2.0-retire-epic-ac-tags.js +9 -38
  590. package/lib/migrations/steps/2.20.0-retire-codebase-snapshot.js +1 -13
  591. package/lib/migrations/steps/2.32.0-retire-lint-baseline-command.js +2 -27
  592. package/lib/migrations/steps/2.57.0-retire-delivery-limit-knobs.js +2 -23
  593. package/lib/migrations/steps/2.57.0-retire-planning-limit-knobs.js +2 -27
  594. package/lib/migrations/steps/2.60.0-retire-audit-results-autofile.js +2 -21
  595. package/lib/migrations/steps/strip-removed-agentrc-keys.js +333 -0
  596. package/package.json +16 -14
  597. package/.agents/docs/SDLC.md +0 -590
  598. package/.agents/docs/quality-gates.md +0 -1183
  599. package/.agents/rules/known-tooling-behavior.md +0 -200
  600. package/.agents/rules/orchestration-error-handling.md +0 -61
  601. package/.agents/rules/test-seams.md +0 -59
  602. package/.agents/schemas/baselines/lighthouse.schema.json +0 -59
  603. package/.agents/schemas/baselines/lint.schema.json +0 -47
  604. package/.agents/scripts/check-action-pinning.js +0 -260
  605. package/.agents/scripts/check-audit-attribution.js +0 -302
  606. package/.agents/scripts/check-baseline-drift.js +0 -211
  607. package/.agents/scripts/check-baseline-scope.js +0 -362
  608. package/.agents/scripts/check-generated-validator.js +0 -202
  609. package/.agents/scripts/check-knip-entries.js +0 -159
  610. package/.agents/scripts/check-lifecycle-lint.js +0 -294
  611. package/.agents/scripts/check-pinned-override-notes.js +0 -102
  612. package/.agents/scripts/check-schema-references.js +0 -368
  613. package/.agents/scripts/check-test-portability.js +0 -512
  614. package/.agents/scripts/check-workflow-citations.js +0 -218
  615. package/.agents/scripts/check-workflow-cli-lint.js +0 -299
  616. package/.agents/scripts/check-workflow-timeouts.js +0 -291
  617. package/.agents/scripts/install-matrix-assert.js +0 -326
  618. package/.agents/scripts/lib/audit-advisories.js +0 -195
  619. package/.agents/scripts/lib/audit-attribution.js +0 -134
  620. package/.agents/scripts/lib/baselines/drift-detector.js +0 -351
  621. package/.agents/scripts/lib/baselines/kinds/lighthouse.js +0 -87
  622. package/.agents/scripts/lib/baselines/kinds/lint.js +0 -184
  623. package/.agents/scripts/lib/baselines/orphan-pruner.js +0 -233
  624. package/.agents/scripts/lib/baselines/scope-assert.js +0 -223
  625. package/.agents/scripts/lib/baselines/scope-inventory.js +0 -314
  626. package/.agents/scripts/lib/c8-cli-path.js +0 -21
  627. package/.agents/scripts/lib/config/gates/lighthouse.schema.js +0 -51
  628. package/.agents/scripts/lib/config/gates/lint.schema.js +0 -18
  629. package/.agents/scripts/lib/dynamic-workflow/architecture-report-contract.js +0 -70
  630. package/.agents/scripts/lib/dynamic-workflow/audit-orchestrator.js +0 -284
  631. package/.agents/scripts/lib/dynamic-workflow/clean-code-report-contract.js +0 -80
  632. package/.agents/scripts/lib/dynamic-workflow/degraded-coverage.js +0 -81
  633. package/.agents/scripts/lib/dynamic-workflow/documentation-report-contract.js +0 -87
  634. package/.agents/scripts/lib/dynamic-workflow/performance-report-contract.js +0 -74
  635. package/.agents/scripts/lib/dynamic-workflow/quality-report-contract.js +0 -90
  636. package/.agents/scripts/lib/dynamic-workflow/report-contract-core.js +0 -43
  637. package/.agents/scripts/lib/dynamic-workflow/security-report-contract.js +0 -83
  638. package/.agents/scripts/lib/fs-walk.js +0 -52
  639. package/.agents/scripts/lib/knip-config-resolver.js +0 -181
  640. package/.agents/scripts/lib/knip-entry-sync.js +0 -452
  641. package/.agents/scripts/lib/pinned-override-notes.js +0 -88
  642. package/.agents/scripts/lib/pinned-override-resolve.js +0 -212
  643. package/.agents/scripts/lib/test-isolate/cli-options.js +0 -93
  644. package/.agents/scripts/lib/test-isolate/env-snapshot-loader.js +0 -52
  645. package/.agents/scripts/lib/test-isolate/list-files.js +0 -90
  646. package/.agents/scripts/lib/test-isolate/parse-tap.js +0 -75
  647. package/.agents/scripts/lib/test-isolate/progress-log.js +0 -45
  648. package/.agents/scripts/lib/test-isolate/render-report.js +0 -97
  649. package/.agents/scripts/lib/test-isolate/run-isolate.js +0 -87
  650. package/.agents/scripts/lib/test-isolate/runner.js +0 -483
  651. package/.agents/scripts/lib/test-profile/parse-tap.js +0 -136
  652. package/.agents/scripts/lib/test-profile/render-report.js +0 -45
  653. package/.agents/scripts/lint-label-vocabulary.js +0 -214
  654. package/.agents/scripts/post-structured-comment.js +0 -127
  655. package/.agents/scripts/provision-git-hooks.js +0 -85
  656. package/.agents/scripts/prune-baseline-orphans.js +0 -181
  657. package/.agents/scripts/run-coverage.js +0 -197
  658. package/.agents/scripts/run-lint.js +0 -133
  659. package/.agents/scripts/run-test-profile.js +0 -129
  660. package/.agents/scripts/run-verify.js +0 -125
  661. package/.agents/scripts/test-isolate.js +0 -55
  662. package/.agents/scripts/update-dead-exports-baseline.js +0 -321
@@ -1,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
  */