mandrel 2.60.0 → 2.62.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (662) hide show
  1. package/.agents/README.md +10 -10
  2. package/.agents/agents/story-worker.md +1 -1
  3. package/.agents/docs/agentrc-reference.json +4 -82
  4. package/.agents/docs/configuration.md +20 -87
  5. package/.agents/docs/workflows.md +1 -1
  6. package/.agents/instructions.md +1 -3
  7. package/.agents/rules/gherkin-standards.md +4 -0
  8. package/.agents/schemas/agentrc.schema.json +11 -486
  9. package/.agents/schemas/story-deliver-terminal.schema.json +10 -0
  10. package/.agents/schemas/validation-evidence.schema.json +2 -1
  11. package/.agents/scripts/README.md +14 -14
  12. package/.agents/scripts/acceptance-eval.js +32 -164
  13. package/.agents/scripts/agents-bootstrap-github.js +27 -129
  14. package/.agents/scripts/apply-quality-bootstrap.js +4 -40
  15. package/.agents/scripts/audit-baselines.js +6 -27
  16. package/.agents/scripts/audit-labels-bootstrap.js +5 -29
  17. package/.agents/scripts/audit-to-stories.js +91 -361
  18. package/.agents/scripts/boot-sweep.js +19 -72
  19. package/.agents/scripts/bootstrap.js +74 -395
  20. package/.agents/scripts/ceremony-derive.js +9 -45
  21. package/.agents/scripts/check-arch-cycles.js +14 -64
  22. package/.agents/scripts/check-baselines.js +8 -48
  23. package/.agents/scripts/check-context-budget.js +46 -172
  24. package/.agents/scripts/check-cyclomatic.js +12 -44
  25. package/.agents/scripts/check-dead-exports.js +13 -64
  26. package/.agents/scripts/check-doc-links.js +38 -186
  27. package/.agents/scripts/check-gherkin-corpus.js +24 -127
  28. package/.agents/scripts/check-test-temp-hygiene.js +28 -169
  29. package/.agents/scripts/coverage-capture.js +32 -99
  30. package/.agents/scripts/deliver-light.js +14 -101
  31. package/.agents/scripts/deliver-recover.js +6 -42
  32. package/.agents/scripts/deliver-run.js +36 -133
  33. package/.agents/scripts/diagnose-friction.js +24 -116
  34. package/.agents/scripts/drain-pending-cleanup.js +1 -1
  35. package/.agents/scripts/evidence-gate.js +23 -85
  36. package/.agents/scripts/file-ci-gap.js +10 -50
  37. package/.agents/scripts/generate-config-docs.js +30 -170
  38. package/.agents/scripts/generate-lens-checklists.js +8 -52
  39. package/.agents/scripts/generate-skills-index.js +14 -112
  40. package/.agents/scripts/generate-workflows-doc.js +10 -70
  41. package/.agents/scripts/git-cleanup.js +2 -34
  42. package/.agents/scripts/lib/Graph.js +24 -81
  43. package/.agents/scripts/lib/ITicketingProvider.js +47 -143
  44. package/.agents/scripts/lib/Logger.js +14 -76
  45. package/.agents/scripts/lib/audit-baselines/engine.js +11 -31
  46. package/.agents/scripts/lib/audit-baselines/gate-surface.js +3 -17
  47. package/.agents/scripts/lib/audit-baselines/headroom.js +4 -20
  48. package/.agents/scripts/lib/audit-baselines/hotspots.js +3 -15
  49. package/.agents/scripts/lib/audit-baselines/kinds.js +23 -89
  50. package/.agents/scripts/lib/audit-baselines/outliers.js +6 -23
  51. package/.agents/scripts/lib/audit-baselines/read.js +3 -16
  52. package/.agents/scripts/lib/audit-baselines/staleness.js +7 -26
  53. package/.agents/scripts/lib/audit-baselines/surface-entry.js +7 -28
  54. package/.agents/scripts/lib/audit-baselines/trend.js +7 -20
  55. package/.agents/scripts/lib/audit-baselines/weights.js +9 -37
  56. package/.agents/scripts/lib/audit-suite/audit-rules-reader.js +3 -18
  57. package/.agents/scripts/lib/audit-suite/checklist-threading.js +26 -124
  58. package/.agents/scripts/lib/audit-suite/dispatch-checklist.js +14 -45
  59. package/.agents/scripts/lib/audit-suite/findings.js +12 -52
  60. package/.agents/scripts/lib/audit-suite/frontmatter.js +5 -29
  61. package/.agents/scripts/lib/audit-suite/index.js +1 -15
  62. package/.agents/scripts/lib/audit-suite/lens-checklist.js +10 -45
  63. package/.agents/scripts/lib/audit-suite/lens-diff-floor.js +11 -76
  64. package/.agents/scripts/lib/audit-suite/runner.js +13 -43
  65. package/.agents/scripts/lib/audit-suite/selector.js +49 -349
  66. package/.agents/scripts/lib/audit-suite/substitutions.js +12 -40
  67. package/.agents/scripts/lib/audit-suite/workflow-loader.js +3 -15
  68. package/.agents/scripts/lib/audit-to-stories/audit-label-taxonomy.js +11 -73
  69. package/.agents/scripts/lib/audit-to-stories/audit-lenses.js +8 -37
  70. package/.agents/scripts/lib/audit-to-stories/build-story-body.js +25 -143
  71. package/.agents/scripts/lib/audit-to-stories/dedupe-against-github.js +14 -80
  72. package/.agents/scripts/lib/audit-to-stories/epic-grouping-directive.js +4 -18
  73. package/.agents/scripts/lib/audit-to-stories/finding-adapter.js +7 -40
  74. package/.agents/scripts/lib/audit-to-stories/group-findings.js +9 -39
  75. package/.agents/scripts/lib/audit-to-stories/issue-corpus.js +10 -66
  76. package/.agents/scripts/lib/audit-to-stories/issue-index.js +6 -30
  77. package/.agents/scripts/lib/audit-to-stories/issues-file.js +6 -36
  78. package/.agents/scripts/lib/audit-to-stories/ledger-commit.js +17 -69
  79. package/.agents/scripts/lib/audit-to-stories/ledger-pr.js +17 -85
  80. package/.agents/scripts/lib/audit-to-stories/ledger-record.js +10 -48
  81. package/.agents/scripts/lib/audit-to-stories/parse-audit-md.js +38 -146
  82. package/.agents/scripts/lib/audit-to-stories/seed-from-findings.js +7 -42
  83. package/.agents/scripts/lib/audit-to-stories/wire-dependencies.js +10 -57
  84. package/.agents/scripts/lib/baseline-loader.js +12 -51
  85. package/.agents/scripts/lib/baseline-schema-registry.js +5 -22
  86. package/.agents/scripts/lib/baselines/component-matcher.js +3 -12
  87. package/.agents/scripts/lib/baselines/components.js +10 -61
  88. package/.agents/scripts/lib/baselines/coverage-updater-cli.js +7 -36
  89. package/.agents/scripts/lib/baselines/crap-preview-incremental.js +5 -21
  90. package/.agents/scripts/lib/baselines/crap-preview-scan.js +19 -45
  91. package/.agents/scripts/lib/baselines/crap-updater-cli.js +16 -65
  92. package/.agents/scripts/lib/baselines/diff-scope-cli.js +5 -33
  93. package/.agents/scripts/lib/baselines/duplication-scanner.js +11 -60
  94. package/.agents/scripts/lib/baselines/env-overrides.js +12 -67
  95. package/.agents/scripts/lib/baselines/envelope.js +13 -129
  96. package/.agents/scripts/lib/baselines/exit-codes.js +6 -49
  97. package/.agents/scripts/lib/baselines/git-base.js +23 -142
  98. package/.agents/scripts/lib/baselines/kernel.js +11 -111
  99. package/.agents/scripts/lib/baselines/kinds/_crap-new-method-gate.js +9 -47
  100. package/.agents/scripts/lib/baselines/kinds/_crap-read.js +8 -51
  101. package/.agents/scripts/lib/baselines/kinds/_shared-metric.js +7 -62
  102. package/.agents/scripts/lib/baselines/kinds/bundle-size.js +8 -29
  103. package/.agents/scripts/lib/baselines/kinds/coverage.js +3 -15
  104. package/.agents/scripts/lib/baselines/kinds/crap.js +94 -415
  105. package/.agents/scripts/lib/baselines/kinds/duplication.js +4 -30
  106. package/.agents/scripts/lib/baselines/kinds/kind-factory.js +7 -53
  107. package/.agents/scripts/lib/baselines/kinds/maintainability.js +15 -80
  108. package/.agents/scripts/lib/baselines/kinds/mutation.js +12 -72
  109. package/.agents/scripts/lib/baselines/maintainability-baseline-io.js +4 -11
  110. package/.agents/scripts/lib/baselines/merge-envelopes.js +30 -146
  111. package/.agents/scripts/lib/baselines/path-canon.js +19 -128
  112. package/.agents/scripts/lib/baselines/preview-gates.js +8 -37
  113. package/.agents/scripts/lib/baselines/reader.js +14 -107
  114. package/.agents/scripts/lib/baselines/refresh-service.js +35 -252
  115. package/.agents/scripts/lib/baselines/scope.js +11 -135
  116. package/.agents/scripts/lib/baselines/writer.js +16 -149
  117. package/.agents/scripts/lib/bdd-runner-detect.js +18 -113
  118. package/.agents/scripts/lib/bdd-scenario-budget.js +9 -36
  119. package/.agents/scripts/lib/bdd-scenario-scanner.js +11 -73
  120. package/.agents/scripts/lib/bdd-step-index.js +26 -100
  121. package/.agents/scripts/lib/bootstrap/baseline-merge-driver.js +23 -103
  122. package/.agents/scripts/lib/bootstrap/branch-protection.js +2 -5
  123. package/.agents/scripts/lib/bootstrap/commit-push.js +12 -50
  124. package/.agents/scripts/lib/bootstrap/gh-preflight.js +14 -101
  125. package/.agents/scripts/lib/bootstrap/hitl-confirm.js +5 -30
  126. package/.agents/scripts/lib/bootstrap/install-ledger.js +17 -73
  127. package/.agents/scripts/lib/bootstrap/issue-forms-template.js +17 -121
  128. package/.agents/scripts/lib/bootstrap/manifest.js +15 -86
  129. package/.agents/scripts/lib/bootstrap/merge-methods.js +4 -33
  130. package/.agents/scripts/lib/bootstrap/preflight.js +12 -61
  131. package/.agents/scripts/lib/bootstrap/project-bootstrap.js +34 -235
  132. package/.agents/scripts/lib/bootstrap/prompt.js +21 -129
  133. package/.agents/scripts/lib/bootstrap/quality-bootstrap.js +27 -141
  134. package/.agents/scripts/lib/bootstrap/summary.js +1 -8
  135. package/.agents/scripts/lib/bootstrap/workflow-audit.js +11 -84
  136. package/.agents/scripts/lib/branch-name-guard.js +4 -23
  137. package/.agents/scripts/lib/changed-files.js +31 -143
  138. package/.agents/scripts/lib/checks/core-bare-clean.js +4 -24
  139. package/.agents/scripts/lib/checks/index.js +18 -101
  140. package/.agents/scripts/lib/checks/loop-health.js +11 -53
  141. package/.agents/scripts/lib/checks/state.js +16 -91
  142. package/.agents/scripts/lib/checks/story-init-not-backgrounded.js +10 -61
  143. package/.agents/scripts/lib/checks/subagent-agent-tool-required.js +14 -83
  144. package/.agents/scripts/lib/child-exec.js +39 -108
  145. package/.agents/scripts/lib/cli/standard-args.js +9 -116
  146. package/.agents/scripts/lib/cli-args.js +31 -146
  147. package/.agents/scripts/lib/cli-usage.js +5 -27
  148. package/.agents/scripts/lib/cli-utils.js +2 -12
  149. package/.agents/scripts/lib/close-validation/commands.js +13 -76
  150. package/.agents/scripts/lib/close-validation/gates.js +92 -331
  151. package/.agents/scripts/lib/close-validation/process.js +121 -151
  152. package/.agents/scripts/lib/close-validation/projections/advisories.js +5 -31
  153. package/.agents/scripts/lib/close-validation/projections/crap.js +19 -67
  154. package/.agents/scripts/lib/close-validation/projections/head-sha.js +1 -17
  155. package/.agents/scripts/lib/close-validation/projections/inputs.js +4 -34
  156. package/.agents/scripts/lib/close-validation/projections/maintainability.js +11 -58
  157. package/.agents/scripts/lib/close-validation/runner.js +53 -110
  158. package/.agents/scripts/lib/command-header.js +6 -28
  159. package/.agents/scripts/lib/config/acceptance-eval.js +4 -30
  160. package/.agents/scripts/lib/config/baselines.js +3 -14
  161. package/.agents/scripts/lib/config/ci.js +8 -38
  162. package/.agents/scripts/lib/config/commands.js +1 -15
  163. package/.agents/scripts/lib/config/defaults.js +4 -33
  164. package/.agents/scripts/lib/config/delivery-routing.js +6 -35
  165. package/.agents/scripts/lib/config/explain.js +9 -80
  166. package/.agents/scripts/lib/config/gates/coverage.schema.js +0 -12
  167. package/.agents/scripts/lib/config/gates/crap-incremental-coverage.schema.js +2 -30
  168. package/.agents/scripts/lib/config/gates/crap.schema.js +1 -34
  169. package/.agents/scripts/lib/config/gates/duplication.schema.js +1 -8
  170. package/.agents/scripts/lib/config/gates/index.js +2 -17
  171. package/.agents/scripts/lib/config/gates/maintainability.schema.js +1 -20
  172. package/.agents/scripts/lib/config/gates/mutation.schema.js +1 -7
  173. package/.agents/scripts/lib/config/gates/shared.js +4 -64
  174. package/.agents/scripts/lib/config/github.js +4 -22
  175. package/.agents/scripts/lib/config/limits.js +4 -57
  176. package/.agents/scripts/lib/config/paths.js +2 -21
  177. package/.agents/scripts/lib/config/qa.js +4 -38
  178. package/.agents/scripts/lib/config/quality.js +76 -432
  179. package/.agents/scripts/lib/config/runners.js +12 -56
  180. package/.agents/scripts/lib/config/runtime.js +13 -57
  181. package/.agents/scripts/lib/config/shared.js +2 -16
  182. package/.agents/scripts/lib/config/sync-agentrc.js +9 -50
  183. package/.agents/scripts/lib/config/temp-paths.js +40 -280
  184. package/.agents/scripts/lib/config/validate-orchestration.js +5 -17
  185. package/.agents/scripts/lib/config/worktree-isolation.js +9 -28
  186. package/.agents/scripts/lib/config-resolver.js +10 -52
  187. package/.agents/scripts/lib/config-schema-shared.js +1 -4
  188. package/.agents/scripts/lib/config-settings-schema-delivery.js +12 -294
  189. package/.agents/scripts/lib/config-settings-schema-quality.js +7 -219
  190. package/.agents/scripts/lib/config-settings-schema.js +37 -274
  191. package/.agents/scripts/lib/coverage-baseline.js +20 -110
  192. package/.agents/scripts/lib/coverage-capture-fullscope.js +12 -37
  193. package/.agents/scripts/lib/coverage-capture-incremental.js +12 -43
  194. package/.agents/scripts/lib/coverage-capture-usage.js +4 -24
  195. package/.agents/scripts/lib/coverage-capture.js +99 -224
  196. package/.agents/scripts/lib/coverage-utils.js +14 -79
  197. package/.agents/scripts/lib/cpu-pool.js +17 -123
  198. package/.agents/scripts/lib/crap-baseline-join.js +16 -88
  199. package/.agents/scripts/lib/crap-coordinates.js +6 -25
  200. package/.agents/scripts/lib/crap-engine.js +40 -153
  201. package/.agents/scripts/lib/crap-method-identity.js +16 -78
  202. package/.agents/scripts/lib/crap-utils.js +31 -155
  203. package/.agents/scripts/lib/cyclomatic-ceiling.js +14 -87
  204. package/.agents/scripts/lib/cyclomatic-scope.js +10 -50
  205. package/.agents/scripts/lib/dead-exports-knip.js +18 -56
  206. package/.agents/scripts/lib/dead-exports-mode.js +5 -24
  207. package/.agents/scripts/lib/degraded-mode.js +3 -26
  208. package/.agents/scripts/lib/dependency-parser.js +8 -40
  209. package/.agents/scripts/lib/dependency-version.js +13 -35
  210. package/.agents/scripts/lib/detect-package-manager.js +6 -36
  211. package/.agents/scripts/lib/doc-tiers.js +22 -126
  212. package/.agents/scripts/lib/duplicate-search.js +8 -72
  213. package/.agents/scripts/lib/env-loader.js +5 -27
  214. package/.agents/scripts/lib/error-redactor.js +6 -31
  215. package/.agents/scripts/lib/errors/index.js +2 -22
  216. package/.agents/scripts/lib/escomplex-ast-compat.js +22 -163
  217. package/.agents/scripts/lib/escomplex-kernel.js +21 -123
  218. package/.agents/scripts/lib/feedback-loop/graduator-core.js +93 -419
  219. package/.agents/scripts/lib/feedback-loop/prior-feedback-fetcher.js +20 -98
  220. package/.agents/scripts/lib/feedback-loop/retro-proposals-graduator.js +27 -151
  221. package/.agents/scripts/lib/findings/audit-ledger.js +23 -97
  222. package/.agents/scripts/lib/findings/classify-finding.js +14 -69
  223. package/.agents/scripts/lib/findings/promote-finding.js +14 -112
  224. package/.agents/scripts/lib/findings/provenance-field.js +11 -52
  225. package/.agents/scripts/lib/findings/route-finding.js +37 -255
  226. package/.agents/scripts/lib/findings/semantic-issue-search.js +14 -59
  227. package/.agents/scripts/lib/findings/severity.js +18 -104
  228. package/.agents/scripts/lib/format-generated-json.js +12 -44
  229. package/.agents/scripts/lib/full-suite-lock.js +160 -429
  230. package/.agents/scripts/lib/full-suite-queue.js +213 -0
  231. package/.agents/scripts/lib/gates/baseline-store.js +5 -9
  232. package/.agents/scripts/lib/gates/friction.js +1 -3
  233. package/.agents/scripts/lib/generated/agentrc-validator.js +2 -2
  234. package/.agents/scripts/lib/gh-exec.js +31 -259
  235. package/.agents/scripts/lib/git/cached-fetch.js +9 -52
  236. package/.agents/scripts/lib/git/sync-from-base.js +15 -107
  237. package/.agents/scripts/lib/git-branch-cleanup.js +14 -61
  238. package/.agents/scripts/lib/git-branch-lifecycle.js +16 -87
  239. package/.agents/scripts/lib/git-utils.js +37 -161
  240. package/.agents/scripts/lib/github/framework-repo.js +8 -71
  241. package/.agents/scripts/lib/github-url.js +2 -17
  242. package/.agents/scripts/lib/import-graph.js +11 -38
  243. package/.agents/scripts/lib/install-cmd-parser.js +4 -13
  244. package/.agents/scripts/lib/json-utils.js +3 -18
  245. package/.agents/scripts/lib/label-constants.js +16 -111
  246. package/.agents/scripts/lib/label-taxonomy.js +4 -30
  247. package/.agents/scripts/lib/maintainability-engine.js +12 -80
  248. package/.agents/scripts/lib/maintainability-unscorable.js +5 -25
  249. package/.agents/scripts/lib/maintainability-utils.js +16 -92
  250. package/.agents/scripts/lib/mandrel-catalog.js +12 -70
  251. package/.agents/scripts/lib/notifications/notifier.js +13 -38
  252. package/.agents/scripts/lib/npm-scripts.js +4 -23
  253. package/.agents/scripts/lib/observability/metrics-ledger.js +16 -76
  254. package/.agents/scripts/lib/observability/runtime-friction.js +44 -286
  255. package/.agents/scripts/lib/observability/signal-validator.js +5 -37
  256. package/.agents/scripts/lib/observability/signals-writer.js +11 -121
  257. package/.agents/scripts/lib/observability/source-classifier.js +21 -203
  258. package/.agents/scripts/lib/observability/terse-result.js +14 -47
  259. package/.agents/scripts/lib/onboard/init-tail.js +13 -74
  260. package/.agents/scripts/lib/onboard/scaffold-docs.js +11 -34
  261. package/.agents/scripts/lib/orchestration/acceptance-eval-decision.js +25 -139
  262. package/.agents/scripts/lib/orchestration/auto-merge-cwd.js +11 -66
  263. package/.agents/scripts/lib/orchestration/behind-recovery.js +10 -55
  264. package/.agents/scripts/lib/orchestration/ceremony-routing.js +5 -75
  265. package/.agents/scripts/lib/orchestration/change-set.js +7 -36
  266. package/.agents/scripts/lib/orchestration/check-baselines/phases/compare.js +9 -46
  267. package/.agents/scripts/lib/orchestration/check-baselines/phases/evaluate.js +11 -44
  268. package/.agents/scripts/lib/orchestration/check-baselines/phases/floors.js +5 -24
  269. package/.agents/scripts/lib/orchestration/check-baselines/phases/friction.js +3 -12
  270. package/.agents/scripts/lib/orchestration/check-baselines/phases/parse-args.js +5 -38
  271. package/.agents/scripts/lib/orchestration/check-baselines/phases/pipeline.js +3 -8
  272. package/.agents/scripts/lib/orchestration/check-baselines/phases/refresh-ack.js +28 -136
  273. package/.agents/scripts/lib/orchestration/check-baselines/phases/report.js +3 -13
  274. package/.agents/scripts/lib/orchestration/check-state.js +92 -0
  275. package/.agents/scripts/lib/orchestration/ci-gap-intake.js +37 -144
  276. package/.agents/scripts/lib/orchestration/ci-rerun-guard.js +42 -189
  277. package/.agents/scripts/lib/orchestration/code-review.js +24 -128
  278. package/.agents/scripts/lib/orchestration/column-sync.js +23 -111
  279. package/.agents/scripts/lib/orchestration/complexity-gate.js +42 -214
  280. package/.agents/scripts/lib/orchestration/deliver-recover.js +36 -168
  281. package/.agents/scripts/lib/orchestration/dependency-analyzer.js +4 -35
  282. package/.agents/scripts/lib/orchestration/dependency-candidates.js +9 -41
  283. package/.agents/scripts/lib/orchestration/diff-magnitude.js +25 -115
  284. package/.agents/scripts/lib/orchestration/doc-reader.js +2 -6
  285. package/.agents/scripts/lib/orchestration/docs-digest.js +13 -51
  286. package/.agents/scripts/lib/orchestration/epic-candidates.js +13 -53
  287. package/.agents/scripts/lib/orchestration/epic-checklist.js +9 -33
  288. package/.agents/scripts/lib/orchestration/epic-container.js +41 -167
  289. package/.agents/scripts/lib/orchestration/epic-expansion.js +10 -40
  290. package/.agents/scripts/lib/orchestration/epic-rollup.js +55 -207
  291. package/.agents/scripts/lib/orchestration/file-assumption-enum.js +2 -22
  292. package/.agents/scripts/lib/orchestration/file-assumptions.js +45 -253
  293. package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-detect.js +9 -46
  294. package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-reap.js +7 -57
  295. package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches.js +21 -126
  296. package/.agents/scripts/lib/orchestration/git-cleanup/phases/cli.js +2 -6
  297. package/.agents/scripts/lib/orchestration/git-cleanup/phases/fast-forward.js +1 -4
  298. package/.agents/scripts/lib/orchestration/git-cleanup/phases/filters.js +1 -5
  299. package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes-ff.js +9 -34
  300. package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes.js +41 -190
  301. package/.agents/scripts/lib/orchestration/git-cleanup/phases/merged-tip.js +9 -45
  302. package/.agents/scripts/lib/orchestration/git-cleanup/phases/parse-args.js +1 -4
  303. package/.agents/scripts/lib/orchestration/git-cleanup/phases/phase-drivers.js +19 -85
  304. package/.agents/scripts/lib/orchestration/git-cleanup/phases/prompts.js +3 -17
  305. package/.agents/scripts/lib/orchestration/git-cleanup/phases/prune.js +1 -5
  306. package/.agents/scripts/lib/orchestration/git-cleanup/phases/render.js +16 -100
  307. package/.agents/scripts/lib/orchestration/git-cleanup/phases/stashes.js +1 -4
  308. package/.agents/scripts/lib/orchestration/lease-guard-shared.js +16 -67
  309. package/.agents/scripts/lib/orchestration/lifecycle/emit-ledger-event.js +9 -33
  310. package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-flip-failed.js +8 -29
  311. package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-unlanded.js +15 -68
  312. package/.agents/scripts/lib/orchestration/light-backstop.js +11 -49
  313. package/.agents/scripts/lib/orchestration/light-escalation.js +21 -89
  314. package/.agents/scripts/lib/orchestration/light-suitability.js +26 -231
  315. package/.agents/scripts/lib/orchestration/merge-block-class.js +39 -216
  316. package/.agents/scripts/lib/orchestration/merge-poll.js +104 -377
  317. package/.agents/scripts/lib/orchestration/merge-queue.js +158 -0
  318. package/.agents/scripts/lib/orchestration/pinned-identifier-lint.js +17 -57
  319. package/.agents/scripts/lib/orchestration/plan-context.js +52 -303
  320. package/.agents/scripts/lib/orchestration/plan-critic-conditions.js +22 -79
  321. package/.agents/scripts/lib/orchestration/plan-critics-evaluate.js +5 -31
  322. package/.agents/scripts/lib/orchestration/plan-metrics.js +29 -108
  323. package/.agents/scripts/lib/orchestration/plan-navigation.js +8 -27
  324. package/.agents/scripts/lib/orchestration/plan-persist/acceptance-handle-repair.js +12 -49
  325. package/.agents/scripts/lib/orchestration/plan-persist/audit-provenance.js +18 -73
  326. package/.agents/scripts/lib/orchestration/plan-persist/changes-repair.js +14 -78
  327. package/.agents/scripts/lib/orchestration/plan-persist/cross-plan-links.js +6 -30
  328. package/.agents/scripts/lib/orchestration/plan-persist/epic-adoption.js +14 -65
  329. package/.agents/scripts/lib/orchestration/plan-persist/epic-ops.js +21 -76
  330. package/.agents/scripts/lib/orchestration/plan-persist/external-deps.js +6 -43
  331. package/.agents/scripts/lib/orchestration/plan-persist/persist-helpers.js +14 -68
  332. package/.agents/scripts/lib/orchestration/plan-persist/plan-context-source.js +9 -41
  333. package/.agents/scripts/lib/orchestration/plan-persist/run-plan-persist.js +49 -248
  334. package/.agents/scripts/lib/orchestration/plan-persist/soft-findings.js +2 -12
  335. package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +85 -368
  336. package/.agents/scripts/lib/orchestration/plan-persist/summary.js +8 -38
  337. package/.agents/scripts/lib/orchestration/plan-persist/supersede-ops.js +30 -190
  338. package/.agents/scripts/lib/orchestration/plan-persist/wave-collision-gate.js +9 -49
  339. package/.agents/scripts/lib/orchestration/plan-persist/wave-serialisation.js +7 -28
  340. package/.agents/scripts/lib/orchestration/plan-reachability.js +13 -42
  341. package/.agents/scripts/lib/orchestration/plan-run-labels/reap.js +16 -91
  342. package/.agents/scripts/lib/orchestration/plan-runner/worktree-sweep.js +16 -54
  343. package/.agents/scripts/lib/orchestration/plan-text-hygiene.js +10 -52
  344. package/.agents/scripts/lib/orchestration/planning/authoring-context.js +14 -109
  345. package/.agents/scripts/lib/orchestration/planning/memory-pool-advisory.js +11 -83
  346. package/.agents/scripts/lib/orchestration/pr-watch.js +48 -306
  347. package/.agents/scripts/lib/orchestration/project-meta-cache.js +15 -80
  348. package/.agents/scripts/lib/orchestration/project-meta-resolver.js +10 -51
  349. package/.agents/scripts/lib/orchestration/reassert-status-column.js +12 -76
  350. package/.agents/scripts/lib/orchestration/remote-verifier.js +12 -36
  351. package/.agents/scripts/lib/orchestration/resolve-stories.js +33 -164
  352. package/.agents/scripts/lib/orchestration/retro-proposals.js +66 -361
  353. package/.agents/scripts/lib/orchestration/review-base-ref.js +9 -43
  354. package/.agents/scripts/lib/orchestration/review-depth.js +12 -94
  355. package/.agents/scripts/lib/orchestration/review-providers/codex.js +10 -111
  356. package/.agents/scripts/lib/orchestration/review-providers/degraded-gates.js +13 -71
  357. package/.agents/scripts/lib/orchestration/review-providers/findings-renderer.js +7 -51
  358. package/.agents/scripts/lib/orchestration/review-providers/mi-exemptions.js +8 -53
  359. package/.agents/scripts/lib/orchestration/review-providers/native.js +30 -214
  360. package/.agents/scripts/lib/orchestration/review-providers/parse-findings.js +7 -52
  361. package/.agents/scripts/lib/orchestration/review-providers/review-depth.js +4 -33
  362. package/.agents/scripts/lib/orchestration/review-providers/review-provider-factory.js +11 -71
  363. package/.agents/scripts/lib/orchestration/review-providers/scoped-lint.js +19 -131
  364. package/.agents/scripts/lib/orchestration/review-providers/security-review.js +6 -89
  365. package/.agents/scripts/lib/orchestration/review-providers/types.js +26 -56
  366. package/.agents/scripts/lib/orchestration/review-providers/ultrareview.js +3 -46
  367. package/.agents/scripts/lib/orchestration/run-epilogue.js +40 -199
  368. package/.agents/scripts/lib/orchestration/run-scoped-config.js +13 -81
  369. package/.agents/scripts/lib/orchestration/single-story-close/close-note.js +7 -34
  370. package/.agents/scripts/lib/orchestration/single-story-close/failed-terminal.js +16 -89
  371. package/.agents/scripts/lib/orchestration/single-story-close/gate-log.js +18 -109
  372. package/.agents/scripts/lib/orchestration/single-story-close/phases/auto-merge.js +190 -280
  373. package/.agents/scripts/lib/orchestration/single-story-close/phases/base-sync.js +18 -80
  374. package/.agents/scripts/lib/orchestration/single-story-close/phases/close-validation.js +103 -97
  375. package/.agents/scripts/lib/orchestration/single-story-close/phases/code-review.js +8 -64
  376. package/.agents/scripts/lib/orchestration/single-story-close/phases/confirm-merge.js +183 -485
  377. package/.agents/scripts/lib/orchestration/single-story-close/phases/conventional-subject.js +30 -134
  378. package/.agents/scripts/lib/orchestration/single-story-close/phases/graphql-preflight.js +9 -50
  379. package/.agents/scripts/lib/orchestration/single-story-close/phases/lock-wait-pending.js +49 -0
  380. package/.agents/scripts/lib/orchestration/single-story-close/phases/normalize-pr-title.js +13 -86
  381. package/.agents/scripts/lib/orchestration/single-story-close/phases/options.js +20 -95
  382. package/.agents/scripts/lib/orchestration/single-story-close/phases/post-land.js +46 -203
  383. package/.agents/scripts/lib/orchestration/single-story-close/phases/pre-gate-steps.js +8 -50
  384. package/.agents/scripts/lib/orchestration/single-story-close/phases/pull-request.js +12 -83
  385. package/.agents/scripts/lib/orchestration/single-story-close/phases/push.js +6 -39
  386. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-block.js +1 -6
  387. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-outcome.js +4 -28
  388. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-override.js +6 -51
  389. package/.agents/scripts/lib/orchestration/single-story-close/phases/worktree-reap.js +6 -34
  390. package/.agents/scripts/lib/orchestration/single-story-close/phases/wrong-tree-guard.js +23 -121
  391. package/.agents/scripts/lib/orchestration/single-story-close/runner.js +110 -290
  392. package/.agents/scripts/lib/orchestration/single-story-lease-guard.js +15 -69
  393. package/.agents/scripts/lib/orchestration/story-body-gate.js +4 -23
  394. package/.agents/scripts/lib/orchestration/story-close/baseline-upward-writeback.js +50 -179
  395. package/.agents/scripts/lib/orchestration/story-close/context-budget-writeback.js +11 -41
  396. package/.agents/scripts/lib/orchestration/story-close/format-autofix.js +23 -311
  397. package/.agents/scripts/lib/orchestration/story-close/phases/local-lens-review.js +22 -147
  398. package/.agents/scripts/lib/orchestration/story-close/phases/review-core.js +16 -67
  399. package/.agents/scripts/lib/orchestration/story-deliver-terminal-schema.js +12 -68
  400. package/.agents/scripts/lib/orchestration/story-deliver-terminal.js +42 -201
  401. package/.agents/scripts/lib/orchestration/story-follow-ups.js +43 -245
  402. package/.agents/scripts/lib/orchestration/story-init-envelope.js +4 -23
  403. package/.agents/scripts/lib/orchestration/story-init-remote.js +2 -6
  404. package/.agents/scripts/lib/orchestration/story-reachability.js +3 -23
  405. package/.agents/scripts/lib/orchestration/task-body-validator.js +12 -126
  406. package/.agents/scripts/lib/orchestration/ticket-lease.js +28 -131
  407. package/.agents/scripts/lib/orchestration/ticket-validator-conflicts.js +15 -149
  408. package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +5 -33
  409. package/.agents/scripts/lib/orchestration/ticket-validator.js +39 -181
  410. package/.agents/scripts/lib/orchestration/ticketing/bulk.js +51 -244
  411. package/.agents/scripts/lib/orchestration/ticketing/reads.js +39 -250
  412. package/.agents/scripts/lib/orchestration/ticketing/state.js +14 -68
  413. package/.agents/scripts/lib/orchestration/ticketing/transition.js +46 -263
  414. package/.agents/scripts/lib/orchestration/ticketing.js +2 -26
  415. package/.agents/scripts/lib/orchestration/verify-credit.js +18 -79
  416. package/.agents/scripts/lib/orchestration/worktree-dirty.js +5 -30
  417. package/.agents/scripts/lib/path-security.js +3 -6
  418. package/.agents/scripts/lib/plan-phase-cleanup.js +9 -49
  419. package/.agents/scripts/lib/preflight-runner.js +13 -69
  420. package/.agents/scripts/lib/process-group.js +143 -0
  421. package/.agents/scripts/lib/project-root.js +2 -8
  422. package/.agents/scripts/lib/provider-factory.js +2 -25
  423. package/.agents/scripts/lib/qa/console-allowlist.js +10 -59
  424. package/.agents/scripts/lib/qa/qa-session.js +15 -69
  425. package/.agents/scripts/lib/qa/redact-evidence.js +18 -129
  426. package/.agents/scripts/lib/qa/resolve-qa-contract.js +26 -135
  427. package/.agents/scripts/lib/qa/resolve-selection.js +16 -84
  428. package/.agents/scripts/lib/reserved-test-ids.js +9 -47
  429. package/.agents/scripts/lib/runtime-deps/dep-resolution.js +13 -53
  430. package/.agents/scripts/lib/runtime-deps/ensure-installed.js +10 -44
  431. package/.agents/scripts/lib/runtime-deps/manifest.js +10 -30
  432. package/.agents/scripts/lib/runtime-deps/parser-major.js +15 -51
  433. package/.agents/scripts/lib/runtime-deps/preflight.js +4 -22
  434. package/.agents/scripts/lib/runtime-deps/scan-imports.js +11 -55
  435. package/.agents/scripts/lib/signals/detectors/common.js +12 -38
  436. package/.agents/scripts/lib/signals/index.js +2 -19
  437. package/.agents/scripts/lib/signals/schema.js +14 -109
  438. package/.agents/scripts/lib/signals/write.js +2 -11
  439. package/.agents/scripts/lib/single-story/confirm-merge.js +31 -72
  440. package/.agents/scripts/lib/single-story/story-merged-notify.js +8 -49
  441. package/.agents/scripts/lib/single-story-sweep/protection-ctx.js +4 -26
  442. package/.agents/scripts/lib/single-story-sweep/protection.js +13 -100
  443. package/.agents/scripts/lib/single-story-sweep/sweep-lock.js +60 -258
  444. package/.agents/scripts/lib/single-story-sweep.js +14 -97
  445. package/.agents/scripts/lib/skills/parse-skill.js +13 -59
  446. package/.agents/scripts/lib/skills/skills-index.js +8 -29
  447. package/.agents/scripts/lib/skills/walk-skill-files.js +17 -78
  448. package/.agents/scripts/lib/source-extensions.js +11 -42
  449. package/.agents/scripts/lib/source-text/strip-js-comments.js +8 -41
  450. package/.agents/scripts/lib/stdio-flush.js +9 -36
  451. package/.agents/scripts/lib/story-adjacency.js +8 -40
  452. package/.agents/scripts/lib/story-body/body-format-lints.js +22 -83
  453. package/.agents/scripts/lib/story-body/footer-block.js +11 -44
  454. package/.agents/scripts/lib/story-body/story-body.js +83 -358
  455. package/.agents/scripts/lib/temp-retention.js +42 -143
  456. package/.agents/scripts/lib/templates/decomposer-prompts.js +11 -65
  457. package/.agents/scripts/lib/test-env.js +12 -65
  458. package/.agents/scripts/lib/test-run-credit.js +10 -65
  459. package/.agents/scripts/lib/test-runner-contract.js +19 -74
  460. package/.agents/scripts/lib/test-temp.js +38 -184
  461. package/.agents/scripts/lib/test-tiers.js +12 -96
  462. package/.agents/scripts/lib/ticket-body-sections.js +21 -96
  463. package/.agents/scripts/lib/transpile.js +15 -74
  464. package/.agents/scripts/lib/util/concurrent-map.js +6 -25
  465. package/.agents/scripts/lib/util/parse-id-list.js +8 -34
  466. package/.agents/scripts/lib/util/poll-loop.js +8 -28
  467. package/.agents/scripts/lib/util/with-timeout.js +2 -11
  468. package/.agents/scripts/lib/validation-evidence.js +21 -96
  469. package/.agents/scripts/lib/wave-runner/footprint.js +17 -70
  470. package/.agents/scripts/lib/wave-runner/live-probe.js +53 -221
  471. package/.agents/scripts/lib/wave-runner/ready-set.js +72 -301
  472. package/.agents/scripts/lib/workers/crap-worker.js +11 -64
  473. package/.agents/scripts/lib/workers/maintainability-report-worker.js +8 -45
  474. package/.agents/scripts/lib/workers/maintainability-worker.js +5 -21
  475. package/.agents/scripts/lib/workers/serve-worker-messages.js +2 -18
  476. package/.agents/scripts/lib/workflow-closure.js +22 -105
  477. package/.agents/scripts/lib/workspace-provisioner.js +16 -54
  478. package/.agents/scripts/lib/worktree/git-hooks.js +15 -60
  479. package/.agents/scripts/lib/worktree/lifecycle/force-drain.js +20 -60
  480. package/.agents/scripts/lib/worktree/lifecycle/merge-reachability.js +10 -62
  481. package/.agents/scripts/lib/worktree/lifecycle/pending-cleanup.js +22 -86
  482. package/.agents/scripts/lib/worktree/lifecycle/reap.js +24 -126
  483. package/.agents/scripts/lib/worktree/lifecycle-manager.js +2 -20
  484. package/.agents/scripts/lib/worktree/node-modules-strategy.js +46 -180
  485. package/.agents/scripts/lib/worktree-manager.js +15 -40
  486. package/.agents/scripts/lint-issue-body.js +12 -68
  487. package/.agents/scripts/mandrel-update-preflight.js +10 -70
  488. package/.agents/scripts/merge-baseline.js +30 -104
  489. package/.agents/scripts/nav-registry-diff.js +22 -108
  490. package/.agents/scripts/notify.js +12 -69
  491. package/.agents/scripts/plan-context.js +27 -111
  492. package/.agents/scripts/plan-critics.js +12 -66
  493. package/.agents/scripts/plan-persist.js +31 -148
  494. package/.agents/scripts/plan-run-epilogue.js +11 -37
  495. package/.agents/scripts/pr-watch-with-update.js +76 -267
  496. package/.agents/scripts/providers/github/auth.js +3 -8
  497. package/.agents/scripts/providers/github/blocked-by-add.js +14 -61
  498. package/.agents/scripts/providers/github/board-add.js +5 -21
  499. package/.agents/scripts/providers/github/branch-protection.js +11 -43
  500. package/.agents/scripts/providers/github/cache.js +2 -14
  501. package/.agents/scripts/providers/github/comments.js +7 -40
  502. package/.agents/scripts/providers/github/compose.js +3 -19
  503. package/.agents/scripts/providers/github/errors.js +22 -125
  504. package/.agents/scripts/providers/github/issues.js +31 -123
  505. package/.agents/scripts/providers/github/labels.js +24 -124
  506. package/.agents/scripts/providers/github/mappers.js +5 -27
  507. package/.agents/scripts/providers/github/merge-methods.js +3 -22
  508. package/.agents/scripts/providers/github/project-board.js +2 -17
  509. package/.agents/scripts/providers/github/projects-v2-graphql.js +3 -6
  510. package/.agents/scripts/providers/github/request-helpers.js +5 -32
  511. package/.agents/scripts/providers/github/search-budget.js +9 -39
  512. package/.agents/scripts/providers/github/search-query.js +5 -26
  513. package/.agents/scripts/providers/github/sub-issue-add.js +15 -65
  514. package/.agents/scripts/providers/github/sub-issues.js +7 -36
  515. package/.agents/scripts/providers/github/tickets.js +32 -134
  516. package/.agents/scripts/providers/github.js +18 -59
  517. package/.agents/scripts/prune-plan-run-labels.js +12 -46
  518. package/.agents/scripts/quality-preview.js +35 -220
  519. package/.agents/scripts/resolve-doc-tiers.js +3 -26
  520. package/.agents/scripts/resolve-stories.js +16 -67
  521. package/.agents/scripts/resync-status-column.js +6 -25
  522. package/.agents/scripts/run-tests.js +29 -104
  523. package/.agents/scripts/single-story-close.js +23 -135
  524. package/.agents/scripts/single-story-confirm-merge.js +32 -139
  525. package/.agents/scripts/single-story-init.js +47 -209
  526. package/.agents/scripts/stories-wave-tick.js +102 -472
  527. package/.agents/scripts/sync-agentrc.js +3 -21
  528. package/.agents/scripts/sync-claude-agents.js +9 -55
  529. package/.agents/scripts/sync-claude-commands.js +20 -110
  530. package/.agents/scripts/test-wrapper.js +6 -43
  531. package/.agents/scripts/update-coverage-baseline.js +5 -22
  532. package/.agents/scripts/update-crap-baseline.js +7 -30
  533. package/.agents/scripts/update-duplication-baseline.js +16 -92
  534. package/.agents/scripts/update-maintainability-baseline.js +8 -62
  535. package/.agents/scripts/update-ticket-state.js +1 -7
  536. package/.agents/scripts/validate-skills.js +6 -26
  537. package/.agents/templates/agent-protocol.md +2 -2
  538. package/.agents/templates/docs/audit-sweep-runbook.md +3 -4
  539. package/.agents/workflows/audit-accessibility.md +4 -7
  540. package/.agents/workflows/audit-adrs.md +3 -6
  541. package/.agents/workflows/audit-architecture.md +3 -11
  542. package/.agents/workflows/audit-baselines.md +6 -9
  543. package/.agents/workflows/audit-clean-code.md +8 -12
  544. package/.agents/workflows/audit-data-model.md +3 -7
  545. package/.agents/workflows/audit-dependencies.md +4 -7
  546. package/.agents/workflows/audit-devops.md +4 -8
  547. package/.agents/workflows/audit-documentation.md +1 -4
  548. package/.agents/workflows/audit-mobile.md +4 -7
  549. package/.agents/workflows/audit-navigability.md +3 -6
  550. package/.agents/workflows/audit-performance.md +2 -4
  551. package/.agents/workflows/audit-privacy.md +4 -7
  552. package/.agents/workflows/audit-quality.md +4 -7
  553. package/.agents/workflows/audit-security.md +4 -7
  554. package/.agents/workflows/audit-seo.md +4 -7
  555. package/.agents/workflows/audit-sre.md +4 -7
  556. package/.agents/workflows/audit-to-stories.md +17 -30
  557. package/.agents/workflows/audit-ux-ui.md +4 -7
  558. package/.agents/workflows/helpers/audit-lens-core.md +1 -1
  559. package/.agents/workflows/helpers/code-quality-guardrails.md +12 -15
  560. package/.agents/workflows/helpers/deliver-digest.md +6 -4
  561. package/.agents/workflows/helpers/deliver-reference.md +114 -188
  562. package/.agents/workflows/helpers/deliver-story-reference.md +189 -533
  563. package/.agents/workflows/helpers/plan-reference.md +86 -139
  564. package/.agents/workflows/helpers/qa-core.md +12 -0
  565. package/.agents/workflows/memory-consolidate.md +1 -1
  566. package/.agents/workflows/qa-assist.md +27 -71
  567. package/.agents/workflows/qa-explore.md +19 -59
  568. package/.agents/workflows/qa-run.md +11 -33
  569. package/README.md +1 -1
  570. package/bin/mandrel.js +5 -46
  571. package/bin/postinstall.js +18 -107
  572. package/docs/CHANGELOG.md +32 -0
  573. package/lib/cli/doctor.js +11 -71
  574. package/lib/cli/init.js +26 -165
  575. package/lib/cli/migrate.js +5 -64
  576. package/lib/cli/registry.js +84 -467
  577. package/lib/cli/sync-agents.js +4 -64
  578. package/lib/cli/sync-commands.js +11 -64
  579. package/lib/cli/sync.js +34 -213
  580. package/lib/cli/uninstall.js +40 -219
  581. package/lib/cli/update.js +105 -661
  582. package/lib/cli/version-check.js +8 -72
  583. package/lib/cli/version-helpers.js +14 -87
  584. package/lib/migrations/helpers/retire-agentrc-key.js +11 -52
  585. package/lib/migrations/index.js +15 -92
  586. package/lib/migrations/steps/2.1.0-retire-mi-drop-knobs.js +2 -15
  587. package/lib/migrations/steps/2.1.0-retire-verify-concurrency-cap.js +1 -13
  588. package/lib/migrations/steps/2.11.0-retire-max-seed-words.js +2 -15
  589. package/lib/migrations/steps/2.2.0-retire-epic-ac-tags.js +9 -38
  590. package/lib/migrations/steps/2.20.0-retire-codebase-snapshot.js +1 -13
  591. package/lib/migrations/steps/2.32.0-retire-lint-baseline-command.js +2 -27
  592. package/lib/migrations/steps/2.57.0-retire-delivery-limit-knobs.js +2 -23
  593. package/lib/migrations/steps/2.57.0-retire-planning-limit-knobs.js +2 -27
  594. package/lib/migrations/steps/2.60.0-retire-audit-results-autofile.js +2 -21
  595. package/lib/migrations/steps/strip-removed-agentrc-keys.js +333 -0
  596. package/package.json +16 -14
  597. package/.agents/docs/SDLC.md +0 -590
  598. package/.agents/docs/quality-gates.md +0 -1183
  599. package/.agents/rules/known-tooling-behavior.md +0 -200
  600. package/.agents/rules/orchestration-error-handling.md +0 -61
  601. package/.agents/rules/test-seams.md +0 -59
  602. package/.agents/schemas/baselines/lighthouse.schema.json +0 -59
  603. package/.agents/schemas/baselines/lint.schema.json +0 -47
  604. package/.agents/scripts/check-action-pinning.js +0 -260
  605. package/.agents/scripts/check-audit-attribution.js +0 -302
  606. package/.agents/scripts/check-baseline-drift.js +0 -211
  607. package/.agents/scripts/check-baseline-scope.js +0 -362
  608. package/.agents/scripts/check-generated-validator.js +0 -202
  609. package/.agents/scripts/check-knip-entries.js +0 -159
  610. package/.agents/scripts/check-lifecycle-lint.js +0 -294
  611. package/.agents/scripts/check-pinned-override-notes.js +0 -102
  612. package/.agents/scripts/check-schema-references.js +0 -368
  613. package/.agents/scripts/check-test-portability.js +0 -512
  614. package/.agents/scripts/check-workflow-citations.js +0 -218
  615. package/.agents/scripts/check-workflow-cli-lint.js +0 -299
  616. package/.agents/scripts/check-workflow-timeouts.js +0 -291
  617. package/.agents/scripts/install-matrix-assert.js +0 -326
  618. package/.agents/scripts/lib/audit-advisories.js +0 -195
  619. package/.agents/scripts/lib/audit-attribution.js +0 -134
  620. package/.agents/scripts/lib/baselines/drift-detector.js +0 -351
  621. package/.agents/scripts/lib/baselines/kinds/lighthouse.js +0 -87
  622. package/.agents/scripts/lib/baselines/kinds/lint.js +0 -184
  623. package/.agents/scripts/lib/baselines/orphan-pruner.js +0 -233
  624. package/.agents/scripts/lib/baselines/scope-assert.js +0 -223
  625. package/.agents/scripts/lib/baselines/scope-inventory.js +0 -314
  626. package/.agents/scripts/lib/c8-cli-path.js +0 -21
  627. package/.agents/scripts/lib/config/gates/lighthouse.schema.js +0 -51
  628. package/.agents/scripts/lib/config/gates/lint.schema.js +0 -18
  629. package/.agents/scripts/lib/dynamic-workflow/architecture-report-contract.js +0 -70
  630. package/.agents/scripts/lib/dynamic-workflow/audit-orchestrator.js +0 -284
  631. package/.agents/scripts/lib/dynamic-workflow/clean-code-report-contract.js +0 -80
  632. package/.agents/scripts/lib/dynamic-workflow/degraded-coverage.js +0 -81
  633. package/.agents/scripts/lib/dynamic-workflow/documentation-report-contract.js +0 -87
  634. package/.agents/scripts/lib/dynamic-workflow/performance-report-contract.js +0 -74
  635. package/.agents/scripts/lib/dynamic-workflow/quality-report-contract.js +0 -90
  636. package/.agents/scripts/lib/dynamic-workflow/report-contract-core.js +0 -43
  637. package/.agents/scripts/lib/dynamic-workflow/security-report-contract.js +0 -83
  638. package/.agents/scripts/lib/fs-walk.js +0 -52
  639. package/.agents/scripts/lib/knip-config-resolver.js +0 -181
  640. package/.agents/scripts/lib/knip-entry-sync.js +0 -452
  641. package/.agents/scripts/lib/pinned-override-notes.js +0 -88
  642. package/.agents/scripts/lib/pinned-override-resolve.js +0 -212
  643. package/.agents/scripts/lib/test-isolate/cli-options.js +0 -93
  644. package/.agents/scripts/lib/test-isolate/env-snapshot-loader.js +0 -52
  645. package/.agents/scripts/lib/test-isolate/list-files.js +0 -90
  646. package/.agents/scripts/lib/test-isolate/parse-tap.js +0 -75
  647. package/.agents/scripts/lib/test-isolate/progress-log.js +0 -45
  648. package/.agents/scripts/lib/test-isolate/render-report.js +0 -97
  649. package/.agents/scripts/lib/test-isolate/run-isolate.js +0 -87
  650. package/.agents/scripts/lib/test-isolate/runner.js +0 -483
  651. package/.agents/scripts/lib/test-profile/parse-tap.js +0 -136
  652. package/.agents/scripts/lib/test-profile/render-report.js +0 -45
  653. package/.agents/scripts/lint-label-vocabulary.js +0 -214
  654. package/.agents/scripts/post-structured-comment.js +0 -127
  655. package/.agents/scripts/provision-git-hooks.js +0 -85
  656. package/.agents/scripts/prune-baseline-orphans.js +0 -181
  657. package/.agents/scripts/run-coverage.js +0 -197
  658. package/.agents/scripts/run-lint.js +0 -133
  659. package/.agents/scripts/run-test-profile.js +0 -129
  660. package/.agents/scripts/run-verify.js +0 -125
  661. package/.agents/scripts/test-isolate.js +0 -55
  662. package/.agents/scripts/update-dead-exports-baseline.js +0 -321
@@ -1,85 +1,30 @@
1
1
  /**
2
- * phases/auto-merge.js — enable GitHub native auto-merge on the PR.
2
+ * phases/auto-merge.js — arm GitHub native auto-merge (squash, delete branch).
3
+ * Non-fatal: a failure returns `{ enabled: false, reason }`. The arm runs from
4
+ * the primary worktree so `--delete-branch`'s local `git checkout <base>`
5
+ * cannot collide with a worktree holding the base.
3
6
  *
4
- * Mirrors the v2 `single-story-close.js` finalize call shape: squash strategy, delete
5
- * the branch on merge. Non-fatal — returns `{ enabled: false, reason }`
6
- * on any failure so the caller can fall back to the operator-merges-button
7
- * path.
8
- *
9
- * Story #2990 routed the underlying `gh pr merge` call through the
10
- * `lib/gh-exec.js` facade (the same shim the `providers/github/`
11
- * gateways use). The `runner` seam is preserved so existing tests can
12
- * inject a synchronous fake; the default runner delegates to
13
- * `gh.pr.merge`, which spawns through the classified, typed-error
14
- * surface instead of a raw `execFileSync('gh', …)` call.
15
- *
16
- * Story #4282 made arming robust when the base branch is checked out by a
17
- * git worktree. The `--delete-branch` flag makes `gh` shell out to local
18
- * `git` (including a `git checkout <base>`); from a per-Story worktree cwd
19
- * that collides with the base branch already checked out by the primary
20
- * worktree (`fatal: '<base>' is already used by worktree`). We now resolve
21
- * the arm cwd to the **primary worktree root** (which holds the base
22
- * branch) via `resolveAutoMergeArmCwd`, so `gh`'s local checkout is a
23
- * no-op. `--delete-branch` is preserved verbatim, so the PR head branch is
24
- * still deleted on merge without depending on the repo's auto-delete
25
- * setting. Resolution is non-fatal — it degrades to the original cwd.
26
- *
27
- * Story #4681 made the arm survive a LOCAL-ONLY cleanup failure. Against an
28
- * already-mergeable PR, `gh pr merge --auto --squash --delete-branch` merges
29
- * immediately and then shells out to local `git` to drop the head branch.
30
- * When the per-Story worktree still holds `story-<id>`, that local delete
31
- * fails (`Cannot delete branch 'story-<id>' used by worktree at …`) and `gh`
32
- * exits non-zero — even though the REMOTE merge already landed. Reporting
33
- * that as an arm failure sent close's confirm phase straight to
34
- * `blockOnUnlanded`, flipping a merged Story to a stale `agent::blocked` that
35
- * only a hand-run `single-story-confirm-merge.js` could undo. The failure is
36
- * now classified: a local-cleanup-only signature reports the arm as ENABLED
37
- * with `localCleanupDeferred: true`, so the confirm phase polls the PR
38
- * (observes MERGED) and the post-land tail reaps the local ref. Every other
39
- * non-zero exit — a genuinely refused REMOTE merge — keeps the pre-existing
40
- * `enabled: false` → blocked behaviour verbatim.
41
- *
42
- * Story #4682 restored the direct-merge fallback the v2.0.0 Story-only cutover
43
- * dropped (originally PR #4480 / Story #4472, in the retired `AutomergeArmer`).
44
- * GitHub native auto-merge (`gh pr merge --auto`) can only be QUEUED on a repo
45
- * that has the "Allow auto-merge" setting enabled — which in practice requires
46
- * branch protection. A repo with NO required checks and NO branch protection
47
- * (every mandrel-bench sandbox, many real consumer repos) refuses the `--auto`
48
- * arm: either "auto-merge is not allowed for this repository", or — once the
49
- * PR has settled to an immediately-mergeable state, which the SECOND delivery
50
- * into a warm repo reaches faster than the first into a cold one — the
51
- * `enablePullRequestAutoMerge` "Pull request is in clean status" refusal. The
52
- * close gates and Story-scope review have already cleared the merge by the
53
- * time the arm runs, so the safe, must-land-satisfying response is a direct
54
- * immediate squash-merge (no `--auto`). When the `--auto` failure matches the
55
- * narrow {@link isAutoMergeUnavailable} signature, `enableAutoMergeWith`
56
- * retries `gh pr merge --squash --delete-branch` and reports
57
- * `{ enabled: true, directMerged: true }` on success — so the confirm phase
58
- * polls the PR, observes MERGED, and lands it instead of blocking a PR that
59
- * would never merge on its own. Every OTHER `--auto` failure — a genuine
60
- * conflict, a red required check, an auth fault — matches neither the
61
- * local-cleanup nor the unavailable signature and keeps blocking verbatim.
7
+ * A merge-queue base is armed with a bare `--auto` instead: `gh` refuses
8
+ * `--delete-branch` under a queue, the queue rule picks the strategy, and the
9
+ * repo's `delete_branch_on_merge` owns the remote branch reap.
62
10
  */
63
11
 
64
- import { gh as defaultGh } from '../../../gh-exec.js';
12
+ import { gh as defaultGh, describeGhFailure } from '../../../gh-exec.js';
65
13
  import { resolveAutoMergeArmCwd } from '../../auto-merge-cwd.js';
66
14
  import {
67
- advisoryCheckFailedBlocksArm,
15
+ decideAdvisoryGateBlock,
68
16
  deriveRedHeadRuns,
69
- resolveAdvisoryGateVerdict,
70
- selectBlockingRedRuns,
71
17
  } from '../../merge-poll.js';
18
+ import {
19
+ armForMergeQueue,
20
+ disarmByDequeue,
21
+ MERGE_QUEUE_REFUSAL,
22
+ readMergeQueueState,
23
+ } from '../../merge-queue.js';
72
24
 
73
25
  /**
74
- * Arm reasons that mean **the operator deliberately owns the merge** — the PR
75
- * was never armed because it was asked not to be, not because arming failed.
76
- *
77
- * The distinction is load-bearing: an un-armed-by-request PR has nothing for
78
- * close to land, so `resolveWaitForMerge` (`./options.js`) resolves
79
- * `waitForMerge` to `false` for these reasons and the Story rests at
80
- * `agent::closing` for the human. Every *other* falsy arm outcome
81
- * (`pr-number-unparseable`, an `enableAutoMerge` failure) is a genuine fault
82
- * and still routes through the merge-unlanded block path.
26
+ * The operator deliberately owns the merge, so close does not wait for it;
27
+ * every other falsy arm outcome is a genuine fault.
83
28
  */
84
29
  const OPERATOR_MERGE_ARM_REASONS = Object.freeze([
85
30
  'disabled-by-flag',
@@ -95,34 +40,16 @@ export function isOperatorMergeReason(reason) {
95
40
  }
96
41
 
97
42
  /**
98
- * Signatures of a `gh pr merge --delete-branch` failure whose ONLY casualty
99
- * is the LOCAL head-branch cleanup that runs *after* the remote merge has
100
- * already been performed (or auto-merge already armed).
101
- *
102
- * Each pattern is emitted by local `git` (or `gh`'s wrapper around it) and
103
- * names branch DELETION specifically:
104
- * - `Cannot delete branch '<name>' used by worktree at …` — `git branch -D`
105
- * refusing a ref another worktree has checked out (the Story #4681 report).
106
- * - `failed to delete local branch …` — `gh`'s own wrapper wording.
107
- *
108
- * Deliberately narrow on two fronts. A genuinely refused REMOTE merge ("Pull
109
- * request is not mergeable", a required status check, branch protection)
110
- * matches neither pattern and keeps the existing blocked path. Nor does the
111
- * bare `fatal: '<base>' is already used by worktree` checkout collision Story
112
- * #4282 defends against: that one aborts `gh` *before* the branch delete and
113
- * carries no evidence the merge stands, so it must keep failing the arm.
43
+ * A `gh pr merge --delete-branch` failure whose only casualty is the LOCAL
44
+ * head-branch delete after the remote merge/arm already happened. Deliberately
45
+ * narrow: a refused remote merge, and the `'<base>' is already used by
46
+ * worktree` checkout collision (which aborts before the merge), must still
47
+ * fail the arm.
114
48
  */
115
49
  const LOCAL_CLEANUP_FAILURE =
116
50
  /cannot delete branch[^\n]*used by worktree|failed to delete (?:the )?local branch/i;
117
51
 
118
52
  /**
119
- * Whether a non-zero `gh pr merge` exit is attributable solely to local
120
- * branch cleanup, leaving the remote merge/arm itself intact.
121
- *
122
- * Module-private on purpose: `enableAutoMergeWith` is the only caller and the
123
- * only surface worth pinning, so the classification is asserted through it
124
- * rather than through a test-only export.
125
- *
126
53
  * @param {string|undefined|null} stderr
127
54
  * @returns {boolean}
128
55
  */
@@ -131,33 +58,10 @@ function isLocalCleanupOnlyFailure(stderr) {
131
58
  }
132
59
 
133
60
  /**
134
- * Pure: does a `gh pr merge --auto` stderr indicate that GitHub native
135
- * auto-merge is UNAVAILABLE on this repository / PR — as opposed to a genuine
136
- * arm failure (a merge conflict, a red required check, an auth fault)?
137
- *
138
- * Two distinct refusals both mean "there is no queued auto-merge for this repo,
139
- * merge it directly instead", and both are safe to retry as an immediate
140
- * squash-merge:
141
- *
142
- * - **"auto-merge is not allowed for this repository"** — the repo has no
143
- * "Allow auto-merge" setting (no branch protection). Constant per repo.
144
- * - **"Pull request is in clean status"** — the `enablePullRequestAutoMerge`
145
- * GraphQL mutation refuses to queue a merge on a PR that is ALREADY
146
- * immediately mergeable with nothing to wait for (no required checks
147
- * pending). This is the second-delivery wedge (Story #4682): the first
148
- * delivery into a cold sandbox arms while GitHub is still computing the
149
- * fresh PR's mergeability (the arm queues, then merges); the second
150
- * delivery into the now-warm repo hits an instantly-clean PR, so the arm
151
- * is refused here.
152
- *
153
- * Only these classes fall through to the direct-merge fallback; everything
154
- * else (an unmatched non-zero exit) keeps the `enabled: false` → blocked path.
155
- * Matched case-insensitively.
156
- *
157
- * Module-private on purpose (mirroring {@link isLocalCleanupOnlyFailure}):
158
- * `enableAutoMergeWith` is the only caller, so the marker set is asserted
159
- * through it rather than through a test-only export the production dead-export
160
- * ratchet would then flag.
61
+ * Whether `--auto` was refused because native auto-merge is unavailable —
62
+ * the repo disallows it, or the PR is already clean with nothing to queue
63
+ * behind (`enablePullRequestAutoMerge` "clean status"). Both are safe to
64
+ * retry as a direct squash-merge; any other failure keeps blocking.
161
65
  *
162
66
  * @param {string|undefined|null} stderr
163
67
  * @returns {boolean}
@@ -174,18 +78,8 @@ function isAutoMergeUnavailable(stderr) {
174
78
  }
175
79
 
176
80
  /**
177
- * Direct (non-`--auto`) squash-merge fallback (Story #4682, restoring PR
178
- * #4480 / Story #4472). Reached only when the `--auto` arm was refused with
179
- * the {@link isAutoMergeUnavailable} signature — a repo with no native
180
- * auto-merge, or an already-clean PR with nothing to queue behind. Omitting
181
- * `--auto` makes `gh` merge synchronously; the same `--squash --delete-branch`
182
- * shape and the same `armCwd` re-point are preserved so the trailing local
183
- * `--delete-branch` housekeeping runs from the primary worktree (Story #4282).
184
- *
185
- * A local-cleanup-only grumble on the direct merge (Story #4681) still means
186
- * the REMOTE merge landed, so it reports `directMerged` with
187
- * `localCleanupDeferred`. Any other non-zero exit is a genuine failure the
188
- * caller escalates.
81
+ * Direct (non-`--auto`) squash-merge, run from the same `armCwd`. A
82
+ * local-cleanup-only failure still means the remote merge landed.
189
83
  *
190
84
  * @returns {Promise<{ enabled: boolean, directMerged?: boolean, localCleanupDeferred?: boolean, reason?: string }>}
191
85
  */
@@ -220,8 +114,9 @@ async function directMergeFallback({ exec, prNumber, armCwd, autoReason }) {
220
114
  * gh?: ReturnType<typeof import('../../../gh-exec.js').createGh>,
221
115
  * runner?: (args: string[], opts: object) => ({ status: number, stdout?: string, stderr?: string } | Promise<{ status: number, stdout?: string, stderr?: string }>),
222
116
  * resolveArmCwd?: (cwd: string) => string,
223
- * }} opts
224
- * @returns {Promise<{ enabled: boolean, reason?: string, localCleanupDeferred?: boolean, directMerged?: boolean }>}
117
+ * queueRequired?: boolean,
118
+ * }} opts `queueRequired`: the base requires a merge queue.
119
+ * @returns {Promise<{ enabled: boolean, reason?: string, localCleanupDeferred?: boolean, directMerged?: boolean, mergeQueue?: boolean }>}
225
120
  */
226
121
  export async function enableAutoMergeWith({
227
122
  cwd,
@@ -229,12 +124,19 @@ export async function enableAutoMergeWith({
229
124
  gh,
230
125
  runner,
231
126
  resolveArmCwd = resolveAutoMergeArmCwd,
127
+ queueRequired = false,
232
128
  }) {
233
129
  const exec = runner ?? makeDefaultGhAutoMergeRunner(gh ?? defaultGh);
234
- // Re-point the arm at the base-branch (primary) worktree so gh's
235
- // `--delete-branch` local `git checkout <base>` cannot collide with the
236
- // base branch already checked out by the primary worktree (Story #4282).
237
130
  const armCwd = resolveArmCwd(cwd);
131
+ const arm = queueRequired ? armForMergeQueue : armNativeAutoMerge;
132
+ return arm({ exec, prNumber, armCwd });
133
+ }
134
+
135
+ /**
136
+ * `--auto --squash --delete-branch`, falling back to a direct squash-merge
137
+ * only when native auto-merge is unavailable.
138
+ */
139
+ async function armNativeAutoMerge({ exec, prNumber, armCwd }) {
238
140
  try {
239
141
  const result = await exec(
240
142
  [
@@ -250,15 +152,14 @@ export async function enableAutoMergeWith({
250
152
  if (result.status === 0) return { enabled: true };
251
153
  const detail = `gh-exit-${result.status}: ${(result.stderr ?? '').trim().slice(0, 200)}`;
252
154
  if (isLocalCleanupOnlyFailure(result.stderr)) {
253
- // The remote side stands; only the local head-branch cleanup failed.
254
- // Report ENABLED so the confirm phase polls the real PR state instead
255
- // of blocking a merge that already landed, and flag the deferred
256
- // cleanup for the land tail's `git branch -D` to finish.
155
+ // The remote side stands; the land tail finishes the local ref reap.
257
156
  return { enabled: true, localCleanupDeferred: true, reason: detail };
258
157
  }
158
+ if (MERGE_QUEUE_REFUSAL.test(String(result.stderr ?? ''))) {
159
+ // The detection probe missed the queue; the refusal names it.
160
+ return armForMergeQueue({ exec, prNumber, armCwd });
161
+ }
259
162
  if (isAutoMergeUnavailable(result.stderr)) {
260
- // No native auto-merge on this repo (or nothing to queue behind an
261
- // already-clean PR): merge directly so the PR still lands (Story #4682).
262
163
  return directMergeFallback({
263
164
  exec,
264
165
  prNumber,
@@ -273,20 +174,11 @@ export async function enableAutoMergeWith({
273
174
  }
274
175
 
275
176
  /**
276
- * Build the default `gh pr merge` runner that adapts the async
277
- * `lib/gh-exec.js` facade into the synchronous-looking
278
- * `{ status, stdout, stderr }` envelope `enableAutoMergeWith` consumes.
279
- *
280
- * The adapter swallows non-zero exits (mapping the typed `GhExecError`
281
- * carrier back to its `code` + `stderr`) because auto-merge enablement
282
- * is intentionally non-fatal — the caller treats failures as "operator
283
- * merges manually".
177
+ * Adapt `gh.pr.merge` into the `{ status, stdout, stderr }` envelope,
178
+ * mapping non-zero exits back to that envelope rather than throwing.
284
179
  */
285
180
  function makeDefaultGhAutoMergeRunner(gh) {
286
181
  return async function defaultGhAutoMergeRunner(args, _opts) {
287
- // `args` always starts with `pr merge <prNumber>` — pass everything
288
- // after the third element to `gh.pr.merge` as flags so the facade
289
- // owns the `gh pr merge <id> …` argv assembly.
290
182
  const [, , prIdStr, ...flags] = args;
291
183
  try {
292
184
  const result = await gh.pr.merge(prIdStr, flags);
@@ -296,13 +188,8 @@ function makeDefaultGhAutoMergeRunner(gh) {
296
188
  stderr: result?.stderr ?? '',
297
189
  };
298
190
  } catch (err) {
299
- // Duck-type: any error carrying a numeric `.code` (or `.status`,
300
- // which the legacy `execFileSync` shim used) + an optional
301
- // `.stderr` is mapped back to the `{ status, stdout, stderr }`
302
- // envelope `enableAutoMergeWith` consumes. The typed
303
- // `GhExecError` carriers from `lib/gh-exec.js` already fit this
304
- // shape; bare `Error`s without a code fall through to the spawn-
305
- // error reason in the parent catch.
191
+ // Any error with a numeric `.code`/`.status` maps to the envelope;
192
+ // a codeless Error falls through to the caller's spawn-error reason.
306
193
  const numericCode =
307
194
  typeof err?.code === 'number'
308
195
  ? err.code
@@ -328,24 +215,8 @@ function makeDefaultGhAutoMergeRunner(gh) {
328
215
  }
329
216
 
330
217
  /**
331
- * Evaluate the pre-arm advisory-gate verdict (Story #5096).
332
- *
333
- * GitHub native auto-merge is defined to wait on REQUIRED contexts only, so a
334
- * red ADVISORY quality gate — a coverage, mutation, duplication, a11y or
335
- * bundle-size ratchet a consumer deliberately left non-required — is merged
336
- * straight past once the required contexts go green. The arming decision is
337
- * mandrel's, not GitHub's, so this is where it has to be made.
338
- *
339
- * Reads the SAME head-anchored derivation the merge wait uses
340
- * (`readPrWaitProbe` → `deriveRedHeadRuns`), so a `CANCELLED` superseded-push
341
- * run or a sibling-invalidated run is never mistaken for a red gate (the
342
- * #4695 / #4710 trap), and `mergeStateStatus: UNSTABLE` supplies the
343
- * required-vs-advisory discrimination the rollup itself lacks.
344
- *
345
- * **Non-fatal and fail-open in every degraded case.** A probe error, an absent
346
- * or `UNKNOWN` merge state, or a disabled knob all return "do not block" — the
347
- * arm proceeds exactly as it did before this Story. Only a positive verdict
348
- * refuses.
218
+ * Native auto-merge waits on REQUIRED contexts only, so mandrel must refuse
219
+ * to arm over a red advisory gate itself.
349
220
  *
350
221
  * @param {object} args
351
222
  * @returns {Promise<{ blocked: boolean, blockingRuns?: Array<object>, reason?: string }>}
@@ -365,38 +236,76 @@ async function readAdvisoryProbe({ prNumber, gh }) {
365
236
  }
366
237
 
367
238
  /**
368
- * Disarm GitHub native auto-merge on a PR (Story #5096).
369
- *
370
- * Lives here, beside the arm, because `lifecycle-lint`'s merge-lockout rule
371
- * confines every `gh pr merge` invocation to this module: auto-merge
372
- * enablement — and therefore its reversal — must flow through the Story close
373
- * path rather than being spelled out wherever a caller happens to need it.
374
- * The merge wait imports this rather than shelling out itself.
375
- *
376
- * Best-effort by contract: the caller blocks the Story either way, and a
377
- * failed disarm is reported rather than thrown, because the one thing it
378
- * cannot do is stop GitHub from landing the PR.
239
+ * A `gh` refusal meaning auto-merge was never armed — the PR is already in the
240
+ * desired un-armed posture, unlike a genuine disarm failure.
241
+ */
242
+ const NOT_ARMED = /not enabled|isn't enabled|is not set|no auto-?merge/i;
243
+
244
+ /**
245
+ * Lives here because `lifecycle-lint` confines `gh pr merge` to this module.
246
+ * An enqueued PR is dequeued instead. Never throws.
379
247
  *
380
- * @returns {Promise<boolean>} whether the disarm actually took.
248
+ * @param {{ prNumber?: number|string, prRef?: string, gh?: object,
249
+ * progress?: (tag: string, msg: string) => void,
250
+ * readMergeQueueStateFn?: typeof readMergeQueueState }} args `prRef` wins
251
+ * over `prNumber` when both are given.
252
+ * @returns {Promise<{ disarmed: boolean, alreadyUnarmed: boolean, detail: string }>}
381
253
  */
382
- export async function disarmAutoMerge({ prNumber, gh, progress }) {
254
+ export async function disarmAutoMerge({
255
+ prNumber,
256
+ prRef,
257
+ gh,
258
+ progress,
259
+ readMergeQueueStateFn = readMergeQueueState,
260
+ }) {
261
+ const ref = String(prRef ?? prNumber);
262
+ const queue = await readMergeQueueStateFn({ prNumber, prRef, gh });
263
+ const outcome =
264
+ queue?.inQueue === true && queue.prNodeId
265
+ ? await disarmByDequeue({ prNodeId: queue.prNodeId, ref, gh, progress })
266
+ : await disableNativeAutoMerge({ ref, gh, progress });
267
+ warnIfStillArmed({ outcome, ref, progress });
268
+ return outcome;
269
+ }
270
+
271
+ async function disableNativeAutoMerge({ ref, gh, progress }) {
383
272
  try {
384
- await (gh ?? defaultGh).pr.merge(String(prNumber), ['--disable-auto']);
273
+ await (gh ?? defaultGh).pr.merge(ref, ['--disable-auto']);
385
274
  progress?.(
386
275
  'CONFIRM',
387
- `🔓 Auto-merge DISARMED on PR #${prNumber} — the PR stays open and hand-mergeable.`,
276
+ `🔓 Auto-merge DISARMED on PR #${ref} — the PR stays open and hand-mergeable.`,
388
277
  );
389
- return true;
278
+ return { disarmed: true, alreadyUnarmed: false, detail: 'disarmed' };
390
279
  } catch (err) {
391
- progress?.(
392
- 'CONFIRM',
393
- `⚠️ Could not disarm auto-merge on PR #${prNumber} (${err?.message ?? err}) — ` +
394
- 'GitHub may still land it when the required checks pass. Disarm by hand.',
395
- );
396
- return false;
280
+ return classifyDisarmFailure(describeGhFailure(err));
397
281
  }
398
282
  }
399
283
 
284
+ /**
285
+ * @param {string} detail The operator-legible `gh` failure line.
286
+ * @returns {{ disarmed: boolean, alreadyUnarmed: boolean, detail: string }}
287
+ */
288
+ function classifyDisarmFailure(detail) {
289
+ const alreadyUnarmed = NOT_ARMED.test(detail);
290
+ return {
291
+ disarmed: alreadyUnarmed,
292
+ alreadyUnarmed,
293
+ detail: alreadyUnarmed
294
+ ? `auto-merge was not armed: ${detail.slice(0, 160)}`
295
+ : detail.slice(0, 200),
296
+ };
297
+ }
298
+
299
+ function warnIfStillArmed({ outcome, ref, progress }) {
300
+ if (outcome.disarmed) return;
301
+ progress?.(
302
+ 'CONFIRM',
303
+ `⚠️ Could not disarm auto-merge on PR #${ref} (${outcome.detail}) — ` +
304
+ 'GitHub may still land it when the required checks pass. Disarm by hand.',
305
+ );
306
+ }
307
+
308
+ /** Fail-open: a probe error or disabled knob never blocks the arm. */
400
309
  async function evaluateAdvisoryGate({
401
310
  prNumber,
402
311
  gh,
@@ -423,31 +332,79 @@ async function evaluateAdvisoryGate({
423
332
  );
424
333
  return { blocked: false };
425
334
  }
426
- if (!advisoryCheckFailedBlocksArm(probe, advisoryAllowlist)) {
427
- return { blocked: false };
428
- }
429
- const blockingRuns = selectBlockingRedRuns(
430
- probe.redHeadRuns,
335
+ // Same evaluator as the merge wait's mid-wait gate, so the verdicts cannot drift.
336
+ const verdict = decideAdvisoryGateBlock({
337
+ probe,
338
+ blockOnAdvisoryFailure,
431
339
  advisoryAllowlist,
432
- );
433
- // Story #5266 — the class travels with the reason. This pre-arm gate
434
- // classifies on the text the ROLLUP carried (a legacy StatusContext's
435
- // `description`); the merge wait, which owns the common case, additionally
436
- // reads the check-run output. Either way a run whose failure cannot be read
437
- // as "never finished" keeps the `advisory-gate-red` verdict.
438
- const verdict = resolveAdvisoryGateVerdict({ blockingRuns });
340
+ });
341
+ if (!verdict) return { blocked: false };
439
342
  return {
440
343
  blocked: true,
441
- blockingRuns,
344
+ blockingRuns: verdict.blockingRuns,
442
345
  blockClass: verdict.blockClass,
443
346
  reason: verdict.reason,
444
347
  };
445
348
  }
446
349
 
447
350
  /**
448
- * Dispatch auto-merge enablement based on `--no-auto-merge`, an
449
- * unparseable PR number, or a `gh` failure. Returns the structured
450
- * `{ autoMergeEnabled, autoMergeReason }` pair the result envelope needs.
351
+ * Report an arm that stood, naming how it will land.
352
+ *
353
+ * @returns {{ autoMergeEnabled: true, autoMergeReason: null, localCleanupDeferred: boolean, directMerged?: boolean, mergeQueue?: boolean }}
354
+ */
355
+ function reportArmed({ result, prNumber, progress }) {
356
+ if (result.mergeQueue) {
357
+ progress(
358
+ 'PR',
359
+ `✅ Auto-merge enabled on PR #${prNumber} (merge queue — the queue rule picks the strategy).`,
360
+ );
361
+ return {
362
+ autoMergeEnabled: true,
363
+ autoMergeReason: null,
364
+ localCleanupDeferred: false,
365
+ mergeQueue: true,
366
+ };
367
+ }
368
+ if (result.directMerged) {
369
+ progress(
370
+ 'PR',
371
+ `✅ Native auto-merge unavailable on PR #${prNumber} — direct squash-merge landed it` +
372
+ (result.localCleanupDeferred
373
+ ? " (gh's LOCAL branch cleanup deferred to the land tail; the merge stands)."
374
+ : '.'),
375
+ );
376
+ return {
377
+ autoMergeEnabled: true,
378
+ autoMergeReason: null,
379
+ directMerged: true,
380
+ localCleanupDeferred: Boolean(result.localCleanupDeferred),
381
+ };
382
+ }
383
+ if (result.localCleanupDeferred) {
384
+ progress(
385
+ 'PR',
386
+ `⚠️ Auto-merge armed on PR #${prNumber}, but gh's LOCAL branch cleanup failed ` +
387
+ `(${result.reason}) — deferring the local ref reap to the land tail; the merge stands.`,
388
+ );
389
+ return {
390
+ autoMergeEnabled: true,
391
+ autoMergeReason: null,
392
+ localCleanupDeferred: true,
393
+ };
394
+ }
395
+ progress(
396
+ 'PR',
397
+ `✅ Auto-merge enabled on PR #${prNumber} (squash, delete-branch).`,
398
+ );
399
+ return {
400
+ autoMergeEnabled: true,
401
+ autoMergeReason: null,
402
+ localCleanupDeferred: false,
403
+ };
404
+ }
405
+
406
+ /**
407
+ * Dispatch auto-merge enablement.
451
408
  *
452
409
  * @param {{
453
410
  * cwd: string,
@@ -458,11 +415,9 @@ async function evaluateAdvisoryGate({
458
415
  * gh?: ReturnType<typeof import('../../../gh-exec.js').createGh>,
459
416
  * progress: (tag: string, msg: string) => void,
460
417
  * }} args
461
- * @returns {Promise<{ autoMergeEnabled: boolean, autoMergeReason: string|null, localCleanupDeferred?: boolean, directMerged?: boolean }>}
462
- * `localCleanupDeferred` is true when the arm stands but `gh`'s local
463
- * head-branch delete failed (Story #4681) — the land tail owns the reap.
464
- * `directMerged` is true when native auto-merge was unavailable and the PR
465
- * was landed by a direct squash-merge instead (Story #4682).
418
+ * @returns {Promise<{ autoMergeEnabled: boolean, autoMergeReason: string|null, localCleanupDeferred?: boolean, directMerged?: boolean, mergeQueue?: boolean }>}
419
+ * `localCleanupDeferred`: the arm stands but the land tail owns the local
420
+ * ref reap. `directMerged`: landed by direct squash-merge instead.
466
421
  */
467
422
  export async function runAutoMergePhase({
468
423
  cwd,
@@ -475,18 +430,12 @@ export async function runAutoMergePhase({
475
430
  gh,
476
431
  progress,
477
432
  readPrWaitProbeFn = readAdvisoryProbe,
433
+ readMergeQueueStateFn = readMergeQueueState,
478
434
  }) {
479
435
  if (noAutoMerge) {
480
436
  progress('PR', '⏭ Auto-merge disabled (--no-auto-merge).');
481
437
  return { autoMergeEnabled: false, autoMergeReason: 'disabled-by-flag' };
482
438
  }
483
- // `delivery.ci.autoMerge: "strict"` opts standalone Stories out of
484
- // auto-merge (parallel to the Epic path's strict predicate): the PR opens
485
- // and waits for an operator merge instead of arming native auto-merge.
486
- // The default `"trust-ci"` keeps arming on green required CI — GitHub's
487
- // native `--auto` is the required-check gate, so no client-side predicate
488
- // is needed here (unlike the Epic path, which gates on local
489
- // audit/review/retro signals a standalone Story does not produce).
490
439
  if (autoMergePolicy === 'strict') {
491
440
  progress(
492
441
  'PR',
@@ -507,10 +456,8 @@ export async function runAutoMergePhase({
507
456
  autoMergeReason: 'pr-number-unparseable',
508
457
  };
509
458
  }
510
- // Story #5096 — refuse to arm over a genuinely red ADVISORY check. This
511
- // gate covers the narrow case where the gate is ALREADY red at close time
512
- // (a re-close, or a gate carried over from an earlier push); the merge
513
- // wait owns the common case, where the gate reddens after arming.
459
+ // Covers a gate ALREADY red at close time; the merge wait owns one that
460
+ // reddens after arming.
514
461
  const advisory = await evaluateAdvisoryGate({
515
462
  prNumber,
516
463
  gh,
@@ -534,51 +481,14 @@ export async function runAutoMergePhase({
534
481
  },
535
482
  };
536
483
  }
537
- const result = await enableAutoMergeWith({ cwd, prNumber, gh });
538
- if (result.enabled) {
539
- if (result.directMerged) {
540
- // No native auto-merge on this repo — the PR was merged directly
541
- // instead of queued (Story #4682). The confirm phase polls the PR,
542
- // observes MERGED, and runs the land tail; `localCleanupDeferred`
543
- // still defers a local-ref reap when gh's `--delete-branch` grumbled.
544
- progress(
545
- 'PR',
546
- `✅ Native auto-merge unavailable on PR #${prNumber} — direct squash-merge landed it` +
547
- (result.localCleanupDeferred
548
- ? " (gh's LOCAL branch cleanup deferred to the land tail; the merge stands)."
549
- : '.'),
550
- );
551
- return {
552
- autoMergeEnabled: true,
553
- autoMergeReason: null,
554
- directMerged: true,
555
- localCleanupDeferred: Boolean(result.localCleanupDeferred),
556
- };
557
- }
558
- if (result.localCleanupDeferred) {
559
- // Warning, never a block (Story #4681): the merge/arm stands and the
560
- // land tail reaps the local ref once the worktree releases it.
561
- progress(
562
- 'PR',
563
- `⚠️ Auto-merge armed on PR #${prNumber}, but gh's LOCAL branch cleanup failed ` +
564
- `(${result.reason}) — deferring the local ref reap to the land tail; the merge stands.`,
565
- );
566
- return {
567
- autoMergeEnabled: true,
568
- autoMergeReason: null,
569
- localCleanupDeferred: true,
570
- };
571
- }
572
- progress(
573
- 'PR',
574
- `✅ Auto-merge enabled on PR #${prNumber} (squash, delete-branch).`,
575
- );
576
- return {
577
- autoMergeEnabled: true,
578
- autoMergeReason: null,
579
- localCleanupDeferred: false,
580
- };
581
- }
484
+ const queue = await readMergeQueueStateFn({ prNumber, gh });
485
+ const result = await enableAutoMergeWith({
486
+ cwd,
487
+ prNumber,
488
+ gh,
489
+ queueRequired: queue?.queueRequired === true,
490
+ });
491
+ if (result.enabled) return reportArmed({ result, prNumber, progress });
582
492
  progress(
583
493
  'PR',
584
494
  `⚠️ Auto-merge enablement failed (${result.reason}) — operator can merge manually.`,