mandrel 2.59.0 → 2.61.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (678) hide show
  1. package/.agents/README.md +21 -19
  2. package/.agents/agents/acceptance-critic.md +24 -43
  3. package/.agents/agents/story-worker.md +20 -21
  4. package/.agents/docs/agentrc-reference.json +5 -84
  5. package/.agents/docs/configuration.md +48 -132
  6. package/.agents/docs/workflows.md +2 -2
  7. package/.agents/instructions.md +5 -8
  8. package/.agents/rules/ci-remediation.md +41 -8
  9. package/.agents/rules/gherkin-standards.md +4 -0
  10. package/.agents/schemas/acceptance-eval-verdict.schema.json +1 -1
  11. package/.agents/schemas/agentrc.schema.json +16 -496
  12. package/.agents/schemas/story-deliver-terminal.schema.json +13 -3
  13. package/.agents/schemas/validation-evidence.schema.json +2 -1
  14. package/.agents/scripts/README.md +23 -13
  15. package/.agents/scripts/acceptance-eval.js +35 -169
  16. package/.agents/scripts/agents-bootstrap-github.js +27 -129
  17. package/.agents/scripts/apply-quality-bootstrap.js +4 -40
  18. package/.agents/scripts/audit-baselines.js +6 -27
  19. package/.agents/scripts/audit-labels-bootstrap.js +5 -29
  20. package/.agents/scripts/audit-to-stories.js +91 -361
  21. package/.agents/scripts/boot-sweep.js +19 -72
  22. package/.agents/scripts/bootstrap.js +74 -395
  23. package/.agents/scripts/ceremony-derive.js +10 -41
  24. package/.agents/scripts/check-arch-cycles.js +14 -64
  25. package/.agents/scripts/check-baselines.js +8 -48
  26. package/.agents/scripts/check-context-budget.js +105 -311
  27. package/.agents/scripts/check-cyclomatic.js +12 -44
  28. package/.agents/scripts/check-dead-exports.js +13 -64
  29. package/.agents/scripts/check-doc-links.js +38 -186
  30. package/.agents/scripts/check-gherkin-corpus.js +24 -127
  31. package/.agents/scripts/check-test-temp-hygiene.js +28 -169
  32. package/.agents/scripts/coverage-capture.js +34 -98
  33. package/.agents/scripts/deliver-light.js +25 -171
  34. package/.agents/scripts/deliver-recover.js +6 -42
  35. package/.agents/scripts/deliver-run.js +534 -0
  36. package/.agents/scripts/diagnose-friction.js +24 -116
  37. package/.agents/scripts/drain-pending-cleanup.js +1 -1
  38. package/.agents/scripts/evidence-gate.js +23 -85
  39. package/.agents/scripts/file-ci-gap.js +57 -49
  40. package/.agents/scripts/generate-config-docs.js +30 -170
  41. package/.agents/scripts/generate-lens-checklists.js +8 -52
  42. package/.agents/scripts/generate-skills-index.js +14 -112
  43. package/.agents/scripts/generate-workflows-doc.js +10 -70
  44. package/.agents/scripts/git-cleanup.js +2 -34
  45. package/.agents/scripts/lib/Graph.js +24 -81
  46. package/.agents/scripts/lib/ITicketingProvider.js +47 -143
  47. package/.agents/scripts/lib/Logger.js +14 -76
  48. package/.agents/scripts/lib/audit-baselines/engine.js +11 -31
  49. package/.agents/scripts/lib/audit-baselines/gate-surface.js +3 -17
  50. package/.agents/scripts/lib/audit-baselines/headroom.js +4 -20
  51. package/.agents/scripts/lib/audit-baselines/hotspots.js +3 -15
  52. package/.agents/scripts/lib/audit-baselines/kinds.js +23 -89
  53. package/.agents/scripts/lib/audit-baselines/outliers.js +6 -23
  54. package/.agents/scripts/lib/audit-baselines/read.js +3 -16
  55. package/.agents/scripts/lib/audit-baselines/staleness.js +7 -26
  56. package/.agents/scripts/lib/audit-baselines/surface-entry.js +7 -28
  57. package/.agents/scripts/lib/audit-baselines/trend.js +7 -20
  58. package/.agents/scripts/lib/audit-baselines/weights.js +9 -37
  59. package/.agents/scripts/lib/audit-suite/audit-rules-reader.js +3 -18
  60. package/.agents/scripts/lib/audit-suite/checklist-threading.js +26 -124
  61. package/.agents/scripts/lib/audit-suite/dispatch-checklist.js +14 -45
  62. package/.agents/scripts/lib/audit-suite/findings.js +12 -52
  63. package/.agents/scripts/lib/audit-suite/frontmatter.js +5 -29
  64. package/.agents/scripts/lib/audit-suite/index.js +1 -15
  65. package/.agents/scripts/lib/audit-suite/lens-checklist.js +10 -45
  66. package/.agents/scripts/lib/audit-suite/lens-diff-floor.js +11 -76
  67. package/.agents/scripts/lib/audit-suite/runner.js +13 -43
  68. package/.agents/scripts/lib/audit-suite/selector.js +49 -349
  69. package/.agents/scripts/lib/audit-suite/substitutions.js +12 -40
  70. package/.agents/scripts/lib/audit-suite/workflow-loader.js +3 -15
  71. package/.agents/scripts/lib/audit-to-stories/audit-label-taxonomy.js +11 -73
  72. package/.agents/scripts/lib/audit-to-stories/audit-lenses.js +8 -37
  73. package/.agents/scripts/lib/audit-to-stories/build-story-body.js +25 -143
  74. package/.agents/scripts/lib/audit-to-stories/dedupe-against-github.js +14 -80
  75. package/.agents/scripts/lib/audit-to-stories/epic-grouping-directive.js +4 -18
  76. package/.agents/scripts/lib/audit-to-stories/finding-adapter.js +7 -40
  77. package/.agents/scripts/lib/audit-to-stories/group-findings.js +9 -39
  78. package/.agents/scripts/lib/audit-to-stories/issue-corpus.js +10 -66
  79. package/.agents/scripts/lib/audit-to-stories/issue-index.js +6 -30
  80. package/.agents/scripts/lib/audit-to-stories/issues-file.js +6 -36
  81. package/.agents/scripts/lib/audit-to-stories/ledger-commit.js +17 -69
  82. package/.agents/scripts/lib/audit-to-stories/ledger-pr.js +17 -85
  83. package/.agents/scripts/lib/audit-to-stories/ledger-record.js +10 -48
  84. package/.agents/scripts/lib/audit-to-stories/parse-audit-md.js +38 -146
  85. package/.agents/scripts/lib/audit-to-stories/seed-from-findings.js +7 -42
  86. package/.agents/scripts/lib/audit-to-stories/wire-dependencies.js +10 -57
  87. package/.agents/scripts/lib/baseline-loader.js +12 -51
  88. package/.agents/scripts/lib/baseline-schema-registry.js +5 -22
  89. package/.agents/scripts/lib/baselines/component-matcher.js +3 -12
  90. package/.agents/scripts/lib/baselines/components.js +10 -61
  91. package/.agents/scripts/lib/baselines/coverage-updater-cli.js +7 -36
  92. package/.agents/scripts/lib/baselines/crap-preview-incremental.js +7 -19
  93. package/.agents/scripts/lib/baselines/crap-preview-scan.js +19 -45
  94. package/.agents/scripts/lib/baselines/crap-updater-cli.js +16 -65
  95. package/.agents/scripts/lib/baselines/diff-scope-cli.js +5 -33
  96. package/.agents/scripts/lib/baselines/duplication-scanner.js +11 -60
  97. package/.agents/scripts/lib/baselines/env-overrides.js +12 -67
  98. package/.agents/scripts/lib/baselines/envelope.js +13 -129
  99. package/.agents/scripts/lib/baselines/exit-codes.js +6 -49
  100. package/.agents/scripts/lib/baselines/git-base.js +23 -142
  101. package/.agents/scripts/lib/baselines/kernel.js +11 -111
  102. package/.agents/scripts/lib/baselines/kinds/_crap-new-method-gate.js +9 -47
  103. package/.agents/scripts/lib/baselines/kinds/_crap-read.js +8 -51
  104. package/.agents/scripts/lib/baselines/kinds/_shared-metric.js +7 -62
  105. package/.agents/scripts/lib/baselines/kinds/bundle-size.js +8 -29
  106. package/.agents/scripts/lib/baselines/kinds/coverage.js +3 -15
  107. package/.agents/scripts/lib/baselines/kinds/crap.js +94 -415
  108. package/.agents/scripts/lib/baselines/kinds/duplication.js +4 -30
  109. package/.agents/scripts/lib/baselines/kinds/kind-factory.js +7 -53
  110. package/.agents/scripts/lib/baselines/kinds/maintainability.js +15 -80
  111. package/.agents/scripts/lib/baselines/kinds/mutation.js +12 -72
  112. package/.agents/scripts/lib/baselines/maintainability-baseline-io.js +4 -11
  113. package/.agents/scripts/lib/baselines/merge-envelopes.js +30 -146
  114. package/.agents/scripts/lib/baselines/path-canon.js +19 -128
  115. package/.agents/scripts/lib/baselines/preview-gates.js +8 -37
  116. package/.agents/scripts/lib/baselines/reader.js +14 -107
  117. package/.agents/scripts/lib/baselines/refresh-service.js +35 -252
  118. package/.agents/scripts/lib/baselines/scope.js +11 -135
  119. package/.agents/scripts/lib/baselines/writer.js +16 -149
  120. package/.agents/scripts/lib/bdd-runner-detect.js +18 -113
  121. package/.agents/scripts/lib/bdd-scenario-budget.js +9 -36
  122. package/.agents/scripts/lib/bdd-scenario-scanner.js +11 -73
  123. package/.agents/scripts/lib/bdd-step-index.js +26 -100
  124. package/.agents/scripts/lib/bootstrap/baseline-merge-driver.js +23 -103
  125. package/.agents/scripts/lib/bootstrap/branch-protection.js +2 -5
  126. package/.agents/scripts/lib/bootstrap/commit-push.js +12 -50
  127. package/.agents/scripts/lib/bootstrap/gh-preflight.js +14 -101
  128. package/.agents/scripts/lib/bootstrap/hitl-confirm.js +5 -30
  129. package/.agents/scripts/lib/bootstrap/install-ledger.js +17 -73
  130. package/.agents/scripts/lib/bootstrap/issue-forms-template.js +17 -121
  131. package/.agents/scripts/lib/bootstrap/manifest.js +15 -86
  132. package/.agents/scripts/lib/bootstrap/merge-methods.js +4 -33
  133. package/.agents/scripts/lib/bootstrap/preflight.js +12 -61
  134. package/.agents/scripts/lib/bootstrap/project-bootstrap.js +34 -235
  135. package/.agents/scripts/lib/bootstrap/prompt.js +21 -129
  136. package/.agents/scripts/lib/bootstrap/quality-bootstrap.js +27 -141
  137. package/.agents/scripts/lib/bootstrap/summary.js +1 -8
  138. package/.agents/scripts/lib/bootstrap/workflow-audit.js +11 -84
  139. package/.agents/scripts/lib/branch-name-guard.js +4 -23
  140. package/.agents/scripts/lib/changed-files.js +39 -121
  141. package/.agents/scripts/lib/checks/core-bare-clean.js +4 -24
  142. package/.agents/scripts/lib/checks/index.js +18 -101
  143. package/.agents/scripts/lib/checks/loop-health.js +11 -53
  144. package/.agents/scripts/lib/checks/state.js +16 -91
  145. package/.agents/scripts/lib/checks/story-init-not-backgrounded.js +10 -61
  146. package/.agents/scripts/lib/checks/subagent-agent-tool-required.js +14 -83
  147. package/.agents/scripts/lib/child-exec.js +39 -108
  148. package/.agents/scripts/lib/cli/standard-args.js +9 -116
  149. package/.agents/scripts/lib/cli-args.js +31 -146
  150. package/.agents/scripts/lib/cli-usage.js +5 -27
  151. package/.agents/scripts/lib/cli-utils.js +2 -12
  152. package/.agents/scripts/lib/close-validation/commands.js +13 -76
  153. package/.agents/scripts/lib/close-validation/gates.js +92 -331
  154. package/.agents/scripts/lib/close-validation/process.js +121 -151
  155. package/.agents/scripts/lib/close-validation/projections/advisories.js +5 -31
  156. package/.agents/scripts/lib/close-validation/projections/crap.js +19 -67
  157. package/.agents/scripts/lib/close-validation/projections/head-sha.js +1 -17
  158. package/.agents/scripts/lib/close-validation/projections/inputs.js +4 -34
  159. package/.agents/scripts/lib/close-validation/projections/maintainability.js +11 -58
  160. package/.agents/scripts/lib/close-validation/runner.js +53 -110
  161. package/.agents/scripts/lib/command-header.js +6 -28
  162. package/.agents/scripts/lib/config/acceptance-eval.js +4 -30
  163. package/.agents/scripts/lib/config/baselines.js +3 -14
  164. package/.agents/scripts/lib/config/ci.js +8 -38
  165. package/.agents/scripts/lib/config/commands.js +1 -15
  166. package/.agents/scripts/lib/config/defaults.js +4 -33
  167. package/.agents/scripts/lib/config/delivery-routing.js +6 -34
  168. package/.agents/scripts/lib/config/explain.js +10 -83
  169. package/.agents/scripts/lib/config/gates/coverage.schema.js +0 -12
  170. package/.agents/scripts/lib/config/gates/crap-incremental-coverage.schema.js +3 -31
  171. package/.agents/scripts/lib/config/gates/crap.schema.js +1 -34
  172. package/.agents/scripts/lib/config/gates/duplication.schema.js +1 -8
  173. package/.agents/scripts/lib/config/gates/index.js +2 -17
  174. package/.agents/scripts/lib/config/gates/maintainability.schema.js +1 -20
  175. package/.agents/scripts/lib/config/gates/mutation.schema.js +1 -7
  176. package/.agents/scripts/lib/config/gates/shared.js +4 -64
  177. package/.agents/scripts/lib/config/github.js +4 -22
  178. package/.agents/scripts/lib/config/limits.js +4 -57
  179. package/.agents/scripts/lib/config/paths.js +2 -21
  180. package/.agents/scripts/lib/config/qa.js +4 -38
  181. package/.agents/scripts/lib/config/quality.js +76 -432
  182. package/.agents/scripts/lib/config/runners.js +12 -56
  183. package/.agents/scripts/lib/config/runtime.js +13 -57
  184. package/.agents/scripts/lib/config/shared.js +2 -16
  185. package/.agents/scripts/lib/config/sync-agentrc.js +9 -50
  186. package/.agents/scripts/lib/config/temp-paths.js +40 -280
  187. package/.agents/scripts/lib/config/validate-orchestration.js +5 -17
  188. package/.agents/scripts/lib/config/worktree-isolation.js +9 -28
  189. package/.agents/scripts/lib/config-resolver.js +11 -52
  190. package/.agents/scripts/lib/config-schema-shared.js +1 -4
  191. package/.agents/scripts/lib/config-settings-schema-delivery.js +16 -291
  192. package/.agents/scripts/lib/config-settings-schema-quality.js +7 -219
  193. package/.agents/scripts/lib/config-settings-schema.js +37 -274
  194. package/.agents/scripts/lib/coverage-baseline.js +20 -110
  195. package/.agents/scripts/lib/coverage-capture-fullscope.js +18 -35
  196. package/.agents/scripts/lib/coverage-capture-incremental.js +15 -45
  197. package/.agents/scripts/lib/coverage-capture-usage.js +8 -25
  198. package/.agents/scripts/lib/coverage-capture.js +99 -224
  199. package/.agents/scripts/lib/coverage-utils.js +14 -79
  200. package/.agents/scripts/lib/cpu-pool.js +17 -123
  201. package/.agents/scripts/lib/crap-baseline-join.js +16 -88
  202. package/.agents/scripts/lib/crap-coordinates.js +6 -25
  203. package/.agents/scripts/lib/crap-engine.js +40 -153
  204. package/.agents/scripts/lib/crap-method-identity.js +16 -78
  205. package/.agents/scripts/lib/crap-utils.js +31 -155
  206. package/.agents/scripts/lib/cyclomatic-ceiling.js +14 -87
  207. package/.agents/scripts/lib/cyclomatic-scope.js +10 -50
  208. package/.agents/scripts/lib/dead-exports-knip.js +18 -56
  209. package/.agents/scripts/lib/dead-exports-mode.js +5 -24
  210. package/.agents/scripts/lib/degraded-mode.js +3 -26
  211. package/.agents/scripts/lib/dependency-parser.js +8 -40
  212. package/.agents/scripts/lib/dependency-version.js +13 -35
  213. package/.agents/scripts/lib/detect-package-manager.js +6 -36
  214. package/.agents/scripts/lib/doc-tiers.js +22 -124
  215. package/.agents/scripts/lib/duplicate-search.js +8 -72
  216. package/.agents/scripts/lib/env-loader.js +5 -27
  217. package/.agents/scripts/lib/error-redactor.js +6 -31
  218. package/.agents/scripts/lib/errors/index.js +2 -22
  219. package/.agents/scripts/lib/escomplex-ast-compat.js +22 -163
  220. package/.agents/scripts/lib/escomplex-kernel.js +21 -123
  221. package/.agents/scripts/lib/feedback-loop/graduator-core.js +94 -419
  222. package/.agents/scripts/lib/feedback-loop/prior-feedback-fetcher.js +20 -98
  223. package/.agents/scripts/lib/feedback-loop/retro-proposals-graduator.js +27 -149
  224. package/.agents/scripts/lib/findings/audit-ledger.js +23 -97
  225. package/.agents/scripts/lib/findings/classify-finding.js +14 -69
  226. package/.agents/scripts/lib/findings/promote-finding.js +14 -112
  227. package/.agents/scripts/lib/findings/provenance-field.js +11 -52
  228. package/.agents/scripts/lib/findings/route-finding.js +37 -255
  229. package/.agents/scripts/lib/findings/semantic-issue-search.js +14 -59
  230. package/.agents/scripts/lib/findings/severity.js +18 -104
  231. package/.agents/scripts/lib/format-generated-json.js +12 -44
  232. package/.agents/scripts/lib/full-suite-lock.js +160 -429
  233. package/.agents/scripts/lib/full-suite-queue.js +213 -0
  234. package/.agents/scripts/lib/gates/baseline-store.js +5 -9
  235. package/.agents/scripts/lib/gates/friction.js +1 -3
  236. package/.agents/scripts/lib/generated/agentrc-validator.js +2 -2
  237. package/.agents/scripts/lib/gh-exec.js +123 -191
  238. package/.agents/scripts/lib/git/cached-fetch.js +9 -52
  239. package/.agents/scripts/lib/git/sync-from-base.js +15 -107
  240. package/.agents/scripts/lib/git-branch-cleanup.js +14 -61
  241. package/.agents/scripts/lib/git-branch-lifecycle.js +16 -87
  242. package/.agents/scripts/lib/git-utils.js +37 -161
  243. package/.agents/scripts/lib/github/framework-repo.js +8 -71
  244. package/.agents/scripts/lib/github-url.js +2 -17
  245. package/.agents/scripts/lib/import-graph.js +11 -38
  246. package/.agents/scripts/lib/install-cmd-parser.js +4 -13
  247. package/.agents/scripts/lib/json-utils.js +3 -18
  248. package/.agents/scripts/lib/label-constants.js +16 -111
  249. package/.agents/scripts/lib/label-taxonomy.js +4 -30
  250. package/.agents/scripts/lib/maintainability-engine.js +12 -80
  251. package/.agents/scripts/lib/maintainability-unscorable.js +5 -25
  252. package/.agents/scripts/lib/maintainability-utils.js +16 -92
  253. package/.agents/scripts/lib/mandrel-catalog.js +12 -70
  254. package/.agents/scripts/lib/notifications/notifier.js +13 -38
  255. package/.agents/scripts/lib/npm-scripts.js +4 -23
  256. package/.agents/scripts/lib/observability/metrics-ledger.js +16 -76
  257. package/.agents/scripts/lib/observability/runtime-friction.js +44 -286
  258. package/.agents/scripts/lib/observability/signal-validator.js +5 -37
  259. package/.agents/scripts/lib/observability/signals-writer.js +11 -121
  260. package/.agents/scripts/lib/observability/source-classifier.js +22 -203
  261. package/.agents/scripts/lib/observability/terse-result.js +14 -47
  262. package/.agents/scripts/lib/onboard/init-tail.js +13 -74
  263. package/.agents/scripts/lib/onboard/scaffold-docs.js +11 -34
  264. package/.agents/scripts/lib/orchestration/acceptance-eval-decision.js +25 -139
  265. package/.agents/scripts/lib/orchestration/auto-merge-cwd.js +11 -66
  266. package/.agents/scripts/lib/orchestration/behind-recovery.js +10 -55
  267. package/.agents/scripts/lib/orchestration/ceremony-routing.js +28 -156
  268. package/.agents/scripts/lib/orchestration/change-set.js +7 -36
  269. package/.agents/scripts/lib/orchestration/check-baselines/phases/compare.js +9 -46
  270. package/.agents/scripts/lib/orchestration/check-baselines/phases/evaluate.js +11 -44
  271. package/.agents/scripts/lib/orchestration/check-baselines/phases/floors.js +5 -24
  272. package/.agents/scripts/lib/orchestration/check-baselines/phases/friction.js +3 -12
  273. package/.agents/scripts/lib/orchestration/check-baselines/phases/parse-args.js +5 -38
  274. package/.agents/scripts/lib/orchestration/check-baselines/phases/pipeline.js +3 -8
  275. package/.agents/scripts/lib/orchestration/check-baselines/phases/refresh-ack.js +28 -136
  276. package/.agents/scripts/lib/orchestration/check-baselines/phases/report.js +3 -13
  277. package/.agents/scripts/lib/orchestration/check-state.js +92 -0
  278. package/.agents/scripts/lib/orchestration/ci-gap-intake.js +37 -144
  279. package/.agents/scripts/lib/orchestration/ci-rerun-guard.js +121 -157
  280. package/.agents/scripts/lib/orchestration/code-review.js +24 -128
  281. package/.agents/scripts/lib/orchestration/column-sync.js +23 -111
  282. package/.agents/scripts/lib/orchestration/complexity-gate.js +118 -462
  283. package/.agents/scripts/lib/orchestration/deliver-recover.js +36 -168
  284. package/.agents/scripts/lib/orchestration/dependency-analyzer.js +4 -35
  285. package/.agents/scripts/lib/orchestration/dependency-candidates.js +9 -41
  286. package/.agents/scripts/lib/orchestration/diff-magnitude.js +25 -115
  287. package/.agents/scripts/lib/orchestration/doc-reader.js +2 -6
  288. package/.agents/scripts/lib/orchestration/docs-digest.js +13 -51
  289. package/.agents/scripts/lib/orchestration/epic-candidates.js +13 -53
  290. package/.agents/scripts/lib/orchestration/epic-checklist.js +9 -33
  291. package/.agents/scripts/lib/orchestration/epic-container.js +41 -167
  292. package/.agents/scripts/lib/orchestration/epic-expansion.js +10 -40
  293. package/.agents/scripts/lib/orchestration/epic-rollup.js +55 -207
  294. package/.agents/scripts/lib/orchestration/file-assumption-enum.js +2 -22
  295. package/.agents/scripts/lib/orchestration/file-assumptions.js +45 -253
  296. package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-detect.js +9 -46
  297. package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-reap.js +7 -57
  298. package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches.js +21 -126
  299. package/.agents/scripts/lib/orchestration/git-cleanup/phases/cli.js +2 -6
  300. package/.agents/scripts/lib/orchestration/git-cleanup/phases/fast-forward.js +1 -4
  301. package/.agents/scripts/lib/orchestration/git-cleanup/phases/filters.js +1 -5
  302. package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes-ff.js +9 -34
  303. package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes.js +41 -190
  304. package/.agents/scripts/lib/orchestration/git-cleanup/phases/merged-tip.js +9 -45
  305. package/.agents/scripts/lib/orchestration/git-cleanup/phases/parse-args.js +1 -4
  306. package/.agents/scripts/lib/orchestration/git-cleanup/phases/phase-drivers.js +19 -85
  307. package/.agents/scripts/lib/orchestration/git-cleanup/phases/prompts.js +3 -17
  308. package/.agents/scripts/lib/orchestration/git-cleanup/phases/prune.js +1 -5
  309. package/.agents/scripts/lib/orchestration/git-cleanup/phases/render.js +16 -100
  310. package/.agents/scripts/lib/orchestration/git-cleanup/phases/stashes.js +1 -4
  311. package/.agents/scripts/lib/orchestration/lease-guard-shared.js +16 -67
  312. package/.agents/scripts/lib/orchestration/lifecycle/emit-ledger-event.js +9 -33
  313. package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-flip-failed.js +8 -29
  314. package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-unlanded.js +15 -68
  315. package/.agents/scripts/lib/orchestration/light-backstop.js +11 -49
  316. package/.agents/scripts/lib/orchestration/light-escalation.js +21 -89
  317. package/.agents/scripts/lib/orchestration/light-suitability.js +37 -307
  318. package/.agents/scripts/lib/orchestration/merge-block-class.js +39 -216
  319. package/.agents/scripts/lib/orchestration/merge-poll.js +104 -377
  320. package/.agents/scripts/lib/orchestration/pinned-identifier-lint.js +17 -57
  321. package/.agents/scripts/lib/orchestration/plan-context.js +55 -318
  322. package/.agents/scripts/lib/orchestration/plan-critic-conditions.js +22 -79
  323. package/.agents/scripts/lib/orchestration/plan-critics-evaluate.js +5 -31
  324. package/.agents/scripts/lib/orchestration/plan-metrics.js +29 -108
  325. package/.agents/scripts/lib/orchestration/plan-navigation.js +8 -27
  326. package/.agents/scripts/lib/orchestration/plan-persist/acceptance-handle-repair.js +12 -49
  327. package/.agents/scripts/lib/orchestration/plan-persist/audit-provenance.js +18 -73
  328. package/.agents/scripts/lib/orchestration/plan-persist/changes-repair.js +16 -78
  329. package/.agents/scripts/lib/orchestration/plan-persist/cross-plan-links.js +6 -30
  330. package/.agents/scripts/lib/orchestration/plan-persist/epic-adoption.js +14 -65
  331. package/.agents/scripts/lib/orchestration/plan-persist/epic-ops.js +21 -76
  332. package/.agents/scripts/lib/orchestration/plan-persist/external-deps.js +6 -43
  333. package/.agents/scripts/lib/orchestration/plan-persist/persist-helpers.js +14 -68
  334. package/.agents/scripts/lib/orchestration/plan-persist/plan-context-source.js +9 -41
  335. package/.agents/scripts/lib/orchestration/plan-persist/run-plan-persist.js +71 -289
  336. package/.agents/scripts/lib/orchestration/plan-persist/soft-findings.js +2 -12
  337. package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +96 -362
  338. package/.agents/scripts/lib/orchestration/plan-persist/summary.js +9 -39
  339. package/.agents/scripts/lib/orchestration/plan-persist/supersede-ops.js +60 -186
  340. package/.agents/scripts/lib/orchestration/plan-persist/wave-collision-gate.js +9 -49
  341. package/.agents/scripts/lib/orchestration/plan-persist/wave-serialisation.js +7 -28
  342. package/.agents/scripts/lib/orchestration/plan-reachability.js +13 -42
  343. package/.agents/scripts/lib/orchestration/plan-run-labels/reap.js +16 -91
  344. package/.agents/scripts/lib/orchestration/plan-runner/worktree-sweep.js +16 -54
  345. package/.agents/scripts/lib/orchestration/plan-text-hygiene.js +10 -52
  346. package/.agents/scripts/lib/orchestration/planning/authoring-context.js +14 -109
  347. package/.agents/scripts/lib/orchestration/planning/memory-pool-advisory.js +11 -83
  348. package/.agents/scripts/lib/orchestration/pr-watch.js +48 -306
  349. package/.agents/scripts/lib/orchestration/project-meta-cache.js +15 -80
  350. package/.agents/scripts/lib/orchestration/project-meta-resolver.js +10 -51
  351. package/.agents/scripts/lib/orchestration/reassert-status-column.js +12 -76
  352. package/.agents/scripts/lib/orchestration/remote-verifier.js +12 -36
  353. package/.agents/scripts/lib/orchestration/resolve-stories.js +33 -164
  354. package/.agents/scripts/lib/orchestration/retro-proposals.js +66 -361
  355. package/.agents/scripts/lib/orchestration/review-base-ref.js +9 -43
  356. package/.agents/scripts/lib/orchestration/review-depth.js +12 -91
  357. package/.agents/scripts/lib/orchestration/review-providers/codex.js +10 -111
  358. package/.agents/scripts/lib/orchestration/review-providers/degraded-gates.js +13 -71
  359. package/.agents/scripts/lib/orchestration/review-providers/findings-renderer.js +7 -51
  360. package/.agents/scripts/lib/orchestration/review-providers/mi-exemptions.js +8 -53
  361. package/.agents/scripts/lib/orchestration/review-providers/native.js +30 -214
  362. package/.agents/scripts/lib/orchestration/review-providers/parse-findings.js +7 -52
  363. package/.agents/scripts/lib/orchestration/review-providers/review-depth.js +4 -33
  364. package/.agents/scripts/lib/orchestration/review-providers/review-provider-factory.js +11 -71
  365. package/.agents/scripts/lib/orchestration/review-providers/scoped-lint.js +19 -131
  366. package/.agents/scripts/lib/orchestration/review-providers/security-review.js +6 -89
  367. package/.agents/scripts/lib/orchestration/review-providers/types.js +26 -56
  368. package/.agents/scripts/lib/orchestration/review-providers/ultrareview.js +3 -46
  369. package/.agents/scripts/lib/orchestration/run-epilogue.js +245 -326
  370. package/.agents/scripts/lib/orchestration/run-scoped-config.js +55 -159
  371. package/.agents/scripts/lib/orchestration/single-story-close/close-note.js +7 -34
  372. package/.agents/scripts/lib/orchestration/single-story-close/failed-terminal.js +16 -89
  373. package/.agents/scripts/lib/orchestration/single-story-close/gate-log.js +18 -109
  374. package/.agents/scripts/lib/orchestration/single-story-close/phases/auto-merge.js +83 -239
  375. package/.agents/scripts/lib/orchestration/single-story-close/phases/base-sync.js +20 -82
  376. package/.agents/scripts/lib/orchestration/single-story-close/phases/close-validation.js +103 -97
  377. package/.agents/scripts/lib/orchestration/single-story-close/phases/code-review.js +8 -64
  378. package/.agents/scripts/lib/orchestration/single-story-close/phases/confirm-merge.js +136 -486
  379. package/.agents/scripts/lib/orchestration/single-story-close/phases/conventional-subject.js +30 -134
  380. package/.agents/scripts/lib/orchestration/single-story-close/phases/graphql-preflight.js +96 -0
  381. package/.agents/scripts/lib/orchestration/single-story-close/phases/lock-wait-pending.js +49 -0
  382. package/.agents/scripts/lib/orchestration/single-story-close/phases/normalize-pr-title.js +13 -86
  383. package/.agents/scripts/lib/orchestration/single-story-close/phases/options.js +20 -95
  384. package/.agents/scripts/lib/orchestration/single-story-close/phases/post-land.js +46 -203
  385. package/.agents/scripts/lib/orchestration/single-story-close/phases/pre-gate-steps.js +8 -50
  386. package/.agents/scripts/lib/orchestration/single-story-close/phases/pull-request.js +12 -83
  387. package/.agents/scripts/lib/orchestration/single-story-close/phases/push.js +6 -39
  388. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-block.js +1 -6
  389. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-outcome.js +4 -28
  390. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-override.js +6 -51
  391. package/.agents/scripts/lib/orchestration/single-story-close/phases/worktree-reap.js +6 -34
  392. package/.agents/scripts/lib/orchestration/single-story-close/phases/wrong-tree-guard.js +23 -121
  393. package/.agents/scripts/lib/orchestration/single-story-close/runner.js +180 -273
  394. package/.agents/scripts/lib/orchestration/single-story-lease-guard.js +15 -69
  395. package/.agents/scripts/lib/orchestration/story-body-gate.js +4 -23
  396. package/.agents/scripts/lib/orchestration/story-close/baseline-upward-writeback.js +50 -179
  397. package/.agents/scripts/lib/orchestration/story-close/context-budget-writeback.js +11 -41
  398. package/.agents/scripts/lib/orchestration/story-close/format-autofix.js +23 -311
  399. package/.agents/scripts/lib/orchestration/story-close/phases/local-lens-review.js +22 -147
  400. package/.agents/scripts/lib/orchestration/story-close/phases/review-core.js +16 -67
  401. package/.agents/scripts/lib/orchestration/story-deliver-terminal-schema.js +12 -68
  402. package/.agents/scripts/lib/orchestration/story-deliver-terminal.js +42 -200
  403. package/.agents/scripts/lib/orchestration/story-follow-ups.js +167 -252
  404. package/.agents/scripts/lib/orchestration/story-init-envelope.js +52 -0
  405. package/.agents/scripts/lib/orchestration/story-init-remote.js +2 -6
  406. package/.agents/scripts/lib/orchestration/story-reachability.js +3 -23
  407. package/.agents/scripts/lib/orchestration/task-body-validator.js +12 -135
  408. package/.agents/scripts/lib/orchestration/ticket-lease.js +28 -131
  409. package/.agents/scripts/lib/orchestration/ticket-validator-conflicts.js +15 -149
  410. package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +5 -33
  411. package/.agents/scripts/lib/orchestration/ticket-validator.js +63 -344
  412. package/.agents/scripts/lib/orchestration/ticketing/bulk.js +51 -244
  413. package/.agents/scripts/lib/orchestration/ticketing/reads.js +39 -261
  414. package/.agents/scripts/lib/orchestration/ticketing/state.js +14 -68
  415. package/.agents/scripts/lib/orchestration/ticketing/transition.js +46 -263
  416. package/.agents/scripts/lib/orchestration/ticketing.js +2 -26
  417. package/.agents/scripts/lib/orchestration/verify-credit.js +18 -79
  418. package/.agents/scripts/lib/orchestration/worktree-dirty.js +5 -30
  419. package/.agents/scripts/lib/path-security.js +3 -6
  420. package/.agents/scripts/lib/plan-phase-cleanup.js +9 -49
  421. package/.agents/scripts/lib/preflight-runner.js +13 -69
  422. package/.agents/scripts/lib/process-group.js +143 -0
  423. package/.agents/scripts/lib/project-root.js +2 -8
  424. package/.agents/scripts/lib/provider-factory.js +2 -25
  425. package/.agents/scripts/lib/qa/console-allowlist.js +10 -59
  426. package/.agents/scripts/lib/qa/qa-session.js +15 -69
  427. package/.agents/scripts/lib/qa/redact-evidence.js +18 -129
  428. package/.agents/scripts/lib/qa/resolve-qa-contract.js +26 -135
  429. package/.agents/scripts/lib/qa/resolve-selection.js +16 -84
  430. package/.agents/scripts/lib/reserved-test-ids.js +9 -47
  431. package/.agents/scripts/lib/runtime-deps/dep-resolution.js +13 -53
  432. package/.agents/scripts/lib/runtime-deps/ensure-installed.js +10 -44
  433. package/.agents/scripts/lib/runtime-deps/manifest.js +10 -30
  434. package/.agents/scripts/lib/runtime-deps/parser-major.js +15 -51
  435. package/.agents/scripts/lib/runtime-deps/preflight.js +4 -22
  436. package/.agents/scripts/lib/runtime-deps/scan-imports.js +11 -55
  437. package/.agents/scripts/lib/signals/detectors/common.js +12 -38
  438. package/.agents/scripts/lib/signals/index.js +2 -19
  439. package/.agents/scripts/lib/signals/schema.js +14 -109
  440. package/.agents/scripts/lib/signals/write.js +2 -11
  441. package/.agents/scripts/lib/single-story/confirm-merge.js +31 -72
  442. package/.agents/scripts/lib/single-story/story-merged-notify.js +8 -49
  443. package/.agents/scripts/lib/single-story-sweep/protection-ctx.js +4 -26
  444. package/.agents/scripts/lib/single-story-sweep/protection.js +13 -100
  445. package/.agents/scripts/lib/single-story-sweep/sweep-lock.js +60 -258
  446. package/.agents/scripts/lib/single-story-sweep.js +14 -97
  447. package/.agents/scripts/lib/skills/parse-skill.js +13 -59
  448. package/.agents/scripts/lib/skills/skills-index.js +8 -29
  449. package/.agents/scripts/lib/skills/walk-skill-files.js +17 -78
  450. package/.agents/scripts/lib/source-extensions.js +11 -42
  451. package/.agents/scripts/lib/source-text/strip-js-comments.js +8 -41
  452. package/.agents/scripts/lib/stdio-flush.js +9 -36
  453. package/.agents/scripts/lib/story-adjacency.js +8 -40
  454. package/.agents/scripts/lib/story-body/body-format-lints.js +51 -66
  455. package/.agents/scripts/lib/story-body/footer-block.js +11 -44
  456. package/.agents/scripts/lib/story-body/story-body.js +123 -344
  457. package/.agents/scripts/lib/temp-retention.js +42 -143
  458. package/.agents/scripts/lib/templates/decomposer-prompts.js +18 -80
  459. package/.agents/scripts/lib/test-env.js +12 -65
  460. package/.agents/scripts/lib/test-run-credit.js +10 -65
  461. package/.agents/scripts/lib/test-runner-contract.js +19 -74
  462. package/.agents/scripts/lib/test-temp.js +38 -184
  463. package/.agents/scripts/lib/test-tiers.js +12 -96
  464. package/.agents/scripts/lib/ticket-body-sections.js +21 -96
  465. package/.agents/scripts/lib/transpile.js +15 -74
  466. package/.agents/scripts/lib/util/concurrent-map.js +6 -25
  467. package/.agents/scripts/lib/util/parse-id-list.js +8 -34
  468. package/.agents/scripts/lib/util/poll-loop.js +8 -28
  469. package/.agents/scripts/lib/util/with-timeout.js +2 -11
  470. package/.agents/scripts/lib/validation-evidence.js +21 -96
  471. package/.agents/scripts/lib/wave-runner/footprint.js +17 -70
  472. package/.agents/scripts/lib/wave-runner/live-probe.js +67 -209
  473. package/.agents/scripts/lib/wave-runner/ready-set.js +72 -301
  474. package/.agents/scripts/lib/workers/crap-worker.js +11 -64
  475. package/.agents/scripts/lib/workers/maintainability-report-worker.js +8 -45
  476. package/.agents/scripts/lib/workers/maintainability-worker.js +5 -21
  477. package/.agents/scripts/lib/workers/serve-worker-messages.js +2 -18
  478. package/.agents/scripts/lib/workflow-closure.js +22 -105
  479. package/.agents/scripts/lib/workspace-provisioner.js +16 -54
  480. package/.agents/scripts/lib/worktree/git-hooks.js +15 -60
  481. package/.agents/scripts/lib/worktree/lifecycle/force-drain.js +20 -60
  482. package/.agents/scripts/lib/worktree/lifecycle/merge-reachability.js +10 -62
  483. package/.agents/scripts/lib/worktree/lifecycle/pending-cleanup.js +22 -86
  484. package/.agents/scripts/lib/worktree/lifecycle/reap.js +24 -126
  485. package/.agents/scripts/lib/worktree/lifecycle-manager.js +2 -20
  486. package/.agents/scripts/lib/worktree/node-modules-strategy.js +46 -180
  487. package/.agents/scripts/lib/worktree-manager.js +15 -40
  488. package/.agents/scripts/lint-issue-body.js +12 -68
  489. package/.agents/scripts/mandrel-update-preflight.js +10 -70
  490. package/.agents/scripts/merge-baseline.js +30 -105
  491. package/.agents/scripts/nav-registry-diff.js +22 -108
  492. package/.agents/scripts/notify.js +12 -69
  493. package/.agents/scripts/plan-context.js +97 -92
  494. package/.agents/scripts/plan-critics.js +12 -66
  495. package/.agents/scripts/plan-persist.js +71 -137
  496. package/.agents/scripts/plan-run-epilogue.js +20 -43
  497. package/.agents/scripts/pr-watch-with-update.js +79 -263
  498. package/.agents/scripts/providers/github/auth.js +3 -8
  499. package/.agents/scripts/providers/github/blocked-by-add.js +14 -61
  500. package/.agents/scripts/providers/github/board-add.js +5 -21
  501. package/.agents/scripts/providers/github/branch-protection.js +11 -43
  502. package/.agents/scripts/providers/github/cache.js +2 -14
  503. package/.agents/scripts/providers/github/comments.js +7 -40
  504. package/.agents/scripts/providers/github/compose.js +3 -19
  505. package/.agents/scripts/providers/github/errors.js +22 -125
  506. package/.agents/scripts/providers/github/issues.js +31 -123
  507. package/.agents/scripts/providers/github/labels.js +24 -124
  508. package/.agents/scripts/providers/github/mappers.js +5 -27
  509. package/.agents/scripts/providers/github/merge-methods.js +3 -22
  510. package/.agents/scripts/providers/github/project-board.js +2 -17
  511. package/.agents/scripts/providers/github/projects-v2-graphql.js +3 -6
  512. package/.agents/scripts/providers/github/request-helpers.js +5 -32
  513. package/.agents/scripts/providers/github/search-budget.js +9 -39
  514. package/.agents/scripts/providers/github/search-query.js +5 -26
  515. package/.agents/scripts/providers/github/sub-issue-add.js +15 -65
  516. package/.agents/scripts/providers/github/sub-issues.js +7 -36
  517. package/.agents/scripts/providers/github/tickets.js +32 -134
  518. package/.agents/scripts/providers/github.js +18 -59
  519. package/.agents/scripts/prune-plan-run-labels.js +12 -46
  520. package/.agents/scripts/quality-preview.js +35 -220
  521. package/.agents/scripts/resolve-doc-tiers.js +3 -26
  522. package/.agents/scripts/resolve-stories.js +16 -67
  523. package/.agents/scripts/resync-status-column.js +6 -25
  524. package/.agents/scripts/run-tests.js +29 -104
  525. package/.agents/scripts/single-story-close.js +23 -135
  526. package/.agents/scripts/single-story-confirm-merge.js +32 -139
  527. package/.agents/scripts/single-story-init.js +47 -259
  528. package/.agents/scripts/stories-wave-tick.js +179 -415
  529. package/.agents/scripts/sync-agentrc.js +3 -21
  530. package/.agents/scripts/sync-claude-agents.js +9 -55
  531. package/.agents/scripts/sync-claude-commands.js +20 -110
  532. package/.agents/scripts/test-wrapper.js +6 -43
  533. package/.agents/scripts/update-coverage-baseline.js +5 -22
  534. package/.agents/scripts/update-crap-baseline.js +7 -30
  535. package/.agents/scripts/update-duplication-baseline.js +16 -92
  536. package/.agents/scripts/update-maintainability-baseline.js +8 -62
  537. package/.agents/scripts/update-ticket-state.js +1 -7
  538. package/.agents/scripts/validate-skills.js +6 -26
  539. package/.agents/skills/core/gates-and-baselines/reference.md +0 -1
  540. package/.agents/skills/skills.index.json +2 -2
  541. package/.agents/skills/stack/qa/playwright/SKILL.md +26 -0
  542. package/.agents/templates/agent-protocol.md +2 -2
  543. package/.agents/templates/docs/audit-sweep-runbook.md +3 -4
  544. package/.agents/workflows/audit-accessibility.md +4 -7
  545. package/.agents/workflows/audit-adrs.md +3 -6
  546. package/.agents/workflows/audit-architecture.md +3 -11
  547. package/.agents/workflows/audit-baselines.md +6 -9
  548. package/.agents/workflows/audit-clean-code.md +8 -12
  549. package/.agents/workflows/audit-data-model.md +3 -7
  550. package/.agents/workflows/audit-dependencies.md +4 -7
  551. package/.agents/workflows/audit-devops.md +4 -8
  552. package/.agents/workflows/audit-documentation.md +1 -4
  553. package/.agents/workflows/audit-mobile.md +4 -7
  554. package/.agents/workflows/audit-navigability.md +3 -6
  555. package/.agents/workflows/audit-performance.md +2 -4
  556. package/.agents/workflows/audit-privacy.md +4 -7
  557. package/.agents/workflows/audit-quality.md +4 -7
  558. package/.agents/workflows/audit-security.md +4 -7
  559. package/.agents/workflows/audit-seo.md +4 -7
  560. package/.agents/workflows/audit-sre.md +4 -7
  561. package/.agents/workflows/audit-to-stories.md +17 -30
  562. package/.agents/workflows/audit-ux-ui.md +4 -7
  563. package/.agents/workflows/helpers/acceptance-self-eval.md +84 -157
  564. package/.agents/workflows/helpers/audit-lens-core.md +1 -1
  565. package/.agents/workflows/helpers/code-quality-guardrails.md +12 -15
  566. package/.agents/workflows/helpers/code-review.md +4 -2
  567. package/.agents/workflows/helpers/deliver-digest.md +37 -28
  568. package/.agents/workflows/helpers/deliver-light.md +92 -101
  569. package/.agents/workflows/helpers/deliver-reference.md +162 -220
  570. package/.agents/workflows/helpers/deliver-story-reference.md +197 -607
  571. package/.agents/workflows/helpers/deliver-story.md +17 -18
  572. package/.agents/workflows/helpers/plan-reference.md +125 -167
  573. package/.agents/workflows/helpers/qa-core.md +12 -0
  574. package/.agents/workflows/mandrel-deliver.md +47 -31
  575. package/.agents/workflows/mandrel-plan.md +22 -21
  576. package/.agents/workflows/mandrel-update.md +36 -21
  577. package/.agents/workflows/memory-consolidate.md +1 -1
  578. package/.agents/workflows/qa-assist.md +27 -71
  579. package/.agents/workflows/qa-explore.md +19 -59
  580. package/.agents/workflows/qa-run.md +11 -33
  581. package/README.md +1 -1
  582. package/bin/mandrel.js +5 -46
  583. package/bin/postinstall.js +18 -107
  584. package/docs/CHANGELOG.md +60 -0
  585. package/lib/cli/doctor.js +11 -71
  586. package/lib/cli/init.js +26 -165
  587. package/lib/cli/migrate.js +5 -64
  588. package/lib/cli/registry.js +84 -467
  589. package/lib/cli/sync-agents.js +4 -64
  590. package/lib/cli/sync-commands.js +11 -64
  591. package/lib/cli/sync.js +34 -213
  592. package/lib/cli/uninstall.js +40 -219
  593. package/lib/cli/update.js +326 -523
  594. package/lib/cli/version-check.js +8 -72
  595. package/lib/cli/version-helpers.js +14 -87
  596. package/lib/migrations/helpers/retire-agentrc-key.js +11 -52
  597. package/lib/migrations/index.js +17 -92
  598. package/lib/migrations/steps/2.1.0-retire-mi-drop-knobs.js +2 -15
  599. package/lib/migrations/steps/2.1.0-retire-verify-concurrency-cap.js +1 -13
  600. package/lib/migrations/steps/2.11.0-retire-max-seed-words.js +2 -15
  601. package/lib/migrations/steps/2.2.0-retire-epic-ac-tags.js +9 -38
  602. package/lib/migrations/steps/2.20.0-retire-codebase-snapshot.js +1 -13
  603. package/lib/migrations/steps/2.32.0-retire-lint-baseline-command.js +2 -27
  604. package/lib/migrations/steps/2.57.0-retire-delivery-limit-knobs.js +2 -23
  605. package/lib/migrations/steps/2.57.0-retire-planning-limit-knobs.js +2 -27
  606. package/lib/migrations/steps/2.60.0-retire-audit-results-autofile.js +21 -0
  607. package/lib/migrations/steps/strip-removed-agentrc-keys.js +333 -0
  608. package/package.json +17 -14
  609. package/.agents/docs/SDLC.md +0 -590
  610. package/.agents/docs/quality-gates.md +0 -1179
  611. package/.agents/rules/known-tooling-behavior.md +0 -150
  612. package/.agents/rules/orchestration-error-handling.md +0 -61
  613. package/.agents/rules/test-seams.md +0 -59
  614. package/.agents/schemas/baselines/lighthouse.schema.json +0 -59
  615. package/.agents/schemas/baselines/lint.schema.json +0 -47
  616. package/.agents/schemas/model-attribution.schema.json +0 -53
  617. package/.agents/scripts/check-action-pinning.js +0 -260
  618. package/.agents/scripts/check-audit-attribution.js +0 -302
  619. package/.agents/scripts/check-baseline-drift.js +0 -211
  620. package/.agents/scripts/check-baseline-scope.js +0 -362
  621. package/.agents/scripts/check-generated-validator.js +0 -202
  622. package/.agents/scripts/check-knip-entries.js +0 -159
  623. package/.agents/scripts/check-lifecycle-lint.js +0 -294
  624. package/.agents/scripts/check-pinned-override-notes.js +0 -102
  625. package/.agents/scripts/check-schema-references.js +0 -366
  626. package/.agents/scripts/check-test-portability.js +0 -512
  627. package/.agents/scripts/check-workflow-citations.js +0 -332
  628. package/.agents/scripts/check-workflow-cli-lint.js +0 -299
  629. package/.agents/scripts/check-workflow-timeouts.js +0 -291
  630. package/.agents/scripts/install-matrix-assert.js +0 -326
  631. package/.agents/scripts/lib/audit-advisories.js +0 -195
  632. package/.agents/scripts/lib/audit-attribution.js +0 -134
  633. package/.agents/scripts/lib/baselines/drift-detector.js +0 -351
  634. package/.agents/scripts/lib/baselines/kinds/lighthouse.js +0 -87
  635. package/.agents/scripts/lib/baselines/kinds/lint.js +0 -184
  636. package/.agents/scripts/lib/baselines/orphan-pruner.js +0 -233
  637. package/.agents/scripts/lib/baselines/scope-assert.js +0 -223
  638. package/.agents/scripts/lib/baselines/scope-inventory.js +0 -314
  639. package/.agents/scripts/lib/c8-cli-path.js +0 -21
  640. package/.agents/scripts/lib/config/gates/lighthouse.schema.js +0 -51
  641. package/.agents/scripts/lib/config/gates/lint.schema.js +0 -18
  642. package/.agents/scripts/lib/dynamic-workflow/architecture-report-contract.js +0 -70
  643. package/.agents/scripts/lib/dynamic-workflow/audit-orchestrator.js +0 -284
  644. package/.agents/scripts/lib/dynamic-workflow/clean-code-report-contract.js +0 -80
  645. package/.agents/scripts/lib/dynamic-workflow/degraded-coverage.js +0 -81
  646. package/.agents/scripts/lib/dynamic-workflow/documentation-report-contract.js +0 -87
  647. package/.agents/scripts/lib/dynamic-workflow/performance-report-contract.js +0 -74
  648. package/.agents/scripts/lib/dynamic-workflow/quality-report-contract.js +0 -90
  649. package/.agents/scripts/lib/dynamic-workflow/report-contract-core.js +0 -43
  650. package/.agents/scripts/lib/dynamic-workflow/security-report-contract.js +0 -83
  651. package/.agents/scripts/lib/fs-walk.js +0 -52
  652. package/.agents/scripts/lib/knip-config-resolver.js +0 -181
  653. package/.agents/scripts/lib/knip-entry-sync.js +0 -452
  654. package/.agents/scripts/lib/orchestration/model-attribution.js +0 -418
  655. package/.agents/scripts/lib/orchestration/story-plan-state.js +0 -33
  656. package/.agents/scripts/lib/orchestration/structured-comment-parser.js +0 -67
  657. package/.agents/scripts/lib/pinned-override-notes.js +0 -88
  658. package/.agents/scripts/lib/pinned-override-resolve.js +0 -212
  659. package/.agents/scripts/lib/test-isolate/cli-options.js +0 -93
  660. package/.agents/scripts/lib/test-isolate/env-snapshot-loader.js +0 -52
  661. package/.agents/scripts/lib/test-isolate/list-files.js +0 -90
  662. package/.agents/scripts/lib/test-isolate/parse-tap.js +0 -75
  663. package/.agents/scripts/lib/test-isolate/progress-log.js +0 -45
  664. package/.agents/scripts/lib/test-isolate/render-report.js +0 -97
  665. package/.agents/scripts/lib/test-isolate/run-isolate.js +0 -87
  666. package/.agents/scripts/lib/test-isolate/runner.js +0 -483
  667. package/.agents/scripts/lib/test-profile/parse-tap.js +0 -136
  668. package/.agents/scripts/lib/test-profile/render-report.js +0 -45
  669. package/.agents/scripts/lint-label-vocabulary.js +0 -214
  670. package/.agents/scripts/post-structured-comment.js +0 -127
  671. package/.agents/scripts/provision-git-hooks.js +0 -85
  672. package/.agents/scripts/prune-baseline-orphans.js +0 -181
  673. package/.agents/scripts/run-coverage.js +0 -197
  674. package/.agents/scripts/run-lint.js +0 -133
  675. package/.agents/scripts/run-test-profile.js +0 -129
  676. package/.agents/scripts/run-verify.js +0 -118
  677. package/.agents/scripts/test-isolate.js +0 -55
  678. package/.agents/scripts/update-dead-exports-baseline.js +0 -321
@@ -1,116 +1,18 @@
1
1
  // .agents/scripts/lib/orchestration/pr-watch.js
2
2
  /**
3
- * pr-watch.js — the required-check poll loop for an open PR.
4
- * Story #2256 (Epic #2172).
5
- *
6
- * **Not a listener, and no longer shelved among them.** This shipped as the
7
- * `Watcher` lifecycle listener subscribing to `pr.created`. Story #5006
8
- * deleted the class but left the plain primitive at
9
- * `lifecycle/listeners/watcher.js` so its CLI consumer's import stayed
10
- * stable. Story #5024 then retired the bus itself, which took the listener
11
- * concept — and the `listeners/` directory — with it, so the primitive moved
12
- * here beside [`merge-poll.js`](./merge-poll.js), the home Story #4545 chose
13
- * for `MergeWatcher`'s surviving parts. The only production consumer,
14
- * `pr-watch-with-update.js`, has always driven {@link watchPrToTerminal}
15
- * directly, with no bus.
16
- *
17
- * Critical contract:
18
- * - Required-check **names** are resolved from `gh pr checks` at
19
- * runtime, NOT from `.agentrc.json.branchProtection.requiredChecks`.
20
- * The static config remains for local-validation hints only; the
21
- * branch-protection ruleset on GitHub is the source of truth at
22
- * watch time. This guards against config drift (a config file that
23
- * hasn't been updated after a protection rule changed on GitHub
24
- * would otherwise cause the watch to either skip a required check
25
- * or wait for a removed one indefinitely).
26
- *
27
- * Side-effect firewall: the loop shells out to `gh` through injectable
28
- * ports and returns a verdict. It does NOT mutate ticket labels, post
29
- * comments, call `notify`, or write any ledger.
3
+ * pr-watch.js — the required-check poll loop for an open PR. Check names come
4
+ * from `gh pr checks --required` at runtime, never config, so drift cannot
5
+ * skip or wait forever on a check. Returns a verdict; no side effects.
30
6
  */
31
7
 
32
8
  import { spawnSync } from 'node:child_process';
33
9
 
34
- import { parsePrNumberFromUrl } from '../github-url.js';
35
10
  import { applyBehindUpdate } from './behind-recovery.js';
11
+ import { checkVerdict, classifyRequiredCheck } from './check-state.js';
36
12
 
37
13
  /**
38
- * Map `gh pr checks` `state` values to the canonical lowercase outcome
39
- * vocabulary (`success` | `failure` | `timed_out` | `skipped`), with a
40
- * fourth `'pending'` sentinel for in-flight checks. Pure — exported for
41
- * tests so the pin is explicit and reviewable.
42
- *
43
- * `gh` returns capitalized SCREAMING_SNAKE values (`SUCCESS`,
44
- * `FAILURE`, `TIMED_OUT`, etc.). An empty / queued / in_progress state
45
- * collapses to `'pending'` so the poll loop can distinguish "still
46
- * running" from terminal outcomes. `'pending'` is intentionally NOT a
47
- * terminal outcome — `reduceOutcomes` is called only on the live state,
48
- * and the final outcome map gates on `allTerminal()` so no `'pending'`
49
- * ever leaks into a finished watch. Unknown / non-pending unrecognized
50
- * values collapse to `'skipped'` so any future GitHub state we haven't
51
- * enumerated still maps into the vocabulary.
52
- */
53
- export function normalizeCheckState(raw) {
54
- const v = String(raw ?? '')
55
- .trim()
56
- .toLowerCase();
57
- switch (v) {
58
- case '':
59
- case 'pending':
60
- case 'queued':
61
- case 'in_progress':
62
- case 'requested':
63
- case 'waiting':
64
- return 'pending';
65
- case 'success':
66
- case 'completed':
67
- return 'success';
68
- case 'failure':
69
- case 'startup_failure':
70
- return 'failure';
71
- case 'neutral':
72
- return 'neutral';
73
- case 'cancelled':
74
- return 'cancelled';
75
- case 'timed_out':
76
- return 'timed_out';
77
- case 'action_required':
78
- return 'action_required';
79
- case 'stale':
80
- return 'stale';
81
- case 'skipped':
82
- return 'skipped';
83
- default:
84
- return 'skipped';
85
- }
86
- }
87
-
88
- /**
89
- * Parse a PR number out of a PR URL. Callers hand in the URL `gh pr
90
- * create` returned; `gh pr checks` accepts either the URL or the
91
- * number — we pass the URL through verbatim, but the helper still
92
- * exists for tests asserting we never silently coerce a malformed URL.
93
- *
94
- * Delegates to `parsePrNumberFromUrl` in `lib/github-url.js`.
95
- * Re-exported under the original name so existing call sites and tests
96
- * do not need to change. Story #3649.
97
- */
98
- export const extractPrNumber = parsePrNumberFromUrl;
99
-
100
- /**
101
- * The `gh --repo` flag pair for an optional `owner/repo` target, or an empty
102
- * argv fragment when the repository is inferred from the cwd's remote.
103
- *
104
- * `gh` resolves a *cross-repository* PR reference only through this flag — it
105
- * has no `<owner/repo>#<number>` argument form, and a caller that builds one
106
- * gets it parsed as a **branch name** instead (every `--repo` invocation of the
107
- * watch CLI failed on that, reported as a misleading `gh-checks-failed`). Pure
108
- * — one place builds the fragment so no port can forget it.
109
- *
110
- * Module-private on purpose: the three ports below are the only callers, and
111
- * the flag is asserted through them (a real-spawn argv probe), never by
112
- * importing this helper — an export existing solely for a test is dead in the
113
- * `--production` reachability ratchet.
14
+ * `gh` has no `<owner/repo>#<number>` form (it parses one as a branch), so
15
+ * every port builds `--repo` here.
114
16
  *
115
17
  * @param {string|null|undefined} repo `owner/repo`, or nullish to infer.
116
18
  * @returns {string[]}
@@ -120,13 +22,7 @@ function ghRepoFlag(repo) {
120
22
  return trimmed.length > 0 ? ['--repo', trimmed] : [];
121
23
  }
122
24
 
123
- /**
124
- * Default `gh pr checks` spawn. Always invokes with `--required` so the
125
- * returned set is authoritative for branch-protection gating. The
126
- * `--json name,state,bucket` projection is stable across `gh` >= 2.30.
127
- *
128
- * Exported so tests can stub.
129
- */
25
+ /** `--required` makes the returned set authoritative for protection gating. */
130
26
  function ghPrChecks({ prUrl, cwd, repo, spawnFn = spawnSync }) {
131
27
  const result = spawnFn(
132
28
  'gh',
@@ -148,11 +44,6 @@ function ghPrChecks({ prUrl, cwd, repo, spawnFn = spawnSync }) {
148
44
  };
149
45
  }
150
46
 
151
- /**
152
- * Default `gh pr view` spawn — probes `mergeStateStatus` so the watch loop
153
- * can detect the BEHIND condition (PR head is behind its base branch)
154
- * AFTER every required check is green. Injectable so tests can stub.
155
- */
156
47
  function ghPrView({ prUrl, cwd, repo, spawnFn = spawnSync }) {
157
48
  const result = spawnFn(
158
49
  'gh',
@@ -166,13 +57,7 @@ function ghPrView({ prUrl, cwd, repo, spawnFn = spawnSync }) {
166
57
  };
167
58
  }
168
59
 
169
- /**
170
- * Parse the `mergeStateStatus` field out of a `gh pr view --json
171
- * mergeStateStatus` payload. Returns the empty string for malformed
172
- * input so callers can treat unknown / unparseable states as "not
173
- * BEHIND" (the conservative recovery branch). Pure — exported for
174
- * tests.
175
- */
60
+ /** Malformed input → `''`, which callers treat as "not BEHIND". */
176
61
  function parseMergeStateStatus(stdout) {
177
62
  const trimmed = String(stdout ?? '').trim();
178
63
  if (trimmed.length === 0) return '';
@@ -186,11 +71,6 @@ function parseMergeStateStatus(stdout) {
186
71
  }
187
72
  }
188
73
 
189
- /**
190
- * Default `gh pr update-branch` spawn — invoked by the BEHIND recovery
191
- * loop to fast-forward the PR head with its base branch. Exported so
192
- * tests can stub and assert call counts.
193
- */
194
74
  function ghPrUpdateBranch({ prUrl, cwd, repo, spawnFn = spawnSync }) {
195
75
  const result = spawnFn(
196
76
  'gh',
@@ -208,41 +88,14 @@ function ghPrUpdateBranch({ prUrl, cwd, repo, spawnFn = spawnSync }) {
208
88
  };
209
89
  }
210
90
 
211
- /**
212
- * Outcomes that count as "this required check did not block the
213
- * merge". Mirrors `automerge-predicate.NON_FAILING_CHECK_OUTCOMES` so
214
- * the BEHIND-recovery gate ("are all required checks passing?") uses
215
- * the same definition as the downstream predicate. Pure — exported
216
- * for tests.
217
- */
218
- const GREEN_CHECK_OUTCOMES = Object.freeze(
219
- new Set(['success', 'neutral', 'skipped']),
220
- );
221
-
222
- /**
223
- * All outcomes are non-failing. Used as the gate before issuing a
224
- * `gh pr update-branch` recovery call — a red check is a hard block
225
- * regardless of mergeStateStatus, so we never auto-recover into a
226
- * failing PR.
227
- */
91
+ /** Gate for BEHIND recovery: never auto-update into a failing PR. */
228
92
  function allGreen(outcomes) {
229
93
  const values = Object.values(outcomes);
230
94
  if (values.length === 0) return false;
231
- for (const v of values) {
232
- if (!GREEN_CHECK_OUTCOMES.has(v)) return false;
233
- }
234
- return true;
95
+ return values.every((v) => checkVerdict(v) === 'pass');
235
96
  }
236
97
 
237
- /**
238
- * Parse the JSON array produced by `gh pr checks --json name,state,…`.
239
- * Returns `[]` for any malformed input. Pure — exported for tests.
240
- *
241
- * Each entry shape: `{ name, state, bucket, workflow }`. The
242
- * `bucket` field is `gh`'s terminal classification (`pass`, `fail`,
243
- * `pending`, `skipping`); we prefer `state` when populated and fall
244
- * back to `bucket` when not.
245
- */
98
+ /** Entries with a string `name`; `[]` for malformed input. */
246
99
  export function parseGhPrChecks(stdout) {
247
100
  const trimmed = String(stdout ?? '').trim();
248
101
  if (trimmed.length === 0) return [];
@@ -257,30 +110,16 @@ export function parseGhPrChecks(stdout) {
257
110
  }
258
111
  }
259
112
 
260
- /**
261
- * Reduce a list of check entries to the canonical `{ checkName: outcome }`
262
- * map. Pure — exported for tests.
263
- *
264
- * When `gh` returns the same `name` more than once (parallel matrix
265
- * builds, retries), the LAST entry wins. The poll loop calls this on
266
- * every tick so the final emit reflects the most recent state.
267
- */
113
+ /** `{ checkName: outcome }`; a repeated name (matrix, retry) — last wins. */
268
114
  export function reduceOutcomes(entries) {
269
115
  const out = {};
270
116
  for (const e of entries) {
271
- const raw = e.state || e.bucket || '';
272
- out[e.name] = normalizeCheckState(raw);
117
+ out[e.name] = classifyRequiredCheck(e);
273
118
  }
274
119
  return out;
275
120
  }
276
121
 
277
- /**
278
- * Terminal-state predicate. Pure — exported for tests so the
279
- * pending-state list is reviewable as code, not as prose.
280
- *
281
- * Only `'pending'` is non-terminal — `normalizeCheckState` already
282
- * collapses every "still running" GitHub state into that sentinel.
283
- */
122
+ /** Only `'pending'` is non-terminal (the classifier collapses running states). */
284
123
  export function allTerminal(outcomes) {
285
124
  for (const v of Object.values(outcomes)) {
286
125
  if (v === 'pending') return false;
@@ -288,23 +127,10 @@ export function allTerminal(outcomes) {
288
127
  return true;
289
128
  }
290
129
 
291
- /**
292
- * Sentinel outcome for a required check that never went terminal within
293
- * the poll cap AND the resume budget — the CI job is genuinely slow, not
294
- * red. Story #4358 made this a first-class outcome distinct from
295
- * `'timed_out'` (a GitHub-reported terminal timeout) and `'failure'` (a
296
- * red check): a `'still-running'` map means "re-arm the watch / hand off
297
- * to `/loop`," never "the change is broken."
298
- */
130
+ /** Slow CI, not red: "re-arm the watch", never "the change is broken". */
299
131
  const STILL_RUNNING = 'still-running';
300
132
 
301
- /**
302
- * Promote any leftover `'pending'` outcomes to the schema-valid
303
- * `'still-running'` sentinel before emit. Pure — exported for tests so
304
- * the cap-fire behaviour is reviewable. Called only when the poll loop
305
- * (and its resume budget) exits with checks still pending and none
306
- * failed — the slow-but-not-red terminal state.
307
- */
133
+ /** Leftover `'pending'` → `'still-running'` (the schema forbids pending). */
308
134
  export function promotePendingToStillRunning(outcomes) {
309
135
  const out = {};
310
136
  for (const [k, v] of Object.entries(outcomes)) {
@@ -313,44 +139,24 @@ export function promotePendingToStillRunning(outcomes) {
313
139
  return out;
314
140
  }
315
141
 
316
- /**
317
- * True when at least one required check has genuinely failed — the hard
318
- * stop that consumes NO resume budget and exits 1 immediately. A
319
- * `'pending'` check is not a failure (it is still running); anything
320
- * outside the non-failing set AND outside `'pending'` is a red block.
321
- * Pure — exported for tests.
322
- */
142
+ /** A genuinely red check: the hard stop that consumes no resume budget. */
323
143
  export function hasFailingCheck(outcomes) {
324
- for (const v of Object.values(outcomes)) {
325
- if (v === 'pending') continue;
326
- if (!GREEN_CHECK_OUTCOMES.has(v)) return true;
327
- }
328
- return false;
144
+ return Object.values(outcomes).some((v) => checkVerdict(v) === 'fail');
329
145
  }
330
146
 
331
- /**
332
- * Default sleeper. Hoisted so tests can stub without faking timers.
333
- */
334
147
  function defaultSleep(ms) {
335
148
  return new Promise((resolve) => setTimeout(resolve, ms));
336
149
  }
337
150
 
338
151
  /**
339
- * Inner poll-to-terminal loop. Polls `ghPrChecksFn` on each tick until
340
- * every required check reaches a terminal state or the iteration cap
341
- * (`maxPolls`) fires. Transient `gh` failures (exit status != 0/8 with
342
- * an empty stdout) are logged and skipped — the outer cap eventually
343
- * short-circuits if `gh` is unrecoverably broken.
344
- *
345
- * Exported so {@link watchPrToTerminal}'s BEHIND-recovery outer loop can
346
- * call it once per CI cycle without duplicating the inner logic.
152
+ * A transient `gh` failure is skipped; `maxPolls` bounds a broken `gh`.
347
153
  *
348
154
  * @param {object} opts
349
155
  * @param {string} opts.prUrl
350
156
  * @param {string} opts.cwd
351
157
  * @param {string|null} [opts.repo] `owner/repo` passed to `gh` as `--repo`.
352
158
  * @param {object} opts.outcomes Initial `{ checkName: outcome }` map.
353
- * @param {number} opts.polls Current poll counter (mutated in-place by caller).
159
+ * @param {number} opts.polls Current poll counter.
354
160
  * @param {number} opts.maxPolls Hard cap on total poll iterations.
355
161
  * @param {Function} opts.ghPrChecksFn
356
162
  * @param {number} opts.pollIntervalMs
@@ -378,9 +184,6 @@ export async function pollUntilTerminal({
378
184
  const probe = ghPrChecksFn({ prUrl, cwd, repo });
379
185
  const entries = parseGhPrChecks(probe.stdout);
380
186
  if (entries.length === 0 && probe.status !== 0 && probe.status !== 8) {
381
- // Transient `gh` failure — log and continue. The outer
382
- // iteration cap eventually short-circuits if `gh` is
383
- // unrecoverably broken.
384
187
  logger.warn?.(
385
188
  `[Watcher] gh pr checks transient failure (status=${probe.status}): ${probe.stderr}`,
386
189
  );
@@ -392,47 +195,27 @@ export async function pollUntilTerminal({
392
195
  }
393
196
 
394
197
  /**
395
- * Run the full required-check watch loop for an open PR: poll every
396
- * required check to a terminal state, then — when every check is green
397
- * AND the PR is `mergeStateStatus: BEHIND` — issue a bounded number of
398
- * `gh pr update-branch` fast-forwards, re-polling the freshly-rebased
399
- * commit after each. Plain async function with NO bus coupling: it
400
- * shells out to `gh` (via injectable spawns) and returns the verdict.
401
- *
402
- * The load-bearing primitive the `pr-watch-with-update.js` CLI drives.
403
- * Story #3902 introduced it so the (since-retired) `Watcher` listener and
404
- * the CLI could not drift apart on polling or BEHIND-recovery; the CLI is
405
- * now its only caller.
198
+ * Watch required checks to terminal; when green and BEHIND, update the
199
+ * branch (≤ `maxUpdates`) and re-poll the new head.
406
200
  *
407
201
  * @param {object} opts
408
202
  * @param {string} opts.prUrl PR URL or number (passed to `gh` verbatim).
409
203
  * @param {string} opts.cwd
410
- * @param {string|null} [opts.repo] `owner/repo` target, threaded to every
411
- * `gh` port as a real `--repo` flag (Story #4890). Nullish infers the
412
- * repository from the cwd's remote — the behaviour every in-repo caller wants.
204
+ * @param {string|null} [opts.repo] `owner/repo`, threaded to every port
205
+ * as `--repo`; nullish infers from the cwd's remote.
413
206
  * @param {number} opts.maxPolls Hard cap on total poll iterations per arm.
414
207
  * @param {number} opts.maxUpdates Cap on `gh pr update-branch` recovery calls.
415
- * @param {number} [opts.maxResumes] Story #4358: after the poll cap fires with
416
- * one or more required checks still pending (and NONE failed), re-arm the poll
417
- * loop up to this many times before giving up with a `still-running` verdict.
418
- * A genuinely red check short-circuits immediately and consumes no resume
419
- * budget. Defaults to 0 (no resume) so existing callers are unchanged.
208
+ * @param {number} [opts.maxResumes] Re-arms after the poll cap fires with
209
+ * checks pending and none failed, before a `still-running` verdict.
420
210
  * @param {number} opts.pollIntervalMs Delay between poll ticks.
421
- * @param {Function} [opts.ghPrChecksFn] `gh pr checks` invoker. Defaults
422
- * to the real `gh pr checks` spawn so the CLI path (which injects no
423
- * port) works; tests override it with a stub. Story #4144.
424
- * @param {Function} [opts.ghPrViewFn] `gh pr view` invoker. Defaults
425
- * to the real spawn; tests override.
426
- * @param {Function} [opts.ghPrUpdateBranchFn] `gh pr update-branch`
427
- * invoker. Defaults to the real spawn; tests override.
428
- * @param {Function} [opts.sleepFn] Poll-tick delay. Defaults to a
429
- * real `setTimeout`-backed sleep; tests override with a no-op.
211
+ * @param {Function} [opts.ghPrChecksFn]
212
+ * @param {Function} [opts.ghPrViewFn]
213
+ * @param {Function} [opts.ghPrUpdateBranchFn]
214
+ * @param {Function} [opts.sleepFn]
430
215
  * @param {{ info?: Function, warn?: Function, debug?: Function }} opts.logger
431
216
  * @param {{status:number,stdout:string,stderr:string}} [opts.firstProbe]
432
- * Optional already-issued `gh pr checks` result. A caller that has
433
- * already probed once to resolve the required-check names threads it
434
- * here so the loop does not double-spend the first `gh pr checks` call.
435
- * Omit it (the CLI path) and the loop issues the first probe itself.
217
+ * An already-issued `gh pr checks` result, so the first call is not
218
+ * double-spent.
436
219
  * @returns {Promise<{
437
220
  * outcomes: object,
438
221
  * requiredChecks: string[],
@@ -445,11 +228,8 @@ export async function pollUntilTerminal({
445
228
  * requiredChecksEmpty?: boolean,
446
229
  * error?: string,
447
230
  * }>}
448
- * `outcomes` is schema-valid (no `'pending'` — leftover pending is
449
- * promoted to `'still-running'` when the cap and resume budget are both
450
- * exhausted with no failed check). `stillRunning` is true in exactly
451
- * that case (slow CI, not red). `requiredChecksEmpty` / `error` are set
452
- * only when the first probe resolved NO required-check names.
231
+ * `outcomes` never contains `'pending'`. `requiredChecksEmpty` / `error`
232
+ * are set only when the first probe resolved no required-check names.
453
233
  */
454
234
  export async function watchPrToTerminal({
455
235
  prUrl,
@@ -466,22 +246,13 @@ export async function watchPrToTerminal({
466
246
  logger,
467
247
  firstProbe,
468
248
  }) {
469
- // First probe: resolve the required-check name set at runtime. Reuse a
470
- // caller-supplied probe (issued to resolve the required-check names) so
471
- // we never double-spend the first `gh` call.
472
249
  const first = firstProbe ?? ghPrChecksFn({ prUrl, cwd, repo });
473
- // `gh` exits 8 when checks are still pending; this is expected and
474
- // does not indicate failure. Any other non-zero status with no
475
- // parseable JSON body is a genuine failure.
250
+ // `gh` exits 8 while checks are pending — expected, not a failure.
476
251
  const firstEntries = parseGhPrChecks(first.stdout);
477
252
  if (firstEntries.length === 0) {
478
- // NO required-check name resolved. Never enter the poll loop on that:
479
- // `allTerminal({})` is vacuously true, so the loop would exit on its
480
- // first evaluation and report a terminal-but-not-green arm — a red
481
- // verdict with no failing check in it (Story #4890). The name set is
482
- // resolved exactly once per call, so converging on a context that
483
- // attaches later means calling this function again; return the
484
- // empty-set signal and let the caller's attach window re-resolve it.
253
+ // Never poll an empty name set: `allTerminal({})` is vacuously true and
254
+ // would report a red verdict with no failing check. Names resolve once
255
+ // per call, so the caller's attach window re-resolves by calling again.
485
256
  const ghFaulted = first.status !== 0 && first.status !== 8;
486
257
  if (ghFaulted) {
487
258
  logger.warn?.(
@@ -498,30 +269,19 @@ export async function watchPrToTerminal({
498
269
  green: false,
499
270
  stillRunning: false,
500
271
  requiredChecksEmpty: true,
501
- // `gh` overloads a non-zero exit for "no required check is attached
502
- // right now" AND for a genuine fault, and its stderr prose is not a
503
- // contract — so the status is reported and the *classification* is the
504
- // caller's, made against a structural probe of the PR itself.
272
+ // `gh` overloads non-zero for "none attached yet" and a real fault, and
273
+ // stderr is not a contract, so classification is left to the caller.
505
274
  error: `gh-checks-${ghFaulted ? 'failed' : 'empty'}:status=${first.status}`,
506
275
  };
507
276
  }
508
277
 
509
278
  const requiredChecks = firstEntries.map((e) => e.name);
510
279
 
511
- // Poll loop. The first probe already produced entries; reduce them
512
- // for the initial outcome map, then iterate until every required
513
- // check is terminal or the iteration cap fires. After the checks
514
- // converge, the BEHIND-recovery loop may re-enter the poll loop AFTER
515
- // issuing `gh pr update-branch`.
516
280
  let outcomes = reduceOutcomes(firstEntries);
517
281
  let polls = 0;
518
282
  let updatesApplied = 0;
519
283
  let resumesApplied = 0;
520
- // Outer resume loop (Story #4358). Each iteration runs one full
521
- // poll-to-cap + BEHIND-recovery arm. When the arm ends with checks
522
- // still pending but NONE failed, we re-arm (reset the poll counter)
523
- // up to `maxResumes` times before declaring `still-running`. A red
524
- // check breaks out immediately without consuming resume budget.
284
+ // Each outer iteration is one poll-to-cap + BEHIND-recovery arm.
525
285
  for (;;) {
526
286
  while (polls < maxPolls) {
527
287
  ({ outcomes, polls } = await pollUntilTerminal({
@@ -536,17 +296,10 @@ export async function watchPrToTerminal({
536
296
  sleepFn,
537
297
  logger,
538
298
  }));
539
- // Checks have either all gone terminal or we hit the iteration cap.
540
- // BEHIND-recovery (Story #2327): when every required check is green
541
- // AND the PR is BEHIND its base, issue ONE `gh pr update-branch`
542
- // call and re-poll the checks against the freshly-rebased commit. A
543
- // red check is a hard block — stop here regardless of merge state.
544
- // Bounded by `maxUpdates` so a racing base branch can't ping-pong
545
- // indefinitely.
299
+ // BEHIND recovery only when all green; `maxUpdates` stops a racing
300
+ // base from ping-ponging forever.
546
301
  if (!allTerminal(outcomes) || !allGreen(outcomes)) break;
547
- // Budget is checked before the `gh pr view` spawn so an exhausted arm
548
- // costs no extra round-trip; the shared helper re-checks it as a
549
- // fail-safe, and its callback therefore never fires on this path.
302
+ // Checked before the `gh pr view` spawn to save the round-trip.
550
303
  if (updatesApplied >= maxUpdates) break;
551
304
  const view = ghPrViewFn({ prUrl, cwd, repo });
552
305
  if (view.status !== 0) {
@@ -571,26 +324,19 @@ export async function watchPrToTerminal({
571
324
  onUpdateFailed: (detail) =>
572
325
  logger.warn?.(`[Watcher] gh pr update-branch failed (${detail})`),
573
326
  });
574
- // Anything but a landed fast-forward ends the arm: not BEHIND means
575
- // there is nothing to recover, and a failed update must not silently
576
- // re-poll as though the head moved.
327
+ // A failed update must not re-poll as though the head moved.
577
328
  if (!recovery.updated) break;
578
329
  updatesApplied += 1;
579
330
  logger.info?.(
580
331
  `[Watcher] PR BEHIND base — issued gh pr update-branch (#${updatesApplied}/${maxUpdates}); re-polling required checks.`,
581
332
  );
582
333
  await sleepFn(pollIntervalMs);
583
- // After update-branch, the freshly-rebased commit invalidates the
584
- // previous terminal outcomes. Reset to force the inner poll loop to
585
- // re-evaluate the new CI cycle.
334
+ // The new head invalidates the previous terminal outcomes.
586
335
  outcomes = {};
587
336
  for (const name of requiredChecks) outcomes[name] = 'pending';
588
337
  }
589
338
 
590
- // Arm complete. Decide whether to re-arm. A genuinely red check is a
591
- // hard stop that consumes NO resume budget — the change is broken,
592
- // resuming would only burn wall-clock. Only re-arm when the arm timed
593
- // out with pending-but-not-failed checks and resume budget remains.
339
+ // Re-arm only when pending-but-not-failed with resume budget left.
594
340
  if (allTerminal(outcomes) || hasFailingCheck(outcomes)) break;
595
341
  if (resumesApplied >= maxResumes) break;
596
342
  resumesApplied += 1;
@@ -602,11 +348,7 @@ export async function watchPrToTerminal({
602
348
 
603
349
  const terminal = allTerminal(outcomes);
604
350
  const failing = hasFailingCheck(outcomes);
605
- // Slow-but-not-red: the poll cap AND resume budget are exhausted with
606
- // one or more checks still pending and NONE failed. The schema enum
607
- // forbids `'pending'`; promote leftover pending entries to the
608
- // `'still-running'` sentinel (never `'timed_out'` — that would read as
609
- // a genuine terminal failure to the auto-merge predicate).
351
+ // Never `'timed_out'` — the auto-merge predicate would read it as failure.
610
352
  const stillRunning = !terminal && !failing;
611
353
  const finalOutcomes = terminal
612
354
  ? outcomes