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
@@ -2,14 +2,7 @@ import fs from 'node:fs';
2
2
  import path from 'node:path';
3
3
  import picomatch from 'picomatch';
4
4
 
5
- /**
6
- * Globs for slow / integration-style suites excluded from `test:quick`.
7
- *
8
- * Curated from `npm run test:profile` (Stories #2742 / #2744). Real-git
9
- * harnesses, binary-spawn CLI contracts, and other suites whose setup
10
- * dominates quick-tier feedback stay here; unit-guard / mock paths remain
11
- * in quick.
12
- */
5
+ /** Slow suites (real git, binary spawns) excluded from `test:quick`. */
13
6
  export const INTEGRATION_INCLUDE = [
14
7
  'tests/**/*.integration.test.js',
15
8
  'tests/hook-chain-reflog-invariant.test.js',
@@ -24,85 +17,29 @@ export const INTEGRATION_INCLUDE = [
24
17
  const matchesIntegration = picomatch(INTEGRATION_INCLUDE, { dot: true });
25
18
 
26
19
  /**
27
- * Globs for the `e2e` tier — real-binary suites under `tests/e2e/` that pack
28
- * this repository, install it into a temp consumer and drive the shipped
29
- * `mandrel` binary end to end.
30
- *
31
- * They are the most expensive files the repository owns by an order of
32
- * magnitude: one `npm pack` plus real `npm install` spawns per file, measured
33
- * (Story #5111) at ~7 s of system time and ~17 s of summed install wall clock
34
- * for `update-chain.integration.test.js` alone. Every one of those seconds was
35
- * charged to `npm test` — i.e. to every pre-push hook and every local
36
- * iteration — for a signal that only changes when the release-shaped install
37
- * path changes.
38
- *
39
- * So they get their own tier and leave every other one: `full` (`npm test`),
40
- * `quick` and `integration` all exclude them, and `npm run test:e2e` is how
41
- * they run. CI runs that tier as its own job on every PR, so the
42
- * release-shaped path keeps its per-PR signal.
43
- *
44
- * Deliberately not exported: a second reader of this list is a second place
45
- * for the tier definition to drift. `listTestFilesForTier('e2e', root)` is the
46
- * public answer to "which files are e2e", and the tests assert through it.
20
+ * Pack-and-install suites driving the shipped binary — too expensive for
21
+ * every pre-push, so only `test:e2e` (its own CI job) runs them. Not exported:
22
+ * `listTestFilesForTier('e2e', root)` is the one reader.
47
23
  */
48
24
  const E2E_INCLUDE = ['tests/e2e/**/*.test.js'];
49
25
 
50
26
  const matchesE2E = picomatch(E2E_INCLUDE, { dot: true });
51
27
 
52
- /** Tier names `parseTierArgv` accepts, in the order `--help` lists them. */
53
28
  const TIERS = ['full', 'quick', 'integration', 'e2e'];
54
29
 
55
30
  /**
56
- * `node --test` flags the runner forwards verbatim to the child.
57
- *
58
- * Everything else that looks like a flag is a mistake — a typo, a retired
59
- * option, or a flag meant for `npm` that landed after the `--` separator —
60
- * and `parseTierArgv` rejects it rather than passing it to `node --test`,
61
- * which reads an unknown `--flag` as a *file pattern* and silently runs a
62
- * suite that matches nothing while exiting 0.
31
+ * The only flags forwarded to `node --test`; any other `--flag` is rejected,
32
+ * since `node --test` reads it as a file pattern and exits 0 having run nothing.
63
33
  */
64
34
  const PASSTHROUGH_FLAGS = ['--test-name-pattern', '--test-only'];
65
35
 
66
- /**
67
- * Repo-relative roots the tier walker scans for test files (names ending in
68
- * `.test.js`).
69
- *
70
- * `tests` holds the framework's suite tree; `lib` holds the published CLI
71
- * (under `lib/cli` and `lib/migrations`) whose tests are colocated in
72
- * `__tests__` directories per the unit-tier convention in
73
- * `rules/testing-standards.md`. `.agents/scripts` holds the orchestration
74
- * engine; some of its modules colocate tests in `__tests__` directories the
75
- * same way (Story #4195). Without each root here, both the quick /
76
- * integration walk and the full-tier glob set miss the colocated tests,
77
- * leaving that coverage dark in `npm test`. The matching full-tier globs
78
- * live in the exported `FULL_TIER_GLOBS` — every full-tier runner
79
- * (`run-tests.js`, `run-coverage.js`) MUST consume that constant rather than
80
- * restate a glob literal, or a runner silently walks a narrower surface.
81
- */
36
+ /** Roots scanned for `*.test.js`, including colocated `__tests__` trees. */
82
37
  const TEST_WALK_ROOTS = ['tests', 'lib', '.agents/scripts'];
83
38
 
84
39
  /**
85
- * Glob targets for the `full` tier — one per walk root in `TEST_WALK_ROOTS`.
86
- * The `tests` glob is a flat recursive sweep; the `lib` and `.agents/scripts`
87
- * globs are scoped to `__tests__` subtrees so they only match colocated
88
- * tests, never the shipped source modules themselves.
89
- *
90
- * Exported because it is the **measured surface**: `run-coverage.js` — the
91
- * required CI job, and the run every coverage / CRAP baseline is scored from —
92
- * consumes it directly. Story #4922: the coverage runner used to restate
93
- * `tests/**` on its own, so the 47 colocated `__tests__` files ran under
94
- * `npm test` but were absent from the measured surface, leaving the coverage
95
- * and CRAP numbers computed over code the measuring run never executed.
96
- * Consume this constant; never restate a glob.
97
- *
98
- * Story #5111 made this a strict **superset** of the `full` runner tier: the
99
- * measured surface still includes `tests/e2e/**`, while `npm test` no longer
100
- * runs it. That asymmetry is deliberate and load-bearing. The e2e suites drive
101
- * the shipped binary through `bin/mandrel.js` and `lib/cli/update.js` in real
102
- * child processes, and c8's `NODE_V8_COVERAGE` is inherited by those children —
103
- * so dropping them from the measured run would deflate exactly the CLI files
104
- * they exist to exercise and red the coverage ratchet on code nobody touched.
105
- * Cheapening the pre-push loop must not cost the measurement its subject.
40
+ * The measured surface for coverage/CRAP; consume it, never restate a glob.
41
+ * A superset of the `full` tier: e2e children inherit `NODE_V8_COVERAGE` and
42
+ * are the only coverage of the CLI entry files.
106
43
  */
107
44
  export const FULL_TIER_GLOBS = [
108
45
  'tests/**/*.test.js',
@@ -132,10 +69,6 @@ function walkTestFiles(dir, prefix, fsLike) {
132
69
  }
133
70
 
134
71
  /**
135
- * Split the walked set into the `e2e` tier and the remainder every other tier
136
- * is drawn from, so an e2e file belongs to exactly one tier and `npm test`
137
- * never pays for it.
138
- *
139
72
  * @param {string[]} all
140
73
  * @returns {{ e2e: string[], rest: string[] }}
141
74
  */
@@ -146,9 +79,6 @@ function partitionE2E(all) {
146
79
  }
147
80
 
148
81
  /**
149
- * Split the non-e2e remainder into the slow `integration` tier and the `quick`
150
- * complement — the historical partition, unchanged.
151
- *
152
82
  * @param {string[]} rest
153
83
  * @param {'quick' | 'integration'} tier
154
84
  * @returns {string[]}
@@ -163,13 +93,8 @@ function splitBySpeed(rest, tier) {
163
93
  }
164
94
 
165
95
  /**
166
- * List repo-relative test file paths for a tier.
167
- *
168
- * `full` used to return {@link FULL_TIER_GLOBS} verbatim and let `node --test`
169
- * expand them. It enumerates files instead since Story #5111, because the one
170
- * thing a glob list cannot express is an exclusion: `node --test` has no
171
- * negative pattern, so "everything except `tests/e2e/**`" is only sayable as
172
- * a file set. The measured surface keeps the globs (see `FULL_TIER_GLOBS`).
96
+ * Repo-relative test files for a tier. Enumerated, not globbed: `node --test`
97
+ * has no negative pattern to exclude `tests/e2e/**`.
173
98
  *
174
99
  * @param {'full' | 'quick' | 'integration' | 'e2e'} tier
175
100
  * @param {string} repoRoot
@@ -191,15 +116,6 @@ export function listTestFilesForTier(tier, repoRoot, fsLike = fs) {
191
116
  }
192
117
 
193
118
  /**
194
- * Reject argv tokens that look like flags but are neither `--tier` (already
195
- * consumed) nor a sanctioned `node --test` pass-through.
196
- *
197
- * Silence was the old behaviour and the reason this exists: the runner
198
- * forwarded every unrecognized token verbatim, and `node --test` treats an
199
- * unknown `--flag` as another **file pattern**. A typo therefore produced a
200
- * run that matched nothing, printed a plausible-looking summary and exited 0 —
201
- * a green that proved nothing.
202
- *
203
119
  * @param {string[]} rest
204
120
  * @throws {Error} naming both the accepted tiers and the accepted flags.
205
121
  */
@@ -1,35 +1,12 @@
1
1
  /**
2
- * ticket-body-sections.js — marker-delimited managed sections of a
3
- * planning ticket body.
4
- *
5
- * Story #4324 retired the `context::tech-spec` / `context::acceptance-spec`
6
- * ticket classes: the planning ticket body is the single planning document.
7
- * The Tech Spec (opening with `## Delivery Slicing`, per #4316) and the
8
- * Acceptance Spec's AC-ID table (`## Acceptance Table`) land as **managed
9
- * sections**, delimited by invisible HTML comment markers so each writer
10
- * can update *only its own region* without rewriting the rest of the body.
11
- *
12
- * Section-scoped writes are the load-bearing contract (extending the
13
- * single-writer discipline #4303 established for the body trailer):
14
- *
15
- * - The `/mandrel-plan` persist path upserts the `techSpec` and `acceptanceTable`
16
- * regions.
17
- * - The close-time acceptance reconciler
18
- * (`acceptance-spec-reconciler.js`) reads and rewrites the
19
- * `acceptanceTable` region only (verification dispositions).
20
- *
21
- * Everything outside a managed region is byte-preserved by every helper in
22
- * this module. Markers are chosen so GitHub renders nothing for them; the
23
- * human-visible headings (`## Delivery Slicing`, `## Acceptance Table`)
24
- * live INSIDE the regions as ordinary content.
25
- *
26
- * Pure ESM, no I/O.
2
+ * Marker-delimited managed sections of a planning ticket body. Each writer
3
+ * updates only its own region (persist: `techSpec` + `acceptanceTable`; the
4
+ * close reconciler: `acceptanceTable` only); every byte outside a region is
5
+ * preserved. Markers render as nothing on GitHub; visible headings live
6
+ * inside the regions. Pure, no I/O.
27
7
  */
28
8
 
29
9
  /**
30
- * Managed-region descriptors. `start`/`end` are the literal marker lines;
31
- * `label` is the human name used in log lines and error messages.
32
- *
33
10
  * @type {Readonly<Record<'techSpec'|'acceptanceTable', { start: string, end: string, label: string }>>}
34
11
  */
35
12
  export const TICKET_BODY_SECTIONS = Object.freeze({
@@ -45,19 +22,10 @@ export const TICKET_BODY_SECTIONS = Object.freeze({
45
22
  }),
46
23
  });
47
24
 
48
- /**
49
- * Canonical heading the acceptance-table region opens with. Distinct from
50
- * the ticket's ideation `## Acceptance Criteria` bullets (which remain the
51
- * SSOT for *what* the table verifies — the table anchors to those bullets).
52
- */
25
+ /** Distinct from `## Acceptance Criteria`, which stays the SSOT it anchors to. */
53
26
  export const ACCEPTANCE_TABLE_HEADING = '## Acceptance Table';
54
27
 
55
- /**
56
- * Regex matching the Tech Spec's `## Delivery Slicing` heading, tolerating
57
- * the `Delivery ` qualifier and casing variants. Exported so it is the single
58
- * source of truth for this pattern — `consolidation-precondition.js` imports
59
- * it rather than carrying its own copy.
60
- */
28
+ /** SSOT for the `## (Delivery) Slicing` heading, case-insensitive. */
61
29
  export const DELIVERY_SLICING_RE = /^##\s+(?:Delivery\s+)?Slicing\s*$/im;
62
30
 
63
31
  /**
@@ -75,10 +43,8 @@ function descriptor(kind) {
75
43
  }
76
44
 
77
45
  /**
78
- * Locate a managed region. Returns `null` when either marker is absent or
79
- * the end marker precedes the start marker (malformed body — treated as
80
- * absent so a writer re-appends a well-formed region rather than
81
- * corrupting the body further).
46
+ * `null` when a marker is missing or out of order: treated as absent so a
47
+ * writer re-appends a well-formed region instead of corrupting further.
82
48
  *
83
49
  * @param {string} body
84
50
  * @param {'techSpec'|'acceptanceTable'} kind
@@ -96,8 +62,6 @@ function locate(body, kind) {
96
62
  }
97
63
 
98
64
  /**
99
- * True when the body carries a well-formed managed region of `kind`.
100
- *
101
65
  * @param {string} body
102
66
  * @param {'techSpec'|'acceptanceTable'} kind
103
67
  * @returns {boolean}
@@ -107,14 +71,8 @@ export function hasTicketSection(body, kind) {
107
71
  }
108
72
 
109
73
  /**
110
- * Insert or replace a managed region, preserving every byte outside it.
111
- *
112
- * When the region exists, only the content between the markers is
113
- * replaced. When absent, the region is appended at the end of the body
114
- * (trailing whitespace normalised to a single blank-line separator). The
115
- * `techSpec` region is appended before an existing `acceptanceTable`
116
- * region so the rendered document keeps its canonical order
117
- * (ideation sections → Tech Spec → Acceptance Table).
74
+ * Insert or replace a managed region. An absent region is appended, except
75
+ * `techSpec`, which goes before an existing `acceptanceTable` to keep order.
118
76
  *
119
77
  * @param {string} body
120
78
  * @param {'techSpec'|'acceptanceTable'} kind
@@ -136,8 +94,6 @@ export function upsertTicketSection(body, kind, content) {
136
94
  );
137
95
  }
138
96
 
139
- // Keep canonical order when appending: the Tech Spec region goes before
140
- // an already-present acceptance-table region.
141
97
  if (kind === 'techSpec') {
142
98
  const acceptanceLoc = locate(safeBody, 'acceptanceTable');
143
99
  if (acceptanceLoc) {
@@ -156,9 +112,7 @@ export function upsertTicketSection(body, kind, content) {
156
112
  }
157
113
 
158
114
  /**
159
- * Remove a managed region (markers and content). Byte-preserving outside
160
- * the region; collapses the surrounding blank lines the writer added.
161
- * No-op when the region is absent.
115
+ * Remove a region and the blank lines the writer added around it.
162
116
  *
163
117
  * @param {string} body
164
118
  * @param {'techSpec'|'acceptanceTable'} kind
@@ -174,9 +128,7 @@ export function stripTicketSection(body, kind) {
174
128
  }
175
129
 
176
130
  /**
177
- * Re-plan / decompose detection: true when the ticket body carries folded
178
- * Tech Spec content — the managed region, or (defence in depth for a
179
- * hand-authored body) a bare `## Delivery Slicing` heading.
131
+ * Folded Tech Spec present: the region, or a hand-authored slicing heading.
180
132
  *
181
133
  * @param {string} body
182
134
  * @returns {boolean}
@@ -187,11 +139,7 @@ export function hasTechSpecContent(body) {
187
139
  }
188
140
 
189
141
  /**
190
- * `##` headings dropped from the delivery-hydrated Epic body. These are
191
- * ideation / authoring / close-machinery sections a story agent never acts
192
- * on: keeping them out of the per-Story prompt trims token cost without
193
- * losing any binding context (the Story carries its own inline
194
- * acceptance[] / verify[]).
142
+ * Ideation sections a delivering agent never acts on.
195
143
  *
196
144
  * @type {ReadonlySet<string>}
197
145
  */
@@ -202,21 +150,9 @@ const DELIVERY_DROP_HEADINGS = new Set([
202
150
  ]);
203
151
 
204
152
  /**
205
- * Slice a planning ticket body down to the sections a delivery story agent acts on.
206
- *
207
- * KEEP: the ticket title / preamble before the first `##`, `## Goal`,
208
- * `## Non-Goals`, `## User Stories`, the `techSpec` managed region, and —
209
- * fail-open — any unknown / operator-authored `##` section not in the drop
210
- * list. DROP: `## Context`, `## Scope`, `## Acceptance Criteria`, and the
211
- * `acceptanceTable` managed region.
212
- *
213
- * The `techSpec` region is located by its markers (not by heading
214
- * boundaries) so its inner `## Delivery Slicing` heading is preserved
215
- * verbatim and never mistaken for a plain droppable section. Plain `##`
216
- * sections outside the managed regions are sliced by heading boundaries.
217
- *
218
- * Fail-open is load-bearing: any heading not explicitly in the drop set is
219
- * kept, so operator-authored content is never silently lost.
153
+ * Slice a planning body to what a delivering agent acts on: drops the
154
+ * `acceptanceTable` region and the {@link DELIVERY_DROP_HEADINGS} sections.
155
+ * Fail-open — any other heading is kept so operator content is never lost.
220
156
  *
221
157
  * @param {string} body
222
158
  * @returns {string}
@@ -224,14 +160,10 @@ const DELIVERY_DROP_HEADINGS = new Set([
224
160
  export function sliceTicketBodyForDelivery(body) {
225
161
  if (typeof body !== 'string' || body.length === 0) return '';
226
162
 
227
- // 1. Drop the acceptance-table managed region outright (authoring/close
228
- // machinery, never delivery context).
229
163
  let working = stripTicketSection(body, 'acceptanceTable');
230
164
 
231
- // 2. Protect the techSpec managed region from heading-boundary slicing by
232
- // lifting it out behind an opaque placeholder, then restoring it after
233
- // the plain-section pass. Its inner `## Delivery Slicing` heading must
234
- // survive verbatim.
165
+ // Lift the techSpec region out behind a placeholder so heading slicing
166
+ // cannot touch its inner `##` headings.
235
167
  const techLoc = locate(working, 'techSpec');
236
168
  let techRegion = null;
237
169
  const PLACEHOLDER = '\u0000MANDREL_TECH_SPEC_PLACEHOLDER\u0000';
@@ -244,9 +176,6 @@ export function sliceTicketBodyForDelivery(body) {
244
176
  working.slice(techLoc.endIdx + end.length);
245
177
  }
246
178
 
247
- // 3. Slice plain `##` sections by heading boundaries, dropping only the
248
- // known ideation/authoring headings. The preamble before the first
249
- // `##` (ticket title / lede) is always kept.
250
179
  const kept = [];
251
180
  let dropping = false;
252
181
  for (const line of working.split('\n')) {
@@ -262,12 +191,10 @@ export function sliceTicketBodyForDelivery(body) {
262
191
  }
263
192
  working = kept.join('\n');
264
193
 
265
- // 4. Restore the techSpec region in place.
266
194
  if (techRegion !== null) {
267
195
  working = working.replace(PLACEHOLDER, () => techRegion);
268
196
  }
269
197
 
270
- // 5. Normalise the blank-line runs left by the drops.
271
198
  return working
272
199
  .replace(/\n{3,}/g, '\n\n')
273
200
  .replace(/^\n+/, '')
@@ -275,10 +202,8 @@ export function sliceTicketBodyForDelivery(body) {
275
202
  }
276
203
 
277
204
  /**
278
- * Strip the retired machine-managed `## Planning Artifacts` checklist from
279
- * a planning ticket body (the section that linked the now-retired context tickets).
280
- * The slice ends at the next `## ` heading, a managed-region marker, or
281
- * EOF. Historical bodies without the section pass through untouched.
205
+ * Strip a `## Planning Artifacts` section, up to the next `## `, managed
206
+ * marker, or EOF.
282
207
  *
283
208
  * @param {string} body
284
209
  * @returns {string}
@@ -26,19 +26,8 @@ function loadTypeScript() {
26
26
  let _tsVersion = null;
27
27
 
28
28
  /**
29
- * Resolve the `typescript` package version, used to stamp baselines so
30
- * consumers can detect transpiler drift. Returns `'0.0.0'` when the
31
- * dependency is unresolvable — callers treat that sentinel as "unknown
32
- * environment" and may refuse to persist a baseline that includes TS rows.
33
- *
34
- * **The version is read from the package manifest, never by evaluating the
35
- * compiler** (Story #5109) — see
36
- * [`dependency-version.js`](dependency-version.js) for how, and for what it
37
- * cost to do it the other way. The manifest returns the identical string, so
38
- * the stamp (and therefore every committed baseline envelope) is
39
- * byte-identical either way. The compiler itself is still loaded — lazily, by
40
- * `transpileIfNeeded` — the first time a `.ts`/`.tsx` input is actually
41
- * transpiled.
29
+ * `typescript` version for baseline stamps, read from the manifest (never by
30
+ * loading the compiler). `'0.0.0'` means unknown environment.
42
31
  *
43
32
  * @returns {string}
44
33
  */
@@ -54,32 +43,18 @@ function isTypeScriptPath(filePath) {
54
43
  }
55
44
 
56
45
  /**
57
- * Trailing `//# sourceMappingURL=…` comment `ts.transpileModule` appends
58
- * when `sourceMap: true` is requested. Stripping it makes the emitted code
59
- * byte-identical to the `sourceMap: false` emit, which is what keeps the
60
- * maintainability path — and every MI score in the committed baseline —
61
- * untouched by the CRAP path opting into a map.
46
+ * Stripped so a `sourceMap: true` emit is byte-identical to the plain one,
47
+ * keeping MI scores unaffected by the CRAP path's map.
62
48
  */
63
49
  const SOURCE_MAPPING_URL_RE = /\n?\/\/# sourceMappingURL=[^\n]*\n?$/;
64
50
 
65
51
  /**
66
- * Build a `transpiledLine → originalLine` resolver over a raw
67
- * `sourceMapText` payload, using Node's built-in `SourceMap` (no new
68
- * runtime dependency).
69
- *
70
- * `SourceMap#findEntry(line, column)` is 0-based and returns the mapping at
71
- * or before the requested position, so a bare `findEntry(line, 0)` can
72
- * silently answer with a *previous* line's mapping when the requested line
73
- * carries no mapping at column 0. The resolver therefore walks the columns
74
- * of the generated line and accepts only an entry that actually originates
75
- * on that generated line; a line with no mapping at all resolves to `null`
76
- * and the caller falls back to the un-remapped coordinate.
52
+ * Memoised `transpiledLine → originalLine` resolver. `findEntry` returns the
53
+ * mapping at or *before* a position, so columns are walked and only an entry
54
+ * on the same generated line is accepted; an unmapped line yields `null`.
77
55
  *
78
- * Results are memoised per generated line — a file's methods are looked up
79
- * once each, but the same line is often probed by several callers.
80
- *
81
- * @param {string} sourceMapText Raw JSON source map emitted by TypeScript.
82
- * @param {string} code The generated (transpiled) code the map describes.
56
+ * @param {string} sourceMapText
57
+ * @param {string} code
83
58
  * @returns {((line: number) => number|null)|null}
84
59
  */
85
60
  function buildLineMapper(sourceMapText, code) {
@@ -119,36 +94,9 @@ function buildLineMapper(sourceMapText, code) {
119
94
  }
120
95
 
121
96
  /**
122
- * Pre-transpile TypeScript or TSX sources to JavaScript that the
123
- * Esprima-based escomplex kernel can parse. Returns the input unchanged
124
- * for `.js` / `.mjs` / `.cjs` paths.
125
- *
126
- * Type annotations introduce no control flow, so the transpiled output
127
- * scores identically to the original TS for cyclomatic complexity,
128
- * Halstead volume, and the maintainability index. `.tsx` uses the
129
- * `react-jsx` emit so JSX expressions become function calls escomplex
130
- * can read; `.preserve` would leave JSX in the output and Esprima would
131
- * choke on it.
132
- *
133
- * On transpile failure the helper returns `null` — callers treat that
134
- * as "skip this file" rather than crashing the scan.
135
- *
136
- * **Line coordinates (Story #4775).** The transpile does not preserve line
137
- * numbers: interface elision and the injected JSX-runtime import shift the
138
- * emitted code relative to the original source. escomplex then reports each
139
- * method's `lineStart` in *transpiled* coordinates while istanbul's `fnMap`
140
- * is in *original source* coordinates — so a per-method coverage join keyed
141
- * on the raw `lineStart` cannot match. Callers that need to join against
142
- * coverage pass `{ withLineMap: true }` and receive
143
- * `{ code, mapLine }`, where `mapLine(transpiledLine)` returns the original
144
- * source line (or `null` when the line has no mapping).
145
- *
146
- * `withLineMap` is opt-in precisely so the maintainability path — which is
147
- * module-level and never joins coverage — keeps paying nothing for a map it
148
- * would not read, and keeps emitting byte-identical scores. A JavaScript
149
- * input is a passthrough in both modes: `mapLine` is `null` because the
150
- * coordinates already *are* original-source coordinates, so no remap is
151
- * needed and none is computed.
97
+ * TS/TSX → JS escomplex can parse (types add no control flow); JS passes
98
+ * through; `null` means skip. Transpiling shifts lines, so a coverage join
99
+ * opts into `{ withLineMap: true }` → `{ code, mapLine }` (`null` for JS).
152
100
  *
153
101
  * @param {string} filePath
154
102
  * @param {string} source
@@ -199,17 +147,10 @@ export function transpileIfNeeded(filePath, source, opts = {}) {
199
147
  }
200
148
 
201
149
  /**
202
- * Prepare a source file for scoring: read it, transpile TS/TSX with a
203
- * line map, and hand back the JavaScript escomplex will parse alongside the
204
- * transpiled → original-source line resolver the coverage join needs
205
- * (Story #4775).
206
- *
207
- * Failure is reported as `{error: 'read'}` or `{error: 'transpile'}` rather
208
- * than a bare null: CRAP drops the file either way, but the combined MI path
209
- * distinguishes them (a read failure drops the MI score, a transpile failure
210
- * scores it 0 — matching `calculateForFile`).
150
+ * Read + transpile with a line map. Read and transpile failures stay
151
+ * distinct: the MI path drops the score on `read` but scores 0 on `transpile`.
211
152
  *
212
- * @param {string} abs Absolute path of the source file.
153
+ * @param {string} abs
213
154
  * @param {{readFile?: (p: string) => string, transpile?: Function}} [deps]
214
155
  * @returns {{code: string, mapLine: ((line: number) => number|null)|null}
215
156
  * | {error: 'read'|'transpile'}}
@@ -1,32 +1,13 @@
1
1
  /**
2
- * concurrentMap — bounded-concurrency async map.
3
- *
4
- * Semantics:
5
- * - Preserves input order in the returned array (result[i] == mapper(items[i])).
6
- * - Cap of at most `concurrency` `mapper` invocations in flight at a time.
7
- * - First rejection wins: the returned promise rejects with the first thrown
8
- * error. Later rejections from drain-through work are swallowed so the
9
- * caller observes a single deterministic failure.
10
- * - Drain-on-rejection: workers that are already mid-await finish naturally
11
- * (we do not cancel). Only dispatch of *new* items stops after the first
12
- * error. This matches fetch-style callers that have no cancellation token
13
- * and would leak otherwise.
2
+ * concurrentMap — bounded-concurrency async map. Preserves input order; the
3
+ * first rejection wins and stops new dispatch, while in-flight work drains
4
+ * (no cancellation) and later rejections are swallowed.
14
5
  */
15
6
 
16
7
  /**
17
- * The one bound every independent-write fan-out over the GitHub API uses
18
- * (Story #4952 raised those loops off serial; Story #4961 made this the single
19
- * owner of the number they share). Imported by the `/mandrel-plan` context gathers,
20
- * the persist checkpoint fan-out, the `agent::ready` flips and the supersede
21
- * close loop, so re-tuning the policy is one edit rather than six.
22
- *
23
- * **Why bounded and not unbounded.** Every unit in those fan-outs is its own
24
- * API round-trip, so an unbounded map over an N-Story plan dispatches N writes
25
- * at once — and GitHub answers a burst with a secondary rate limit rather than
26
- * with throughput. The goal is overlapping unrelated waits, not saturating the
27
- * API, and four is enough to collapse the latency the serial loops paid while
28
- * staying well under the burst threshold. Callers whose ordering is
29
- * load-bearing (`createStoryIssues`) stay serial instead of importing this.
8
+ * The shared bound for independent GitHub-write fan-outs. Unbounded bursts
9
+ * earn a secondary rate limit, not throughput; four overlaps the waits while
10
+ * staying under it. Order-sensitive callers stay serial instead.
30
11
  */
31
12
  export const FANOUT_CONCURRENCY = 4;
32
13
 
@@ -1,51 +1,25 @@
1
1
  /**
2
- * parse-id-list — expand a Story-id list that may contain dash ranges.
3
- *
4
- * Operators name a contiguous span of Stories the way they read one — as a
5
- * range: `/mandrel-deliver 4922 - 4926`. Enumerating it by hand is the kind of
6
- * transcription step that silently drops or invents an id, so the range is a
7
- * first-class shape of every delivery id list rather than something the host
8
- * expands from prose.
9
- *
10
- * Accepted tokens, comma-separated:
11
- * - a single id, with an optional `#` — `4922`, `#4922`
12
- * - an inclusive range — `4922-4926`, `4922 - 4926`, `#4922-#4926`
13
- * (hyphen-minus, en dash, or em dash; whitespace around it is fine)
14
- *
15
- * Everything else is a hard error, never a silent drop: a wrong id list
16
- * co-dispatches against the wrong graph, so it must fail where it is typed.
17
- * Two range-specific guards exist for the same reason — a backwards range is
18
- * refused rather than expanded to nothing, and a span above `MAX_RANGE_SPAN`
19
- * is refused rather than resolving thousands of issues off a typo.
2
+ * parse-id-list — expand a Story-id list that may contain dash ranges
3
+ * (an id with optional `#` prefix, or `A - B`, en/em dash accepted). Anything else is a
4
+ * hard error, never a silent drop: a wrong list dispatches against the wrong
5
+ * graph. Backwards ranges and spans above the cap are refused too.
20
6
  */
21
7
 
22
- /**
23
- * Inclusive-span ceiling for a single range token. Generous against any real
24
- * plan run (a handful of Stories) and tight enough that `1-4926` is caught as
25
- * the typo it is rather than fanning out into a live resolution sweep.
26
- *
27
- * Deliberately module-private: the cap is a published contract
28
- * (`helpers/deliver-reference.md` § Ranges), so a test that imported it could
29
- * not notice the number silently moving out from under the doc.
30
- */
8
+ // Catches `1-4926` as the typo it is. Module-private because the number is a
9
+ // published contract (`helpers/deliver-reference.md` § Ranges).
31
10
  const MAX_RANGE_SPAN = 50;
32
11
 
33
- /** Hyphen-minus, en dash, em dash — whichever the operator's keyboard emits. */
34
12
  const DASH = '[-–—]';
35
13
  const SINGLE_RE = /^#?(\d+)$/;
36
14
  const RANGE_RE = new RegExp(`^#?(\\d+)\\s*${DASH}\\s*#?(\\d+)$`);
37
15
 
38
16
  /**
39
- * Parse a comma-separated Story-id list, expanding any `A-B` range token.
40
- *
41
- * Absent or empty input is not an error here — it yields an empty list, and
42
- * the caller decides whether that is a usage error (`--ids`) or a legitimate
43
- * empty set (`--done`).
17
+ * Empty input yields `[]`; the caller decides whether that is an error.
44
18
  *
45
19
  * @param {string|undefined|null} raw
46
20
  * @param {object} [options]
47
21
  * @param {string} [options.flag] Flag name, for the error message.
48
- * @param {string} [options.prefix] Message prefix, for the caller's log tag.
22
+ * @param {string} [options.prefix] Message prefix.
49
23
  * @param {number} [options.maxSpan] Inclusive-span ceiling per range token.
50
24
  * @returns {{ ids: number[]|null, error: string|null }}
51
25
  */
@@ -1,25 +1,9 @@
1
1
  /**
2
- * pollUntil — run `fn` on an interval until `predicate(result)` is truthy,
3
- * the optional `signal` aborts, or `timeoutMs` elapses.
4
- *
5
- * Returns the first `fn` result that satisfies `predicate`. If the signal
6
- * aborts first, resolves to `undefined`. If the timeout elapses, throws.
7
- *
8
- * Errors thrown by `fn` are logged via `logger.warn` (if provided) and
9
- * treated as a non-match — the loop continues until predicate, abort, or
10
- * timeout. This mirrors the hand-rolled wait loops we replaced, where a
11
- * single transient fetch error should not terminate the poll.
12
- *
13
- * `sleep` is exported as the cancellable delay primitive used internally;
14
- * callers that already have their own cadence (e.g. a continuous ticker)
15
- * can import it directly.
16
- *
17
- * `sleepFn` is the inter-tick delay seam (Story #4873). A caller that already
18
- * owns a delay seam of its own — the close-and-land merge wait, whose suite
19
- * must never actually sleep out a 30s poll interval — passes it here so
20
- * adopting this primitive does not cost it that seam. It is called as
21
- * `sleepFn(intervalMs, signal)`; a one-argument stub simply ignores the
22
- * signal, and the default is the cancellable {@link sleep} below.
2
+ * pollUntil — run `fn` every `intervalMs` until `predicate(result)` holds
3
+ * (returns it), `signal` aborts (`undefined`), or `timeoutMs` elapses
4
+ * (throws). A throwing `fn` is logged and treated as a non-match, so one
5
+ * transient error never ends the poll. `sleepFn(ms, signal)` lets a caller
6
+ * keep its own delay seam.
23
7
  */
24
8
 
25
9
  /**
@@ -74,13 +58,9 @@ export async function pollUntil(opts) {
74
58
  }
75
59
 
76
60
  /**
77
- * Cancellable sleep. Resolves after `ms` or immediately when `signal` aborts.
78
- *
79
- * The timer is intentionally NOT `unref`'d — unref'd timers caused Node 22's
80
- * test runner to cancel subtests that awaited `sleep` with `cancelledByParent`
81
- * / "Promise resolution is still pending but the event loop has already
82
- * resolved". Callers that need a clean shutdown should abort the `signal`
83
- * instead of relying on unref.
61
+ * Resolves after `ms` or on abort. Deliberately not `unref`'d: Node 22's test
62
+ * runner cancels subtests awaiting an unref'd timer. Abort the signal for a
63
+ * clean shutdown instead.
84
64
  *
85
65
  * @param {number} ms
86
66
  * @param {AbortSignal} [signal]