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,45 +1,12 @@
1
1
  /**
2
- * behind-recovery.js — the one bounded `BEHIND` → `gh pr update-branch`
3
- * recovery decision (Story #5006).
4
- *
5
- * Two loops watch an open PR and both must fast-forward it when GitHub
6
- * reports `mergeStateStatus: BEHIND`:
7
- *
8
- * - the CI-watch loop (`pr-watch.js#watchPrToTerminal`),
9
- * which probes with a synchronous `gh pr view` spawn and re-enters its
10
- * poll loop after each update; and
11
- * - the merge wait (`single-story-close/phases/confirm-merge.js`), which
12
- * probes with an async `gh` facade and simply re-reads on the next tick.
13
- *
14
- * They had two copies of the same three-way decision — *is it BEHIND, is
15
- * there update budget left, did the update land* — differing only in
16
- * incidental ordering, which is exactly the shape that drifts. This module
17
- * owns the decision; the callers keep their own probe source, their own
18
- * timing model, and their own operator-facing wording (supplied as the
19
- * `on*` callbacks).
20
- *
21
- * Deliberately NOT owned here: probing `mergeStateStatus`, counting the
22
- * budget across iterations, and deciding what a caller does next with the
23
- * verdict. The helper is a single bounded step, not a loop.
2
+ * behind-recovery.js — one bounded `BEHIND` → `gh pr update-branch` step,
3
+ * shared by both merge loops; callers own probing, budget and wording.
24
4
  */
25
5
 
26
- /**
27
- * The `gh pr view --json mergeStateStatus` value that licenses a recovery.
28
- * Module-private: both call sites reach it through {@link applyBehindUpdate},
29
- * so exporting it would only add a symbol the reachability ratchet scores
30
- * dead.
31
- */
32
6
  const BEHIND_MERGE_STATE = 'BEHIND';
33
7
 
34
8
  /**
35
- * Normalise an `updateBranch()` settlement into `{ ok, detail }`.
36
- *
37
- * Both callers' invokers signal failure differently — the merge wait's `gh`
38
- * facade **throws**, the watcher's `spawnSync` port **resolves** a non-zero
39
- * status — so both shapes are accepted: a throw is a failure, and so is a
40
- * resolved object carrying `ok === false`. Anything else resolved (including
41
- * `undefined`) is a success, which is what a facade that only throws on
42
- * failure returns.
9
+ * Failure is a throw or a resolved `{ ok: false }`; anything else succeeds.
43
10
  *
44
11
  * @param {() => Promise<unknown>} updateBranch
45
12
  * @returns {Promise<{ ok: boolean, detail: string }>}
@@ -57,22 +24,14 @@ async function settleUpdate(updateBranch) {
57
24
  }
58
25
 
59
26
  /**
60
- * Apply at most one bounded `gh pr update-branch` to a PR that is BEHIND its
61
- * base.
62
- *
63
- * The order of the two guards is load-bearing: **not-BEHIND is checked
64
- * first**, so the budget-spent callback fires only for a PR that actually
65
- * wanted an update. Reversing them would announce an exhausted budget on
66
- * every poll of a perfectly up-to-date PR.
27
+ * Not-BEHIND is checked before the budget so an up-to-date PR never reports
28
+ * an exhausted budget; an unreadable probe never licenses a write.
67
29
  *
68
30
  * @param {object} args
69
- * @param {string|undefined|null} args.mergeStateStatus As probed by the
70
- * caller. Anything other than `BEHIND` (including a degraded/unknown probe)
71
- * is a no-op — an unreadable merge state must never license a write.
72
- * @param {number} [args.updatesUsed=0] Updates already applied this wait.
73
- * @param {number} [args.maxUpdates=0] Hard cap on updates per wait.
74
- * @param {() => Promise<unknown>} args.updateBranch Invoker that issues the
75
- * fast-forward. See {@link settleUpdate} for the accepted settlements.
31
+ * @param {string|undefined|null} args.mergeStateStatus
32
+ * @param {number} [args.updatesUsed=0]
33
+ * @param {number} [args.maxUpdates=0]
34
+ * @param {() => Promise<unknown>} args.updateBranch
76
35
  * @param {(args: { maxUpdates: number }) => void} [args.onBudgetSpent]
77
36
  * @param {(args: { updatesUsed: number, maxUpdates: number }) => void} [args.onUpdated]
78
37
  * @param {(detail: string) => void} [args.onUpdateFailed]
@@ -81,11 +40,7 @@ async function settleUpdate(updateBranch) {
81
40
  * updated: boolean,
82
41
  * outcome: 'not-behind'|'budget-spent'|'updated'|'update-failed',
83
42
  * }>}
84
- * `attempted` is true whenever the invoker ran — a failed update still
85
- * counts as an attempt (the merge wait treats it as a consumed tick and
86
- * re-reads the real state next poll). `updated` is true only when the
87
- * fast-forward actually landed, which is the signal a caller needs before
88
- * invalidating a terminal check outcome and re-polling.
43
+ * `updated` means terminal check outcomes must be re-polled.
89
44
  */
90
45
  export async function applyBehindUpdate({
91
46
  mergeStateStatus,
@@ -1,87 +1,15 @@
1
1
  /**
2
- * lib/orchestration/ceremony-routing.js — ceremony-profile + derived-level
3
- * acceptance ceremony resolver.
4
- *
5
- * The sibling of `review-depth.js#resolveDepth`: it folds the operator ceremony
6
- * profile and the **derived** change level into a per-cluster ceremony decision
7
- * for the single-delivery acceptance critic — **fresh-context spawn** vs the
8
- * contract-identical **inline** critic. It does NOT invent a new risk score and
9
- * it does NOT own clustering.
10
- *
11
- * ## One derived source, two decisions (Story #4542)
12
- *
13
- * `derivedLevel` comes from `review-depth.js#deriveChangeLevel` — the same call
14
- * that feeds review depth — so both ceremony decisions read one observable
15
- * signal: does the change set touch a sensitive path registered in
16
- * `audit-rules.json`? Previously this consumed the planner's own risk verdict,
17
- * which meant a confident all-low self-assertion bought *less* independent
18
- * checking than authoring nothing at all. A derived level cannot be talked down.
19
- *
20
- * ## Ceremony profiles (`delivery.routing.ceremonyProfile`)
21
- *
22
- * - `minimal` — always `inline` (no fresh critic spawn).
23
- * Use for tiny N=1 Stories the operator trusts.
24
- * - `standard` — level-routed (default). Low → inline; high or
25
- * underivable → fresh.
26
- * - `strict` — always `fresh` regardless of the derived level.
27
- *
28
- * ## The load-bearing invariant (M4-B acceptance floor — DO NOT VIOLATE)
29
- *
30
- * Risk-routing chooses fresh-vs-inline **PER CLUSTER**. It NEVER changes the
31
- * cluster COUNT — the caller owns clustering and hands this module a cluster
32
- * index. A low-risk Story still gets one verdict per cluster — just possibly
33
- * authored inline instead of by a fresh sub-agent. This module takes the
34
- * cluster index as an INPUT and returns a decision for that one cluster; it
35
- * has no way to add or remove clusters.
36
- *
37
- * ## One verdict-owner per cluster (Story #4723)
38
- *
39
- * The resolved decision names the cluster's **single verdict owner** via
40
- * `verdictOwner`: `'fresh-critic'` when the mode is `fresh`,
41
- * `'inline-self-eval'` when the mode is `inline`. Exactly one pass authors
42
- * the cluster's verdict — the fresh maker-blind critic OR the
43
- * contract-identical inline self-eval, never both, and never an additional
44
- * pre-pass self-assessment before the owner runs. `acceptance-eval.js` is
45
- * the deterministic SCORER of that one authored verdict (schema validation,
46
- * round cap, proceed/redraft/block) — it is not a third pass over the
47
- * criteria. This removes a redundant pass only; it never removes a
48
- * cluster's verdict (the M4-B floor above holds).
49
- *
50
- * ## Tier rules (per cluster, `standard` profile)
51
- *
52
- * - `high` level → `fresh` (a sensitive path was touched — a
53
- * fresh-context maker-blind spawn).
54
- * - `low` level → `inline` (the contract-identical inline critic).
55
- * - missing / unknown → `fresh` (fail-safe: the diff could not be
56
- * enumerated, so there is no evidence the
57
- * change is unremarkable; treat it as
58
- * needing the full fresh-context ceremony,
59
- * exactly as `resolveDepth` degrades to
60
- * `standard` on the same signal).
61
- *
62
- * ## No sampling floor (Story #5313)
63
- *
64
- * The maker-checker sampling floor (`delivery.routing.freshCriticSampleRate`,
65
- * `sampledFresh`) bounded independent checking by a cluster-index stride —
66
- * a count, not a risk signal — and was retired with the delivery diet. The
67
- * standard profile now routes purely off the derived level, so the decision
68
- * carries no `sampled` field and `clusterIndex` is accepted only for call-site
69
- * compatibility (it never changes the outcome).
70
- *
71
- * Pure and total: inputs in, decision out. No I/O, no throws. `null` /
72
- * `undefined` / malformed inputs degrade to `fresh` + `full` ceremony.
2
+ * lib/orchestration/ceremony-routing.js — the acceptance verdict owner from
3
+ * the ceremony profile alone: `strict` → fresh critic, else inline self-eval.
4
+ * The change level is deliberately not an input (it feeds review depth).
5
+ * Exactly one pass authors the verdict. Pure and total.
73
6
  *
74
7
  * @typedef {'fresh'|'inline'} CeremonyMode
75
8
  * @typedef {'fresh-critic'|'inline-self-eval'} VerdictOwner
76
- * @typedef {import('./review-depth.js').ChangeLevel} ChangeLevel
77
9
  * @typedef {(typeof CEREMONY_PROFILES)[number]} CeremonyProfile
78
10
  */
79
11
 
80
12
  /**
81
- * Map a resolved ceremony mode to the cluster's single verdict owner
82
- * (Story #4723). Total: any non-`fresh` value maps to the inline
83
- * self-eval owner, mirroring how the mode itself degrades.
84
- *
85
13
  * @param {CeremonyMode} mode
86
14
  * @returns {VerdictOwner}
87
15
  */
@@ -89,23 +17,31 @@ export function verdictOwnerForMode(mode) {
89
17
  return mode === 'fresh' ? 'fresh-critic' : 'inline-self-eval';
90
18
  }
91
19
 
92
- /**
93
- * The ceremony-profile vocabulary — the **single** place the three profile
94
- * names are written. `normalizeCeremonyProfile` is its reader and the
95
- * `CeremonyProfile` typedef is derived from it, so adding a profile is a
96
- * one-line change here (Story #4926).
97
- *
98
- * @type {readonly ['minimal', 'standard', 'strict']}
99
- */
20
+ /** @type {readonly ['minimal', 'standard', 'strict']} */
100
21
  const CEREMONY_PROFILES = Object.freeze(['minimal', 'standard', 'strict']);
101
22
 
102
- /** The profile an absent or unrecognized value degrades to. */
103
23
  const DEFAULT_CEREMONY_PROFILE = 'standard';
104
24
 
105
25
  /**
106
- * Normalize an operator/config ceremony profile. Unknown values degrade to
107
- * `standard` (fail toward the documented default, not toward less ceremony).
108
- *
26
+ * @type {Readonly<Record<CeremonyProfile, { mode: CeremonyMode, reason: string }>>}
27
+ */
28
+ const PROFILE_DECISIONS = Object.freeze({
29
+ minimal: {
30
+ mode: 'inline',
31
+ reason: 'ceremonyProfile=minimal: inline self-eval (no fresh spawn)',
32
+ },
33
+ standard: {
34
+ mode: 'inline',
35
+ reason:
36
+ 'ceremonyProfile=standard: inline self-eval authors the Story verdict',
37
+ },
38
+ strict: {
39
+ mode: 'fresh',
40
+ reason: 'ceremonyProfile=strict: fresh-context critic',
41
+ },
42
+ });
43
+
44
+ /**
109
45
  * @param {unknown} value
110
46
  * @returns {CeremonyProfile}
111
47
  */
@@ -116,16 +52,9 @@ function normalizeCeremonyProfile(value) {
116
52
  }
117
53
 
118
54
  /**
119
- * Resolve the acceptance ceremony for one cluster from the ceremony profile
120
- * and the derived change level. See the module header for the tier rules and
121
- * the untouchable cluster-count invariant.
122
- *
123
55
  * @param {{
124
- * derivedLevel?: (ChangeLevel|string|null|undefined),
125
- * clusterIndex?: (number|null|undefined),
126
56
  * ceremonyProfile?: (CeremonyProfile|string|null|undefined),
127
- * }} [input] `clusterIndex` is accepted for call-site compatibility only
128
- * (Story #5313 retired the sampling floor that read it).
57
+ * }} [input]
129
58
  * @returns {{
130
59
  * mode: CeremonyMode,
131
60
  * reason: string,
@@ -134,64 +63,7 @@ function normalizeCeremonyProfile(value) {
134
63
  * }}
135
64
  */
136
65
  export function resolveCeremonyForRisk(input = {}) {
137
- const decision = resolveCeremonyDecision(input);
138
- return { ...decision, verdictOwner: verdictOwnerForMode(decision.mode) };
139
- }
140
-
141
- /**
142
- * Internal mode/reason resolution — the tier rules. `resolveCeremonyForRisk`
143
- * decorates the result with the single `verdictOwner` derived from the mode
144
- * (Story #4723).
145
- *
146
- * @param {Parameters<typeof resolveCeremonyForRisk>[0]} [input]
147
- * @returns {{
148
- * mode: CeremonyMode,
149
- * reason: string,
150
- * profile: CeremonyProfile,
151
- * }}
152
- */
153
- function resolveCeremonyDecision(input = {}) {
154
- const derivedLevel =
155
- input && typeof input === 'object' ? input.derivedLevel : undefined;
156
- const profile = normalizeCeremonyProfile(
157
- input && typeof input === 'object' ? input.ceremonyProfile : undefined,
158
- );
159
-
160
- if (profile === 'minimal') {
161
- return {
162
- mode: 'inline',
163
- reason: 'ceremonyProfile=minimal: inline critic (no fresh spawn)',
164
- profile,
165
- };
166
- }
167
- if (profile === 'strict') {
168
- return {
169
- mode: 'fresh',
170
- reason: 'ceremonyProfile=strict: fresh-context critic',
171
- profile,
172
- };
173
- }
174
-
175
- if (derivedLevel === 'high') {
176
- return {
177
- mode: 'fresh',
178
- reason: 'sensitive path touched: fresh-context critic',
179
- profile,
180
- };
181
- }
182
- if (derivedLevel === 'low') {
183
- return {
184
- mode: 'inline',
185
- reason: 'no sensitive path touched: contract-identical inline critic',
186
- profile,
187
- };
188
- }
189
- // Missing / unknown / malformed level → fail-safe fresh + full ceremony,
190
- // matching how resolveDepth degrades to `standard` on the same signal.
191
- return {
192
- mode: 'fresh',
193
- reason:
194
- 'change level underivable: fail-safe fresh-context critic + full ceremony',
195
- profile,
196
- };
66
+ const profile = normalizeCeremonyProfile(input?.ceremonyProfile);
67
+ const { mode, reason } = PROFILE_DECISIONS[profile];
68
+ return { mode, reason, profile, verdictOwner: verdictOwnerForMode(mode) };
197
69
  }
@@ -1,33 +1,12 @@
1
1
  /**
2
- * lib/orchestration/change-set.js — the **one** Story change-set enumerator
3
- * (Story #4593).
2
+ * lib/orchestration/change-set.js — the one Story change-set enumerator.
3
+ * Computed once and injected so ceremony, review depth and lens roster all
4
+ * route off the same file list.
4
5
  *
5
- * ## Why this exists
6
- *
7
- * A single Story delivery used to enumerate `git diff --name-only
8
- * <base>...<head>` three to four separate times: once for the ceremony
9
- * derivation in `helpers/deliver-story`, once inside `runCodeReview` (to derive
10
- * the review depth), once for the Story-scope local-lens roster, and once more
11
- * per fresh acceptance critic. Every one of those consumers must agree about
12
- * *what changed* — ceremony level and review depth both flow from
13
- * `deriveChangeLevel`, so two enumerations straddling a commit could route the
14
- * same Story two different ways. Computing the set once and injecting it closes
15
- * that window and drops the redundant git calls.
16
- *
17
- * ## Contract
18
- *
19
- * {@link computeChangeSet} is **total**: it never throws. A diff it cannot
20
- * enumerate (git failure, missing ref, spawn error) yields
21
- * `{ files: null, enumerated: false }` — the neutral "diff unknown" signal that
22
- * `deriveChangeLevel` / `resolveDepth` already fail safe on (`standard` depth, a
23
- * `fresh` critic). `null` is deliberately distinct from `[]`: an empty array is
24
- * the *fact* that nothing changed, whereas `null` is the *absence* of evidence,
25
- * and only the latter must never buy a change less checking.
26
- *
27
- * The returned `files` are trimmed, de-duplicated, and sorted, so two consumers
28
- * comparing the same change set compare byte-identical lists. The refs the set
29
- * was computed against ride along on the envelope so a downstream consumer can
30
- * report (or assert) its provenance rather than re-deriving it.
6
+ * Total: an unenumerable diff yields `{ files: null, enumerated: false }`.
7
+ * `null` (no evidence) is distinct from `[]` (nothing changed) — only the
8
+ * former must never buy less checking. `files` is trimmed, de-duplicated and
9
+ * sorted.
31
10
  *
32
11
  * @typedef {{
33
12
  * baseRef: string,
@@ -42,9 +21,6 @@
42
21
  import { gitSpawn } from '../git-utils.js';
43
22
 
44
23
  /**
45
- * Trim, drop empties, de-duplicate, and sort raw `git diff --name-only` output.
46
- * Pure.
47
- *
48
24
  * @param {string} stdout
49
25
  * @returns {string[]}
50
26
  */
@@ -58,11 +34,6 @@ function normalizeFileList(stdout) {
58
34
  }
59
35
 
60
36
  /**
61
- * Compute the change set for the `baseRef...headRef` diff **once**, for every
62
- * consumer that needs to know what a Story touched.
63
- *
64
- * Total — never throws; see the module header for the `null` vs `[]` contract.
65
- *
66
37
  * @param {{
67
38
  * baseRef: string,
68
39
  * headRef: string,
@@ -1,10 +1,6 @@
1
1
  /**
2
- * compare.js — Phase 3 of the check-baselines pipeline (Story #2466).
3
- *
4
- * Owns the head-vs-base compare stage: scope resolution, base-baseline
5
- * read, per-kind classifier dispatch, and tolerance application.
6
- *
7
- * Extracted from `check-baselines.js` without behavior change.
2
+ * Head-vs-base compare stage of check-baselines: scope, base read, per-kind
3
+ * classifier, tolerance.
8
4
  *
9
5
  * @module lib/orchestration/check-baselines/phases/compare
10
6
  */
@@ -25,12 +21,9 @@ function baselineRelativePath(kind, gateBlock) {
25
21
  return configured ?? DEFAULT_BASELINE_PATHS[kind];
26
22
  }
27
23
 
28
- export function resolveDispatchScope({ kind, quality, env }) {
29
- const cfg = quality?.gateScoping ?? {};
24
+ export function resolveDispatchScope({ kind, env }) {
30
25
  return resolveScope({
31
26
  kind,
32
- configScope: cfg.scope,
33
- configRef: cfg.diffRef,
34
27
  envScope: env?.BASELINE_SCOPE,
35
28
  envRef: env?.BASELINE_REF,
36
29
  });
@@ -41,19 +34,8 @@ function emptyCompareResult(baseRef) {
41
34
  }
42
35
 
43
36
  /**
44
- * Story #4914 — a base read that FAILS is not a base that is ABSENT.
45
- *
46
- * `readBaseFromGit` already draws that line itself: it returns `null` only
47
- * for git exit 128 ("path does not exist in this revision") and throws on
48
- * everything else. Swallowing the throw conflated the two, so a broken read
49
- * silently emptied the whole head-vs-base arm — regressions AND additions —
50
- * while the floors arm kept the run at exit 0. A gate that fails open is
51
- * worse than no gate, because it is trusted.
52
- *
53
- * So the read failure fails CLOSED as `EXIT_CONFIG` (3) — "the gate could
54
- * not even start", the same code `assertFloorAxesExist` uses for a
55
- * misconfigured floor axis. `check-baselines.js#main` maps any throw out of
56
- * the pipeline onto that code.
37
+ * A failed base read is not an absent base: it fails closed as `EXIT_CONFIG`
38
+ * rather than silently emptying the compare arm to a trusted exit 0.
57
39
  */
58
40
  function buildBaseReadError({ kind, ref, file, cause }) {
59
41
  const detail = cause?.message ?? String(cause);
@@ -83,14 +65,7 @@ function readBaseBaselinePayload(scope, kind, gateBlock, cwd) {
83
65
  try {
84
66
  return JSON.parse(raw);
85
67
  } catch (cause) {
86
- // Story #5277 — the same distinction one line above, applied to the
87
- // second way a base read fails. `null` here means "no baseline at the base
88
- // ref", which empties the head-vs-base arm on purpose; an UNPARSEABLE base
89
- // blob is a read that failed, and reporting it as "no base" made a
90
- // corrupted or half-merged `baselines/*.json` on the base branch report
91
- // zero regressions at exit 0. Text-merged baselines are exactly how such a
92
- // blob gets onto the base branch, which is the failure this Story removes
93
- // upstream — this arm is what stops it being silent when it happens anyway.
68
+ // An unparseable (e.g. text-merged) base blob is a failed read too.
94
69
  throw buildBaseReadError({ kind, ref: scope.ref, file: rel, cause });
95
70
  }
96
71
  }
@@ -107,21 +82,9 @@ export async function evaluateCompare({ kind, gateBlock, scope, cwd }) {
107
82
  }
108
83
 
109
84
  /**
110
- * Is the base baseline comparable to the head baseline (Story #4775)?
111
- *
112
- * A kind can change its SCORING SEMANTICS — how it derives a row's metric —
113
- * without moving `kernelVersion`. Across that boundary the same row can carry
114
- * a different score for reasons that have nothing to do with the branch's
115
- * changes, so a head-vs-base diff manufactures phantom regressions (and can
116
- * hide real ones behind them).
117
- *
118
- * The head-side stamp is already a fail-closed gate: a stale HEAD baseline
119
- * never reaches this point. What reaches here is the opposite and legitimate
120
- * case — a branch that DOES carry a re-derived baseline, compared against a
121
- * base that predates the change. The only honest verdict is "no comparison";
122
- * floors still run, so a genuine ceiling breach is still caught, and once the
123
- * refreshed baseline is the base the ratchet returns to full strength on the
124
- * very next run without anything to remember to reset.
85
+ * Rows scored under different `scoringSemantics` are incomparable (phantom
86
+ * regressions), so a branch carrying a re-derived baseline skips compare
87
+ * against an older base; floors still run.
125
88
  */
126
89
  function baseIsComparable(headBaseline, basePayload) {
127
90
  const head = headBaseline?.scoringSemantics ?? null;
@@ -1,8 +1,6 @@
1
1
  /**
2
- * evaluate.js — Phase 4 of the check-baselines pipeline (Story #2466).
3
- *
4
- * Runs the per-kind pipeline: load → floor → compare → tolerance → report.
5
- * Extracted from `check-baselines.js` without behavior change.
2
+ * Per-kind check-baselines pipeline: load → floor → compare → tolerance →
3
+ * acknowledgment → report.
6
4
  *
7
5
  * @module lib/orchestration/check-baselines/phases/evaluate
8
6
  */
@@ -19,33 +17,13 @@ import { applyFloors, flattenBreaches } from './floors.js';
19
17
  import { applyRefreshAcknowledgment } from './refresh-ack.js';
20
18
 
21
19
  /**
22
- * Defense-in-depth against an `ignoreGlobs`-poisoned baseline (Epic #4326
23
- * incident). The generation path already drops `ignoreGlobs`-matched files
24
- * before they reach `rows` (both the canonical `buildDefaultMaintainabilityScorer`
25
- * and the story-close `buildKindScorer`), so a freshly-generated baseline's
26
- * `rollup["*"]` never includes an ignored file. But the floor check trusts the
27
- * *stored* `rollup["*"]`: if a baseline is poisoned by some other route — a
28
- * stale branch's older tooling, a hand-edit, a future generation bug — an
29
- * ignored file's metric can still drag the global floor axis (e.g.
30
- * maintainability `min`) below its floor and block every downstream close.
31
- *
32
- * This recomputes the global `*` aggregate over the baseline rows that are NOT
33
- * matched by the gate's `ignoreGlobs`, using the kind's own canonical
34
- * `rollup()` aggregator, so the floor axis reflects only the files the gate is
35
- * meant to police. It is a **no-op for a correctly-generated baseline** (no
36
- * ignored file is present in `rows`, so the filtered set is identical and the
37
- * stored `rollup["*"]` is returned unchanged) and only affects the `*`
38
- * component the incident poisons; named-component rollups are left as stored.
39
- * The compare/regression stage is untouched — this only reshapes the floor
40
- * input. All three `ignoreGlobs`-configured gates (maintainability, crap,
41
- * duplication) are `path`-keyed, so the shared path matcher applies uniformly.
42
- *
43
- * Kept module-local (not exported): the poison-exclusion behaviour is covered
44
- * end-to-end through `evaluateKind` by the `check-baselines.min-floor` suite,
45
- * so there is no external consumer to justify widening the surface.
20
+ * Recompute the `*` floor rollup without `ignoreGlobs` rows, in case a
21
+ * baseline was poisoned by some route other than generation (which already
22
+ * drops them); an ignored file could otherwise breach a global floor. A no-op
23
+ * for a correct baseline; compare is untouched.
46
24
  *
47
25
  * @param {{ kind: string, baseline: { rollup?: object, rows?: object[] }, ignoreGlobs?: string[], cwd?: string }} args
48
- * @returns {object} the effective rollup to feed the floor check
26
+ * @returns {object}
49
27
  */
50
28
  function rollupExcludingIgnored({ kind, baseline, ignoreGlobs, cwd }) {
51
29
  const rollup = baseline?.rollup;
@@ -64,8 +42,6 @@ function rollupExcludingIgnored({ kind, baseline, ignoreGlobs, cwd }) {
64
42
  const p = row?.path;
65
43
  return typeof p !== 'string' || !isIgnoredByGlobs(p, ignoreGlobs, cwd);
66
44
  });
67
- // Nothing ignored is present → the stored rollup already excludes ignored
68
- // files (the correct-baseline fast path); return it untouched.
69
45
  if (kept.length === rows.length) return rollup;
70
46
  const recomputed = mod.rollup(kept);
71
47
  return { ...rollup, '*': recomputed?.['*'] ?? rollup?.['*'] };
@@ -109,17 +85,11 @@ function buildGateReport({
109
85
  additions: compareOutput.additions ?? [],
110
86
  regressionCount: compareOutput.regressions.length,
111
87
  baseRef: cmp.baseRef ?? null,
112
- // Story #4914 — the compare arm's read status was internal to compare.js,
113
- // which is why a dead compare arm looked byte-identical to a clean run.
114
- // Surfacing it makes "the head-vs-base arm did not run" diagnosable from
115
- // the JSON report alone.
88
+ // Without this a compare arm that never ran looks identical to a clean run.
116
89
  baseRead: cmp.baseRead === true,
117
90
  generatedAt: baseline.generatedAt,
118
91
  acknowledged: ack.acknowledged,
119
- // Story #5179 — `acknowledged` is now a PARTIAL statement: a refresh commit
120
- // clears only the rows it actually refreshed, so a run can acknowledge some
121
- // regressions and still fail on others. Naming the acknowledged keys makes
122
- // which-half-was-which readable from the JSON report without re-walking git.
92
+ // Acknowledgment can be partial; name which regressions it cleared.
123
93
  acknowledgedKeys: ack.acknowledgedKeys,
124
94
  };
125
95
  }
@@ -135,11 +105,8 @@ export async function evaluateKind({
135
105
  const headLoad = loadHeadBaseline(kind, cwd, configPath);
136
106
  if (headLoad.schemaError) return { kind, schemaError: headLoad.schemaError };
137
107
  const baseline = headLoad.baseline;
138
- // Story #4775 — scoring-semantics gate. A baseline whose rows were produced
139
- // by superseded scoring semantics is structurally valid but semantically
140
- // incomparable, so schema validation alone would wave it through. Fail
141
- // closed on the `semantics` tag rather than compare across the boundary;
142
- // the message names the exact re-baseline command.
108
+ // Rows from superseded scoring semantics pass schema but are incomparable;
109
+ // fail closed.
143
110
  const semanticsError = checkBaselineSemantics(kind, baseline);
144
111
  if (semanticsError) {
145
112
  return {
@@ -1,9 +1,5 @@
1
1
  /**
2
- * floors.js — Phase 2 of the check-baselines pipeline (Story #2466).
3
- *
4
- * Pure floor-comparison helpers. Extracted verbatim from `check-baselines.js`
5
- * so `compareToFloor`, `assertFloorAxesExist`, and `applyFloors` keep their
6
- * named-export contracts for the existing unit tests.
2
+ * Pure floor-comparison helpers for check-baselines.
7
3
  *
8
4
  * @module lib/orchestration/check-baselines/phases/floors
9
5
  */
@@ -11,11 +7,7 @@
11
7
  import { EXIT_CONFIG } from '../../../baselines/exit-codes.js';
12
8
 
13
9
  /**
14
- * Which way a floor axis is compared: `gte` means the measured value must be
15
- * at or above the floor, `lte` at or below it. Exported (Story #4902) so the
16
- * baseline hotspot engine reports floor headroom with the same polarity the
17
- * gate enforces — a second copy of this table would let the two disagree
18
- * about which direction is "better" for a given axis.
10
+ * Floor polarity per axis; the single table every consumer must share.
19
11
  *
20
12
  * @param {string} kind
21
13
  * @param {string} axis
@@ -33,10 +25,7 @@ export function axisDirection(kind, axis) {
33
25
  return 'gte';
34
26
  }
35
27
 
36
- /**
37
- * Compare a single rollup component against a single floor object. Returns
38
- * the array of axis violations (empty when every axis meets its floor).
39
- */
28
+ /** Axis violations of one rollup component against its floor. */
40
29
  export function compareToFloor(kind, aggregate, floor) {
41
30
  const out = [];
42
31
  if (!floor || typeof floor !== 'object') return out;
@@ -52,10 +41,6 @@ export function compareToFloor(kind, aggregate, floor) {
52
41
  return out;
53
42
  }
54
43
 
55
- /**
56
- * Tiny helper to suggest the closest available axis when an operator
57
- * misnamed a floor axis. Substring containment is enough.
58
- */
59
44
  function suggestAxis(unknownAxis, availableKeys) {
60
45
  if (availableKeys.length === 0) return null;
61
46
  const target = unknownAxis.toLowerCase();
@@ -85,9 +70,8 @@ function buildAxisMismatchError({ kind, component, axis, availableKeys }) {
85
70
  }
86
71
 
87
72
  /**
88
- * Story #2193 / AC-6: fail closed when a configured floor axis is not
89
- * present in the rollup. See the original module docstring for the full
90
- * rationale (typo in `.agentrc.json` → exit code 3 instead of silent pass).
73
+ * Fail closed (exit 3) on a floor axis absent from the rollup, so a config
74
+ * typo never silently passes.
91
75
  */
92
76
  export function assertFloorAxesExist(kind, component, aggregate, floor) {
93
77
  if (!floor || typeof floor !== 'object') return;
@@ -119,9 +103,6 @@ function evaluateComponentFloor(kind, component, rollup, floors) {
119
103
  return { component, violations };
120
104
  }
121
105
 
122
- /**
123
- * Apply the floor policy across every component in a rollup. Pure.
124
- */
125
106
  export function applyFloors(kind, rollup, floors) {
126
107
  const out = [];
127
108
  for (const component of collectComponentNames(rollup, floors)) {
@@ -1,16 +1,7 @@
1
1
  /**
2
- * friction.js — Phase 5 of the check-baselines pipeline (Story #2466).
3
- *
4
- * Centralised friction emission. The dispatcher is the single emission
5
- * site: per (kind, severity) tuple, exactly one friction event with the
6
- * canonical payload `{tool:'check-baselines', kind, severity, file?,
7
- * method?, delta?, baseRef}`.
8
- *
9
- * Severities:
10
- * - `floor` — at least one floor breach.
11
- * - `regression` — at least one head-vs-base regression.
12
- * - `schema` — head baseline failed schema validation / read.
13
- * - `kernel-mismatch` — baseline kernelVersion ≠ running kernel.
2
+ * The single check-baselines friction emission site: exactly one event per
3
+ * (kind, severity), severity one of `floor | regression | schema |
4
+ * kernel-mismatch`.
14
5
  *
15
6
  * @module lib/orchestration/check-baselines/phases/friction
16
7
  */