mandrel 2.59.0 → 2.61.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (678) hide show
  1. package/.agents/README.md +21 -19
  2. package/.agents/agents/acceptance-critic.md +24 -43
  3. package/.agents/agents/story-worker.md +20 -21
  4. package/.agents/docs/agentrc-reference.json +5 -84
  5. package/.agents/docs/configuration.md +48 -132
  6. package/.agents/docs/workflows.md +2 -2
  7. package/.agents/instructions.md +5 -8
  8. package/.agents/rules/ci-remediation.md +41 -8
  9. package/.agents/rules/gherkin-standards.md +4 -0
  10. package/.agents/schemas/acceptance-eval-verdict.schema.json +1 -1
  11. package/.agents/schemas/agentrc.schema.json +16 -496
  12. package/.agents/schemas/story-deliver-terminal.schema.json +13 -3
  13. package/.agents/schemas/validation-evidence.schema.json +2 -1
  14. package/.agents/scripts/README.md +23 -13
  15. package/.agents/scripts/acceptance-eval.js +35 -169
  16. package/.agents/scripts/agents-bootstrap-github.js +27 -129
  17. package/.agents/scripts/apply-quality-bootstrap.js +4 -40
  18. package/.agents/scripts/audit-baselines.js +6 -27
  19. package/.agents/scripts/audit-labels-bootstrap.js +5 -29
  20. package/.agents/scripts/audit-to-stories.js +91 -361
  21. package/.agents/scripts/boot-sweep.js +19 -72
  22. package/.agents/scripts/bootstrap.js +74 -395
  23. package/.agents/scripts/ceremony-derive.js +10 -41
  24. package/.agents/scripts/check-arch-cycles.js +14 -64
  25. package/.agents/scripts/check-baselines.js +8 -48
  26. package/.agents/scripts/check-context-budget.js +105 -311
  27. package/.agents/scripts/check-cyclomatic.js +12 -44
  28. package/.agents/scripts/check-dead-exports.js +13 -64
  29. package/.agents/scripts/check-doc-links.js +38 -186
  30. package/.agents/scripts/check-gherkin-corpus.js +24 -127
  31. package/.agents/scripts/check-test-temp-hygiene.js +28 -169
  32. package/.agents/scripts/coverage-capture.js +34 -98
  33. package/.agents/scripts/deliver-light.js +25 -171
  34. package/.agents/scripts/deliver-recover.js +6 -42
  35. package/.agents/scripts/deliver-run.js +534 -0
  36. package/.agents/scripts/diagnose-friction.js +24 -116
  37. package/.agents/scripts/drain-pending-cleanup.js +1 -1
  38. package/.agents/scripts/evidence-gate.js +23 -85
  39. package/.agents/scripts/file-ci-gap.js +57 -49
  40. package/.agents/scripts/generate-config-docs.js +30 -170
  41. package/.agents/scripts/generate-lens-checklists.js +8 -52
  42. package/.agents/scripts/generate-skills-index.js +14 -112
  43. package/.agents/scripts/generate-workflows-doc.js +10 -70
  44. package/.agents/scripts/git-cleanup.js +2 -34
  45. package/.agents/scripts/lib/Graph.js +24 -81
  46. package/.agents/scripts/lib/ITicketingProvider.js +47 -143
  47. package/.agents/scripts/lib/Logger.js +14 -76
  48. package/.agents/scripts/lib/audit-baselines/engine.js +11 -31
  49. package/.agents/scripts/lib/audit-baselines/gate-surface.js +3 -17
  50. package/.agents/scripts/lib/audit-baselines/headroom.js +4 -20
  51. package/.agents/scripts/lib/audit-baselines/hotspots.js +3 -15
  52. package/.agents/scripts/lib/audit-baselines/kinds.js +23 -89
  53. package/.agents/scripts/lib/audit-baselines/outliers.js +6 -23
  54. package/.agents/scripts/lib/audit-baselines/read.js +3 -16
  55. package/.agents/scripts/lib/audit-baselines/staleness.js +7 -26
  56. package/.agents/scripts/lib/audit-baselines/surface-entry.js +7 -28
  57. package/.agents/scripts/lib/audit-baselines/trend.js +7 -20
  58. package/.agents/scripts/lib/audit-baselines/weights.js +9 -37
  59. package/.agents/scripts/lib/audit-suite/audit-rules-reader.js +3 -18
  60. package/.agents/scripts/lib/audit-suite/checklist-threading.js +26 -124
  61. package/.agents/scripts/lib/audit-suite/dispatch-checklist.js +14 -45
  62. package/.agents/scripts/lib/audit-suite/findings.js +12 -52
  63. package/.agents/scripts/lib/audit-suite/frontmatter.js +5 -29
  64. package/.agents/scripts/lib/audit-suite/index.js +1 -15
  65. package/.agents/scripts/lib/audit-suite/lens-checklist.js +10 -45
  66. package/.agents/scripts/lib/audit-suite/lens-diff-floor.js +11 -76
  67. package/.agents/scripts/lib/audit-suite/runner.js +13 -43
  68. package/.agents/scripts/lib/audit-suite/selector.js +49 -349
  69. package/.agents/scripts/lib/audit-suite/substitutions.js +12 -40
  70. package/.agents/scripts/lib/audit-suite/workflow-loader.js +3 -15
  71. package/.agents/scripts/lib/audit-to-stories/audit-label-taxonomy.js +11 -73
  72. package/.agents/scripts/lib/audit-to-stories/audit-lenses.js +8 -37
  73. package/.agents/scripts/lib/audit-to-stories/build-story-body.js +25 -143
  74. package/.agents/scripts/lib/audit-to-stories/dedupe-against-github.js +14 -80
  75. package/.agents/scripts/lib/audit-to-stories/epic-grouping-directive.js +4 -18
  76. package/.agents/scripts/lib/audit-to-stories/finding-adapter.js +7 -40
  77. package/.agents/scripts/lib/audit-to-stories/group-findings.js +9 -39
  78. package/.agents/scripts/lib/audit-to-stories/issue-corpus.js +10 -66
  79. package/.agents/scripts/lib/audit-to-stories/issue-index.js +6 -30
  80. package/.agents/scripts/lib/audit-to-stories/issues-file.js +6 -36
  81. package/.agents/scripts/lib/audit-to-stories/ledger-commit.js +17 -69
  82. package/.agents/scripts/lib/audit-to-stories/ledger-pr.js +17 -85
  83. package/.agents/scripts/lib/audit-to-stories/ledger-record.js +10 -48
  84. package/.agents/scripts/lib/audit-to-stories/parse-audit-md.js +38 -146
  85. package/.agents/scripts/lib/audit-to-stories/seed-from-findings.js +7 -42
  86. package/.agents/scripts/lib/audit-to-stories/wire-dependencies.js +10 -57
  87. package/.agents/scripts/lib/baseline-loader.js +12 -51
  88. package/.agents/scripts/lib/baseline-schema-registry.js +5 -22
  89. package/.agents/scripts/lib/baselines/component-matcher.js +3 -12
  90. package/.agents/scripts/lib/baselines/components.js +10 -61
  91. package/.agents/scripts/lib/baselines/coverage-updater-cli.js +7 -36
  92. package/.agents/scripts/lib/baselines/crap-preview-incremental.js +7 -19
  93. package/.agents/scripts/lib/baselines/crap-preview-scan.js +19 -45
  94. package/.agents/scripts/lib/baselines/crap-updater-cli.js +16 -65
  95. package/.agents/scripts/lib/baselines/diff-scope-cli.js +5 -33
  96. package/.agents/scripts/lib/baselines/duplication-scanner.js +11 -60
  97. package/.agents/scripts/lib/baselines/env-overrides.js +12 -67
  98. package/.agents/scripts/lib/baselines/envelope.js +13 -129
  99. package/.agents/scripts/lib/baselines/exit-codes.js +6 -49
  100. package/.agents/scripts/lib/baselines/git-base.js +23 -142
  101. package/.agents/scripts/lib/baselines/kernel.js +11 -111
  102. package/.agents/scripts/lib/baselines/kinds/_crap-new-method-gate.js +9 -47
  103. package/.agents/scripts/lib/baselines/kinds/_crap-read.js +8 -51
  104. package/.agents/scripts/lib/baselines/kinds/_shared-metric.js +7 -62
  105. package/.agents/scripts/lib/baselines/kinds/bundle-size.js +8 -29
  106. package/.agents/scripts/lib/baselines/kinds/coverage.js +3 -15
  107. package/.agents/scripts/lib/baselines/kinds/crap.js +94 -415
  108. package/.agents/scripts/lib/baselines/kinds/duplication.js +4 -30
  109. package/.agents/scripts/lib/baselines/kinds/kind-factory.js +7 -53
  110. package/.agents/scripts/lib/baselines/kinds/maintainability.js +15 -80
  111. package/.agents/scripts/lib/baselines/kinds/mutation.js +12 -72
  112. package/.agents/scripts/lib/baselines/maintainability-baseline-io.js +4 -11
  113. package/.agents/scripts/lib/baselines/merge-envelopes.js +30 -146
  114. package/.agents/scripts/lib/baselines/path-canon.js +19 -128
  115. package/.agents/scripts/lib/baselines/preview-gates.js +8 -37
  116. package/.agents/scripts/lib/baselines/reader.js +14 -107
  117. package/.agents/scripts/lib/baselines/refresh-service.js +35 -252
  118. package/.agents/scripts/lib/baselines/scope.js +11 -135
  119. package/.agents/scripts/lib/baselines/writer.js +16 -149
  120. package/.agents/scripts/lib/bdd-runner-detect.js +18 -113
  121. package/.agents/scripts/lib/bdd-scenario-budget.js +9 -36
  122. package/.agents/scripts/lib/bdd-scenario-scanner.js +11 -73
  123. package/.agents/scripts/lib/bdd-step-index.js +26 -100
  124. package/.agents/scripts/lib/bootstrap/baseline-merge-driver.js +23 -103
  125. package/.agents/scripts/lib/bootstrap/branch-protection.js +2 -5
  126. package/.agents/scripts/lib/bootstrap/commit-push.js +12 -50
  127. package/.agents/scripts/lib/bootstrap/gh-preflight.js +14 -101
  128. package/.agents/scripts/lib/bootstrap/hitl-confirm.js +5 -30
  129. package/.agents/scripts/lib/bootstrap/install-ledger.js +17 -73
  130. package/.agents/scripts/lib/bootstrap/issue-forms-template.js +17 -121
  131. package/.agents/scripts/lib/bootstrap/manifest.js +15 -86
  132. package/.agents/scripts/lib/bootstrap/merge-methods.js +4 -33
  133. package/.agents/scripts/lib/bootstrap/preflight.js +12 -61
  134. package/.agents/scripts/lib/bootstrap/project-bootstrap.js +34 -235
  135. package/.agents/scripts/lib/bootstrap/prompt.js +21 -129
  136. package/.agents/scripts/lib/bootstrap/quality-bootstrap.js +27 -141
  137. package/.agents/scripts/lib/bootstrap/summary.js +1 -8
  138. package/.agents/scripts/lib/bootstrap/workflow-audit.js +11 -84
  139. package/.agents/scripts/lib/branch-name-guard.js +4 -23
  140. package/.agents/scripts/lib/changed-files.js +39 -121
  141. package/.agents/scripts/lib/checks/core-bare-clean.js +4 -24
  142. package/.agents/scripts/lib/checks/index.js +18 -101
  143. package/.agents/scripts/lib/checks/loop-health.js +11 -53
  144. package/.agents/scripts/lib/checks/state.js +16 -91
  145. package/.agents/scripts/lib/checks/story-init-not-backgrounded.js +10 -61
  146. package/.agents/scripts/lib/checks/subagent-agent-tool-required.js +14 -83
  147. package/.agents/scripts/lib/child-exec.js +39 -108
  148. package/.agents/scripts/lib/cli/standard-args.js +9 -116
  149. package/.agents/scripts/lib/cli-args.js +31 -146
  150. package/.agents/scripts/lib/cli-usage.js +5 -27
  151. package/.agents/scripts/lib/cli-utils.js +2 -12
  152. package/.agents/scripts/lib/close-validation/commands.js +13 -76
  153. package/.agents/scripts/lib/close-validation/gates.js +92 -331
  154. package/.agents/scripts/lib/close-validation/process.js +121 -151
  155. package/.agents/scripts/lib/close-validation/projections/advisories.js +5 -31
  156. package/.agents/scripts/lib/close-validation/projections/crap.js +19 -67
  157. package/.agents/scripts/lib/close-validation/projections/head-sha.js +1 -17
  158. package/.agents/scripts/lib/close-validation/projections/inputs.js +4 -34
  159. package/.agents/scripts/lib/close-validation/projections/maintainability.js +11 -58
  160. package/.agents/scripts/lib/close-validation/runner.js +53 -110
  161. package/.agents/scripts/lib/command-header.js +6 -28
  162. package/.agents/scripts/lib/config/acceptance-eval.js +4 -30
  163. package/.agents/scripts/lib/config/baselines.js +3 -14
  164. package/.agents/scripts/lib/config/ci.js +8 -38
  165. package/.agents/scripts/lib/config/commands.js +1 -15
  166. package/.agents/scripts/lib/config/defaults.js +4 -33
  167. package/.agents/scripts/lib/config/delivery-routing.js +6 -34
  168. package/.agents/scripts/lib/config/explain.js +10 -83
  169. package/.agents/scripts/lib/config/gates/coverage.schema.js +0 -12
  170. package/.agents/scripts/lib/config/gates/crap-incremental-coverage.schema.js +3 -31
  171. package/.agents/scripts/lib/config/gates/crap.schema.js +1 -34
  172. package/.agents/scripts/lib/config/gates/duplication.schema.js +1 -8
  173. package/.agents/scripts/lib/config/gates/index.js +2 -17
  174. package/.agents/scripts/lib/config/gates/maintainability.schema.js +1 -20
  175. package/.agents/scripts/lib/config/gates/mutation.schema.js +1 -7
  176. package/.agents/scripts/lib/config/gates/shared.js +4 -64
  177. package/.agents/scripts/lib/config/github.js +4 -22
  178. package/.agents/scripts/lib/config/limits.js +4 -57
  179. package/.agents/scripts/lib/config/paths.js +2 -21
  180. package/.agents/scripts/lib/config/qa.js +4 -38
  181. package/.agents/scripts/lib/config/quality.js +76 -432
  182. package/.agents/scripts/lib/config/runners.js +12 -56
  183. package/.agents/scripts/lib/config/runtime.js +13 -57
  184. package/.agents/scripts/lib/config/shared.js +2 -16
  185. package/.agents/scripts/lib/config/sync-agentrc.js +9 -50
  186. package/.agents/scripts/lib/config/temp-paths.js +40 -280
  187. package/.agents/scripts/lib/config/validate-orchestration.js +5 -17
  188. package/.agents/scripts/lib/config/worktree-isolation.js +9 -28
  189. package/.agents/scripts/lib/config-resolver.js +11 -52
  190. package/.agents/scripts/lib/config-schema-shared.js +1 -4
  191. package/.agents/scripts/lib/config-settings-schema-delivery.js +16 -291
  192. package/.agents/scripts/lib/config-settings-schema-quality.js +7 -219
  193. package/.agents/scripts/lib/config-settings-schema.js +37 -274
  194. package/.agents/scripts/lib/coverage-baseline.js +20 -110
  195. package/.agents/scripts/lib/coverage-capture-fullscope.js +18 -35
  196. package/.agents/scripts/lib/coverage-capture-incremental.js +15 -45
  197. package/.agents/scripts/lib/coverage-capture-usage.js +8 -25
  198. package/.agents/scripts/lib/coverage-capture.js +99 -224
  199. package/.agents/scripts/lib/coverage-utils.js +14 -79
  200. package/.agents/scripts/lib/cpu-pool.js +17 -123
  201. package/.agents/scripts/lib/crap-baseline-join.js +16 -88
  202. package/.agents/scripts/lib/crap-coordinates.js +6 -25
  203. package/.agents/scripts/lib/crap-engine.js +40 -153
  204. package/.agents/scripts/lib/crap-method-identity.js +16 -78
  205. package/.agents/scripts/lib/crap-utils.js +31 -155
  206. package/.agents/scripts/lib/cyclomatic-ceiling.js +14 -87
  207. package/.agents/scripts/lib/cyclomatic-scope.js +10 -50
  208. package/.agents/scripts/lib/dead-exports-knip.js +18 -56
  209. package/.agents/scripts/lib/dead-exports-mode.js +5 -24
  210. package/.agents/scripts/lib/degraded-mode.js +3 -26
  211. package/.agents/scripts/lib/dependency-parser.js +8 -40
  212. package/.agents/scripts/lib/dependency-version.js +13 -35
  213. package/.agents/scripts/lib/detect-package-manager.js +6 -36
  214. package/.agents/scripts/lib/doc-tiers.js +22 -124
  215. package/.agents/scripts/lib/duplicate-search.js +8 -72
  216. package/.agents/scripts/lib/env-loader.js +5 -27
  217. package/.agents/scripts/lib/error-redactor.js +6 -31
  218. package/.agents/scripts/lib/errors/index.js +2 -22
  219. package/.agents/scripts/lib/escomplex-ast-compat.js +22 -163
  220. package/.agents/scripts/lib/escomplex-kernel.js +21 -123
  221. package/.agents/scripts/lib/feedback-loop/graduator-core.js +94 -419
  222. package/.agents/scripts/lib/feedback-loop/prior-feedback-fetcher.js +20 -98
  223. package/.agents/scripts/lib/feedback-loop/retro-proposals-graduator.js +27 -149
  224. package/.agents/scripts/lib/findings/audit-ledger.js +23 -97
  225. package/.agents/scripts/lib/findings/classify-finding.js +14 -69
  226. package/.agents/scripts/lib/findings/promote-finding.js +14 -112
  227. package/.agents/scripts/lib/findings/provenance-field.js +11 -52
  228. package/.agents/scripts/lib/findings/route-finding.js +37 -255
  229. package/.agents/scripts/lib/findings/semantic-issue-search.js +14 -59
  230. package/.agents/scripts/lib/findings/severity.js +18 -104
  231. package/.agents/scripts/lib/format-generated-json.js +12 -44
  232. package/.agents/scripts/lib/full-suite-lock.js +160 -429
  233. package/.agents/scripts/lib/full-suite-queue.js +213 -0
  234. package/.agents/scripts/lib/gates/baseline-store.js +5 -9
  235. package/.agents/scripts/lib/gates/friction.js +1 -3
  236. package/.agents/scripts/lib/generated/agentrc-validator.js +2 -2
  237. package/.agents/scripts/lib/gh-exec.js +123 -191
  238. package/.agents/scripts/lib/git/cached-fetch.js +9 -52
  239. package/.agents/scripts/lib/git/sync-from-base.js +15 -107
  240. package/.agents/scripts/lib/git-branch-cleanup.js +14 -61
  241. package/.agents/scripts/lib/git-branch-lifecycle.js +16 -87
  242. package/.agents/scripts/lib/git-utils.js +37 -161
  243. package/.agents/scripts/lib/github/framework-repo.js +8 -71
  244. package/.agents/scripts/lib/github-url.js +2 -17
  245. package/.agents/scripts/lib/import-graph.js +11 -38
  246. package/.agents/scripts/lib/install-cmd-parser.js +4 -13
  247. package/.agents/scripts/lib/json-utils.js +3 -18
  248. package/.agents/scripts/lib/label-constants.js +16 -111
  249. package/.agents/scripts/lib/label-taxonomy.js +4 -30
  250. package/.agents/scripts/lib/maintainability-engine.js +12 -80
  251. package/.agents/scripts/lib/maintainability-unscorable.js +5 -25
  252. package/.agents/scripts/lib/maintainability-utils.js +16 -92
  253. package/.agents/scripts/lib/mandrel-catalog.js +12 -70
  254. package/.agents/scripts/lib/notifications/notifier.js +13 -38
  255. package/.agents/scripts/lib/npm-scripts.js +4 -23
  256. package/.agents/scripts/lib/observability/metrics-ledger.js +16 -76
  257. package/.agents/scripts/lib/observability/runtime-friction.js +44 -286
  258. package/.agents/scripts/lib/observability/signal-validator.js +5 -37
  259. package/.agents/scripts/lib/observability/signals-writer.js +11 -121
  260. package/.agents/scripts/lib/observability/source-classifier.js +22 -203
  261. package/.agents/scripts/lib/observability/terse-result.js +14 -47
  262. package/.agents/scripts/lib/onboard/init-tail.js +13 -74
  263. package/.agents/scripts/lib/onboard/scaffold-docs.js +11 -34
  264. package/.agents/scripts/lib/orchestration/acceptance-eval-decision.js +25 -139
  265. package/.agents/scripts/lib/orchestration/auto-merge-cwd.js +11 -66
  266. package/.agents/scripts/lib/orchestration/behind-recovery.js +10 -55
  267. package/.agents/scripts/lib/orchestration/ceremony-routing.js +28 -156
  268. package/.agents/scripts/lib/orchestration/change-set.js +7 -36
  269. package/.agents/scripts/lib/orchestration/check-baselines/phases/compare.js +9 -46
  270. package/.agents/scripts/lib/orchestration/check-baselines/phases/evaluate.js +11 -44
  271. package/.agents/scripts/lib/orchestration/check-baselines/phases/floors.js +5 -24
  272. package/.agents/scripts/lib/orchestration/check-baselines/phases/friction.js +3 -12
  273. package/.agents/scripts/lib/orchestration/check-baselines/phases/parse-args.js +5 -38
  274. package/.agents/scripts/lib/orchestration/check-baselines/phases/pipeline.js +3 -8
  275. package/.agents/scripts/lib/orchestration/check-baselines/phases/refresh-ack.js +28 -136
  276. package/.agents/scripts/lib/orchestration/check-baselines/phases/report.js +3 -13
  277. package/.agents/scripts/lib/orchestration/check-state.js +92 -0
  278. package/.agents/scripts/lib/orchestration/ci-gap-intake.js +37 -144
  279. package/.agents/scripts/lib/orchestration/ci-rerun-guard.js +121 -157
  280. package/.agents/scripts/lib/orchestration/code-review.js +24 -128
  281. package/.agents/scripts/lib/orchestration/column-sync.js +23 -111
  282. package/.agents/scripts/lib/orchestration/complexity-gate.js +118 -462
  283. package/.agents/scripts/lib/orchestration/deliver-recover.js +36 -168
  284. package/.agents/scripts/lib/orchestration/dependency-analyzer.js +4 -35
  285. package/.agents/scripts/lib/orchestration/dependency-candidates.js +9 -41
  286. package/.agents/scripts/lib/orchestration/diff-magnitude.js +25 -115
  287. package/.agents/scripts/lib/orchestration/doc-reader.js +2 -6
  288. package/.agents/scripts/lib/orchestration/docs-digest.js +13 -51
  289. package/.agents/scripts/lib/orchestration/epic-candidates.js +13 -53
  290. package/.agents/scripts/lib/orchestration/epic-checklist.js +9 -33
  291. package/.agents/scripts/lib/orchestration/epic-container.js +41 -167
  292. package/.agents/scripts/lib/orchestration/epic-expansion.js +10 -40
  293. package/.agents/scripts/lib/orchestration/epic-rollup.js +55 -207
  294. package/.agents/scripts/lib/orchestration/file-assumption-enum.js +2 -22
  295. package/.agents/scripts/lib/orchestration/file-assumptions.js +45 -253
  296. package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-detect.js +9 -46
  297. package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-reap.js +7 -57
  298. package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches.js +21 -126
  299. package/.agents/scripts/lib/orchestration/git-cleanup/phases/cli.js +2 -6
  300. package/.agents/scripts/lib/orchestration/git-cleanup/phases/fast-forward.js +1 -4
  301. package/.agents/scripts/lib/orchestration/git-cleanup/phases/filters.js +1 -5
  302. package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes-ff.js +9 -34
  303. package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes.js +41 -190
  304. package/.agents/scripts/lib/orchestration/git-cleanup/phases/merged-tip.js +9 -45
  305. package/.agents/scripts/lib/orchestration/git-cleanup/phases/parse-args.js +1 -4
  306. package/.agents/scripts/lib/orchestration/git-cleanup/phases/phase-drivers.js +19 -85
  307. package/.agents/scripts/lib/orchestration/git-cleanup/phases/prompts.js +3 -17
  308. package/.agents/scripts/lib/orchestration/git-cleanup/phases/prune.js +1 -5
  309. package/.agents/scripts/lib/orchestration/git-cleanup/phases/render.js +16 -100
  310. package/.agents/scripts/lib/orchestration/git-cleanup/phases/stashes.js +1 -4
  311. package/.agents/scripts/lib/orchestration/lease-guard-shared.js +16 -67
  312. package/.agents/scripts/lib/orchestration/lifecycle/emit-ledger-event.js +9 -33
  313. package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-flip-failed.js +8 -29
  314. package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-unlanded.js +15 -68
  315. package/.agents/scripts/lib/orchestration/light-backstop.js +11 -49
  316. package/.agents/scripts/lib/orchestration/light-escalation.js +21 -89
  317. package/.agents/scripts/lib/orchestration/light-suitability.js +37 -307
  318. package/.agents/scripts/lib/orchestration/merge-block-class.js +39 -216
  319. package/.agents/scripts/lib/orchestration/merge-poll.js +104 -377
  320. package/.agents/scripts/lib/orchestration/pinned-identifier-lint.js +17 -57
  321. package/.agents/scripts/lib/orchestration/plan-context.js +55 -318
  322. package/.agents/scripts/lib/orchestration/plan-critic-conditions.js +22 -79
  323. package/.agents/scripts/lib/orchestration/plan-critics-evaluate.js +5 -31
  324. package/.agents/scripts/lib/orchestration/plan-metrics.js +29 -108
  325. package/.agents/scripts/lib/orchestration/plan-navigation.js +8 -27
  326. package/.agents/scripts/lib/orchestration/plan-persist/acceptance-handle-repair.js +12 -49
  327. package/.agents/scripts/lib/orchestration/plan-persist/audit-provenance.js +18 -73
  328. package/.agents/scripts/lib/orchestration/plan-persist/changes-repair.js +16 -78
  329. package/.agents/scripts/lib/orchestration/plan-persist/cross-plan-links.js +6 -30
  330. package/.agents/scripts/lib/orchestration/plan-persist/epic-adoption.js +14 -65
  331. package/.agents/scripts/lib/orchestration/plan-persist/epic-ops.js +21 -76
  332. package/.agents/scripts/lib/orchestration/plan-persist/external-deps.js +6 -43
  333. package/.agents/scripts/lib/orchestration/plan-persist/persist-helpers.js +14 -68
  334. package/.agents/scripts/lib/orchestration/plan-persist/plan-context-source.js +9 -41
  335. package/.agents/scripts/lib/orchestration/plan-persist/run-plan-persist.js +71 -289
  336. package/.agents/scripts/lib/orchestration/plan-persist/soft-findings.js +2 -12
  337. package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +96 -362
  338. package/.agents/scripts/lib/orchestration/plan-persist/summary.js +9 -39
  339. package/.agents/scripts/lib/orchestration/plan-persist/supersede-ops.js +60 -186
  340. package/.agents/scripts/lib/orchestration/plan-persist/wave-collision-gate.js +9 -49
  341. package/.agents/scripts/lib/orchestration/plan-persist/wave-serialisation.js +7 -28
  342. package/.agents/scripts/lib/orchestration/plan-reachability.js +13 -42
  343. package/.agents/scripts/lib/orchestration/plan-run-labels/reap.js +16 -91
  344. package/.agents/scripts/lib/orchestration/plan-runner/worktree-sweep.js +16 -54
  345. package/.agents/scripts/lib/orchestration/plan-text-hygiene.js +10 -52
  346. package/.agents/scripts/lib/orchestration/planning/authoring-context.js +14 -109
  347. package/.agents/scripts/lib/orchestration/planning/memory-pool-advisory.js +11 -83
  348. package/.agents/scripts/lib/orchestration/pr-watch.js +48 -306
  349. package/.agents/scripts/lib/orchestration/project-meta-cache.js +15 -80
  350. package/.agents/scripts/lib/orchestration/project-meta-resolver.js +10 -51
  351. package/.agents/scripts/lib/orchestration/reassert-status-column.js +12 -76
  352. package/.agents/scripts/lib/orchestration/remote-verifier.js +12 -36
  353. package/.agents/scripts/lib/orchestration/resolve-stories.js +33 -164
  354. package/.agents/scripts/lib/orchestration/retro-proposals.js +66 -361
  355. package/.agents/scripts/lib/orchestration/review-base-ref.js +9 -43
  356. package/.agents/scripts/lib/orchestration/review-depth.js +12 -91
  357. package/.agents/scripts/lib/orchestration/review-providers/codex.js +10 -111
  358. package/.agents/scripts/lib/orchestration/review-providers/degraded-gates.js +13 -71
  359. package/.agents/scripts/lib/orchestration/review-providers/findings-renderer.js +7 -51
  360. package/.agents/scripts/lib/orchestration/review-providers/mi-exemptions.js +8 -53
  361. package/.agents/scripts/lib/orchestration/review-providers/native.js +30 -214
  362. package/.agents/scripts/lib/orchestration/review-providers/parse-findings.js +7 -52
  363. package/.agents/scripts/lib/orchestration/review-providers/review-depth.js +4 -33
  364. package/.agents/scripts/lib/orchestration/review-providers/review-provider-factory.js +11 -71
  365. package/.agents/scripts/lib/orchestration/review-providers/scoped-lint.js +19 -131
  366. package/.agents/scripts/lib/orchestration/review-providers/security-review.js +6 -89
  367. package/.agents/scripts/lib/orchestration/review-providers/types.js +26 -56
  368. package/.agents/scripts/lib/orchestration/review-providers/ultrareview.js +3 -46
  369. package/.agents/scripts/lib/orchestration/run-epilogue.js +245 -326
  370. package/.agents/scripts/lib/orchestration/run-scoped-config.js +55 -159
  371. package/.agents/scripts/lib/orchestration/single-story-close/close-note.js +7 -34
  372. package/.agents/scripts/lib/orchestration/single-story-close/failed-terminal.js +16 -89
  373. package/.agents/scripts/lib/orchestration/single-story-close/gate-log.js +18 -109
  374. package/.agents/scripts/lib/orchestration/single-story-close/phases/auto-merge.js +83 -239
  375. package/.agents/scripts/lib/orchestration/single-story-close/phases/base-sync.js +20 -82
  376. package/.agents/scripts/lib/orchestration/single-story-close/phases/close-validation.js +103 -97
  377. package/.agents/scripts/lib/orchestration/single-story-close/phases/code-review.js +8 -64
  378. package/.agents/scripts/lib/orchestration/single-story-close/phases/confirm-merge.js +136 -486
  379. package/.agents/scripts/lib/orchestration/single-story-close/phases/conventional-subject.js +30 -134
  380. package/.agents/scripts/lib/orchestration/single-story-close/phases/graphql-preflight.js +96 -0
  381. package/.agents/scripts/lib/orchestration/single-story-close/phases/lock-wait-pending.js +49 -0
  382. package/.agents/scripts/lib/orchestration/single-story-close/phases/normalize-pr-title.js +13 -86
  383. package/.agents/scripts/lib/orchestration/single-story-close/phases/options.js +20 -95
  384. package/.agents/scripts/lib/orchestration/single-story-close/phases/post-land.js +46 -203
  385. package/.agents/scripts/lib/orchestration/single-story-close/phases/pre-gate-steps.js +8 -50
  386. package/.agents/scripts/lib/orchestration/single-story-close/phases/pull-request.js +12 -83
  387. package/.agents/scripts/lib/orchestration/single-story-close/phases/push.js +6 -39
  388. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-block.js +1 -6
  389. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-outcome.js +4 -28
  390. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-override.js +6 -51
  391. package/.agents/scripts/lib/orchestration/single-story-close/phases/worktree-reap.js +6 -34
  392. package/.agents/scripts/lib/orchestration/single-story-close/phases/wrong-tree-guard.js +23 -121
  393. package/.agents/scripts/lib/orchestration/single-story-close/runner.js +180 -273
  394. package/.agents/scripts/lib/orchestration/single-story-lease-guard.js +15 -69
  395. package/.agents/scripts/lib/orchestration/story-body-gate.js +4 -23
  396. package/.agents/scripts/lib/orchestration/story-close/baseline-upward-writeback.js +50 -179
  397. package/.agents/scripts/lib/orchestration/story-close/context-budget-writeback.js +11 -41
  398. package/.agents/scripts/lib/orchestration/story-close/format-autofix.js +23 -311
  399. package/.agents/scripts/lib/orchestration/story-close/phases/local-lens-review.js +22 -147
  400. package/.agents/scripts/lib/orchestration/story-close/phases/review-core.js +16 -67
  401. package/.agents/scripts/lib/orchestration/story-deliver-terminal-schema.js +12 -68
  402. package/.agents/scripts/lib/orchestration/story-deliver-terminal.js +42 -200
  403. package/.agents/scripts/lib/orchestration/story-follow-ups.js +167 -252
  404. package/.agents/scripts/lib/orchestration/story-init-envelope.js +52 -0
  405. package/.agents/scripts/lib/orchestration/story-init-remote.js +2 -6
  406. package/.agents/scripts/lib/orchestration/story-reachability.js +3 -23
  407. package/.agents/scripts/lib/orchestration/task-body-validator.js +12 -135
  408. package/.agents/scripts/lib/orchestration/ticket-lease.js +28 -131
  409. package/.agents/scripts/lib/orchestration/ticket-validator-conflicts.js +15 -149
  410. package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +5 -33
  411. package/.agents/scripts/lib/orchestration/ticket-validator.js +63 -344
  412. package/.agents/scripts/lib/orchestration/ticketing/bulk.js +51 -244
  413. package/.agents/scripts/lib/orchestration/ticketing/reads.js +39 -261
  414. package/.agents/scripts/lib/orchestration/ticketing/state.js +14 -68
  415. package/.agents/scripts/lib/orchestration/ticketing/transition.js +46 -263
  416. package/.agents/scripts/lib/orchestration/ticketing.js +2 -26
  417. package/.agents/scripts/lib/orchestration/verify-credit.js +18 -79
  418. package/.agents/scripts/lib/orchestration/worktree-dirty.js +5 -30
  419. package/.agents/scripts/lib/path-security.js +3 -6
  420. package/.agents/scripts/lib/plan-phase-cleanup.js +9 -49
  421. package/.agents/scripts/lib/preflight-runner.js +13 -69
  422. package/.agents/scripts/lib/process-group.js +143 -0
  423. package/.agents/scripts/lib/project-root.js +2 -8
  424. package/.agents/scripts/lib/provider-factory.js +2 -25
  425. package/.agents/scripts/lib/qa/console-allowlist.js +10 -59
  426. package/.agents/scripts/lib/qa/qa-session.js +15 -69
  427. package/.agents/scripts/lib/qa/redact-evidence.js +18 -129
  428. package/.agents/scripts/lib/qa/resolve-qa-contract.js +26 -135
  429. package/.agents/scripts/lib/qa/resolve-selection.js +16 -84
  430. package/.agents/scripts/lib/reserved-test-ids.js +9 -47
  431. package/.agents/scripts/lib/runtime-deps/dep-resolution.js +13 -53
  432. package/.agents/scripts/lib/runtime-deps/ensure-installed.js +10 -44
  433. package/.agents/scripts/lib/runtime-deps/manifest.js +10 -30
  434. package/.agents/scripts/lib/runtime-deps/parser-major.js +15 -51
  435. package/.agents/scripts/lib/runtime-deps/preflight.js +4 -22
  436. package/.agents/scripts/lib/runtime-deps/scan-imports.js +11 -55
  437. package/.agents/scripts/lib/signals/detectors/common.js +12 -38
  438. package/.agents/scripts/lib/signals/index.js +2 -19
  439. package/.agents/scripts/lib/signals/schema.js +14 -109
  440. package/.agents/scripts/lib/signals/write.js +2 -11
  441. package/.agents/scripts/lib/single-story/confirm-merge.js +31 -72
  442. package/.agents/scripts/lib/single-story/story-merged-notify.js +8 -49
  443. package/.agents/scripts/lib/single-story-sweep/protection-ctx.js +4 -26
  444. package/.agents/scripts/lib/single-story-sweep/protection.js +13 -100
  445. package/.agents/scripts/lib/single-story-sweep/sweep-lock.js +60 -258
  446. package/.agents/scripts/lib/single-story-sweep.js +14 -97
  447. package/.agents/scripts/lib/skills/parse-skill.js +13 -59
  448. package/.agents/scripts/lib/skills/skills-index.js +8 -29
  449. package/.agents/scripts/lib/skills/walk-skill-files.js +17 -78
  450. package/.agents/scripts/lib/source-extensions.js +11 -42
  451. package/.agents/scripts/lib/source-text/strip-js-comments.js +8 -41
  452. package/.agents/scripts/lib/stdio-flush.js +9 -36
  453. package/.agents/scripts/lib/story-adjacency.js +8 -40
  454. package/.agents/scripts/lib/story-body/body-format-lints.js +51 -66
  455. package/.agents/scripts/lib/story-body/footer-block.js +11 -44
  456. package/.agents/scripts/lib/story-body/story-body.js +123 -344
  457. package/.agents/scripts/lib/temp-retention.js +42 -143
  458. package/.agents/scripts/lib/templates/decomposer-prompts.js +18 -80
  459. package/.agents/scripts/lib/test-env.js +12 -65
  460. package/.agents/scripts/lib/test-run-credit.js +10 -65
  461. package/.agents/scripts/lib/test-runner-contract.js +19 -74
  462. package/.agents/scripts/lib/test-temp.js +38 -184
  463. package/.agents/scripts/lib/test-tiers.js +12 -96
  464. package/.agents/scripts/lib/ticket-body-sections.js +21 -96
  465. package/.agents/scripts/lib/transpile.js +15 -74
  466. package/.agents/scripts/lib/util/concurrent-map.js +6 -25
  467. package/.agents/scripts/lib/util/parse-id-list.js +8 -34
  468. package/.agents/scripts/lib/util/poll-loop.js +8 -28
  469. package/.agents/scripts/lib/util/with-timeout.js +2 -11
  470. package/.agents/scripts/lib/validation-evidence.js +21 -96
  471. package/.agents/scripts/lib/wave-runner/footprint.js +17 -70
  472. package/.agents/scripts/lib/wave-runner/live-probe.js +67 -209
  473. package/.agents/scripts/lib/wave-runner/ready-set.js +72 -301
  474. package/.agents/scripts/lib/workers/crap-worker.js +11 -64
  475. package/.agents/scripts/lib/workers/maintainability-report-worker.js +8 -45
  476. package/.agents/scripts/lib/workers/maintainability-worker.js +5 -21
  477. package/.agents/scripts/lib/workers/serve-worker-messages.js +2 -18
  478. package/.agents/scripts/lib/workflow-closure.js +22 -105
  479. package/.agents/scripts/lib/workspace-provisioner.js +16 -54
  480. package/.agents/scripts/lib/worktree/git-hooks.js +15 -60
  481. package/.agents/scripts/lib/worktree/lifecycle/force-drain.js +20 -60
  482. package/.agents/scripts/lib/worktree/lifecycle/merge-reachability.js +10 -62
  483. package/.agents/scripts/lib/worktree/lifecycle/pending-cleanup.js +22 -86
  484. package/.agents/scripts/lib/worktree/lifecycle/reap.js +24 -126
  485. package/.agents/scripts/lib/worktree/lifecycle-manager.js +2 -20
  486. package/.agents/scripts/lib/worktree/node-modules-strategy.js +46 -180
  487. package/.agents/scripts/lib/worktree-manager.js +15 -40
  488. package/.agents/scripts/lint-issue-body.js +12 -68
  489. package/.agents/scripts/mandrel-update-preflight.js +10 -70
  490. package/.agents/scripts/merge-baseline.js +30 -105
  491. package/.agents/scripts/nav-registry-diff.js +22 -108
  492. package/.agents/scripts/notify.js +12 -69
  493. package/.agents/scripts/plan-context.js +97 -92
  494. package/.agents/scripts/plan-critics.js +12 -66
  495. package/.agents/scripts/plan-persist.js +71 -137
  496. package/.agents/scripts/plan-run-epilogue.js +20 -43
  497. package/.agents/scripts/pr-watch-with-update.js +79 -263
  498. package/.agents/scripts/providers/github/auth.js +3 -8
  499. package/.agents/scripts/providers/github/blocked-by-add.js +14 -61
  500. package/.agents/scripts/providers/github/board-add.js +5 -21
  501. package/.agents/scripts/providers/github/branch-protection.js +11 -43
  502. package/.agents/scripts/providers/github/cache.js +2 -14
  503. package/.agents/scripts/providers/github/comments.js +7 -40
  504. package/.agents/scripts/providers/github/compose.js +3 -19
  505. package/.agents/scripts/providers/github/errors.js +22 -125
  506. package/.agents/scripts/providers/github/issues.js +31 -123
  507. package/.agents/scripts/providers/github/labels.js +24 -124
  508. package/.agents/scripts/providers/github/mappers.js +5 -27
  509. package/.agents/scripts/providers/github/merge-methods.js +3 -22
  510. package/.agents/scripts/providers/github/project-board.js +2 -17
  511. package/.agents/scripts/providers/github/projects-v2-graphql.js +3 -6
  512. package/.agents/scripts/providers/github/request-helpers.js +5 -32
  513. package/.agents/scripts/providers/github/search-budget.js +9 -39
  514. package/.agents/scripts/providers/github/search-query.js +5 -26
  515. package/.agents/scripts/providers/github/sub-issue-add.js +15 -65
  516. package/.agents/scripts/providers/github/sub-issues.js +7 -36
  517. package/.agents/scripts/providers/github/tickets.js +32 -134
  518. package/.agents/scripts/providers/github.js +18 -59
  519. package/.agents/scripts/prune-plan-run-labels.js +12 -46
  520. package/.agents/scripts/quality-preview.js +35 -220
  521. package/.agents/scripts/resolve-doc-tiers.js +3 -26
  522. package/.agents/scripts/resolve-stories.js +16 -67
  523. package/.agents/scripts/resync-status-column.js +6 -25
  524. package/.agents/scripts/run-tests.js +29 -104
  525. package/.agents/scripts/single-story-close.js +23 -135
  526. package/.agents/scripts/single-story-confirm-merge.js +32 -139
  527. package/.agents/scripts/single-story-init.js +47 -259
  528. package/.agents/scripts/stories-wave-tick.js +179 -415
  529. package/.agents/scripts/sync-agentrc.js +3 -21
  530. package/.agents/scripts/sync-claude-agents.js +9 -55
  531. package/.agents/scripts/sync-claude-commands.js +20 -110
  532. package/.agents/scripts/test-wrapper.js +6 -43
  533. package/.agents/scripts/update-coverage-baseline.js +5 -22
  534. package/.agents/scripts/update-crap-baseline.js +7 -30
  535. package/.agents/scripts/update-duplication-baseline.js +16 -92
  536. package/.agents/scripts/update-maintainability-baseline.js +8 -62
  537. package/.agents/scripts/update-ticket-state.js +1 -7
  538. package/.agents/scripts/validate-skills.js +6 -26
  539. package/.agents/skills/core/gates-and-baselines/reference.md +0 -1
  540. package/.agents/skills/skills.index.json +2 -2
  541. package/.agents/skills/stack/qa/playwright/SKILL.md +26 -0
  542. package/.agents/templates/agent-protocol.md +2 -2
  543. package/.agents/templates/docs/audit-sweep-runbook.md +3 -4
  544. package/.agents/workflows/audit-accessibility.md +4 -7
  545. package/.agents/workflows/audit-adrs.md +3 -6
  546. package/.agents/workflows/audit-architecture.md +3 -11
  547. package/.agents/workflows/audit-baselines.md +6 -9
  548. package/.agents/workflows/audit-clean-code.md +8 -12
  549. package/.agents/workflows/audit-data-model.md +3 -7
  550. package/.agents/workflows/audit-dependencies.md +4 -7
  551. package/.agents/workflows/audit-devops.md +4 -8
  552. package/.agents/workflows/audit-documentation.md +1 -4
  553. package/.agents/workflows/audit-mobile.md +4 -7
  554. package/.agents/workflows/audit-navigability.md +3 -6
  555. package/.agents/workflows/audit-performance.md +2 -4
  556. package/.agents/workflows/audit-privacy.md +4 -7
  557. package/.agents/workflows/audit-quality.md +4 -7
  558. package/.agents/workflows/audit-security.md +4 -7
  559. package/.agents/workflows/audit-seo.md +4 -7
  560. package/.agents/workflows/audit-sre.md +4 -7
  561. package/.agents/workflows/audit-to-stories.md +17 -30
  562. package/.agents/workflows/audit-ux-ui.md +4 -7
  563. package/.agents/workflows/helpers/acceptance-self-eval.md +84 -157
  564. package/.agents/workflows/helpers/audit-lens-core.md +1 -1
  565. package/.agents/workflows/helpers/code-quality-guardrails.md +12 -15
  566. package/.agents/workflows/helpers/code-review.md +4 -2
  567. package/.agents/workflows/helpers/deliver-digest.md +37 -28
  568. package/.agents/workflows/helpers/deliver-light.md +92 -101
  569. package/.agents/workflows/helpers/deliver-reference.md +162 -220
  570. package/.agents/workflows/helpers/deliver-story-reference.md +197 -607
  571. package/.agents/workflows/helpers/deliver-story.md +17 -18
  572. package/.agents/workflows/helpers/plan-reference.md +125 -167
  573. package/.agents/workflows/helpers/qa-core.md +12 -0
  574. package/.agents/workflows/mandrel-deliver.md +47 -31
  575. package/.agents/workflows/mandrel-plan.md +22 -21
  576. package/.agents/workflows/mandrel-update.md +36 -21
  577. package/.agents/workflows/memory-consolidate.md +1 -1
  578. package/.agents/workflows/qa-assist.md +27 -71
  579. package/.agents/workflows/qa-explore.md +19 -59
  580. package/.agents/workflows/qa-run.md +11 -33
  581. package/README.md +1 -1
  582. package/bin/mandrel.js +5 -46
  583. package/bin/postinstall.js +18 -107
  584. package/docs/CHANGELOG.md +60 -0
  585. package/lib/cli/doctor.js +11 -71
  586. package/lib/cli/init.js +26 -165
  587. package/lib/cli/migrate.js +5 -64
  588. package/lib/cli/registry.js +84 -467
  589. package/lib/cli/sync-agents.js +4 -64
  590. package/lib/cli/sync-commands.js +11 -64
  591. package/lib/cli/sync.js +34 -213
  592. package/lib/cli/uninstall.js +40 -219
  593. package/lib/cli/update.js +326 -523
  594. package/lib/cli/version-check.js +8 -72
  595. package/lib/cli/version-helpers.js +14 -87
  596. package/lib/migrations/helpers/retire-agentrc-key.js +11 -52
  597. package/lib/migrations/index.js +17 -92
  598. package/lib/migrations/steps/2.1.0-retire-mi-drop-knobs.js +2 -15
  599. package/lib/migrations/steps/2.1.0-retire-verify-concurrency-cap.js +1 -13
  600. package/lib/migrations/steps/2.11.0-retire-max-seed-words.js +2 -15
  601. package/lib/migrations/steps/2.2.0-retire-epic-ac-tags.js +9 -38
  602. package/lib/migrations/steps/2.20.0-retire-codebase-snapshot.js +1 -13
  603. package/lib/migrations/steps/2.32.0-retire-lint-baseline-command.js +2 -27
  604. package/lib/migrations/steps/2.57.0-retire-delivery-limit-knobs.js +2 -23
  605. package/lib/migrations/steps/2.57.0-retire-planning-limit-knobs.js +2 -27
  606. package/lib/migrations/steps/2.60.0-retire-audit-results-autofile.js +21 -0
  607. package/lib/migrations/steps/strip-removed-agentrc-keys.js +333 -0
  608. package/package.json +17 -14
  609. package/.agents/docs/SDLC.md +0 -590
  610. package/.agents/docs/quality-gates.md +0 -1179
  611. package/.agents/rules/known-tooling-behavior.md +0 -150
  612. package/.agents/rules/orchestration-error-handling.md +0 -61
  613. package/.agents/rules/test-seams.md +0 -59
  614. package/.agents/schemas/baselines/lighthouse.schema.json +0 -59
  615. package/.agents/schemas/baselines/lint.schema.json +0 -47
  616. package/.agents/schemas/model-attribution.schema.json +0 -53
  617. package/.agents/scripts/check-action-pinning.js +0 -260
  618. package/.agents/scripts/check-audit-attribution.js +0 -302
  619. package/.agents/scripts/check-baseline-drift.js +0 -211
  620. package/.agents/scripts/check-baseline-scope.js +0 -362
  621. package/.agents/scripts/check-generated-validator.js +0 -202
  622. package/.agents/scripts/check-knip-entries.js +0 -159
  623. package/.agents/scripts/check-lifecycle-lint.js +0 -294
  624. package/.agents/scripts/check-pinned-override-notes.js +0 -102
  625. package/.agents/scripts/check-schema-references.js +0 -366
  626. package/.agents/scripts/check-test-portability.js +0 -512
  627. package/.agents/scripts/check-workflow-citations.js +0 -332
  628. package/.agents/scripts/check-workflow-cli-lint.js +0 -299
  629. package/.agents/scripts/check-workflow-timeouts.js +0 -291
  630. package/.agents/scripts/install-matrix-assert.js +0 -326
  631. package/.agents/scripts/lib/audit-advisories.js +0 -195
  632. package/.agents/scripts/lib/audit-attribution.js +0 -134
  633. package/.agents/scripts/lib/baselines/drift-detector.js +0 -351
  634. package/.agents/scripts/lib/baselines/kinds/lighthouse.js +0 -87
  635. package/.agents/scripts/lib/baselines/kinds/lint.js +0 -184
  636. package/.agents/scripts/lib/baselines/orphan-pruner.js +0 -233
  637. package/.agents/scripts/lib/baselines/scope-assert.js +0 -223
  638. package/.agents/scripts/lib/baselines/scope-inventory.js +0 -314
  639. package/.agents/scripts/lib/c8-cli-path.js +0 -21
  640. package/.agents/scripts/lib/config/gates/lighthouse.schema.js +0 -51
  641. package/.agents/scripts/lib/config/gates/lint.schema.js +0 -18
  642. package/.agents/scripts/lib/dynamic-workflow/architecture-report-contract.js +0 -70
  643. package/.agents/scripts/lib/dynamic-workflow/audit-orchestrator.js +0 -284
  644. package/.agents/scripts/lib/dynamic-workflow/clean-code-report-contract.js +0 -80
  645. package/.agents/scripts/lib/dynamic-workflow/degraded-coverage.js +0 -81
  646. package/.agents/scripts/lib/dynamic-workflow/documentation-report-contract.js +0 -87
  647. package/.agents/scripts/lib/dynamic-workflow/performance-report-contract.js +0 -74
  648. package/.agents/scripts/lib/dynamic-workflow/quality-report-contract.js +0 -90
  649. package/.agents/scripts/lib/dynamic-workflow/report-contract-core.js +0 -43
  650. package/.agents/scripts/lib/dynamic-workflow/security-report-contract.js +0 -83
  651. package/.agents/scripts/lib/fs-walk.js +0 -52
  652. package/.agents/scripts/lib/knip-config-resolver.js +0 -181
  653. package/.agents/scripts/lib/knip-entry-sync.js +0 -452
  654. package/.agents/scripts/lib/orchestration/model-attribution.js +0 -418
  655. package/.agents/scripts/lib/orchestration/story-plan-state.js +0 -33
  656. package/.agents/scripts/lib/orchestration/structured-comment-parser.js +0 -67
  657. package/.agents/scripts/lib/pinned-override-notes.js +0 -88
  658. package/.agents/scripts/lib/pinned-override-resolve.js +0 -212
  659. package/.agents/scripts/lib/test-isolate/cli-options.js +0 -93
  660. package/.agents/scripts/lib/test-isolate/env-snapshot-loader.js +0 -52
  661. package/.agents/scripts/lib/test-isolate/list-files.js +0 -90
  662. package/.agents/scripts/lib/test-isolate/parse-tap.js +0 -75
  663. package/.agents/scripts/lib/test-isolate/progress-log.js +0 -45
  664. package/.agents/scripts/lib/test-isolate/render-report.js +0 -97
  665. package/.agents/scripts/lib/test-isolate/run-isolate.js +0 -87
  666. package/.agents/scripts/lib/test-isolate/runner.js +0 -483
  667. package/.agents/scripts/lib/test-profile/parse-tap.js +0 -136
  668. package/.agents/scripts/lib/test-profile/render-report.js +0 -45
  669. package/.agents/scripts/lint-label-vocabulary.js +0 -214
  670. package/.agents/scripts/post-structured-comment.js +0 -127
  671. package/.agents/scripts/provision-git-hooks.js +0 -85
  672. package/.agents/scripts/prune-baseline-orphans.js +0 -181
  673. package/.agents/scripts/run-coverage.js +0 -197
  674. package/.agents/scripts/run-lint.js +0 -133
  675. package/.agents/scripts/run-test-profile.js +0 -129
  676. package/.agents/scripts/run-verify.js +0 -118
  677. package/.agents/scripts/test-isolate.js +0 -55
  678. package/.agents/scripts/update-dead-exports-baseline.js +0 -321
@@ -1,43 +1,10 @@
1
1
  #!/usr/bin/env node
2
- // .agents/scripts/generate-skills-index.js
3
- //
4
- // Walk `.agents/skills/{core,stack}/**/SKILL.md` via the shared parser
5
- // helper, project each parsed result into an index entry, and write the
6
- // aggregated manifest to `.agents/skills/skills.index.json`. Supports a
7
- // `--check` mode that compares the on-disk manifest against fresh
8
- // generator output (ignoring the volatile `generatedAt` field) and exits
9
- // non-zero with a diff-style message if they diverge.
10
- //
11
- // Two indexes, never one (Story #5135). The shipped manifest above is a
12
- // committed payload file that `mandrel doctor` / `mandrel sync-agents`
13
- // compare byte-for-byte against the installed package, so consumer-authored
14
- // skills under the `.agents/local/skills/` zone MUST NOT be folded into it —
15
- // a merged index would read as payload drift in every consumer that authored
16
- // a skill, and those commands would refuse. Local skills are therefore
17
- // indexed into their own `.agents/local/skills/skills.index.json`, inside
18
- // the zone sync never prunes and drift never walks.
19
- //
20
- // CLI surface:
21
- //
22
- // node generate-skills-index.js [--check] [--root <dir>] [--out <file>]
23
- //
24
- // --check Read the on-disk manifest, compare to generator output
25
- // modulo `generatedAt`. Exit 0 on match, non-zero on
26
- // drift. Does not write.
27
- // --root <dir> Use <dir> as the repo root (defaults to the project
28
- // root containing `.agents/skills`). Useful for tests
29
- // staging fixture trees outside the real repo.
30
- // --out <file> Override the manifest output path (defaults to
31
- // `<root>/.agents/skills/skills.index.json`).
32
- //
33
- // Written output is passed through the project formatter (Biome) so that
34
- // regenerating on a clean tree leaves no format drift behind; the step is
35
- // best-effort and degrades to plain `JSON.stringify` output where Biome is
36
- // not installed. See `lib/format-generated-json.js`.
37
- //
38
- // Honors AGENT_LOG_LEVEL via the shared `Logger`. Stdout is reserved for
39
- // the diff text in --check failure mode; informational progress goes to
40
- // stderr.
2
+ // Writes `.agents/skills/skills.index.json` from every payload SKILL.md;
3
+ // `--check` compares modulo `generatedAt`. Consumer skills under
4
+ // `.agents/local/skills/` get their own index and must never be merged into
5
+ // the payload one: doctor/sync-agents compare it byte-for-byte against the
6
+ // package and would read a merged index as drift. Stdout is reserved for the
7
+ // `--check` diff; progress goes to stderr.
41
8
 
42
9
  import fs from 'node:fs';
43
10
  import path from 'node:path';
@@ -72,11 +39,7 @@ function defaultRepoRoot() {
72
39
  return path.resolve(here, '..', '..');
73
40
  }
74
41
 
75
- /**
76
- * Parse CLI flags. Returns `{ check, root, out }`. Unknown flags trigger
77
- * a thrown Error (from the shared parser) so the runAsCli boundary can
78
- * surface a clean message.
79
- */
42
+ /** Unknown flags throw, for runAsCli to surface. */
80
43
  export function parseArgs(argv) {
81
44
  if (argv.some((t) => t === '--help' || t === '-h')) {
82
45
  return { check: false, root: null, out: null, help: true };
@@ -92,15 +55,7 @@ export function parseArgs(argv) {
92
55
  return { check: values.check, root: values.root, out: values.out };
93
56
  }
94
57
 
95
- /**
96
- * Project a parseSkill result into an index entry shaped by
97
- * `.agents/schemas/skills-index.schema.json`.
98
- *
99
- * Post-Wave-2 every SKILL.md carries a 5–12-bullet Policy Capsule.
100
- * `policyCapsuleBullets` records that count for the manifest entry.
101
- * A value of `0` means the parser did not find the capsule section and
102
- * is a validator-rejected condition (see validate-skills.js).
103
- */
58
+ /** `policyCapsuleBullets: 0` means no capsule was found (validator-rejected). */
104
59
  function projectEntry(parsed) {
105
60
  return {
106
61
  name: parsed.name,
@@ -119,10 +74,6 @@ function projectEntry(parsed) {
119
74
  };
120
75
  }
121
76
 
122
- /**
123
- * Build the manifest object (without `generatedAt`) by walking the tree
124
- * and projecting each parsed SKILL.md into an index entry.
125
- */
126
77
  export function buildManifestBody(repoRoot, collect = collectSkillFiles) {
127
78
  const skillFiles = collect(repoRoot);
128
79
  const skills = skillFiles.map((absPath) =>
@@ -134,10 +85,6 @@ export function buildManifestBody(repoRoot, collect = collectSkillFiles) {
134
85
  };
135
86
  }
136
87
 
137
- /**
138
- * Build the full manifest with `generatedAt`. `nowIso` is injected so
139
- * tests can pin the timestamp deterministically.
140
- */
141
88
  export function buildManifest(repoRoot, { nowIso, collect } = {}) {
142
89
  const body = buildManifestBody(repoRoot, collect);
143
90
  return {
@@ -148,44 +95,24 @@ export function buildManifest(repoRoot, { nowIso, collect } = {}) {
148
95
  }
149
96
 
150
97
  /**
151
- * Serialize a manifest object as canonical JSON: 2-space indent,
152
- * trailing newline. Two runs against an unchanged corpus produce
153
- * byte-identical output modulo `generatedAt`.
154
- *
155
- * This is the *pre-format* shape. `JSON.stringify` expands every array
156
- * across multiple lines, while Biome collapses short ones that fit
157
- * inside `lineWidth` (`"allowedTools": ["Read", "Bash"]`). Writing this
158
- * text verbatim therefore leaves the tree format-dirty on every run —
159
- * see `lib/format-generated-json.js`, which reconciles the two.
98
+ * Pre-format shape: Biome collapses short arrays this expands, so writes go
99
+ * through `formatGeneratedJson` or the tree is format-dirty on every run.
160
100
  */
161
101
  export function serializeManifest(manifest) {
162
102
  return `${JSON.stringify(manifest, null, 2)}\n`;
163
103
  }
164
104
 
165
- /**
166
- * Resolve the manifest output path given (root, optional explicit
167
- * override).
168
- */
169
105
  function resolveOutPath(root, override) {
170
106
  return override
171
107
  ? path.resolve(override)
172
108
  : indexPathFor(root, PAYLOAD_SKILLS_SEGMENTS);
173
109
  }
174
110
 
175
- /**
176
- * Resolve the local-zone manifest path. Deliberately NOT overridable by
177
- * `--out`: that flag redirects the payload manifest (tests stage fixture
178
- * trees with it), and letting it also move the local manifest would let one
179
- * invocation write both indexes to the same file.
180
- */
111
+ /** Not overridable by `--out`, or one run could write both indexes to one file. */
181
112
  function resolveLocalOutPath(root) {
182
113
  return indexPathFor(root, LOCAL_SKILLS_SEGMENTS);
183
114
  }
184
115
 
185
- /**
186
- * Write one manifest through the project formatter so a regeneration on a
187
- * clean tree leaves no format drift behind.
188
- */
189
116
  function writeManifest(manifest, outPath, root) {
190
117
  const serialized = serializeManifest(manifest);
191
118
  const opts = { cwd: root, filename: INDEX_FILENAME };
@@ -196,12 +123,7 @@ function writeManifest(manifest, outPath, root) {
196
123
  );
197
124
  }
198
125
 
199
- /**
200
- * Write (or reap) the local-zone manifest. A consumer who deletes their last
201
- * local skill would otherwise be left with a stale index reporting skills
202
- * that no longer exist, so an emptied zone removes the artifact rather than
203
- * leaving it behind.
204
- */
126
+ /** An emptied local zone removes its index rather than leave a stale one. */
205
127
  function writeLocalManifest(localFresh, localOutPath, root) {
206
128
  const rel = path.relative(root, localOutPath).split(path.sep).join('/');
207
129
  if (localFresh === null) {
@@ -215,11 +137,6 @@ function writeLocalManifest(localFresh, localOutPath, root) {
215
137
  Logger.info(`wrote ${rel} (${localFresh.skills.length} entries)`);
216
138
  }
217
139
 
218
- /**
219
- * Compare the local-zone manifest against fresh generator output. Returns
220
- * null when in sync (including the common case of no local skills and no
221
- * artifact), or a diff-style message.
222
- */
223
140
  function checkLocalManifest(localFresh, localOutPath) {
224
141
  const exists = fs.existsSync(localOutPath);
225
142
  if (localFresh === null) {
@@ -240,13 +157,7 @@ function checkLocalManifest(localFresh, localOutPath) {
240
157
  }
241
158
 
242
159
  /**
243
- * Build the local zone's manifest plan for this invocation: its output path,
244
- * and a fresh manifest when the consumer has authored any local skill (null
245
- * otherwise, which is the signal to reap a stale artifact).
246
- *
247
- * Split out of `run` so the payload path and the local path each read as one
248
- * step there rather than interleaving.
249
- *
160
+ * A null `localFresh` signals reaping a stale artifact.
250
161
  * @param {string} root
251
162
  * @param {Date} now
252
163
  * @returns {{ localFresh: object | null, localOutPath: string }}
@@ -264,9 +175,6 @@ function buildLocalPlan(root, now) {
264
175
  }
265
176
 
266
177
  /**
267
- * Render the freshness line's entry counts, naming the local zone only when
268
- * one exists.
269
- *
270
178
  * @param {object} fresh
271
179
  * @param {object | null} localFresh
272
180
  * @returns {string}
@@ -279,13 +187,7 @@ function describeCounts(fresh, localFresh) {
279
187
  }
280
188
 
281
189
  /**
282
- * `--check` mode: compare both manifests against fresh generator output and
283
- * report the first drift found, payload first.
284
- *
285
- * Lives outside `run` so the entry point reads as "resolve inputs, then check
286
- * or write" — and so the check path's branches are not charged to a function
287
- * that also owns argument resolution.
288
- *
190
+ * Reports the first drift found, payload first.
289
191
  * @param {{ outPath: string, fresh: object, localOutPath: string, localFresh: object | null }} plan
290
192
  * @returns {{ status: number, output: string }}
291
193
  */
@@ -1,33 +1,8 @@
1
1
  #!/usr/bin/env node
2
2
  /**
3
- * .agents/scripts/generate-workflows-doc.js — Catalog-backed workflows index
4
- *
5
- * Renders the consumer-shipped slash-command catalog at
6
- * `.agents/docs/workflows.md` from the on-disk workflow set under
7
- * `.agents/workflows/*.md` (top-level only — `helpers/` are path-included
8
- * modules, not runnable slash commands). The catalog logic is shared with
9
- * the in-process backend in `lib/mandrel-catalog.js`, so the generated doc
10
- * and any programmatic catalog reader never drift from one another.
11
- *
12
- * Why generated (Story #3708): `workflows.md` used to be hand-maintained and
13
- * was *not* drift-gated, so it could silently fall out of sync with the
14
- * actual workflow set. The retired `/mandrel` discoverability command was
15
- * always accurate because it rendered the catalog live. Rather than keep the
16
- * drift-prone hand-authored doc and the accurate-but-ephemeral command, this
17
- * generator makes the doc itself a rendering of the same catalog, gates it via
18
- * `--check`, and ships it to consumers under `.agents/docs/`.
19
- *
20
- * Modes:
21
- * (default) — rewrites `.agents/docs/workflows.md` in full from the
22
- * current workflow set.
23
- * --check — exits 0 when the on-disk file matches the freshly generated
24
- * content, throws (→ exit 1) with a regeneration hint otherwise.
25
- * --root — read and write under another checkout's `.agents/` tree.
26
- * See {@link resolveTargets} for why this seam exists.
27
- *
28
- * Per `.agents/rules/orchestration-error-handling.md`, unrecoverable failures
29
- * surface via `throw new Error(...)` so `runAsCli` maps the throw to
30
- * `process.exit(1)` deterministically (no `Logger.fatal`).
3
+ * Renders `.agents/docs/workflows.md` from the top-level workflow set via the
4
+ * shared `lib/mandrel-catalog.js`, so the doc and programmatic readers cannot
5
+ * drift; `--check` gates it.
31
6
  */
32
7
 
33
8
  import fs from 'node:fs';
@@ -43,28 +18,9 @@ const __dirname = path.dirname(__filename);
43
18
  const PROJECT_ROOT = path.resolve(__dirname, '..', '..');
44
19
 
45
20
  /**
46
- * Resolve the workflow source directory and the generated doc for one
47
- * repository root.
48
- *
49
- * The `--root` seam this backs exists for the drift gate's own test. That
50
- * test used to prove the gate by editing the *real*
51
- * `.agents/workflows/mandrel-deliver.md`, running `--check`, and restoring
52
- * the file in `afterEach`. The proof was sound; the blast radius was not.
53
- * `node --test` runs test files in parallel against one shared checkout, so
54
- * for the ~1s the real file sat mutated, every other test file observed a
55
- * dirty tree — and `tests/enforcement/workflow-script-help.test.js`, whose
56
- * final assertion is a repo-wide `git status --porcelain`, reported it as
57
- * "`--help` mutated the working tree" on the Windows Smoke job, where the
58
- * wider process-spawn cost stretches that window far enough to collide.
59
- *
60
- * A generator that can only ever be pointed at its own checkout forces that
61
- * choice. Pointing it at a fixture root removes it.
62
- *
63
- * The `--root` default is applied here rather than at the call site so the
64
- * one branch it costs lives with the resolution it belongs to.
65
- *
66
- * @param {string} [root] Repository root to render against; defaults to this
67
- * checkout. A relative path is resolved against the process cwd.
21
+ * The `--root` seam lets the drift gate's test use a fixture root: mutating
22
+ * the real workflow file dirties the shared checkout for parallel test files.
23
+ * @param {string} [root]
68
24
  * @returns {{ root: string, workflowsDir: string, docPath: string }}
69
25
  */
70
26
  export function resolveTargets(root) {
@@ -76,21 +32,11 @@ export function resolveTargets(root) {
76
32
  };
77
33
  }
78
34
 
79
- /** This checkout's own targets — the default when `--root` is absent. */
80
35
  const { workflowsDir: WORKFLOWS_DIR, docPath: DOC_PATH } = resolveTargets();
81
36
 
82
37
  /**
83
- * Collapse a catalog description to a single Markdown table-cell-safe line.
84
- * The catalog already normalizes whitespace; this neutralizes:
85
- * - pipe characters (`|`) so a description can never break the table grid;
86
- * - stray newlines;
87
- * - bare emphasis markers (`*`, `_`) so a glob like `audit-*` in a
88
- * description is rendered literally instead of being parsed as emphasis
89
- * (which trips markdownlint MD037 in the generated doc).
90
- *
91
- * Framework workflow descriptions do not embed `*`/`_` inside inline code
92
- * spans, so a global escape is safe and keeps the generator pure.
93
- *
38
+ * Escapes `*`/`_` so a glob like `audit-*` is not parsed as emphasis (MD037);
39
+ * safe globally because descriptions put neither inside code spans.
94
40
  * @param {string | null} description
95
41
  * @returns {string}
96
42
  */
@@ -103,9 +49,6 @@ function cellEscape(description) {
103
49
  }
104
50
 
105
51
  /**
106
- * Render the full generated `workflows.md` content from the flat command
107
- * catalog and the loop-unit catalog.
108
- *
109
52
  * @param {Array<{ name: string, description: string | null, vague: boolean }>} catalog
110
53
  * @param {Array<{ name: string, description: string | null, vague: boolean }>} [loopCatalog]
111
54
  * @returns {string}
@@ -124,7 +67,7 @@ export function renderWorkflowsDoc(catalog, loopCatalog = []) {
124
67
  'This is an **auto-generated reference index** of every slash command shipped',
125
68
  'under `.agents/workflows/` (top-level only — `helpers/` are path-included',
126
69
  'modules, not runnable commands). The canonical workflow narrative lives in',
127
- '[`SDLC.md`](SDLC.md) — read that first to understand how the commands',
70
+ '[`SDLC.md`](https://github.com/dsj1984/mandrel/blob/main/docs/SDLC.md) — read that first to understand how the commands',
128
71
  'compose. This file is only for "which command does X?" lookups.',
129
72
  '',
130
73
  'Every command file lives at `.agents/workflows/<name>.md` and is projected',
@@ -184,10 +127,7 @@ export function renderWorkflowsDoc(catalog, loopCatalog = []) {
184
127
  }
185
128
 
186
129
  /**
187
- * Build the canonical generated content and read the on-disk file (if any).
188
- *
189
- * @param {string} [root] Repository root to render against; see
190
- * {@link resolveTargets}.
130
+ * @param {string} [root]
191
131
  * @returns {{
192
132
  * generated: string,
193
133
  * original: string | null,
@@ -2,41 +2,9 @@
2
2
  /* node:coverage ignore file -- multi-phase repo-cleanup CLI; thin shell over `git` + `gh` */
3
3
 
4
4
  /**
5
- * git-cleanup.js — Story #2466 thin CLI shell over the multi-phase
6
- * cleanup pipeline.
5
+ * Thin CLI shell over the `lib/orchestration/git-cleanup/phases/` pipeline.
7
6
  *
8
- * The pipeline lives under `lib/orchestration/git-cleanup/phases/`:
9
- *
10
- * 1. parse-args — argv → normalized opts bag (`parseCleanupArgs`).
11
- * 2. filters — pure glob + protected-branch helpers.
12
- * 3. git-probes — every `gitSpawn` / `gh` subprocess wrapper plus
13
- * small parsers (`probeMergedPr`, etc).
14
- * 4. branches — merged-branch reap (`planCleanup`,
15
- * `executeCleanup`).
16
- * 5. fast-forward — fast-forward-main phase.
17
- * 6. prune — prune-remotes phase + `parsePrunedRefs`.
18
- * 7. stashes — stash triage (`parseStashList`, `planStashes`,
19
- * `executeStashes`, `stashRefIndex`,
20
- * `buildAllowlistDecider`).
21
- * 8. render — operator-facing renderers + `buildJsonEnvelope`,
22
- * `computeExitCode`.
23
- * 9. cli — interactive prompts + per-phase drivers + `main`.
24
- *
25
- * Public CLI surface, named exports, and exit codes are byte-identical
26
- * to the pre-refactor implementation. See the original module docstring
27
- * (preserved below) for the operator-facing flag + phase contract.
28
- *
29
- * Phases (selectable, run sequentially when no narrowing flag set):
30
- * 1. fast-forward-main — `git fetch origin <base>` → `git merge --ff-only`.
31
- * 2. prune-remotes — `git fetch --prune <remote>`.
32
- * 3. branches — enumerate merged local branches via `gh pr list`
33
- * + `git branch --merged <base>` and reap.
34
- * 4. stashes — `git stash list` → optional per-stash drops.
35
- *
36
- * Exit codes:
37
- * 0 — clean (dry-run preview, or every active phase succeeded).
38
- * 1 — at least one phase reported a failure.
39
- * 2 — every active phase produced nothing to do (informational).
7
+ * Exit codes: 0 clean or dry-run, 1 a phase failed, 2 nothing to do.
40
8
  */
41
9
 
42
10
  import { runAsCli } from './lib/cli-utils.js';
@@ -1,13 +1,6 @@
1
- /**
2
- * Graph.js
3
- * Extracted mathematical DAG logic for topological sorting, cycle detection,
4
- * transitive reduction, and auto-serialization of concurrent task overlaps.
5
- */
1
+ /** DAG utilities: cycle detection, layering, reduction, topological sort. */
6
2
 
7
- /**
8
- * Builds an adjacency list from the manifest tasks.
9
- * Returns { adjacency: Map<id, id[]>, taskMap: Map<id, task> }
10
- */
3
+ /** Returns { adjacency: Map<id, id[]>, taskMap: Map<id, task> }. */
11
4
  export function buildGraph(tasks) {
12
5
  const adjacency = new Map();
13
6
  const taskMap = new Map();
@@ -20,10 +13,7 @@ export function buildGraph(tasks) {
20
13
  return { adjacency, taskMap };
21
14
  }
22
15
 
23
- /**
24
- * Detects cycles using DFS. Returns the first cycle found as an array of ids,
25
- * or null if the graph is acyclic.
26
- */
16
+ /** The first cycle found as an array of ids, or null. */
27
17
  export function detectCycle(adjacency) {
28
18
  const WHITE = 0,
29
19
  _GRAY = 1,
@@ -50,7 +40,7 @@ function dfsVisit(u, adjacency, color, parent) {
50
40
 
51
41
  for (const v of adjacency.get(u) || []) {
52
42
  if (color.get(v) === 1) {
53
- // Back edge → cycle. Reconstruct.
43
+ // Back edge: reconstruct the cycle.
54
44
  const cycle = [v, u];
55
45
  let cur = u;
56
46
  while (parent.has(cur) && parent.get(cur) !== v) {
@@ -70,10 +60,7 @@ function dfsVisit(u, adjacency, color, parent) {
70
60
  return null;
71
61
  }
72
62
 
73
- /**
74
- * Assigns each task a layer (depth from root). Root tasks (no dependencies)
75
- * are layer 0. Returns Map<id, layer>.
76
- */
63
+ /** Depth from root (roots are layer 0) as Map<id, layer>. */
77
64
  export function assignLayers(adjacency) {
78
65
  const layers = new Map();
79
66
  const memo = new Map();
@@ -101,36 +88,18 @@ export function assignLayers(adjacency) {
101
88
  }
102
89
 
103
90
  /**
104
- * Performs transitive reduction on a DAG.
105
- *
106
- * Removes edge (u→v) iff some *other* direct dependency w of u satisfies
107
- * v ∈ reach(w) — i.e. v is reachable from u via a path of length > 1 that
108
- * does not use the edge (u→v) itself.
91
+ * Remove edge (u→v) iff another direct dependency of u already reaches v.
109
92
  *
110
- * Two-arg form (preferred on hot paths): callers that already hold a
111
- * reachability matrix for the same `adjacency` (e.g. the dispatch
112
- * pipeline, which also feeds it to `autoSerializeOverlaps`) pass it in
113
- * via `reachable` so we skip the O(V·(V+E)) re-derivation. The per-edge
114
- * check is then O(1) (`reach(w).has(v)`), making the overall reduction
115
- * O(V+E) on top of the (amortized) cost of producing `reachable` once.
116
- *
117
- * Single-arg form (back-compat): when `reachable` is omitted we compute
118
- * it locally via `computeReachability(adjacency)` so the function stays
119
- * a drop-in replacement for the historical single-argument signature.
120
- * Output is byte-identical between the two forms.
121
- *
122
- * @param {Map<*, *[]>} adjacency Dependency map (node → deps[]).
123
- * @param {Map<*, Set<*>>} [reachable] Optional pre-computed reachability
124
- * matrix matching `adjacency`. When supplied it MUST cover every node
125
- * in `adjacency` — passing a partial map will silently corrupt output.
126
- * @returns {Map<*, *[]>} Reduced adjacency map.
93
+ * @param {Map<*, *[]>} adjacency node → deps[].
94
+ * @param {Map<*, Set<*>>} [reachable] Precomputed reachability; when given it
95
+ * MUST cover every node, or output is silently corrupt.
96
+ * @returns {Map<*, *[]>}
127
97
  */
128
98
  export function transitiveReduction(adjacency, reachable) {
129
99
  const reach = reachable ?? computeReachability(adjacency);
130
100
  const result = new Map();
131
101
 
132
102
  for (const [node, deps] of adjacency.entries()) {
133
- // Early-return: nodes with zero or one dependency cannot have redundant edges
134
103
  if (deps.length <= 1) {
135
104
  result.set(node, [...deps]);
136
105
  continue;
@@ -138,8 +107,6 @@ export function transitiveReduction(adjacency, reachable) {
138
107
 
139
108
  const kept = [];
140
109
  for (const dep of deps) {
141
- // Edge (node → dep) is redundant iff some other direct dep `other`
142
- // of `node` already reaches `dep` transitively.
143
110
  let isRedundant = false;
144
111
  for (const other of deps) {
145
112
  if (other === dep) continue;
@@ -156,12 +123,8 @@ export function transitiveReduction(adjacency, reachable) {
156
123
  return result;
157
124
  }
158
125
 
159
- /**
160
- * Computes which Chat Sessions each Chat Session depends on.
161
- * Returns a Map<chatNumber, chatNumber[]>.
162
- */
126
+ /** Returns a transitively reduced Map<chatNumber, chatNumber[]>. */
163
127
  export function computeChatDependencies(chatSessions, _adjacency) {
164
- // Build a reverse lookup: taskId → chatNumber
165
128
  const taskToChat = new Map();
166
129
  for (const session of chatSessions) {
167
130
  for (const task of session.tasks) {
@@ -186,22 +149,16 @@ export function computeChatDependencies(chatSessions, _adjacency) {
186
149
  );
187
150
  }
188
151
 
189
- // Apply transitive reduction to chat-level dependencies
190
152
  return transitiveReduction(chatDeps);
191
153
  }
192
154
 
193
- /**
194
- * Computes the transitive closure (reachability matrix) for the DAG.
195
- * Returns a Map<id, Set<id>> where each key maps to a set of all tasks it can reach.
196
- */
155
+ /** Transitive closure as Map<id, Set<id>>, by memoized DFS: O(V·(V+E)). */
197
156
  export function computeReachability(adjacency) {
198
- // Memoized DFS: each node's reachable set is computed once and cached.
199
- // Complexity: O(V·(V+E)) — avoids the O(N³) Floyd-Warshall triple loop.
200
157
  const memo = new Map();
201
158
 
202
159
  function reach(id) {
203
160
  if (memo.has(id)) return memo.get(id);
204
- // Seed with a placeholder to handle cycles defensively
161
+ // Placeholder first, so a cycle cannot recurse forever.
205
162
  const set = new Set();
206
163
  memo.set(id, set);
207
164
  for (const neighbour of adjacency.get(id) || []) {
@@ -221,17 +178,14 @@ export function computeReachability(adjacency) {
221
178
  }
222
179
 
223
180
  /**
224
- * Performs a topological sort on the DAG using Kahn's algorithm.
225
- * Returns tasks ordered such that all dependencies precede their dependents.
226
- * Deterministic: ties are broken by task ID (ascending) for stable output.
181
+ * Kahn's algorithm; ties break by ascending id for stable output.
227
182
  *
228
- * @param {Map<number, number[]>} adjacency - Dependency map (id → blockedBy[]).
229
- * @param {Map<number, object>} taskMap - Full task objects keyed by id.
230
- * @returns {object[]} Tasks in topological order.
231
- * @throws {Error} If a cycle is detected (should be caught before calling this).
183
+ * @param {Map<number, number[]>} adjacency id → blockedBy[].
184
+ * @param {Map<number, object>} taskMap
185
+ * @returns {object[]}
186
+ * @throws {Error} On a cycle (run `detectCycle` first).
232
187
  */
233
188
  export function topologicalSort(adjacency, taskMap) {
234
- // Pre-compute reverse adjacency and in-degree for O(V+E)
235
189
  const inDegree = new Map();
236
190
  const reverseAdj = new Map();
237
191
 
@@ -250,7 +204,6 @@ export function topologicalSort(adjacency, taskMap) {
250
204
  inDegree.set(nodeId, activeDeps);
251
205
  }
252
206
 
253
- // Seed queue with zero-in-degree nodes (tasks with no active dependencies), sorted by id for determinism
254
207
  const queue = [...inDegree.entries()]
255
208
  .filter(([, deg]) => deg === 0)
256
209
  .map(([id]) => id)
@@ -259,17 +212,15 @@ export function topologicalSort(adjacency, taskMap) {
259
212
  const sorted = [];
260
213
 
261
214
  while (queue.length > 0) {
262
- // Take smallest ID for determinism (queue is kept sorted)
215
+ // The queue is kept sorted, so this is the smallest id.
263
216
  const id = queue.shift();
264
217
  sorted.push(taskMap.get(id));
265
218
 
266
- // Decrement in-degree for dependents using pre-computed reverse map
267
219
  for (const dependent of reverseAdj.get(id) ?? []) {
268
220
  const newDeg = (inDegree.get(dependent) ?? 0) - 1;
269
221
  inDegree.set(dependent, newDeg);
270
222
  if (newDeg === 0) {
271
- // Binary insertion to maintain sorted order — O(log N) per insert
272
- // instead of re-sorting the entire queue each iteration.
223
+ // Binary insertion keeps the queue sorted without a re-sort.
273
224
  let lo = 0,
274
225
  hi = queue.length;
275
226
  while (lo < hi) {
@@ -292,18 +243,11 @@ export function topologicalSort(adjacency, taskMap) {
292
243
  }
293
244
 
294
245
  /**
295
- * Groups tasks into sequential execution waves.
296
- *
297
- * A wave contains all tasks whose dependencies are fully satisfied by
298
- * previously completed waves. Tasks within the same wave can run concurrently
299
- * (subject to focus-area serialization in the Dispatcher).
300
- *
301
- * Uses `assignLayers` to compute depth, then groups by layer value.
302
- * The returned array is sorted by wave index (wave 0 = roots).
246
+ * Group tasks by layer; each wave's dependencies are all in earlier waves.
303
247
  *
304
- * @param {Map<number, number[]>} adjacency - Dependency map (id → blockedBy[]).
305
- * @param {Map<number, object>} taskMap - Full task objects keyed by id.
306
- * @returns {object[][]} Array of waves, each wave is an array of task objects.
248
+ * @param {Map<number, number[]>} adjacency id → blockedBy[].
249
+ * @param {Map<number, object>} taskMap
250
+ * @returns {object[][]}
307
251
  */
308
252
  export function computeWaves(adjacency, taskMap) {
309
253
  const layers = assignLayers(adjacency);
@@ -314,7 +258,6 @@ export function computeWaves(adjacency, taskMap) {
314
258
  waveMap.get(layer).push(taskMap.get(id));
315
259
  }
316
260
 
317
- // Sort waves by layer, sort tasks within each wave by id for determinism
318
261
  const maxLayer = Math.max(...waveMap.keys());
319
262
  const waves = [];
320
263
  for (let i = 0; i <= maxLayer; i++) {