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
- * merge-envelopes.js — pure 3-way merge of baseline envelopes by row
3
- * identity (Story #5215).
2
+ * Pure 3-way merge of baseline envelopes by row identity. A line-based git
3
+ * merge either conflicts on disjoint work (the `generatedAt` line) or splices
4
+ * both sides into a row set no scorer produced.
4
5
  *
5
- * ## Why this exists
6
- *
7
- * Every baseline write stamps `generatedAt`, and the stamp sits on line 4 of
8
- * every envelope. Two branches that each refresh a baseline therefore always
9
- * differ on that line, even when they moved completely disjoint rows — so
10
- * git's LINE-based merge has to reconcile it. Whether it can separate that
11
- * hunk from the moved rows is an accident of proximity, and both outcomes
12
- * are bad:
13
- *
14
- * - it cannot → a conflict on work that never actually overlapped;
15
- * - it can → it splices both sides' row lines together into a row set
16
- * NEITHER side ever scored. That silent one is the worse failure: the
17
- * ratchet then guards a number no scorer produced.
18
- *
19
- * A baseline is not a text file. It is a set of rows keyed by identity plus
20
- * a rollup DERIVED from those rows, so merging it as text is a category
21
- * error. This module merges it as what it is.
22
- *
23
- * ## Contract
24
- *
25
- * Pure: no filesystem, no process, no clock. `assertEnvelope` is deliberately
26
- * NOT called here (it compiles schemas off disk on first use) — the driver
27
- * validates what this returns.
28
- *
29
- * Per row identity, the standard 3-way rule: the side that differs from base
30
- * wins; when both sides differ from base AND from each other, that identity
31
- * is a conflict. Absence is a value, so a row deleted on one side and
32
- * untouched on the other merges to deleted.
33
- *
34
- * Two invariants are load-bearing:
35
- *
36
- * 1. **The rollup is recomputed, never merged.** Merging two rollups is
37
- * the same splice hazard compressed into a single number, and unlike a
38
- * spliced row set it leaves no evidence. It is always derived from the
39
- * merged rows via the kind's own `rollup()`.
40
- * 2. **Identity comes from the kind module** (`rowIdentity`), never from
41
- * `keyField`. CRAP groups by file and identifies by method; keying on
42
- * `keyField` would drop every method in a file but one.
6
+ * Per identity the side that differs from base wins; both differing is a
7
+ * conflict; absence is a value. The rollup is always recomputed from the
8
+ * merged rows, never merged. Identity comes from the kind's `rowIdentity`,
9
+ * never `keyField`. No I/O: the driver validates the result.
43
10
  *
44
11
  * @module lib/baselines/merge-envelopes
45
12
  */
@@ -48,22 +15,11 @@ import { deepEqual } from '../json-utils.js';
48
15
  import { KNOWN_KINDS } from './envelope.js';
49
16
  import { getKindModule } from './kernel.js';
50
17
 
51
- /**
52
- * Envelope keys that are NOT merged side-by-side: `rows` merge by identity,
53
- * `rollup` is recomputed from them, and `generatedAt` resolves to the later
54
- * of the two stamps rather than conflicting (it is metadata about when a
55
- * scorer ran, not a scored value — treating it as content is the whole bug).
56
- */
18
+ /** Keys not merged 3-way: rows by identity, rollup derived, stamp = later. */
57
19
  const DERIVED_KEYS = Object.freeze(['rows', 'rollup', 'generatedAt']);
58
20
 
59
21
  /**
60
- * Identify an envelope's kind from its `$schema` reference.
61
- *
62
- * Derived from `KNOWN_KINDS` rather than pattern-matched, so a file that is
63
- * not a known per-kind envelope answers `null` — which is how the driver
64
- * knows to hand it back to git's text merge instead of guessing at a shape
65
- * it does not understand. `baselines/*.json` also matches several
66
- * non-envelope baselines (arch-cycles, cyclomatic, dead-exports, …).
22
+ * Kind from `$schema`, or `null` for anything not a known per-kind envelope.
67
23
  *
68
24
  * @param {unknown} envelope
69
25
  * @returns {string|null}
@@ -79,8 +35,7 @@ export function kindFromEnvelope(envelope) {
79
35
  }
80
36
 
81
37
  /**
82
- * The 3-way choice for one value. `undefined` means "absent on this side",
83
- * which makes deletion just another value rather than a special case.
38
+ * `undefined` = absent on that side, so deletion is just another value.
84
39
  *
85
40
  * @param {unknown} base
86
41
  * @param {unknown} ours
@@ -95,10 +50,7 @@ function choose(base, ours, theirs) {
95
50
  }
96
51
 
97
52
  /**
98
- * Index rows by the kind's `rowIdentity`. A duplicate identity within one
99
- * side is fatal rather than last-write-wins: it means the incoming file
100
- * already violates the identity contract, and merging it would silently
101
- * drop a row.
53
+ * A duplicate identity on one side throws; last-write-wins would drop a row.
102
54
  *
103
55
  * @param {Array<object>} rows
104
56
  * @param {(row: object) => string} rowIdentity
@@ -125,10 +77,6 @@ function indexRows(rows, rowIdentity, side) {
125
77
  }
126
78
 
127
79
  /**
128
- * Resolve `generatedAt` to the later of the two sides. A stamp is metadata,
129
- * so it never conflicts: the merged file describes a tree scored as recently
130
- * as the newer of its inputs.
131
- *
132
80
  * @param {string|undefined} ours
133
81
  * @param {string|undefined} theirs
134
82
  * @returns {string|undefined}
@@ -143,10 +91,8 @@ function laterStamp(ours, theirs) {
143
91
  }
144
92
 
145
93
  /**
146
- * Merge the envelope-level stamps (`$schema`, `kernelVersion`, and per-kind
147
- * extras like `scoringSemantics`) by the same 3-way rule as rows. A double
148
- * bump to different values is a genuine conflict — two branches disagreeing
149
- * about which scorer produced the file.
94
+ * 3-way merge of envelope stamps; a double bump to different values is a
95
+ * real conflict (two scorers).
150
96
  *
151
97
  * @param {object} base
152
98
  * @param {object} ours
@@ -180,11 +126,6 @@ function mergeStamps(base, ours, theirs) {
180
126
  }
181
127
 
182
128
  /**
183
- * The row half of a 3-way merge, shared by the envelope path and the plain
184
- * row-baseline path below. Both merge a set of rows keyed by identity against
185
- * a common ancestor; they differ only in where the identity comes from and in
186
- * what they assemble around the result.
187
- *
188
129
  * @param {{
189
130
  * baseEnv: object,
190
131
  * ours: object|null|undefined,
@@ -218,8 +159,7 @@ function mergeRowSets({ baseEnv, ours, theirs, rowIdentity }) {
218
159
  ours: o,
219
160
  theirs: t,
220
161
  });
221
- // Keep the ours-side value so the row set stays well-formed; the
222
- // driver renders the conflict markers around it from this record.
162
+ // Keep ours so the row set stays well-formed; the driver adds markers.
223
163
  if (o !== undefined) rows.push(o);
224
164
  else if (t !== undefined) rows.push(t);
225
165
  continue;
@@ -230,7 +170,8 @@ function mergeRowSets({ baseEnv, ours, theirs, rowIdentity }) {
230
170
  }
231
171
 
232
172
  /**
233
- * 3-way merge two baseline envelopes against their common ancestor.
173
+ * `base` is `null` when the file was added on both sides. `components`
174
+ * defaults to `[]`, matching what a refresh writes.
234
175
  *
235
176
  * @param {{
236
177
  * base: object|null,
@@ -239,11 +180,6 @@ function mergeRowSets({ baseEnv, ours, theirs, rowIdentity }) {
239
180
  * kind?: string,
240
181
  * components?: Array<object>,
241
182
  * }} params
242
- * - `base` — the merge ancestor; `null` (or a rowless object) when the
243
- * file was added on both sides.
244
- * - `components` — passed straight to the kind's `rollup()`. Defaults to
245
- * `[]`, which is what `refreshBaseline` effectively uses, so a merged
246
- * envelope carries the same `{'*': …}` rollup shape a refresh writes.
247
183
  * @returns {{
248
184
  * kind: string,
249
185
  * envelope: object,
@@ -296,14 +232,8 @@ export function mergeEnvelopes({
296
232
  }
297
233
 
298
234
  /**
299
- * Emit the object's keys in a declared order, then anything left over.
300
- *
301
- * The invariant this serves is "a clean driver merge stays byte-identical to
302
- * a regeneration": both generators below write
303
- * `JSON.stringify(envelope, null, 2)`, which preserves insertion order, so a
304
- * merged file whose keys are in a different order than the generator's is a
305
- * spurious diff on every subsequent refresh. Unknown keys are appended rather
306
- * than dropped — a merge is never the place to lose a field.
235
+ * Declared key order, then leftovers (never dropped), so a clean merge stays
236
+ * byte-identical to the generator's insertion-ordered output.
307
237
  *
308
238
  * @param {object} obj
309
239
  * @param {string[]} order
@@ -321,15 +251,9 @@ function orderKeys(obj, order) {
321
251
  }
322
252
 
323
253
  /**
324
- * Derive `cyclomatic`'s rollup from its merged rows — the same arithmetic
325
- * `cyclomatic-ceiling.js#buildCyclomaticEnvelope` applies at generation time.
326
- *
327
- * Deriving rather than merging matters more here than anywhere: the rollup is
328
- * three counts over the whole row set, so two branches that each add one row
329
- * BOTH write `filesAboveCeiling: n + 1`. A 3-way merge sees two identical
330
- * values and resolves them clean — to a number that is wrong by one, with no
331
- * conflict and no evidence. That is the silent splice this module exists to
332
- * refuse, compressed into a single field.
254
+ * Same arithmetic as `buildCyclomaticEnvelope`. Must be derived: two branches
255
+ * each adding a row both write `n + 1`, which a 3-way merge resolves cleanly
256
+ * and wrongly.
333
257
  *
334
258
  * @param {Array<object>} rows
335
259
  * @returns {{ '*': { filesAboveCeiling: number, methodsAboveCeiling: number, maxCyclomatic: number } }}
@@ -352,23 +276,8 @@ function cyclomaticRollup(rows) {
352
276
  }
353
277
 
354
278
  /**
355
- * Baselines that are row sets but NOT per-kind envelopes (Story #5277).
356
- *
357
- * `baselines/*.json` matches more than the eight kernel kinds. Three of the
358
- * extras are row sets with a real identity, and before this registry the
359
- * driver handed all three straight back to `git merge-file` — so `.gitattributes`
360
- * declared them driver-merged while they were still text-merged, with exactly
361
- * the two failure modes the driver replaces. `dead-exports*.json` in particular
362
- * is a long, uniform list of two-key objects: the shape git splices most
363
- * happily and least visibly.
364
- *
365
- * `rollup: null` is a genuine absence, not an omission — the dead-export
366
- * generator writes no rollup key at all, so deriving one would invent a field
367
- * the checker never reads and the generator would strip on the next refresh.
368
- * `cyclomatic` does carry one, and derives it (see {@link cyclomaticRollup}).
369
- *
370
- * `keyOrder` mirrors each generator's own insertion order; see
371
- * {@link orderKeys}.
279
+ * Row-set baselines that are not per-kind envelopes. `rollup: null` is real:
280
+ * the dead-export generator writes none. `keyOrder` mirrors each generator.
372
281
  */
373
282
  const PLAIN_BASELINE_KINDS = Object.freeze({
374
283
  cyclomatic: Object.freeze({
@@ -398,11 +307,8 @@ const PLAIN_SCHEMA_KINDS = Object.freeze({
398
307
  });
399
308
 
400
309
  /**
401
- * Identify a plain row baseline from its `$schema`, or `null`.
402
- *
403
- * The production dead-export pass reports as its own kind so the regenerate
404
- * remedy can name the right command, even though the two share a schema and
405
- * merge identically.
310
+ * The production dead-export pass reports as its own kind so the remedy
311
+ * names the right command.
406
312
  *
407
313
  * @param {unknown} envelope
408
314
  * @returns {string|null}
@@ -417,7 +323,6 @@ export function plainKindFromEnvelope(envelope) {
417
323
  return kind;
418
324
  }
419
325
 
420
- /** The merge spec for a plain kind, collapsing the two dead-export passes. */
421
326
  function plainSpec(kind) {
422
327
  return PLAIN_BASELINE_KINDS[
423
328
  kind === 'dead-exports-production' ? 'dead-exports' : kind
@@ -425,11 +330,7 @@ function plainSpec(kind) {
425
330
  }
426
331
 
427
332
  /**
428
- * 3-way merge a plain row baseline by row identity.
429
- *
430
- * Same contract as {@link mergeEnvelopes} — rows merge by identity, stamps
431
- * merge 3-way, `generatedAt` resolves to the later of the two — minus the
432
- * kernel protocol these kinds do not participate in.
333
+ * Same contract as {@link mergeEnvelopes}, without the kernel protocol.
433
334
  *
434
335
  * @param {{ base: object|null, ours: object, theirs: object, kind?: string }} params
435
336
  * @returns {{ kind: string, envelope: object, conflicts: Array<object> }}
@@ -472,7 +373,6 @@ export function mergePlainBaseline({ base, ours, theirs, kind } = {}) {
472
373
  };
473
374
  }
474
375
 
475
- /** Per-kind regeneration commands; anything unlisted follows the convention. */
476
376
  const REGENERATE_COMMANDS = Object.freeze({
477
377
  'dead-exports': 'npm run dead-exports:update',
478
378
  'dead-exports-production': 'npm run dead-exports:update',
@@ -480,14 +380,8 @@ const REGENERATE_COMMANDS = Object.freeze({
480
380
  });
481
381
 
482
382
  /**
483
- * The command that re-derives a baseline from the tree.
484
- *
485
- * A conflicted merge leaves the rollup describing a row set nobody scored:
486
- * the driver derives it from rows that still carry conflict markers around
487
- * them, and no hand-resolution of those markers updates it. Resolving the
488
- * rows is therefore only half the job, and the half operators skip — so the
489
- * driver says the other half out loud rather than leaving a plausible-looking
490
- * number behind.
383
+ * After a conflicted merge, hand-resolving rows never updates the rollup, so
384
+ * the driver must name the regeneration command.
491
385
  *
492
386
  * @param {string} kind
493
387
  * @returns {string}
@@ -497,18 +391,8 @@ export function baselineRegenerateRemedy(kind) {
497
391
  }
498
392
 
499
393
  /**
500
- * Wrap each conflicted envelope-level stamp in git conflict markers.
501
- *
502
- * Envelope conflicts used to be reported on stderr alone, and the file was
503
- * left holding the ours-side value with no marker in it. Git reads the
504
- * driver's non-zero exit as "conflicted" and leaves the path unmerged, so the
505
- * operator opens a file that looks cleanly merged and has to reconstruct from
506
- * a scrollback line which stamp disagreed. A `kernelVersion` double-bump is
507
- * exactly the case where the two sides mean different scorers and picking one
508
- * silently is wrong.
509
- *
510
- * Operates on the canonical text the merged projection already produced, so
511
- * every unconflicted line stays byte-identical to a clean merge.
394
+ * Wrap each conflicted stamp in git conflict markers so the unmerged file
395
+ * shows which stamp disagreed. Unconflicted lines stay byte-identical.
512
396
  *
513
397
  * @param {string} text Canonical serialization of the merged envelope.
514
398
  * @param {Array<{ identity: string, ours?: unknown, theirs?: unknown }>} conflicts
@@ -1,49 +1,9 @@
1
1
  /**
2
- * path-canon.js — single canonicalisation authority for every path written
3
- * into (or compared against) a Mandrel baseline (Story #1891, Epic #1786).
4
- *
5
- * This module is the one place baseline path canonicalisation lives. It
6
- * exposes three helpers tuned to two boundaries (Story #3345 folded the
7
- * formerly separate `canonicalize-path.js` permissive coercer in here so
8
- * there is a single import surface):
9
- *
10
- * - `canonicalise(p)` — the **strict** repo-relative canonicaliser. It
11
- * rejects input it considers unsafe to key a baseline by, then
12
- * normalises what it accepts.
13
- * - `assertCanonical(p)` — the **throw-on-reject** writer-boundary check.
14
- * It runs the same rejection checks as `canonicalise` but never
15
- * transforms the input.
16
- * - `canonicalizeBaselinePath(p)` — the **permissive coercer** used by the
17
- * refresh service. It never throws on absolute / drive-letter / UNC
18
- * input; instead it transforms those shapes into a repo-relative key,
19
- * because its caller funnels raw `git diff` and tool output through a
20
- * single point that must always yield a canonical key.
21
- *
22
- * `canonicalise` enforces, in order:
23
- *
24
- * 1. Rejects absolute paths (Windows `C:\...` or POSIX `/...`) — baselines
25
- * that key by absolute paths break the moment they're checked out on a
26
- * different machine, in a worktree, or in CI.
27
- * 2. Rejects `..` segments — baselines must not name files outside the
28
- * repo root, and the loader's signed-int comparison can otherwise be
29
- * fooled by a traversal-shaped key.
30
- * 3. Strips a leading `.worktrees/<workspace>/` prefix so a refresh run
31
- * from inside `.worktrees/story-1891/...` produces the same key as a
32
- * refresh from the main checkout. This is the defensive policy that
33
- * stops a future worktree-based refresh from reintroducing the
34
- * maintainability worktree-prefix regression that prompted Story #1891.
35
- * 4. Normalises Windows backslashes to forward slashes.
36
- * 5. Strips a leading `./` for cosmetic stability — `./src/a.js` and
37
- * `src/a.js` are the same path and should serialise to the same key.
38
- *
39
- * Both `canonicalise` and `canonicalizeBaselinePath` are **idempotent**:
40
- * feeding either function's output back in produces the same string. Tests
41
- * pin this property explicitly.
42
- *
43
- * `assertCanonical` is the throw-on-reject variant. It runs the same checks
44
- * but does not transform the input — used at the writer boundary to assert
45
- * a row's `path` has already been canonicalised by the caller (so the writer
46
- * never silently rewrites a row's identity).
2
+ * The single authority for baseline path keys: `canonicalise` (strict,
3
+ * rejects absolute and `..` paths), `assertCanonical` (writer-boundary check,
4
+ * never transforms), and `canonicalizeBaselinePath` (permissive, coerces raw
5
+ * tool output). All strip a leading `.worktrees/<workspace>/` so worktree and
6
+ * main-checkout refreshes key identically. Both transformers are idempotent.
47
7
  *
48
8
  * @module lib/baselines/path-canon
49
9
  */
@@ -51,9 +11,7 @@
51
11
  const WORKTREE_PREFIX = /^\.worktrees\/[^/\\]+[/\\]/;
52
12
 
53
13
  /**
54
- * Test whether `value` is a Windows or POSIX absolute path. Windows absolute
55
- * paths have a drive letter (`C:`) or start with a backslash-separator
56
- * (`\\server\share`). POSIX absolute paths start with a forward slash.
14
+ * Windows or POSIX absolute (including drive-relative `C:foo`).
57
15
  *
58
16
  * @param {string} value
59
17
  * @returns {boolean}
@@ -61,16 +19,12 @@ const WORKTREE_PREFIX = /^\.worktrees\/[^/\\]+[/\\]/;
61
19
  function isAbsolute(value) {
62
20
  if (value.startsWith('/')) return true;
63
21
  if (value.startsWith('\\')) return true;
64
- // Drive-letter form: `C:\...` or `C:/...` or even bare `C:foo` (rare but
65
- // still absolute in Windows semantics — refuse it).
66
22
  if (/^[A-Za-z]:[\\/]?/.test(value)) return true;
67
23
  return false;
68
24
  }
69
25
 
70
26
  /**
71
- * Test whether `value` contains a `..` segment. We tokenise on both `/` and
72
- * `\` so a Windows-shaped path like `src\..\evil.js` is caught before
73
- * normalisation rewrites the separators.
27
+ * Splits on both separators so `src\..\x` is caught before normalisation.
74
28
  *
75
29
  * @param {string} value
76
30
  * @returns {boolean}
@@ -81,12 +35,8 @@ function hasTraversal(value) {
81
35
  }
82
36
 
83
37
  /**
84
- * Canonicalise a path for use as a baseline row key.
85
- *
86
- * @param {string} input A repo-relative path. May use `\` or `/` separators
87
- * and may carry a leading `./` or
88
- * `.worktrees/<workspace>/` prefix.
89
- * @returns {string} The canonical, forward-slash, repo-relative form.
38
+ * @param {string} input A repo-relative path.
39
+ * @returns {string}
90
40
  * @throws {TypeError} When `input` is not a string.
91
41
  * @throws {Error} When `input` is absolute or contains a `..` segment.
92
42
  */
@@ -110,22 +60,12 @@ export function canonicalise(input) {
110
60
  );
111
61
  }
112
62
 
113
- // 1. Normalise separators first so the worktree-prefix regex sees a
114
- // forward-slash form regardless of platform.
115
63
  let working = input.replace(/\\/g, '/');
116
64
 
117
- // 2. Strip `.worktrees/<workspace>/` prefix (defensive policy — see
118
- // module preamble).
119
65
  working = working.replace(WORKTREE_PREFIX, '');
120
66
 
121
- // 3. Strip a leading `./` after worktree-prefix removal so
122
- // `./.worktrees/story-1/src/a.js` and `.worktrees/story-1/src/a.js`
123
- // converge.
124
67
  if (working.startsWith('./')) working = working.slice(2);
125
68
 
126
- // 4. Collapse any accidental double-slashes introduced by upstream
127
- // string concat — leaves leading `/` alone since we've already
128
- // rejected absolute paths.
129
69
  working = working.replace(/\/{2,}/g, '/');
130
70
 
131
71
  if (working.length === 0) {
@@ -138,10 +78,8 @@ export function canonicalise(input) {
138
78
  }
139
79
 
140
80
  /**
141
- * Assert that `input` is already in canonical form. Throws on any deviation;
142
- * never transforms the input. Used at the writer boundary as a defensive
143
- * check that callers have funnelled their rows through `canonicalise` before
144
- * handing them to `write()`.
81
+ * Throw unless `input` is already canonical, so the writer never silently
82
+ * rewrites a row's identity.
145
83
  *
146
84
  * @param {string} input
147
85
  * @returns {void}
@@ -189,46 +127,12 @@ export function assertCanonical(input) {
189
127
  }
190
128
 
191
129
  /**
192
- * Permissively coerce a raw filesystem path into the POSIX, repo-relative
193
- * key shape used by the Unified Baseline Refresh Service (Story #2192,
194
- * Epic #2173). Unlike `canonicalise`, this helper never throws on absolute,
195
- * drive-letter, or UNC input — it transforms those shapes into a
196
- * repo-relative key because its caller (the refresh service) receives raw
197
- * paths from `git diff` and tool output and needs a single funnel that
198
- * always produces a canonical key.
199
- *
200
- * Rules, in order:
201
- * 1. Reject non-string input with `TypeError`.
202
- * 2. Swap every `\` for `/` so the rest of the pipeline sees a single
203
- * separator style regardless of platform.
204
- * 3. Strip a UNC prefix (`//server/share/`) so paths surfaced by tools
205
- * that resolved a network share collapse to a repo-relative key.
206
- * 4. Strip a Windows drive-letter prefix (`C:` / `C:/`) so paths
207
- * surfaced by Windows tools collapse to the same key as the
208
- * equivalent Linux path.
209
- * 5. Strip a single leading `/` so a path that was absolute after
210
- * drive-letter stripping becomes repo-relative.
211
- * 6. Strip a leading `.worktrees/<workspace>/` prefix so a refresh run
212
- * from inside a worktree produces the same key as a refresh from the
213
- * main checkout. This MUST match the equivalent step in
214
- * `canonicalise()` (Story #3695): the strict canonicaliser used by the
215
- * per-kind `projectRow` strips this prefix, so the permissive coercer
216
- * that builds the diff-scope `scope.files` set MUST strip it too —
217
- * otherwise a scored row's path (`src/new.js`) never matches its
218
- * worktree-prefixed scope entry (`.worktrees/story-1/src/new.js`) and
219
- * a brand-new file's row is silently dropped from the scoped baseline.
220
- * 7. Strip a leading `./` for cosmetic stability.
221
- * 8. Collapse any `/{2,}` run to a single `/`.
222
- *
223
- * The function is **idempotent**: feeding its own output back in produces
224
- * the same string. Downstream consumers (the refresh service and the gate
225
- * reader) rely on this property so a row written on Windows compares equal
226
- * to the same row written on Linux.
130
+ * Coerce raw `git diff` / tool output into a repo-relative key; never throws
131
+ * on absolute, drive-letter or UNC input. Idempotent, so Windows and Linux
132
+ * rows compare equal.
227
133
  *
228
- * @param {string} input A raw filesystem path. May use `\` or `/`
229
- * separators, may carry a Windows drive letter, may
230
- * be absolute or relative.
231
- * @returns {string} The canonical, forward-slash, repo-relative key.
134
+ * @param {string} input A raw filesystem path.
135
+ * @returns {string}
232
136
  * @throws {TypeError} When `input` is not a string.
233
137
  */
234
138
  export function canonicalizeBaselinePath(input) {
@@ -238,41 +142,28 @@ export function canonicalizeBaselinePath(input) {
238
142
  );
239
143
  }
240
144
 
241
- // 1. Normalize separators first.
242
145
  let working = input.replace(/\\/g, '/');
243
146
 
244
- // 2. Strip UNC share prefix (`//server/share/...`) before generic
245
- // double-slash collapse so the share name is preserved as a regular
246
- // path segment, not eaten.
147
+ // Before the double-slash collapse, which would eat the UNC prefix.
247
148
  const uncMatch = working.match(/^\/\/([^/]+)\/([^/]+)(\/|$)/);
248
149
  if (uncMatch) {
249
150
  working = working.slice(uncMatch[0].length);
250
151
  }
251
152
 
252
- // 3. Strip Windows drive-letter prefix (`C:` or `C:/`).
253
153
  working = working.replace(/^[A-Za-z]:\/?/, '');
254
154
 
255
- // 4. Strip a single leading `/` so an absolute path becomes
256
- // repo-relative.
257
155
  if (working.startsWith('/')) {
258
156
  working = working.replace(/^\/+/, '');
259
157
  }
260
158
 
261
- // 5. Strip a leading `.worktrees/<workspace>/` prefix (Story #3695) so a
262
- // worktree-rooted path collapses to the same repo-relative key the
263
- // strict `canonicalise()` produces. Without this, a scored row path and
264
- // its diff-scope `scope.files` entry diverge inside a worktree and the
265
- // scope-aware merge drops brand-new files. Only a single leading
266
- // segment is stripped — a legitimate inner `.worktrees/` directory the
267
- // user named themselves is preserved (mirrors `canonicalise`).
159
+ // Must match `canonicalise`, or scope entries miss their rows inside a
160
+ // worktree and the scoped merge drops brand-new files.
268
161
  working = working.replace(WORKTREE_PREFIX, '');
269
162
 
270
- // 6. Strip a leading `./`.
271
163
  if (working.startsWith('./')) {
272
164
  working = working.slice(2);
273
165
  }
274
166
 
275
- // 7. Collapse redundant separators.
276
167
  working = working.replace(/\/{2,}/g, '/');
277
168
 
278
169
  return working;
@@ -1,20 +1,7 @@
1
1
  /**
2
- * preview-gates.js — `quality-preview` / `quality-watch` per-kind runners.
3
- *
4
- * Hoisted from the per-kind CLI shells (Story #1981, Task #2005) so the
5
- * quality-preview surface no longer depends on the to-be-deleted
6
- * `check-maintainability.js` and `check-crap.js` CLI scripts. Each
7
- * exported runner takes a parsed scope ref + an optional `--staged`
8
- * flag, runs the same scan → compare → report-builder pipeline the CLIs
9
- * used internally, and returns:
10
- *
11
- * {
12
- * exitCode, // 0 = pass, 1 = regression / floor break
13
- * envelope, // the same `--json` envelope the CLI emitted
14
- * }
15
- *
16
- * No I/O beyond the scan itself; no friction signals (preview is a
17
- * developer-facing tool, not a gate); no `process.exit`.
2
+ * `quality-preview` / `quality-watch` per-kind runners: scan, compare, and
3
+ * return `{ exitCode, envelope }` (1 = regression or floor break). No
4
+ * friction signals and no `process.exit`.
18
5
  */
19
6
 
20
7
  import path from 'node:path';
@@ -36,21 +23,11 @@ import {
36
23
  MAINTAINABILITY_EXCLUSIONS,
37
24
  } from './kinds/maintainability.js';
38
25
 
39
- /**
40
- * Framework default MI preview tolerance, used only when neither an explicit
41
- * override nor a configured `quality.maintainability.tolerance` is present.
42
- * Mirrors the historical preview default.
43
- */
44
26
  export const MI_PREVIEW_DEFAULT_TOLERANCE = 0.5;
45
27
 
46
28
  /**
47
- * Resolve the effective maintainability tolerance for the preview gate so it
48
- * agrees with the authoritative `check-baselines` gate. Precedence: an explicit
49
- * caller override → the configured `quality.maintainability.tolerance` (already
50
- * resolved to a scalar by `getQuality`) → the framework default. Previously the
51
- * preview hardcoded the default and ignored the configured value, so a project
52
- * that raised its tolerance (e.g. to 12) still saw the local pre-commit/pre-push
53
- * gate flag sub-tolerance drops that `check-baselines` accepted.
29
+ * Explicit override, then configured tolerance, then the default — so the
30
+ * preview agrees with `check-baselines`.
54
31
  *
55
32
  * @param {{ explicit?: number | null, configured?: number, fallback?: number }} opts
56
33
  * @returns {number}
@@ -193,8 +170,7 @@ export async function runMaintainabilityPreview({
193
170
  });
194
171
 
195
172
  const rawScores = await calculateAll(scopedFiles);
196
- // Story #2467 / Task #2494: drop parse-unscorable files so they cannot
197
- // surface as phantom MI=0 regressions in the preview envelope.
173
+ // Excluded files would surface as phantom MI=0 regressions.
198
174
  const scores = {};
199
175
  for (const [key, mi] of Object.entries(rawScores)) {
200
176
  const rel = path.isAbsolute(key) ? path.relative(cwd, key) : key;
@@ -237,13 +213,8 @@ export async function runCrapPreview({
237
213
  return { exitCode: 0, envelope: emptyCrapEnvelope({ scope, diffRef }) };
238
214
  }
239
215
 
240
- // Story #4866 (AC-6): judge the loaded envelope BEFORE comparing anything
241
- // against it. A baseline whose scoring semantics or transpiler coordinates
242
- // predate the running scorer cannot yield a meaningful per-method verdict,
243
- // and emitting regressions from it asks the operator to fix code that is
244
- // not broken. Fail open — the authoritative `check-baselines` gate still
245
- // gates the merge, so a permissive pre-commit hook costs no real coverage
246
- // while a blocking one costs a provably defect-free commit.
216
+ // An incompatible baseline yields no meaningful verdict. Fail open:
217
+ // `check-baselines` still gates the merge.
247
218
  const incompatible = assertBaselineCompatible(baseline);
248
219
  if (incompatible) {
249
220
  return {