mandrel 2.60.0 → 2.61.0

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