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,46 +1,21 @@
1
1
  /**
2
- * bdd-scenario-budget.js — envelope byte budget for the `bddScenarios`
3
- * `/mandrel-plan` context-envelope field (Story #4977).
4
- *
5
- * `bdd-scenario-scanner.js`'s `scanBddScenarios` stays a faithful, uncapped
6
- * index of the project's `.feature` corpus — that scan is also used
7
- * directly by `lib/qa/resolve-selection.js`, which needs the full set. The
8
- * cap belongs at the envelope boundary instead, in its own module: on a
9
- * consumer with a mature Gherkin corpus, `bddScenarios` grew to 118 KB —
10
- * larger than `docsContext` and `systemPrompts` combined — consuming
11
- * nearly the entire `PLAN_CONTEXT_ENVELOPE_BYTE_CEILING` headroom on its
12
- * own and blocking `/audit-to-stories`' single-plan path entirely.
13
- *
14
- * Deliberately a fixed framework constant rather than an `.agentrc.json`
15
- * knob: Story #4541 retired the one operator-tunable planner-context budget
16
- * (`planning.context.maxBytes`) because a cap the operator can raise past
17
- * what the model can read fails silently again, and the same reasoning
18
- * applies here.
2
+ * Byte cap for the `bddScenarios` plan-envelope field. The scanner stays
3
+ * uncapped (other callers need the full set); the cap lives at the envelope
4
+ * boundary, since a mature corpus can crowd out the whole envelope. A fixed
5
+ * constant, not a config knob: a cap an operator can raise past what the
6
+ * model reads fails silently.
19
7
  */
20
8
 
21
9
  /**
22
- * Byte budget for the capped `bddScenarios` envelope field. Sized well
23
- * under `PLAN_CONTEXT_ENVELOPE_BYTE_CEILING` (256 KB) — this is one of
24
- * several envelope fields, not the whole budget. At the measured ~337
25
- * bytes/scenario average (Story #4977 evidence, a mature Gherkin corpus),
26
- * 24 KB holds roughly 70 scenarios before truncating.
27
- *
28
- * Deliberately module-private: the only production consumer is
29
- * {@link capBddScenarios} below via the `opts.byteBudget` default. Tests
30
- * assert the resulting behavior (truncation, order, fit) rather than
31
- * importing this value directly, so it carries no public export the
32
- * `--production` dead-exports ratchet would otherwise flag as test-only.
10
+ * One field's share of the 256 KB envelope ceiling: about 70 scenarios.
11
+ * Module-private so it is not a test-only export.
33
12
  */
34
13
  const BDD_SCENARIOS_BYTE_BUDGET = 24_000;
35
14
 
36
15
  /**
37
- * Truncate a scenario index to a byte budget, deterministically (scan
38
- * order — file walk order, then in-file order — never re-sorted), and
39
- * report what was dropped rather than truncating silently: `truncated` is
40
- * `null` when everything fit, else a note naming how many scenarios were
41
- * cut (Story #5312).
16
+ * Truncate in scan order (never re-sorted) and report what was dropped.
42
17
  *
43
- * @param {Array<object>} scenarios Full scan output (order preserved).
18
+ * @param {Array<object>} scenarios
44
19
  * @param {{ byteBudget?: number }} [opts]
45
20
  * @returns {{
46
21
  * scenarios: Array<object>,
@@ -70,8 +45,6 @@ export function capBddScenarios(scenarios, opts = {}) {
70
45
  }
71
46
 
72
47
  /**
73
- * The `truncated` note: `null` when everything fit, else what was cut.
74
- *
75
48
  * @param {Array<object>} list
76
49
  * @param {number} cut
77
50
  * @param {number} byteBudget
@@ -1,28 +1,7 @@
1
1
  /**
2
- * bdd-scenario-scanner.js — Gherkin scenario index for /mandrel-plan Phase 7.
3
- *
4
- * Story #2637 (sibling to #2636's file-assumption gate; the #2634 and #2635
5
- * planner-grounding siblings were retired in Story #4811). The Acceptance
6
- * Engineer step of
7
- * `epic-plan-spec-author` currently writes ACs from Epic/Tech Spec narrative
8
- * alone — it never inspects the consumer project's existing `.feature`
9
- * files. Planned ACs frequently duplicate scenarios that already exist or
10
- * re-specify behaviour the codebase already proves; the duplication is
11
- * only discovered (at best) during `/mandrel-deliver` or (at worst) after
12
- * a redundant PR ships.
13
- *
14
- * `scanBddScenarios` walks every configured feature root, parses each
15
- * `.feature` file with a Gherkin-aware regex pass (deliberately not a
16
- * full Gherkin AST — keep the scanner cheap and dependency-free), and
17
- * returns one entry per scenario with its file path, line number,
18
- * scenario title, tag list, and an extracted set of outcome keywords
19
- * (action verb + objects from the "Then" clauses). The keyword set is
20
- * the fuzzy-match surface the planner uses to spot ACs that already
21
- * have a matching scenario.
22
- *
23
- * Determinism is load-bearing: the matcher is keyword-based, not
24
- * embedding-based, so re-running `/mandrel-plan` against the same
25
- * acceptance spec produces the same disposition annotations.
2
+ * Gherkin scenario index for `/mandrel-plan`, so planned ACs can be matched
3
+ * against existing scenarios. A cheap regex pass, not a full AST; matching is
4
+ * keyword-based (not embeddings) so re-planning is deterministic.
26
5
  */
27
6
 
28
7
  import { readdirSync, readFileSync, statSync } from 'node:fs';
@@ -31,9 +10,7 @@ import path from 'node:path';
31
10
  import { Logger } from './Logger.js';
32
11
 
33
12
  /**
34
- * Recursively list every file with a `.feature` extension under one of
35
- * the given roots. Returns absolute paths; never throws on permission
36
- * errors — unreadable directories are simply skipped.
13
+ * Unreadable directories are skipped, never thrown.
37
14
  *
38
15
  * @param {string[]} roots
39
16
  * @param {{ logger?: { debug: Function } }} [opts]
@@ -79,14 +56,7 @@ function walk(dir, acc, logger) {
79
56
  }
80
57
  }
81
58
 
82
- /**
83
- * English stop words that carry no outcome semantics. Stripped from
84
- * extracted keywords so "the invoice appears in the outbox" reduces to
85
- * `{invoice, appears, outbox}` rather than including `{the, in}`.
86
- *
87
- * Kept short on purpose — false-negative pruning here is preferable to
88
- * over-pruning a verb the matcher needs.
89
- */
59
+ /** Kept short: under-pruning beats pruning a verb the matcher needs. */
90
60
  const STOP_WORDS = new Set([
91
61
  'a',
92
62
  'an',
@@ -121,13 +91,6 @@ const STOP_WORDS = new Set([
121
91
  ]);
122
92
 
123
93
  /**
124
- * Reduce a free-text outcome ("the invoice appears in the outbox") to a
125
- * deterministic, lower-case keyword set ("invoice", "appears", "outbox").
126
- * Words of length 1 are dropped; common stop words are filtered.
127
- *
128
- * Exported so the matcher and downstream tests can share the exact
129
- * tokenisation contract.
130
- *
131
94
  * @param {string} text
132
95
  * @returns {string[]}
133
96
  */
@@ -147,16 +110,8 @@ const THEN_LINE_RE = /^\s*(?:Then|And|But)\s+(.+?)\s*$/i;
147
110
  const STEP_KEYWORD_RE = /^\s*(?:Given|When|Then|And|But|\*)\s+/i;
148
111
 
149
112
  /**
150
- * Parse a single `.feature` file body into an array of scenario rows.
151
- * The parser is deliberately minimal:
152
- *
153
- * - `@tag` lines preceding a `Scenario:` are attached to that scenario.
154
- * - `Scenario:` and `Scenario Outline:` both produce a row.
155
- * - `Then` / `And` / `But` lines following the scenario (until the
156
- * next scenario or EOF) feed the `outcomeKeywords` set.
157
- *
158
- * The Background block is recognised but its steps are NOT folded into
159
- * outcomeKeywords — Background carries setup, not outcomes.
113
+ * Only `Then`/`And`/`But` lines feed `outcomeKeywords`; Background steps are
114
+ * setup, not outcomes, and are excluded.
160
115
  *
161
116
  * @param {string} body
162
117
  * @returns {Array<{ scenarioTitle: string, line: number, tags: string[], outcomeKeywords: string[] }>}
@@ -199,8 +154,7 @@ export function parseFeatureBody(body) {
199
154
  const thenMatch = raw.match(THEN_LINE_RE);
200
155
  if (thenMatch) current.thenLines.push(thenMatch[1]);
201
156
  }
202
- // Reset pendingTags when a step keyword in the body appears with no
203
- // scenario yet — stray tags before a Feature: header don't bind.
157
+ // Stray tags before any scenario don't bind.
204
158
  if (current === null && STEP_KEYWORD_RE.test(raw)) {
205
159
  pendingTags = [];
206
160
  }
@@ -223,14 +177,6 @@ function finalize(scenario) {
223
177
  }
224
178
 
225
179
  /**
226
- * Scan every `.feature` file under the configured feature roots and
227
- * return the full scenario index. Each row carries the absolute path,
228
- * the 1-based line number of the `Scenario:` keyword, the title, the
229
- * tag list, and the deterministic outcome-keyword set. Returns an
230
- * empty array when no roots exist or no scenarios are found — the
231
- * caller (the spec-author skill) uses emptiness to know the project
232
- * hasn't adopted BDD, no warning required.
233
- *
234
180
  * @param {{ featureRoots: string[] }} opts
235
181
  * @returns {Array<{ file: string, line: number, scenarioTitle: string, tags: string[], outcomeKeywords: string[] }>}
236
182
  */
@@ -264,11 +210,8 @@ export function scanBddScenarios(opts = {}) {
264
210
  }
265
211
 
266
212
  /**
267
- * Score the overlap between an acceptance criterion's outcome string
268
- * and a scenario's outcome-keyword set. The score is the count of
269
- * keywords the AC outcome shares with the scenario, normalised by the
270
- * smaller of the two sets so single-word ACs aren't penalised against
271
- * verbose scenarios (and vice versa).
213
+ * Shared keywords over the smaller set's size, so terse ACs are not
214
+ * penalised against verbose scenarios.
272
215
  *
273
216
  * @param {string} acOutcome
274
217
  * @param {{ outcomeKeywords: string[] }} scenario
@@ -286,12 +229,7 @@ export function scoreMatch(acOutcome, scenario) {
286
229
  }
287
230
 
288
231
  /**
289
- * Find the best matching scenario for one AC outcome string, if any.
290
- * Returns `null` when no scenario scores above `minScore` (default
291
- * `0.5`). The matcher is intentionally conservative — false positives
292
- * cost the planner more (rewriting the spec to "refine" a scenario
293
- * that doesn't actually exist) than false negatives (writing a new
294
- * scenario the operator can later dedupe).
232
+ * Conservative: a false match costs more than a duplicate scenario.
295
233
  *
296
234
  * @param {string} acOutcome
297
235
  * @param {Array<{ outcomeKeywords: string[] }>} scenarios
@@ -1,38 +1,12 @@
1
1
  /**
2
- * bdd-step-index.js — scoped discovery and matching for BDD step definitions.
3
- *
4
- * `check-gherkin-corpus.js` answers one question per Gherkin step: does a step
5
- * definition **under this step's own scope** claim it? That question has two
6
- * halves, and this module owns both so the corpus gate never re-implements
7
- * either inline:
8
- *
9
- * 1. **Discovery** — which files under a scope's `stepRoots` hold step
10
- * definitions, and which `.feature` files sit under its `featureRoots`.
11
- * Feature discovery is delegated to `listFeatureFiles` in
12
- * `bdd-scenario-scanner.js` rather than copied: /mandrel-plan's scenario index and
13
- * this gate must agree on what counts as a feature file, and two walkers
14
- * would eventually disagree.
15
- * 2. **Matching** — turn each definition's Cucumber expression or regular
16
- * expression into one `RegExp`, and test a step's text against the index.
17
- *
18
- * ## Heuristic index, exact parser
19
- *
20
- * The parser half of the gate is exact: `@cucumber/gherkin` decides what
21
- * compiles. This half is deliberately **not**. Reading step definitions
22
- * without executing them means a regex scan over source text, and a scan
23
- * cannot see a definition assembled at runtime, registered through a wrapper,
24
- * or parameterised by a custom `defineParameterType`. That asymmetry is why
25
- * the gate ships a step-waiver list: a false "unbound" must always have an
26
- * escape that does not require switching the whole gate off.
27
- *
28
- * Supported Cucumber-expression constructs are the ones the built-in parameter
29
- * types and the optional/alternation syntax cover — `{int}`, `{float}`,
30
- * `{word}`, `{string}`, an anonymous `{}`, `text(s)` optionals, and `a/an`
31
- * word alternation. An unrecognised `{custom}` degrades to `(.*)` rather than
32
- * failing to match, because over-matching produces a missed finding while
33
- * under-matching produces a false one, and a false one blocks a delivery.
34
- *
35
- * Nothing here reads configuration or exits a process; the CLI owns both.
2
+ * Scoped discovery and matching of BDD step definitions for
3
+ * `check-gherkin-corpus.js`. Feature discovery reuses the scenario scanner's
4
+ * `listFeatureFiles` so both agree on what a feature file is.
5
+ *
6
+ * The index is a heuristic source scan (it cannot see runtime-built or
7
+ * wrapped definitions), hence the gate's step-waiver list. An unknown
8
+ * `{custom}` parameter degrades to `(.*)`: over-matching misses a finding,
9
+ * under-matching blocks a delivery with a false one.
36
10
  */
37
11
 
38
12
  import { readdirSync, readFileSync, statSync } from 'node:fs';
@@ -42,7 +16,6 @@ import { listFeatureFiles } from './bdd-scenario-scanner.js';
42
16
 
43
17
  export { listFeatureFiles };
44
18
 
45
- /** Extensions a step-definition module may carry. */
46
19
  const STEP_FILE_EXTENSIONS = Object.freeze([
47
20
  '.js',
48
21
  '.mjs',
@@ -53,15 +26,12 @@ const STEP_FILE_EXTENSIONS = Object.freeze([
53
26
  '.tsx',
54
27
  ]);
55
28
 
56
- /** Directory names never walked when looking for step definitions. */
57
29
  const SKIPPED_DIRECTORIES = Object.freeze(
58
30
  new Set(['node_modules', '.git', 'dist', 'build', '.next', 'coverage']),
59
31
  );
60
32
 
61
33
  /**
62
- * Regular expressions for the built-in Cucumber parameter types, keyed by the
63
- * name inside the braces. The empty key is the anonymous `{}` parameter and
64
- * doubles as the fallback for a custom type this scan cannot resolve.
34
+ * Built-in parameter types; `''` is `{}` and the fallback for custom types.
65
35
  *
66
36
  * @type {Readonly<Record<string, string>>}
67
37
  */
@@ -73,27 +43,16 @@ const PARAMETER_PATTERNS = Object.freeze({
73
43
  string: '("[^"]*"|\'[^\']*\')',
74
44
  });
75
45
 
76
- /**
77
- * Step-registration call sites this scan recognises. `Step` and `defineStep`
78
- * cover the generic registrars playwright-bdd and cucumber-js both expose.
79
- *
80
- * Group 2/3 capture a quoted expression, group 4/5 a regular-expression
81
- * literal with its flags.
82
- */
46
+ /** Groups 2/3: quoted expression; 4/5: regex literal and flags. */
83
47
  const STEP_CALL_PATTERN =
84
48
  /\b(Given|When|Then|And|But|Step|defineStep)\s*\(\s*(?:(['"`])((?:\\.|(?!\2)[^\\])*)\2|\/((?:\\.|\[(?:\\.|[^\]\\])*\]|[^/\\[])+)\/([dgimsuvy]*))/g;
85
49
 
86
- /** Escape one character for literal use inside a regular expression. */
87
50
  function escapeRegExp(text) {
88
51
  return text.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
89
52
  }
90
53
 
91
54
  /**
92
- * Render one alternation-free segment of a Cucumber expression: parameter
93
- * placeholders become capture groups, `(optional)` runs become optional
94
- * groups, and everything else is escaped literal text.
95
- *
96
- * @param {string} segment
55
+ * @param {string} segment An alternation-free piece of an expression.
97
56
  * @returns {string}
98
57
  */
99
58
  function renderSegment(segment) {
@@ -130,10 +89,7 @@ function renderSegment(segment) {
130
89
  }
131
90
 
132
91
  /**
133
- * Split a word on unescaped `/` so `a/an` becomes two alternatives. Escaped
134
- * `\/` stays literal.
135
- *
136
- * @param {string} word
92
+ * @param {string} word Split on unescaped `/`.
137
93
  * @returns {string[]}
138
94
  */
139
95
  function splitAlternation(word) {
@@ -158,12 +114,8 @@ function splitAlternation(word) {
158
114
  }
159
115
 
160
116
  /**
161
- * Compile a Cucumber expression into an anchored `RegExp`.
162
- *
163
- * Alternation is resolved per whitespace-separated word, which is what the
164
- * real expression grammar does. Resolving it across the whole string instead
165
- * would turn `I have a/an apple` into `^I have a|an apple$` — two anchored
166
- * alternatives, neither of them the intended step.
117
+ * Alternation is per word, as in the real grammar; whole-string alternation
118
+ * would anchor the wrong alternatives.
167
119
  *
168
120
  * @param {string} expression
169
121
  * @returns {RegExp}
@@ -183,18 +135,11 @@ function expressionToRegExp(expression) {
183
135
  }
184
136
 
185
137
  /**
186
- * Recursively list step-definition source files under the given roots.
187
- *
188
- * Deliberately not `walkFilesByExtension` from `fs-walk.js`, which is the
189
- * shared walker for the lint surfaces. That one matches a single extension and
190
- * walks everything below the root, so reusing it here would mean seven passes
191
- * — one per accepted extension — each of them descending into a `node_modules`
192
- * a consumer's step root may well contain. It also rethrows every non-ENOENT
193
- * `readdir` failure, where this walker must skip an unreadable directory: an
194
- * unreadable *scope* has to surface as "zero step definitions", the gate's
195
- * fail-closed path, which names the scope and its step roots.
138
+ * Not `fs-walk.js`: that walker takes one extension, descends into
139
+ * `node_modules`, and rethrows readdir failures, whereas an unreadable scope
140
+ * here must surface as "zero step definitions" (the gate's fail-closed path).
196
141
  *
197
- * @param {string[]} roots absolute or cwd-relative directories
142
+ * @param {string[]} roots
198
143
  * @returns {string[]} absolute paths, sorted
199
144
  */
200
145
  export function listStepFiles(roots) {
@@ -214,8 +159,7 @@ function walkStepDir(dir, acc) {
214
159
  }
215
160
  for (const entry of entries) {
216
161
  const full = path.join(dir, entry.name);
217
- // `withFileTypes` reports a symlink as neither file nor directory, so
218
- // fall back to a stat for those rather than dropping them silently.
162
+ // A symlink is neither file nor directory to `withFileTypes`; stat it.
219
163
  const isDir =
220
164
  entry.isDirectory() || (entry.isSymbolicLink() && isDirAt(full));
221
165
  if (isDir) {
@@ -235,10 +179,8 @@ function isDirAt(target) {
235
179
  }
236
180
 
237
181
  /**
238
- * Extract every step registration in one source file.
239
- *
240
- * @param {string} source file contents
241
- * @param {string} file absolute path, recorded on each entry
182
+ * @param {string} source
183
+ * @param {string} file
242
184
  * @returns {Array<{ file: string, line: number, source: string, regex: RegExp }>}
243
185
  */
244
186
  function parseStepDefinitions(source, file) {
@@ -255,12 +197,7 @@ function parseStepDefinitions(source, file) {
255
197
  return entries;
256
198
  }
257
199
 
258
- /**
259
- * Build one matcher from a captured registration. A malformed regular
260
- * expression yields `null` — the definition is skipped rather than crashing
261
- * the scan, and the steps it would have claimed surface as unbound, which is
262
- * the safe direction.
263
- */
200
+ /** A malformed pattern yields `null`: its steps surface as unbound, the safe direction. */
264
201
  function compileMatcher({ quoted, pattern, flags }) {
265
202
  if (typeof quoted === 'string') {
266
203
  try {
@@ -270,8 +207,7 @@ function compileMatcher({ quoted, pattern, flags }) {
270
207
  }
271
208
  }
272
209
  try {
273
- // `g` and `y` are stateful across `.test()` calls; strip them so the index
274
- // cannot depend on how many times it has been consulted.
210
+ // `g`/`y` make `.test()` stateful.
275
211
  return new RegExp(pattern, (flags ?? '').replace(/[gy]/g, ''));
276
212
  } catch {
277
213
  return null;
@@ -279,8 +215,6 @@ function compileMatcher({ quoted, pattern, flags }) {
279
215
  }
280
216
 
281
217
  /**
282
- * Build the step index for one scope.
283
- *
284
218
  * @param {{ files: string[], readFile?: (p: string) => string }} params
285
219
  * @returns {{ entries: Array<{ file: string, line: number, source: string, regex: RegExp }>, files: string[] }}
286
220
  */
@@ -300,11 +234,9 @@ export function buildStepIndex({ files, readFile }) {
300
234
  }
301
235
 
302
236
  /**
303
- * Find the first definition in the index claiming `text`.
304
- *
305
237
  * @param {{ entries: Array<{ regex: RegExp }> }} index
306
- * @param {string} text the step text, keyword already stripped by the parser
307
- * @returns {object | null} the matching entry, or `null` when nothing claims it
238
+ * @param {string} text Step text without its keyword.
239
+ * @returns {object | null}
308
240
  */
309
241
  export function matchStep(index, text) {
310
242
  for (const entry of index?.entries ?? []) {
@@ -313,13 +245,7 @@ export function matchStep(index, text) {
313
245
  return null;
314
246
  }
315
247
 
316
- /**
317
- * Module-private helpers the suite drives directly. Bundled rather than
318
- * exported individually — the same seam `knip-entry-sync.js` and
319
- * `source-classifier.js` use — so test-only symbols cost one production
320
- * dead-export row instead of one each, and so private helpers do not read as
321
- * API.
322
- */
248
+ /** Test-only helpers, bundled so they cost one dead-export row. */
323
249
  export const __testing = Object.freeze({
324
250
  expressionToRegExp,
325
251
  parseStepDefinitions,
@@ -1,24 +1,8 @@
1
1
  /**
2
- * bootstrap/baseline-merge-driver — register the `baselines/*.json` merge
3
- * driver on a consumer clone (Story #5215).
4
- *
5
- * Registration has two halves that live in different places, and conflating
6
- * them is why this needs a doctor check rather than just an installer:
7
- *
8
- * 1. **`.gitattributes`** says which files use the driver. It is a tracked
9
- * file, so installing the line once ships it to everyone.
10
- * 2. **`git config merge.mandrel-baseline.driver`** says what the driver
11
- * actually is. Git deliberately keeps this out of tracked config —
12
- * otherwise a clone would execute a command chosen by whoever wrote the
13
- * repo — so it is **per clone**, and a fresh clone silently falls back
14
- * to git's text merge with no error at all.
15
- *
16
- * That silence is the whole reason `mandrel doctor` carries a check: an
17
- * unregistered clone is not broken in any way it can report on its own, it
18
- * just quietly goes back to conflicting (or worse, splicing) baselines.
19
- *
20
- * This module owns both halves plus the strings they share, so the installer
21
- * and the doctor check cannot drift apart on the exact command.
2
+ * Register the `baselines/*.json` merge driver. The `.gitattributes` line is
3
+ * tracked; the `git config` driver command is per clone, so a fresh clone
4
+ * silently falls back to text merge — hence the doctor check. Owning both
5
+ * halves here keeps installer and doctor agreeing on the command.
22
6
  *
23
7
  * @module lib/bootstrap/baseline-merge-driver
24
8
  */
@@ -27,38 +11,22 @@ import fs from 'node:fs';
27
11
  import path from 'node:path';
28
12
  import { spawnCapture } from '../child-exec.js';
29
13
 
30
- /** Driver name, as it appears on both sides of the registration. */
31
14
  const BASELINE_MERGE_DRIVER_NAME = 'mandrel-baseline';
32
15
 
33
- /** The `.gitattributes` line that routes baselines through the driver. */
34
16
  const BASELINE_MERGE_ATTRIBUTE = `baselines/*.json merge=${BASELINE_MERGE_DRIVER_NAME}`;
35
17
 
36
- /** Git config key holding the driver command. */
37
18
  export const BASELINE_MERGE_DRIVER_CONFIG_KEY = `merge.${BASELINE_MERGE_DRIVER_NAME}.driver`;
38
19
 
39
- /** Script path the driver command invokes, relative to the worktree root. */
20
+ /** Relative: git runs the driver from the worktree root, in every worktree. */
40
21
  const DRIVER_SCRIPT = '.agents/scripts/merge-baseline.js';
41
22
 
42
- /** Git's merge-driver placeholders, in the order the driver's argv expects. */
23
+ /** In the order the driver's argv expects. */
43
24
  const DRIVER_PLACEHOLDERS = '%O %A %B %P';
44
25
 
45
26
  /**
46
- * Build the driver command for a given node binary.
47
- *
48
- * The interpreter is the RESOLVED ABSOLUTE path (`process.execPath`), not the
49
- * bare word `node`, and it is quoted. Git runs a merge driver through the
50
- * shell, and that shell's `PATH` is whatever launched git — a GUI client, a
51
- * Finder-launched editor, a `launchd` job — none of which necessarily carry
52
- * the nvm/volta shim that puts `node` on an interactive shell's `PATH`. A
53
- * driver that cannot start is not a loud failure: git reports the driver
54
- * exited non-zero and falls back to leaving the file conflicted, which reads
55
- * as "baselines conflict again" — the exact symptom the driver exists to
56
- * remove. Quoting covers the installation whose node lives under a path with
57
- * a space (`/Users/a b/.nvm/...`).
58
- *
59
- * The script path stays RELATIVE: git runs the driver from the worktree root,
60
- * and that is also where `mandrel sync` materializes `.agents/`, so one
61
- * command is correct in the main checkout and in every linked worktree.
27
+ * The node path is absolute and quoted: git's shell may lack the nvm/volta
28
+ * `PATH` shim (GUI clients, launchd), and a driver that cannot start just
29
+ * leaves the file conflicted. Quoting covers paths with spaces.
62
30
  *
63
31
  * @param {string} [execPath] Absolute path to the node binary.
64
32
  * @returns {string}
@@ -67,31 +35,16 @@ function buildBaselineMergeDriverCommand(execPath = process.execPath) {
67
35
  return `"${execPath}" ${DRIVER_SCRIPT} ${DRIVER_PLACEHOLDERS}`;
68
36
  }
69
37
 
70
- /** The driver command this process would install. */
71
38
  const BASELINE_MERGE_DRIVER_COMMAND = buildBaselineMergeDriverCommand();
72
39
 
73
- /**
74
- * The exact command an operator runs to complete registration. Single-quoted
75
- * because the command itself carries the double quotes around the node path.
76
- */
40
+ /** Single-quoted: the command carries double quotes around the node path. */
77
41
  export const BASELINE_MERGE_DRIVER_REMEDY = `git config ${BASELINE_MERGE_DRIVER_CONFIG_KEY} '${BASELINE_MERGE_DRIVER_COMMAND}'`;
78
42
 
79
43
  /**
80
- * Split a configured driver command into an executable + argv pair, dropping
81
- * git's `%O %A %B %P` placeholders.
82
- *
83
- * Used by the `mandrel doctor` check to actually RUN the configured command
84
- * (with `--help`) rather than only assert the config key is non-empty. A key
85
- * pointing at a node that no longer exists — the ordinary outcome of an nvm
86
- * version bump after the driver was installed — is set, non-empty, and
87
- * completely broken, and the pre-Story-#5277 check called that healthy.
88
- *
89
- * Tokenising here rather than handing the string to a shell is deliberate:
90
- * the value is per-clone git config, and executing it through `shell: true`
91
- * would turn any write to that key into arbitrary command execution
92
- * (`security-baseline.md` § Output & Rendering — never concatenate into a
93
- * shell command). Only double quotes are honoured, which is exactly the
94
- * quoting {@link buildBaselineMergeDriverCommand} emits.
44
+ * Split a driver command into file + argv, dropping git placeholders, so the
45
+ * doctor can actually run it (an nvm bump leaves a set-but-broken key).
46
+ * Tokenised rather than shelled: executing per-clone config through a shell
47
+ * would be arbitrary command execution. Only double quotes are honoured.
95
48
  *
96
49
  * @param {string|null|undefined} command
97
50
  * @returns {{ file: string, args: string[] }|null} null when there is no
@@ -112,8 +65,7 @@ export function parseBaselineMergeDriverCommand(command) {
112
65
  }
113
66
 
114
67
  /**
115
- * Does this `.gitattributes` content route baselines through the driver?
116
- * Comment lines do not count — a commented-out registration is not one.
68
+ * Comment lines do not count.
117
69
  *
118
70
  * @param {string|null|undefined} gitattributes
119
71
  * @returns {boolean}
@@ -129,23 +81,10 @@ function declaresBaselineMergeDriver(gitattributes) {
129
81
  }
130
82
 
131
83
  /**
132
- * Is the driver DECLARED by this project and REGISTERED in this clone?
133
- *
134
- * Two callers ask this exact question of two different clones — the
135
- * `mandrel doctor` check, and the pre-push base-sync guard — and both need
136
- * the same two-part answer, because the two halves fail differently:
137
- *
138
- * - **Not declared** → the project never opted in. Both callers stay
139
- * silent; telling a consumer to register a driver for files they do not
140
- * route through it is noise. An unreadable `.gitattributes` reads the
141
- * same way, deliberately.
142
- * - **Declared, empty command** → the silent case. Git reports nothing at
143
- * all: it falls back to its own line-based merge, which on a generated
144
- * baseline either conflicts on the `generatedAt` stamp or splices both
145
- * sides' rows into a set neither side scored.
146
- *
147
- * The `runGit` seam takes argv tokens and returns `{ status, stdout }`, which
148
- * is the shape both callers' own git surfaces already produce.
84
+ * Is the driver declared by the project and registered in this clone? Not
85
+ * declared (or unreadable `.gitattributes`) means the project never opted in
86
+ * and callers stay silent; declared with an empty command is the silent
87
+ * text-merge fallback callers must flag.
149
88
  *
150
89
  * @param {{
151
90
  * projectRoot: string,
@@ -206,8 +145,6 @@ function ensureGitattributesLine(projectRoot, fsImpl = fs) {
206
145
  }
207
146
 
208
147
  /**
209
- * Point `merge.mandrel-baseline.driver` at the driver in THIS clone.
210
- *
211
148
  * @param {string} projectRoot
212
149
  * @param {typeof spawnCapture} [spawnImpl]
213
150
  * @returns {{ action: 'set'|'already-present'|'not-a-repo'|'failed' }}
@@ -258,9 +195,6 @@ function ensureDriverGitConfig(projectRoot, spawnImpl = spawnCapture) {
258
195
  }
259
196
 
260
197
  /**
261
- * Read `.gitattributes` without writing it — the `configOnly` half of
262
- * {@link ensureBaselineMergeDriver}.
263
- *
264
198
  * @param {string} projectRoot
265
199
  * @param {typeof fs} fsImpl
266
200
  * @returns {{ action: 'already-present'|'absent', path: string }}
@@ -282,24 +216,10 @@ function probeGitattributesLine(projectRoot, fsImpl) {
282
216
  }
283
217
 
284
218
  /**
285
- * Install the registration. Idempotent: a second run reports
286
- * `already-present` and changes no bytes.
287
- *
288
- * Two modes, because the two callers mean different things by "install":
289
- *
290
- * - **Full (default)** — `mandrel init --with-quality` and this repo's own
291
- * `prepare`. Writes the `.gitattributes` line as well as the config key:
292
- * the caller has opted the repository into the quality surface, so
293
- * declaring the attribute is part of what it asked for.
294
- * - **`configOnly: true`** — consumer `mandrel sync`. Writes ONLY the
295
- * per-clone config key, and only when `.gitattributes` already declares the
296
- * attribute. `sync` materializes `.agents/`; it is not an opt-in to the
297
- * quality surface, and creating a `.gitattributes` in a project that never
298
- * asked for one would be `sync` changing git's behaviour on files it has no
299
- * business touching. What it DOES fix is the real gap: the attribute is
300
- * tracked and therefore ships with the repo, while the config key is
301
- * per-clone and silently absent in every fresh clone — so the half that
302
- * cannot travel is installed on the one command every consumer runs.
219
+ * Idempotent install. Full mode (init/prepare) writes the attribute and the
220
+ * config key. `configOnly` (consumer `sync`) writes only the per-clone key,
221
+ * and only when the project already declares the attribute — `sync` is not
222
+ * an opt-in to the quality surface.
303
223
  *
304
224
  * @param {object} ctx
305
225
  * @param {string} ctx.projectRoot
@@ -141,11 +141,8 @@ export async function applyBranchProtection({
141
141
  return { status: 'skipped', reason: 'no-checks' };
142
142
  }
143
143
 
144
- // Story #2018 (Bug 3): on a fresh-empty repo with no commits yet, the
145
- // base branch hasn't been pushed and the protection PUT would 404 with
146
- // a confusing transport error. Probe for existence first so operators
147
- // get a clear "no-base-branch" skip rather than discovering the
148
- // `enforce: false` opt-out by reading the failure message.
144
+ // On an empty repo the protection PUT 404s confusingly; probe first so the
145
+ // skip reads "no base branch".
149
146
  if (typeof provider.branchExists === 'function') {
150
147
  let exists = true;
151
148
  try {