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,18 +1,6 @@
1
1
  /**
2
- * GitHub Provider — IssuesGateway.
3
- *
4
- * Owns the remaining read-side surface that did not belong to any of the
5
- * earlier six gateways: the raw GraphQL shim (`graphql` / `_ghGraphql`),
6
- * epic reads (`getEpic`), repository-wide label scans
7
- * (`listIssuesByLabel`), branch existence probes (`branchExists`), and the
8
- * three-strategy sub-ticket aggregator (`getSubTickets`).
9
- *
10
- * Extracted from `../github.js` in Story #2462 / Task #2481 — the final
11
- * slice that brings `GitHubProvider` down to a thin composition root.
12
- * Public surface on `GitHubProvider` is unchanged: every method here is
13
- * exposed by a one-line delegating wrapper on the parent provider.
14
- *
15
- * @see Story #2462 — Split GitHubProvider god class into seven composed gateways.
2
+ * GitHub Provider — IssuesGateway: the raw GraphQL shim, epic reads, label
3
+ * scans, branch probes, issue search, and the sub-ticket aggregator.
16
4
  */
17
5
 
18
6
  import { GhRateLimitError } from '../../lib/gh-exec.js';
@@ -33,12 +21,8 @@ import {
33
21
  import { composeBoundedQuery } from './search-query.js';
34
22
 
35
23
  /**
36
- * Retry classifier for the `searchIssues` call site. A rate-limit error is
37
- * non-transient **here** — the shared search budget (not `withTransientRetry`)
38
- * owns the wait, so the call must fail fast rather than burn its retry budget
39
- * re-issuing into an empty window. Every other error keeps the global
40
- * classification, so a 5xx/network blip still retries. `classifyGithubError`
41
- * itself is unchanged: other endpoints legitimately retry on rate-limit.
24
+ * Rate-limit is non-transient for search: the shared search budget owns the
25
+ * wait, so retrying would only re-issue into an empty window.
42
26
  *
43
27
  * @param {unknown} err
44
28
  * @returns {string}
@@ -48,20 +32,11 @@ function classifySearchRetry(err) {
48
32
  return classifyGithubError(err);
49
33
  }
50
34
 
51
- /**
52
- * Concurrency budget for the `getSubTickets` fan-out — preserved from
53
- * the old `./github/issues.js` predecessor.
54
- */
55
35
  export const SUBTICKET_HYDRATION_CONCURRENCY = 8;
56
36
 
57
37
  /**
58
- * The `Issue.parent` read backing {@link IssuesGateway#getParentIssue}.
59
- *
60
- * Node selection is deliberately identical to `SUB_ISSUES_QUERY`'s, so the
61
- * parent and the children a caller holds come back in one shape and
62
- * `subIssueNodeToTicket` maps both. Addressed by `owner/repo/number` rather
63
- * than by node id because every caller starts from an issue number and would
64
- * otherwise pay a round-trip just to learn the node id.
38
+ * Node selection matches `SUB_ISSUES_QUERY` so `subIssueNodeToTicket` maps
39
+ * parent and children alike; addressed by number to skip a node-id lookup.
65
40
  */
66
41
  const PARENT_ISSUE_QUERY = `query($owner: String!, $repo: String!, $number: Int!) {
67
42
  repository(owner: $owner, name: $repo) {
@@ -80,9 +55,6 @@ const PARENT_ISSUE_QUERY = `query($owner: String!, $repo: String!, $number: Int!
80
55
  }
81
56
  }`;
82
57
 
83
- // Re-export so existing test consumers that previously imported
84
- // `paginateRest` from this module continue to work without an extra
85
- // migration step.
86
58
  export { paginateRest };
87
59
 
88
60
  export class IssuesGateway {
@@ -104,16 +76,13 @@ export class IssuesGateway {
104
76
  this.owner = owner;
105
77
  this.repo = repo;
106
78
  this._hooks = hooks;
107
- // The `/search/issues` fan-out budget. Defaults to the process-wide
108
- // singleton so every gateway instance shares one 30/min window; injectable
109
- // so unit tests drive it deterministically (Story #4678).
79
+ // Process-wide singleton by default so all gateways share one 30/min
80
+ // `/search/issues` window.
110
81
  this._searchBudget = searchBudget ?? defaultSearchBudget;
111
82
  }
112
83
 
113
84
  /**
114
- * Run a GraphQL query/mutation through `gh api graphql` (POST with a
115
- * JSON `{ query, variables }` body on stdin). Returns the `data` field.
116
- * Throws when the response contains a non-empty `errors[]`.
85
+ * Returns the response's `data`; throws on a non-empty `errors[]`.
117
86
  */
118
87
  async ghGraphql(query, variables = {}, _opts = {}) {
119
88
  const body = { query };
@@ -135,9 +104,7 @@ export class IssuesGateway {
135
104
  }
136
105
 
137
106
  /**
138
- * List every issue carrying `labels` (comma-separated string per GitHub
139
- * REST). Used by the dispatcher / reconciler to scan for `agent::*`
140
- * state.
107
+ * Raw REST issues (PRs excluded); `labels` is GitHub's comma-separated form.
141
108
  *
142
109
  * @field-manifest /repos/{owner}/{repo}/issues: number, title, body, labels,
143
110
  * state, assignees, pull_request
@@ -151,21 +118,9 @@ export class IssuesGateway {
151
118
  }
152
119
 
153
120
  /**
154
- * The same scan as {@link listIssuesByLabel}, mapped through
155
- * `issueToTicket` — one **declared** shape instead of a raw REST payload.
156
- *
157
- * The two differ in exactly the field that keeps biting: the REST payload
158
- * calls the issue number `number` and the database id `id`, while every
159
- * mapped read calls the issue number `id`. Consumers that could be handed
160
- * either wrote `number ?? id` to cope, and that fallback is not a
161
- * defensive nicety — it is a live bug, because on a *mapped* ticket `id`
162
- * is the number and on a *raw* one it is the database id. A caller that
163
- * ever receives the raw shape silently addresses issues by database id.
164
- *
165
- * `url` is carried alongside the mapped fields because two consumers
166
- * (`epic-candidates`, `dependency-candidates`) render a link and
167
- * `issueToTicket` drops `html_url`. It is the only addition; everything
168
- * else is exactly what every other single-issue read returns.
121
+ * {@link listIssuesByLabel} mapped through `issueToTicket`, plus `url`.
122
+ * Prefer this: on a raw payload `id` is the database id, on a mapped one it
123
+ * is the issue number, and a `number ?? id` fallback silently mis-addresses.
169
124
  *
170
125
  * @param {{ state?: 'open'|'closed'|'all', labels?: string }} [opts]
171
126
  * @returns {Promise<Array<object>>} Mapped tickets (`id` is the issue number).
@@ -182,20 +137,9 @@ export class IssuesGateway {
182
137
  }
183
138
 
184
139
  /**
185
- * Resolve an issue's container parent in **one** request.
186
- *
187
- * The rollup's child→parent lookup used to scan every open `type::epic`
188
- * issue and read each one's children looking for the Story it was handed:
189
- * O(open Epics) requests to answer a question the API answers directly.
190
- * `Issue.parent` is the native sub-issue edge read backwards, so a Story
191
- * with a container costs one call and a Story without one costs the same.
192
- *
193
- * Returns `null` — never throws — when the issue has no parent, when the
194
- * response is shaped unexpectedly, or when the sub-issues feature is
195
- * unavailable on this repo. A null is "no parent resolved here", which is
196
- * exactly what the caller's body-checklist fallback exists for; turning a
197
- * disabled feature into an exception would convert a degraded lookup into a
198
- * failed lifecycle edge.
140
+ * Resolve an issue's container parent in one request via `Issue.parent`.
141
+ * Never throws: no parent, an odd shape, or sub-issues being unavailable all
142
+ * return `null`, leaving the caller's checklist fallback to run.
199
143
  *
200
144
  * @param {number} number Issue number whose parent to resolve.
201
145
  * @returns {Promise<object|null>} Mapped parent ticket, or null.
@@ -230,25 +174,10 @@ export class IssuesGateway {
230
174
  }
231
175
 
232
176
  /**
233
- * Search issues by a free-text query via the REST search API
234
- * (`GET /search/issues`). Deliberately REST, **not** GraphQL: transient
235
- * GraphQL 401s are a known failure mode in this repo (the dedup port that
236
- * consumes this method must not silently no-op on an auth blip), so the
237
- * search rides the same `gh api` REST surface + transient-retry shim as
238
- * every other read here.
239
- *
240
- * The caller (`audit-to-stories.js` `loadProvider()`) passes a 40-char
241
- * fingerprint sha as the query so the search resolves the handful of
242
- * issues whose fingerprint footer carries that sha; `route-finding.js`
243
- * then confirms identity against the footer. Both open and closed issues
244
- * are returned (no `state:` qualifier is appended) so a closed-fingerprint
245
- * match can surface as `regression-of-closed`.
246
- *
247
- * Returns the trimmed `[{ number, state, body, title, html_url }]`
248
- * projection. Dedup callers use `{ number, state, body }`; duplicate-
249
- * search also needs `title` / `html_url`. `state` is normalised to the
250
- * REST lowercase form (`open` / `closed`). Results are capped at one
251
- * Search API page (`per_page=100`).
177
+ * Search issues (open and closed, so a closed match can surface as a
178
+ * regression) in this repo via REST — not GraphQL, whose transient 401s
179
+ * would make the dedup port silently no-op. Capped at one 100-item page;
180
+ * `state` is lowercase.
252
181
  *
253
182
  * @param {{ query: string, owner?: string, repo?: string }} params
254
183
  * @returns {Promise<Array<{ number: number, state: string, body: string, title: string, html_url?: string }>>}
@@ -260,18 +189,12 @@ export class IssuesGateway {
260
189
  }
261
190
  const scopeOwner = owner ?? this.owner;
262
191
  const scopeRepo = repo ?? this.repo;
263
- // Constrain the search to this repo and to issues (not PRs). The
264
- // fingerprint sha is the free-text term; GitHub matches it against the
265
- // issue body where the `<!-- audit-fingerprints: ... -->` footer lives.
266
- // The composed `q` is bounded to GitHub Search's 256-char limit here — the
267
- // only place that knows both the free text and the qualifiers it appends —
268
- // truncating the free-text portion on a whole-token boundary (Story #4678).
192
+ // Bounded here — the only place that sees both the free text and the
193
+ // qualifiers — to Search's 256-char `q` limit.
269
194
  const qualifiers = [`repo:${scopeOwner}/${scopeRepo}`, 'type:issue'];
270
195
  const q = composeBoundedQuery(query, qualifiers);
271
196
  const params = new URLSearchParams({ q, per_page: '100' });
272
197
  const endpoint = `/search/issues?${params}`;
273
- // Await the shared 30/min budget before every call so the whole scan's
274
- // fan-out is throttled at the endpoint, not per caller (Story #4678).
275
198
  await this._searchBudget.take();
276
199
  let result;
277
200
  try {
@@ -284,9 +207,8 @@ export class IssuesGateway {
284
207
  },
285
208
  );
286
209
  } catch (err) {
287
- // A rate limit means the window is empty: drain the budget until the
288
- // reported reset so the *next* call pauses once, rather than every call
289
- // retrying independently into the exhausted window.
210
+ // Drain the budget until reset so the next call pauses once instead of
211
+ // every caller retrying into the exhausted window.
290
212
  if (err instanceof GhRateLimitError) {
291
213
  this._searchBudget.noteRateLimited(parseRateLimitResetMs(err));
292
214
  }
@@ -320,9 +242,8 @@ export class IssuesGateway {
320
242
  }
321
243
 
322
244
  /**
323
- * Probe whether `branch` exists on the remote. Returns `true` when the
324
- * branch resolves, `false` on 404, and propagates any other transport
325
- * error so auth/scope failures don't masquerade as a missing branch.
245
+ * `false` only on 404; other errors propagate so auth failures don't
246
+ * masquerade as a missing branch.
326
247
  *
327
248
  * @field-manifest GET /repos/{owner}/{repo}/branches/{branch}: name
328
249
  */
@@ -340,7 +261,6 @@ export class IssuesGateway {
340
261
  }
341
262
  }
342
263
 
343
- /** Strategy 2 — Markdown checklist links `- [ ] #N` / `- [x] #N`. */
344
264
  _getChecklistChildren(parentBody) {
345
265
  const re = /-\s*\[[ xX]\]\s+#(\d+)/g;
346
266
  return [...(parentBody ?? '').matchAll(re)].map((m) =>
@@ -348,10 +268,7 @@ export class IssuesGateway {
348
268
  );
349
269
  }
350
270
 
351
- /**
352
- * Strategy 3 — reverse-search for issues that reference the parent
353
- * (`Epic: #N` / `parent: #N`). Non-fatal on error.
354
- */
271
+ /** Reverse-search for issues referencing the parent; non-fatal on error. */
355
272
  async _getReferencedChildren(parentId) {
356
273
  const getTickets = this._hooks.getTickets;
357
274
  const primeTicketCache = this._hooks.primeTicketCache;
@@ -370,32 +287,23 @@ export class IssuesGateway {
370
287
  }
371
288
 
372
289
  /**
373
- * Aggregate sub-tickets via a priority-fallback strategy:
374
- * 1. Native sub-issues (GraphQL) + checklist links in body — run in
375
- * parallel because checklist parsing is pure/synchronous.
376
- * 2. Reverse-search (`_getReferencedChildren`) — a full-repo label
377
- * scan that is **only** executed when both strategy 1 sources
378
- * return empty. This avoids the unconditional full-repo scan that
379
- * fired on every call in the old `Promise.all` path.
290
+ * Union of native sub-issues and body checklist links; the full-repo
291
+ * reverse search runs only when both are empty.
380
292
  *
381
293
  * @param {number} parentId
382
- * @param {{ fresh?: boolean }} [opts] - Pass `{ fresh: true }` to bypass
383
- * the per-instance ticket cache for every child hydration fetch. Used
384
- * by the cascade logic to skip a redundant second fan-out.
294
+ * @param {{ fresh?: boolean }} [opts] - `fresh` bypasses the ticket cache
295
+ * for every child fetch.
385
296
  */
386
297
  async getSubTickets(parentId, opts = {}) {
387
298
  const getTicket = this._hooks.getTicket;
388
299
  const getNativeSubIssues = this._hooks.getNativeSubIssues;
389
300
  const parent = await getTicket(parentId);
390
301
 
391
- // Strategy 1: native sub-issues (GraphQL) + checklist (synchronous).
392
302
  const [nativeChildIds, checklistChildIds] = await Promise.all([
393
303
  getNativeSubIssues(parent.nodeId, parentId),
394
304
  Promise.resolve(this._getChecklistChildren(parent.body)),
395
305
  ]);
396
306
 
397
- // Strategy 2 (fallback): full-repo reverse-search — only when strategy
398
- // 1 produced nothing, avoiding the unconditional scan on every call.
399
307
  let referencedChildIds = [];
400
308
  if (nativeChildIds.length === 0 && checklistChildIds.length === 0) {
401
309
  referencedChildIds = await this._getReferencedChildren(parentId);
@@ -1,57 +1,25 @@
1
1
  /**
2
- * GitHub Provider — LabelGateway.
3
- *
4
- * Owns `ensureLabels` (idempotent label create) plus the live-set
5
- * reconciliation helper (`_reconcileLabelsPresence` /
6
- * `_normalizeLabelListResult`). `gh label create` is the canonical CLI
7
- * surface for label creation; this gateway swallows the "already exists"
8
- * signal across all three surfaces (CLI stderr, API 422 body, legacy test
9
- * mock) so re-runs are idempotent.
10
- *
11
- * Extracted from `../github.js` in Story #2462 / Task #2478. Public
12
- * surface on `GitHubProvider` is unchanged — `ensureLabels`,
13
- * `_reconcileLabelsPresence`, and `_normalizeLabelListResult` all
14
- * delegate here.
15
- *
16
- * @see Story #2462 — Split GitHubProvider god class into seven composed gateways.
2
+ * GitHub Provider — LabelGateway: idempotent label create with live-set
3
+ * reconciliation, paginated listing, and delete.
17
4
  */
18
5
 
19
6
  import { withTransientRetry } from './errors.js';
20
7
  import { paginateRest } from './request-helpers.js';
21
8
 
22
9
  /**
23
- * Detect the "label already exists" signal across the surfaces `gh label
24
- * create` can emit it on. The CLI prints
25
- *
26
- * `! Label "<name>" already exists`
27
- *
28
- * to stderr and exits non-zero; the underlying API surfaces a 422 with
29
- * `errors[].code === 'already_exists'`. The test mock throws
30
- * `Error('... code 422')`. Match all three — but require the patterns to
31
- * be **anchored to the label-create lexicon** so unrelated stderr lines
32
- * that happen to mention "already exists" don't get misclassified as
33
- * idempotent skips and let real creation failures look successful.
34
- *
35
- * Story #2018 (Bug 2) tightened the regexes after a fresh-repo bootstrap
36
- * counted 23 labels as "skipped" when none were actually created.
10
+ * "Label already exists" across CLI stderr, the API 422 `already_exists`
11
+ * body, and the legacy mock shape. Anchored to the label lexicon so an
12
+ * unrelated "already exists" can't turn a real create failure into a skip.
37
13
  */
38
14
  export function isLabelAlreadyExistsError(err) {
39
15
  if (!err) return false;
40
16
  const message = err?.message ?? '';
41
17
  const stderr = err?.stderr ?? '';
42
- // CLI shapes (vary by gh version):
43
- // `! Label "<name>" already exists`
44
- // `label with name "<name>" already exists; use ` + '`--force`' + ` ...`
45
- // Require both the "label" lexicon and the "already exists" signal (with
46
- // anything in between) so unrelated errors are not misclassified as skips.
47
18
  if (/label\b[\s\S]*?already exists/i.test(stderr)) return true;
48
19
  if (/label\b[\s\S]*?already exists/i.test(message)) return true;
49
- // REST API shape: 422 + `already_exists` code in the error body.
50
20
  if (/already_exists/i.test(stderr) || /already_exists/i.test(message)) {
51
21
  return true;
52
22
  }
53
- // Test-mock legacy shape: `Error('... code 422 ...')` combined with the
54
- // word "already exists" anywhere in the message.
55
23
  if (
56
24
  /\bcode\s+422\b/i.test(message) &&
57
25
  /already exists/i.test(message + stderr)
@@ -62,15 +30,8 @@ export function isLabelAlreadyExistsError(err) {
62
30
  }
63
31
 
64
32
  /**
65
- * Detect the "label does not exist" signal on the delete path. `gh api` exits
66
- * non-zero on a 404 with `gh: Not Found (HTTP 404)` on stderr; the REST body
67
- * carries `"message": "Not Found"`. Both are matched, and the numeric status
68
- * is matched on its own so a transport that surfaces only `err.status` still
69
- * classifies.
70
- *
71
- * Deliberately narrow: only a 404 counts. A 403 (scope) or a 422 must stay
72
- * loud, because reading either as "already gone" would let a sweep report
73
- * labels as reaped that are all still there.
33
+ * Only a 404 counts: reading a 403 or 422 as "already gone" would let a
34
+ * sweep report labels reaped that still exist.
74
35
  *
75
36
  * @param {unknown} err
76
37
  * @returns {boolean}
@@ -83,33 +44,13 @@ export function isLabelNotFoundError(err) {
83
44
  );
84
45
  }
85
46
 
86
- /**
87
- * GitHub's cap on a label description. A longer one is refused with an HTTP
88
- * 422 that `gh label create` reports as a bare exit 1 — a deterministic
89
- * create failure, never a truncation. Lives here rather than in the
90
- * provider-agnostic label vocabulary because it is an API constraint of this
91
- * provider (Story #5201, where two over-long `plan-persist` descriptions made
92
- * the `plan-run::<id>` cohort label uncreatable on every run).
93
- */
94
- // Module-private on purpose: nothing in production reads the number outside
95
- // the guard below, and the suite pins GitHub's published cap as a literal
96
- // rather than against our own constant.
47
+ /** GitHub's description cap; longer is a 422 that `gh` reports as exit 1. */
97
48
  const LABEL_DESCRIPTION_MAX_LENGTH = 100;
98
49
 
99
50
  /**
100
- * Refuse a label description GitHub will reject anyway, **before** `gh` is
101
- * spawned.
102
- *
103
- * The API caps a description at {@link LABEL_DESCRIPTION_MAX_LENGTH}
104
- * characters and answers a longer one with an HTTP 422 that `gh label create`
105
- * surfaces as a bare exit 1 — legible only to a caller that digs the reason
106
- * out of stderr. Failing at the call site instead names the label and its
107
- * actual length, so the fix is obvious from the message alone.
108
- *
109
- * Deliberately a throw rather than a silent truncation: a truncated
110
- * description is a label whose text nobody chose, and every `ensureLabels`
111
- * caller already handles a throw — the bootstrap paths surface it, and
112
- * `plan-persist` degrades to creating its Stories without the cosmetic label.
51
+ * Fail before spawning `gh`, naming the label and its length. A throw, not a
52
+ * truncation: every caller already handles a throw, and a truncated
53
+ * description is text nobody chose.
113
54
  *
114
55
  * @param {{ name?: string, description?: string }} def
115
56
  * @throws {Error} when the description exceeds the cap.
@@ -134,22 +75,10 @@ export class LabelGateway {
134
75
  }
135
76
 
136
77
  /**
137
- * Idempotent label creation. Each def's description is checked against
138
- * GitHub's length cap first (`assertLabelDescriptionWithinCap`) so a
139
- * guaranteed-422 create never reaches the network. Then, for each labelDef,
140
- * attempt `gh label create
141
- * <name> --color <hex> --description <text>`. The CLI prints
142
- * "label already exists" (or the API surfaces a 422 "already_exists"
143
- * error) when the name is taken; we swallow that and count it as
144
- * `skipped`. Any other error propagates so transport faults stay loud.
145
- *
146
- * After the per-def loop, **reconcile against the live label set** by
147
- * listing the labels actually present on the remote. Anything counted
148
- * in `created` or `skipped` that isn't actually present is moved to a
149
- * `missing[]` envelope — the bootstrap caller surfaces this loudly so a
150
- * silent classification miss (Story #2018, Bug 2) can't pretend success.
151
- * Verification failures (rate-limit, scope) are best-effort: they leave
152
- * `missing` empty rather than aborting the bootstrap.
78
+ * Create each label, counting "already exists" as `skipped`; other errors
79
+ * propagate. Then reconcile against the live set: anything believed
80
+ * created/skipped but absent moves to `missing[]`, so a misclassification
81
+ * can't pass as success. A failed verification leaves `missing` empty.
153
82
  *
154
83
  * Returns `{ created: string[], skipped: string[], missing: string[] }`.
155
84
  */
@@ -182,10 +111,6 @@ export class LabelGateway {
182
111
  if (missing.length === 0) {
183
112
  return { created, skipped, missing };
184
113
  }
185
- // Anything we believed we created/skipped that isn't actually on the
186
- // remote is by definition a silent failure — drop it from those lists
187
- // so the consumer's `created.length + skipped.length` math stays
188
- // honest. The full label name survives in `missing[]`.
189
114
  const missingSet = new Set(missing);
190
115
  return {
191
116
  created: created.filter((n) => !missingSet.has(n)),
@@ -195,13 +120,9 @@ export class LabelGateway {
195
120
  }
196
121
 
197
122
  /**
198
- * Best-effort post-loop reconcile for `ensureLabels`. Lists the live
199
- * label set and returns the names from `labelDefs` that are absent.
200
- * Internal helper — production callers go through `ensureLabels`.
201
- *
202
- * Accepts either the real `gh-exec` --json shape (returns an `Array`
203
- * directly) or the legacy/test shape (`{stdout: '<json>', ...}`) so
204
- * the verification path stays harness-agnostic.
123
+ * Names from `labelDefs` absent from the live set. Best-effort: an
124
+ * unreadable or empty listing means "verification unavailable", not
125
+ * "everything missing".
205
126
  */
206
127
  async _reconcileLabelsPresence(labelDefs) {
207
128
  let result;
@@ -212,9 +133,6 @@ export class LabelGateway {
212
133
  }
213
134
  const liveLabels = this._normalizeLabelListResult(result);
214
135
  if (!Array.isArray(liveLabels) || liveLabels.length === 0) {
215
- // Listing returned nothing parseable. Treat as "verification
216
- // unavailable" rather than "every label is missing" — false
217
- // positives on this path would derail an otherwise-clean bootstrap.
218
136
  return [];
219
137
  }
220
138
  const liveNames = new Set();
@@ -230,19 +148,9 @@ export class LabelGateway {
230
148
  }
231
149
 
232
150
  /**
233
- * List the repository's whole label vocabulary, paginated.
234
- *
235
- * Deliberately NOT modelled on `_reconcileLabelsPresence`'s
236
- * `gh label list --limit 500`. That hard cap is fine for its own job —
237
- * "are these 20 bootstrap labels present?" — and fatal for this one: a
238
- * caller deciding which labels to delete from a truncated view would skip
239
- * exactly the labels that sort after an accumulated pile, which is the
240
- * failure Story #5189 exists to stop reproducing. `paginateRest` walks
241
- * pages until a short one lands and throws (loudly) rather than truncating
242
- * if the repository somehow exceeds its ceiling.
243
- *
244
- * Rows are projected to the fields a caller can rely on; a row without a
245
- * usable `name` is dropped rather than passed on as a deletable target.
151
+ * The full label vocabulary, paginated — never the capped `--limit 500`
152
+ * list, since a caller choosing deletions from a truncated view would skip
153
+ * labels past the cap. Rows without a usable `name` are dropped.
246
154
  *
247
155
  * @returns {Promise<Array<{ name: string, color: string|null, description: string|null }>>}
248
156
  * @field-manifest /repos/{owner}/{repo}/labels: name, color, description
@@ -262,17 +170,8 @@ export class LabelGateway {
262
170
  }
263
171
 
264
172
  /**
265
- * Delete one label by name.
266
- *
267
- * Goes through the REST surface (`DELETE /repos/{owner}/{repo}/labels/{name}`)
268
- * rather than `gh label delete`, so the "already gone" signal arrives as a
269
- * structured 404 on the same facade every other read here uses instead of
270
- * as CLI prose — and so this gateway needs no new verb on the `gh` facade.
271
- *
272
- * A missing label resolves as a successful no-op. That is not leniency: the
273
- * sweep this port exists for is expected to run repeatedly and concurrently
274
- * with the close-path reap, so "someone else already deleted it" is the
275
- * normal case, not an error.
173
+ * Delete via REST so "already gone" is a structured 404. A missing label is
174
+ * a normal no-op: sweeps run repeatedly and concurrently with the close reap.
276
175
  *
277
176
  * @param {string} name
278
177
  * @returns {Promise<{ deleted: boolean, reason: string|null }>}
@@ -294,6 +193,7 @@ export class LabelGateway {
294
193
  }
295
194
  }
296
195
 
196
+ /** Accepts the `gh-exec` array shape or a `{ stdout }` JSON wrapper. */
297
197
  _normalizeLabelListResult(result) {
298
198
  if (Array.isArray(result)) return result;
299
199
  if (result && typeof result.stdout === 'string') {
@@ -1,14 +1,6 @@
1
1
  /**
2
- * GitHub Provider — pure REST/GraphQL ticket mappers.
3
- *
4
- * Pure functions that translate raw GitHub API payloads (REST `Issue`,
5
- * GraphQL sub-issue node) into the normalized ticket shape consumed
6
- * throughout the dispatcher / reconciler layer. No I/O, no state, no
7
- * `execSync` —
8
- * verified by the sibling test which exercises the mappers without `gh`
9
- * installed.
10
- *
11
- * Extracted from `../github.js` in Story #1846 / Task #1859.
2
+ * GitHub Provider — pure mappers from REST issues / GraphQL sub-issue nodes
3
+ * to the normalized ticket shape.
12
4
  */
13
5
 
14
6
  function normalizeLabels(issue) {
@@ -35,10 +27,7 @@ export function issueToTicket(issue) {
35
27
  labelSet: new Set(labels),
36
28
  assignees: (issue.assignees ?? []).map((a) => a.login),
37
29
  state: issue.state,
38
- // `completed` | `not_planned` | `reopened` | null. `state` alone cannot
39
- // tell a Story that landed from one closed as superseded — both read
40
- // `closed` — so the close path needs this to avoid reporting a
41
- // never-merged Story as landed.
30
+ // Distinguishes a landed Story from a superseded one; both are `closed`.
42
31
  stateReason: issue.state_reason ?? null,
43
32
  };
44
33
  }
@@ -57,13 +46,7 @@ export function issueToEpic(issue) {
57
46
  }
58
47
 
59
48
  export function subIssueNodeToTicket(node) {
60
- // Story #3097 (Wave-0 additive, Epic #3078 Strategy B) — return `null`
61
- // for absent sub-issue nodes instead of dereferencing properties on
62
- // `null`/`undefined`. In 2-tier mode a Story can legitimately have zero
63
- // Task children, which surfaces as an empty / missing sub-issue node
64
- // when callers iterate the GraphQL response and pass each entry through
65
- // this mapper. The legacy 4-tier path also benefits — a transient
66
- // empty node returned mid-pagination no longer throws.
49
+ // Absent nodes are legitimate (childless Story, empty page entry).
67
50
  if (node == null) return null;
68
51
  const labels = normalizeLabels(node);
69
52
  return {
@@ -81,12 +64,7 @@ export function subIssueNodeToTicket(node) {
81
64
  }
82
65
 
83
66
  /**
84
- * Map a list of raw GraphQL sub-issue nodes to ticket objects, skipping
85
- * any null/undefined entries. Story #3097 (Wave-0 additive, Epic #3078
86
- * Strategy B) — gives callers a single Storyless-tolerant entry point so
87
- * the existing per-node mappers can stay strict for the 4-tier path while
88
- * the 2-tier path (Storyless: a Story with zero child Tasks) gets a
89
- * well-defined empty-array result.
67
+ * Skips null entries; a non-array yields `[]`.
90
68
  *
91
69
  * @param {Array<object|null|undefined>|null|undefined} nodes
92
70
  * @returns {object[]}
@@ -1,24 +1,10 @@
1
1
  /**
2
- * GitHub Provider — MergeMethodsGateway.
3
- *
4
- * Owns `getMergeMethods` / `setMergeMethods` against `/repos/{owner}/{repo}`.
5
- * The narrow field list (`MERGE_METHOD_FIELDS`) keeps `getMergeMethods` and
6
- * `setMergeMethods` aligned on which keys they mirror — operators may have
7
- * tuned other repo flags and we deliberately do not surface them through
8
- * this interface.
9
- *
10
- * Extracted from `../github.js` in Story #2462 / Task #2479. Public
11
- * surface on `GitHubProvider` is unchanged — both merge-method methods
12
- * delegate here.
13
- *
14
- * @see Story #2462 — Split GitHubProvider god class into seven composed gateways.
2
+ * GitHub Provider — MergeMethodsGateway. Reads and writes only
3
+ * `MERGE_METHOD_FIELDS`, leaving other operator-tuned repo flags alone.
15
4
  */
16
5
 
17
6
  import { parseApiJson } from './request-helpers.js';
18
7
 
19
- /**
20
- * Fields the merge-method bootstrap reads/writes.
21
- */
22
8
  export const MERGE_METHOD_FIELDS = [
23
9
  'allow_squash_merge',
24
10
  'allow_rebase_merge',
@@ -38,10 +24,6 @@ export class MergeMethodsGateway {
38
24
  }
39
25
 
40
26
  /**
41
- * Read the repo's current merge-method-related settings. Returns only
42
- * the fields the bootstrap cares about so the diff layer can compare
43
- * apples to apples regardless of what other knobs the repo exposes.
44
- *
45
27
  * @field-manifest GET /repos/{owner}/{repo}: allow_squash_merge,
46
28
  * allow_rebase_merge, allow_merge_commit,
47
29
  * allow_auto_merge, delete_branch_on_merge
@@ -60,8 +42,7 @@ export class MergeMethodsGateway {
60
42
  }
61
43
 
62
44
  /**
63
- * PATCH the repo with the supplied merge-method settings. Sparse body —
64
- * only the supplied fields are sent / touched.
45
+ * Sparse PATCH: only supplied fields are sent.
65
46
  *
66
47
  * @field-manifest PATCH /repos/{owner}/{repo}: allow_squash_merge,
67
48
  * allow_rebase_merge, allow_merge_commit,
@@ -1,18 +1,6 @@
1
1
  /**
2
- * GitHub Provider — ProjectBoardGateway.
3
- *
4
- * Owns the Projects V2 bootstrap surface: `resolveOrCreateProject`,
5
- * `ensureStatusField`, `ensureProjectFields`. The low-level GraphQL
6
- * mutations live in `./projects-v2-graphql.js`; this class threads the
7
- * parent provider's `_ctx` (which carries `projectNumber`, `projectOwner`,
8
- * `state`, and the shared cache) into each call so the legacy shim contract
9
- * is preserved.
10
- *
11
- * Extracted from `../github.js` in Story #2462 / Task #2479. Public
12
- * surface on `GitHubProvider` is unchanged — every project-board method
13
- * delegates here.
14
- *
15
- * @see Story #2462 — Split GitHubProvider god class into seven composed gateways.
2
+ * GitHub Provider — ProjectBoardGateway: threads the provider's shared
3
+ * `_ctx` into the Projects V2 shim.
16
4
  */
17
5
 
18
6
  import * as projects from './projects-v2-graphql.js';
@@ -20,9 +8,6 @@ import * as projects from './projects-v2-graphql.js';
20
8
  export class ProjectBoardGateway {
21
9
  /**
22
10
  * @param {{ ctx: object }} deps
23
- * `ctx` is the shared `_ctx` object the parent provider builds —
24
- * carries `projectOwner`, `projectName`, `projectNumber`,
25
- * `operatorHandle`, `cache`, `state`, and `hooks`.
26
11
  */
27
12
  constructor({ ctx } = {}) {
28
13
  this._ctx = ctx;