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,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