mandrel 2.60.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 (661) 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/pinned-identifier-lint.js +17 -57
  318. package/.agents/scripts/lib/orchestration/plan-context.js +52 -303
  319. package/.agents/scripts/lib/orchestration/plan-critic-conditions.js +22 -79
  320. package/.agents/scripts/lib/orchestration/plan-critics-evaluate.js +5 -31
  321. package/.agents/scripts/lib/orchestration/plan-metrics.js +29 -108
  322. package/.agents/scripts/lib/orchestration/plan-navigation.js +8 -27
  323. package/.agents/scripts/lib/orchestration/plan-persist/acceptance-handle-repair.js +12 -49
  324. package/.agents/scripts/lib/orchestration/plan-persist/audit-provenance.js +18 -73
  325. package/.agents/scripts/lib/orchestration/plan-persist/changes-repair.js +14 -78
  326. package/.agents/scripts/lib/orchestration/plan-persist/cross-plan-links.js +6 -30
  327. package/.agents/scripts/lib/orchestration/plan-persist/epic-adoption.js +14 -65
  328. package/.agents/scripts/lib/orchestration/plan-persist/epic-ops.js +21 -76
  329. package/.agents/scripts/lib/orchestration/plan-persist/external-deps.js +6 -43
  330. package/.agents/scripts/lib/orchestration/plan-persist/persist-helpers.js +14 -68
  331. package/.agents/scripts/lib/orchestration/plan-persist/plan-context-source.js +9 -41
  332. package/.agents/scripts/lib/orchestration/plan-persist/run-plan-persist.js +49 -248
  333. package/.agents/scripts/lib/orchestration/plan-persist/soft-findings.js +2 -12
  334. package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +85 -368
  335. package/.agents/scripts/lib/orchestration/plan-persist/summary.js +8 -38
  336. package/.agents/scripts/lib/orchestration/plan-persist/supersede-ops.js +30 -190
  337. package/.agents/scripts/lib/orchestration/plan-persist/wave-collision-gate.js +9 -49
  338. package/.agents/scripts/lib/orchestration/plan-persist/wave-serialisation.js +7 -28
  339. package/.agents/scripts/lib/orchestration/plan-reachability.js +13 -42
  340. package/.agents/scripts/lib/orchestration/plan-run-labels/reap.js +16 -91
  341. package/.agents/scripts/lib/orchestration/plan-runner/worktree-sweep.js +16 -54
  342. package/.agents/scripts/lib/orchestration/plan-text-hygiene.js +10 -52
  343. package/.agents/scripts/lib/orchestration/planning/authoring-context.js +14 -109
  344. package/.agents/scripts/lib/orchestration/planning/memory-pool-advisory.js +11 -83
  345. package/.agents/scripts/lib/orchestration/pr-watch.js +48 -306
  346. package/.agents/scripts/lib/orchestration/project-meta-cache.js +15 -80
  347. package/.agents/scripts/lib/orchestration/project-meta-resolver.js +10 -51
  348. package/.agents/scripts/lib/orchestration/reassert-status-column.js +12 -76
  349. package/.agents/scripts/lib/orchestration/remote-verifier.js +12 -36
  350. package/.agents/scripts/lib/orchestration/resolve-stories.js +33 -164
  351. package/.agents/scripts/lib/orchestration/retro-proposals.js +66 -361
  352. package/.agents/scripts/lib/orchestration/review-base-ref.js +9 -43
  353. package/.agents/scripts/lib/orchestration/review-depth.js +12 -94
  354. package/.agents/scripts/lib/orchestration/review-providers/codex.js +10 -111
  355. package/.agents/scripts/lib/orchestration/review-providers/degraded-gates.js +13 -71
  356. package/.agents/scripts/lib/orchestration/review-providers/findings-renderer.js +7 -51
  357. package/.agents/scripts/lib/orchestration/review-providers/mi-exemptions.js +8 -53
  358. package/.agents/scripts/lib/orchestration/review-providers/native.js +30 -214
  359. package/.agents/scripts/lib/orchestration/review-providers/parse-findings.js +7 -52
  360. package/.agents/scripts/lib/orchestration/review-providers/review-depth.js +4 -33
  361. package/.agents/scripts/lib/orchestration/review-providers/review-provider-factory.js +11 -71
  362. package/.agents/scripts/lib/orchestration/review-providers/scoped-lint.js +19 -131
  363. package/.agents/scripts/lib/orchestration/review-providers/security-review.js +6 -89
  364. package/.agents/scripts/lib/orchestration/review-providers/types.js +26 -56
  365. package/.agents/scripts/lib/orchestration/review-providers/ultrareview.js +3 -46
  366. package/.agents/scripts/lib/orchestration/run-epilogue.js +40 -199
  367. package/.agents/scripts/lib/orchestration/run-scoped-config.js +13 -81
  368. package/.agents/scripts/lib/orchestration/single-story-close/close-note.js +7 -34
  369. package/.agents/scripts/lib/orchestration/single-story-close/failed-terminal.js +16 -89
  370. package/.agents/scripts/lib/orchestration/single-story-close/gate-log.js +18 -109
  371. package/.agents/scripts/lib/orchestration/single-story-close/phases/auto-merge.js +83 -239
  372. package/.agents/scripts/lib/orchestration/single-story-close/phases/base-sync.js +18 -80
  373. package/.agents/scripts/lib/orchestration/single-story-close/phases/close-validation.js +103 -97
  374. package/.agents/scripts/lib/orchestration/single-story-close/phases/code-review.js +8 -64
  375. package/.agents/scripts/lib/orchestration/single-story-close/phases/confirm-merge.js +136 -486
  376. package/.agents/scripts/lib/orchestration/single-story-close/phases/conventional-subject.js +30 -134
  377. package/.agents/scripts/lib/orchestration/single-story-close/phases/graphql-preflight.js +9 -50
  378. package/.agents/scripts/lib/orchestration/single-story-close/phases/lock-wait-pending.js +49 -0
  379. package/.agents/scripts/lib/orchestration/single-story-close/phases/normalize-pr-title.js +13 -86
  380. package/.agents/scripts/lib/orchestration/single-story-close/phases/options.js +20 -95
  381. package/.agents/scripts/lib/orchestration/single-story-close/phases/post-land.js +46 -203
  382. package/.agents/scripts/lib/orchestration/single-story-close/phases/pre-gate-steps.js +8 -50
  383. package/.agents/scripts/lib/orchestration/single-story-close/phases/pull-request.js +12 -83
  384. package/.agents/scripts/lib/orchestration/single-story-close/phases/push.js +6 -39
  385. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-block.js +1 -6
  386. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-outcome.js +4 -28
  387. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-override.js +6 -51
  388. package/.agents/scripts/lib/orchestration/single-story-close/phases/worktree-reap.js +6 -34
  389. package/.agents/scripts/lib/orchestration/single-story-close/phases/wrong-tree-guard.js +23 -121
  390. package/.agents/scripts/lib/orchestration/single-story-close/runner.js +110 -290
  391. package/.agents/scripts/lib/orchestration/single-story-lease-guard.js +15 -69
  392. package/.agents/scripts/lib/orchestration/story-body-gate.js +4 -23
  393. package/.agents/scripts/lib/orchestration/story-close/baseline-upward-writeback.js +50 -179
  394. package/.agents/scripts/lib/orchestration/story-close/context-budget-writeback.js +11 -41
  395. package/.agents/scripts/lib/orchestration/story-close/format-autofix.js +23 -311
  396. package/.agents/scripts/lib/orchestration/story-close/phases/local-lens-review.js +22 -147
  397. package/.agents/scripts/lib/orchestration/story-close/phases/review-core.js +16 -67
  398. package/.agents/scripts/lib/orchestration/story-deliver-terminal-schema.js +12 -68
  399. package/.agents/scripts/lib/orchestration/story-deliver-terminal.js +42 -201
  400. package/.agents/scripts/lib/orchestration/story-follow-ups.js +43 -245
  401. package/.agents/scripts/lib/orchestration/story-init-envelope.js +4 -23
  402. package/.agents/scripts/lib/orchestration/story-init-remote.js +2 -6
  403. package/.agents/scripts/lib/orchestration/story-reachability.js +3 -23
  404. package/.agents/scripts/lib/orchestration/task-body-validator.js +12 -126
  405. package/.agents/scripts/lib/orchestration/ticket-lease.js +28 -131
  406. package/.agents/scripts/lib/orchestration/ticket-validator-conflicts.js +15 -149
  407. package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +5 -33
  408. package/.agents/scripts/lib/orchestration/ticket-validator.js +39 -181
  409. package/.agents/scripts/lib/orchestration/ticketing/bulk.js +51 -244
  410. package/.agents/scripts/lib/orchestration/ticketing/reads.js +39 -250
  411. package/.agents/scripts/lib/orchestration/ticketing/state.js +14 -68
  412. package/.agents/scripts/lib/orchestration/ticketing/transition.js +46 -263
  413. package/.agents/scripts/lib/orchestration/ticketing.js +2 -26
  414. package/.agents/scripts/lib/orchestration/verify-credit.js +18 -79
  415. package/.agents/scripts/lib/orchestration/worktree-dirty.js +5 -30
  416. package/.agents/scripts/lib/path-security.js +3 -6
  417. package/.agents/scripts/lib/plan-phase-cleanup.js +9 -49
  418. package/.agents/scripts/lib/preflight-runner.js +13 -69
  419. package/.agents/scripts/lib/process-group.js +143 -0
  420. package/.agents/scripts/lib/project-root.js +2 -8
  421. package/.agents/scripts/lib/provider-factory.js +2 -25
  422. package/.agents/scripts/lib/qa/console-allowlist.js +10 -59
  423. package/.agents/scripts/lib/qa/qa-session.js +15 -69
  424. package/.agents/scripts/lib/qa/redact-evidence.js +18 -129
  425. package/.agents/scripts/lib/qa/resolve-qa-contract.js +26 -135
  426. package/.agents/scripts/lib/qa/resolve-selection.js +16 -84
  427. package/.agents/scripts/lib/reserved-test-ids.js +9 -47
  428. package/.agents/scripts/lib/runtime-deps/dep-resolution.js +13 -53
  429. package/.agents/scripts/lib/runtime-deps/ensure-installed.js +10 -44
  430. package/.agents/scripts/lib/runtime-deps/manifest.js +10 -30
  431. package/.agents/scripts/lib/runtime-deps/parser-major.js +15 -51
  432. package/.agents/scripts/lib/runtime-deps/preflight.js +4 -22
  433. package/.agents/scripts/lib/runtime-deps/scan-imports.js +11 -55
  434. package/.agents/scripts/lib/signals/detectors/common.js +12 -38
  435. package/.agents/scripts/lib/signals/index.js +2 -19
  436. package/.agents/scripts/lib/signals/schema.js +14 -109
  437. package/.agents/scripts/lib/signals/write.js +2 -11
  438. package/.agents/scripts/lib/single-story/confirm-merge.js +31 -72
  439. package/.agents/scripts/lib/single-story/story-merged-notify.js +8 -49
  440. package/.agents/scripts/lib/single-story-sweep/protection-ctx.js +4 -26
  441. package/.agents/scripts/lib/single-story-sweep/protection.js +13 -100
  442. package/.agents/scripts/lib/single-story-sweep/sweep-lock.js +60 -258
  443. package/.agents/scripts/lib/single-story-sweep.js +14 -97
  444. package/.agents/scripts/lib/skills/parse-skill.js +13 -59
  445. package/.agents/scripts/lib/skills/skills-index.js +8 -29
  446. package/.agents/scripts/lib/skills/walk-skill-files.js +17 -78
  447. package/.agents/scripts/lib/source-extensions.js +11 -42
  448. package/.agents/scripts/lib/source-text/strip-js-comments.js +8 -41
  449. package/.agents/scripts/lib/stdio-flush.js +9 -36
  450. package/.agents/scripts/lib/story-adjacency.js +8 -40
  451. package/.agents/scripts/lib/story-body/body-format-lints.js +22 -83
  452. package/.agents/scripts/lib/story-body/footer-block.js +11 -44
  453. package/.agents/scripts/lib/story-body/story-body.js +83 -358
  454. package/.agents/scripts/lib/temp-retention.js +42 -143
  455. package/.agents/scripts/lib/templates/decomposer-prompts.js +11 -65
  456. package/.agents/scripts/lib/test-env.js +12 -65
  457. package/.agents/scripts/lib/test-run-credit.js +10 -65
  458. package/.agents/scripts/lib/test-runner-contract.js +19 -74
  459. package/.agents/scripts/lib/test-temp.js +38 -184
  460. package/.agents/scripts/lib/test-tiers.js +12 -96
  461. package/.agents/scripts/lib/ticket-body-sections.js +21 -96
  462. package/.agents/scripts/lib/transpile.js +15 -74
  463. package/.agents/scripts/lib/util/concurrent-map.js +6 -25
  464. package/.agents/scripts/lib/util/parse-id-list.js +8 -34
  465. package/.agents/scripts/lib/util/poll-loop.js +8 -28
  466. package/.agents/scripts/lib/util/with-timeout.js +2 -11
  467. package/.agents/scripts/lib/validation-evidence.js +21 -96
  468. package/.agents/scripts/lib/wave-runner/footprint.js +17 -70
  469. package/.agents/scripts/lib/wave-runner/live-probe.js +53 -221
  470. package/.agents/scripts/lib/wave-runner/ready-set.js +72 -301
  471. package/.agents/scripts/lib/workers/crap-worker.js +11 -64
  472. package/.agents/scripts/lib/workers/maintainability-report-worker.js +8 -45
  473. package/.agents/scripts/lib/workers/maintainability-worker.js +5 -21
  474. package/.agents/scripts/lib/workers/serve-worker-messages.js +2 -18
  475. package/.agents/scripts/lib/workflow-closure.js +22 -105
  476. package/.agents/scripts/lib/workspace-provisioner.js +16 -54
  477. package/.agents/scripts/lib/worktree/git-hooks.js +15 -60
  478. package/.agents/scripts/lib/worktree/lifecycle/force-drain.js +20 -60
  479. package/.agents/scripts/lib/worktree/lifecycle/merge-reachability.js +10 -62
  480. package/.agents/scripts/lib/worktree/lifecycle/pending-cleanup.js +22 -86
  481. package/.agents/scripts/lib/worktree/lifecycle/reap.js +24 -126
  482. package/.agents/scripts/lib/worktree/lifecycle-manager.js +2 -20
  483. package/.agents/scripts/lib/worktree/node-modules-strategy.js +46 -180
  484. package/.agents/scripts/lib/worktree-manager.js +15 -40
  485. package/.agents/scripts/lint-issue-body.js +12 -68
  486. package/.agents/scripts/mandrel-update-preflight.js +10 -70
  487. package/.agents/scripts/merge-baseline.js +30 -104
  488. package/.agents/scripts/nav-registry-diff.js +22 -108
  489. package/.agents/scripts/notify.js +12 -69
  490. package/.agents/scripts/plan-context.js +27 -111
  491. package/.agents/scripts/plan-critics.js +12 -66
  492. package/.agents/scripts/plan-persist.js +31 -148
  493. package/.agents/scripts/plan-run-epilogue.js +11 -37
  494. package/.agents/scripts/pr-watch-with-update.js +76 -267
  495. package/.agents/scripts/providers/github/auth.js +3 -8
  496. package/.agents/scripts/providers/github/blocked-by-add.js +14 -61
  497. package/.agents/scripts/providers/github/board-add.js +5 -21
  498. package/.agents/scripts/providers/github/branch-protection.js +11 -43
  499. package/.agents/scripts/providers/github/cache.js +2 -14
  500. package/.agents/scripts/providers/github/comments.js +7 -40
  501. package/.agents/scripts/providers/github/compose.js +3 -19
  502. package/.agents/scripts/providers/github/errors.js +22 -125
  503. package/.agents/scripts/providers/github/issues.js +31 -123
  504. package/.agents/scripts/providers/github/labels.js +24 -124
  505. package/.agents/scripts/providers/github/mappers.js +5 -27
  506. package/.agents/scripts/providers/github/merge-methods.js +3 -22
  507. package/.agents/scripts/providers/github/project-board.js +2 -17
  508. package/.agents/scripts/providers/github/projects-v2-graphql.js +3 -6
  509. package/.agents/scripts/providers/github/request-helpers.js +5 -32
  510. package/.agents/scripts/providers/github/search-budget.js +9 -39
  511. package/.agents/scripts/providers/github/search-query.js +5 -26
  512. package/.agents/scripts/providers/github/sub-issue-add.js +15 -65
  513. package/.agents/scripts/providers/github/sub-issues.js +7 -36
  514. package/.agents/scripts/providers/github/tickets.js +32 -134
  515. package/.agents/scripts/providers/github.js +18 -59
  516. package/.agents/scripts/prune-plan-run-labels.js +12 -46
  517. package/.agents/scripts/quality-preview.js +35 -220
  518. package/.agents/scripts/resolve-doc-tiers.js +3 -26
  519. package/.agents/scripts/resolve-stories.js +16 -67
  520. package/.agents/scripts/resync-status-column.js +6 -25
  521. package/.agents/scripts/run-tests.js +29 -104
  522. package/.agents/scripts/single-story-close.js +23 -135
  523. package/.agents/scripts/single-story-confirm-merge.js +32 -139
  524. package/.agents/scripts/single-story-init.js +47 -209
  525. package/.agents/scripts/stories-wave-tick.js +102 -472
  526. package/.agents/scripts/sync-agentrc.js +3 -21
  527. package/.agents/scripts/sync-claude-agents.js +9 -55
  528. package/.agents/scripts/sync-claude-commands.js +20 -110
  529. package/.agents/scripts/test-wrapper.js +6 -43
  530. package/.agents/scripts/update-coverage-baseline.js +5 -22
  531. package/.agents/scripts/update-crap-baseline.js +7 -30
  532. package/.agents/scripts/update-duplication-baseline.js +16 -92
  533. package/.agents/scripts/update-maintainability-baseline.js +8 -62
  534. package/.agents/scripts/update-ticket-state.js +1 -7
  535. package/.agents/scripts/validate-skills.js +6 -26
  536. package/.agents/templates/agent-protocol.md +2 -2
  537. package/.agents/templates/docs/audit-sweep-runbook.md +3 -4
  538. package/.agents/workflows/audit-accessibility.md +4 -7
  539. package/.agents/workflows/audit-adrs.md +3 -6
  540. package/.agents/workflows/audit-architecture.md +3 -11
  541. package/.agents/workflows/audit-baselines.md +6 -9
  542. package/.agents/workflows/audit-clean-code.md +8 -12
  543. package/.agents/workflows/audit-data-model.md +3 -7
  544. package/.agents/workflows/audit-dependencies.md +4 -7
  545. package/.agents/workflows/audit-devops.md +4 -8
  546. package/.agents/workflows/audit-documentation.md +1 -4
  547. package/.agents/workflows/audit-mobile.md +4 -7
  548. package/.agents/workflows/audit-navigability.md +3 -6
  549. package/.agents/workflows/audit-performance.md +2 -4
  550. package/.agents/workflows/audit-privacy.md +4 -7
  551. package/.agents/workflows/audit-quality.md +4 -7
  552. package/.agents/workflows/audit-security.md +4 -7
  553. package/.agents/workflows/audit-seo.md +4 -7
  554. package/.agents/workflows/audit-sre.md +4 -7
  555. package/.agents/workflows/audit-to-stories.md +17 -30
  556. package/.agents/workflows/audit-ux-ui.md +4 -7
  557. package/.agents/workflows/helpers/audit-lens-core.md +1 -1
  558. package/.agents/workflows/helpers/code-quality-guardrails.md +12 -15
  559. package/.agents/workflows/helpers/deliver-digest.md +6 -4
  560. package/.agents/workflows/helpers/deliver-reference.md +114 -188
  561. package/.agents/workflows/helpers/deliver-story-reference.md +189 -533
  562. package/.agents/workflows/helpers/plan-reference.md +86 -139
  563. package/.agents/workflows/helpers/qa-core.md +12 -0
  564. package/.agents/workflows/memory-consolidate.md +1 -1
  565. package/.agents/workflows/qa-assist.md +27 -71
  566. package/.agents/workflows/qa-explore.md +19 -59
  567. package/.agents/workflows/qa-run.md +11 -33
  568. package/README.md +1 -1
  569. package/bin/mandrel.js +5 -46
  570. package/bin/postinstall.js +18 -107
  571. package/docs/CHANGELOG.md +25 -0
  572. package/lib/cli/doctor.js +11 -71
  573. package/lib/cli/init.js +26 -165
  574. package/lib/cli/migrate.js +5 -64
  575. package/lib/cli/registry.js +84 -467
  576. package/lib/cli/sync-agents.js +4 -64
  577. package/lib/cli/sync-commands.js +11 -64
  578. package/lib/cli/sync.js +34 -213
  579. package/lib/cli/uninstall.js +40 -219
  580. package/lib/cli/update.js +105 -661
  581. package/lib/cli/version-check.js +8 -72
  582. package/lib/cli/version-helpers.js +14 -87
  583. package/lib/migrations/helpers/retire-agentrc-key.js +11 -52
  584. package/lib/migrations/index.js +15 -92
  585. package/lib/migrations/steps/2.1.0-retire-mi-drop-knobs.js +2 -15
  586. package/lib/migrations/steps/2.1.0-retire-verify-concurrency-cap.js +1 -13
  587. package/lib/migrations/steps/2.11.0-retire-max-seed-words.js +2 -15
  588. package/lib/migrations/steps/2.2.0-retire-epic-ac-tags.js +9 -38
  589. package/lib/migrations/steps/2.20.0-retire-codebase-snapshot.js +1 -13
  590. package/lib/migrations/steps/2.32.0-retire-lint-baseline-command.js +2 -27
  591. package/lib/migrations/steps/2.57.0-retire-delivery-limit-knobs.js +2 -23
  592. package/lib/migrations/steps/2.57.0-retire-planning-limit-knobs.js +2 -27
  593. package/lib/migrations/steps/2.60.0-retire-audit-results-autofile.js +2 -21
  594. package/lib/migrations/steps/strip-removed-agentrc-keys.js +333 -0
  595. package/package.json +16 -14
  596. package/.agents/docs/SDLC.md +0 -590
  597. package/.agents/docs/quality-gates.md +0 -1183
  598. package/.agents/rules/known-tooling-behavior.md +0 -200
  599. package/.agents/rules/orchestration-error-handling.md +0 -61
  600. package/.agents/rules/test-seams.md +0 -59
  601. package/.agents/schemas/baselines/lighthouse.schema.json +0 -59
  602. package/.agents/schemas/baselines/lint.schema.json +0 -47
  603. package/.agents/scripts/check-action-pinning.js +0 -260
  604. package/.agents/scripts/check-audit-attribution.js +0 -302
  605. package/.agents/scripts/check-baseline-drift.js +0 -211
  606. package/.agents/scripts/check-baseline-scope.js +0 -362
  607. package/.agents/scripts/check-generated-validator.js +0 -202
  608. package/.agents/scripts/check-knip-entries.js +0 -159
  609. package/.agents/scripts/check-lifecycle-lint.js +0 -294
  610. package/.agents/scripts/check-pinned-override-notes.js +0 -102
  611. package/.agents/scripts/check-schema-references.js +0 -368
  612. package/.agents/scripts/check-test-portability.js +0 -512
  613. package/.agents/scripts/check-workflow-citations.js +0 -218
  614. package/.agents/scripts/check-workflow-cli-lint.js +0 -299
  615. package/.agents/scripts/check-workflow-timeouts.js +0 -291
  616. package/.agents/scripts/install-matrix-assert.js +0 -326
  617. package/.agents/scripts/lib/audit-advisories.js +0 -195
  618. package/.agents/scripts/lib/audit-attribution.js +0 -134
  619. package/.agents/scripts/lib/baselines/drift-detector.js +0 -351
  620. package/.agents/scripts/lib/baselines/kinds/lighthouse.js +0 -87
  621. package/.agents/scripts/lib/baselines/kinds/lint.js +0 -184
  622. package/.agents/scripts/lib/baselines/orphan-pruner.js +0 -233
  623. package/.agents/scripts/lib/baselines/scope-assert.js +0 -223
  624. package/.agents/scripts/lib/baselines/scope-inventory.js +0 -314
  625. package/.agents/scripts/lib/c8-cli-path.js +0 -21
  626. package/.agents/scripts/lib/config/gates/lighthouse.schema.js +0 -51
  627. package/.agents/scripts/lib/config/gates/lint.schema.js +0 -18
  628. package/.agents/scripts/lib/dynamic-workflow/architecture-report-contract.js +0 -70
  629. package/.agents/scripts/lib/dynamic-workflow/audit-orchestrator.js +0 -284
  630. package/.agents/scripts/lib/dynamic-workflow/clean-code-report-contract.js +0 -80
  631. package/.agents/scripts/lib/dynamic-workflow/degraded-coverage.js +0 -81
  632. package/.agents/scripts/lib/dynamic-workflow/documentation-report-contract.js +0 -87
  633. package/.agents/scripts/lib/dynamic-workflow/performance-report-contract.js +0 -74
  634. package/.agents/scripts/lib/dynamic-workflow/quality-report-contract.js +0 -90
  635. package/.agents/scripts/lib/dynamic-workflow/report-contract-core.js +0 -43
  636. package/.agents/scripts/lib/dynamic-workflow/security-report-contract.js +0 -83
  637. package/.agents/scripts/lib/fs-walk.js +0 -52
  638. package/.agents/scripts/lib/knip-config-resolver.js +0 -181
  639. package/.agents/scripts/lib/knip-entry-sync.js +0 -452
  640. package/.agents/scripts/lib/pinned-override-notes.js +0 -88
  641. package/.agents/scripts/lib/pinned-override-resolve.js +0 -212
  642. package/.agents/scripts/lib/test-isolate/cli-options.js +0 -93
  643. package/.agents/scripts/lib/test-isolate/env-snapshot-loader.js +0 -52
  644. package/.agents/scripts/lib/test-isolate/list-files.js +0 -90
  645. package/.agents/scripts/lib/test-isolate/parse-tap.js +0 -75
  646. package/.agents/scripts/lib/test-isolate/progress-log.js +0 -45
  647. package/.agents/scripts/lib/test-isolate/render-report.js +0 -97
  648. package/.agents/scripts/lib/test-isolate/run-isolate.js +0 -87
  649. package/.agents/scripts/lib/test-isolate/runner.js +0 -483
  650. package/.agents/scripts/lib/test-profile/parse-tap.js +0 -136
  651. package/.agents/scripts/lib/test-profile/render-report.js +0 -45
  652. package/.agents/scripts/lint-label-vocabulary.js +0 -214
  653. package/.agents/scripts/post-structured-comment.js +0 -127
  654. package/.agents/scripts/provision-git-hooks.js +0 -85
  655. package/.agents/scripts/prune-baseline-orphans.js +0 -181
  656. package/.agents/scripts/run-coverage.js +0 -197
  657. package/.agents/scripts/run-lint.js +0 -133
  658. package/.agents/scripts/run-test-profile.js +0 -129
  659. package/.agents/scripts/run-verify.js +0 -125
  660. package/.agents/scripts/test-isolate.js +0 -55
  661. package/.agents/scripts/update-dead-exports-baseline.js +0 -321
@@ -1,14 +1,6 @@
1
1
  /**
2
- * git-probes.js — branch / worktree / PR probe wrappers for git-cleanup
3
- * (Story #2466).
4
- *
5
- * Owns the wrappers the branches-phase planner calls to enumerate local
6
- * + remote branches, walk worktrees, and probe `gh pr list` for merged
7
- * PRs. Fast-forward / cleanup probes live in `git-probes-ff.js`.
8
- *
9
- * Re-exports the FF probes so consumers that previously imported the
10
- * unified surface (`isWorkingTreeClean`, etc) keep working without
11
- * touching their import paths.
2
+ * Branch / worktree / PR probes for the git-cleanup branches planner; also
3
+ * re-exports the fast-forward probes from `git-probes-ff.js`.
12
4
  *
13
5
  * @module lib/orchestration/git-cleanup/phases/git-probes
14
6
  */
@@ -46,26 +38,11 @@ export function listLocalBranches(cwd) {
46
38
  }
47
39
 
48
40
  /**
49
- * Pure: strip the `<remote>/` prefix off a remote-ref listing and drop the
50
- * symbolic `HEAD` entry.
51
- *
52
- * `HEAD` arrives under two spellings. `%(refname:lstrip=3)` renders
53
- * `refs/remotes/origin/HEAD` as the literal `HEAD`, but
54
- * `%(refname:short)` — what both callers ask for — shortens it to the bare
55
- * remote name `origin`, because git keeps the remote segment only when the
56
- * result would otherwise be ambiguous. Missing that second spelling leaked
57
- * a phantom `origin` candidate into the remote-only sweep, which the reap
58
- * phase then reported as `already gone`.
59
- *
60
- * Both spellings are rejected **before** the prefix strip, because the
61
- * strip is what makes them ambiguous: a real branch named `origin` lists
62
- * as `origin/origin` and strips to `origin` too. Discriminating on the raw
63
- * line keeps that branch reapable while still dropping the symbolic ref.
64
- *
65
- * Shared by {@link listRemoteBranches} and {@link listRemoteMergedBranches}
66
- * so both enumerations speak the same short-name vocabulary the planner's
67
- * remote-only walk keys on — a divergence there would make the ancestry
68
- * signal miss every branch by name (Story #5188).
41
+ * Strip the `<remote>/` prefix and drop the symbolic HEAD, which
42
+ * `%(refname:short)` may render as the bare remote name. Both spellings are
43
+ * rejected on the raw line, before the strip, so a real branch named
44
+ * `origin` (`origin/origin`) stays reapable. Shared by both remote listers so
45
+ * their names match.
69
46
  *
70
47
  * @param {string} stdout
71
48
  * @param {string} remoteName
@@ -95,24 +72,14 @@ export function listRemoteBranches(cwd, remoteName = 'origin') {
95
72
  }
96
73
 
97
74
  /**
98
- * The remote-only walk's ancestry source (Story #5188).
99
- *
100
- * {@link listMergedBranches} runs `git branch --merged` with no `-r`, so it
101
- * enumerates **local** heads only and can never contain a remote branch
102
- * name — feeding it the remote-only walk classified every orphaned remote
103
- * ref as unmerged no matter how thoroughly it had landed. This is the `-r`
104
- * twin: `git branch -r --merged <base>`, with the `<remote>/` prefix
105
- * stripped so its names match the short names {@link listRemoteBranches}
106
- * enumerates.
107
- *
108
- * Answered entirely from the local object database against the
109
- * already-fetched remote-tracking refs — the sweep stays offline and adds
110
- * no per-branch network call.
75
+ * The remote-only walk's ancestry source: the `-r` twin of
76
+ * {@link listMergedBranches} (which sees local heads only). Offline — reads
77
+ * the already-fetched remote-tracking refs.
111
78
  *
112
79
  * @param {string} cwd
113
- * @param {string} base Rev the ancestry is taken against (`main`, `origin/main`).
80
+ * @param {string} base
114
81
  * @param {string} [remoteName]
115
- * @returns {string[]} Short branch names, remote prefix stripped.
82
+ * @returns {string[]}
116
83
  */
117
84
  /* node:coverage ignore next */
118
85
  export function listRemoteMergedBranches(cwd, base, remoteName = 'origin') {
@@ -145,16 +112,9 @@ export function listMergedBranches(cwd, base) {
145
112
  }
146
113
 
147
114
  /**
148
- * Story #4395's fresh ancestry anchor, factored out here so the local and
149
- * remote-only walks cannot drift apart on it (Story #5188): the merged
150
- * listing taken against the local base is unioned with the one taken
151
- * against `<remote>/<base>` whenever that ref exists, so a stale local
152
- * base cannot hide a branch already merged on the remote.
153
- *
154
- * `lister` picks the namespace — {@link listMergedBranches} (local heads)
155
- * for the local walk, {@link listRemoteMergedBranches} (remote-tracking
156
- * refs) for the remote-only one. `remoteName` is forwarded as the listers'
157
- * third argument, which the local lister ignores.
115
+ * Union the merged listing against the local base with the one against
116
+ * `<remote>/<base>` (when it exists), so a stale local base cannot hide a
117
+ * branch already merged on the remote. Shared by both walks.
158
118
  *
159
119
  * @param {{ lister: Function, cwd: string, baseBranch: string, remoteBaseRef: string, refExistsFn: Function, remoteName?: string }} args
160
120
  * @returns {Set<string>}
@@ -205,25 +165,14 @@ export function worktreesByBranch(cwd) {
205
165
  }
206
166
 
207
167
  /* node:coverage ignore next */
208
- // Story #2990: this `gh` probe stays on synchronous `execFileSync` (not
209
- // the `lib/gh-exec.js` async facade) because `planCleanup` is a
210
- // synchronous planner and `prProbe` is invoked inside a sync `for`
211
- // loop. Converting the planner to async would ripple into every
212
- // `git-cleanup` caller and is out of scope for the callers-only
213
- // provider migration.
168
+ // Synchronous on purpose: `planCleanup` is a sync planner.
214
169
  export function defaultGhRunner(args, { cwd }) {
215
170
  return execFileSync('gh', args, { cwd, encoding: 'utf8' });
216
171
  }
217
172
 
218
173
  /**
219
- * Check whether a branch has a merged PR via `gh`.
220
- *
221
- * Legacy probe: queries `--state merged` and returns the first merged row's
222
- * `{ number, mergedAt }`. Kept exported so older call sites and tests that
223
- * predate the latest-PR-state model continue to work — the planner now
224
- * defaults to {@link probeLatestPr} for the bug-A correctness fix, but a
225
- * caller can still inject this as `prProbe` to opt into the historical
226
- * "any merge on this head" semantics.
174
+ * "Any merged PR on this head" — injectable as `prProbe`; the planner
175
+ * defaults to {@link probeLatestPr}.
227
176
  */
228
177
  export function probeMergedPr(branch, cwd, runGh = defaultGhRunner) {
229
178
  const out = runGh(
@@ -258,20 +207,9 @@ export function probeMergedPr(branch, cwd, runGh = defaultGhRunner) {
258
207
  }
259
208
 
260
209
  /**
261
- * Probe the most-recent PR on a branch head ref, regardless of state.
262
- *
263
- * Replaces {@link probeMergedPr} as the planner's default merge signal so
264
- * branches with reused names (release-please, dependabot, renovate, manual
265
- * reuse) cannot be silently reaped on a stale historical merge. The right
266
- * question is "is the *latest* PR on this head ref a merge?" — not "did
267
- * *any* PR ever merge on this head ref?". Returning the full state lets
268
- * the planner skip OPEN and CLOSED-not-merged refs with operator-visible
269
- * reasons.
270
- *
271
- * `headRefOid` is included so the planner can cross-check the current
272
- * branch tip against the commit the PR actually merged (or pointed at);
273
- * post-merge force-pushes flip the tip out from under a historical merge
274
- * signal and would otherwise still reap.
210
+ * The latest PR on a head ref, any state — so a reused branch name is never
211
+ * reaped on a stale historical merge. `headRefOid` lets the planner catch a
212
+ * post-merge force-push.
275
213
  *
276
214
  * @param {string} branch
277
215
  * @param {string} cwd
@@ -316,44 +254,17 @@ export function probeLatestPr(branch, cwd, runGh = defaultGhRunner) {
316
254
  }
317
255
 
318
256
  /**
319
- * Bulk-probe every open/closed/merged PR in one `gh` spawn, indexed by
320
- * head ref name.
321
- *
322
- * Replaces the N per-branch {@link probeLatestPr} spawns the planner used
323
- * to fire inside its branch loops (Story #3333, f-performance). A single
324
- * `gh pr list --state all` page is parsed into a `Map<headRefName,
325
- * prInfo>` whose values carry the **same** shape {@link probeLatestPr}
326
- * returns, so `classifyLatestPr` reads them without translation.
327
- *
328
- * When a head ref appears more than once on the page (multiple PRs share a
329
- * head — reused branch names), the **first** row wins. `gh pr list`
330
- * returns rows newest-first, so the first row is the latest PR on that
331
- * head — exactly the "latest PR" signal {@link probeLatestPr} resolves
332
- * per-branch. The planner keeps {@link probeLatestPr} as a per-branch
333
- * fallback for head refs absent from this page (a branch whose PR fell
334
- * outside the `--limit` window).
335
- *
336
- * Returns an empty index on any failure (non-array, empty, or malformed
337
- * JSON) so the caller transparently falls back to per-branch probing.
257
+ * Every PR in one `gh` spawn, indexed by head ref in {@link probeLatestPr}'s
258
+ * shape. Rows are newest-first, so the first row per head wins.
338
259
  *
339
- * ## `complete` — when absence from the page is proof (Story #5283)
340
- *
341
- * The returned `complete` flag says whether the page enumerated **every**
342
- * PR in the repository: true when `gh` returned fewer rows than the
343
- * `--limit` it was given, which is the only way to know the window did
344
- * not truncate. On a complete page a head ref's absence is not "the PR
345
- * fell outside the window" — it is proof that no PR covers that ref at
346
- * all, so the caller's per-branch fallback can only re-derive the same
347
- * `null` at the cost of one `gh` spawn per PR-less branch.
348
- *
349
- * Every failure mode reports `complete: false`, because an unusable page
350
- * proves nothing: empty stdout (a degraded `gh`), unparseable JSON, and a
351
- * non-array payload must all leave the fallback armed. A *parsed* empty
352
- * array is genuinely complete — a repository with no PRs at all.
260
+ * `complete` is true only when fewer rows than `limit` came back: then a
261
+ * head's absence proves it has no PR and the per-branch fallback can be
262
+ * skipped. Every failure reports `complete: false` so the fallback stays
263
+ * armed; a parsed empty array is genuinely complete.
353
264
  *
354
265
  * @param {string} cwd
355
266
  * @param {(args: string[], opts: { cwd: string }) => string} runGh
356
- * @param {number} limit Max rows to fetch in the single page (default 1000).
267
+ * @param {number} limit
357
268
  * @returns {{ index: Map<string, { number: number, state: string, mergedAt: string|null, closedAt: string|null, headRefOid: string|null }>, complete: boolean }}
358
269
  */
359
270
  export function probeAllPrs(cwd, runGh = defaultGhRunner, limit = 1000) {
@@ -401,10 +312,6 @@ export function probeAllPrs(cwd, runGh = defaultGhRunner, limit = 1000) {
401
312
  const SHA_RE = /^[0-9a-f]{7,40}$/i;
402
313
 
403
314
  /**
404
- * Normalise a raw git SHA string: trim it and return it only when it
405
- * matches the 7–40 hex-char shape, else `null`. Shared by both the local
406
- * and remote-only resolution paths so the validation lives in one place.
407
- *
408
315
  * @param {string} raw
409
316
  * @returns {string | null}
410
317
  */
@@ -414,10 +321,6 @@ function validSha(raw) {
414
321
  }
415
322
 
416
323
  /**
417
- * Extract the leading SHA token from `git ls-remote` stdout. Returns the
418
- * first non-empty line's first whitespace-delimited field, or `''` when
419
- * stdout carries no usable line.
420
- *
421
324
  * @param {string} stdout
422
325
  * @returns {string}
423
326
  */
@@ -430,14 +333,8 @@ function firstLsRemoteSha(stdout) {
430
333
  }
431
334
 
432
335
  /**
433
- * Resolve the current tip SHA of a branch.
434
- *
435
- * For branches that exist locally (`localExists: true`), reads
436
- * `refs/heads/<branch>` via `git rev-parse`. For remote-only branches,
437
- * reads the SHA from `git ls-remote --heads <remote> <branch>`. Returns
438
- * `null` when the ref cannot be resolved — callers treat that as "no
439
- * tip cross-check available" and skip the divergence guard rather than
440
- * failing the candidate.
336
+ * Local ref via rev-parse, remote-only via ls-remote. `null` means "no tip
337
+ * cross-check available", not a failure.
441
338
  *
442
339
  * @param {{ cwd: string, branch: string, remoteName?: string, localExists?: boolean }} args
443
340
  * @returns {string | null}
@@ -457,28 +354,18 @@ export function branchTipSha({
457
354
  }
458
355
 
459
356
  /* node:coverage ignore next */
460
- // Story #4395: ancestry-anchor freshness check. `planCleanup` calls this
461
- // before unioning `git branch --merged origin/<base>` into the ancestry
462
- // signal so a stale local `<base>` (fast-forward phase skipped or
463
- // `--branches` run alone) doesn't hide a branch that's already merged on
464
- // the remote.
357
+ // Guards the `<remote>/<base>` ancestry union.
465
358
  export function refExists(cwd, ref) {
466
359
  const res = gitSpawn(cwd, 'rev-parse', '--verify', '--quiet', ref);
467
360
  return res.status === 0;
468
361
  }
469
362
 
470
363
  /**
471
- * Story #4395: last-commit timestamp for the dry-run `not-merged`
472
- * skip-visibility line (branch name + last-commit age).
473
- *
474
- * Story #5188 adds the remote-only arm. Remote branches are enumerated
475
- * with the `<remote>/` prefix stripped, so the short name resolves to no
476
- * `refs/heads/` ref at all: passing `localExists: false` reads
477
- * `refs/remotes/<remote>/<branch>` instead, so an orphaned remote ref's
478
- * skip line carries a real age rather than a silent `unknown`.
364
+ * Last-commit time for the `not-merged` skip line; `localExists: false`
365
+ * reads `refs/remotes/<remote>/<branch>`.
479
366
  *
480
367
  * @param {string} cwd
481
- * @param {string} branch Short branch name, remote prefix stripped.
368
+ * @param {string} branch
482
369
  * @param {{ localExists?: boolean, remoteName?: string }} [opts]
483
370
  * @returns {string | null}
484
371
  */
@@ -494,9 +381,6 @@ export function branchLastCommitAt(cwd, branch, opts = {}) {
494
381
  }
495
382
 
496
383
  /**
497
- * First non-empty trimmed stdout line — the resulting tree OID on a clean
498
- * `git merge-tree --write-tree` run.
499
- *
500
384
  * @param {string} stdout
501
385
  * @returns {string}
502
386
  */
@@ -509,20 +393,10 @@ function firstStdoutLine(stdout) {
509
393
  }
510
394
 
511
395
  /**
512
- * Probe content-equivalence between `base` and `branch` via
513
- * `git merge-tree --write-tree <base> <branch>` (git >= 2.38, Story #4395).
514
- *
515
- * A clean merge (exit 0) whose resulting tree OID equals `<base>`'s own
516
- * tree OID means applying `branch`'s changes on top of `base` is a no-op —
517
- * `branch`'s content already lives in `base` by another route (a
518
- * squash-merged Epic PR, a cherry-pick, a manual `merge --squash`) that
519
- * neither the PR probe nor the ancestry check can see.
520
- *
521
- * Both the "unsupported" case (git < 2.38 rejects `--write-tree`) and the
522
- * "real conflict" case (branch and base diverge and cannot auto-merge)
523
- * surface as a non-zero exit. This probe treats them identically — the
524
- * signal is inconclusive, so the caller keeps the branch's current
525
- * `not-merged` classification rather than guessing.
396
+ * `branch` is content-equivalent when `git merge-tree --write-tree` (git
397
+ * >= 2.38) merges it cleanly into `base`'s own tree — its content landed by
398
+ * another route (squash, cherry-pick). A non-zero exit (old git or a real
399
+ * conflict) is inconclusive and reported as unsupported.
526
400
  *
527
401
  * @param {{ cwd: string, base: string, branch: string, spawn?: typeof gitSpawn }} args
528
402
  * @returns {{ supported: false } | { supported: true, equivalent: boolean }}
@@ -558,32 +432,9 @@ export const __testing = {
558
432
  };
559
433
 
560
434
  /**
561
- * Pure-ish: classify a latest-PR probe row into a planner verdict.
562
- *
563
- * Centralizes the state-machine that decides whether a branch with a PR
564
- * row is reapable. Pulled out of {@link planCleanup} so the local and
565
- * remote-only branch walks share one source of truth.
566
- *
567
- * Inputs:
568
- * - `prInfo`: the row from `prProbe` — may be the new latest-PR shape
569
- * ({@link probeLatestPr}) carrying `state` + `headRefOid`, or the
570
- * legacy shape ({@link probeMergedPr}) carrying only `number` +
571
- * `mergedAt`. The absence of `state` is treated as MERGED so legacy
572
- * callers and historical tests keep working.
573
- * - `branch`, `localExists`, `remoteName`, `cwd`, `branchTipShaFn`: used
574
- * to resolve the branch's current tip for the divergence cross-check.
575
- *
576
- * Returns either:
577
- * - `{ kind: 'candidate', prInfo }` — caller appends a candidate.
578
- * - `{ kind: 'skip', reason: <new-reason>, prNumber? }` — caller pushes
579
- * into `skipped[]` and continues.
580
- * - `{ kind: 'no-pr' }` — caller continues without skipping.
581
- *
582
- * A MERGED PR whose `headRefOid` differs from the branch tip is handed
583
- * to {@link resolveMergedTip}, which resolves it by ancestry — see that
584
- * module for the `tip-behind-merge` / `tip-diverged-from-merge` /
585
- * `unverifiable` taxonomy and why a bare SHA inequality could not
586
- * express it.
435
+ * Classify a PR probe row into a planner verdict, shared by the local and
436
+ * remote-only walks. A row without `state` ({@link probeMergedPr}'s shape)
437
+ * counts as MERGED; a MERGED row's tip check is {@link resolveMergedTip}'s.
587
438
  *
588
439
  * @param {{
589
440
  * prInfo: { number?: number, state?: string, mergedAt?: string|null, headRefOid?: string|null } | null,
@@ -1,11 +1,5 @@
1
1
  /**
2
- * merged-tip.js — resolve a MERGED PR's head against the branch tip
3
- * (Story #5086).
4
- *
5
- * Owns the ancestry probe and the taxonomy the branches-phase classifier
6
- * applies when a merged PR's `headRefOid` and the branch tip disagree.
7
- * Split out of `git-probes.js` so the classifier reads as one call and
8
- * the taxonomy's own documentation sits next to the code it governs.
2
+ * Resolve a MERGED PR's head against the branch tip by ancestry.
9
3
  *
10
4
  * @module lib/orchestration/git-cleanup/phases/merged-tip
11
5
  */
@@ -13,23 +7,9 @@
13
7
  import { gitSpawn } from '../../../git-utils.js';
14
8
 
15
9
  /**
16
- * Tri-state ancestry probe: is `ancestorSha` reachable from
17
- * `descendantSha`?
18
- *
19
- * Mirrors the contract `checkHeadAncestor` in
20
- * `lib/worktree/lifecycle/merge-reachability.js` proved out for the
21
- * worktree-reap gate — the two cannot share an implementation because
22
- * that one takes a `ctx.git.gitSpawn` / `ctx.repoRoot` bag while
23
- * git-cleanup's probes take a bare `cwd`.
24
- *
25
- * `git merge-base --is-ancestor` exits **0** (ancestor), **1** (not an
26
- * ancestor) or **128** (a rev it cannot resolve). Folding 128 into
27
- * "not an ancestor" is the bug this probe exists to prevent: a merged
28
- * head absent from the local object DB would silently read as a
29
- * divergence and re-emit the wrong post-merge-force-push diagnosis. Both
30
- * revs are therefore resolved with `git rev-parse -q --verify` first, and
31
- * any failure fails closed to the `error` arm — so `merge-base` never
32
- * runs against a rev git cannot resolve.
10
+ * Tri-state: is `ancestorSha` reachable from `descendantSha`? Both revs are
11
+ * verified first so an unresolvable rev (merge-base exit 128) fails closed to
12
+ * `error` rather than reading as a divergence.
33
13
  *
34
14
  * @param {{ cwd: string, ancestorSha: string, descendantSha: string, spawn?: typeof gitSpawn }} args
35
15
  * @returns {{ outcome: 'ancestor' } | { outcome: 'not-ancestor' } | { outcome: 'error', reason: string }}
@@ -68,27 +48,11 @@ export function probeAncestry({
68
48
  }
69
49
 
70
50
  /**
71
- * Resolve a MERGED PR's `headRefOid` against the branch's current tip.
72
- *
73
- * Returns `null` when there is nothing to resolve — the PR row carries no
74
- * `headRefOid`, the tip cannot be read, or the tip already matches the
75
- * merged head — leaving the caller's plain-candidate path untouched.
76
- *
77
- * Otherwise the tip is classified by **ancestry**, never by the bare SHA
78
- * inequality this replaced. That inequality could not tell a branch that
79
- * is *behind* the merged head from one force-pushed *past* it, and
80
- * reported both as the latter — advising the operator to push a follow-up
81
- * commit that, for a stale pre-merge snapshot, does not exist. The three
82
- * arms:
83
- *
84
- * - **ancestor** — 0 commits ahead, every commit landed with the PR:
85
- * a reap candidate tagged `reason: 'tip-behind-merge'`.
86
- * - **not-ancestor** — equivalently "≥1 commit ahead", which is why one
87
- * probe settles the whole taxonomy and no `rev-list` count is needed:
88
- * the unchanged `tip-diverged-from-merge` force-push skip.
89
- * - **error** — a rev the local object DB cannot resolve:
90
- * `reason: 'unverifiable'` carrying the probe's `detail`. Never a
91
- * silent pass, and never a force-push label.
51
+ * `null` when nothing to resolve (no head, unreadable tip, or tips match).
52
+ * Otherwise by ancestry, since SHA inequality cannot tell "behind" from
53
+ * "force-pushed past": ancestor → `tip-behind-merge` candidate;
54
+ * not-ancestor (≥1 commit ahead) → `tip-diverged-from-merge` skip;
55
+ * error → `unverifiable` skip.
92
56
  *
93
57
  * @param {object} args
94
58
  * @returns {{ kind: 'candidate', prInfo: object, reason: string, tipSha: string, mergedSha: string } | { kind: 'skip', reason: string, prNumber: number|null, tipSha: string, mergedSha: string, detail?: string } | null}
@@ -1,8 +1,5 @@
1
1
  /**
2
- * parse-args.js — argv parser for the git-cleanup CLI (Story #2466).
3
- *
4
- * Extracted verbatim from `git-cleanup.js` so `parseCleanupArgs(argv)`
5
- * keeps its named-export contract for the existing unit-test surface.
2
+ * Argv parser for the git-cleanup CLI.
6
3
  *
7
4
  * @module lib/orchestration/git-cleanup/phases/parse-args
8
5
  */
@@ -1,20 +1,7 @@
1
1
  /**
2
- * phase-drivers.js — per-phase orchestrators for git-cleanup (Story #2466).
3
- *
4
- * Each export drives one of the four cleanup phases (fast-forward-main,
5
- * prune-remotes, branches, stashes) — wraps the corresponding
6
- * `plan`/`execute` pair, applies the `--dry-run` / `--yes` semantics,
7
- * and emits the operator-facing log lines.
8
- *
9
- * ## Decide / Execute split (Story #2994)
10
- *
11
- * `runBranchPhase`, `runFastForwardPhase`, and `runStashPhase` each
12
- * delegate to a pure `decideXPhase(state)` that returns a plain action
13
- * record `{ kind, args }`, and an impure `executeXPhase(action, ctx)`
14
- * that performs I/O. The `runXPhase` sequencer composes the two,
15
- * inserting the interactive prompt between them when the action's
16
- * `kind` is `'prompt-then-execute'`. The split keeps the branching
17
- * logic unit-testable without spinning up git or stdin.
2
+ * Per-phase drivers for git-cleanup. Each `runXPhase` composes a pure
3
+ * `decideXPhase` (returns an action record) with an impure `executeXPhase`,
4
+ * prompting in between for `prompt-then-execute`.
18
5
  *
19
6
  * @module lib/orchestration/git-cleanup/phases/phase-drivers
20
7
  */
@@ -68,19 +55,11 @@ function emitExecutionHuman(result) {
68
55
  // =====================================================================
69
56
 
70
57
  /**
71
- * Pure: decide what the fast-forward phase should do given the plan.
72
- *
73
- * Returns an action record:
74
- * - `{ kind: 'skip', result }` — base branch can't FF
75
- * - `{ kind: 'dry-run', result }` — dry-run mode
76
- * - `{ kind: 'prompt-then-execute', promptMessage, declinedResult, executeArgs }`
77
- * - `{ kind: 'execute', executeArgs }` — --yes mode, run immediately
78
- *
79
58
  * @param {object} state
80
- * @param {object} state.plan Output of `planFastForward`.
81
- * @param {object} state.opts CLI options (`dryRun`, `yes`).
82
- * @param {string} state.baseBranch Base branch name.
83
- * @param {string} state.cwd Working directory (for execute args).
59
+ * @param {object} state.plan
60
+ * @param {object} state.opts
61
+ * @param {string} state.baseBranch
62
+ * @param {string} state.cwd
84
63
  */
85
64
  export function decideFastForwardPhase(state) {
86
65
  const { plan, opts, baseBranch, cwd } = state;
@@ -128,10 +107,6 @@ export function decideFastForwardPhase(state) {
128
107
  return { kind: 'execute', executeArgs };
129
108
  }
130
109
 
131
- /**
132
- * Impure: perform the fast-forward action returned by
133
- * `decideFastForwardPhase`. Returns the phase result.
134
- */
135
110
  export async function executeFastForwardPhase(action) {
136
111
  if (action.kind === 'skip' || action.kind === 'dry-run') {
137
112
  if (action.logMessage) Logger.info(action.logMessage);
@@ -160,7 +135,7 @@ export async function runFastForwardPhase(opts, cwd, baseBranch) {
160
135
  }
161
136
 
162
137
  // =====================================================================
163
- // Prune phase (unchanged — low CRAP, kept for parity)
138
+ // Prune phase
164
139
  // =====================================================================
165
140
 
166
141
  /* node:coverage ignore next */
@@ -192,14 +167,8 @@ export async function runPrunePhase(opts, cwd) {
192
167
  // =====================================================================
193
168
 
194
169
  /**
195
- * Count of a plan's *actionable* candidates — the ones `executeCleanup`
196
- * will actually delete given the current `--remote` setting. Story #4395
197
- * always enumerates remote-only candidates in `plan.candidates` (so the
198
- * operator sees them in the dry-run list), but their deletion still
199
- * requires `--remote`; without it, `executeCleanup` no-ops on every
200
- * `localExists: false` candidate. Counting only the actionable subset
201
- * keeps the "no-candidates" short-circuit and the confirmation prompt's
202
- * "Reap N" count honest about what will actually happen.
170
+ * Remote-only candidates are listed but only deleted under `--remote`, so
171
+ * count just what will actually be reaped.
203
172
  */
204
173
  function countActionableCandidates(candidates, remote) {
205
174
  return remote
@@ -208,19 +177,10 @@ function countActionableCandidates(candidates, remote) {
208
177
  }
209
178
 
210
179
  /**
211
- * Pure: decide what the branch-reap phase should do given the plan.
212
- *
213
- * Returns an action record:
214
- * - `{ kind: 'no-candidates', result }` — empty plan, nothing to reap
215
- * - `{ kind: 'dry-run', result }` — dry-run mode (plan only)
216
- * - `{ kind: 'prompt-then-execute', promptMessage, declinedResult, executeArgs, plan }`
217
- * - `{ kind: 'execute', executeArgs, plan }` — --yes mode
218
- *
219
180
  * @param {object} state
220
- * @param {object} state.plan Output of `planCleanup`.
221
- * @param {object} state.opts CLI options (`dryRun`, `yes`, `remote`,
222
- * `includeContentMerged`).
223
- * @param {string} state.cwd Working directory.
181
+ * @param {object} state.plan
182
+ * @param {object} state.opts
183
+ * @param {string} state.cwd
224
184
  */
225
185
  export function decideBranchPhase(state) {
226
186
  const { plan, opts, cwd } = state;
@@ -255,9 +215,8 @@ export function decideBranchPhase(state) {
255
215
  executeArgs,
256
216
  };
257
217
  }
258
- // Story #5283: the unattended arm. Nobody saw the weak-signal note
259
- // above, so a `content-merged` candidate's remote ref is withheld
260
- // unless the operator opted in with `--include-content-merged`.
218
+ // Unattended: nobody saw the weak-signal note, so content-merged remote
219
+ // refs are withheld unless `--include-content-merged`.
261
220
  return {
262
221
  kind: 'execute',
263
222
  plan,
@@ -268,10 +227,6 @@ export function decideBranchPhase(state) {
268
227
  };
269
228
  }
270
229
 
271
- /**
272
- * Impure: perform the branch-reap action returned by `decideBranchPhase`.
273
- * Returns the phase result `{ plan, result, declined? }`.
274
- */
275
230
  export async function executeBranchPhase(action) {
276
231
  if (action.kind === 'dry-run' || action.kind === 'no-candidates') {
277
232
  return action.result;
@@ -293,10 +248,7 @@ export async function runBranchPhase(opts, cwd, baseBranch) {
293
248
  include: opts.include,
294
249
  exclude: opts.exclude,
295
250
  });
296
- // Story #4395: always enumerate remote-only merged branches so the
297
- // dry-run / prompt shows them without requiring `--remote`. Deletion of
298
- // a remote-only candidate still requires `--remote` — `executeCleanup`
299
- // no-ops on `localExists: false` candidates otherwise (unchanged).
251
+ // Always list remote-only candidates; deleting them still needs `--remote`.
300
252
  const plan = planCleanup({
301
253
  cwd,
302
254
  baseBranch,
@@ -320,19 +272,10 @@ export async function runBranchPhase(opts, cwd, baseBranch) {
320
272
  // =====================================================================
321
273
 
322
274
  /**
323
- * Pure: decide what the stash-triage phase should do given the plan.
324
- *
325
- * Returns an action record:
326
- * - `{ kind: 'no-stashes', result }` — nothing to triage
327
- * - `{ kind: 'dry-run', result, stashes }` — dry-run mode
328
- * - `{ kind: 'execute-allowlist', executeArgs }` — --yes / --json mode
329
- * - `{ kind: 'execute-interactive', executeArgs }` — interactive prompt
330
- *
331
275
  * @param {object} state
332
- * @param {Array} state.stashes Output of `planStashes().stashes`.
333
- * @param {object} state.opts CLI options (`dryRun`, `yes`, `json`,
334
- * `dropStashes`).
335
- * @param {string} state.cwd Working directory.
276
+ * @param {Array} state.stashes
277
+ * @param {object} state.opts
278
+ * @param {string} state.cwd
336
279
  */
337
280
  export function decideStashPhase(state) {
338
281
  const { stashes, opts, cwd } = state;
@@ -365,10 +308,6 @@ export function decideStashPhase(state) {
365
308
  };
366
309
  }
367
310
 
368
- /**
369
- * Impure: perform the stash-triage action returned by `decideStashPhase`.
370
- * Returns the phase result.
371
- */
372
311
  export async function executeStashPhase(action) {
373
312
  if (action.kind === 'no-stashes' || action.kind === 'dry-run') {
374
313
  return action.result;
@@ -387,11 +326,6 @@ export async function executeStashPhase(action) {
387
326
  );
388
327
  }
389
328
 
390
- // Story #4922 — the `node:coverage ignore next` directive that used to sit
391
- // here is gone. It was never justified: `runStashPhase` is drivable end to
392
- // end (planStashes degrades to an empty list outside a repo, and the
393
- // decide/execute pair below is pure given an allowlist), so the directive
394
- // only hid a sequencer nothing exercised.
395
329
  export async function runStashPhase(opts, cwd) {
396
330
  Logger.info(`${TAG} ── phase: stashes ──`);
397
331
  const { stashes } = planStashes({ cwd });
@@ -1,17 +1,6 @@
1
1
  /**
2
- * prompts.js — readline-based interactive prompts for git-cleanup
3
- * (Story #2466).
4
- *
5
- * Split out of `cli.js` so each phase file stays under Story #2466's
6
- * 200-LOC ceiling. Exports two helpers used by the per-phase drivers:
7
- *
8
- * - `promptYesNo(question)` — read a single y/N line and resolve true
9
- * on `y` / `yes` (case-insensitive), false otherwise.
10
- * - `promptStashDecision(entry)` — per-stash drop/keep/quit prompt
11
- * used as the `decideFn` argument to `executeStashes`.
12
- *
13
- * Both helpers open a fresh readline interface and close it inside a
14
- * `try`/`finally` so the process can still exit cleanly.
2
+ * Readline prompts for git-cleanup. Each opens a fresh interface and closes
3
+ * it in `finally` so the process can exit cleanly.
15
4
  *
16
5
  * @module lib/orchestration/git-cleanup/phases/prompts
17
6
  */
@@ -21,10 +10,7 @@ import readline from 'node:readline';
21
10
  const TAG = '[git-cleanup]';
22
11
 
23
12
  /**
24
- * Map a raw stash-prompt answer to a decision verdict. Pure: trims and
25
- * lowercases the input, then classifies it as `drop` / `quit` / `keep`.
26
- * `drop` covers `d`/`drop`/`y`/`yes`; `quit` covers `q`/`quit`; anything
27
- * else (including empty) defaults to the safe `keep`.
13
+ * Anything unrecognised, including empty, defaults to the safe `keep`.
28
14
  *
29
15
  * @param {string} answer
30
16
  * @returns {'drop' | 'keep' | 'quit'}
@@ -1,9 +1,5 @@
1
1
  /**
2
- * prune.js — prune-remotes phase of git-cleanup (Story #2466).
3
- *
4
- * Owns `executePrune(ctx)` and the pure `parsePrunedRefs(output, remoteName)`
5
- * helper that consumes `git fetch --prune` stderr. Both exports are
6
- * preserved byte-identically from `git-cleanup.js`.
2
+ * Prune-remotes phase of git-cleanup.
7
3
  *
8
4
  * @module lib/orchestration/git-cleanup/phases/prune
9
5
  */