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,40 +1,15 @@
1
1
  /**
2
- * lib/orchestration/review-base-ref.js — the base ref a Story-scope review is
3
- * allowed to measure against (Story #5325).
4
- *
5
- * ## The defect this closes
6
- *
7
- * A close runs base-sync and the Story-scope review against what everyone
8
- * called "the base branch" — but the two meant different refs. Base-sync
9
- * fetches and merges `origin/<base>`; the review passed the **bare** branch
10
- * name, which git resolves to the LOCAL `refs/heads/<base>`, i.e. to whatever
11
- * that ref last fast-forwarded to. On a checkout whose local base is behind
12
- * its remote, the review's `<base>...<head>` diff therefore contains every
13
- * commit the local ref is missing — other people's landed work, scored as if
14
- * this Story had written it. Those findings gate the land, and the operator's
15
- * only exit is a `review-block-overridden` on blockers that were never real.
16
- *
17
- * ## Contract
18
- *
19
- * One resolution, at the review phase boundary, threaded into the change-set
20
- * enumeration, the provider review and the local lens pass — so both arms of
21
- * the review agree about what changed and neither can inherit local drift.
22
- *
23
- * Resolution **fails safe rather than falling back**. Base-sync normally
24
- * guarantees the remote ref is present, but a `--skip-sync` close or a
25
- * remote-less checkout can reach the review with no `origin/<base>` at all.
26
- * Reviewing the local ref anyway is the defect, so an unresolvable base
27
- * produces a degradation record — carried on the review's existing
28
- * `degraded` / `degradations[]` envelope — and no findings whatsoever.
2
+ * The base ref a Story-scope review measures against: `origin/<base>`, the ref
3
+ * base-sync merged — never the bare name, whose stale local ref would score
4
+ * others' landed commits as this Story's. Resolved once and threaded to every
5
+ * review arm. Unresolvable fails safe: a degradation record, no findings.
29
6
  */
30
7
 
31
8
  import { gitSpawn } from '../git-utils.js';
32
9
  import { degradationEnvelope } from './review-providers/degraded-gates.js';
33
10
 
34
11
  /**
35
- * The remote-tracking spelling of a base branch — `main` → `origin/main`.
36
- * Already-qualified input passes through, so a caller naming `origin/main`
37
- * is not double-prefixed.
12
+ * `main` → `origin/main`; already-qualified input passes through.
38
13
  *
39
14
  * @param {unknown} baseBranch
40
15
  * @returns {string|null} the remote-tracking ref, or `null` when unnameable.
@@ -46,8 +21,7 @@ export function remoteBaseRef(baseBranch) {
46
21
  }
47
22
 
48
23
  /**
49
- * Resolve the base ref base-sync merged from, **verified present** in this
50
- * clone. See the module header for why there is no local-ref fallback.
24
+ * Verified present in this clone; no local-ref fallback.
51
25
  *
52
26
  * @param {{
53
27
  * baseBranch: string,
@@ -55,8 +29,6 @@ export function remoteBaseRef(baseBranch) {
55
29
  * gitSpawnFn?: typeof gitSpawn,
56
30
  * }} args
57
31
  * @returns {{ ref: string|null, resolved: boolean, remoteRef: string|null }}
58
- * `ref` is non-null only when `resolved`; `remoteRef` is the ref that was
59
- * probed, for the caller's degradation surface.
60
32
  */
61
33
  export function resolveSharedBaseRef({
62
34
  baseBranch,
@@ -79,20 +51,14 @@ export function resolveSharedBaseRef({
79
51
  return { ref: remoteRef, resolved: true, remoteRef };
80
52
  }
81
53
  } catch {
82
- // A spawn failure and a missing ref are the same answer here: the shared
83
- // base cannot be vouched for.
54
+ // A spawn failure means the same as a missing ref.
84
55
  }
85
56
  return { ref: null, resolved: false, remoteRef };
86
57
  }
87
58
 
88
59
  /**
89
- * The review outcome for a close that cannot establish the shared base.
90
- *
91
- * Shaped as the same envelope a completed review returns — an all-zero
92
- * severity tally, nothing posted, and the `degraded` / `degradations[]` pair
93
- * the close and the rendered comment already read — so the surfaces reading
94
- * it cannot mistake "no findings" for "reviewed and clean". Reported, not
95
- * blocking, matching the posture of every other degraded review gate.
60
+ * A completed-review-shaped envelope whose `degraded` flag keeps "no findings"
61
+ * from reading as "clean". Reported, not blocking.
96
62
  *
97
63
  * @param {{
98
64
  * storyId: number|string,
@@ -1,57 +1,7 @@
1
1
  /**
2
- * lib/orchestration/review-depth.js — the review-depth authority: derives a
3
- * change level from observable facts and folds it with diff width into a tier
4
- * (Story #3938, re-based on a derived signal by Story #4542).
5
- *
6
- * ## Why the level is derived, not authored
7
- *
8
- * This module used to consume `planningRisk.overallLevel` — a level the planner
9
- * asserted about the plan it had just written. That signal was self-refereed and
10
- * its fail-safe ran backwards: an *absent* verdict degraded toward MORE ceremony
11
- * (standard depth), while a schema-valid all-low verdict bought `light`. Nothing
12
- * cross-checked the claimed axes against the files actually touched, so the one
13
- * input that could *reduce* review was exactly the one nobody verified. Story
14
- * #4542 inverted that: the level is now derived at close time from the changed
15
- * files themselves, which makes it a fact rather than a claim — and therefore
16
- * trustworthy enough to reduce ceremony on.
17
- *
18
- * ## The two signals
19
- *
20
- * - **Sensitive paths** ({@link deriveChangeLevel}) — the changed-file set
21
- * intersected with the `sensitivePaths` classes registered in
22
- * `.agents/schemas/audit-rules.json` (auth, migrations, billing, destructive
23
- * mutation, public API). Registered as **configuration**, matched with the
24
- * audit-suite's existing picomatch machinery. This is what keeps a *narrow*
25
- * high-stakes diff — a three-file auth fix, a small migration — at `deep`,
26
- * the one thing a pure width heuristic would miss.
27
- * - **Diff width** — the mechanical changed-file count, unchanged in role.
28
- *
29
- * ## Tier rules ({@link resolveDepth})
30
- *
31
- * - `deep` — `derivedLevel === 'high'` (a sensitive path was touched) OR
32
- * the changed-file count exceeds the wide-change scale
33
- * (`diffWidth.hardFiles`). A wide diff earns a deep pass on
34
- * size alone even when it touches nothing sensitive.
35
- * - `light` — `derivedLevel === 'low'` (the change set is known and touches
36
- * no sensitive path) AND the count is at or below the
37
- * small-change scale (`diffWidth.softFiles`). An *unknown*
38
- * count does not block `light`: a missing width is treated as
39
- * "not wide".
40
- * - `standard` — everything else, including an absent/underivable level. Fail
41
- * toward the middle, never toward `light`: when the diff cannot
42
- * be enumerated there is no evidence the change is safe, and
43
- * `standard` preserves today's behaviour.
44
- *
45
- * {@link resolveDepth} is pure and total: inputs in, tier out. No I/O, no
46
- * throws. `null` / `undefined` / malformed inputs degrade to `standard` (or
47
- * `deep`/`light` only when a signal unambiguously says so). {@link
48
- * deriveChangeLevel} owns the one manifest read and is likewise total — any
49
- * failure degrades to the `null` (fail-safe) level.
50
- *
51
- * v2 Stage 2: review depth is **decoupled** from the planning model-capacity
52
- * advisory. Diff width is a mechanical review signal (files in the landed
53
- * diff); planning capacity is an absolute authored-token session-mass signal.
54
- * The two no longer share a constant.
2
+ * Review-depth authority. The change level is derived from the changed files
3
+ * (a fact, not a planner's claim), so it is safe to reduce ceremony on. Both
4
+ * functions are total; any failure degrades toward `standard`, never `light`.
55
5
  *
56
6
  * @typedef {'light'|'standard'|'deep'} ReviewDepth
57
7
  * @typedef {'low'|'high'} ChangeLevel
@@ -59,40 +9,18 @@
59
9
 
60
10
  import { selectSensitivePathClasses } from '../audit-suite/selector.js';
61
11
 
62
- /**
63
- * Mechanical diff-width scales for review-depth tiering. These are **not**
64
- * planning Story-sizing ceilings (those are gone in v2) — they only classify
65
- * the changed-file count of a diff under review.
66
- */
12
+ /** Classify review diff width only — not planning sizing ceilings. */
67
13
  export const DEFAULT_DIFF_WIDTH = Object.freeze({
68
14
  softFiles: 15,
69
15
  hardFiles: 30,
70
16
  });
71
17
 
72
18
  /**
73
- * Derive the change level for a change set from observable facts: does the
74
- * changed-file set intersect any sensitive-path class registered in
75
- * `audit-rules.json`?
76
- *
77
- * This is the **single source** of the derived level — the review depth
78
- * ({@link resolveDepth}) and the dispatch-side complexity routing
79
- * (`complexity-gate.js#deriveStoryShape`, Story #4722) both consume what this
80
- * returns, so no risk decision can disagree about how risky a change is.
81
- * Dispatch reads the **predicted** shape (the Story's declared `changes[]`
82
- * footprint) and close reads the **actual** diff — one taxonomy, two read
83
- * points, which is what keeps a lite-shaped Story whose footprint touches a
84
- * sensitive path on the full route and under a deep review.
85
- *
86
- * The acceptance verdict owner is **not** downstream of this level: Story
87
- * #5343 re-based `ceremony-routing.js#resolveCeremonyForRisk` on the ceremony
88
- * profile alone, and Story #5366 removed the level from its signature.
89
- *
90
- * Returns `null` — the fail-safe "no derivable signal" level — when the change
91
- * set is empty/unknown or the manifest cannot be read. Both consumers treat
92
- * `null` as the more thorough posture (`standard` depth, the conservative
93
- * `full` route), so a derivation failure never buys a change less checking.
94
- *
95
- * Total: never throws.
19
+ * `high` when the changed files hit a `sensitivePaths` class in
20
+ * `audit-rules.json` — this is what keeps a narrow auth or migration diff
21
+ * deep. Single source of the level for review depth and dispatch routing
22
+ * (predicted footprint vs actual diff). `null` on an empty set or unreadable
23
+ * manifest; consumers treat `null` as the more thorough posture. Never throws.
96
24
  *
97
25
  * @param {{
98
26
  * changedFiles?: string[]|null,
@@ -122,9 +50,7 @@ export function deriveChangeLevel(input = {}) {
122
50
  }
123
51
 
124
52
  /**
125
- * Coerce an arbitrary input into a non-negative integer changed-file count, or
126
- * `null` when the count is unknown / unusable. A `null` count is the neutral
127
- * "width unknown" signal: it neither triggers `deep` nor blocks `light`.
53
+ * `null` = width unknown: neither triggers `deep` nor blocks `light`.
128
54
  *
129
55
  * @param {unknown} value
130
56
  * @returns {number|null}
@@ -137,9 +63,8 @@ function normalizeChangedFileCount(value) {
137
63
  }
138
64
 
139
65
  /**
140
- * Resolve the review depth for a change set from its derived level (see
141
- * {@link deriveChangeLevel}) and diff width. See the module header for the tier
142
- * rules.
66
+ * `deep` on a sensitive path or a wide diff; `light` only when known-low and
67
+ * small; otherwise `standard`.
143
68
  *
144
69
  * @param {{
145
70
  * derivedLevel?: (ChangeLevel|string|null|undefined),
@@ -164,17 +89,10 @@ export function resolveDepth(input = {}) {
164
89
  };
165
90
  const { softFiles, hardFiles } = mergedWidth;
166
91
 
167
- // A known count strictly above the wide-change scale is wide.
168
92
  const isWide = changedFileCount !== null && changedFileCount > hardFiles;
169
- // An unknown count is treated as "not wide" — it does not block `light`.
170
93
  const isSmall = changedFileCount === null || changedFileCount <= softFiles;
171
94
 
172
- // deep — a sensitive path was touched OR the diff is wide.
173
95
  if (derivedLevel === 'high' || isWide) return 'deep';
174
- // light — nothing sensitive touched AND a (known-or-unknown-but-not-wide)
175
- // small diff.
176
96
  if (derivedLevel === 'low' && isSmall) return 'light';
177
- // standard — everything else: an underivable level, or a non-sensitive diff
178
- // whose width sits between softFiles and hardFiles.
179
97
  return 'standard';
180
98
  }
@@ -1,25 +1,6 @@
1
1
  /**
2
- * review-providers/codex.js — Codex ReviewProvider adapter.
3
- *
4
- * Story #2830 (Epic #2815) — wires the
5
- * [`openai/codex-plugin-cc`](https://github.com/openai/codex-plugin-cc)
6
- * Claude Code plugin's `/codex:review` slash command into the
7
- * pluggable ReviewProvider contract.
8
- *
9
- * Two halves shipped under one Story:
10
- * - Task #2834 — schema enum + factory registration + hard-fail
11
- * probe (this file's `createCodexProvider` + `*ForRegistry`).
12
- * - Task #2836 — `runReview()` invokes `/codex:review --base <ref>
13
- * --wait` through an injectable runner and parses the response
14
- * into `Finding[]`, mapping the Codex severity vocabulary onto
15
- * the canonical `critical|high|medium|suggestion` enum.
16
- *
17
- * The factory NEVER silently falls back to the native provider when
18
- * `provider: codex` is configured. Operators who want native MUST set
19
- * `provider: native` explicitly; the probe is the only thing that
20
- * routes between "configured backend present" and "configured backend
21
- * missing". The adapter never consults a GitHub provider — the
22
- * orchestrator owns posting and upserting.
2
+ * review-providers/codex.js — ReviewProvider over `/codex:review`. A missing
3
+ * plugin hard-fails at construction; never a silent fallback to native.
23
4
  *
24
5
  * @typedef {import('./types.js').Finding} Finding
25
6
  * @typedef {import('./types.js').ReviewInput} ReviewInput
@@ -34,11 +15,6 @@ import path from 'node:path';
34
15
  import { parseProviderFindings } from './parse-findings.js';
35
16
  import { renderDepthDirective } from './review-depth.js';
36
17
 
37
- /**
38
- * Canonical install/remediation guidance baked into every probe failure.
39
- * Exported so tests (and any future error-renderer) can assert against
40
- * the exact remediations rather than free-text matching.
41
- */
42
18
  export const CODEX_REMEDIATIONS = Object.freeze({
43
19
  install:
44
20
  'Install the Codex plugin (https://github.com/openai/codex-plugin-cc) ' +
@@ -48,27 +24,14 @@ export const CODEX_REMEDIATIONS = Object.freeze({
48
24
  'in-process maintainability/lint provider instead.',
49
25
  });
50
26
 
51
- /**
52
- * Default Codex plugin marker locations searched by the probe. The
53
- * Claude Code plugin manager (and its `claude plugin install` flow)
54
- * unpacks plugins under one of these roots; presence of the
55
- * `codex-plugin-cc` directory is treated as "the slash command is
56
- * registered on the host".
57
- *
58
- * Exported so tests can extend the list without monkey-patching `os`.
59
- */
27
+ /** A present `codex-plugin-cc` directory means the slash command is registered. */
60
28
  const DEFAULT_PLUGIN_MARKERS = Object.freeze([
61
29
  path.join(os.homedir(), '.claude', 'plugins', 'codex-plugin-cc'),
62
30
  path.join(os.homedir(), '.claude', 'plugins', 'openai', 'codex-plugin-cc'),
63
31
  ]);
64
32
 
65
33
  /**
66
- * Default probe: returns true when any marker path exists on disk.
67
- *
68
- * The probe is intentionally cheap and synchronous — the factory runs
69
- * it at construction time and the worst case (plugin absent) MUST
70
- * surface immediately so the operator sees the remediation, not a
71
- * deferred runtime failure during the first review run.
34
+ * Synchronous so a missing plugin surfaces at construction, not mid-review.
72
35
  *
73
36
  * @param {{ markers?: readonly string[], existsFn?: (p: string) => boolean }} [opts]
74
37
  * @returns {boolean}
@@ -80,18 +43,13 @@ export function defaultProbeCodexCommand(opts = {}) {
80
43
  try {
81
44
  if (existsFn(marker)) return true;
82
45
  } catch (_err) {
83
- // Treat I/O errors as "absent" — the factory throws with the
84
- // remediation message, and the operator can inspect the path.
46
+ // An I/O error reads as absent.
85
47
  }
86
48
  }
87
49
  return false;
88
50
  }
89
51
 
90
52
  /**
91
- * Build the hard-fail Error thrown when the probe reports the
92
- * `/codex:review` command is absent. Exported so the registry entry
93
- * and tests use the same message shape.
94
- *
95
53
  * @returns {Error}
96
54
  */
97
55
  export function buildCodexUnavailableError() {
@@ -103,35 +61,21 @@ export function buildCodexUnavailableError() {
103
61
  }
104
62
 
105
63
  /**
106
- * Canonical severity table. Maps every Codex severity vocabulary
107
- * token (case-insensitive) onto the canonical ReviewProvider
108
- * `Severity` enum. The table is intentionally explicit — drop-through
109
- * to `'suggestion'` is reserved for tokens the table does NOT name.
110
- *
111
- * Exported so unit tests can drive a table-driven assertion across
112
- * every documented Codex severity without re-listing the mapping
113
- * inside the test file.
64
+ * Codex severity tokens (case-insensitive) → canonical `Severity`; an
65
+ * unnamed token falls through to `'suggestion'`.
114
66
  *
115
67
  * @type {Readonly<Record<string, Severity>>}
116
68
  */
117
69
  export const CODEX_SEVERITY_MAP = Object.freeze({
118
- // Codex "blocker" terminology → canonical critical (halts the
119
- // review with an unresolved-finding gate).
120
70
  blocker: 'critical',
121
71
  critical: 'critical',
122
72
  fatal: 'critical',
123
- // Codex "major" terminology → canonical high (lint-error
124
- // equivalent; non-halting but must be addressed before merge).
125
73
  major: 'high',
126
74
  high: 'high',
127
75
  error: 'high',
128
- // Codex "minor" terminology → canonical medium (size/volume
129
- // warning equivalent; flagged but not gating).
130
76
  minor: 'medium',
131
77
  medium: 'medium',
132
78
  warning: 'medium',
133
- // Codex "info" / "nit" / "style" → canonical suggestion
134
- // (advisory only, no gate).
135
79
  info: 'suggestion',
136
80
  nit: 'suggestion',
137
81
  style: 'suggestion',
@@ -140,8 +84,6 @@ export const CODEX_SEVERITY_MAP = Object.freeze({
140
84
  });
141
85
 
142
86
  /**
143
- * Map a single Codex severity string onto the canonical enum.
144
- *
145
87
  * @param {unknown} raw
146
88
  * @returns {Severity}
147
89
  */
@@ -152,23 +94,6 @@ export function mapCodexSeverity(raw) {
152
94
  }
153
95
 
154
96
  /**
155
- * Parse the raw `/codex:review` stdout into `Finding[]`.
156
- *
157
- * The plugin emits JSON; the adapter is liberal in what it accepts:
158
- * - A bare array of finding objects.
159
- * - An object with a `findings` array.
160
- * - Either shape wrapped in an outer envelope with a `result` or
161
- * `data` key (covers minor wire-format drift across plugin
162
- * versions without re-shimming).
163
- *
164
- * Each entry's severity is funnelled through `mapCodexSeverity` so
165
- * the canonical enum is the only thing that reaches the renderer.
166
- * Entries without a `title` or `body` are skipped — the orchestrator
167
- * cannot post an empty finding, and silently dropping the entry is
168
- * safer than fabricating one.
169
- *
170
- * Exported for testing.
171
- *
172
97
  * @param {string} rawStdout
173
98
  * @returns {Finding[]}
174
99
  * @throws {Error} when stdout is not parseable JSON.
@@ -181,15 +106,7 @@ export function parseCodexFindings(rawStdout) {
181
106
  }
182
107
 
183
108
  /**
184
- * Build the `claude --print` prompt that invokes the `/codex:review` slash
185
- * command for a review input. The risk-derived `depth` lever (Story #3937) is
186
- * appended via `renderDepthDirective` so a high-risk Epic instructs Codex
187
- * toward a deeper second-pass review while a low-risk one keeps it light; an
188
- * absent depth renders the `standard` directive. The `/codex:review` slash
189
- * command and its `--wait` flag are unchanged — the directive rides as
190
- * trailing prompt prose the plugin's wrapping model reads.
191
- *
192
- * Pure. Exported for testing.
109
+ * The depth directive rides as trailing prompt prose after the slash command.
193
110
  *
194
111
  * @param {{ baseRef: string, headRef: string, depth?: import('./types.js').ReviewDepth }} args
195
112
  * @returns {string}
@@ -202,14 +119,8 @@ function buildCodexReviewPrompt({ baseRef, headRef, depth }) {
202
119
  }
203
120
 
204
121
  /**
205
- * Default invoker: shell out to the host's `claude` CLI to run the
206
- * `/codex:review` slash command. The plugin is expected to print a
207
- * JSON document to stdout when `--wait` is passed; non-zero exits
208
- * propagate as an Error so the orchestrator records the run as
209
- * `status=invalid` rather than burying the failure.
210
- *
211
- * Exported for testing — the production adapter accepts an
212
- * `invokeFn` override so tests never spawn a real process.
122
+ * Run `/codex:review` through the host's `claude` CLI; `--wait` makes the
123
+ * plugin print JSON to stdout.
213
124
  *
214
125
  * @param {{ baseRef: string, headRef: string, depth?: import('./types.js').ReviewDepth }} args
215
126
  * @returns {{ status: number, stdout: string, stderr: string }}
@@ -231,14 +142,6 @@ function defaultInvokeCodexReview({ baseRef, headRef, depth }) {
231
142
  }
232
143
 
233
144
  /**
234
- * Build a `ReviewProvider` instance backed by the Codex plugin.
235
- *
236
- * The `deps` overload is the test seam — production callers (the
237
- * factory) invoke `createCodexProvider()` with no arguments and get
238
- * the default dependency chain (probe via plugin marker, invoker via
239
- * the `claude` CLI). Tests inject `probeFn` (to bypass the marker
240
- * check) and `invokeFn` (to return canned stdout).
241
- *
242
145
  * @param {{
243
146
  * probeFn?: () => boolean,
244
147
  * invokeFn?: (args: { baseRef: string, headRef: string, scope: string, ticketId: number, depth?: import('./types.js').ReviewDepth }) => { status: number, stdout: string, stderr: string },
@@ -297,10 +200,6 @@ export function createCodexProvider(deps = {}) {
297
200
  }
298
201
 
299
202
  /**
300
- * Zero-arg factory entry point used by the `review-provider-factory`
301
- * registry. Mirrors `createNativeProviderForRegistry` so the registry
302
- * signature stays `() => ReviewProvider`.
303
- *
304
203
  * @returns {ReviewProvider}
305
204
  */
306
205
  export function createCodexProviderForRegistry() {
@@ -1,54 +1,19 @@
1
1
  /**
2
- * review-providers/degraded-gates.js — the review's "a gate did not run"
3
- * channel (Story #4839).
4
- *
5
- * ## The defect this closes
6
- *
7
- * Story #4699 correctly decided that a tool which **could not execute** is an
8
- * operational degradation, not a code finding: it is routed to friction
9
- * telemetry so severity tiers keep reflecting code findings only. What #4699
10
- * did not add was any *other* channel, so the review's own verdict became
11
- * unable to distinguish "lint ran and found nothing" from "lint never ran" —
12
- * both rendered `✅ No findings` with an all-zero severity tally, and the close
13
- * pipeline read the second as the first. A gate that reports success when it
14
- * did not run is worse than no gate, because it is trusted.
15
- *
16
- * This module is that missing channel. A degradation travels **beside** the
17
- * `Finding[]`, never inside it:
18
- *
19
- * - it never becomes a `Finding`, so `countBySeverity` is untouched and no
20
- * execution failure can appear as a critical / high / medium (or even a
21
- * suggestion) — #4699's intent survives intact;
22
- * - it is rendered as its own section in the structured comment, and it
23
- * suppresses the false `✅ No findings` claim;
24
- * - it is carried on the `runCodeReview` envelope as `degraded` /
25
- * `degradations[]`, so the close pipeline sees it too.
26
- *
27
- * ## Report, not block — and why
28
- *
29
- * A degraded gate is reported loudly and does **not** halt the close. The close
30
- * pipeline already runs the canonical `npm run lint` as a hard
31
- * close-validation gate *before* the review phase; the review's scoped lint is
32
- * a second, narrower read of the same surface. Failing a merge because a
33
- * *secondary* read of an already-gated surface could not start would block
34
- * delivery on an operational condition the hard gate has already covered. What
35
- * was actually broken was the silence, so the fix is to make the silence
36
- * impossible: every surface that reads the review outcome now states the
37
- * degradation explicitly. Escalating to a block is a one-line change here if
38
- * the operator posture ever needs it.
2
+ * review-providers/degraded-gates.js — the "a gate did not run" channel,
3
+ * travelling beside `Finding[]` so "never ran" cannot read as clean. It
4
+ * reports rather than blocks: close already hard-gates `npm run lint`.
39
5
  */
40
6
 
41
7
  /**
42
8
  * @typedef {object} GateDegradation
43
- * @property {string} tool Emitter (e.g. `native-review-lint`).
44
- * @property {string} gate Gate that degraded (e.g. `scoped-lint`).
45
- * @property {string} surface Sub-surface that could not run (e.g. `markdownlint`).
46
- * @property {string} reason Machine-readable reason code.
9
+ * @property {string} tool
10
+ * @property {string} gate
11
+ * @property {string} surface Sub-surface that could not run.
12
+ * @property {string} reason
47
13
  */
48
14
 
49
15
  /**
50
- * Pure: keep only well-formed degradation records. A misbehaving provider must
51
- * not be able to corrupt the rendered comment or the envelope.
16
+ * Keep only well-formed records, so a misbehaving provider cannot corrupt output.
52
17
  *
53
18
  * @param {unknown} input
54
19
  * @returns {GateDegradation[]}
@@ -72,13 +37,8 @@ export function normalizeDegradations(input) {
72
37
  }
73
38
 
74
39
  /**
75
- * Feature-detect a provider's degradation channel, mirroring how
76
- * `getPromptMessages` is feature-detected. Providers predating this contract
77
- * carry no `getDegradations`, so the empty array keeps their output byte-stable;
78
- * a throw degrades to empty (observability must never fail a review).
79
- *
80
- * MUST be called **after** `runReview` — a provider records its degradations
81
- * during the run.
40
+ * Feature-detected; a throw degrades to empty. MUST be called after
41
+ * `runReview`, which is when a provider records its degradations.
82
42
  *
83
43
  * @param {{ getDegradations?: Function }} reviewProvider
84
44
  * @param {{ warn?: Function }} [logger]
@@ -99,9 +59,7 @@ export async function collectProviderDegradations(reviewProvider, logger) {
99
59
  }
100
60
 
101
61
  /**
102
- * Pure: one-line operator-facing summary of the degraded gates, for progress
103
- * output and comment tallies. Empty input renders `none` so the field is always
104
- * present — a missing degradation line must never be read as "no degradation".
62
+ * Empty renders `none`, so the field is always present.
105
63
  *
106
64
  * @param {ReadonlyArray<GateDegradation>} degradations
107
65
  * @returns {string}
@@ -113,10 +71,6 @@ export function summarizeDegradations(degradations) {
113
71
  }
114
72
 
115
73
  /**
116
- * Pure: the `{ degraded, degradations }` pair every outcome envelope carries, so
117
- * a caller adds the channel by spreading one helper rather than restating the
118
- * derivation (and cannot ship `degradations` without `degraded`).
119
- *
120
74
  * @param {unknown} degradations
121
75
  * @returns {{ degraded: boolean, degradations: GateDegradation[] }}
122
76
  */
@@ -126,10 +80,7 @@ export function degradationEnvelope(degradations) {
126
80
  }
127
81
 
128
82
  /**
129
- * Merge the degraded-gate records of every inline chain entry that carries the
130
- * channel. A provider predating the contract contributes nothing; a throw is
131
- * logged and skipped, because a chain must never lose a "this gate did not run"
132
- * signal *or* fail a review over reporting one.
83
+ * A throwing entry is logged and skipped; reporting must never fail a review.
133
84
  *
134
85
  * @param {ReadonlyArray<{ name: string, provider: { getDegradations?: Function } }>} entries
135
86
  * @param {{ warn?: Function }} [logger]
@@ -155,9 +106,6 @@ export async function mergeChainDegradations(entries, logger) {
155
106
  }
156
107
 
157
108
  /**
158
- * Pure: the header field naming how many gates did not run. Empty when the
159
- * review was healthy, so a healthy body stays byte-identical to pre-#4839.
160
- *
161
109
  * @param {ReadonlyArray<GateDegradation>} degraded Already normalized.
162
110
  * @returns {string[]}
163
111
  */
@@ -167,9 +115,7 @@ export function renderDegradedHeaderLines(degraded) {
167
115
  }
168
116
 
169
117
  /**
170
- * Pure: the "nothing surfaced" block. This is the exact sentence the defect
171
- * turned into a lie — with a degraded gate present, an all-zero tally is not a
172
- * clean verdict and must not read like one.
118
+ * With a degraded gate, an all-zero tally must not read as a clean verdict.
173
119
  *
174
120
  * @param {ReadonlyArray<GateDegradation>} degraded Already normalized.
175
121
  * @returns {string[]}
@@ -191,10 +137,6 @@ export function renderNoFindingsBlock(degraded) {
191
137
  }
192
138
 
193
139
  /**
194
- * Pure: render the "Degraded Gates" section of the structured comment. Returns
195
- * an empty array when nothing degraded, so a healthy review's body stays
196
- * byte-identical to the pre-#4839 output.
197
- *
198
140
  * @param {ReadonlyArray<GateDegradation>} degradations
199
141
  * @returns {string[]} markdown lines
200
142
  */