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,84 +1,14 @@
1
1
  #!/usr/bin/env node
2
2
  /**
3
- * pr-watch-with-update.js — the single CI-watch mechanism for the Story
4
- * delivery path (`helpers/deliver-story.md` Step 4). Story #4358 retired
5
- * the bare `gh pr checks --watch` so every caller drives this one CLI.
3
+ * pr-watch-with-update.js — the single CI-watch CLI for Story delivery.
4
+ * Polls the PR's required checks to a terminal state via `watchPrToTerminal`,
5
+ * recovering from `BEHIND` with bounded `gh pr update-branch` calls.
6
6
  *
7
- * Polls the PR's required checks to a terminal state and auto-recovers
8
- * from `mergeStateStatus: BEHIND` (via bounded `gh pr update-branch`
9
- * calls) by delegating to the `watchPrToTerminal` primitive in
10
- * `lib/orchestration/pr-watch.js`. That primitive was shared with the
11
- * `Watcher` bus listener until Story #5006 deleted it (nothing emitted at
12
- * it); this CLI is now its only caller. Story #5024 retired the bus
13
- * outright, so there is no bus to create — this is a direct, synchronous
14
- * watch with a real exit code.
15
- *
16
- * Slow-vs-failed semantics (Story #4358):
17
- * - GREEN — every required check terminal + green → exit 0, unless the
18
- * no-rerun guard says otherwise (below).
19
- * - RED — one or more required checks genuinely failed → exit 1
20
- * IMMEDIATELY, consuming no resume budget. On red the CLI
21
- * disarms native auto-merge and writes
22
- * `temp/story-<id>-ci-digest.{json,md}` (failing check name,
23
- * head SHA, run id + run link, a `gh run view --log-failed`
24
- * tail, and a coarse classification). The digest is scoped by
25
- * filename, so it requires `--story` (Story #4539: the digest
26
- * was Epic-scoped and therefore never written on the only
27
- * delivery path v2 has).
28
- * - STILL-RUNNING — the poll cap fired with checks still pending and
29
- * none failed; the watcher re-armed up to
30
- * `delivery.ci.watch.maxResumes` times, then returned a
31
- * `still-running` verdict → exit 2 (NEVER 1, NEVER
32
- * `timed_out`). The CLI prints the `gh pr checks --watch`
33
- * handoff so the host can keep polling on its own cadence.
34
- * - UNRESOLVED — every observed required check is green but the observed
35
- * set does not reconcile with the repository's own verdict
36
- * (Story #4873) → exit 2, same "keep watching" semantics as
37
- * still-running. Withholding is the point: this watcher has
38
- * reported green on a PR GitHub was reporting as BLOCKED.
39
- * - NOT-YET-STARTED — the attach window was spent and NO required context
40
- * ever attached, while the pull request itself kept reading back
41
- * fine (Story #4890) → exit 2, the same "keep watching"
42
- * semantics. This used to map onto the red exit code, which
43
- * misroutes the caller twice over: the module reserves exit 1 for
44
- * a required check that GENUINELY FAILED, and the red path writes
45
- * a CI digest naming the failing check — so a caller routed onto
46
- * it by a set that was merely empty found nothing to read. A
47
- * still-empty required set is a slow condition, and the module
48
- * already models slow as exit 2. A `gh` fault the PR probe cannot
49
- * see past is still exit 1.
50
- *
51
- * Two GitHub oracles are deliberately not trusted on a single reading
52
- * (Story #4873). An EMPTY `gh pr checks --required` probe is re-resolved
53
- * within {@link REQUIRED_CONTEXT_ATTACH_WINDOW_MS} before it is believed —
54
- * a ruleset attaches its required contexts asynchronously, and a required
55
- * context that is an aggregator job gated on every other tier is by
56
- * construction the LAST to appear (#4890 measured 16m52s), so a watch launched
57
- * right after `gh pr create` used to fail a delivery whose CI had not been
58
- * asked to start yet. And a GREEN verdict is issued only after
59
- * {@link reconcileGreenVerdict} confirms the repository agrees; an
60
- * unreconcilable set reports unresolved instead of green.
61
- *
62
- * No-rerun enforcement (Story #4865). `rules/ci-remediation.md` § Verifier
63
- * forbids re-running a failed job to reach green; this CLI is the point
64
- * that enforces it. Enforcement acts on the **first red** — GitHub's native
65
- * auto-merge fires server-side and races any post-green detection, so a
66
- * green can already have merged by the time it is observed. On red the
67
- * watcher disarms auto-merge and records the head SHA; on green it reads
68
- * the digest and adjudicates: a green on the SAME head SHA is a forbidden
69
- * re-run (exit 1, `agent::blocked`, a `file-ci-gap.js` intake filing
70
- * required), while
71
- * a green on a NEW head SHA is a fix at source — the digest is retired,
72
- * auto-merge is re-armed, and the delivery proceeds. A delivery that never
73
- * went red has no digest and is untouched. Mechanism:
74
- * `lib/orchestration/ci-rerun-guard.js`.
75
- *
76
- * Config (Story #4356 namespace, read via `getCiDelivery`):
77
- * - `delivery.ci.watch.pollIntervalMs`
78
- * - `delivery.ci.watch.maxPolls`
79
- * - `delivery.ci.watch.maxResumes`
80
- * - `delivery.ci.watch.attachWindowMs` (Story #4890)
81
- * CLI flags override config; config overrides the framework fallback.
7
+ * No-rerun enforcement (`rules/ci-remediation.md` § Verifier) acts on the
8
+ * FIRST red, because native auto-merge fires server-side and races any
9
+ * post-green detection: red disarms auto-merge and records the head SHA in a
10
+ * digest; a later green on the SAME SHA is a forbidden re-run, on a NEW SHA a
11
+ * fix at source (digest retired, auto-merge re-armed).
82
12
  *
83
13
  * Usage:
84
14
  * node .agents/scripts/pr-watch-with-update.js --pr <n> --story <id>
@@ -87,7 +17,6 @@
87
17
  */
88
18
  import { parseArgs } from 'node:util';
89
19
  import { runAsCli } from './lib/cli-utils.js';
90
- import { getCiDelivery } from './lib/config/ci.js';
91
20
  import { resolveConfig } from './lib/config-resolver.js';
92
21
  import { gh as defaultGh } from './lib/gh-exec.js';
93
22
  import { Logger } from './lib/Logger.js';
@@ -95,7 +24,6 @@ import {
95
24
  blockStoryDelivery,
96
25
  classifyFailure,
97
26
  classifyGreenVerdict,
98
- disarmAutoMerge,
99
27
  formatRerunViolation,
100
28
  readCiDigest,
101
29
  resolveDigestScope,
@@ -104,34 +32,24 @@ import {
104
32
  writeCiDigest,
105
33
  } from './lib/orchestration/ci-rerun-guard.js';
106
34
  import { watchPrToTerminal } from './lib/orchestration/pr-watch.js';
107
- import { enableAutoMergeWith } from './lib/orchestration/single-story-close/phases/auto-merge.js';
35
+ import {
36
+ disarmAutoMerge,
37
+ enableAutoMergeWith,
38
+ } from './lib/orchestration/single-story-close/phases/auto-merge.js';
108
39
  import { sleep as defaultSleep } from './lib/util/poll-loop.js';
109
40
 
110
41
  /** Exit code reserved for the slow-but-not-red `still-running` verdict. */
111
42
  export const STILL_RUNNING_EXIT_CODE = 2;
112
43
 
113
44
  /**
114
- * How long a probe that resolved NO required contexts keeps being retried
115
- * before the watch stops waiting for one (Stories #4873, #4890).
116
- *
117
- * A repository ruleset attaches its required contexts to a pull request
118
- * asynchronously, and the arrival latency is set by the SLOWEST context in the
119
- * set. Story #4873 measured tens of seconds on a cold repo and calibrated the
120
- * window at 90s; #4890 measured **16m52s** on this repository, because its
121
- * required context is an aggregator job gated on every other tier and is
122
- * therefore, by construction, the last check to appear. A 90s window still
123
- * exhausted, so the watch still aborted on a PR whose CI was working exactly
124
- * as designed.
125
- *
126
- * The default therefore covers a late aggregator with margin rather than a
127
- * fast ruleset, and it is operator-tunable on the `delivery.ci.watch.*` ladder
128
- * (`attachWindowMs`) for a repository whose contexts arrive on a different
129
- * cadence. Spending the window costs nothing but wall-clock on a PR nobody
130
- * could merge yet; exhausting it too early costs the whole delivery.
45
+ * How long an EMPTY required-context probe keeps being retried. Rulesets
46
+ * attach contexts asynchronously and an aggregator context gated on every
47
+ * other tier arrives last (~17 min measured), so the default covers that with
48
+ * margin: waiting costs wall-clock, giving up early costs the delivery.
131
49
  */
132
50
  export const REQUIRED_CONTEXT_ATTACH_WINDOW_MS = 1_200_000;
133
51
 
134
- /** Framework fallbacks when neither a CLI flag nor config supplies a value. */
52
+ /** Framework fallbacks when no CLI flag supplies a value. */
135
53
  export const WATCH_DEFAULTS = Object.freeze({
136
54
  pollIntervalMs: 10_000,
137
55
  maxPolls: 180,
@@ -141,25 +59,15 @@ export const WATCH_DEFAULTS = Object.freeze({
141
59
  });
142
60
 
143
61
  /**
144
- * Merge-state values that reconcile an observed all-green required set with
145
- * the repository's own view of the pull request (Story #4873).
146
- *
147
- * `BLOCKED` is the measured false-green: the watcher's `gh pr checks
148
- * --required` set came back SMALLER than branch protection's — a context
149
- * attached after the first probe, so it was never in `requiredChecks` — every
150
- * check the watcher knew about was green, and it reported green while GitHub
151
- * still refused the merge. `UNKNOWN` / an unreadable probe is not a
152
- * reconciliation either: it is the absence of the second opinion, and a green
153
- * verdict is exactly the verdict that must not be issued on absent evidence.
62
+ * Merge states that confirm an observed all-green required set. `BLOCKED`
63
+ * means branch protection enforces a context the watch never observed (it
64
+ * attached after the first probe); `UNKNOWN`/unreadable is absent evidence.
154
65
  */
155
66
  const RECONCILED_MERGE_STATES = Object.freeze(
156
67
  new Set(['CLEAN', 'UNSTABLE', 'HAS_HOOKS', 'BEHIND', 'DRAFT']),
157
68
  );
158
69
 
159
70
  /**
160
- * Does an observed-green required set reconcile with the repository's own
161
- * verdict on the PR? Pure — exported so the rule is reviewable as code.
162
- *
163
71
  * @param {{ observedRequired?: string[], mergeStateStatus?: string|null }} args
164
72
  * @returns {{ reconciled: boolean, mergeStateStatus: string|null, reason: string }}
165
73
  */
@@ -208,12 +116,7 @@ async function defaultMergeStateProbe({ prRef }) {
208
116
  }
209
117
  }
210
118
 
211
- /**
212
- * Adapt the watch loop's own `ghPrViewFn` port — which already spawns
213
- * `gh pr view --json mergeStateStatus` for BEHIND recovery — into the
214
- * reconciliation probe, so a caller that injected one port does not have to
215
- * inject a second for the same `gh` call.
216
- */
119
+ /** Reuse an injected `ghPrViewFn` port as the merge-state probe. */
217
120
  function mergeStateProbeFromView(ghPrViewFn) {
218
121
  return async ({ prUrl, repo, cwd }) => {
219
122
  try {
@@ -230,22 +133,11 @@ function mergeStateProbeFromView(ghPrViewFn) {
230
133
  }
231
134
 
232
135
  /**
233
- * Run the watch, re-resolving a required-check set that came back EMPTY until
234
- * the attach window is spent (Stories #4873 AC-3, #4890 AC-1). Every other
235
- * terminal — green, red, still-running — returns on the first arm exactly as
236
- * before.
237
- *
238
- * Re-arming the whole call is what makes convergence possible: the required
239
- * check NAMES are resolved once per `watchPrToTerminal` call, so a context that
240
- * attaches minutes later is only ever seen by a fresh call.
241
- *
242
- * `probePrResolvable` is the **structural** classifier, re-read every round: a
243
- * required set that is empty while the pull request itself reads back fine is
244
- * CI that has not started, so the window is worth spending; a pull request that
245
- * does not read back at all is a `gh` fault, so the window is not spent on it
246
- * and the caller reports the failure immediately. `gh` overloads its exit code
247
- * across both conditions, and this deliberately does not fall back to matching
248
- * its stderr prose — a human-readable string is not a classification contract.
136
+ * Run the watch, re-running the whole call while the required set is EMPTY
137
+ * (names resolve once per call, so a late context needs a fresh call) until
138
+ * the attach window is spent. `probePrResolvable` separates CI-not-started
139
+ * (PR reads back) from a `gh` fault (it does not) structurally — never from
140
+ * stderr prose.
249
141
  *
250
142
  * @returns {Promise<object>} the watch result plus `attachRetries`, and
251
143
  * `prResolvable` whenever the required set stayed empty.
@@ -260,11 +152,8 @@ async function watchWithAttachWindow({
260
152
  logger,
261
153
  }) {
262
154
  const deadline = nowMsFn() + attachWindowMs;
263
- // The window is wall-clock, but the retry count is also capped: a caller
264
- // running with a zero poll interval (every unit test, and a config that
265
- // sets one) would otherwise spin the window out as a tight loop. Flooring
266
- // the assumed cadence at 5s bounds the attempts without changing the
267
- // wall-clock bound that governs a real watch.
155
+ // Cap retries too (cadence floored at 5s) so a zero poll interval cannot
156
+ // spin the wall-clock window as a tight loop.
268
157
  const maxRetries = Math.ceil(
269
158
  attachWindowMs / Math.max(retryIntervalMs, 5000),
270
159
  );
@@ -300,40 +189,19 @@ function parsePositiveInt(raw, fallback) {
300
189
  }
301
190
 
302
191
  /**
303
- * Resolve the effective poll knobs: CLI flag → `delivery.ci.watch.*` →
304
- * framework fallback. Pure (given a config bag) — exported for tests so
305
- * the precedence ladder is reviewable. `flags` are the raw string values
306
- * from `parseArgs` (or numbers, in tests); a nullish flag falls through
307
- * to config, and a nullish config field falls through to the default.
192
+ * Resolve poll knobs: a nullish or malformed flag falls back to
193
+ * {@link WATCH_DEFAULTS}.
308
194
  *
309
195
  * @param {object} opts
310
- * @param {object|null} [opts.config] resolved config (or a bare bag).
311
- * @param {object} [opts.flags] `{ pollIntervalMs, maxPolls, maxResumes, maxUpdates, attachWindowMs }`.
196
+ * @param {object} [opts.flags]
312
197
  * @returns {{ pollIntervalMs: number, maxPolls: number, maxResumes: number, maxUpdates: number, attachWindowMs: number }}
313
198
  */
314
- export function resolveWatchKnobs({ config, flags = {} } = {}) {
315
- const watch = getCiDelivery(config).watch ?? {};
316
- const pick = (flag, cfg, dflt) =>
317
- parsePositiveInt(flag, Number.isInteger(cfg) && cfg >= 0 ? cfg : dflt);
318
- return {
319
- pollIntervalMs: pick(
320
- flags.pollIntervalMs,
321
- watch.pollIntervalMs,
322
- WATCH_DEFAULTS.pollIntervalMs,
323
- ),
324
- maxPolls: pick(flags.maxPolls, watch.maxPolls, WATCH_DEFAULTS.maxPolls),
325
- maxResumes: pick(
326
- flags.maxResumes,
327
- watch.maxResumes,
328
- WATCH_DEFAULTS.maxResumes,
329
- ),
330
- maxUpdates: pick(flags.maxUpdates, undefined, WATCH_DEFAULTS.maxUpdates),
331
- attachWindowMs: pick(
332
- flags.attachWindowMs,
333
- watch.attachWindowMs,
334
- WATCH_DEFAULTS.attachWindowMs,
335
- ),
336
- };
199
+ export function resolveWatchKnobs({ flags = {} } = {}) {
200
+ const knobs = {};
201
+ for (const [key, fallback] of Object.entries(WATCH_DEFAULTS)) {
202
+ knobs[key] = parsePositiveInt(flags[key], fallback);
203
+ }
204
+ return knobs;
337
205
  }
338
206
 
339
207
  /** Default re-arm: the sanctioned auto-merge enablement path. */
@@ -342,13 +210,9 @@ function defaultReArm({ cwd, prNumber }) {
342
210
  }
343
211
 
344
212
  /**
345
- * Red path (Story #4865). Disarm native auto-merge FIRST — that is the
346
- * race-free moment, before any green can exist — then record the digest so
347
- * the green path can adjudicate against the head SHA the red happened on.
348
- *
349
- * A disarm failure is a **blocker**, not a warning: an armed PR whose
350
- * required check went red can still be merged by GitHub the instant a
351
- * re-run turns it green, which is precisely what this guard exists to stop.
213
+ * Red path: disarm auto-merge FIRST (the race-free moment), then record the
214
+ * digest keyed to the red head SHA. A disarm failure blocks — an armed PR
215
+ * merges the instant a re-run turns it green.
352
216
  *
353
217
  * @returns {Promise<{ headSha: string|null, disarm: object, digestPaths: object|null, blocked: boolean }>}
354
218
  */
@@ -365,7 +229,7 @@ async function handleRedWatch({
365
229
  blockFn,
366
230
  logger,
367
231
  }) {
368
- const disarm = disarmFn({ prRef, cwd });
232
+ const disarm = await disarmFn({ prRef });
369
233
  const scope = resolveDigestScope({ storyId });
370
234
  const headSha = scope ? headShaFn({ prRef, cwd }) : null;
371
235
  let digestPaths = null;
@@ -419,9 +283,7 @@ async function handleRedWatch({
419
283
  }
420
284
 
421
285
  /**
422
- * Green path (Story #4865). Adjudicate the green against any digest the
423
- * scope recorded, and return the exit code with the report the caller
424
- * prints.
286
+ * Green path: adjudicate the green against any recorded red digest.
425
287
  *
426
288
  * @returns {Promise<{ verdict: string, reason: string, exitCode: number, headSha: string|null, reArmed?: boolean, blocked?: boolean }>}
427
289
  */
@@ -458,12 +320,15 @@ async function evaluateGreenWatch({
458
320
  }
459
321
  const headSha = headShaFn({ prRef, cwd });
460
322
  const { verdict, reason } = classifyGreenVerdict({ digest, headSha });
461
- if (verdict === 'fix-at-source') {
323
+ if (verdict === 'fix-at-source' || verdict === 'rerun-permitted') {
324
+ // `rerun-permitted`: `file-ci-gap.js` proved a capacity/unreproducible
325
+ // verdict for THIS head. Retiring the digest spends the one allowance.
462
326
  retireDigestFn({ storyId, tempRoot, cwd });
463
327
  const reArm = await reArmFn({ cwd, prNumber });
464
328
  const reArmed = Boolean(reArm?.enabled);
465
329
  logger.info?.(
466
- `[pr-watch] green on a NEW head SHA (${reason}) — fix at source; digest retired, ` +
330
+ `[pr-watch] ${verdict === 'rerun-permitted' ? 'green admitted on the SAME head SHA' : 'green on a NEW head SHA'} ` +
331
+ `(${reason}) — digest retired, ` +
467
332
  `auto-merge ${reArmed ? 're-armed' : `NOT re-armed (${reArm?.reason ?? 'unknown'})`}.`,
468
333
  );
469
334
  return { verdict, reason, exitCode: 0, headSha, reArmed };
@@ -489,11 +354,7 @@ async function evaluateGreenWatch({
489
354
  }
490
355
 
491
356
  /**
492
- * Resolve the knobs, temp root and working directory one watch run needs.
493
- *
494
- * Split out of `runPrWatch` because config resolution must not abort the
495
- * watch: a broken `.agentrc` should degrade to defaults, not turn a CI probe
496
- * into a crash.
357
+ * A broken `.agentrc` degrades to defaults rather than aborting the watch.
497
358
  *
498
359
  * @param {{ config?: object, tempRoot?: string, logger: object, flags: object }} params
499
360
  * @returns {{ knobs: object, effectiveTempRoot: string, cwd: string }}
@@ -501,18 +362,14 @@ async function evaluateGreenWatch({
501
362
  function resolveWatchContext({ config, tempRoot, logger, flags }) {
502
363
  const resolvedConfig =
503
364
  config !== undefined ? config : safeResolveConfig(logger);
504
- const knobs = resolveWatchKnobs({ config: resolvedConfig, flags });
365
+ const knobs = resolveWatchKnobs({ flags });
505
366
  const effectiveTempRoot =
506
367
  tempRoot ?? resolvedConfig?.project?.paths?.tempRoot ?? 'temp';
507
368
  return { knobs, effectiveTempRoot, cwd: process.cwd() };
508
369
  }
509
370
 
510
371
  /**
511
- * Build the argument bag for the underlying watch port.
512
- *
513
- * Each injectable port is spread in only when supplied so the port keeps its
514
- * own default — passing `undefined` explicitly would override a default with
515
- * nothing and break every caller that relies on it.
372
+ * Ports are spread in only when supplied so the watch keeps its own defaults.
516
373
  *
517
374
  * @param {object} params
518
375
  * @returns {object}
@@ -545,13 +402,8 @@ function buildWatchArgs({
545
402
  }
546
403
 
547
404
  /**
548
- * One terminal outcome of the watch: the attach window is spent and no
549
- * required check ever attached, or the pull request could not be read at all.
550
- *
551
- * The two are distinguished structurally — never against `gh`'s stderr prose
552
- * (Story #4890) — because they route oppositely: CI that has not started is
553
- * slow (exit 2, keep watching), while an unreadable PR is a `gh` / access
554
- * fault (exit 1).
405
+ * No required check attached (slow, exit 2) vs. unreadable PR (`gh` fault,
406
+ * exit 1).
555
407
  *
556
408
  * @param {object} params
557
409
  * @returns {number} exit code
@@ -592,13 +444,8 @@ function reportUnattachedOrError({
592
444
  }
593
445
 
594
446
  /**
595
- * Settle a watch whose observed required checks all came back green.
596
- *
597
- * Never green on an undercount (Story #4873): the observed set is whatever
598
- * `gh pr checks --required` returned on the FIRST probe, so a context a
599
- * ruleset attached later can leave every check we knew about green while
600
- * GitHub still refuses the merge. An unreconcilable set reports unresolved
601
- * (exit 2, keep watching) rather than a false green or a false red.
447
+ * Settle an all-green watch. The observed set is from the FIRST probe and may
448
+ * undercount, so an unreconcilable set exits 2 rather than a false green.
602
449
  *
603
450
  * @param {object} params
604
451
  * @returns {Promise<number>} exit code
@@ -653,9 +500,7 @@ async function settleGreenWatch({
653
500
  }
654
501
 
655
502
  /**
656
- * Slow-but-not-red: the poll cap AND the resume budget are exhausted with
657
- * checks still pending and none failed. Never exit 1, never `timed_out` —
658
- * hand off to the host's interval loop and exit 2.
503
+ * Poll cap and resume budget exhausted, none red: hand off, exit 2.
659
504
  *
660
505
  * @param {object} params
661
506
  * @returns {number} exit code
@@ -674,11 +519,8 @@ function reportStillRunning({ result, envelope, logger, print }) {
674
519
  }
675
520
 
676
521
  /**
677
- * The failing checks, excluding every non-failing state **and**
678
- * `still-running`: when the cap fires with a mixed failed+pending map,
679
- * `promotePendingToStillRunning` has rewritten the pending entries, and a
680
- * still-running check is slow, not red — including it here would let it become
681
- * the digest's "primary" failing check and mispoint the diagnosis.
522
+ * Failing checks. `still-running` is excluded: it is slow, not red, and would
523
+ * otherwise become the digest's primary failing check.
682
524
  *
683
525
  * @param {Record<string, string>} outcomes
684
526
  * @returns {Array<{ name: string, outcome: string }>}
@@ -696,9 +538,6 @@ function collectFailures(outcomes) {
696
538
  }
697
539
 
698
540
  /**
699
- * Genuine red check — exit 1 immediately, disarm auto-merge, write the digest,
700
- * and surface the fix-loop handoff.
701
- *
702
541
  * @param {object} params
703
542
  * @returns {Promise<number>} exit code
704
543
  */
@@ -755,44 +594,34 @@ async function settleRedWatch({
755
594
  }
756
595
 
757
596
  /**
758
- * Run the watch loop and resolve to the exit code. Exported for tests so
759
- * the green / red / still-running / BEHIND paths can be exercised with
760
- * injected `gh` spawns and no `process.exit`.
761
- *
762
- * 0 → all required checks green (and the no-rerun guard cleared them).
763
- * 1 → a required check genuinely failed (red), OR the green was reached
764
- * by a forbidden re-run of the same commit, OR the pull request itself
765
- * could not be read (a `gh` / access fault).
766
- * 2 → slow-but-not-red: still-running (cap + resume budget exhausted, none
767
- * red), an unreconcilable green, or no required context attached within
768
- * the attach window while the PR kept reading back fine (#4890).
597
+ * Run the watch and resolve to the exit code: 0 green (guard cleared);
598
+ * 1 red, forbidden same-SHA re-run, or unreadable PR; 2 slow-but-not-red
599
+ * (still running, unreconcilable green, or no context attached in the window).
769
600
  *
770
601
  * @param {object} opts
771
602
  * @param {number} opts.prNumber
772
- * @param {string|null} [opts.repo] `owner/repo`; passed to `gh` as `--repo`.
603
+ * @param {string|null} [opts.repo]
773
604
  * @param {number|string} [opts.maxUpdates]
774
605
  * @param {number|string} [opts.pollIntervalMs]
775
606
  * @param {number|string} [opts.maxPolls]
776
607
  * @param {number|string} [opts.maxResumes]
777
- * @param {number|string} [opts.attachWindowMs] override the required-context
778
- * attach window for one run (flag → `delivery.ci.watch.attachWindowMs` →
779
- * {@link REQUIRED_CONTEXT_ATTACH_WINDOW_MS}).
780
- * @param {object|null} [opts.config] resolved config (defaults to resolveConfig()).
781
- * @param {string} [opts.tempRoot] digest output dir (default `temp`).
782
- * @param {Function} [opts.ghPrChecksFn] inject for tests
783
- * @param {Function} [opts.ghPrViewFn] inject for tests
784
- * @param {Function} [opts.ghPrUpdateBranchFn] inject for tests
785
- * @param {Function} [opts.sleepFn] inject for tests
786
- * @param {Function} [opts.writeDigestFn] inject for tests (default writeCiDigest)
787
- * @param {Function} [opts.readDigestFn] inject for tests (default readCiDigest)
788
- * @param {Function} [opts.retireDigestFn] inject for tests (default retireCiDigest)
789
- * @param {Function} [opts.headShaFn] inject for tests (default resolvePrHeadSha)
790
- * @param {Function} [opts.disarmAutoMergeFn] inject for tests (default disarmAutoMerge)
791
- * @param {Function} [opts.reArmAutoMergeFn] inject for tests (default enableAutoMergeWith)
792
- * @param {Function} [opts.blockDeliveryFn] inject for tests (default blockStoryDelivery)
608
+ * @param {number|string} [opts.attachWindowMs]
609
+ * @param {object|null} [opts.config]
610
+ * @param {string} [opts.tempRoot]
611
+ * @param {Function} [opts.ghPrChecksFn]
612
+ * @param {Function} [opts.ghPrViewFn]
613
+ * @param {Function} [opts.ghPrUpdateBranchFn]
614
+ * @param {Function} [opts.sleepFn]
615
+ * @param {Function} [opts.writeDigestFn]
616
+ * @param {Function} [opts.readDigestFn]
617
+ * @param {Function} [opts.retireDigestFn]
618
+ * @param {Function} [opts.headShaFn]
619
+ * @param {Function} [opts.disarmAutoMergeFn]
620
+ * @param {Function} [opts.reArmAutoMergeFn]
621
+ * @param {Function} [opts.blockDeliveryFn]
793
622
  * @param {object} [opts.logger]
794
- * @param {(line: string) => void} [opts.print] stdout sink (default process.stdout)
795
- * @returns {Promise<number>} process exit code.
623
+ * @param {(line: string) => void} [opts.print]
624
+ * @returns {Promise<number>}
796
625
  */
797
626
  export async function runPrWatch({
798
627
  prNumber,
@@ -831,22 +660,13 @@ export async function runPrWatch({
831
660
  flags: { pollIntervalMs, maxPolls, maxResumes, maxUpdates, attachWindowMs },
832
661
  });
833
662
 
834
- // `gh` has NO `<owner/repo>#<number>` argument form — it parses that string
835
- // as a BRANCH NAME, which is why every `--repo` invocation used to fail at
836
- // the first probe with a misleading `gh-checks-failed:status=1` (#4890). The
837
- // repository therefore travels two sanctioned ways, never as a composed ref:
838
- // - a real `--repo` flag on the watch ports, which build their own argv;
839
- // - a canonical PR URL for the no-rerun-guard helpers, which take a bare
840
- // ref and no repository of their own.
841
- // With `--repo` omitted, `gh` infers the repository from the cwd's remote.
663
+ // `gh` parses `<owner/repo>#<n>` as a branch name, so the repo travels as a
664
+ // `--repo` flag on watch ports and as a PR URL for the guard helpers.
842
665
  const prRef = String(prNumber);
843
666
  const guardPrRef = repo
844
667
  ? `https://github.com/${repo}/pull/${prNumber}`
845
668
  : prRef;
846
669
 
847
- // One merge-state probe, resolved once and used for both readings that need
848
- // the repository's own view of the PR: the empty-required-set classification
849
- // below, and the green-verdict reconciliation further down.
850
670
  const probeMergeState =
851
671
  mergeStateProbeFn ??
852
672
  (ghPrViewFn ? mergeStateProbeFromView(ghPrViewFn) : defaultMergeStateProbe);
@@ -869,14 +689,10 @@ export async function runPrWatch({
869
689
  retryIntervalMs: knobs.pollIntervalMs,
870
690
  sleepFn: sleepFn ?? defaultSleep,
871
691
  nowMsFn,
872
- // Structural, not prose: the PR reads back ⇒ `gh` works and the empty
873
- // required set is CI that has not started yet.
874
692
  probePrResolvable: async () => (await readMergeState()) !== null,
875
693
  logger,
876
694
  });
877
695
 
878
- // Always print the final outcomes map so the operator (and the
879
- // workflow log) can see exactly which check blocked.
880
696
  const envelope = {
881
697
  prNumber,
882
698
  checkOutcomes: result.outcomes,
@@ -1,12 +1,7 @@
1
1
  /**
2
- * GitHub Provider — token resolution.
3
- *
4
- * Hierarchy: GITHUB_TOKEN / GH_TOKEN env → `gh auth token` CLI fallback
5
- * → throws with an instructive error. `execSync` is indirected through a
6
- * holder so tests can swap it.
7
- *
8
- * Extracted from `../github.js` in Story #1846 / Task #1855 — see that
9
- * Story for the broader split rationale.
2
+ * GitHub Provider — token resolution: GITHUB_TOKEN / GH_TOKEN env →
3
+ * `gh auth token` → instructive throw. `execSync` sits behind a holder so
4
+ * tests can swap it.
10
5
  */
11
6
 
12
7
  import { execSync as defaultExecSync } from 'node:child_process';