mandrel 2.60.0 → 2.62.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (662) hide show
  1. package/.agents/README.md +10 -10
  2. package/.agents/agents/story-worker.md +1 -1
  3. package/.agents/docs/agentrc-reference.json +4 -82
  4. package/.agents/docs/configuration.md +20 -87
  5. package/.agents/docs/workflows.md +1 -1
  6. package/.agents/instructions.md +1 -3
  7. package/.agents/rules/gherkin-standards.md +4 -0
  8. package/.agents/schemas/agentrc.schema.json +11 -486
  9. package/.agents/schemas/story-deliver-terminal.schema.json +10 -0
  10. package/.agents/schemas/validation-evidence.schema.json +2 -1
  11. package/.agents/scripts/README.md +14 -14
  12. package/.agents/scripts/acceptance-eval.js +32 -164
  13. package/.agents/scripts/agents-bootstrap-github.js +27 -129
  14. package/.agents/scripts/apply-quality-bootstrap.js +4 -40
  15. package/.agents/scripts/audit-baselines.js +6 -27
  16. package/.agents/scripts/audit-labels-bootstrap.js +5 -29
  17. package/.agents/scripts/audit-to-stories.js +91 -361
  18. package/.agents/scripts/boot-sweep.js +19 -72
  19. package/.agents/scripts/bootstrap.js +74 -395
  20. package/.agents/scripts/ceremony-derive.js +9 -45
  21. package/.agents/scripts/check-arch-cycles.js +14 -64
  22. package/.agents/scripts/check-baselines.js +8 -48
  23. package/.agents/scripts/check-context-budget.js +46 -172
  24. package/.agents/scripts/check-cyclomatic.js +12 -44
  25. package/.agents/scripts/check-dead-exports.js +13 -64
  26. package/.agents/scripts/check-doc-links.js +38 -186
  27. package/.agents/scripts/check-gherkin-corpus.js +24 -127
  28. package/.agents/scripts/check-test-temp-hygiene.js +28 -169
  29. package/.agents/scripts/coverage-capture.js +32 -99
  30. package/.agents/scripts/deliver-light.js +14 -101
  31. package/.agents/scripts/deliver-recover.js +6 -42
  32. package/.agents/scripts/deliver-run.js +36 -133
  33. package/.agents/scripts/diagnose-friction.js +24 -116
  34. package/.agents/scripts/drain-pending-cleanup.js +1 -1
  35. package/.agents/scripts/evidence-gate.js +23 -85
  36. package/.agents/scripts/file-ci-gap.js +10 -50
  37. package/.agents/scripts/generate-config-docs.js +30 -170
  38. package/.agents/scripts/generate-lens-checklists.js +8 -52
  39. package/.agents/scripts/generate-skills-index.js +14 -112
  40. package/.agents/scripts/generate-workflows-doc.js +10 -70
  41. package/.agents/scripts/git-cleanup.js +2 -34
  42. package/.agents/scripts/lib/Graph.js +24 -81
  43. package/.agents/scripts/lib/ITicketingProvider.js +47 -143
  44. package/.agents/scripts/lib/Logger.js +14 -76
  45. package/.agents/scripts/lib/audit-baselines/engine.js +11 -31
  46. package/.agents/scripts/lib/audit-baselines/gate-surface.js +3 -17
  47. package/.agents/scripts/lib/audit-baselines/headroom.js +4 -20
  48. package/.agents/scripts/lib/audit-baselines/hotspots.js +3 -15
  49. package/.agents/scripts/lib/audit-baselines/kinds.js +23 -89
  50. package/.agents/scripts/lib/audit-baselines/outliers.js +6 -23
  51. package/.agents/scripts/lib/audit-baselines/read.js +3 -16
  52. package/.agents/scripts/lib/audit-baselines/staleness.js +7 -26
  53. package/.agents/scripts/lib/audit-baselines/surface-entry.js +7 -28
  54. package/.agents/scripts/lib/audit-baselines/trend.js +7 -20
  55. package/.agents/scripts/lib/audit-baselines/weights.js +9 -37
  56. package/.agents/scripts/lib/audit-suite/audit-rules-reader.js +3 -18
  57. package/.agents/scripts/lib/audit-suite/checklist-threading.js +26 -124
  58. package/.agents/scripts/lib/audit-suite/dispatch-checklist.js +14 -45
  59. package/.agents/scripts/lib/audit-suite/findings.js +12 -52
  60. package/.agents/scripts/lib/audit-suite/frontmatter.js +5 -29
  61. package/.agents/scripts/lib/audit-suite/index.js +1 -15
  62. package/.agents/scripts/lib/audit-suite/lens-checklist.js +10 -45
  63. package/.agents/scripts/lib/audit-suite/lens-diff-floor.js +11 -76
  64. package/.agents/scripts/lib/audit-suite/runner.js +13 -43
  65. package/.agents/scripts/lib/audit-suite/selector.js +49 -349
  66. package/.agents/scripts/lib/audit-suite/substitutions.js +12 -40
  67. package/.agents/scripts/lib/audit-suite/workflow-loader.js +3 -15
  68. package/.agents/scripts/lib/audit-to-stories/audit-label-taxonomy.js +11 -73
  69. package/.agents/scripts/lib/audit-to-stories/audit-lenses.js +8 -37
  70. package/.agents/scripts/lib/audit-to-stories/build-story-body.js +25 -143
  71. package/.agents/scripts/lib/audit-to-stories/dedupe-against-github.js +14 -80
  72. package/.agents/scripts/lib/audit-to-stories/epic-grouping-directive.js +4 -18
  73. package/.agents/scripts/lib/audit-to-stories/finding-adapter.js +7 -40
  74. package/.agents/scripts/lib/audit-to-stories/group-findings.js +9 -39
  75. package/.agents/scripts/lib/audit-to-stories/issue-corpus.js +10 -66
  76. package/.agents/scripts/lib/audit-to-stories/issue-index.js +6 -30
  77. package/.agents/scripts/lib/audit-to-stories/issues-file.js +6 -36
  78. package/.agents/scripts/lib/audit-to-stories/ledger-commit.js +17 -69
  79. package/.agents/scripts/lib/audit-to-stories/ledger-pr.js +17 -85
  80. package/.agents/scripts/lib/audit-to-stories/ledger-record.js +10 -48
  81. package/.agents/scripts/lib/audit-to-stories/parse-audit-md.js +38 -146
  82. package/.agents/scripts/lib/audit-to-stories/seed-from-findings.js +7 -42
  83. package/.agents/scripts/lib/audit-to-stories/wire-dependencies.js +10 -57
  84. package/.agents/scripts/lib/baseline-loader.js +12 -51
  85. package/.agents/scripts/lib/baseline-schema-registry.js +5 -22
  86. package/.agents/scripts/lib/baselines/component-matcher.js +3 -12
  87. package/.agents/scripts/lib/baselines/components.js +10 -61
  88. package/.agents/scripts/lib/baselines/coverage-updater-cli.js +7 -36
  89. package/.agents/scripts/lib/baselines/crap-preview-incremental.js +5 -21
  90. package/.agents/scripts/lib/baselines/crap-preview-scan.js +19 -45
  91. package/.agents/scripts/lib/baselines/crap-updater-cli.js +16 -65
  92. package/.agents/scripts/lib/baselines/diff-scope-cli.js +5 -33
  93. package/.agents/scripts/lib/baselines/duplication-scanner.js +11 -60
  94. package/.agents/scripts/lib/baselines/env-overrides.js +12 -67
  95. package/.agents/scripts/lib/baselines/envelope.js +13 -129
  96. package/.agents/scripts/lib/baselines/exit-codes.js +6 -49
  97. package/.agents/scripts/lib/baselines/git-base.js +23 -142
  98. package/.agents/scripts/lib/baselines/kernel.js +11 -111
  99. package/.agents/scripts/lib/baselines/kinds/_crap-new-method-gate.js +9 -47
  100. package/.agents/scripts/lib/baselines/kinds/_crap-read.js +8 -51
  101. package/.agents/scripts/lib/baselines/kinds/_shared-metric.js +7 -62
  102. package/.agents/scripts/lib/baselines/kinds/bundle-size.js +8 -29
  103. package/.agents/scripts/lib/baselines/kinds/coverage.js +3 -15
  104. package/.agents/scripts/lib/baselines/kinds/crap.js +94 -415
  105. package/.agents/scripts/lib/baselines/kinds/duplication.js +4 -30
  106. package/.agents/scripts/lib/baselines/kinds/kind-factory.js +7 -53
  107. package/.agents/scripts/lib/baselines/kinds/maintainability.js +15 -80
  108. package/.agents/scripts/lib/baselines/kinds/mutation.js +12 -72
  109. package/.agents/scripts/lib/baselines/maintainability-baseline-io.js +4 -11
  110. package/.agents/scripts/lib/baselines/merge-envelopes.js +30 -146
  111. package/.agents/scripts/lib/baselines/path-canon.js +19 -128
  112. package/.agents/scripts/lib/baselines/preview-gates.js +8 -37
  113. package/.agents/scripts/lib/baselines/reader.js +14 -107
  114. package/.agents/scripts/lib/baselines/refresh-service.js +35 -252
  115. package/.agents/scripts/lib/baselines/scope.js +11 -135
  116. package/.agents/scripts/lib/baselines/writer.js +16 -149
  117. package/.agents/scripts/lib/bdd-runner-detect.js +18 -113
  118. package/.agents/scripts/lib/bdd-scenario-budget.js +9 -36
  119. package/.agents/scripts/lib/bdd-scenario-scanner.js +11 -73
  120. package/.agents/scripts/lib/bdd-step-index.js +26 -100
  121. package/.agents/scripts/lib/bootstrap/baseline-merge-driver.js +23 -103
  122. package/.agents/scripts/lib/bootstrap/branch-protection.js +2 -5
  123. package/.agents/scripts/lib/bootstrap/commit-push.js +12 -50
  124. package/.agents/scripts/lib/bootstrap/gh-preflight.js +14 -101
  125. package/.agents/scripts/lib/bootstrap/hitl-confirm.js +5 -30
  126. package/.agents/scripts/lib/bootstrap/install-ledger.js +17 -73
  127. package/.agents/scripts/lib/bootstrap/issue-forms-template.js +17 -121
  128. package/.agents/scripts/lib/bootstrap/manifest.js +15 -86
  129. package/.agents/scripts/lib/bootstrap/merge-methods.js +4 -33
  130. package/.agents/scripts/lib/bootstrap/preflight.js +12 -61
  131. package/.agents/scripts/lib/bootstrap/project-bootstrap.js +34 -235
  132. package/.agents/scripts/lib/bootstrap/prompt.js +21 -129
  133. package/.agents/scripts/lib/bootstrap/quality-bootstrap.js +27 -141
  134. package/.agents/scripts/lib/bootstrap/summary.js +1 -8
  135. package/.agents/scripts/lib/bootstrap/workflow-audit.js +11 -84
  136. package/.agents/scripts/lib/branch-name-guard.js +4 -23
  137. package/.agents/scripts/lib/changed-files.js +31 -143
  138. package/.agents/scripts/lib/checks/core-bare-clean.js +4 -24
  139. package/.agents/scripts/lib/checks/index.js +18 -101
  140. package/.agents/scripts/lib/checks/loop-health.js +11 -53
  141. package/.agents/scripts/lib/checks/state.js +16 -91
  142. package/.agents/scripts/lib/checks/story-init-not-backgrounded.js +10 -61
  143. package/.agents/scripts/lib/checks/subagent-agent-tool-required.js +14 -83
  144. package/.agents/scripts/lib/child-exec.js +39 -108
  145. package/.agents/scripts/lib/cli/standard-args.js +9 -116
  146. package/.agents/scripts/lib/cli-args.js +31 -146
  147. package/.agents/scripts/lib/cli-usage.js +5 -27
  148. package/.agents/scripts/lib/cli-utils.js +2 -12
  149. package/.agents/scripts/lib/close-validation/commands.js +13 -76
  150. package/.agents/scripts/lib/close-validation/gates.js +92 -331
  151. package/.agents/scripts/lib/close-validation/process.js +121 -151
  152. package/.agents/scripts/lib/close-validation/projections/advisories.js +5 -31
  153. package/.agents/scripts/lib/close-validation/projections/crap.js +19 -67
  154. package/.agents/scripts/lib/close-validation/projections/head-sha.js +1 -17
  155. package/.agents/scripts/lib/close-validation/projections/inputs.js +4 -34
  156. package/.agents/scripts/lib/close-validation/projections/maintainability.js +11 -58
  157. package/.agents/scripts/lib/close-validation/runner.js +53 -110
  158. package/.agents/scripts/lib/command-header.js +6 -28
  159. package/.agents/scripts/lib/config/acceptance-eval.js +4 -30
  160. package/.agents/scripts/lib/config/baselines.js +3 -14
  161. package/.agents/scripts/lib/config/ci.js +8 -38
  162. package/.agents/scripts/lib/config/commands.js +1 -15
  163. package/.agents/scripts/lib/config/defaults.js +4 -33
  164. package/.agents/scripts/lib/config/delivery-routing.js +6 -35
  165. package/.agents/scripts/lib/config/explain.js +9 -80
  166. package/.agents/scripts/lib/config/gates/coverage.schema.js +0 -12
  167. package/.agents/scripts/lib/config/gates/crap-incremental-coverage.schema.js +2 -30
  168. package/.agents/scripts/lib/config/gates/crap.schema.js +1 -34
  169. package/.agents/scripts/lib/config/gates/duplication.schema.js +1 -8
  170. package/.agents/scripts/lib/config/gates/index.js +2 -17
  171. package/.agents/scripts/lib/config/gates/maintainability.schema.js +1 -20
  172. package/.agents/scripts/lib/config/gates/mutation.schema.js +1 -7
  173. package/.agents/scripts/lib/config/gates/shared.js +4 -64
  174. package/.agents/scripts/lib/config/github.js +4 -22
  175. package/.agents/scripts/lib/config/limits.js +4 -57
  176. package/.agents/scripts/lib/config/paths.js +2 -21
  177. package/.agents/scripts/lib/config/qa.js +4 -38
  178. package/.agents/scripts/lib/config/quality.js +76 -432
  179. package/.agents/scripts/lib/config/runners.js +12 -56
  180. package/.agents/scripts/lib/config/runtime.js +13 -57
  181. package/.agents/scripts/lib/config/shared.js +2 -16
  182. package/.agents/scripts/lib/config/sync-agentrc.js +9 -50
  183. package/.agents/scripts/lib/config/temp-paths.js +40 -280
  184. package/.agents/scripts/lib/config/validate-orchestration.js +5 -17
  185. package/.agents/scripts/lib/config/worktree-isolation.js +9 -28
  186. package/.agents/scripts/lib/config-resolver.js +10 -52
  187. package/.agents/scripts/lib/config-schema-shared.js +1 -4
  188. package/.agents/scripts/lib/config-settings-schema-delivery.js +12 -294
  189. package/.agents/scripts/lib/config-settings-schema-quality.js +7 -219
  190. package/.agents/scripts/lib/config-settings-schema.js +37 -274
  191. package/.agents/scripts/lib/coverage-baseline.js +20 -110
  192. package/.agents/scripts/lib/coverage-capture-fullscope.js +12 -37
  193. package/.agents/scripts/lib/coverage-capture-incremental.js +12 -43
  194. package/.agents/scripts/lib/coverage-capture-usage.js +4 -24
  195. package/.agents/scripts/lib/coverage-capture.js +99 -224
  196. package/.agents/scripts/lib/coverage-utils.js +14 -79
  197. package/.agents/scripts/lib/cpu-pool.js +17 -123
  198. package/.agents/scripts/lib/crap-baseline-join.js +16 -88
  199. package/.agents/scripts/lib/crap-coordinates.js +6 -25
  200. package/.agents/scripts/lib/crap-engine.js +40 -153
  201. package/.agents/scripts/lib/crap-method-identity.js +16 -78
  202. package/.agents/scripts/lib/crap-utils.js +31 -155
  203. package/.agents/scripts/lib/cyclomatic-ceiling.js +14 -87
  204. package/.agents/scripts/lib/cyclomatic-scope.js +10 -50
  205. package/.agents/scripts/lib/dead-exports-knip.js +18 -56
  206. package/.agents/scripts/lib/dead-exports-mode.js +5 -24
  207. package/.agents/scripts/lib/degraded-mode.js +3 -26
  208. package/.agents/scripts/lib/dependency-parser.js +8 -40
  209. package/.agents/scripts/lib/dependency-version.js +13 -35
  210. package/.agents/scripts/lib/detect-package-manager.js +6 -36
  211. package/.agents/scripts/lib/doc-tiers.js +22 -126
  212. package/.agents/scripts/lib/duplicate-search.js +8 -72
  213. package/.agents/scripts/lib/env-loader.js +5 -27
  214. package/.agents/scripts/lib/error-redactor.js +6 -31
  215. package/.agents/scripts/lib/errors/index.js +2 -22
  216. package/.agents/scripts/lib/escomplex-ast-compat.js +22 -163
  217. package/.agents/scripts/lib/escomplex-kernel.js +21 -123
  218. package/.agents/scripts/lib/feedback-loop/graduator-core.js +93 -419
  219. package/.agents/scripts/lib/feedback-loop/prior-feedback-fetcher.js +20 -98
  220. package/.agents/scripts/lib/feedback-loop/retro-proposals-graduator.js +27 -151
  221. package/.agents/scripts/lib/findings/audit-ledger.js +23 -97
  222. package/.agents/scripts/lib/findings/classify-finding.js +14 -69
  223. package/.agents/scripts/lib/findings/promote-finding.js +14 -112
  224. package/.agents/scripts/lib/findings/provenance-field.js +11 -52
  225. package/.agents/scripts/lib/findings/route-finding.js +37 -255
  226. package/.agents/scripts/lib/findings/semantic-issue-search.js +14 -59
  227. package/.agents/scripts/lib/findings/severity.js +18 -104
  228. package/.agents/scripts/lib/format-generated-json.js +12 -44
  229. package/.agents/scripts/lib/full-suite-lock.js +160 -429
  230. package/.agents/scripts/lib/full-suite-queue.js +213 -0
  231. package/.agents/scripts/lib/gates/baseline-store.js +5 -9
  232. package/.agents/scripts/lib/gates/friction.js +1 -3
  233. package/.agents/scripts/lib/generated/agentrc-validator.js +2 -2
  234. package/.agents/scripts/lib/gh-exec.js +31 -259
  235. package/.agents/scripts/lib/git/cached-fetch.js +9 -52
  236. package/.agents/scripts/lib/git/sync-from-base.js +15 -107
  237. package/.agents/scripts/lib/git-branch-cleanup.js +14 -61
  238. package/.agents/scripts/lib/git-branch-lifecycle.js +16 -87
  239. package/.agents/scripts/lib/git-utils.js +37 -161
  240. package/.agents/scripts/lib/github/framework-repo.js +8 -71
  241. package/.agents/scripts/lib/github-url.js +2 -17
  242. package/.agents/scripts/lib/import-graph.js +11 -38
  243. package/.agents/scripts/lib/install-cmd-parser.js +4 -13
  244. package/.agents/scripts/lib/json-utils.js +3 -18
  245. package/.agents/scripts/lib/label-constants.js +16 -111
  246. package/.agents/scripts/lib/label-taxonomy.js +4 -30
  247. package/.agents/scripts/lib/maintainability-engine.js +12 -80
  248. package/.agents/scripts/lib/maintainability-unscorable.js +5 -25
  249. package/.agents/scripts/lib/maintainability-utils.js +16 -92
  250. package/.agents/scripts/lib/mandrel-catalog.js +12 -70
  251. package/.agents/scripts/lib/notifications/notifier.js +13 -38
  252. package/.agents/scripts/lib/npm-scripts.js +4 -23
  253. package/.agents/scripts/lib/observability/metrics-ledger.js +16 -76
  254. package/.agents/scripts/lib/observability/runtime-friction.js +44 -286
  255. package/.agents/scripts/lib/observability/signal-validator.js +5 -37
  256. package/.agents/scripts/lib/observability/signals-writer.js +11 -121
  257. package/.agents/scripts/lib/observability/source-classifier.js +21 -203
  258. package/.agents/scripts/lib/observability/terse-result.js +14 -47
  259. package/.agents/scripts/lib/onboard/init-tail.js +13 -74
  260. package/.agents/scripts/lib/onboard/scaffold-docs.js +11 -34
  261. package/.agents/scripts/lib/orchestration/acceptance-eval-decision.js +25 -139
  262. package/.agents/scripts/lib/orchestration/auto-merge-cwd.js +11 -66
  263. package/.agents/scripts/lib/orchestration/behind-recovery.js +10 -55
  264. package/.agents/scripts/lib/orchestration/ceremony-routing.js +5 -75
  265. package/.agents/scripts/lib/orchestration/change-set.js +7 -36
  266. package/.agents/scripts/lib/orchestration/check-baselines/phases/compare.js +9 -46
  267. package/.agents/scripts/lib/orchestration/check-baselines/phases/evaluate.js +11 -44
  268. package/.agents/scripts/lib/orchestration/check-baselines/phases/floors.js +5 -24
  269. package/.agents/scripts/lib/orchestration/check-baselines/phases/friction.js +3 -12
  270. package/.agents/scripts/lib/orchestration/check-baselines/phases/parse-args.js +5 -38
  271. package/.agents/scripts/lib/orchestration/check-baselines/phases/pipeline.js +3 -8
  272. package/.agents/scripts/lib/orchestration/check-baselines/phases/refresh-ack.js +28 -136
  273. package/.agents/scripts/lib/orchestration/check-baselines/phases/report.js +3 -13
  274. package/.agents/scripts/lib/orchestration/check-state.js +92 -0
  275. package/.agents/scripts/lib/orchestration/ci-gap-intake.js +37 -144
  276. package/.agents/scripts/lib/orchestration/ci-rerun-guard.js +42 -189
  277. package/.agents/scripts/lib/orchestration/code-review.js +24 -128
  278. package/.agents/scripts/lib/orchestration/column-sync.js +23 -111
  279. package/.agents/scripts/lib/orchestration/complexity-gate.js +42 -214
  280. package/.agents/scripts/lib/orchestration/deliver-recover.js +36 -168
  281. package/.agents/scripts/lib/orchestration/dependency-analyzer.js +4 -35
  282. package/.agents/scripts/lib/orchestration/dependency-candidates.js +9 -41
  283. package/.agents/scripts/lib/orchestration/diff-magnitude.js +25 -115
  284. package/.agents/scripts/lib/orchestration/doc-reader.js +2 -6
  285. package/.agents/scripts/lib/orchestration/docs-digest.js +13 -51
  286. package/.agents/scripts/lib/orchestration/epic-candidates.js +13 -53
  287. package/.agents/scripts/lib/orchestration/epic-checklist.js +9 -33
  288. package/.agents/scripts/lib/orchestration/epic-container.js +41 -167
  289. package/.agents/scripts/lib/orchestration/epic-expansion.js +10 -40
  290. package/.agents/scripts/lib/orchestration/epic-rollup.js +55 -207
  291. package/.agents/scripts/lib/orchestration/file-assumption-enum.js +2 -22
  292. package/.agents/scripts/lib/orchestration/file-assumptions.js +45 -253
  293. package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-detect.js +9 -46
  294. package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-reap.js +7 -57
  295. package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches.js +21 -126
  296. package/.agents/scripts/lib/orchestration/git-cleanup/phases/cli.js +2 -6
  297. package/.agents/scripts/lib/orchestration/git-cleanup/phases/fast-forward.js +1 -4
  298. package/.agents/scripts/lib/orchestration/git-cleanup/phases/filters.js +1 -5
  299. package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes-ff.js +9 -34
  300. package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes.js +41 -190
  301. package/.agents/scripts/lib/orchestration/git-cleanup/phases/merged-tip.js +9 -45
  302. package/.agents/scripts/lib/orchestration/git-cleanup/phases/parse-args.js +1 -4
  303. package/.agents/scripts/lib/orchestration/git-cleanup/phases/phase-drivers.js +19 -85
  304. package/.agents/scripts/lib/orchestration/git-cleanup/phases/prompts.js +3 -17
  305. package/.agents/scripts/lib/orchestration/git-cleanup/phases/prune.js +1 -5
  306. package/.agents/scripts/lib/orchestration/git-cleanup/phases/render.js +16 -100
  307. package/.agents/scripts/lib/orchestration/git-cleanup/phases/stashes.js +1 -4
  308. package/.agents/scripts/lib/orchestration/lease-guard-shared.js +16 -67
  309. package/.agents/scripts/lib/orchestration/lifecycle/emit-ledger-event.js +9 -33
  310. package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-flip-failed.js +8 -29
  311. package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-unlanded.js +15 -68
  312. package/.agents/scripts/lib/orchestration/light-backstop.js +11 -49
  313. package/.agents/scripts/lib/orchestration/light-escalation.js +21 -89
  314. package/.agents/scripts/lib/orchestration/light-suitability.js +26 -231
  315. package/.agents/scripts/lib/orchestration/merge-block-class.js +39 -216
  316. package/.agents/scripts/lib/orchestration/merge-poll.js +104 -377
  317. package/.agents/scripts/lib/orchestration/merge-queue.js +158 -0
  318. package/.agents/scripts/lib/orchestration/pinned-identifier-lint.js +17 -57
  319. package/.agents/scripts/lib/orchestration/plan-context.js +52 -303
  320. package/.agents/scripts/lib/orchestration/plan-critic-conditions.js +22 -79
  321. package/.agents/scripts/lib/orchestration/plan-critics-evaluate.js +5 -31
  322. package/.agents/scripts/lib/orchestration/plan-metrics.js +29 -108
  323. package/.agents/scripts/lib/orchestration/plan-navigation.js +8 -27
  324. package/.agents/scripts/lib/orchestration/plan-persist/acceptance-handle-repair.js +12 -49
  325. package/.agents/scripts/lib/orchestration/plan-persist/audit-provenance.js +18 -73
  326. package/.agents/scripts/lib/orchestration/plan-persist/changes-repair.js +14 -78
  327. package/.agents/scripts/lib/orchestration/plan-persist/cross-plan-links.js +6 -30
  328. package/.agents/scripts/lib/orchestration/plan-persist/epic-adoption.js +14 -65
  329. package/.agents/scripts/lib/orchestration/plan-persist/epic-ops.js +21 -76
  330. package/.agents/scripts/lib/orchestration/plan-persist/external-deps.js +6 -43
  331. package/.agents/scripts/lib/orchestration/plan-persist/persist-helpers.js +14 -68
  332. package/.agents/scripts/lib/orchestration/plan-persist/plan-context-source.js +9 -41
  333. package/.agents/scripts/lib/orchestration/plan-persist/run-plan-persist.js +49 -248
  334. package/.agents/scripts/lib/orchestration/plan-persist/soft-findings.js +2 -12
  335. package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +85 -368
  336. package/.agents/scripts/lib/orchestration/plan-persist/summary.js +8 -38
  337. package/.agents/scripts/lib/orchestration/plan-persist/supersede-ops.js +30 -190
  338. package/.agents/scripts/lib/orchestration/plan-persist/wave-collision-gate.js +9 -49
  339. package/.agents/scripts/lib/orchestration/plan-persist/wave-serialisation.js +7 -28
  340. package/.agents/scripts/lib/orchestration/plan-reachability.js +13 -42
  341. package/.agents/scripts/lib/orchestration/plan-run-labels/reap.js +16 -91
  342. package/.agents/scripts/lib/orchestration/plan-runner/worktree-sweep.js +16 -54
  343. package/.agents/scripts/lib/orchestration/plan-text-hygiene.js +10 -52
  344. package/.agents/scripts/lib/orchestration/planning/authoring-context.js +14 -109
  345. package/.agents/scripts/lib/orchestration/planning/memory-pool-advisory.js +11 -83
  346. package/.agents/scripts/lib/orchestration/pr-watch.js +48 -306
  347. package/.agents/scripts/lib/orchestration/project-meta-cache.js +15 -80
  348. package/.agents/scripts/lib/orchestration/project-meta-resolver.js +10 -51
  349. package/.agents/scripts/lib/orchestration/reassert-status-column.js +12 -76
  350. package/.agents/scripts/lib/orchestration/remote-verifier.js +12 -36
  351. package/.agents/scripts/lib/orchestration/resolve-stories.js +33 -164
  352. package/.agents/scripts/lib/orchestration/retro-proposals.js +66 -361
  353. package/.agents/scripts/lib/orchestration/review-base-ref.js +9 -43
  354. package/.agents/scripts/lib/orchestration/review-depth.js +12 -94
  355. package/.agents/scripts/lib/orchestration/review-providers/codex.js +10 -111
  356. package/.agents/scripts/lib/orchestration/review-providers/degraded-gates.js +13 -71
  357. package/.agents/scripts/lib/orchestration/review-providers/findings-renderer.js +7 -51
  358. package/.agents/scripts/lib/orchestration/review-providers/mi-exemptions.js +8 -53
  359. package/.agents/scripts/lib/orchestration/review-providers/native.js +30 -214
  360. package/.agents/scripts/lib/orchestration/review-providers/parse-findings.js +7 -52
  361. package/.agents/scripts/lib/orchestration/review-providers/review-depth.js +4 -33
  362. package/.agents/scripts/lib/orchestration/review-providers/review-provider-factory.js +11 -71
  363. package/.agents/scripts/lib/orchestration/review-providers/scoped-lint.js +19 -131
  364. package/.agents/scripts/lib/orchestration/review-providers/security-review.js +6 -89
  365. package/.agents/scripts/lib/orchestration/review-providers/types.js +26 -56
  366. package/.agents/scripts/lib/orchestration/review-providers/ultrareview.js +3 -46
  367. package/.agents/scripts/lib/orchestration/run-epilogue.js +40 -199
  368. package/.agents/scripts/lib/orchestration/run-scoped-config.js +13 -81
  369. package/.agents/scripts/lib/orchestration/single-story-close/close-note.js +7 -34
  370. package/.agents/scripts/lib/orchestration/single-story-close/failed-terminal.js +16 -89
  371. package/.agents/scripts/lib/orchestration/single-story-close/gate-log.js +18 -109
  372. package/.agents/scripts/lib/orchestration/single-story-close/phases/auto-merge.js +190 -280
  373. package/.agents/scripts/lib/orchestration/single-story-close/phases/base-sync.js +18 -80
  374. package/.agents/scripts/lib/orchestration/single-story-close/phases/close-validation.js +103 -97
  375. package/.agents/scripts/lib/orchestration/single-story-close/phases/code-review.js +8 -64
  376. package/.agents/scripts/lib/orchestration/single-story-close/phases/confirm-merge.js +183 -485
  377. package/.agents/scripts/lib/orchestration/single-story-close/phases/conventional-subject.js +30 -134
  378. package/.agents/scripts/lib/orchestration/single-story-close/phases/graphql-preflight.js +9 -50
  379. package/.agents/scripts/lib/orchestration/single-story-close/phases/lock-wait-pending.js +49 -0
  380. package/.agents/scripts/lib/orchestration/single-story-close/phases/normalize-pr-title.js +13 -86
  381. package/.agents/scripts/lib/orchestration/single-story-close/phases/options.js +20 -95
  382. package/.agents/scripts/lib/orchestration/single-story-close/phases/post-land.js +46 -203
  383. package/.agents/scripts/lib/orchestration/single-story-close/phases/pre-gate-steps.js +8 -50
  384. package/.agents/scripts/lib/orchestration/single-story-close/phases/pull-request.js +12 -83
  385. package/.agents/scripts/lib/orchestration/single-story-close/phases/push.js +6 -39
  386. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-block.js +1 -6
  387. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-outcome.js +4 -28
  388. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-override.js +6 -51
  389. package/.agents/scripts/lib/orchestration/single-story-close/phases/worktree-reap.js +6 -34
  390. package/.agents/scripts/lib/orchestration/single-story-close/phases/wrong-tree-guard.js +23 -121
  391. package/.agents/scripts/lib/orchestration/single-story-close/runner.js +110 -290
  392. package/.agents/scripts/lib/orchestration/single-story-lease-guard.js +15 -69
  393. package/.agents/scripts/lib/orchestration/story-body-gate.js +4 -23
  394. package/.agents/scripts/lib/orchestration/story-close/baseline-upward-writeback.js +50 -179
  395. package/.agents/scripts/lib/orchestration/story-close/context-budget-writeback.js +11 -41
  396. package/.agents/scripts/lib/orchestration/story-close/format-autofix.js +23 -311
  397. package/.agents/scripts/lib/orchestration/story-close/phases/local-lens-review.js +22 -147
  398. package/.agents/scripts/lib/orchestration/story-close/phases/review-core.js +16 -67
  399. package/.agents/scripts/lib/orchestration/story-deliver-terminal-schema.js +12 -68
  400. package/.agents/scripts/lib/orchestration/story-deliver-terminal.js +42 -201
  401. package/.agents/scripts/lib/orchestration/story-follow-ups.js +43 -245
  402. package/.agents/scripts/lib/orchestration/story-init-envelope.js +4 -23
  403. package/.agents/scripts/lib/orchestration/story-init-remote.js +2 -6
  404. package/.agents/scripts/lib/orchestration/story-reachability.js +3 -23
  405. package/.agents/scripts/lib/orchestration/task-body-validator.js +12 -126
  406. package/.agents/scripts/lib/orchestration/ticket-lease.js +28 -131
  407. package/.agents/scripts/lib/orchestration/ticket-validator-conflicts.js +15 -149
  408. package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +5 -33
  409. package/.agents/scripts/lib/orchestration/ticket-validator.js +39 -181
  410. package/.agents/scripts/lib/orchestration/ticketing/bulk.js +51 -244
  411. package/.agents/scripts/lib/orchestration/ticketing/reads.js +39 -250
  412. package/.agents/scripts/lib/orchestration/ticketing/state.js +14 -68
  413. package/.agents/scripts/lib/orchestration/ticketing/transition.js +46 -263
  414. package/.agents/scripts/lib/orchestration/ticketing.js +2 -26
  415. package/.agents/scripts/lib/orchestration/verify-credit.js +18 -79
  416. package/.agents/scripts/lib/orchestration/worktree-dirty.js +5 -30
  417. package/.agents/scripts/lib/path-security.js +3 -6
  418. package/.agents/scripts/lib/plan-phase-cleanup.js +9 -49
  419. package/.agents/scripts/lib/preflight-runner.js +13 -69
  420. package/.agents/scripts/lib/process-group.js +143 -0
  421. package/.agents/scripts/lib/project-root.js +2 -8
  422. package/.agents/scripts/lib/provider-factory.js +2 -25
  423. package/.agents/scripts/lib/qa/console-allowlist.js +10 -59
  424. package/.agents/scripts/lib/qa/qa-session.js +15 -69
  425. package/.agents/scripts/lib/qa/redact-evidence.js +18 -129
  426. package/.agents/scripts/lib/qa/resolve-qa-contract.js +26 -135
  427. package/.agents/scripts/lib/qa/resolve-selection.js +16 -84
  428. package/.agents/scripts/lib/reserved-test-ids.js +9 -47
  429. package/.agents/scripts/lib/runtime-deps/dep-resolution.js +13 -53
  430. package/.agents/scripts/lib/runtime-deps/ensure-installed.js +10 -44
  431. package/.agents/scripts/lib/runtime-deps/manifest.js +10 -30
  432. package/.agents/scripts/lib/runtime-deps/parser-major.js +15 -51
  433. package/.agents/scripts/lib/runtime-deps/preflight.js +4 -22
  434. package/.agents/scripts/lib/runtime-deps/scan-imports.js +11 -55
  435. package/.agents/scripts/lib/signals/detectors/common.js +12 -38
  436. package/.agents/scripts/lib/signals/index.js +2 -19
  437. package/.agents/scripts/lib/signals/schema.js +14 -109
  438. package/.agents/scripts/lib/signals/write.js +2 -11
  439. package/.agents/scripts/lib/single-story/confirm-merge.js +31 -72
  440. package/.agents/scripts/lib/single-story/story-merged-notify.js +8 -49
  441. package/.agents/scripts/lib/single-story-sweep/protection-ctx.js +4 -26
  442. package/.agents/scripts/lib/single-story-sweep/protection.js +13 -100
  443. package/.agents/scripts/lib/single-story-sweep/sweep-lock.js +60 -258
  444. package/.agents/scripts/lib/single-story-sweep.js +14 -97
  445. package/.agents/scripts/lib/skills/parse-skill.js +13 -59
  446. package/.agents/scripts/lib/skills/skills-index.js +8 -29
  447. package/.agents/scripts/lib/skills/walk-skill-files.js +17 -78
  448. package/.agents/scripts/lib/source-extensions.js +11 -42
  449. package/.agents/scripts/lib/source-text/strip-js-comments.js +8 -41
  450. package/.agents/scripts/lib/stdio-flush.js +9 -36
  451. package/.agents/scripts/lib/story-adjacency.js +8 -40
  452. package/.agents/scripts/lib/story-body/body-format-lints.js +22 -83
  453. package/.agents/scripts/lib/story-body/footer-block.js +11 -44
  454. package/.agents/scripts/lib/story-body/story-body.js +83 -358
  455. package/.agents/scripts/lib/temp-retention.js +42 -143
  456. package/.agents/scripts/lib/templates/decomposer-prompts.js +11 -65
  457. package/.agents/scripts/lib/test-env.js +12 -65
  458. package/.agents/scripts/lib/test-run-credit.js +10 -65
  459. package/.agents/scripts/lib/test-runner-contract.js +19 -74
  460. package/.agents/scripts/lib/test-temp.js +38 -184
  461. package/.agents/scripts/lib/test-tiers.js +12 -96
  462. package/.agents/scripts/lib/ticket-body-sections.js +21 -96
  463. package/.agents/scripts/lib/transpile.js +15 -74
  464. package/.agents/scripts/lib/util/concurrent-map.js +6 -25
  465. package/.agents/scripts/lib/util/parse-id-list.js +8 -34
  466. package/.agents/scripts/lib/util/poll-loop.js +8 -28
  467. package/.agents/scripts/lib/util/with-timeout.js +2 -11
  468. package/.agents/scripts/lib/validation-evidence.js +21 -96
  469. package/.agents/scripts/lib/wave-runner/footprint.js +17 -70
  470. package/.agents/scripts/lib/wave-runner/live-probe.js +53 -221
  471. package/.agents/scripts/lib/wave-runner/ready-set.js +72 -301
  472. package/.agents/scripts/lib/workers/crap-worker.js +11 -64
  473. package/.agents/scripts/lib/workers/maintainability-report-worker.js +8 -45
  474. package/.agents/scripts/lib/workers/maintainability-worker.js +5 -21
  475. package/.agents/scripts/lib/workers/serve-worker-messages.js +2 -18
  476. package/.agents/scripts/lib/workflow-closure.js +22 -105
  477. package/.agents/scripts/lib/workspace-provisioner.js +16 -54
  478. package/.agents/scripts/lib/worktree/git-hooks.js +15 -60
  479. package/.agents/scripts/lib/worktree/lifecycle/force-drain.js +20 -60
  480. package/.agents/scripts/lib/worktree/lifecycle/merge-reachability.js +10 -62
  481. package/.agents/scripts/lib/worktree/lifecycle/pending-cleanup.js +22 -86
  482. package/.agents/scripts/lib/worktree/lifecycle/reap.js +24 -126
  483. package/.agents/scripts/lib/worktree/lifecycle-manager.js +2 -20
  484. package/.agents/scripts/lib/worktree/node-modules-strategy.js +46 -180
  485. package/.agents/scripts/lib/worktree-manager.js +15 -40
  486. package/.agents/scripts/lint-issue-body.js +12 -68
  487. package/.agents/scripts/mandrel-update-preflight.js +10 -70
  488. package/.agents/scripts/merge-baseline.js +30 -104
  489. package/.agents/scripts/nav-registry-diff.js +22 -108
  490. package/.agents/scripts/notify.js +12 -69
  491. package/.agents/scripts/plan-context.js +27 -111
  492. package/.agents/scripts/plan-critics.js +12 -66
  493. package/.agents/scripts/plan-persist.js +31 -148
  494. package/.agents/scripts/plan-run-epilogue.js +11 -37
  495. package/.agents/scripts/pr-watch-with-update.js +76 -267
  496. package/.agents/scripts/providers/github/auth.js +3 -8
  497. package/.agents/scripts/providers/github/blocked-by-add.js +14 -61
  498. package/.agents/scripts/providers/github/board-add.js +5 -21
  499. package/.agents/scripts/providers/github/branch-protection.js +11 -43
  500. package/.agents/scripts/providers/github/cache.js +2 -14
  501. package/.agents/scripts/providers/github/comments.js +7 -40
  502. package/.agents/scripts/providers/github/compose.js +3 -19
  503. package/.agents/scripts/providers/github/errors.js +22 -125
  504. package/.agents/scripts/providers/github/issues.js +31 -123
  505. package/.agents/scripts/providers/github/labels.js +24 -124
  506. package/.agents/scripts/providers/github/mappers.js +5 -27
  507. package/.agents/scripts/providers/github/merge-methods.js +3 -22
  508. package/.agents/scripts/providers/github/project-board.js +2 -17
  509. package/.agents/scripts/providers/github/projects-v2-graphql.js +3 -6
  510. package/.agents/scripts/providers/github/request-helpers.js +5 -32
  511. package/.agents/scripts/providers/github/search-budget.js +9 -39
  512. package/.agents/scripts/providers/github/search-query.js +5 -26
  513. package/.agents/scripts/providers/github/sub-issue-add.js +15 -65
  514. package/.agents/scripts/providers/github/sub-issues.js +7 -36
  515. package/.agents/scripts/providers/github/tickets.js +32 -134
  516. package/.agents/scripts/providers/github.js +18 -59
  517. package/.agents/scripts/prune-plan-run-labels.js +12 -46
  518. package/.agents/scripts/quality-preview.js +35 -220
  519. package/.agents/scripts/resolve-doc-tiers.js +3 -26
  520. package/.agents/scripts/resolve-stories.js +16 -67
  521. package/.agents/scripts/resync-status-column.js +6 -25
  522. package/.agents/scripts/run-tests.js +29 -104
  523. package/.agents/scripts/single-story-close.js +23 -135
  524. package/.agents/scripts/single-story-confirm-merge.js +32 -139
  525. package/.agents/scripts/single-story-init.js +47 -209
  526. package/.agents/scripts/stories-wave-tick.js +102 -472
  527. package/.agents/scripts/sync-agentrc.js +3 -21
  528. package/.agents/scripts/sync-claude-agents.js +9 -55
  529. package/.agents/scripts/sync-claude-commands.js +20 -110
  530. package/.agents/scripts/test-wrapper.js +6 -43
  531. package/.agents/scripts/update-coverage-baseline.js +5 -22
  532. package/.agents/scripts/update-crap-baseline.js +7 -30
  533. package/.agents/scripts/update-duplication-baseline.js +16 -92
  534. package/.agents/scripts/update-maintainability-baseline.js +8 -62
  535. package/.agents/scripts/update-ticket-state.js +1 -7
  536. package/.agents/scripts/validate-skills.js +6 -26
  537. package/.agents/templates/agent-protocol.md +2 -2
  538. package/.agents/templates/docs/audit-sweep-runbook.md +3 -4
  539. package/.agents/workflows/audit-accessibility.md +4 -7
  540. package/.agents/workflows/audit-adrs.md +3 -6
  541. package/.agents/workflows/audit-architecture.md +3 -11
  542. package/.agents/workflows/audit-baselines.md +6 -9
  543. package/.agents/workflows/audit-clean-code.md +8 -12
  544. package/.agents/workflows/audit-data-model.md +3 -7
  545. package/.agents/workflows/audit-dependencies.md +4 -7
  546. package/.agents/workflows/audit-devops.md +4 -8
  547. package/.agents/workflows/audit-documentation.md +1 -4
  548. package/.agents/workflows/audit-mobile.md +4 -7
  549. package/.agents/workflows/audit-navigability.md +3 -6
  550. package/.agents/workflows/audit-performance.md +2 -4
  551. package/.agents/workflows/audit-privacy.md +4 -7
  552. package/.agents/workflows/audit-quality.md +4 -7
  553. package/.agents/workflows/audit-security.md +4 -7
  554. package/.agents/workflows/audit-seo.md +4 -7
  555. package/.agents/workflows/audit-sre.md +4 -7
  556. package/.agents/workflows/audit-to-stories.md +17 -30
  557. package/.agents/workflows/audit-ux-ui.md +4 -7
  558. package/.agents/workflows/helpers/audit-lens-core.md +1 -1
  559. package/.agents/workflows/helpers/code-quality-guardrails.md +12 -15
  560. package/.agents/workflows/helpers/deliver-digest.md +6 -4
  561. package/.agents/workflows/helpers/deliver-reference.md +114 -188
  562. package/.agents/workflows/helpers/deliver-story-reference.md +189 -533
  563. package/.agents/workflows/helpers/plan-reference.md +86 -139
  564. package/.agents/workflows/helpers/qa-core.md +12 -0
  565. package/.agents/workflows/memory-consolidate.md +1 -1
  566. package/.agents/workflows/qa-assist.md +27 -71
  567. package/.agents/workflows/qa-explore.md +19 -59
  568. package/.agents/workflows/qa-run.md +11 -33
  569. package/README.md +1 -1
  570. package/bin/mandrel.js +5 -46
  571. package/bin/postinstall.js +18 -107
  572. package/docs/CHANGELOG.md +32 -0
  573. package/lib/cli/doctor.js +11 -71
  574. package/lib/cli/init.js +26 -165
  575. package/lib/cli/migrate.js +5 -64
  576. package/lib/cli/registry.js +84 -467
  577. package/lib/cli/sync-agents.js +4 -64
  578. package/lib/cli/sync-commands.js +11 -64
  579. package/lib/cli/sync.js +34 -213
  580. package/lib/cli/uninstall.js +40 -219
  581. package/lib/cli/update.js +105 -661
  582. package/lib/cli/version-check.js +8 -72
  583. package/lib/cli/version-helpers.js +14 -87
  584. package/lib/migrations/helpers/retire-agentrc-key.js +11 -52
  585. package/lib/migrations/index.js +15 -92
  586. package/lib/migrations/steps/2.1.0-retire-mi-drop-knobs.js +2 -15
  587. package/lib/migrations/steps/2.1.0-retire-verify-concurrency-cap.js +1 -13
  588. package/lib/migrations/steps/2.11.0-retire-max-seed-words.js +2 -15
  589. package/lib/migrations/steps/2.2.0-retire-epic-ac-tags.js +9 -38
  590. package/lib/migrations/steps/2.20.0-retire-codebase-snapshot.js +1 -13
  591. package/lib/migrations/steps/2.32.0-retire-lint-baseline-command.js +2 -27
  592. package/lib/migrations/steps/2.57.0-retire-delivery-limit-knobs.js +2 -23
  593. package/lib/migrations/steps/2.57.0-retire-planning-limit-knobs.js +2 -27
  594. package/lib/migrations/steps/2.60.0-retire-audit-results-autofile.js +2 -21
  595. package/lib/migrations/steps/strip-removed-agentrc-keys.js +333 -0
  596. package/package.json +16 -14
  597. package/.agents/docs/SDLC.md +0 -590
  598. package/.agents/docs/quality-gates.md +0 -1183
  599. package/.agents/rules/known-tooling-behavior.md +0 -200
  600. package/.agents/rules/orchestration-error-handling.md +0 -61
  601. package/.agents/rules/test-seams.md +0 -59
  602. package/.agents/schemas/baselines/lighthouse.schema.json +0 -59
  603. package/.agents/schemas/baselines/lint.schema.json +0 -47
  604. package/.agents/scripts/check-action-pinning.js +0 -260
  605. package/.agents/scripts/check-audit-attribution.js +0 -302
  606. package/.agents/scripts/check-baseline-drift.js +0 -211
  607. package/.agents/scripts/check-baseline-scope.js +0 -362
  608. package/.agents/scripts/check-generated-validator.js +0 -202
  609. package/.agents/scripts/check-knip-entries.js +0 -159
  610. package/.agents/scripts/check-lifecycle-lint.js +0 -294
  611. package/.agents/scripts/check-pinned-override-notes.js +0 -102
  612. package/.agents/scripts/check-schema-references.js +0 -368
  613. package/.agents/scripts/check-test-portability.js +0 -512
  614. package/.agents/scripts/check-workflow-citations.js +0 -218
  615. package/.agents/scripts/check-workflow-cli-lint.js +0 -299
  616. package/.agents/scripts/check-workflow-timeouts.js +0 -291
  617. package/.agents/scripts/install-matrix-assert.js +0 -326
  618. package/.agents/scripts/lib/audit-advisories.js +0 -195
  619. package/.agents/scripts/lib/audit-attribution.js +0 -134
  620. package/.agents/scripts/lib/baselines/drift-detector.js +0 -351
  621. package/.agents/scripts/lib/baselines/kinds/lighthouse.js +0 -87
  622. package/.agents/scripts/lib/baselines/kinds/lint.js +0 -184
  623. package/.agents/scripts/lib/baselines/orphan-pruner.js +0 -233
  624. package/.agents/scripts/lib/baselines/scope-assert.js +0 -223
  625. package/.agents/scripts/lib/baselines/scope-inventory.js +0 -314
  626. package/.agents/scripts/lib/c8-cli-path.js +0 -21
  627. package/.agents/scripts/lib/config/gates/lighthouse.schema.js +0 -51
  628. package/.agents/scripts/lib/config/gates/lint.schema.js +0 -18
  629. package/.agents/scripts/lib/dynamic-workflow/architecture-report-contract.js +0 -70
  630. package/.agents/scripts/lib/dynamic-workflow/audit-orchestrator.js +0 -284
  631. package/.agents/scripts/lib/dynamic-workflow/clean-code-report-contract.js +0 -80
  632. package/.agents/scripts/lib/dynamic-workflow/degraded-coverage.js +0 -81
  633. package/.agents/scripts/lib/dynamic-workflow/documentation-report-contract.js +0 -87
  634. package/.agents/scripts/lib/dynamic-workflow/performance-report-contract.js +0 -74
  635. package/.agents/scripts/lib/dynamic-workflow/quality-report-contract.js +0 -90
  636. package/.agents/scripts/lib/dynamic-workflow/report-contract-core.js +0 -43
  637. package/.agents/scripts/lib/dynamic-workflow/security-report-contract.js +0 -83
  638. package/.agents/scripts/lib/fs-walk.js +0 -52
  639. package/.agents/scripts/lib/knip-config-resolver.js +0 -181
  640. package/.agents/scripts/lib/knip-entry-sync.js +0 -452
  641. package/.agents/scripts/lib/pinned-override-notes.js +0 -88
  642. package/.agents/scripts/lib/pinned-override-resolve.js +0 -212
  643. package/.agents/scripts/lib/test-isolate/cli-options.js +0 -93
  644. package/.agents/scripts/lib/test-isolate/env-snapshot-loader.js +0 -52
  645. package/.agents/scripts/lib/test-isolate/list-files.js +0 -90
  646. package/.agents/scripts/lib/test-isolate/parse-tap.js +0 -75
  647. package/.agents/scripts/lib/test-isolate/progress-log.js +0 -45
  648. package/.agents/scripts/lib/test-isolate/render-report.js +0 -97
  649. package/.agents/scripts/lib/test-isolate/run-isolate.js +0 -87
  650. package/.agents/scripts/lib/test-isolate/runner.js +0 -483
  651. package/.agents/scripts/lib/test-profile/parse-tap.js +0 -136
  652. package/.agents/scripts/lib/test-profile/render-report.js +0 -45
  653. package/.agents/scripts/lint-label-vocabulary.js +0 -214
  654. package/.agents/scripts/post-structured-comment.js +0 -127
  655. package/.agents/scripts/provision-git-hooks.js +0 -85
  656. package/.agents/scripts/prune-baseline-orphans.js +0 -181
  657. package/.agents/scripts/run-coverage.js +0 -197
  658. package/.agents/scripts/run-lint.js +0 -133
  659. package/.agents/scripts/run-test-profile.js +0 -129
  660. package/.agents/scripts/run-verify.js +0 -125
  661. package/.agents/scripts/test-isolate.js +0 -55
  662. package/.agents/scripts/update-dead-exports-baseline.js +0 -321
@@ -1,35 +1,9 @@
1
1
  #!/usr/bin/env node
2
2
  /**
3
- * .agents/scripts/quality-preview.js — Per-file MI/CRAP delta preview.
4
- *
5
- * Runs the maintainability + CRAP gates in-process via the per-kind
6
- * preview runners under `lib/baselines/preview-gates.js`, then merges
7
- * their structured envelopes into a single per-file delta table
8
- * contributors can read while the diff is still warm. Designed for
9
- * three callers:
10
- *
11
- * 1. `npm run quality:preview` — interactive operator, pretty table.
12
- * 2. `npm run quality:watch` — chokidar wrapper re-emits on save.
13
- * 3. `.husky/pre-commit` — block the commit on threshold violations.
14
- *
15
- * The pre-commit hook passes `--staged` and nothing else — the index is
16
- * already the exact delta the operator is about to commit, and
17
- * `tests/pre-commit-hook.test.js` pins that `--changed-since` stays off it.
18
- * (This docblock previously claimed the hook passed `--changed-since HEAD`,
19
- * describing a wiring the hook has not used for some time; the stale prose
20
- * sent at least one bug report at the wrong flag — Story #5131.)
21
- *
22
- * `--staged` is merge-aware: while a merge is in progress the index is read
23
- * against `MERGE_HEAD` rather than `HEAD`, so a base-sync merge commit is
24
- * scored for the merging branch's own work and its conflict resolutions, not
25
- * for everything the base branch landed. See `resolveMergeHead` in
26
- * `lib/changed-files.js`.
27
- *
28
- * The CLI exits 0 when both envelopes report zero violations and the script
29
- * could not surface a regression. Any violation in either envelope, or any
30
- * non-zero gate exit, propagates as a non-zero exit code so git/husky/CI
31
- * surface the failure. The merge logic is exported as `mergeEnvelopes` for
32
- * unit testing without spawning the gate scripts.
3
+ * quality-preview.js — per-file MI/CRAP delta preview; exits non-zero on any
4
+ * violation. The pre-commit hook passes only `--staged`. During a merge,
5
+ * `--staged` reads the index against `MERGE_HEAD` so a base-sync commit is
6
+ * scored for the branch's own work, not everything the base landed.
33
7
  */
34
8
 
35
9
  import path from 'node:path';
@@ -40,8 +14,7 @@ import {
40
14
  } from './lib/baselines/preview-gates.js';
41
15
  import { resolveMergeHead } from './lib/changed-files.js';
42
16
  import { respondToHelp } from './lib/cli-usage.js';
43
- import { getQuality, resolveConfig } from './lib/config-resolver.js';
44
- import { resolveCyclomaticPolicy } from './lib/cyclomatic-ceiling.js';
17
+ import { CODING_GUARDRAILS } from './lib/config/quality.js';
45
18
 
46
19
  const USAGE = {
47
20
  invocation:
@@ -61,26 +34,12 @@ const USAGE = {
61
34
  ],
62
35
  };
63
36
 
64
- /**
65
- * Framework default for `delivery.quality.codingGuardrails.cyclomaticFlag`,
66
- * used only when a caller drives `mergeEnvelopes` / `renderTable` without a
67
- * resolved config in hand (tests, and the pure-function surface). `runCli`
68
- * always passes the resolved value.
69
- */
70
- const DEFAULT_CYCLOMATIC_FLAG = 8;
37
+ const DEFAULT_CYCLOMATIC_FLAG = CODING_GUARDRAILS.cyclomaticFlag;
71
38
 
72
39
  /**
73
- * Parse `--changed-since <ref>` from argv. Defaults to `HEAD` when the flag is
74
- * present without a value. Returns `null` when the flag is absent so callers
75
- * can fall through to the gate scripts' own diff defaults.
76
- *
77
- * **Last occurrence wins** (Story #4603). `npm run <alias> -- --changed-since <base>`
78
- * appends the operator's flag *after* any flag baked into the npm script, so a
79
- * first-wins scan silently discarded the operator's base and compared against
80
- * the script's hardcoded one instead — reporting a false green for a branch the
81
- * gate had never actually scored. Last-wins matches the convention every
82
- * mainstream CLI parser follows for repeated scalar flags, and makes the
83
- * npm-alias passthrough behave the way its callers already assume.
40
+ * `--changed-since <ref>` (bare flag → `HEAD`, absent → `null`). Last
41
+ * occurrence wins so `npm run <alias> -- --changed-since <base>` overrides a
42
+ * flag baked into the npm script.
84
43
  *
85
44
  * @param {string[]} argv
86
45
  * @returns {string | null}
@@ -96,10 +55,6 @@ export function parseChangedSinceArg(argv) {
96
55
  }
97
56
 
98
57
  /**
99
- * Detect `--json` (machine-readable mode). When set, the merged envelope is
100
- * written to stdout as JSON instead of the human-readable table; the exit code
101
- * still reflects gate health so CI runners can fail fast.
102
- *
103
58
  * @param {string[]} argv
104
59
  * @returns {boolean}
105
60
  */
@@ -108,10 +63,8 @@ export function parseJsonFlag(argv) {
108
63
  }
109
64
 
110
65
  /**
111
- * Detect `--staged` (pre-commit mode). Used by `.husky/pre-commit` to
112
- * scope both MI and CRAP preview gates to `git diff --name-only --cached`
113
- * so only index (staged) paths are scored. When present, `--staged` takes
114
- * precedence over `--changed-since`.
66
+ * `--staged` scores only index paths and takes precedence over
67
+ * `--changed-since`.
115
68
  *
116
69
  * @param {string[]} argv
117
70
  * @returns {boolean}
@@ -121,9 +74,6 @@ export function parseStagedFlag(argv) {
121
74
  }
122
75
 
123
76
  /**
124
- * Coerce a caller-supplied flag ceiling to a usable number, falling back to
125
- * the framework default for anything non-finite.
126
- *
127
77
  * @param {unknown} value
128
78
  * @returns {number}
129
79
  */
@@ -133,17 +83,11 @@ function normalizeFlag(value) {
133
83
  }
134
84
 
135
85
  /**
136
- * Fold one CRAP violation into its per-file aggregate row. Mutates `row`.
137
- *
138
- * Split out of `mergeEnvelopes` (Story #4923): threading the resolved
139
- * `cyclomaticFlag` through pushed that function from c=12 — exactly at the
140
- * must-fix ceiling — to c=13, and the same Story starts *enforcing* that
141
- * ceiling. Recording its own breach in `baselines/cyclomatic.json` would have
142
- * been the first re-spend of the slack the Story reclaims.
86
+ * Fold one CRAP violation into its per-file row (mutates `row`).
143
87
  *
144
88
  * @param {{ worstCrapDelta: number, newOverCeilingMethods: number }} row
145
89
  * @param {{ crap?: number, ceiling?: number, baseline?: number, cyclomatic?: number, kind?: string }} v
146
- * @param {number} flag resolved `codingGuardrails.cyclomaticFlag`
90
+ * @param {number} flag
147
91
  * @returns {void}
148
92
  */
149
93
  function foldCrapViolation(row, v, flag) {
@@ -162,27 +106,9 @@ function foldCrapViolation(row, v, flag) {
162
106
  }
163
107
 
164
108
  /**
165
- * Merge an MI envelope (from `runMaintainabilityPreview`) and a CRAP
166
- * envelope (from `runCrapPreview`) into a per-file delta map. Pure —
167
- * no I/O, no spawn. Tests pin the math without invoking the runners.
168
- *
169
- * Output rows are keyed by file (forward-slash relative path) and carry:
170
- * - `miDrop`: maintainability score drop from baseline (0 when unchanged or
171
- * improved). Higher = worse.
172
- * - `worstCrapDelta`: largest CRAP regression delta among the file's
173
- * methods (max of `crap - baseline` for matched-baseline rows, `crap`
174
- * for new-method rows). 0 when the file has no CRAP violations.
175
- * - `newOverCeilingMethods`: count of new-method violations (kind:'new')
176
- * scoring above the flag ceiling. The CRAP envelope's `cyclomatic` field
177
- * is the per-method `c` reading.
178
- *
179
- * `cyclomaticFlag` is the resolved
180
- * `delivery.quality.codingGuardrails.cyclomaticFlag` (Story #4923). It used to
181
- * be the literal `8` written into this function and into the column header, so
182
- * a consumer that tuned the knob saw its own value validated by the schema,
183
- * defaulted by the bootstrap, resolved by `lib/config/quality.js` — and then
184
- * ignored here. The parameter defaults to the framework default so a caller
185
- * with no config in hand still gets the historical reading.
109
+ * Merge MI and CRAP envelopes into per-file rows: `miDrop` (higher = worse),
110
+ * `worstCrapDelta` (vs baseline, or vs ceiling for new methods), and
111
+ * `newOverCeilingMethods` (new methods with cyclomatic above the flag).
186
112
  *
187
113
  * @param {{ violations?: Array<{ file: string, drop?: number }> } | null} miEnvelope
188
114
  * @param {{ violations?: Array<{
@@ -249,14 +175,12 @@ export function mergeEnvelopes(
249
175
  (crapEnvelope?.summary?.newViolations ?? 0),
250
176
  },
251
177
  cyclomaticFlag: flag,
252
- // Story #5313: advisories ride the merge but never the exit code.
178
+ // Advisories ride the merge but never the exit code.
253
179
  advisories: advisoriesOf(crapEnvelope),
254
180
  };
255
181
  }
256
182
 
257
183
  /**
258
- * The cyclomatic advisories a CRAP envelope carries (Story #5313), or none.
259
- *
260
184
  * @param {{ cyclomaticAdvisories?: unknown } | null | undefined} crapEnvelope
261
185
  * @returns {Array<{ file: string, method: string, startLine: number, cyclomatic: number }>}
262
186
  */
@@ -266,10 +190,6 @@ function advisoriesOf(crapEnvelope) {
266
190
  }
267
191
 
268
192
  /**
269
- * Print the advisories block when there is one (Story #5313). Split out of
270
- * `emitReport` so that function's branching stays inside its committed
271
- * cyclomatic budget.
272
- *
273
193
  * @param {Array<object>} advisories
274
194
  * @param {{ write: (s: string) => void }} stdout
275
195
  * @returns {void}
@@ -280,11 +200,6 @@ function writeAdvisories(advisories, stdout) {
280
200
  }
281
201
 
282
202
  /**
283
- * Render the cyclomatic advisories block (Story #5313), or `null` when the
284
- * scan carried none. One line per method at or over the ceiling; the block
285
- * says outright that it is advisory so a reader does not hunt for the exit
286
- * code it did not change.
287
- *
288
203
  * @param {Array<{ file: string, method: string, startLine: number, cyclomatic: number }>} advisories
289
204
  * @returns {string|null}
290
205
  */
@@ -300,14 +215,8 @@ export function renderAdvisories(advisories) {
300
215
  }
301
216
 
302
217
  /**
303
- * Render the named diagnostics a gate envelope carries, or `null` when it
304
- * carries none (Story #4866).
305
- *
306
- * A diagnostic is what a gate emits *instead of* per-method verdicts when it
307
- * has established that no verdict it could produce would be meaningful — an
308
- * incomparable baseline, or a comparison basis whose drifted-row ratio proves
309
- * the two sides disagree on line coordinates. It must reach the operator
310
- * verbatim: the gate exits 0, so silence would read as a clean run.
218
+ * Gate diagnostics (emitted instead of verdicts when none would be
219
+ * meaningful). Surfaced verbatim: the gate exits 0, so silence reads as clean.
311
220
  *
312
221
  * @param {Array<{ envelope: { diagnostics?: Array<{name: string, message: string}> } | null }>} results
313
222
  * @returns {string | null}
@@ -323,18 +232,8 @@ export function renderDiagnostics(results) {
323
232
  }
324
233
 
325
234
  /**
326
- * Compute the CLI exit code from a merge result + per-gate exit codes. Pure.
327
- *
328
- * The exit code is non-zero (1) whenever:
329
- * - either gate returned a non-zero exit code (real violations or runtime
330
- * failure), OR
331
- * - the merged envelope reports any violation rows at all.
332
- *
333
- * Both signals are combined so a transient gate failure (e.g. JSON write
334
- * error) still surfaces even if the violations array happens to be empty.
335
- *
336
- * Advisories (`merged.advisories`, Story #5313) are deliberately not read
337
- * here: a method at cyclomatic 12 or above is reported and exits 0.
235
+ * 1 on any gate failure or violation (a gate failure counts even with no rows);
236
+ * advisories never affect it.
338
237
  *
339
238
  * @param {{ rows: Array<unknown>, totals: { miRegressions: number, crapViolations: number } }} merged
340
239
  * @param {number} miExit
@@ -350,28 +249,7 @@ export function computeExitCode(merged, miExit, crapExit) {
350
249
  }
351
250
 
352
251
  /**
353
- * Render the per-file delta table. Columns:
354
- * "file", "MI delta", "worst CRAP delta", "new-method count over c=<flag>".
355
- *
356
- * The last header used to hardcode `c=8`, which quietly lied to any consumer
357
- * that had tuned `codingGuardrails.cyclomaticFlag`. It now names the value the
358
- * count was actually taken against, read off the merge result — through the
359
- * same `normalizeFlag` the merge itself uses, rather than the second, hand-
360
- * inlined copy of that coercion this function used to carry.
361
- *
362
- * Pure — accepts pre-computed merge rows and returns a multi-line string. The
363
- * table renders even on a clean diff so operators see the "no drift" signal.
364
- *
365
- * @param {{ rows: Array<{ file: string, miDrop: number, worstCrapDelta: number, newOverCeilingMethods: number }>, totals: { miRegressions: number, crapViolations: number }, cyclomaticFlag?: number }} merged
366
- * @returns {string}
367
- */
368
- /**
369
- * The table's body: one row per regressed file, or the single placeholder
370
- * line that keeps the "no drift" signal visible on a clean diff.
371
- *
372
- * Split out of `renderTable` so that function keeps a flat shape — the
373
- * empty-vs-populated branch and the row loop together carried it above the
374
- * per-method CRAP contract the pre-push preview enforces.
252
+ * Placeholder row on a clean diff keeps the "no drift" signal visible.
375
253
  *
376
254
  * @param {Array<{ file: string, miDrop: number, worstCrapDelta: number, newOverCeilingMethods: number }>} rows
377
255
  * @returns {string[]}
@@ -384,6 +262,10 @@ function tableBodyLines(rows) {
384
262
  );
385
263
  }
386
264
 
265
+ /**
266
+ * @param {{ rows: Array<{ file: string, miDrop: number, worstCrapDelta: number, newOverCeilingMethods: number }>, totals: { miRegressions: number, crapViolations: number }, cyclomaticFlag?: number }} merged
267
+ * @returns {string}
268
+ */
387
269
  export function renderTable(merged) {
388
270
  const flag = normalizeFlag(merged?.cyclomaticFlag);
389
271
  const header = [
@@ -402,39 +284,7 @@ export function renderTable(merged) {
402
284
  }
403
285
 
404
286
  /**
405
- * Resolve `codingGuardrails.cyclomaticFlag` for the tree at `cwd`
406
- * (Story #4923), falling back to the framework default when the config cannot
407
- * be resolved at all.
408
- *
409
- * Best-effort by design: `quality:preview` is a developer-facing report, and a
410
- * run in a tree with no readable `.agentrc.json` should still render its table
411
- * rather than abort. Extracted from `runCli` rather than inlined so the CLI
412
- * body stays under the cyclomatic must-fix ceiling this same Story starts
413
- * enforcing — a gate whose own delivery breaches it is not a gate.
414
- *
415
- * @param {{ cwd: string, stderr: { write: (s: string) => void } }} args
416
- * @returns {number}
417
- */
418
- function resolveCyclomaticFlag({ cwd, stderr }) {
419
- try {
420
- return resolveCyclomaticPolicy(getQuality(resolveConfig({ cwd }))).flag;
421
- } catch (err) {
422
- stderr.write(
423
- `[quality:preview] config resolution failed, using cyclomaticFlag=${DEFAULT_CYCLOMATIC_FLAG}: ${err?.message ?? err}\n`,
424
- );
425
- return DEFAULT_CYCLOMATIC_FLAG;
426
- }
427
- }
428
-
429
- /**
430
- * Invoke one preview runner, degrading a thrown failure into the same
431
- * `{ exitCode: 1, envelope: null }` shape a real gate failure produces.
432
- *
433
- * Both runners degraded identically before, in two hand-copied `catch`
434
- * arms; folding them into one helper removes the copy and keeps `runCli` a
435
- * pipeline rather than a pair of inlined error handlers. The emitted message
436
- * is byte-identical to the arm it replaces — `label` supplies the `MI` /
437
- * `CRAP` prefix.
287
+ * A thrown runner degrades to the `{ exitCode: 1, envelope: null }` shape.
438
288
  *
439
289
  * @param {(args: object) => Promise<{exitCode: number, envelope: object|null}>} runner
440
290
  * @param {{cwd: string, staged: boolean, changedSinceRef: string|null}} args
@@ -452,19 +302,9 @@ function runGateSafely(runner, args, label, stderr) {
452
302
  }
453
303
 
454
304
  /**
455
- * Render the scope header line.
456
- *
457
- * Story #5131 — when `--staged` runs during a merge the scope is re-based to
458
- * `MERGE_HEAD`, and the header says so. Without that line the operator sees a
459
- * table whose row count does not match `git diff --cached` with no way to tell
460
- * the narrowing was deliberate.
461
- *
462
- * The merge state is resolved here rather than read back off a gate envelope's
463
- * `summary.diffRef`: that field means "the ref this scope was resolved
464
- * against" for every scope kind, so anything that populates it — a future
465
- * scope mode, a test stub — would render a merge banner over a repo that is
466
- * not merging. Resolving it after the `!staged` early return also keeps the
467
- * probe off the `--changed-since` path, which has no use for it.
305
+ * Scope header; names a `MERGE_HEAD` re-base so the narrowed row count reads as
306
+ * deliberate. Merge state is probed here, not read off an envelope's `diffRef`
307
+ * (which every scope kind populates).
468
308
  *
469
309
  * @param {{ staged: boolean, ref: string|null, cwd: string }} args
470
310
  * @returns {string}
@@ -481,13 +321,7 @@ function stagedScopeLine({ staged, ref, cwd }) {
481
321
  }
482
322
 
483
323
  /**
484
- * Write the run's report — the `--json` envelope, or the human-readable
485
- * table plus any gate diagnostics and the non-zero-exit summary.
486
- *
487
- * Split out of `runCli` (Story #5109): the rendering half carried five of
488
- * that function's decision points, which put it over the per-method CRAP
489
- * contract the pre-push preview enforces. Output bytes are unchanged in both
490
- * modes. The exit code stays with the caller — this function only reports.
324
+ * Write the `--json` envelope or the table + diagnostics; reports only.
491
325
  *
492
326
  * @param {{
493
327
  * json: boolean,
@@ -545,10 +379,6 @@ function emitReport({
545
379
  }
546
380
 
547
381
  /**
548
- * Top-level CLI entry: invoke both per-kind preview runners, merge, render,
549
- * and exit with the right code. Exposed as `runCli` so tests can drive the
550
- * full pipeline through injected runner stubs.
551
- *
552
382
  * @param {{
553
383
  * argv?: string[],
554
384
  * cwd?: string,
@@ -571,19 +401,9 @@ export async function runCli({
571
401
  const staged = parseStagedFlag(argv);
572
402
  const ref = staged ? null : (parseChangedSinceArg(argv) ?? 'HEAD');
573
403
 
574
- // Story #5109 — the two gates run **one after the other**, not under a
575
- // `Promise.all`. Each scores its batch with its own `runOnPool` budget
576
- // sized to `os.availableParallelism()`, so overlapping them oversubscribed
577
- // the host by 2x and stacked two escomplex heaps: a 58-file preview peaked
578
- // at 1.0-1.2 GB RSS for 3.9 s of CPU. Serialising them bounds the preview
579
- // to one `availableParallelism` of workers and one heap at a time. The two
580
- // runners share no state and neither reads the other's envelope, so the
581
- // emitted envelopes — and therefore the merged table and the exit code —
582
- // are identical either way; only the peak cost differs.
583
- //
584
- // Each runner gets its own options literal rather than one shared object,
585
- // so serialising them cannot introduce a coupling the concurrent form
586
- // did not have.
404
+ // Serial, not Promise.all: each runner sizes its own pool to
405
+ // availableParallelism, so overlapping them oversubscribes 2x and stacks
406
+ // two escomplex heaps (>1 GB RSS).
587
407
  const miResult = await runGateSafely(
588
408
  runMi,
589
409
  { cwd, staged, changedSinceRef: ref },
@@ -597,12 +417,8 @@ export async function runCli({
597
417
  stderr,
598
418
  );
599
419
 
600
- // Story #4923 — the over-ceiling column counts against the *resolved*
601
- // `codingGuardrails.cyclomaticFlag`, not the literal that used to be written
602
- // into `mergeEnvelopes` and the column header.
603
- const cyclomaticFlag = resolveCyclomaticFlag({ cwd, stderr });
604
420
  const merged = mergeEnvelopes(miResult.envelope, crapResult.envelope, {
605
- cyclomaticFlag,
421
+ cyclomaticFlag: DEFAULT_CYCLOMATIC_FLAG,
606
422
  });
607
423
 
608
424
  emitReport({
@@ -624,7 +440,6 @@ export async function runCli({
624
440
  }
625
441
 
626
442
  // cli-opt-out: Windows-aware main-guard with leading-slash drive-letter normalisation; mirrors quality-watch.js so the diagnostic surface stays consistent across the gate suite.
627
- // Only run main when invoked directly — keep the module importable from tests.
628
443
  const isDirect = (() => {
629
444
  try {
630
445
  const invoked = process.argv[1] ? path.resolve(process.argv[1]) : '';
@@ -1,20 +1,7 @@
1
1
  /**
2
- * CLI: resolve the repository's documentation read-tiers (Story #4438).
3
- *
4
- * Thin wrapper over `lib/doc-tiers.js#resolveDocTiers` that prints the tier
5
- * map — `{ tiers: { alwaysLoaded, mandatoryRead, digestVisible, onDemand } }`,
6
- * every entry `{ path, bytes }` — as JSON. Consumed by the `audit-documentation`
7
- * lens (read-tier severity weighting), the `check-context-budget.js` ratchet,
8
- * and operators inspecting the always-loaded closure.
9
- *
10
- * Flags:
11
- * --json emit the tier map as JSON to stdout (default rendering is also
12
- * JSON; the flag is accepted for parity with the sibling ratchets
13
- * and future non-JSON renderings).
14
- * --root <path> resolve tiers against an explicit repo root (default: the
15
- * resolved PROJECT_ROOT).
16
- *
17
- * Exit code is always 0 on success — this is a reporter, not a gate.
2
+ * CLI: print the documentation read-tier map
3
+ * (`{ tiers: { alwaysLoaded, mandatoryRead, digestVisible, onDemand } }`,
4
+ * entries `{ path, bytes }`) as JSON. A reporter, not a gate: exits 0.
18
5
  */
19
6
 
20
7
  import process from 'node:process';
@@ -23,8 +10,6 @@ import { PROJECT_ROOT, resolveConfig } from './lib/config-resolver.js';
23
10
  import { resolveDocTiers } from './lib/doc-tiers.js';
24
11
 
25
12
  /**
26
- * Parse argv for `--root <path>` and `--json`.
27
- *
28
13
  * @param {string[]} argv
29
14
  * @returns {{ rootPath: string | null, json: boolean }}
30
15
  */
@@ -47,14 +32,6 @@ export function parseArgv(argv = []) {
47
32
  }
48
33
 
49
34
  /**
50
- * Top-level CLI entry. Exported so tests can drive it against a fixture root
51
- * with an injected sink and config.
52
- *
53
- * The optional final `deps` parameter is the module's injectable seam
54
- * (`.agents/rules/test-seams.md` rules 1-2): every entry defaults to the real
55
- * implementation, so the CLI path below — and any production caller — needs no
56
- * configuration change.
57
- *
58
35
  * @param {{
59
36
  * argv?: string[],
60
37
  * config?: object,
@@ -1,29 +1,12 @@
1
1
  #!/usr/bin/env node
2
2
 
3
3
  /**
4
- * resolve-stories.js — resolve a list of Story ids into the
5
- * `{ stories, dag, done }` envelope `/mandrel-deliver` sequences from.
6
- *
7
- * This is the ONE resolution step for multi-Story delivery. `/mandrel-deliver` takes
8
- * only Story ids; the graph is discovered here, from live state, rather than
9
- * hand-transcribed by the host or implied by a batch label.
10
- *
11
- * What it resolves, per Story:
12
- * - the issue itself, fetched with **state=all** so an already-landed
13
- * sibling is present rather than silently dropped;
14
- * - its dependency edges: the union of the body's `---` footer
15
- * (`blocked by #N`, footer-scoped and strict — prose mentioning a blocker
16
- * elsewhere in the body declares nothing) and native GitHub `blocked_by`
17
- * edges, read to exhaustion and failing loud rather than degrading to
18
- * "no edges";
19
- * - its declared file footprint, as plain path strings, so the scheduler's
20
- * co-dispatch overlap guard has something to work with.
21
- *
22
- * And across the set: every dependency id — inside the requested set or
23
- * foreign to it — is checked against live issue state, and a blocker that is
24
- * closed or `agent::done` lands in `done[]`. That is what makes "deliver
25
- * Stories across plan runs and over time" work: a Story whose blocker merged
26
- * weeks ago in a different run is simply ready.
4
+ * resolve-stories.js — resolve Story ids into the `{ stories, dag, done }`
5
+ * envelope `/mandrel-deliver` sequences from, discovering the graph from live
6
+ * state: footer `blocked by #N` edges union native `blocked_by` edges (read to
7
+ * exhaustion, failing loud), plus each Story's footprint for the overlap
8
+ * guard. Every blocker, in-set or foreign, is checked live, so one that landed
9
+ * in an earlier run lands in `done[]`.
27
10
  *
28
11
  * Usage:
29
12
  * node .agents/scripts/resolve-stories.js --ids 101,102
@@ -55,22 +38,15 @@ import { paginateRest } from './providers/github/request-helpers.js';
55
38
 
56
39
  export {
57
40
  buildStoriesEnvelope,
58
- // Re-exported, not redefined (Story #5280). The reader now lives in
59
- // `epic-container.js` beside the shape it reads, so the expansion path and
60
- // the rollup share one definition — the pair whose divergence makes an Epic
61
- // expandable but unclosable. The name stays exported here because two test
62
- // modules import it from this entrypoint.
41
+ // Re-exported, not redefined: expansion and the Epic rollup must share one
42
+ // reader or an Epic becomes expandable but unclosable.
63
43
  nativeChildReader,
64
44
  parseIds,
65
45
  readNativeBlockedBy,
66
46
  toStoryRecord,
67
47
  };
68
48
 
69
- /**
70
- * Bounded concurrency for the per-issue round-trips. Matches the edge-writer's
71
- * cap: modest enough for GitHub's secondary rate limits, while collapsing
72
- * wall-clock from sum(round-trips) toward sum/concurrency.
73
- */
49
+ /** Modest enough for GitHub's secondary rate limits. */
74
50
  const FETCH_CONCURRENCY = 5;
75
51
 
76
52
  const HELP = `\
@@ -111,13 +87,8 @@ export function resolveStoriesProvider({
111
87
  }
112
88
 
113
89
  /**
114
- * Fetch every requested id and map it to a Story record, failing on the first
115
- * id that is not a deliverable Story.
116
- *
117
- * Container Epics are expanded to their open child Stories **first**, so
118
- * everything downstream sees a plain Story-id list (Story #5139). The
119
- * expansion walk is sequential because it is id-by-id conditional; the Story
120
- * fetch that follows stays under the bounded concurrency.
90
+ * Container Epics expand to their open child Stories first; fails on the
91
+ * first id that is not a deliverable Story.
121
92
  *
122
93
  * @param {object} provider
123
94
  * @param {number[]} ids
@@ -153,12 +124,7 @@ export async function fetchStories(provider, ids, { allowUnlabelled } = {}) {
153
124
  }
154
125
 
155
126
  /**
156
- * Read native blocked_by edges for every Story in the set.
157
- *
158
- * `paginate` is injected rather than imported inside the lib layer so
159
- * `readNativeBlockedBy` stays provider-agnostic and unit-testable; production
160
- * passes `paginateRest`, which walks every page (the read used to stop at the
161
- * first, silently truncating a Story's gates — Story #5046).
127
+ * `paginate` must walk every page; stopping at one silently drops gates.
162
128
  *
163
129
  * @returns {Promise<Map<number, number[]>>}
164
130
  */
@@ -189,14 +155,8 @@ export async function readNativeEdges({
189
155
  }
190
156
 
191
157
  /**
192
- * Resolve dependency ids that are NOT in the requested set against live issue
193
- * state. A foreign blocker that already landed must enter `done[]`, or the
194
- * scheduler withholds its dependent forever — the exact wedge that made
195
- * cross-run delivery impossible.
196
- *
197
- * A foreign id that cannot be read is left OUT of `done[]`: unknown means
198
- * "still gating", which withholds the dependent rather than dispatching it
199
- * against a possibly-unlanded blocker.
158
+ * A landed foreign blocker must enter `done[]` or its dependent waits forever;
159
+ * an unreadable one stays out (unknown means still gating).
200
160
  *
201
161
  * @returns {Promise<number[]>}
202
162
  */
@@ -227,11 +187,6 @@ export async function resolveForeignDone({ provider, dag, inSetIds }) {
227
187
  }
228
188
 
229
189
  /**
230
- * Resolve the requested ids into the `{ stories, dag, done }` envelope and
231
- * write it to `stdout`. The flow core behind `main` — provider, config, and
232
- * stdout are injected so the whole path is unit-testable without a live
233
- * GitHub round-trip. Exported for testing.
234
- *
235
190
  * @param {{ ids: string, native?: boolean, pretty?: boolean,
236
191
  * allowUnlabelled?: boolean }} args
237
192
  * @param {{ provider: object, config: object, stdout?: { write(s: string): void } }} deps
@@ -277,9 +232,6 @@ export async function runResolveStories(
277
232
  }
278
233
 
279
234
  /**
280
- * Project the parsed flags onto the flow core's options object, so `main` reads
281
- * as parse → help → run and the flag-name spellings live in one place.
282
- *
283
235
  * @param {Record<string, unknown>} values
284
236
  * @returns {{ ids: string, native: boolean, pretty: boolean, allowUnlabelled: boolean }}
285
237
  */
@@ -301,9 +253,7 @@ async function main() {
301
253
  'allow-unlabelled': { type: 'boolean', default: false },
302
254
  help: { type: 'boolean', default: false },
303
255
  },
304
- // The documented opt-out is `--no-native`; without allowNegative,
305
- // parseArgs rejects it as an unknown option and the CLI has no working
306
- // way to skip the dependencies API.
256
+ // Required for `--no-native` to parse.
307
257
  allowNegative: true,
308
258
  allowPositionals: false,
309
259
  });
@@ -317,8 +267,7 @@ async function main() {
317
267
  throw new Error('[resolve-stories] --ids <n,n,...> is required');
318
268
  }
319
269
 
320
- // stdout is a JSON stream — keep human-readable output on stderr so a
321
- // headless caller can pipe this straight into stories-wave-tick.js.
270
+ // stdout is a JSON stream.
322
271
  routeAllOutputToStderr();
323
272
 
324
273
  return runResolveStories(toRunOptions(values), resolveStoriesProvider());
@@ -2,26 +2,10 @@
2
2
  /* node:coverage ignore file */
3
3
 
4
4
  /**
5
- * resync-status-column.js — re-assert the GitHub Projects v2 Status
6
- * column for a ticket after auto-merge has fired (Story #2845).
7
- *
8
- * The `/single-story-deliver` and `/mandrel-deliver` workflow docs call
9
- * this CLI after Step 5 confirms `state: "MERGED"` so the orchestrator
10
- * wins the race against the GitHub built-in `Pull request merged`
11
- * workflow, which would otherwise overwrite Status to whatever value
12
- * the bot's rule prescribes (typically `In Progress`) ~minutes after
13
- * the merge lands.
14
- *
15
- * Story #2876 — the helper polls the live Status after the initial
16
- * mutation and re-fires on drift. The one-shot mutation routinely
17
- * lost the race (reproduced on Story #2871 / PR #2872); the bounded
18
- * poll loop hardens the defense-in-depth so consumers who haven't
19
- * disabled the conflicting bot workflows still get a deterministic
20
- * outcome.
21
- *
22
- * Idempotent: re-running on a ticket whose Status already matches the
23
- * derived target returns the same `synced` envelope and issues the
24
- * same single GraphQL mutation.
5
+ * resync-status-column.js — re-assert a ticket's Projects v2 Status after
6
+ * merge, beating GitHub's built-in "Pull request merged" workflow that
7
+ * overwrites it minutes later. A one-shot write loses that race, so the live
8
+ * Status is polled and re-fired on drift. Idempotent.
25
9
  *
26
10
  * Usage:
27
11
  * node .agents/scripts/resync-status-column.js --ticket <id>
@@ -84,9 +68,7 @@ export function parseArgv(argv) {
84
68
  }
85
69
 
86
70
  /**
87
- * Pure input-validation extracted so it can be tested without spawning
88
- * a subprocess. Returns `{ ticketId, pollAttempts, pollDelayMs, errors }`
89
- * — `errors` is empty on success.
71
+ * `errors` is empty on success.
90
72
  *
91
73
  * @param {Record<string, unknown>} values
92
74
  */
@@ -136,8 +118,7 @@ export function buildReassertOptions({
136
118
  };
137
119
  if (pollAttempts !== undefined) opts.pollAttempts = pollAttempts;
138
120
  if (pollDelayMs !== undefined) opts.pollDelayMs = pollDelayMs;
139
- // Story #4252 — forward the resolved config so ColumnSync's on-disk
140
- // board-metadata cache lands under the project's configured tempRoot.
121
+ // So the board-metadata cache lands under the configured tempRoot.
141
122
  if (config !== undefined) opts.config = config;
142
123
  return opts;
143
124
  }