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
@@ -7,9 +7,7 @@
7
7
  * node .agents/scripts/plan-run-epilogue.js --stories 1,2,3
8
8
  * node .agents/scripts/plan-run-epilogue.js --stories 101-104 # inclusive range
9
9
  *
10
- * Keyed on the delivered id set: an `adhoc-<sorted-ids>` run id is
11
- * synthesized from `--stories`. Story #4540 retired the `--run <planRunId>`
12
- * label-resolution branch along with the `plan-run::<id>` label itself.
10
+ * Keyed on the delivered id set via a synthesized `adhoc-<sorted-ids>` run id.
13
11
  */
14
12
 
15
13
  import './lib/runtime-deps/ensure-installed.js';
@@ -25,7 +23,7 @@ import { expandIdList } from './lib/util/parse-id-list.js';
25
23
  const CLI_OPTIONS = {
26
24
  stories: { type: 'string' },
27
25
  cwd: { type: 'string' },
28
- /** Story #5343 — opt-in; see `run-epilogue.js` RUN_EPILOGUE_STEP_KINDS. */
26
+ /** Opt-in; see `run-epilogue.js` RUN_EPILOGUE_STEP_KINDS. */
29
27
  'audit-roster': { type: 'boolean', default: false },
30
28
  };
31
29
 
@@ -36,9 +34,7 @@ const CLI_OPTIONS = {
36
34
  * createProviderImpl?: typeof createProvider,
37
35
  * runPlanRunEpilogueImpl?: typeof runPlanRunEpilogue,
38
36
  * logger?: { info: Function, warn: Function },
39
- * }} [deps] Injectable seams; every entry defaults to the real
40
- * implementation (`.agents/rules/test-seams.md` rules 1-2), so the CLI path
41
- * and every production caller are unchanged.
37
+ * }} [deps]
42
38
  * @returns {Promise<object>}
43
39
  */
44
40
  export async function main(argv = process.argv.slice(2), deps = {}) {
@@ -60,14 +56,8 @@ export async function main(argv = process.argv.slice(2), deps = {}) {
60
56
  const config = resolveConfigImpl({ cwd });
61
57
  const provider = createProviderImpl(config);
62
58
 
63
- // Story #4540 retired the `--run <planRunId>` label-resolution branch
64
- // along with the label itself. The epilogue is keyed on the delivered id
65
- // set, and the synthesized `adhoc-<ids>` id it already used for positional
66
- // runs is now the only id it needs.
67
- // Range tokens expand here too (`--stories 101-104`): /mandrel-deliver blesses the
68
- // dash range at the operator surface, so the id set the epilogue is keyed on
69
- // must read the same shape. Rejecting a bad token is deliberate — the old
70
- // silent filter turned a typo into an empty, wrongly-keyed rollup.
59
+ // Ranges expand as at the operator surface; a bad token throws rather than
60
+ // silently producing an empty, wrongly-keyed rollup.
71
61
  const { ids: stories, error: storiesError } = expandIdList(values.stories, {
72
62
  flag: '--stories',
73
63
  prefix: '[plan-run-epilogue] ',
@@ -96,14 +86,9 @@ export async function main(argv = process.argv.slice(2), deps = {}) {
96
86
  }
97
87
 
98
88
  /**
99
- * Surface an unresolvable combined landed diff as a loud operator warning.
100
- * Only reachable under `--audit-roster`: a default run enumerates no roster.
101
- *
102
- * The roster's changed-file set is the input the host walks its audit lenses
103
- * against; a silent absence would read as "nothing changed" and the lens walk
104
- * would look complete while covering nothing. Not fatal — with no diff the
105
- * selector degrades to keyword-only lens selection, so the rest of the
106
- * roster is still useful.
89
+ * Warn (not fatal) when the combined landed diff is unresolvable under
90
+ * `--audit-roster`: silence would read as "nothing changed" and the lens walk
91
+ * would look complete while covering nothing.
107
92
  *
108
93
  * @param {object} result - `runPlanRunEpilogue` envelope.
109
94
  * @param {{ warn: Function }} [logger]
@@ -124,20 +109,9 @@ function warnOnUnresolvedBase(result, logger = Logger) {
124
109
  }
125
110
 
126
111
  /**
127
- * Surface a zero-signal roll-up over a multi-Story run as a loud operator
128
- * warning (Story #4578).
129
- *
130
- * The failure this exists to prevent is a *reassuring* one. The roll-up read
131
- * "No friction signals — nothing to follow up" for a 7-Story run that
132
- * contained a mid-run git outage, a parked worker needing an operator
133
- * resume, and an acceptance critic that needed four rounds. Nothing was
134
- * broken in the roll-up — the stream really was empty — but the report was
135
- * indistinguishable from a clean run, so the retro loop that exists to learn
136
- * from a run was silently blind to that run's pain.
137
- *
138
- * Not fatal: a genuinely friction-free multi-Story run is possible, and this
139
- * cannot tell the two apart — which is precisely why it asks the operator
140
- * rather than asserting either reading.
112
+ * Warn on a zero-signal roll-up over a multi-Story run: it is
113
+ * indistinguishable from a run whose friction went unrecorded, so the
114
+ * operator decides which it was.
141
115
  *
142
116
  * @param {object} result - `runPlanRunEpilogue` envelope.
143
117
  * @param {{ warn: Function }} [logger]
@@ -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
  */
@@ -459,12 +321,8 @@ async function evaluateGreenWatch({
459
321
  const headSha = headShaFn({ prRef, cwd });
460
322
  const { verdict, reason } = classifyGreenVerdict({ digest, headSha });
461
323
  if (verdict === 'fix-at-source' || verdict === 'rerun-permitted') {
462
- // Story #5343 — `rerun-permitted` is the one same-SHA green the rule
463
- // admits: `file-ci-gap.js` recorded a proven `capacity` /
464
- // `unreproducible-tier` verdict for THIS head, so there is no fix at
465
- // source to make. Retiring the digest spends the allowance with it, which
466
- // is what makes it exactly one: a second red writes a fresh digest that
467
- // carries none.
324
+ // `rerun-permitted`: `file-ci-gap.js` proved a capacity/unreproducible
325
+ // verdict for THIS head. Retiring the digest spends the one allowance.
468
326
  retireDigestFn({ storyId, tempRoot, cwd });
469
327
  const reArm = await reArmFn({ cwd, prNumber });
470
328
  const reArmed = Boolean(reArm?.enabled);
@@ -496,11 +354,7 @@ async function evaluateGreenWatch({
496
354
  }
497
355
 
498
356
  /**
499
- * Resolve the knobs, temp root and working directory one watch run needs.
500
- *
501
- * Split out of `runPrWatch` because config resolution must not abort the
502
- * watch: a broken `.agentrc` should degrade to defaults, not turn a CI probe
503
- * into a crash.
357
+ * A broken `.agentrc` degrades to defaults rather than aborting the watch.
504
358
  *
505
359
  * @param {{ config?: object, tempRoot?: string, logger: object, flags: object }} params
506
360
  * @returns {{ knobs: object, effectiveTempRoot: string, cwd: string }}
@@ -508,18 +362,14 @@ async function evaluateGreenWatch({
508
362
  function resolveWatchContext({ config, tempRoot, logger, flags }) {
509
363
  const resolvedConfig =
510
364
  config !== undefined ? config : safeResolveConfig(logger);
511
- const knobs = resolveWatchKnobs({ config: resolvedConfig, flags });
365
+ const knobs = resolveWatchKnobs({ flags });
512
366
  const effectiveTempRoot =
513
367
  tempRoot ?? resolvedConfig?.project?.paths?.tempRoot ?? 'temp';
514
368
  return { knobs, effectiveTempRoot, cwd: process.cwd() };
515
369
  }
516
370
 
517
371
  /**
518
- * Build the argument bag for the underlying watch port.
519
- *
520
- * Each injectable port is spread in only when supplied so the port keeps its
521
- * own default — passing `undefined` explicitly would override a default with
522
- * nothing and break every caller that relies on it.
372
+ * Ports are spread in only when supplied so the watch keeps its own defaults.
523
373
  *
524
374
  * @param {object} params
525
375
  * @returns {object}
@@ -552,13 +402,8 @@ function buildWatchArgs({
552
402
  }
553
403
 
554
404
  /**
555
- * One terminal outcome of the watch: the attach window is spent and no
556
- * required check ever attached, or the pull request could not be read at all.
557
- *
558
- * The two are distinguished structurally — never against `gh`'s stderr prose
559
- * (Story #4890) — because they route oppositely: CI that has not started is
560
- * slow (exit 2, keep watching), while an unreadable PR is a `gh` / access
561
- * fault (exit 1).
405
+ * No required check attached (slow, exit 2) vs. unreadable PR (`gh` fault,
406
+ * exit 1).
562
407
  *
563
408
  * @param {object} params
564
409
  * @returns {number} exit code
@@ -599,13 +444,8 @@ function reportUnattachedOrError({
599
444
  }
600
445
 
601
446
  /**
602
- * Settle a watch whose observed required checks all came back green.
603
- *
604
- * Never green on an undercount (Story #4873): the observed set is whatever
605
- * `gh pr checks --required` returned on the FIRST probe, so a context a
606
- * ruleset attached later can leave every check we knew about green while
607
- * GitHub still refuses the merge. An unreconcilable set reports unresolved
608
- * (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.
609
449
  *
610
450
  * @param {object} params
611
451
  * @returns {Promise<number>} exit code
@@ -660,9 +500,7 @@ async function settleGreenWatch({
660
500
  }
661
501
 
662
502
  /**
663
- * Slow-but-not-red: the poll cap AND the resume budget are exhausted with
664
- * checks still pending and none failed. Never exit 1, never `timed_out` —
665
- * hand off to the host's interval loop and exit 2.
503
+ * Poll cap and resume budget exhausted, none red: hand off, exit 2.
666
504
  *
667
505
  * @param {object} params
668
506
  * @returns {number} exit code
@@ -681,11 +519,8 @@ function reportStillRunning({ result, envelope, logger, print }) {
681
519
  }
682
520
 
683
521
  /**
684
- * The failing checks, excluding every non-failing state **and**
685
- * `still-running`: when the cap fires with a mixed failed+pending map,
686
- * `promotePendingToStillRunning` has rewritten the pending entries, and a
687
- * still-running check is slow, not red — including it here would let it become
688
- * 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.
689
524
  *
690
525
  * @param {Record<string, string>} outcomes
691
526
  * @returns {Array<{ name: string, outcome: string }>}
@@ -703,9 +538,6 @@ function collectFailures(outcomes) {
703
538
  }
704
539
 
705
540
  /**
706
- * Genuine red check — exit 1 immediately, disarm auto-merge, write the digest,
707
- * and surface the fix-loop handoff.
708
- *
709
541
  * @param {object} params
710
542
  * @returns {Promise<number>} exit code
711
543
  */
@@ -762,44 +594,34 @@ async function settleRedWatch({
762
594
  }
763
595
 
764
596
  /**
765
- * Run the watch loop and resolve to the exit code. Exported for tests so
766
- * the green / red / still-running / BEHIND paths can be exercised with
767
- * injected `gh` spawns and no `process.exit`.
768
- *
769
- * 0 → all required checks green (and the no-rerun guard cleared them).
770
- * 1 → a required check genuinely failed (red), OR the green was reached
771
- * by a forbidden re-run of the same commit, OR the pull request itself
772
- * could not be read (a `gh` / access fault).
773
- * 2 → slow-but-not-red: still-running (cap + resume budget exhausted, none
774
- * red), an unreconcilable green, or no required context attached within
775
- * 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).
776
600
  *
777
601
  * @param {object} opts
778
602
  * @param {number} opts.prNumber
779
- * @param {string|null} [opts.repo] `owner/repo`; passed to `gh` as `--repo`.
603
+ * @param {string|null} [opts.repo]
780
604
  * @param {number|string} [opts.maxUpdates]
781
605
  * @param {number|string} [opts.pollIntervalMs]
782
606
  * @param {number|string} [opts.maxPolls]
783
607
  * @param {number|string} [opts.maxResumes]
784
- * @param {number|string} [opts.attachWindowMs] override the required-context
785
- * attach window for one run (flag → `delivery.ci.watch.attachWindowMs` →
786
- * {@link REQUIRED_CONTEXT_ATTACH_WINDOW_MS}).
787
- * @param {object|null} [opts.config] resolved config (defaults to resolveConfig()).
788
- * @param {string} [opts.tempRoot] digest output dir (default `temp`).
789
- * @param {Function} [opts.ghPrChecksFn] inject for tests
790
- * @param {Function} [opts.ghPrViewFn] inject for tests
791
- * @param {Function} [opts.ghPrUpdateBranchFn] inject for tests
792
- * @param {Function} [opts.sleepFn] inject for tests
793
- * @param {Function} [opts.writeDigestFn] inject for tests (default writeCiDigest)
794
- * @param {Function} [opts.readDigestFn] inject for tests (default readCiDigest)
795
- * @param {Function} [opts.retireDigestFn] inject for tests (default retireCiDigest)
796
- * @param {Function} [opts.headShaFn] inject for tests (default resolvePrHeadSha)
797
- * @param {Function} [opts.disarmAutoMergeFn] inject for tests (default disarmAutoMerge)
798
- * @param {Function} [opts.reArmAutoMergeFn] inject for tests (default enableAutoMergeWith)
799
- * @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]
800
622
  * @param {object} [opts.logger]
801
- * @param {(line: string) => void} [opts.print] stdout sink (default process.stdout)
802
- * @returns {Promise<number>} process exit code.
623
+ * @param {(line: string) => void} [opts.print]
624
+ * @returns {Promise<number>}
803
625
  */
804
626
  export async function runPrWatch({
805
627
  prNumber,
@@ -838,22 +660,13 @@ export async function runPrWatch({
838
660
  flags: { pollIntervalMs, maxPolls, maxResumes, maxUpdates, attachWindowMs },
839
661
  });
840
662
 
841
- // `gh` has NO `<owner/repo>#<number>` argument form — it parses that string
842
- // as a BRANCH NAME, which is why every `--repo` invocation used to fail at
843
- // the first probe with a misleading `gh-checks-failed:status=1` (#4890). The
844
- // repository therefore travels two sanctioned ways, never as a composed ref:
845
- // - a real `--repo` flag on the watch ports, which build their own argv;
846
- // - a canonical PR URL for the no-rerun-guard helpers, which take a bare
847
- // ref and no repository of their own.
848
- // 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.
849
665
  const prRef = String(prNumber);
850
666
  const guardPrRef = repo
851
667
  ? `https://github.com/${repo}/pull/${prNumber}`
852
668
  : prRef;
853
669
 
854
- // One merge-state probe, resolved once and used for both readings that need
855
- // the repository's own view of the PR: the empty-required-set classification
856
- // below, and the green-verdict reconciliation further down.
857
670
  const probeMergeState =
858
671
  mergeStateProbeFn ??
859
672
  (ghPrViewFn ? mergeStateProbeFromView(ghPrViewFn) : defaultMergeStateProbe);
@@ -876,14 +689,10 @@ export async function runPrWatch({
876
689
  retryIntervalMs: knobs.pollIntervalMs,
877
690
  sleepFn: sleepFn ?? defaultSleep,
878
691
  nowMsFn,
879
- // Structural, not prose: the PR reads back ⇒ `gh` works and the empty
880
- // required set is CI that has not started yet.
881
692
  probePrResolvable: async () => (await readMergeState()) !== null,
882
693
  logger,
883
694
  });
884
695
 
885
- // Always print the final outcomes map so the operator (and the
886
- // workflow log) can see exactly which check blocked.
887
696
  const envelope = {
888
697
  prNumber,
889
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';