mandrel 2.59.0 → 2.61.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (678) hide show
  1. package/.agents/README.md +21 -19
  2. package/.agents/agents/acceptance-critic.md +24 -43
  3. package/.agents/agents/story-worker.md +20 -21
  4. package/.agents/docs/agentrc-reference.json +5 -84
  5. package/.agents/docs/configuration.md +48 -132
  6. package/.agents/docs/workflows.md +2 -2
  7. package/.agents/instructions.md +5 -8
  8. package/.agents/rules/ci-remediation.md +41 -8
  9. package/.agents/rules/gherkin-standards.md +4 -0
  10. package/.agents/schemas/acceptance-eval-verdict.schema.json +1 -1
  11. package/.agents/schemas/agentrc.schema.json +16 -496
  12. package/.agents/schemas/story-deliver-terminal.schema.json +13 -3
  13. package/.agents/schemas/validation-evidence.schema.json +2 -1
  14. package/.agents/scripts/README.md +23 -13
  15. package/.agents/scripts/acceptance-eval.js +35 -169
  16. package/.agents/scripts/agents-bootstrap-github.js +27 -129
  17. package/.agents/scripts/apply-quality-bootstrap.js +4 -40
  18. package/.agents/scripts/audit-baselines.js +6 -27
  19. package/.agents/scripts/audit-labels-bootstrap.js +5 -29
  20. package/.agents/scripts/audit-to-stories.js +91 -361
  21. package/.agents/scripts/boot-sweep.js +19 -72
  22. package/.agents/scripts/bootstrap.js +74 -395
  23. package/.agents/scripts/ceremony-derive.js +10 -41
  24. package/.agents/scripts/check-arch-cycles.js +14 -64
  25. package/.agents/scripts/check-baselines.js +8 -48
  26. package/.agents/scripts/check-context-budget.js +105 -311
  27. package/.agents/scripts/check-cyclomatic.js +12 -44
  28. package/.agents/scripts/check-dead-exports.js +13 -64
  29. package/.agents/scripts/check-doc-links.js +38 -186
  30. package/.agents/scripts/check-gherkin-corpus.js +24 -127
  31. package/.agents/scripts/check-test-temp-hygiene.js +28 -169
  32. package/.agents/scripts/coverage-capture.js +34 -98
  33. package/.agents/scripts/deliver-light.js +25 -171
  34. package/.agents/scripts/deliver-recover.js +6 -42
  35. package/.agents/scripts/deliver-run.js +534 -0
  36. package/.agents/scripts/diagnose-friction.js +24 -116
  37. package/.agents/scripts/drain-pending-cleanup.js +1 -1
  38. package/.agents/scripts/evidence-gate.js +23 -85
  39. package/.agents/scripts/file-ci-gap.js +57 -49
  40. package/.agents/scripts/generate-config-docs.js +30 -170
  41. package/.agents/scripts/generate-lens-checklists.js +8 -52
  42. package/.agents/scripts/generate-skills-index.js +14 -112
  43. package/.agents/scripts/generate-workflows-doc.js +10 -70
  44. package/.agents/scripts/git-cleanup.js +2 -34
  45. package/.agents/scripts/lib/Graph.js +24 -81
  46. package/.agents/scripts/lib/ITicketingProvider.js +47 -143
  47. package/.agents/scripts/lib/Logger.js +14 -76
  48. package/.agents/scripts/lib/audit-baselines/engine.js +11 -31
  49. package/.agents/scripts/lib/audit-baselines/gate-surface.js +3 -17
  50. package/.agents/scripts/lib/audit-baselines/headroom.js +4 -20
  51. package/.agents/scripts/lib/audit-baselines/hotspots.js +3 -15
  52. package/.agents/scripts/lib/audit-baselines/kinds.js +23 -89
  53. package/.agents/scripts/lib/audit-baselines/outliers.js +6 -23
  54. package/.agents/scripts/lib/audit-baselines/read.js +3 -16
  55. package/.agents/scripts/lib/audit-baselines/staleness.js +7 -26
  56. package/.agents/scripts/lib/audit-baselines/surface-entry.js +7 -28
  57. package/.agents/scripts/lib/audit-baselines/trend.js +7 -20
  58. package/.agents/scripts/lib/audit-baselines/weights.js +9 -37
  59. package/.agents/scripts/lib/audit-suite/audit-rules-reader.js +3 -18
  60. package/.agents/scripts/lib/audit-suite/checklist-threading.js +26 -124
  61. package/.agents/scripts/lib/audit-suite/dispatch-checklist.js +14 -45
  62. package/.agents/scripts/lib/audit-suite/findings.js +12 -52
  63. package/.agents/scripts/lib/audit-suite/frontmatter.js +5 -29
  64. package/.agents/scripts/lib/audit-suite/index.js +1 -15
  65. package/.agents/scripts/lib/audit-suite/lens-checklist.js +10 -45
  66. package/.agents/scripts/lib/audit-suite/lens-diff-floor.js +11 -76
  67. package/.agents/scripts/lib/audit-suite/runner.js +13 -43
  68. package/.agents/scripts/lib/audit-suite/selector.js +49 -349
  69. package/.agents/scripts/lib/audit-suite/substitutions.js +12 -40
  70. package/.agents/scripts/lib/audit-suite/workflow-loader.js +3 -15
  71. package/.agents/scripts/lib/audit-to-stories/audit-label-taxonomy.js +11 -73
  72. package/.agents/scripts/lib/audit-to-stories/audit-lenses.js +8 -37
  73. package/.agents/scripts/lib/audit-to-stories/build-story-body.js +25 -143
  74. package/.agents/scripts/lib/audit-to-stories/dedupe-against-github.js +14 -80
  75. package/.agents/scripts/lib/audit-to-stories/epic-grouping-directive.js +4 -18
  76. package/.agents/scripts/lib/audit-to-stories/finding-adapter.js +7 -40
  77. package/.agents/scripts/lib/audit-to-stories/group-findings.js +9 -39
  78. package/.agents/scripts/lib/audit-to-stories/issue-corpus.js +10 -66
  79. package/.agents/scripts/lib/audit-to-stories/issue-index.js +6 -30
  80. package/.agents/scripts/lib/audit-to-stories/issues-file.js +6 -36
  81. package/.agents/scripts/lib/audit-to-stories/ledger-commit.js +17 -69
  82. package/.agents/scripts/lib/audit-to-stories/ledger-pr.js +17 -85
  83. package/.agents/scripts/lib/audit-to-stories/ledger-record.js +10 -48
  84. package/.agents/scripts/lib/audit-to-stories/parse-audit-md.js +38 -146
  85. package/.agents/scripts/lib/audit-to-stories/seed-from-findings.js +7 -42
  86. package/.agents/scripts/lib/audit-to-stories/wire-dependencies.js +10 -57
  87. package/.agents/scripts/lib/baseline-loader.js +12 -51
  88. package/.agents/scripts/lib/baseline-schema-registry.js +5 -22
  89. package/.agents/scripts/lib/baselines/component-matcher.js +3 -12
  90. package/.agents/scripts/lib/baselines/components.js +10 -61
  91. package/.agents/scripts/lib/baselines/coverage-updater-cli.js +7 -36
  92. package/.agents/scripts/lib/baselines/crap-preview-incremental.js +7 -19
  93. package/.agents/scripts/lib/baselines/crap-preview-scan.js +19 -45
  94. package/.agents/scripts/lib/baselines/crap-updater-cli.js +16 -65
  95. package/.agents/scripts/lib/baselines/diff-scope-cli.js +5 -33
  96. package/.agents/scripts/lib/baselines/duplication-scanner.js +11 -60
  97. package/.agents/scripts/lib/baselines/env-overrides.js +12 -67
  98. package/.agents/scripts/lib/baselines/envelope.js +13 -129
  99. package/.agents/scripts/lib/baselines/exit-codes.js +6 -49
  100. package/.agents/scripts/lib/baselines/git-base.js +23 -142
  101. package/.agents/scripts/lib/baselines/kernel.js +11 -111
  102. package/.agents/scripts/lib/baselines/kinds/_crap-new-method-gate.js +9 -47
  103. package/.agents/scripts/lib/baselines/kinds/_crap-read.js +8 -51
  104. package/.agents/scripts/lib/baselines/kinds/_shared-metric.js +7 -62
  105. package/.agents/scripts/lib/baselines/kinds/bundle-size.js +8 -29
  106. package/.agents/scripts/lib/baselines/kinds/coverage.js +3 -15
  107. package/.agents/scripts/lib/baselines/kinds/crap.js +94 -415
  108. package/.agents/scripts/lib/baselines/kinds/duplication.js +4 -30
  109. package/.agents/scripts/lib/baselines/kinds/kind-factory.js +7 -53
  110. package/.agents/scripts/lib/baselines/kinds/maintainability.js +15 -80
  111. package/.agents/scripts/lib/baselines/kinds/mutation.js +12 -72
  112. package/.agents/scripts/lib/baselines/maintainability-baseline-io.js +4 -11
  113. package/.agents/scripts/lib/baselines/merge-envelopes.js +30 -146
  114. package/.agents/scripts/lib/baselines/path-canon.js +19 -128
  115. package/.agents/scripts/lib/baselines/preview-gates.js +8 -37
  116. package/.agents/scripts/lib/baselines/reader.js +14 -107
  117. package/.agents/scripts/lib/baselines/refresh-service.js +35 -252
  118. package/.agents/scripts/lib/baselines/scope.js +11 -135
  119. package/.agents/scripts/lib/baselines/writer.js +16 -149
  120. package/.agents/scripts/lib/bdd-runner-detect.js +18 -113
  121. package/.agents/scripts/lib/bdd-scenario-budget.js +9 -36
  122. package/.agents/scripts/lib/bdd-scenario-scanner.js +11 -73
  123. package/.agents/scripts/lib/bdd-step-index.js +26 -100
  124. package/.agents/scripts/lib/bootstrap/baseline-merge-driver.js +23 -103
  125. package/.agents/scripts/lib/bootstrap/branch-protection.js +2 -5
  126. package/.agents/scripts/lib/bootstrap/commit-push.js +12 -50
  127. package/.agents/scripts/lib/bootstrap/gh-preflight.js +14 -101
  128. package/.agents/scripts/lib/bootstrap/hitl-confirm.js +5 -30
  129. package/.agents/scripts/lib/bootstrap/install-ledger.js +17 -73
  130. package/.agents/scripts/lib/bootstrap/issue-forms-template.js +17 -121
  131. package/.agents/scripts/lib/bootstrap/manifest.js +15 -86
  132. package/.agents/scripts/lib/bootstrap/merge-methods.js +4 -33
  133. package/.agents/scripts/lib/bootstrap/preflight.js +12 -61
  134. package/.agents/scripts/lib/bootstrap/project-bootstrap.js +34 -235
  135. package/.agents/scripts/lib/bootstrap/prompt.js +21 -129
  136. package/.agents/scripts/lib/bootstrap/quality-bootstrap.js +27 -141
  137. package/.agents/scripts/lib/bootstrap/summary.js +1 -8
  138. package/.agents/scripts/lib/bootstrap/workflow-audit.js +11 -84
  139. package/.agents/scripts/lib/branch-name-guard.js +4 -23
  140. package/.agents/scripts/lib/changed-files.js +39 -121
  141. package/.agents/scripts/lib/checks/core-bare-clean.js +4 -24
  142. package/.agents/scripts/lib/checks/index.js +18 -101
  143. package/.agents/scripts/lib/checks/loop-health.js +11 -53
  144. package/.agents/scripts/lib/checks/state.js +16 -91
  145. package/.agents/scripts/lib/checks/story-init-not-backgrounded.js +10 -61
  146. package/.agents/scripts/lib/checks/subagent-agent-tool-required.js +14 -83
  147. package/.agents/scripts/lib/child-exec.js +39 -108
  148. package/.agents/scripts/lib/cli/standard-args.js +9 -116
  149. package/.agents/scripts/lib/cli-args.js +31 -146
  150. package/.agents/scripts/lib/cli-usage.js +5 -27
  151. package/.agents/scripts/lib/cli-utils.js +2 -12
  152. package/.agents/scripts/lib/close-validation/commands.js +13 -76
  153. package/.agents/scripts/lib/close-validation/gates.js +92 -331
  154. package/.agents/scripts/lib/close-validation/process.js +121 -151
  155. package/.agents/scripts/lib/close-validation/projections/advisories.js +5 -31
  156. package/.agents/scripts/lib/close-validation/projections/crap.js +19 -67
  157. package/.agents/scripts/lib/close-validation/projections/head-sha.js +1 -17
  158. package/.agents/scripts/lib/close-validation/projections/inputs.js +4 -34
  159. package/.agents/scripts/lib/close-validation/projections/maintainability.js +11 -58
  160. package/.agents/scripts/lib/close-validation/runner.js +53 -110
  161. package/.agents/scripts/lib/command-header.js +6 -28
  162. package/.agents/scripts/lib/config/acceptance-eval.js +4 -30
  163. package/.agents/scripts/lib/config/baselines.js +3 -14
  164. package/.agents/scripts/lib/config/ci.js +8 -38
  165. package/.agents/scripts/lib/config/commands.js +1 -15
  166. package/.agents/scripts/lib/config/defaults.js +4 -33
  167. package/.agents/scripts/lib/config/delivery-routing.js +6 -34
  168. package/.agents/scripts/lib/config/explain.js +10 -83
  169. package/.agents/scripts/lib/config/gates/coverage.schema.js +0 -12
  170. package/.agents/scripts/lib/config/gates/crap-incremental-coverage.schema.js +3 -31
  171. package/.agents/scripts/lib/config/gates/crap.schema.js +1 -34
  172. package/.agents/scripts/lib/config/gates/duplication.schema.js +1 -8
  173. package/.agents/scripts/lib/config/gates/index.js +2 -17
  174. package/.agents/scripts/lib/config/gates/maintainability.schema.js +1 -20
  175. package/.agents/scripts/lib/config/gates/mutation.schema.js +1 -7
  176. package/.agents/scripts/lib/config/gates/shared.js +4 -64
  177. package/.agents/scripts/lib/config/github.js +4 -22
  178. package/.agents/scripts/lib/config/limits.js +4 -57
  179. package/.agents/scripts/lib/config/paths.js +2 -21
  180. package/.agents/scripts/lib/config/qa.js +4 -38
  181. package/.agents/scripts/lib/config/quality.js +76 -432
  182. package/.agents/scripts/lib/config/runners.js +12 -56
  183. package/.agents/scripts/lib/config/runtime.js +13 -57
  184. package/.agents/scripts/lib/config/shared.js +2 -16
  185. package/.agents/scripts/lib/config/sync-agentrc.js +9 -50
  186. package/.agents/scripts/lib/config/temp-paths.js +40 -280
  187. package/.agents/scripts/lib/config/validate-orchestration.js +5 -17
  188. package/.agents/scripts/lib/config/worktree-isolation.js +9 -28
  189. package/.agents/scripts/lib/config-resolver.js +11 -52
  190. package/.agents/scripts/lib/config-schema-shared.js +1 -4
  191. package/.agents/scripts/lib/config-settings-schema-delivery.js +16 -291
  192. package/.agents/scripts/lib/config-settings-schema-quality.js +7 -219
  193. package/.agents/scripts/lib/config-settings-schema.js +37 -274
  194. package/.agents/scripts/lib/coverage-baseline.js +20 -110
  195. package/.agents/scripts/lib/coverage-capture-fullscope.js +18 -35
  196. package/.agents/scripts/lib/coverage-capture-incremental.js +15 -45
  197. package/.agents/scripts/lib/coverage-capture-usage.js +8 -25
  198. package/.agents/scripts/lib/coverage-capture.js +99 -224
  199. package/.agents/scripts/lib/coverage-utils.js +14 -79
  200. package/.agents/scripts/lib/cpu-pool.js +17 -123
  201. package/.agents/scripts/lib/crap-baseline-join.js +16 -88
  202. package/.agents/scripts/lib/crap-coordinates.js +6 -25
  203. package/.agents/scripts/lib/crap-engine.js +40 -153
  204. package/.agents/scripts/lib/crap-method-identity.js +16 -78
  205. package/.agents/scripts/lib/crap-utils.js +31 -155
  206. package/.agents/scripts/lib/cyclomatic-ceiling.js +14 -87
  207. package/.agents/scripts/lib/cyclomatic-scope.js +10 -50
  208. package/.agents/scripts/lib/dead-exports-knip.js +18 -56
  209. package/.agents/scripts/lib/dead-exports-mode.js +5 -24
  210. package/.agents/scripts/lib/degraded-mode.js +3 -26
  211. package/.agents/scripts/lib/dependency-parser.js +8 -40
  212. package/.agents/scripts/lib/dependency-version.js +13 -35
  213. package/.agents/scripts/lib/detect-package-manager.js +6 -36
  214. package/.agents/scripts/lib/doc-tiers.js +22 -124
  215. package/.agents/scripts/lib/duplicate-search.js +8 -72
  216. package/.agents/scripts/lib/env-loader.js +5 -27
  217. package/.agents/scripts/lib/error-redactor.js +6 -31
  218. package/.agents/scripts/lib/errors/index.js +2 -22
  219. package/.agents/scripts/lib/escomplex-ast-compat.js +22 -163
  220. package/.agents/scripts/lib/escomplex-kernel.js +21 -123
  221. package/.agents/scripts/lib/feedback-loop/graduator-core.js +94 -419
  222. package/.agents/scripts/lib/feedback-loop/prior-feedback-fetcher.js +20 -98
  223. package/.agents/scripts/lib/feedback-loop/retro-proposals-graduator.js +27 -149
  224. package/.agents/scripts/lib/findings/audit-ledger.js +23 -97
  225. package/.agents/scripts/lib/findings/classify-finding.js +14 -69
  226. package/.agents/scripts/lib/findings/promote-finding.js +14 -112
  227. package/.agents/scripts/lib/findings/provenance-field.js +11 -52
  228. package/.agents/scripts/lib/findings/route-finding.js +37 -255
  229. package/.agents/scripts/lib/findings/semantic-issue-search.js +14 -59
  230. package/.agents/scripts/lib/findings/severity.js +18 -104
  231. package/.agents/scripts/lib/format-generated-json.js +12 -44
  232. package/.agents/scripts/lib/full-suite-lock.js +160 -429
  233. package/.agents/scripts/lib/full-suite-queue.js +213 -0
  234. package/.agents/scripts/lib/gates/baseline-store.js +5 -9
  235. package/.agents/scripts/lib/gates/friction.js +1 -3
  236. package/.agents/scripts/lib/generated/agentrc-validator.js +2 -2
  237. package/.agents/scripts/lib/gh-exec.js +123 -191
  238. package/.agents/scripts/lib/git/cached-fetch.js +9 -52
  239. package/.agents/scripts/lib/git/sync-from-base.js +15 -107
  240. package/.agents/scripts/lib/git-branch-cleanup.js +14 -61
  241. package/.agents/scripts/lib/git-branch-lifecycle.js +16 -87
  242. package/.agents/scripts/lib/git-utils.js +37 -161
  243. package/.agents/scripts/lib/github/framework-repo.js +8 -71
  244. package/.agents/scripts/lib/github-url.js +2 -17
  245. package/.agents/scripts/lib/import-graph.js +11 -38
  246. package/.agents/scripts/lib/install-cmd-parser.js +4 -13
  247. package/.agents/scripts/lib/json-utils.js +3 -18
  248. package/.agents/scripts/lib/label-constants.js +16 -111
  249. package/.agents/scripts/lib/label-taxonomy.js +4 -30
  250. package/.agents/scripts/lib/maintainability-engine.js +12 -80
  251. package/.agents/scripts/lib/maintainability-unscorable.js +5 -25
  252. package/.agents/scripts/lib/maintainability-utils.js +16 -92
  253. package/.agents/scripts/lib/mandrel-catalog.js +12 -70
  254. package/.agents/scripts/lib/notifications/notifier.js +13 -38
  255. package/.agents/scripts/lib/npm-scripts.js +4 -23
  256. package/.agents/scripts/lib/observability/metrics-ledger.js +16 -76
  257. package/.agents/scripts/lib/observability/runtime-friction.js +44 -286
  258. package/.agents/scripts/lib/observability/signal-validator.js +5 -37
  259. package/.agents/scripts/lib/observability/signals-writer.js +11 -121
  260. package/.agents/scripts/lib/observability/source-classifier.js +22 -203
  261. package/.agents/scripts/lib/observability/terse-result.js +14 -47
  262. package/.agents/scripts/lib/onboard/init-tail.js +13 -74
  263. package/.agents/scripts/lib/onboard/scaffold-docs.js +11 -34
  264. package/.agents/scripts/lib/orchestration/acceptance-eval-decision.js +25 -139
  265. package/.agents/scripts/lib/orchestration/auto-merge-cwd.js +11 -66
  266. package/.agents/scripts/lib/orchestration/behind-recovery.js +10 -55
  267. package/.agents/scripts/lib/orchestration/ceremony-routing.js +28 -156
  268. package/.agents/scripts/lib/orchestration/change-set.js +7 -36
  269. package/.agents/scripts/lib/orchestration/check-baselines/phases/compare.js +9 -46
  270. package/.agents/scripts/lib/orchestration/check-baselines/phases/evaluate.js +11 -44
  271. package/.agents/scripts/lib/orchestration/check-baselines/phases/floors.js +5 -24
  272. package/.agents/scripts/lib/orchestration/check-baselines/phases/friction.js +3 -12
  273. package/.agents/scripts/lib/orchestration/check-baselines/phases/parse-args.js +5 -38
  274. package/.agents/scripts/lib/orchestration/check-baselines/phases/pipeline.js +3 -8
  275. package/.agents/scripts/lib/orchestration/check-baselines/phases/refresh-ack.js +28 -136
  276. package/.agents/scripts/lib/orchestration/check-baselines/phases/report.js +3 -13
  277. package/.agents/scripts/lib/orchestration/check-state.js +92 -0
  278. package/.agents/scripts/lib/orchestration/ci-gap-intake.js +37 -144
  279. package/.agents/scripts/lib/orchestration/ci-rerun-guard.js +121 -157
  280. package/.agents/scripts/lib/orchestration/code-review.js +24 -128
  281. package/.agents/scripts/lib/orchestration/column-sync.js +23 -111
  282. package/.agents/scripts/lib/orchestration/complexity-gate.js +118 -462
  283. package/.agents/scripts/lib/orchestration/deliver-recover.js +36 -168
  284. package/.agents/scripts/lib/orchestration/dependency-analyzer.js +4 -35
  285. package/.agents/scripts/lib/orchestration/dependency-candidates.js +9 -41
  286. package/.agents/scripts/lib/orchestration/diff-magnitude.js +25 -115
  287. package/.agents/scripts/lib/orchestration/doc-reader.js +2 -6
  288. package/.agents/scripts/lib/orchestration/docs-digest.js +13 -51
  289. package/.agents/scripts/lib/orchestration/epic-candidates.js +13 -53
  290. package/.agents/scripts/lib/orchestration/epic-checklist.js +9 -33
  291. package/.agents/scripts/lib/orchestration/epic-container.js +41 -167
  292. package/.agents/scripts/lib/orchestration/epic-expansion.js +10 -40
  293. package/.agents/scripts/lib/orchestration/epic-rollup.js +55 -207
  294. package/.agents/scripts/lib/orchestration/file-assumption-enum.js +2 -22
  295. package/.agents/scripts/lib/orchestration/file-assumptions.js +45 -253
  296. package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-detect.js +9 -46
  297. package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-reap.js +7 -57
  298. package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches.js +21 -126
  299. package/.agents/scripts/lib/orchestration/git-cleanup/phases/cli.js +2 -6
  300. package/.agents/scripts/lib/orchestration/git-cleanup/phases/fast-forward.js +1 -4
  301. package/.agents/scripts/lib/orchestration/git-cleanup/phases/filters.js +1 -5
  302. package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes-ff.js +9 -34
  303. package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes.js +41 -190
  304. package/.agents/scripts/lib/orchestration/git-cleanup/phases/merged-tip.js +9 -45
  305. package/.agents/scripts/lib/orchestration/git-cleanup/phases/parse-args.js +1 -4
  306. package/.agents/scripts/lib/orchestration/git-cleanup/phases/phase-drivers.js +19 -85
  307. package/.agents/scripts/lib/orchestration/git-cleanup/phases/prompts.js +3 -17
  308. package/.agents/scripts/lib/orchestration/git-cleanup/phases/prune.js +1 -5
  309. package/.agents/scripts/lib/orchestration/git-cleanup/phases/render.js +16 -100
  310. package/.agents/scripts/lib/orchestration/git-cleanup/phases/stashes.js +1 -4
  311. package/.agents/scripts/lib/orchestration/lease-guard-shared.js +16 -67
  312. package/.agents/scripts/lib/orchestration/lifecycle/emit-ledger-event.js +9 -33
  313. package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-flip-failed.js +8 -29
  314. package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-unlanded.js +15 -68
  315. package/.agents/scripts/lib/orchestration/light-backstop.js +11 -49
  316. package/.agents/scripts/lib/orchestration/light-escalation.js +21 -89
  317. package/.agents/scripts/lib/orchestration/light-suitability.js +37 -307
  318. package/.agents/scripts/lib/orchestration/merge-block-class.js +39 -216
  319. package/.agents/scripts/lib/orchestration/merge-poll.js +104 -377
  320. package/.agents/scripts/lib/orchestration/pinned-identifier-lint.js +17 -57
  321. package/.agents/scripts/lib/orchestration/plan-context.js +55 -318
  322. package/.agents/scripts/lib/orchestration/plan-critic-conditions.js +22 -79
  323. package/.agents/scripts/lib/orchestration/plan-critics-evaluate.js +5 -31
  324. package/.agents/scripts/lib/orchestration/plan-metrics.js +29 -108
  325. package/.agents/scripts/lib/orchestration/plan-navigation.js +8 -27
  326. package/.agents/scripts/lib/orchestration/plan-persist/acceptance-handle-repair.js +12 -49
  327. package/.agents/scripts/lib/orchestration/plan-persist/audit-provenance.js +18 -73
  328. package/.agents/scripts/lib/orchestration/plan-persist/changes-repair.js +16 -78
  329. package/.agents/scripts/lib/orchestration/plan-persist/cross-plan-links.js +6 -30
  330. package/.agents/scripts/lib/orchestration/plan-persist/epic-adoption.js +14 -65
  331. package/.agents/scripts/lib/orchestration/plan-persist/epic-ops.js +21 -76
  332. package/.agents/scripts/lib/orchestration/plan-persist/external-deps.js +6 -43
  333. package/.agents/scripts/lib/orchestration/plan-persist/persist-helpers.js +14 -68
  334. package/.agents/scripts/lib/orchestration/plan-persist/plan-context-source.js +9 -41
  335. package/.agents/scripts/lib/orchestration/plan-persist/run-plan-persist.js +71 -289
  336. package/.agents/scripts/lib/orchestration/plan-persist/soft-findings.js +2 -12
  337. package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +96 -362
  338. package/.agents/scripts/lib/orchestration/plan-persist/summary.js +9 -39
  339. package/.agents/scripts/lib/orchestration/plan-persist/supersede-ops.js +60 -186
  340. package/.agents/scripts/lib/orchestration/plan-persist/wave-collision-gate.js +9 -49
  341. package/.agents/scripts/lib/orchestration/plan-persist/wave-serialisation.js +7 -28
  342. package/.agents/scripts/lib/orchestration/plan-reachability.js +13 -42
  343. package/.agents/scripts/lib/orchestration/plan-run-labels/reap.js +16 -91
  344. package/.agents/scripts/lib/orchestration/plan-runner/worktree-sweep.js +16 -54
  345. package/.agents/scripts/lib/orchestration/plan-text-hygiene.js +10 -52
  346. package/.agents/scripts/lib/orchestration/planning/authoring-context.js +14 -109
  347. package/.agents/scripts/lib/orchestration/planning/memory-pool-advisory.js +11 -83
  348. package/.agents/scripts/lib/orchestration/pr-watch.js +48 -306
  349. package/.agents/scripts/lib/orchestration/project-meta-cache.js +15 -80
  350. package/.agents/scripts/lib/orchestration/project-meta-resolver.js +10 -51
  351. package/.agents/scripts/lib/orchestration/reassert-status-column.js +12 -76
  352. package/.agents/scripts/lib/orchestration/remote-verifier.js +12 -36
  353. package/.agents/scripts/lib/orchestration/resolve-stories.js +33 -164
  354. package/.agents/scripts/lib/orchestration/retro-proposals.js +66 -361
  355. package/.agents/scripts/lib/orchestration/review-base-ref.js +9 -43
  356. package/.agents/scripts/lib/orchestration/review-depth.js +12 -91
  357. package/.agents/scripts/lib/orchestration/review-providers/codex.js +10 -111
  358. package/.agents/scripts/lib/orchestration/review-providers/degraded-gates.js +13 -71
  359. package/.agents/scripts/lib/orchestration/review-providers/findings-renderer.js +7 -51
  360. package/.agents/scripts/lib/orchestration/review-providers/mi-exemptions.js +8 -53
  361. package/.agents/scripts/lib/orchestration/review-providers/native.js +30 -214
  362. package/.agents/scripts/lib/orchestration/review-providers/parse-findings.js +7 -52
  363. package/.agents/scripts/lib/orchestration/review-providers/review-depth.js +4 -33
  364. package/.agents/scripts/lib/orchestration/review-providers/review-provider-factory.js +11 -71
  365. package/.agents/scripts/lib/orchestration/review-providers/scoped-lint.js +19 -131
  366. package/.agents/scripts/lib/orchestration/review-providers/security-review.js +6 -89
  367. package/.agents/scripts/lib/orchestration/review-providers/types.js +26 -56
  368. package/.agents/scripts/lib/orchestration/review-providers/ultrareview.js +3 -46
  369. package/.agents/scripts/lib/orchestration/run-epilogue.js +245 -326
  370. package/.agents/scripts/lib/orchestration/run-scoped-config.js +55 -159
  371. package/.agents/scripts/lib/orchestration/single-story-close/close-note.js +7 -34
  372. package/.agents/scripts/lib/orchestration/single-story-close/failed-terminal.js +16 -89
  373. package/.agents/scripts/lib/orchestration/single-story-close/gate-log.js +18 -109
  374. package/.agents/scripts/lib/orchestration/single-story-close/phases/auto-merge.js +83 -239
  375. package/.agents/scripts/lib/orchestration/single-story-close/phases/base-sync.js +20 -82
  376. package/.agents/scripts/lib/orchestration/single-story-close/phases/close-validation.js +103 -97
  377. package/.agents/scripts/lib/orchestration/single-story-close/phases/code-review.js +8 -64
  378. package/.agents/scripts/lib/orchestration/single-story-close/phases/confirm-merge.js +136 -486
  379. package/.agents/scripts/lib/orchestration/single-story-close/phases/conventional-subject.js +30 -134
  380. package/.agents/scripts/lib/orchestration/single-story-close/phases/graphql-preflight.js +96 -0
  381. package/.agents/scripts/lib/orchestration/single-story-close/phases/lock-wait-pending.js +49 -0
  382. package/.agents/scripts/lib/orchestration/single-story-close/phases/normalize-pr-title.js +13 -86
  383. package/.agents/scripts/lib/orchestration/single-story-close/phases/options.js +20 -95
  384. package/.agents/scripts/lib/orchestration/single-story-close/phases/post-land.js +46 -203
  385. package/.agents/scripts/lib/orchestration/single-story-close/phases/pre-gate-steps.js +8 -50
  386. package/.agents/scripts/lib/orchestration/single-story-close/phases/pull-request.js +12 -83
  387. package/.agents/scripts/lib/orchestration/single-story-close/phases/push.js +6 -39
  388. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-block.js +1 -6
  389. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-outcome.js +4 -28
  390. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-override.js +6 -51
  391. package/.agents/scripts/lib/orchestration/single-story-close/phases/worktree-reap.js +6 -34
  392. package/.agents/scripts/lib/orchestration/single-story-close/phases/wrong-tree-guard.js +23 -121
  393. package/.agents/scripts/lib/orchestration/single-story-close/runner.js +180 -273
  394. package/.agents/scripts/lib/orchestration/single-story-lease-guard.js +15 -69
  395. package/.agents/scripts/lib/orchestration/story-body-gate.js +4 -23
  396. package/.agents/scripts/lib/orchestration/story-close/baseline-upward-writeback.js +50 -179
  397. package/.agents/scripts/lib/orchestration/story-close/context-budget-writeback.js +11 -41
  398. package/.agents/scripts/lib/orchestration/story-close/format-autofix.js +23 -311
  399. package/.agents/scripts/lib/orchestration/story-close/phases/local-lens-review.js +22 -147
  400. package/.agents/scripts/lib/orchestration/story-close/phases/review-core.js +16 -67
  401. package/.agents/scripts/lib/orchestration/story-deliver-terminal-schema.js +12 -68
  402. package/.agents/scripts/lib/orchestration/story-deliver-terminal.js +42 -200
  403. package/.agents/scripts/lib/orchestration/story-follow-ups.js +167 -252
  404. package/.agents/scripts/lib/orchestration/story-init-envelope.js +52 -0
  405. package/.agents/scripts/lib/orchestration/story-init-remote.js +2 -6
  406. package/.agents/scripts/lib/orchestration/story-reachability.js +3 -23
  407. package/.agents/scripts/lib/orchestration/task-body-validator.js +12 -135
  408. package/.agents/scripts/lib/orchestration/ticket-lease.js +28 -131
  409. package/.agents/scripts/lib/orchestration/ticket-validator-conflicts.js +15 -149
  410. package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +5 -33
  411. package/.agents/scripts/lib/orchestration/ticket-validator.js +63 -344
  412. package/.agents/scripts/lib/orchestration/ticketing/bulk.js +51 -244
  413. package/.agents/scripts/lib/orchestration/ticketing/reads.js +39 -261
  414. package/.agents/scripts/lib/orchestration/ticketing/state.js +14 -68
  415. package/.agents/scripts/lib/orchestration/ticketing/transition.js +46 -263
  416. package/.agents/scripts/lib/orchestration/ticketing.js +2 -26
  417. package/.agents/scripts/lib/orchestration/verify-credit.js +18 -79
  418. package/.agents/scripts/lib/orchestration/worktree-dirty.js +5 -30
  419. package/.agents/scripts/lib/path-security.js +3 -6
  420. package/.agents/scripts/lib/plan-phase-cleanup.js +9 -49
  421. package/.agents/scripts/lib/preflight-runner.js +13 -69
  422. package/.agents/scripts/lib/process-group.js +143 -0
  423. package/.agents/scripts/lib/project-root.js +2 -8
  424. package/.agents/scripts/lib/provider-factory.js +2 -25
  425. package/.agents/scripts/lib/qa/console-allowlist.js +10 -59
  426. package/.agents/scripts/lib/qa/qa-session.js +15 -69
  427. package/.agents/scripts/lib/qa/redact-evidence.js +18 -129
  428. package/.agents/scripts/lib/qa/resolve-qa-contract.js +26 -135
  429. package/.agents/scripts/lib/qa/resolve-selection.js +16 -84
  430. package/.agents/scripts/lib/reserved-test-ids.js +9 -47
  431. package/.agents/scripts/lib/runtime-deps/dep-resolution.js +13 -53
  432. package/.agents/scripts/lib/runtime-deps/ensure-installed.js +10 -44
  433. package/.agents/scripts/lib/runtime-deps/manifest.js +10 -30
  434. package/.agents/scripts/lib/runtime-deps/parser-major.js +15 -51
  435. package/.agents/scripts/lib/runtime-deps/preflight.js +4 -22
  436. package/.agents/scripts/lib/runtime-deps/scan-imports.js +11 -55
  437. package/.agents/scripts/lib/signals/detectors/common.js +12 -38
  438. package/.agents/scripts/lib/signals/index.js +2 -19
  439. package/.agents/scripts/lib/signals/schema.js +14 -109
  440. package/.agents/scripts/lib/signals/write.js +2 -11
  441. package/.agents/scripts/lib/single-story/confirm-merge.js +31 -72
  442. package/.agents/scripts/lib/single-story/story-merged-notify.js +8 -49
  443. package/.agents/scripts/lib/single-story-sweep/protection-ctx.js +4 -26
  444. package/.agents/scripts/lib/single-story-sweep/protection.js +13 -100
  445. package/.agents/scripts/lib/single-story-sweep/sweep-lock.js +60 -258
  446. package/.agents/scripts/lib/single-story-sweep.js +14 -97
  447. package/.agents/scripts/lib/skills/parse-skill.js +13 -59
  448. package/.agents/scripts/lib/skills/skills-index.js +8 -29
  449. package/.agents/scripts/lib/skills/walk-skill-files.js +17 -78
  450. package/.agents/scripts/lib/source-extensions.js +11 -42
  451. package/.agents/scripts/lib/source-text/strip-js-comments.js +8 -41
  452. package/.agents/scripts/lib/stdio-flush.js +9 -36
  453. package/.agents/scripts/lib/story-adjacency.js +8 -40
  454. package/.agents/scripts/lib/story-body/body-format-lints.js +51 -66
  455. package/.agents/scripts/lib/story-body/footer-block.js +11 -44
  456. package/.agents/scripts/lib/story-body/story-body.js +123 -344
  457. package/.agents/scripts/lib/temp-retention.js +42 -143
  458. package/.agents/scripts/lib/templates/decomposer-prompts.js +18 -80
  459. package/.agents/scripts/lib/test-env.js +12 -65
  460. package/.agents/scripts/lib/test-run-credit.js +10 -65
  461. package/.agents/scripts/lib/test-runner-contract.js +19 -74
  462. package/.agents/scripts/lib/test-temp.js +38 -184
  463. package/.agents/scripts/lib/test-tiers.js +12 -96
  464. package/.agents/scripts/lib/ticket-body-sections.js +21 -96
  465. package/.agents/scripts/lib/transpile.js +15 -74
  466. package/.agents/scripts/lib/util/concurrent-map.js +6 -25
  467. package/.agents/scripts/lib/util/parse-id-list.js +8 -34
  468. package/.agents/scripts/lib/util/poll-loop.js +8 -28
  469. package/.agents/scripts/lib/util/with-timeout.js +2 -11
  470. package/.agents/scripts/lib/validation-evidence.js +21 -96
  471. package/.agents/scripts/lib/wave-runner/footprint.js +17 -70
  472. package/.agents/scripts/lib/wave-runner/live-probe.js +67 -209
  473. package/.agents/scripts/lib/wave-runner/ready-set.js +72 -301
  474. package/.agents/scripts/lib/workers/crap-worker.js +11 -64
  475. package/.agents/scripts/lib/workers/maintainability-report-worker.js +8 -45
  476. package/.agents/scripts/lib/workers/maintainability-worker.js +5 -21
  477. package/.agents/scripts/lib/workers/serve-worker-messages.js +2 -18
  478. package/.agents/scripts/lib/workflow-closure.js +22 -105
  479. package/.agents/scripts/lib/workspace-provisioner.js +16 -54
  480. package/.agents/scripts/lib/worktree/git-hooks.js +15 -60
  481. package/.agents/scripts/lib/worktree/lifecycle/force-drain.js +20 -60
  482. package/.agents/scripts/lib/worktree/lifecycle/merge-reachability.js +10 -62
  483. package/.agents/scripts/lib/worktree/lifecycle/pending-cleanup.js +22 -86
  484. package/.agents/scripts/lib/worktree/lifecycle/reap.js +24 -126
  485. package/.agents/scripts/lib/worktree/lifecycle-manager.js +2 -20
  486. package/.agents/scripts/lib/worktree/node-modules-strategy.js +46 -180
  487. package/.agents/scripts/lib/worktree-manager.js +15 -40
  488. package/.agents/scripts/lint-issue-body.js +12 -68
  489. package/.agents/scripts/mandrel-update-preflight.js +10 -70
  490. package/.agents/scripts/merge-baseline.js +30 -105
  491. package/.agents/scripts/nav-registry-diff.js +22 -108
  492. package/.agents/scripts/notify.js +12 -69
  493. package/.agents/scripts/plan-context.js +97 -92
  494. package/.agents/scripts/plan-critics.js +12 -66
  495. package/.agents/scripts/plan-persist.js +71 -137
  496. package/.agents/scripts/plan-run-epilogue.js +20 -43
  497. package/.agents/scripts/pr-watch-with-update.js +79 -263
  498. package/.agents/scripts/providers/github/auth.js +3 -8
  499. package/.agents/scripts/providers/github/blocked-by-add.js +14 -61
  500. package/.agents/scripts/providers/github/board-add.js +5 -21
  501. package/.agents/scripts/providers/github/branch-protection.js +11 -43
  502. package/.agents/scripts/providers/github/cache.js +2 -14
  503. package/.agents/scripts/providers/github/comments.js +7 -40
  504. package/.agents/scripts/providers/github/compose.js +3 -19
  505. package/.agents/scripts/providers/github/errors.js +22 -125
  506. package/.agents/scripts/providers/github/issues.js +31 -123
  507. package/.agents/scripts/providers/github/labels.js +24 -124
  508. package/.agents/scripts/providers/github/mappers.js +5 -27
  509. package/.agents/scripts/providers/github/merge-methods.js +3 -22
  510. package/.agents/scripts/providers/github/project-board.js +2 -17
  511. package/.agents/scripts/providers/github/projects-v2-graphql.js +3 -6
  512. package/.agents/scripts/providers/github/request-helpers.js +5 -32
  513. package/.agents/scripts/providers/github/search-budget.js +9 -39
  514. package/.agents/scripts/providers/github/search-query.js +5 -26
  515. package/.agents/scripts/providers/github/sub-issue-add.js +15 -65
  516. package/.agents/scripts/providers/github/sub-issues.js +7 -36
  517. package/.agents/scripts/providers/github/tickets.js +32 -134
  518. package/.agents/scripts/providers/github.js +18 -59
  519. package/.agents/scripts/prune-plan-run-labels.js +12 -46
  520. package/.agents/scripts/quality-preview.js +35 -220
  521. package/.agents/scripts/resolve-doc-tiers.js +3 -26
  522. package/.agents/scripts/resolve-stories.js +16 -67
  523. package/.agents/scripts/resync-status-column.js +6 -25
  524. package/.agents/scripts/run-tests.js +29 -104
  525. package/.agents/scripts/single-story-close.js +23 -135
  526. package/.agents/scripts/single-story-confirm-merge.js +32 -139
  527. package/.agents/scripts/single-story-init.js +47 -259
  528. package/.agents/scripts/stories-wave-tick.js +179 -415
  529. package/.agents/scripts/sync-agentrc.js +3 -21
  530. package/.agents/scripts/sync-claude-agents.js +9 -55
  531. package/.agents/scripts/sync-claude-commands.js +20 -110
  532. package/.agents/scripts/test-wrapper.js +6 -43
  533. package/.agents/scripts/update-coverage-baseline.js +5 -22
  534. package/.agents/scripts/update-crap-baseline.js +7 -30
  535. package/.agents/scripts/update-duplication-baseline.js +16 -92
  536. package/.agents/scripts/update-maintainability-baseline.js +8 -62
  537. package/.agents/scripts/update-ticket-state.js +1 -7
  538. package/.agents/scripts/validate-skills.js +6 -26
  539. package/.agents/skills/core/gates-and-baselines/reference.md +0 -1
  540. package/.agents/skills/skills.index.json +2 -2
  541. package/.agents/skills/stack/qa/playwright/SKILL.md +26 -0
  542. package/.agents/templates/agent-protocol.md +2 -2
  543. package/.agents/templates/docs/audit-sweep-runbook.md +3 -4
  544. package/.agents/workflows/audit-accessibility.md +4 -7
  545. package/.agents/workflows/audit-adrs.md +3 -6
  546. package/.agents/workflows/audit-architecture.md +3 -11
  547. package/.agents/workflows/audit-baselines.md +6 -9
  548. package/.agents/workflows/audit-clean-code.md +8 -12
  549. package/.agents/workflows/audit-data-model.md +3 -7
  550. package/.agents/workflows/audit-dependencies.md +4 -7
  551. package/.agents/workflows/audit-devops.md +4 -8
  552. package/.agents/workflows/audit-documentation.md +1 -4
  553. package/.agents/workflows/audit-mobile.md +4 -7
  554. package/.agents/workflows/audit-navigability.md +3 -6
  555. package/.agents/workflows/audit-performance.md +2 -4
  556. package/.agents/workflows/audit-privacy.md +4 -7
  557. package/.agents/workflows/audit-quality.md +4 -7
  558. package/.agents/workflows/audit-security.md +4 -7
  559. package/.agents/workflows/audit-seo.md +4 -7
  560. package/.agents/workflows/audit-sre.md +4 -7
  561. package/.agents/workflows/audit-to-stories.md +17 -30
  562. package/.agents/workflows/audit-ux-ui.md +4 -7
  563. package/.agents/workflows/helpers/acceptance-self-eval.md +84 -157
  564. package/.agents/workflows/helpers/audit-lens-core.md +1 -1
  565. package/.agents/workflows/helpers/code-quality-guardrails.md +12 -15
  566. package/.agents/workflows/helpers/code-review.md +4 -2
  567. package/.agents/workflows/helpers/deliver-digest.md +37 -28
  568. package/.agents/workflows/helpers/deliver-light.md +92 -101
  569. package/.agents/workflows/helpers/deliver-reference.md +162 -220
  570. package/.agents/workflows/helpers/deliver-story-reference.md +197 -607
  571. package/.agents/workflows/helpers/deliver-story.md +17 -18
  572. package/.agents/workflows/helpers/plan-reference.md +125 -167
  573. package/.agents/workflows/helpers/qa-core.md +12 -0
  574. package/.agents/workflows/mandrel-deliver.md +47 -31
  575. package/.agents/workflows/mandrel-plan.md +22 -21
  576. package/.agents/workflows/mandrel-update.md +36 -21
  577. package/.agents/workflows/memory-consolidate.md +1 -1
  578. package/.agents/workflows/qa-assist.md +27 -71
  579. package/.agents/workflows/qa-explore.md +19 -59
  580. package/.agents/workflows/qa-run.md +11 -33
  581. package/README.md +1 -1
  582. package/bin/mandrel.js +5 -46
  583. package/bin/postinstall.js +18 -107
  584. package/docs/CHANGELOG.md +60 -0
  585. package/lib/cli/doctor.js +11 -71
  586. package/lib/cli/init.js +26 -165
  587. package/lib/cli/migrate.js +5 -64
  588. package/lib/cli/registry.js +84 -467
  589. package/lib/cli/sync-agents.js +4 -64
  590. package/lib/cli/sync-commands.js +11 -64
  591. package/lib/cli/sync.js +34 -213
  592. package/lib/cli/uninstall.js +40 -219
  593. package/lib/cli/update.js +326 -523
  594. package/lib/cli/version-check.js +8 -72
  595. package/lib/cli/version-helpers.js +14 -87
  596. package/lib/migrations/helpers/retire-agentrc-key.js +11 -52
  597. package/lib/migrations/index.js +17 -92
  598. package/lib/migrations/steps/2.1.0-retire-mi-drop-knobs.js +2 -15
  599. package/lib/migrations/steps/2.1.0-retire-verify-concurrency-cap.js +1 -13
  600. package/lib/migrations/steps/2.11.0-retire-max-seed-words.js +2 -15
  601. package/lib/migrations/steps/2.2.0-retire-epic-ac-tags.js +9 -38
  602. package/lib/migrations/steps/2.20.0-retire-codebase-snapshot.js +1 -13
  603. package/lib/migrations/steps/2.32.0-retire-lint-baseline-command.js +2 -27
  604. package/lib/migrations/steps/2.57.0-retire-delivery-limit-knobs.js +2 -23
  605. package/lib/migrations/steps/2.57.0-retire-planning-limit-knobs.js +2 -27
  606. package/lib/migrations/steps/2.60.0-retire-audit-results-autofile.js +21 -0
  607. package/lib/migrations/steps/strip-removed-agentrc-keys.js +333 -0
  608. package/package.json +17 -14
  609. package/.agents/docs/SDLC.md +0 -590
  610. package/.agents/docs/quality-gates.md +0 -1179
  611. package/.agents/rules/known-tooling-behavior.md +0 -150
  612. package/.agents/rules/orchestration-error-handling.md +0 -61
  613. package/.agents/rules/test-seams.md +0 -59
  614. package/.agents/schemas/baselines/lighthouse.schema.json +0 -59
  615. package/.agents/schemas/baselines/lint.schema.json +0 -47
  616. package/.agents/schemas/model-attribution.schema.json +0 -53
  617. package/.agents/scripts/check-action-pinning.js +0 -260
  618. package/.agents/scripts/check-audit-attribution.js +0 -302
  619. package/.agents/scripts/check-baseline-drift.js +0 -211
  620. package/.agents/scripts/check-baseline-scope.js +0 -362
  621. package/.agents/scripts/check-generated-validator.js +0 -202
  622. package/.agents/scripts/check-knip-entries.js +0 -159
  623. package/.agents/scripts/check-lifecycle-lint.js +0 -294
  624. package/.agents/scripts/check-pinned-override-notes.js +0 -102
  625. package/.agents/scripts/check-schema-references.js +0 -366
  626. package/.agents/scripts/check-test-portability.js +0 -512
  627. package/.agents/scripts/check-workflow-citations.js +0 -332
  628. package/.agents/scripts/check-workflow-cli-lint.js +0 -299
  629. package/.agents/scripts/check-workflow-timeouts.js +0 -291
  630. package/.agents/scripts/install-matrix-assert.js +0 -326
  631. package/.agents/scripts/lib/audit-advisories.js +0 -195
  632. package/.agents/scripts/lib/audit-attribution.js +0 -134
  633. package/.agents/scripts/lib/baselines/drift-detector.js +0 -351
  634. package/.agents/scripts/lib/baselines/kinds/lighthouse.js +0 -87
  635. package/.agents/scripts/lib/baselines/kinds/lint.js +0 -184
  636. package/.agents/scripts/lib/baselines/orphan-pruner.js +0 -233
  637. package/.agents/scripts/lib/baselines/scope-assert.js +0 -223
  638. package/.agents/scripts/lib/baselines/scope-inventory.js +0 -314
  639. package/.agents/scripts/lib/c8-cli-path.js +0 -21
  640. package/.agents/scripts/lib/config/gates/lighthouse.schema.js +0 -51
  641. package/.agents/scripts/lib/config/gates/lint.schema.js +0 -18
  642. package/.agents/scripts/lib/dynamic-workflow/architecture-report-contract.js +0 -70
  643. package/.agents/scripts/lib/dynamic-workflow/audit-orchestrator.js +0 -284
  644. package/.agents/scripts/lib/dynamic-workflow/clean-code-report-contract.js +0 -80
  645. package/.agents/scripts/lib/dynamic-workflow/degraded-coverage.js +0 -81
  646. package/.agents/scripts/lib/dynamic-workflow/documentation-report-contract.js +0 -87
  647. package/.agents/scripts/lib/dynamic-workflow/performance-report-contract.js +0 -74
  648. package/.agents/scripts/lib/dynamic-workflow/quality-report-contract.js +0 -90
  649. package/.agents/scripts/lib/dynamic-workflow/report-contract-core.js +0 -43
  650. package/.agents/scripts/lib/dynamic-workflow/security-report-contract.js +0 -83
  651. package/.agents/scripts/lib/fs-walk.js +0 -52
  652. package/.agents/scripts/lib/knip-config-resolver.js +0 -181
  653. package/.agents/scripts/lib/knip-entry-sync.js +0 -452
  654. package/.agents/scripts/lib/orchestration/model-attribution.js +0 -418
  655. package/.agents/scripts/lib/orchestration/story-plan-state.js +0 -33
  656. package/.agents/scripts/lib/orchestration/structured-comment-parser.js +0 -67
  657. package/.agents/scripts/lib/pinned-override-notes.js +0 -88
  658. package/.agents/scripts/lib/pinned-override-resolve.js +0 -212
  659. package/.agents/scripts/lib/test-isolate/cli-options.js +0 -93
  660. package/.agents/scripts/lib/test-isolate/env-snapshot-loader.js +0 -52
  661. package/.agents/scripts/lib/test-isolate/list-files.js +0 -90
  662. package/.agents/scripts/lib/test-isolate/parse-tap.js +0 -75
  663. package/.agents/scripts/lib/test-isolate/progress-log.js +0 -45
  664. package/.agents/scripts/lib/test-isolate/render-report.js +0 -97
  665. package/.agents/scripts/lib/test-isolate/run-isolate.js +0 -87
  666. package/.agents/scripts/lib/test-isolate/runner.js +0 -483
  667. package/.agents/scripts/lib/test-profile/parse-tap.js +0 -136
  668. package/.agents/scripts/lib/test-profile/render-report.js +0 -45
  669. package/.agents/scripts/lint-label-vocabulary.js +0 -214
  670. package/.agents/scripts/post-structured-comment.js +0 -127
  671. package/.agents/scripts/provision-git-hooks.js +0 -85
  672. package/.agents/scripts/prune-baseline-orphans.js +0 -181
  673. package/.agents/scripts/run-coverage.js +0 -197
  674. package/.agents/scripts/run-lint.js +0 -133
  675. package/.agents/scripts/run-test-profile.js +0 -129
  676. package/.agents/scripts/run-verify.js +0 -118
  677. package/.agents/scripts/test-isolate.js +0 -55
  678. package/.agents/scripts/update-dead-exports-baseline.js +0 -321
@@ -1,51 +1,22 @@
1
1
  /**
2
- * GitHub Provider — shared "set native blocked-by dependency" helper.
3
- *
4
- * Story #4067 — after issue creation during Phase 8 decomposition, each
5
- * Story's `depends_on` graph is known as a set of sibling slugs. This
6
- * helper translates those slug-to-issueNumber pairs into native GitHub
7
- * "blocked by" dependency edges so maintainers can see blocking
8
- * relationships directly in the GitHub UI.
9
- *
10
- * API surface used:
11
- * Read: GET /repos/{owner}/{repo}/issues/{issue_number}/dependencies/blocked_by
12
- * Write: POST /repos/{owner}/{repo}/issues/{issue_number}/dependencies/blocked_by
13
- * body: { "issue_id": <integer db id of the blocking issue> }
14
- *
15
- * Contract:
16
- * - **Idempotent** — reads existing edges first; only POSTs missing ones.
17
- * - **Non-fatal** — catches all errors per edge, warns, and continues.
18
- * The overall function never throws; errors are returned in a summary.
19
- * - **No-op on empty input** — returns immediately when no depends_on
20
- * edges are present or the slug→issueNumber map is empty.
2
+ * GitHub Provider — writes Story `depends_on` slugs as native "blocked by"
3
+ * edges (`POST .../dependencies/blocked_by` with the blocker's db id).
4
+ * Idempotent (reads existing edges first) and non-fatal: errors are counted
5
+ * in the summary, never thrown.
21
6
  */
22
7
 
23
8
  import { Logger } from '../../lib/Logger.js';
24
9
  import { concurrentMap } from '../../lib/util/concurrent-map.js';
25
10
  import { paginateRest } from './request-helpers.js';
26
11
 
27
- /**
28
- * Bounded concurrency for the GitHub dependency-edge round-trips. Kept modest
29
- * to respect GitHub's secondary rate limits while still collapsing the wall-
30
- * clock latency from `sum(round-trips)` toward `sum(round-trips) / concurrency`.
31
- */
12
+ /** Modest, to stay clear of GitHub's secondary rate limits. */
32
13
  const EDGE_CONCURRENCY = 5;
33
14
 
34
15
  /**
35
- * Fetch the existing blocked-by database ids for a given issue, **paginated
36
- * to exhaustion**.
37
- *
38
- * This read is the idempotency check: an edge it fails to see is re-POSTed.
39
- * Reading only the first page therefore made the writer non-idempotent past
40
- * the page boundary — every edge beyond it looked missing on every run
41
- * (Story #5046). `paginateRest` walks the pages and carries the shared
42
- * transient-retry and page-cap guards.
43
- *
44
- * Returns `[]` on any error so the caller falls back to posting the full
45
- * set of missing edges (worst case: a duplicate POST, which GitHub
46
- * handles idempotently). That non-fatal contract is deliberate and is the
47
- * inverse of the READ path in `lib/orchestration/resolve-stories.js`: a lost
48
- * write-side edge is cosmetic, a lost read-side edge removes a dispatch gate.
16
+ * Existing blocker db ids, paginated to exhaustion — this read is the
17
+ * idempotency check, so an unseen page means re-POSTed edges. Returns `[]` on
18
+ * error (worst case a duplicate POST): a lost write-side edge is cosmetic,
19
+ * unlike the read path in `resolve-stories.js`, where it drops a gate.
49
20
  *
50
21
  * @param {{ gh: object, owner: string, repo: string, issueNumber: number, paginate?: Function }} opts
51
22
  * @returns {Promise<number[]>} Database ids of the issues that currently block `issueNumber`.
@@ -74,11 +45,7 @@ async function fetchExistingBlockedBy({
74
45
  }
75
46
 
76
47
  /**
77
- * Set native GitHub "blocked by" dependency edges for a single issue.
78
- *
79
- * For each entry in `blockerInternalIds`, checks whether the edge already
80
- * exists and POSTs only the missing ones. Every individual POST failure is
81
- * caught, logged as a warning, and counted — the function never throws.
48
+ * POST only the missing edges for one issue; never throws.
82
49
  *
83
50
  * @param {{
84
51
  * gh: object,
@@ -108,9 +75,7 @@ async function addBlockedByEdges({
108
75
  });
109
76
  const existingSet = new Set(existing);
110
77
 
111
- // Partition up front so the skip count is deterministic regardless of the
112
- // concurrent POST dispatch order, then POST only the missing edges in
113
- // parallel under a modest cap.
78
+ // Partition first so the skip count doesn't depend on POST ordering.
114
79
  const missing = blockerInternalIds.filter((id) => !existingSet.has(id));
115
80
  const skipped = blockerInternalIds.length - missing.length;
116
81
 
@@ -145,16 +110,8 @@ async function addBlockedByEdges({
145
110
  }
146
111
 
147
112
  /**
148
- * Translate a Story's `depends_on` slug list into native GitHub "blocked
149
- * by" dependency edges, given the slug→issueNumber map from the reconciler
150
- * state and a `getTicket` hook to resolve database ids.
151
- *
152
- * Iterates every Story that has a non-empty `dependsOn` array; for each
153
- * depended-on slug, resolves the blocker's issue number (via the slug map),
154
- * then resolves the blocker's database id via `getTicket`, and calls
155
- * `addBlockedByEdges`. Any failure at any step is caught, logged as a
156
- * warning, and reflected in the returned summary — the function never
157
- * throws.
113
+ * For each Story's `dependsOn` slugs, resolve blocker issue number (slug map)
114
+ * then db id (`getTicket`), and add the edges. Never throws.
158
115
  *
159
116
  * @param {{
160
117
  * stories: Array<{ slug: string, dependsOn?: string[] }>,
@@ -184,11 +141,7 @@ export async function applyBlockedByDependencies({
184
141
  let edgesFailed = 0;
185
142
  let storiesProcessed = 0;
186
143
 
187
- // Process each story's GET + its POST batch under one bounded concurrentMap
188
- // so the per-story round-trips overlap. Each mapper returns its own counter
189
- // contribution; we sum them after the pass. The bodies swallow their own
190
- // errors (per-edge try/catch + the non-fatal contract), so concurrentMap
191
- // never sees a rejection and the no-throw guarantee is preserved.
144
+ // Mappers swallow their own errors, so concurrentMap never rejects.
192
145
  const perStory = await concurrentMap(
193
146
  stories,
194
147
  async (story) => {
@@ -1,30 +1,14 @@
1
1
  /**
2
- * GitHub Provider — shared "add issue to the Projects V2 board" helper.
3
- *
4
- * Story #3822 — single source of truth for the post-create board-add
5
- * step. Issues created through any create path (`createTicket`,
6
- * `createIssue` — which backs `/mandrel-plan` persist and the `/mandrel-plan`
7
- * Phase 4 Epic open) must land on the configured Projects V2 board
8
- * without relying on GitHub's "Auto-add to project" built-in workflow,
9
- * which is off by default on fresh boards and cannot be enabled via API.
10
- *
11
- * Contract:
12
- * - **No-op when no project number resolves** — returns
13
- * `{ added: false, reason: 'no-project-number' }` without touching
14
- * the network.
15
- * - **Non-fatal** — a failed add warns and returns
16
- * `{ added: false, reason: 'error' }`; it never throws, so issue
17
- * creation always survives a board hiccup.
18
- * - **Idempotent** — the underlying `addProjectV2ItemById` mutation
19
- * returns the existing item when the issue is already on the board,
20
- * so re-running the helper is safe.
2
+ * GitHub Provider — post-create "add issue to the Projects V2 board" step.
3
+ * Needed because GitHub's auto-add workflow is off on fresh boards and can't
4
+ * be enabled via API. Never throws (issue creation survives a board failure)
5
+ * and is idempotent (the mutation returns an existing item).
21
6
  */
22
7
 
23
8
  import { Logger } from '../../lib/Logger.js';
24
9
 
25
10
  /**
26
- * Add an issue (by GraphQL `node_id`) to the configured Projects V2
27
- * board.
11
+ * No project number → no-op without network.
28
12
  *
29
13
  * @param {{
30
14
  * nodeId: string|null|undefined,
@@ -1,33 +1,14 @@
1
1
  /**
2
- * GitHub Provider — BranchProtectionGateway.
3
- *
4
- * Owns `getBranchProtection` / `setBranchProtection` against
5
- * `/repos/{owner}/{repo}/branches/{branch}/protection`. Also exports the
6
- * shared `isNotFoundError` predicate that `branchExists` reuses on the
7
- * parent provider — keeping the 404-classification logic single-sourced.
8
- *
9
- * Extracted from `../github.js` in Story #2462 / Task #2478. Public
10
- * surface on `GitHubProvider` is unchanged — both branch-protection
11
- * methods delegate here.
12
- *
13
- * @see Story #2462 — Split GitHubProvider god class into seven composed gateways.
2
+ * GitHub Provider — BranchProtectionGateway, plus the shared
3
+ * `isNotFoundError` predicate.
14
4
  */
15
5
 
16
6
  import { withTransientRetry } from './errors.js';
17
7
  import { parseApiJson } from './request-helpers.js';
18
8
 
19
9
  /**
20
- * Detect a 404 across both error surfaces:
21
- *
22
- * - `gh-exec`-classified errors land as `GhNotFoundError`
23
- * (`err.name === 'GhNotFoundError'`); the underlying stderr may carry
24
- * "HTTP 404" / "not found" / "Resource not accessible".
25
- * - The legacy `GithubHttpClient` produced `Error('... failed (404): ...')`
26
- * strings; some tests still throw those (and submodules that still
27
- * delegate to the old transport do too).
28
- *
29
- * Used by `getBranchProtection` (distinguishes "no rule exists" from
30
- * transport failures) and `branchExists` on the parent provider.
10
+ * 404 across `GhNotFoundError`, `HTTP 404`/"not found" stderr, and the
11
+ * legacy `failed (404)` message shape some callers still throw.
31
12
  */
32
13
  export function isNotFoundError(err) {
33
14
  if (!err) return false;
@@ -39,7 +20,6 @@ export function isNotFoundError(err) {
39
20
  /HTTP 404/i.test(stderr) ||
40
21
  /HTTP 404/i.test(message) ||
41
22
  /\bnot found\b/i.test(stderr) ||
42
- // gh-exec carries the failing code on err.code for the test mock path.
43
23
  err?.code === 404
44
24
  );
45
25
  }
@@ -55,9 +35,8 @@ export class BranchProtectionGateway {
55
35
  }
56
36
 
57
37
  /**
58
- * Inspect branch-protection state. A 404 means "no protection rule
59
- * exists"; any other error propagates so the caller can distinguish
60
- * "intentionally unprotected" from "transport failure."
38
+ * 404 → `{ enabled: false }`; other errors propagate so "unprotected" and
39
+ * "transport failure" stay distinct.
61
40
  *
62
41
  * @field-manifest GET /repos/{owner}/{repo}/branches/{branch}/protection:
63
42
  * required_status_checks, enforce_admins,
@@ -78,12 +57,9 @@ export class BranchProtectionGateway {
78
57
  }
79
58
 
80
59
  /**
81
- * Set (create or merge) branch protection on `branch`. Additive on the
82
- * required-status-check `contexts` list (preserves operator-added
83
- * contexts), and honours optional behaviour-shifting overrides
84
- * (`enforceAdmins`, `requiredApprovingReviewCount`) so the consumer-
85
- * facing bootstrap can promote the framework's hands-off-pipeline
86
- * stance without silently flipping operator-tuned values.
60
+ * Create or merge protection. `contexts` are added, never removed; other
61
+ * operator-tuned values are kept unless `enforceAdmins` /
62
+ * `requiredApprovingReviewCount` explicitly override them.
87
63
  *
88
64
  * Returns `{ created, added, existing }`.
89
65
  *
@@ -109,9 +85,6 @@ export class BranchProtectionGateway {
109
85
  ? (current.raw?.required_status_checks?.contexts ?? [])
110
86
  : [];
111
87
 
112
- // Additive merge: keep every context the operator already configured
113
- // and append only those the prGate suite contributes that are not yet
114
- // present.
115
88
  const merged = [...existingContexts];
116
89
  const added = [];
117
90
  for (const ctx of contexts) {
@@ -121,9 +94,6 @@ export class BranchProtectionGateway {
121
94
  }
122
95
  }
123
96
 
124
- // Decide whether to override behaviour-shifting fields. Explicit
125
- // `undefined` from legacy callers falls through to the operator's
126
- // existing values (or the create-from-scratch defaults).
127
97
  const overrideEnforceAdmins = typeof opts?.enforceAdmins === 'boolean';
128
98
  const overrideApprovalCount =
129
99
  typeof opts?.requiredApprovingReviewCount === 'number';
@@ -139,8 +109,7 @@ export class BranchProtectionGateway {
139
109
 
140
110
  let prReviews;
141
111
  if (overrideApprovalCount) {
142
- // Preserve operator-set review flags (dismiss-stale, code-owners,
143
- // etc.) — only the count is promoted.
112
+ // Keep operator review flags; only the count is promoted.
144
113
  const baseReviews = current.enabled
145
114
  ? (current.raw?.required_pull_request_reviews ?? {})
146
115
  : {};
@@ -154,8 +123,7 @@ export class BranchProtectionGateway {
154
123
  : null;
155
124
  }
156
125
 
157
- // PUT requires every top-level field in the body — null disables a
158
- // section.
126
+ // PUT requires every top-level field; null disables a section.
159
127
  const body = current.enabled
160
128
  ? {
161
129
  required_status_checks: {
@@ -1,18 +1,6 @@
1
1
  /**
2
- * GitHub Provider — per-instance ticket cache.
3
- *
4
- * One bare `Map<id, { ticket, insertedAt }>` scoped to the lifetime of a
5
- * single `GitHubProvider`, shared by dispatcher, reconciler, and cascade.
6
- * The outer TTL wrapper is deliberately omitted because `peekFresh` already
7
- * bounds entries by a caller-supplied `maxAgeMs`, and every other reader
8
- * trusts the ticket mutators (`updateTicket` / `postComment`) to call
9
- * `invalidate` explicitly.
10
- *
11
- * Surface is intentionally narrow: only the methods the provider itself
12
- * reaches for live here (`has` / `peek` / `peekFresh` / `set` /
13
- * `primeIfAbsent` / `primeMany` / `invalidate`).
14
- *
15
- * Extracted from `../github.js` in Story #1846 / Task #1858.
2
+ * GitHub Provider — per-instance ticket cache. No TTL: `peekFresh` bounds age
3
+ * per call, and mutators invalidate explicitly.
16
4
  *
17
5
  * @param {{ now?: () => number }} [opts]
18
6
  * @returns {{
@@ -1,30 +1,12 @@
1
1
  /**
2
- * GitHub Provider — CommentGateway.
3
- *
4
- * Owns issue-comment CRUD against `/repos/{owner}/{repo}/issues/.../comments`.
5
- * `postComment` is the structured-comment writer (it prepends the visible
6
- * type-badge); the `<!-- ap:structured-comment ... -->` marker is added by
7
- * the upstream `upsertStructuredComment` ticketing helper before the body
8
- * lands here.
9
- *
10
- * Extracted from `../github.js` in Story #2462 / Task #2480. `postComment`,
11
- * `getTicketComments`, and `deleteComment` on `GitHubProvider` all delegate
12
- * here. Story #5008 dropped the repo-wide `getRecentComments` feed — the
13
- * telemetry dashboard that read it was retired and nothing else polls a
14
- * cross-issue comment stream.
15
- *
16
- * @see Story #2462 — Split GitHubProvider god class into seven composed gateways.
2
+ * GitHub Provider — CommentGateway: issue-comment CRUD. The structured
3
+ * marker is added upstream by `upsertStructuredComment`; this layer adds only
4
+ * the visible type badge.
17
5
  */
18
6
 
19
7
  import { paginateRest, parseApiJson } from './request-helpers.js';
20
8
 
21
- // Structured-comment badge — preserved verbatim from the legacy
22
- // `./github/comments.js`. The upstream `upsertStructuredComment` ticketing
23
- // helper prepends the `<!-- ap:structured-comment ... -->` marker before
24
- // the body reaches `postComment`; this badge is the visible header
25
- // consumers (Slack notifier, dashboard) grep for. Keeping the emoji + bold
26
- // marker stable is what makes the round-trip with structured-comment
27
- // detection work across the rewrite.
9
+ // Visible headers downstream consumers grep for — keep them byte-stable.
28
10
  const TYPE_BADGES = {
29
11
  progress: '🔄 **Progress**',
30
12
  friction: '⚠️ **Friction**',
@@ -48,10 +30,7 @@ export class CommentGateway {
48
30
  }
49
31
 
50
32
  /**
51
- * All comments on a single ticket. Used by the upstream
52
- * `findStructuredComment` ticketing helper, which greps each comment
53
- * body for the `<!-- ap:structured-comment type="..." -->` marker — so
54
- * the per-comment `body` field must round-trip verbatim.
33
+ * `body` must round-trip verbatim: structured-comment lookup greps it.
55
34
  *
56
35
  * @field-manifest /repos/{owner}/{repo}/issues/{n}/comments:
57
36
  * id, body, created_at, user
@@ -63,11 +42,6 @@ export class CommentGateway {
63
42
  );
64
43
  }
65
44
 
66
- /**
67
- * Delete a comment by id. Called by `upsertStructuredComment` before
68
- * posting the replacement, so the in-place semantics hold even though
69
- * the underlying GitHub API has no native upsert.
70
- */
71
45
  async deleteComment(commentId) {
72
46
  await this._gh.api({
73
47
  method: 'DELETE',
@@ -76,13 +50,8 @@ export class CommentGateway {
76
50
  }
77
51
 
78
52
  /**
79
- * Post a comment on an issue. When `payload.type` matches a known
80
- * structured-comment kind, prepend the visible type-badge so operators
81
- * see the same header the old client produced.
82
- *
83
- * Accepts either `{ body, type }` (canonical) or a bare string (legacy
84
- * shape exercised by `tests/lib/github-provider.test.js` and a handful
85
- * of direct callers under `notify.js`).
53
+ * Accepts `{ body, type }` or a bare string; a known `type` gets its badge
54
+ * prepended.
86
55
  *
87
56
  * @field-manifest POST /repos/{owner}/{repo}/issues/{n}/comments:
88
57
  * id (returned for the caller's `commentId`)
@@ -99,8 +68,6 @@ export class CommentGateway {
99
68
  body: { body },
100
69
  });
101
70
  const comment = parseApiJson(result);
102
- // Posting a comment mutates the ticket's comment thread. Invalidate so
103
- // the next `getTicketComments` / `getTicket` reflects the new comment.
104
71
  if (typeof this._hooks.invalidateTicket === 'function') {
105
72
  this._hooks.invalidateTicket(ticketId);
106
73
  }
@@ -1,18 +1,6 @@
1
1
  /**
2
- * GitHub Provider — gateway composition helper.
3
- *
4
- * Pulled out of `../github.js` in Story #2462 / Task #2481 so the parent
5
- * file can stay under the thin-composer LOC ceiling. This module owns the
6
- * mechanical wiring: it builds each gateway, threads the hooks that
7
- * cross-link them, and constructs the shared `_ctx` object the projects-v2
8
- * shim reads from.
9
- *
10
- * The provider holds the public surface; this helper holds the wiring.
11
- * Splitting the two keeps the composer file readable and reviewable as a
12
- * delegation manifest rather than a constructor-shaped wall of new-up
13
- * calls.
14
- *
15
- * @see Story #2462 — Split GitHubProvider god class into seven composed gateways.
2
+ * GitHub Provider — gateway wiring: builds each gateway, cross-links them
3
+ * via hooks, and builds the shared `_ctx` the projects-v2 shim reads.
16
4
  */
17
5
 
18
6
  import { BranchProtectionGateway } from './branch-protection.js';
@@ -26,11 +14,7 @@ import * as projects from './projects-v2-graphql.js';
26
14
  import { SubIssueGateway } from './sub-issues.js';
27
15
  import { TicketGateway } from './tickets.js';
28
16
 
29
- /**
30
- * Wire every gateway onto `provider` and attach the shared `_ctx` object.
31
- * Mutates the provider in place — the constructor passes `this` in and
32
- * lets this helper own the wiring decisions.
33
- */
17
+ /** Mutates `provider` in place. */
34
18
  export function composeGateways(provider) {
35
19
  const p = provider;
36
20
  const ghDeps = { gh: p._gh, owner: p.owner, repo: p.repo };
@@ -1,35 +1,17 @@
1
1
  /**
2
- * GitHub Provider — error classifier + sub-issues GraphQL shape.
2
+ * GitHub Provider — error classifier, the shared transient-retry loop, and
3
+ * the sub-issues GraphQL shape.
3
4
  *
4
- * `classifyGithubError` buckets `gh-exec`-thrown errors into 4 categories
5
- * (`feature-disabled` / `permission` / `transient` / `permanent`) so the
6
- * sub-issues fallback and the shared retry loop have a deterministic
7
- * switch. Rate-limit detection wins over the 401/403 → permission rule
8
- * because GitHub's secondary rate limit is delivered as HTTP 403 with a
9
- * known message; if we bucketed it as 'permission' it would never be
10
- * retried.
11
- *
12
- * `SUB_ISSUES_QUERY` is the GraphQL shape the sub-issues read path uses.
13
- * Story #5008 removed the add/remove mutations with the write surface.
14
- *
15
- * Extracted from `../github.js` in Story #1846 / Task #1857.
5
+ * `classifyGithubError` buckets errors as `feature-disabled` / `permission` /
6
+ * `transient` / `permanent`. Transient rules run before the 401/403
7
+ * permission rule because a secondary rate limit arrives as HTTP 403.
16
8
  */
17
9
 
18
10
  /**
19
- * Needles that mean "this API surface does not exist here", not "this call
20
- * failed". Every one names a *schema* fact — an absent GraphQL field, a
21
- * disabled feature — so a match is a settled answer no retry can improve.
22
- *
23
- * The bare `sub-issues` needle used to sit in this list and had to go: it
24
- * matches the endpoint's own name, so any error that merely *mentions* the
25
- * surface classified as `feature-disabled`. A secondary rate limit delivered
26
- * as `HTTP 403: API rate limit exceeded while fetching sub-issues` is the live
27
- * case — genuinely transient, but bucketed here it bypassed
28
- * `withTransientRetry` entirely and the Epic rollup read the burst as "this
29
- * repo has no sub-issues", degrading to the body checklist on a read that
30
- * would have succeeded a second later. The narrower `subissues` spellings
31
- * below still catch the real schema errors, because GraphQL names the field
32
- * without the hyphen.
11
+ * Schema facts (absent field, disabled feature) no retry can change. Never
12
+ * add a bare `sub-issues` needle: it matches the endpoint name, so a rate
13
+ * limit "while fetching sub-issues" would skip retry; GraphQL spells the
14
+ * field without the hyphen.
33
15
  */
34
16
  const FEATURE_DISABLED_MESSAGES = [
35
17
  'feature not available',
@@ -37,9 +19,7 @@ const FEATURE_DISABLED_MESSAGES = [
37
19
  "field 'subissues'",
38
20
  'field "subissues"',
39
21
  'subissues is not available',
40
- // The field, never the endpoint. `<x> field` cannot appear in "while
41
- // fetching sub-issues", which is what makes these safe to keep after the
42
- // bare needle's removal.
22
+ // `<x> field` names the field, never the endpoint.
43
23
  'subissues field',
44
24
  'sub_issues field',
45
25
  'sub-issues field',
@@ -69,27 +49,12 @@ const TRANSIENT_MESSAGES = [
69
49
 
70
50
  const PERMISSION_MESSAGES = ['unauthorized', 'forbidden', 'permission'];
71
51
 
72
- // Network/connectivity blips that the gh-CLI path surfaces on `err.stderr`
73
- // (Go HTTP errors, e.g. `dial tcp ...: i/o timeout`) and the direct `fetch`
74
- // path surfaces as `TypeError: fetch failed` with the real reason on
75
- // `err.cause` (e.g. `ETIMEDOUT`, `ENOTFOUND`). Folded in from the former
76
- // `transient-retry.js` predicate (Story #4298) so the single canonical
77
- // classifier retries the **union** of transient HTTP statuses/codes AND
78
- // transient network errors. The `\b50[234]\b` alternative also catches a
79
- // bare 502/503/504 surfaced only in an error message string (no `.status`).
52
+ // Connectivity blips: gh-CLI puts Go HTTP errors on stderr; `fetch` puts the
53
+ // reason on `err.cause`. `\b50[234]\b` catches a status present only in text.
80
54
  const TRANSIENT_NETWORK_RE =
81
55
  /i\/o timeout|dial tcp|TLS handshake timeout|connection reset|connection refused|temporary failure|could not resolve host|no such host|network is unreachable|socket hang up|fetch failed|ConnectTimeoutError|UND_ERR_CONNECT_TIMEOUT|ETIMEDOUT|ECONNRESET|ECONNREFUSED|ENOTFOUND|EAI_AGAIN|\b50[234]\b/i;
82
56
 
83
- /**
84
- * True when an error looks like a retryable network/connectivity blip.
85
- * Scans the union of fields both transport paths populate (`stderr`,
86
- * `message`, `code`, and the nested `cause.message` / `cause.code` the
87
- * `fetch` path uses). Module-private — folded in from the former
88
- * `transient-retry.js` predicate (Story #4298) and consumed only by
89
- * `classifyGithubError` below; its behavior is exercised through that public
90
- * classifier rather than as a standalone export (keeps the dead-export gate
91
- * green — nothing outside this module imports it).
92
- */
57
+ /** Scans stderr, message, code and `cause.*` from both transport paths. */
93
58
  function isTransientNetworkError(err) {
94
59
  const hay = [
95
60
  err?.stderr,
@@ -112,11 +77,7 @@ function matchesAny(haystack, needles) {
112
77
  const GH_STDERR_STATUS_RE = /\bHTTP (\d{3})\b/i;
113
78
 
114
79
  /**
115
- * The captured `gh` stderr, or `''` when the error carries none.
116
- *
117
- * Its own function so {@link extractErrorFields} keeps the cyclomatic weight it
118
- * had before stderr became a classification input — the field is read twice
119
- * there, and inlining the guard twice is what pushed the CRAP ratchet.
80
+ * Separate function to keep {@link extractErrorFields}'s complexity down.
120
81
  *
121
82
  * @param {unknown} err
122
83
  * @returns {string}
@@ -126,13 +87,7 @@ function stderrText(err) {
126
87
  }
127
88
 
128
89
  /**
129
- * Recover the HTTP status from a `gh`-CLI failure's stderr.
130
- *
131
- * The `fetch` transport sets `err.status`; the `gh` transport does not — it
132
- * has only an exit code, and puts the status in the text it printed. Without
133
- * this, every `gh`-path failure reached the status rules as `undefined` and a
134
- * 403 or a 429 was indistinguishable from an unclassifiable error (Story
135
- * #5210).
90
+ * The `gh` transport has no `err.status`, only the status printed on stderr.
136
91
  *
137
92
  * @param {unknown} stderr
138
93
  * @returns {number|undefined}
@@ -144,19 +99,9 @@ function statusFromStderr(stderr) {
144
99
  }
145
100
 
146
101
  /**
147
- * Extract `{ lower, detail, status, code }` from an error in the shape
148
- * `gh-exec` throws. Pure — exported style for unit-testability without
149
- * instantiating the provider. Defensive on shape: errors arrive as `Error`
150
- * objects, plain `{message,status,code}` bags, or non-Errors stringified into
151
- * `String(err)`.
152
- *
153
- * `lower` is the message alone. `detail` is the message **plus** any captured
154
- * `stderr`, and is what the keyword rules read: on the `gh` path the message
155
- * is the classified summary (`gh-exec: gh exited with code 1`) and every
156
- * actionable word — the status line, `secondary rate limit`, the missing
157
- * GraphQL field — lives only on stderr. Matching the keyword lists against the
158
- * message alone is what flattened a retryable 403 to `permanent` and let the
159
- * Epic rollup treat a rate-limit burst as a settled answer (Story #5210).
102
+ * Pure. `detail` is message + stderr and is what keyword rules must read: on
103
+ * the `gh` path the message is only `gh exited with code 1` and every
104
+ * actionable word (status, rate limit, missing field) lives on stderr.
160
105
  */
161
106
  export function extractErrorFields(err) {
162
107
  const message = typeof err.message === 'string' ? err.message : String(err);
@@ -164,8 +109,6 @@ export function extractErrorFields(err) {
164
109
  const lower = message.toLowerCase();
165
110
  return {
166
111
  lower,
167
- // Unconditional concatenation: with no stderr this is the message plus a
168
- // trailing space, which every `includes` rule below reads identically.
169
112
  detail: `${lower} ${stderr.toLowerCase()}`,
170
113
  status:
171
114
  typeof err.status === 'number' ? err.status : statusFromStderr(stderr),
@@ -173,19 +116,16 @@ export function extractErrorFields(err) {
173
116
  };
174
117
  }
175
118
 
176
- /** Pure predicate: HTTP status that signals "transient — retry-eligible". */
177
119
  export function isTransientStatus(status) {
178
120
  if (status === 429) return true;
179
121
  return typeof status === 'number' && status >= 500;
180
122
  }
181
123
 
182
- /** Pure predicate: error code/message signals "transient — retry-eligible". */
183
124
  export function isTransientByCodeOrMessage(code, lower) {
184
125
  if (TRANSIENT_CODES.has(code)) return true;
185
126
  return matchesAny(lower, TRANSIENT_MESSAGES);
186
127
  }
187
128
 
188
- /** Pure predicate: HTTP status / message signals "permission denied". */
189
129
  export function isPermissionSignal(status, lower) {
190
130
  if (status === 401 || status === 403) return true;
191
131
  return matchesAny(lower, PERMISSION_MESSAGES);
@@ -193,52 +133,18 @@ export function isPermissionSignal(status, lower) {
193
133
 
194
134
  export function classifyGithubError(err) {
195
135
  if (!err) return 'permanent';
196
- // `GhExecTimeoutError` (from `lib/gh-exec.js`) carries a message of the
197
- // shape `"gh-exec: gh <args> exceeded <N>ms"` — no transient keyword and
198
- // no `.status` / `.code`. Match by `err.name` to avoid a circular import
199
- // between this module and `lib/gh-exec.js`. Story #2860.
136
+ // Matched by name to avoid a circular import with `lib/gh-exec.js`.
200
137
  if (err.name === 'GhExecTimeoutError') return 'transient';
201
- // Every keyword rule below reads `detail` (message + stderr), never `lower`
202
- // alone: the `gh` transport carries its reason exclusively on stderr, so a
203
- // message-only match sees nothing but the exit code. Rule ORDER is
204
- // load-bearing and unchanged — a secondary rate limit is delivered as HTTP
205
- // 403, so the transient rules must stay ahead of the permission rule or it
206
- // would bucket as 'permission' and never retry.
138
+ // Rule order is load-bearing: every transient rule precedes permission.
207
139
  const { detail, status, code } = extractErrorFields(err);
208
140
  if (matchesAny(detail, FEATURE_DISABLED_MESSAGES)) return 'feature-disabled';
209
141
  if (isTransientStatus(status)) return 'transient';
210
142
  if (isTransientByCodeOrMessage(code, detail)) return 'transient';
211
- // Union with the former `transient-retry.js` predicate (Story #4298):
212
- // retry on network/connectivity blips the status/code checks above miss
213
- // (e.g. a `dial tcp ... i/o timeout` on `err.stderr` from the gh-CLI path,
214
- // or `ECONNREFUSED` / `ENETUNREACH`). Checked before the permission rule so
215
- // a transient network failure never masquerades as a permanent denial.
216
143
  if (isTransientNetworkError(err)) return 'transient';
217
144
  if (isPermissionSignal(status, detail)) return 'permission';
218
145
  return 'permanent';
219
146
  }
220
147
 
221
- // ---------------------------------------------------------------------------
222
- // Transient-retry helper (Story #2852; unified in Story #4298)
223
- // ---------------------------------------------------------------------------
224
- //
225
- // The single canonical `withTransientRetry` for the GitHub provider. Story
226
- // #4298 collapsed the former two divergent same-named implementations (this
227
- // one + the network-only one in the deleted `transient-retry.js`) into this
228
- // one primitive. Its default classifier (`classifyGithubError`) is the
229
- // **union** predicate — it retries on transient HTTP statuses/codes AND on
230
- // transient network/connectivity errors — so every former consumer of either
231
- // module keeps (or gains) its prior retry coverage with no shim.
232
- //
233
- // Read-path callers (paginateRest, getTicket, getNativeSubIssues, …) all
234
- // absorb the same jittered exponential backoff on transient GitHub errors
235
- // through this one primitive, instead of bubbling a one-shot
236
- // 502/429/ECONNRESET that kills a longer pipeline (e.g. the /mandrel-deliver
237
- // Phase E retro). The network consumers repointed here
238
- // (branch-protection, labels, projects-v2-graphql) call with no opts, so
239
- // they adopt these defaults; their retry *classes* (the network blips) are
240
- // preserved via the unified classifier above.
241
-
242
148
  export const TRANSIENT_RETRY_DEFAULTS = Object.freeze({
243
149
  maxAttempts: 6,
244
150
  baseDelayMs: 500,
@@ -247,14 +153,8 @@ export const TRANSIENT_RETRY_DEFAULTS = Object.freeze({
247
153
  });
248
154
 
249
155
  /**
250
- * Run `fn` with jittered exponential backoff on transient GitHub errors.
251
- * `classify` (defaults to `classifyGithubError`) decides whether each
252
- * failure is retry-eligible: only `'transient'` retries; every other
253
- * bucket (`feature-disabled` / `permission` / `permanent`) bubbles on the
254
- * first failure.
255
- *
256
- * `sleep` and `random` are injectable so tests can drive deterministic
257
- * retry paths without real-world timing.
156
+ * The provider's single retry primitive: jittered exponential backoff; only
157
+ * a `'transient'` classification retries, anything else throws at once.
258
158
  *
259
159
  * @template T
260
160
  * @param {() => Promise<T>} fn
@@ -310,9 +210,6 @@ export async function withTransientRetry(fn, opts = {}) {
310
210
  throw lastErr;
311
211
  }
312
212
 
313
- // ---------------------------------------------------------------------------
314
- // Sub-issues GraphQL shapes
315
- // ---------------------------------------------------------------------------
316
213
  export const SUB_ISSUES_QUERY = `query($id: ID!, $cursor: String) {
317
214
  node(id: $id) {
318
215
  ... on Issue {