mandrel 2.60.0 → 2.61.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (661) hide show
  1. package/.agents/README.md +10 -10
  2. package/.agents/agents/story-worker.md +1 -1
  3. package/.agents/docs/agentrc-reference.json +4 -82
  4. package/.agents/docs/configuration.md +20 -87
  5. package/.agents/docs/workflows.md +1 -1
  6. package/.agents/instructions.md +1 -3
  7. package/.agents/rules/gherkin-standards.md +4 -0
  8. package/.agents/schemas/agentrc.schema.json +11 -486
  9. package/.agents/schemas/story-deliver-terminal.schema.json +10 -0
  10. package/.agents/schemas/validation-evidence.schema.json +2 -1
  11. package/.agents/scripts/README.md +14 -14
  12. package/.agents/scripts/acceptance-eval.js +32 -164
  13. package/.agents/scripts/agents-bootstrap-github.js +27 -129
  14. package/.agents/scripts/apply-quality-bootstrap.js +4 -40
  15. package/.agents/scripts/audit-baselines.js +6 -27
  16. package/.agents/scripts/audit-labels-bootstrap.js +5 -29
  17. package/.agents/scripts/audit-to-stories.js +91 -361
  18. package/.agents/scripts/boot-sweep.js +19 -72
  19. package/.agents/scripts/bootstrap.js +74 -395
  20. package/.agents/scripts/ceremony-derive.js +9 -45
  21. package/.agents/scripts/check-arch-cycles.js +14 -64
  22. package/.agents/scripts/check-baselines.js +8 -48
  23. package/.agents/scripts/check-context-budget.js +46 -172
  24. package/.agents/scripts/check-cyclomatic.js +12 -44
  25. package/.agents/scripts/check-dead-exports.js +13 -64
  26. package/.agents/scripts/check-doc-links.js +38 -186
  27. package/.agents/scripts/check-gherkin-corpus.js +24 -127
  28. package/.agents/scripts/check-test-temp-hygiene.js +28 -169
  29. package/.agents/scripts/coverage-capture.js +32 -99
  30. package/.agents/scripts/deliver-light.js +14 -101
  31. package/.agents/scripts/deliver-recover.js +6 -42
  32. package/.agents/scripts/deliver-run.js +36 -133
  33. package/.agents/scripts/diagnose-friction.js +24 -116
  34. package/.agents/scripts/drain-pending-cleanup.js +1 -1
  35. package/.agents/scripts/evidence-gate.js +23 -85
  36. package/.agents/scripts/file-ci-gap.js +10 -50
  37. package/.agents/scripts/generate-config-docs.js +30 -170
  38. package/.agents/scripts/generate-lens-checklists.js +8 -52
  39. package/.agents/scripts/generate-skills-index.js +14 -112
  40. package/.agents/scripts/generate-workflows-doc.js +10 -70
  41. package/.agents/scripts/git-cleanup.js +2 -34
  42. package/.agents/scripts/lib/Graph.js +24 -81
  43. package/.agents/scripts/lib/ITicketingProvider.js +47 -143
  44. package/.agents/scripts/lib/Logger.js +14 -76
  45. package/.agents/scripts/lib/audit-baselines/engine.js +11 -31
  46. package/.agents/scripts/lib/audit-baselines/gate-surface.js +3 -17
  47. package/.agents/scripts/lib/audit-baselines/headroom.js +4 -20
  48. package/.agents/scripts/lib/audit-baselines/hotspots.js +3 -15
  49. package/.agents/scripts/lib/audit-baselines/kinds.js +23 -89
  50. package/.agents/scripts/lib/audit-baselines/outliers.js +6 -23
  51. package/.agents/scripts/lib/audit-baselines/read.js +3 -16
  52. package/.agents/scripts/lib/audit-baselines/staleness.js +7 -26
  53. package/.agents/scripts/lib/audit-baselines/surface-entry.js +7 -28
  54. package/.agents/scripts/lib/audit-baselines/trend.js +7 -20
  55. package/.agents/scripts/lib/audit-baselines/weights.js +9 -37
  56. package/.agents/scripts/lib/audit-suite/audit-rules-reader.js +3 -18
  57. package/.agents/scripts/lib/audit-suite/checklist-threading.js +26 -124
  58. package/.agents/scripts/lib/audit-suite/dispatch-checklist.js +14 -45
  59. package/.agents/scripts/lib/audit-suite/findings.js +12 -52
  60. package/.agents/scripts/lib/audit-suite/frontmatter.js +5 -29
  61. package/.agents/scripts/lib/audit-suite/index.js +1 -15
  62. package/.agents/scripts/lib/audit-suite/lens-checklist.js +10 -45
  63. package/.agents/scripts/lib/audit-suite/lens-diff-floor.js +11 -76
  64. package/.agents/scripts/lib/audit-suite/runner.js +13 -43
  65. package/.agents/scripts/lib/audit-suite/selector.js +49 -349
  66. package/.agents/scripts/lib/audit-suite/substitutions.js +12 -40
  67. package/.agents/scripts/lib/audit-suite/workflow-loader.js +3 -15
  68. package/.agents/scripts/lib/audit-to-stories/audit-label-taxonomy.js +11 -73
  69. package/.agents/scripts/lib/audit-to-stories/audit-lenses.js +8 -37
  70. package/.agents/scripts/lib/audit-to-stories/build-story-body.js +25 -143
  71. package/.agents/scripts/lib/audit-to-stories/dedupe-against-github.js +14 -80
  72. package/.agents/scripts/lib/audit-to-stories/epic-grouping-directive.js +4 -18
  73. package/.agents/scripts/lib/audit-to-stories/finding-adapter.js +7 -40
  74. package/.agents/scripts/lib/audit-to-stories/group-findings.js +9 -39
  75. package/.agents/scripts/lib/audit-to-stories/issue-corpus.js +10 -66
  76. package/.agents/scripts/lib/audit-to-stories/issue-index.js +6 -30
  77. package/.agents/scripts/lib/audit-to-stories/issues-file.js +6 -36
  78. package/.agents/scripts/lib/audit-to-stories/ledger-commit.js +17 -69
  79. package/.agents/scripts/lib/audit-to-stories/ledger-pr.js +17 -85
  80. package/.agents/scripts/lib/audit-to-stories/ledger-record.js +10 -48
  81. package/.agents/scripts/lib/audit-to-stories/parse-audit-md.js +38 -146
  82. package/.agents/scripts/lib/audit-to-stories/seed-from-findings.js +7 -42
  83. package/.agents/scripts/lib/audit-to-stories/wire-dependencies.js +10 -57
  84. package/.agents/scripts/lib/baseline-loader.js +12 -51
  85. package/.agents/scripts/lib/baseline-schema-registry.js +5 -22
  86. package/.agents/scripts/lib/baselines/component-matcher.js +3 -12
  87. package/.agents/scripts/lib/baselines/components.js +10 -61
  88. package/.agents/scripts/lib/baselines/coverage-updater-cli.js +7 -36
  89. package/.agents/scripts/lib/baselines/crap-preview-incremental.js +5 -21
  90. package/.agents/scripts/lib/baselines/crap-preview-scan.js +19 -45
  91. package/.agents/scripts/lib/baselines/crap-updater-cli.js +16 -65
  92. package/.agents/scripts/lib/baselines/diff-scope-cli.js +5 -33
  93. package/.agents/scripts/lib/baselines/duplication-scanner.js +11 -60
  94. package/.agents/scripts/lib/baselines/env-overrides.js +12 -67
  95. package/.agents/scripts/lib/baselines/envelope.js +13 -129
  96. package/.agents/scripts/lib/baselines/exit-codes.js +6 -49
  97. package/.agents/scripts/lib/baselines/git-base.js +23 -142
  98. package/.agents/scripts/lib/baselines/kernel.js +11 -111
  99. package/.agents/scripts/lib/baselines/kinds/_crap-new-method-gate.js +9 -47
  100. package/.agents/scripts/lib/baselines/kinds/_crap-read.js +8 -51
  101. package/.agents/scripts/lib/baselines/kinds/_shared-metric.js +7 -62
  102. package/.agents/scripts/lib/baselines/kinds/bundle-size.js +8 -29
  103. package/.agents/scripts/lib/baselines/kinds/coverage.js +3 -15
  104. package/.agents/scripts/lib/baselines/kinds/crap.js +94 -415
  105. package/.agents/scripts/lib/baselines/kinds/duplication.js +4 -30
  106. package/.agents/scripts/lib/baselines/kinds/kind-factory.js +7 -53
  107. package/.agents/scripts/lib/baselines/kinds/maintainability.js +15 -80
  108. package/.agents/scripts/lib/baselines/kinds/mutation.js +12 -72
  109. package/.agents/scripts/lib/baselines/maintainability-baseline-io.js +4 -11
  110. package/.agents/scripts/lib/baselines/merge-envelopes.js +30 -146
  111. package/.agents/scripts/lib/baselines/path-canon.js +19 -128
  112. package/.agents/scripts/lib/baselines/preview-gates.js +8 -37
  113. package/.agents/scripts/lib/baselines/reader.js +14 -107
  114. package/.agents/scripts/lib/baselines/refresh-service.js +35 -252
  115. package/.agents/scripts/lib/baselines/scope.js +11 -135
  116. package/.agents/scripts/lib/baselines/writer.js +16 -149
  117. package/.agents/scripts/lib/bdd-runner-detect.js +18 -113
  118. package/.agents/scripts/lib/bdd-scenario-budget.js +9 -36
  119. package/.agents/scripts/lib/bdd-scenario-scanner.js +11 -73
  120. package/.agents/scripts/lib/bdd-step-index.js +26 -100
  121. package/.agents/scripts/lib/bootstrap/baseline-merge-driver.js +23 -103
  122. package/.agents/scripts/lib/bootstrap/branch-protection.js +2 -5
  123. package/.agents/scripts/lib/bootstrap/commit-push.js +12 -50
  124. package/.agents/scripts/lib/bootstrap/gh-preflight.js +14 -101
  125. package/.agents/scripts/lib/bootstrap/hitl-confirm.js +5 -30
  126. package/.agents/scripts/lib/bootstrap/install-ledger.js +17 -73
  127. package/.agents/scripts/lib/bootstrap/issue-forms-template.js +17 -121
  128. package/.agents/scripts/lib/bootstrap/manifest.js +15 -86
  129. package/.agents/scripts/lib/bootstrap/merge-methods.js +4 -33
  130. package/.agents/scripts/lib/bootstrap/preflight.js +12 -61
  131. package/.agents/scripts/lib/bootstrap/project-bootstrap.js +34 -235
  132. package/.agents/scripts/lib/bootstrap/prompt.js +21 -129
  133. package/.agents/scripts/lib/bootstrap/quality-bootstrap.js +27 -141
  134. package/.agents/scripts/lib/bootstrap/summary.js +1 -8
  135. package/.agents/scripts/lib/bootstrap/workflow-audit.js +11 -84
  136. package/.agents/scripts/lib/branch-name-guard.js +4 -23
  137. package/.agents/scripts/lib/changed-files.js +31 -143
  138. package/.agents/scripts/lib/checks/core-bare-clean.js +4 -24
  139. package/.agents/scripts/lib/checks/index.js +18 -101
  140. package/.agents/scripts/lib/checks/loop-health.js +11 -53
  141. package/.agents/scripts/lib/checks/state.js +16 -91
  142. package/.agents/scripts/lib/checks/story-init-not-backgrounded.js +10 -61
  143. package/.agents/scripts/lib/checks/subagent-agent-tool-required.js +14 -83
  144. package/.agents/scripts/lib/child-exec.js +39 -108
  145. package/.agents/scripts/lib/cli/standard-args.js +9 -116
  146. package/.agents/scripts/lib/cli-args.js +31 -146
  147. package/.agents/scripts/lib/cli-usage.js +5 -27
  148. package/.agents/scripts/lib/cli-utils.js +2 -12
  149. package/.agents/scripts/lib/close-validation/commands.js +13 -76
  150. package/.agents/scripts/lib/close-validation/gates.js +92 -331
  151. package/.agents/scripts/lib/close-validation/process.js +121 -151
  152. package/.agents/scripts/lib/close-validation/projections/advisories.js +5 -31
  153. package/.agents/scripts/lib/close-validation/projections/crap.js +19 -67
  154. package/.agents/scripts/lib/close-validation/projections/head-sha.js +1 -17
  155. package/.agents/scripts/lib/close-validation/projections/inputs.js +4 -34
  156. package/.agents/scripts/lib/close-validation/projections/maintainability.js +11 -58
  157. package/.agents/scripts/lib/close-validation/runner.js +53 -110
  158. package/.agents/scripts/lib/command-header.js +6 -28
  159. package/.agents/scripts/lib/config/acceptance-eval.js +4 -30
  160. package/.agents/scripts/lib/config/baselines.js +3 -14
  161. package/.agents/scripts/lib/config/ci.js +8 -38
  162. package/.agents/scripts/lib/config/commands.js +1 -15
  163. package/.agents/scripts/lib/config/defaults.js +4 -33
  164. package/.agents/scripts/lib/config/delivery-routing.js +6 -35
  165. package/.agents/scripts/lib/config/explain.js +9 -80
  166. package/.agents/scripts/lib/config/gates/coverage.schema.js +0 -12
  167. package/.agents/scripts/lib/config/gates/crap-incremental-coverage.schema.js +2 -30
  168. package/.agents/scripts/lib/config/gates/crap.schema.js +1 -34
  169. package/.agents/scripts/lib/config/gates/duplication.schema.js +1 -8
  170. package/.agents/scripts/lib/config/gates/index.js +2 -17
  171. package/.agents/scripts/lib/config/gates/maintainability.schema.js +1 -20
  172. package/.agents/scripts/lib/config/gates/mutation.schema.js +1 -7
  173. package/.agents/scripts/lib/config/gates/shared.js +4 -64
  174. package/.agents/scripts/lib/config/github.js +4 -22
  175. package/.agents/scripts/lib/config/limits.js +4 -57
  176. package/.agents/scripts/lib/config/paths.js +2 -21
  177. package/.agents/scripts/lib/config/qa.js +4 -38
  178. package/.agents/scripts/lib/config/quality.js +76 -432
  179. package/.agents/scripts/lib/config/runners.js +12 -56
  180. package/.agents/scripts/lib/config/runtime.js +13 -57
  181. package/.agents/scripts/lib/config/shared.js +2 -16
  182. package/.agents/scripts/lib/config/sync-agentrc.js +9 -50
  183. package/.agents/scripts/lib/config/temp-paths.js +40 -280
  184. package/.agents/scripts/lib/config/validate-orchestration.js +5 -17
  185. package/.agents/scripts/lib/config/worktree-isolation.js +9 -28
  186. package/.agents/scripts/lib/config-resolver.js +10 -52
  187. package/.agents/scripts/lib/config-schema-shared.js +1 -4
  188. package/.agents/scripts/lib/config-settings-schema-delivery.js +12 -294
  189. package/.agents/scripts/lib/config-settings-schema-quality.js +7 -219
  190. package/.agents/scripts/lib/config-settings-schema.js +37 -274
  191. package/.agents/scripts/lib/coverage-baseline.js +20 -110
  192. package/.agents/scripts/lib/coverage-capture-fullscope.js +12 -37
  193. package/.agents/scripts/lib/coverage-capture-incremental.js +12 -43
  194. package/.agents/scripts/lib/coverage-capture-usage.js +4 -24
  195. package/.agents/scripts/lib/coverage-capture.js +99 -224
  196. package/.agents/scripts/lib/coverage-utils.js +14 -79
  197. package/.agents/scripts/lib/cpu-pool.js +17 -123
  198. package/.agents/scripts/lib/crap-baseline-join.js +16 -88
  199. package/.agents/scripts/lib/crap-coordinates.js +6 -25
  200. package/.agents/scripts/lib/crap-engine.js +40 -153
  201. package/.agents/scripts/lib/crap-method-identity.js +16 -78
  202. package/.agents/scripts/lib/crap-utils.js +31 -155
  203. package/.agents/scripts/lib/cyclomatic-ceiling.js +14 -87
  204. package/.agents/scripts/lib/cyclomatic-scope.js +10 -50
  205. package/.agents/scripts/lib/dead-exports-knip.js +18 -56
  206. package/.agents/scripts/lib/dead-exports-mode.js +5 -24
  207. package/.agents/scripts/lib/degraded-mode.js +3 -26
  208. package/.agents/scripts/lib/dependency-parser.js +8 -40
  209. package/.agents/scripts/lib/dependency-version.js +13 -35
  210. package/.agents/scripts/lib/detect-package-manager.js +6 -36
  211. package/.agents/scripts/lib/doc-tiers.js +22 -126
  212. package/.agents/scripts/lib/duplicate-search.js +8 -72
  213. package/.agents/scripts/lib/env-loader.js +5 -27
  214. package/.agents/scripts/lib/error-redactor.js +6 -31
  215. package/.agents/scripts/lib/errors/index.js +2 -22
  216. package/.agents/scripts/lib/escomplex-ast-compat.js +22 -163
  217. package/.agents/scripts/lib/escomplex-kernel.js +21 -123
  218. package/.agents/scripts/lib/feedback-loop/graduator-core.js +93 -419
  219. package/.agents/scripts/lib/feedback-loop/prior-feedback-fetcher.js +20 -98
  220. package/.agents/scripts/lib/feedback-loop/retro-proposals-graduator.js +27 -151
  221. package/.agents/scripts/lib/findings/audit-ledger.js +23 -97
  222. package/.agents/scripts/lib/findings/classify-finding.js +14 -69
  223. package/.agents/scripts/lib/findings/promote-finding.js +14 -112
  224. package/.agents/scripts/lib/findings/provenance-field.js +11 -52
  225. package/.agents/scripts/lib/findings/route-finding.js +37 -255
  226. package/.agents/scripts/lib/findings/semantic-issue-search.js +14 -59
  227. package/.agents/scripts/lib/findings/severity.js +18 -104
  228. package/.agents/scripts/lib/format-generated-json.js +12 -44
  229. package/.agents/scripts/lib/full-suite-lock.js +160 -429
  230. package/.agents/scripts/lib/full-suite-queue.js +213 -0
  231. package/.agents/scripts/lib/gates/baseline-store.js +5 -9
  232. package/.agents/scripts/lib/gates/friction.js +1 -3
  233. package/.agents/scripts/lib/generated/agentrc-validator.js +2 -2
  234. package/.agents/scripts/lib/gh-exec.js +31 -259
  235. package/.agents/scripts/lib/git/cached-fetch.js +9 -52
  236. package/.agents/scripts/lib/git/sync-from-base.js +15 -107
  237. package/.agents/scripts/lib/git-branch-cleanup.js +14 -61
  238. package/.agents/scripts/lib/git-branch-lifecycle.js +16 -87
  239. package/.agents/scripts/lib/git-utils.js +37 -161
  240. package/.agents/scripts/lib/github/framework-repo.js +8 -71
  241. package/.agents/scripts/lib/github-url.js +2 -17
  242. package/.agents/scripts/lib/import-graph.js +11 -38
  243. package/.agents/scripts/lib/install-cmd-parser.js +4 -13
  244. package/.agents/scripts/lib/json-utils.js +3 -18
  245. package/.agents/scripts/lib/label-constants.js +16 -111
  246. package/.agents/scripts/lib/label-taxonomy.js +4 -30
  247. package/.agents/scripts/lib/maintainability-engine.js +12 -80
  248. package/.agents/scripts/lib/maintainability-unscorable.js +5 -25
  249. package/.agents/scripts/lib/maintainability-utils.js +16 -92
  250. package/.agents/scripts/lib/mandrel-catalog.js +12 -70
  251. package/.agents/scripts/lib/notifications/notifier.js +13 -38
  252. package/.agents/scripts/lib/npm-scripts.js +4 -23
  253. package/.agents/scripts/lib/observability/metrics-ledger.js +16 -76
  254. package/.agents/scripts/lib/observability/runtime-friction.js +44 -286
  255. package/.agents/scripts/lib/observability/signal-validator.js +5 -37
  256. package/.agents/scripts/lib/observability/signals-writer.js +11 -121
  257. package/.agents/scripts/lib/observability/source-classifier.js +21 -203
  258. package/.agents/scripts/lib/observability/terse-result.js +14 -47
  259. package/.agents/scripts/lib/onboard/init-tail.js +13 -74
  260. package/.agents/scripts/lib/onboard/scaffold-docs.js +11 -34
  261. package/.agents/scripts/lib/orchestration/acceptance-eval-decision.js +25 -139
  262. package/.agents/scripts/lib/orchestration/auto-merge-cwd.js +11 -66
  263. package/.agents/scripts/lib/orchestration/behind-recovery.js +10 -55
  264. package/.agents/scripts/lib/orchestration/ceremony-routing.js +5 -75
  265. package/.agents/scripts/lib/orchestration/change-set.js +7 -36
  266. package/.agents/scripts/lib/orchestration/check-baselines/phases/compare.js +9 -46
  267. package/.agents/scripts/lib/orchestration/check-baselines/phases/evaluate.js +11 -44
  268. package/.agents/scripts/lib/orchestration/check-baselines/phases/floors.js +5 -24
  269. package/.agents/scripts/lib/orchestration/check-baselines/phases/friction.js +3 -12
  270. package/.agents/scripts/lib/orchestration/check-baselines/phases/parse-args.js +5 -38
  271. package/.agents/scripts/lib/orchestration/check-baselines/phases/pipeline.js +3 -8
  272. package/.agents/scripts/lib/orchestration/check-baselines/phases/refresh-ack.js +28 -136
  273. package/.agents/scripts/lib/orchestration/check-baselines/phases/report.js +3 -13
  274. package/.agents/scripts/lib/orchestration/check-state.js +92 -0
  275. package/.agents/scripts/lib/orchestration/ci-gap-intake.js +37 -144
  276. package/.agents/scripts/lib/orchestration/ci-rerun-guard.js +42 -189
  277. package/.agents/scripts/lib/orchestration/code-review.js +24 -128
  278. package/.agents/scripts/lib/orchestration/column-sync.js +23 -111
  279. package/.agents/scripts/lib/orchestration/complexity-gate.js +42 -214
  280. package/.agents/scripts/lib/orchestration/deliver-recover.js +36 -168
  281. package/.agents/scripts/lib/orchestration/dependency-analyzer.js +4 -35
  282. package/.agents/scripts/lib/orchestration/dependency-candidates.js +9 -41
  283. package/.agents/scripts/lib/orchestration/diff-magnitude.js +25 -115
  284. package/.agents/scripts/lib/orchestration/doc-reader.js +2 -6
  285. package/.agents/scripts/lib/orchestration/docs-digest.js +13 -51
  286. package/.agents/scripts/lib/orchestration/epic-candidates.js +13 -53
  287. package/.agents/scripts/lib/orchestration/epic-checklist.js +9 -33
  288. package/.agents/scripts/lib/orchestration/epic-container.js +41 -167
  289. package/.agents/scripts/lib/orchestration/epic-expansion.js +10 -40
  290. package/.agents/scripts/lib/orchestration/epic-rollup.js +55 -207
  291. package/.agents/scripts/lib/orchestration/file-assumption-enum.js +2 -22
  292. package/.agents/scripts/lib/orchestration/file-assumptions.js +45 -253
  293. package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-detect.js +9 -46
  294. package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-reap.js +7 -57
  295. package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches.js +21 -126
  296. package/.agents/scripts/lib/orchestration/git-cleanup/phases/cli.js +2 -6
  297. package/.agents/scripts/lib/orchestration/git-cleanup/phases/fast-forward.js +1 -4
  298. package/.agents/scripts/lib/orchestration/git-cleanup/phases/filters.js +1 -5
  299. package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes-ff.js +9 -34
  300. package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes.js +41 -190
  301. package/.agents/scripts/lib/orchestration/git-cleanup/phases/merged-tip.js +9 -45
  302. package/.agents/scripts/lib/orchestration/git-cleanup/phases/parse-args.js +1 -4
  303. package/.agents/scripts/lib/orchestration/git-cleanup/phases/phase-drivers.js +19 -85
  304. package/.agents/scripts/lib/orchestration/git-cleanup/phases/prompts.js +3 -17
  305. package/.agents/scripts/lib/orchestration/git-cleanup/phases/prune.js +1 -5
  306. package/.agents/scripts/lib/orchestration/git-cleanup/phases/render.js +16 -100
  307. package/.agents/scripts/lib/orchestration/git-cleanup/phases/stashes.js +1 -4
  308. package/.agents/scripts/lib/orchestration/lease-guard-shared.js +16 -67
  309. package/.agents/scripts/lib/orchestration/lifecycle/emit-ledger-event.js +9 -33
  310. package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-flip-failed.js +8 -29
  311. package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-unlanded.js +15 -68
  312. package/.agents/scripts/lib/orchestration/light-backstop.js +11 -49
  313. package/.agents/scripts/lib/orchestration/light-escalation.js +21 -89
  314. package/.agents/scripts/lib/orchestration/light-suitability.js +26 -231
  315. package/.agents/scripts/lib/orchestration/merge-block-class.js +39 -216
  316. package/.agents/scripts/lib/orchestration/merge-poll.js +104 -377
  317. package/.agents/scripts/lib/orchestration/pinned-identifier-lint.js +17 -57
  318. package/.agents/scripts/lib/orchestration/plan-context.js +52 -303
  319. package/.agents/scripts/lib/orchestration/plan-critic-conditions.js +22 -79
  320. package/.agents/scripts/lib/orchestration/plan-critics-evaluate.js +5 -31
  321. package/.agents/scripts/lib/orchestration/plan-metrics.js +29 -108
  322. package/.agents/scripts/lib/orchestration/plan-navigation.js +8 -27
  323. package/.agents/scripts/lib/orchestration/plan-persist/acceptance-handle-repair.js +12 -49
  324. package/.agents/scripts/lib/orchestration/plan-persist/audit-provenance.js +18 -73
  325. package/.agents/scripts/lib/orchestration/plan-persist/changes-repair.js +14 -78
  326. package/.agents/scripts/lib/orchestration/plan-persist/cross-plan-links.js +6 -30
  327. package/.agents/scripts/lib/orchestration/plan-persist/epic-adoption.js +14 -65
  328. package/.agents/scripts/lib/orchestration/plan-persist/epic-ops.js +21 -76
  329. package/.agents/scripts/lib/orchestration/plan-persist/external-deps.js +6 -43
  330. package/.agents/scripts/lib/orchestration/plan-persist/persist-helpers.js +14 -68
  331. package/.agents/scripts/lib/orchestration/plan-persist/plan-context-source.js +9 -41
  332. package/.agents/scripts/lib/orchestration/plan-persist/run-plan-persist.js +49 -248
  333. package/.agents/scripts/lib/orchestration/plan-persist/soft-findings.js +2 -12
  334. package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +85 -368
  335. package/.agents/scripts/lib/orchestration/plan-persist/summary.js +8 -38
  336. package/.agents/scripts/lib/orchestration/plan-persist/supersede-ops.js +30 -190
  337. package/.agents/scripts/lib/orchestration/plan-persist/wave-collision-gate.js +9 -49
  338. package/.agents/scripts/lib/orchestration/plan-persist/wave-serialisation.js +7 -28
  339. package/.agents/scripts/lib/orchestration/plan-reachability.js +13 -42
  340. package/.agents/scripts/lib/orchestration/plan-run-labels/reap.js +16 -91
  341. package/.agents/scripts/lib/orchestration/plan-runner/worktree-sweep.js +16 -54
  342. package/.agents/scripts/lib/orchestration/plan-text-hygiene.js +10 -52
  343. package/.agents/scripts/lib/orchestration/planning/authoring-context.js +14 -109
  344. package/.agents/scripts/lib/orchestration/planning/memory-pool-advisory.js +11 -83
  345. package/.agents/scripts/lib/orchestration/pr-watch.js +48 -306
  346. package/.agents/scripts/lib/orchestration/project-meta-cache.js +15 -80
  347. package/.agents/scripts/lib/orchestration/project-meta-resolver.js +10 -51
  348. package/.agents/scripts/lib/orchestration/reassert-status-column.js +12 -76
  349. package/.agents/scripts/lib/orchestration/remote-verifier.js +12 -36
  350. package/.agents/scripts/lib/orchestration/resolve-stories.js +33 -164
  351. package/.agents/scripts/lib/orchestration/retro-proposals.js +66 -361
  352. package/.agents/scripts/lib/orchestration/review-base-ref.js +9 -43
  353. package/.agents/scripts/lib/orchestration/review-depth.js +12 -94
  354. package/.agents/scripts/lib/orchestration/review-providers/codex.js +10 -111
  355. package/.agents/scripts/lib/orchestration/review-providers/degraded-gates.js +13 -71
  356. package/.agents/scripts/lib/orchestration/review-providers/findings-renderer.js +7 -51
  357. package/.agents/scripts/lib/orchestration/review-providers/mi-exemptions.js +8 -53
  358. package/.agents/scripts/lib/orchestration/review-providers/native.js +30 -214
  359. package/.agents/scripts/lib/orchestration/review-providers/parse-findings.js +7 -52
  360. package/.agents/scripts/lib/orchestration/review-providers/review-depth.js +4 -33
  361. package/.agents/scripts/lib/orchestration/review-providers/review-provider-factory.js +11 -71
  362. package/.agents/scripts/lib/orchestration/review-providers/scoped-lint.js +19 -131
  363. package/.agents/scripts/lib/orchestration/review-providers/security-review.js +6 -89
  364. package/.agents/scripts/lib/orchestration/review-providers/types.js +26 -56
  365. package/.agents/scripts/lib/orchestration/review-providers/ultrareview.js +3 -46
  366. package/.agents/scripts/lib/orchestration/run-epilogue.js +40 -199
  367. package/.agents/scripts/lib/orchestration/run-scoped-config.js +13 -81
  368. package/.agents/scripts/lib/orchestration/single-story-close/close-note.js +7 -34
  369. package/.agents/scripts/lib/orchestration/single-story-close/failed-terminal.js +16 -89
  370. package/.agents/scripts/lib/orchestration/single-story-close/gate-log.js +18 -109
  371. package/.agents/scripts/lib/orchestration/single-story-close/phases/auto-merge.js +83 -239
  372. package/.agents/scripts/lib/orchestration/single-story-close/phases/base-sync.js +18 -80
  373. package/.agents/scripts/lib/orchestration/single-story-close/phases/close-validation.js +103 -97
  374. package/.agents/scripts/lib/orchestration/single-story-close/phases/code-review.js +8 -64
  375. package/.agents/scripts/lib/orchestration/single-story-close/phases/confirm-merge.js +136 -486
  376. package/.agents/scripts/lib/orchestration/single-story-close/phases/conventional-subject.js +30 -134
  377. package/.agents/scripts/lib/orchestration/single-story-close/phases/graphql-preflight.js +9 -50
  378. package/.agents/scripts/lib/orchestration/single-story-close/phases/lock-wait-pending.js +49 -0
  379. package/.agents/scripts/lib/orchestration/single-story-close/phases/normalize-pr-title.js +13 -86
  380. package/.agents/scripts/lib/orchestration/single-story-close/phases/options.js +20 -95
  381. package/.agents/scripts/lib/orchestration/single-story-close/phases/post-land.js +46 -203
  382. package/.agents/scripts/lib/orchestration/single-story-close/phases/pre-gate-steps.js +8 -50
  383. package/.agents/scripts/lib/orchestration/single-story-close/phases/pull-request.js +12 -83
  384. package/.agents/scripts/lib/orchestration/single-story-close/phases/push.js +6 -39
  385. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-block.js +1 -6
  386. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-outcome.js +4 -28
  387. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-override.js +6 -51
  388. package/.agents/scripts/lib/orchestration/single-story-close/phases/worktree-reap.js +6 -34
  389. package/.agents/scripts/lib/orchestration/single-story-close/phases/wrong-tree-guard.js +23 -121
  390. package/.agents/scripts/lib/orchestration/single-story-close/runner.js +110 -290
  391. package/.agents/scripts/lib/orchestration/single-story-lease-guard.js +15 -69
  392. package/.agents/scripts/lib/orchestration/story-body-gate.js +4 -23
  393. package/.agents/scripts/lib/orchestration/story-close/baseline-upward-writeback.js +50 -179
  394. package/.agents/scripts/lib/orchestration/story-close/context-budget-writeback.js +11 -41
  395. package/.agents/scripts/lib/orchestration/story-close/format-autofix.js +23 -311
  396. package/.agents/scripts/lib/orchestration/story-close/phases/local-lens-review.js +22 -147
  397. package/.agents/scripts/lib/orchestration/story-close/phases/review-core.js +16 -67
  398. package/.agents/scripts/lib/orchestration/story-deliver-terminal-schema.js +12 -68
  399. package/.agents/scripts/lib/orchestration/story-deliver-terminal.js +42 -201
  400. package/.agents/scripts/lib/orchestration/story-follow-ups.js +43 -245
  401. package/.agents/scripts/lib/orchestration/story-init-envelope.js +4 -23
  402. package/.agents/scripts/lib/orchestration/story-init-remote.js +2 -6
  403. package/.agents/scripts/lib/orchestration/story-reachability.js +3 -23
  404. package/.agents/scripts/lib/orchestration/task-body-validator.js +12 -126
  405. package/.agents/scripts/lib/orchestration/ticket-lease.js +28 -131
  406. package/.agents/scripts/lib/orchestration/ticket-validator-conflicts.js +15 -149
  407. package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +5 -33
  408. package/.agents/scripts/lib/orchestration/ticket-validator.js +39 -181
  409. package/.agents/scripts/lib/orchestration/ticketing/bulk.js +51 -244
  410. package/.agents/scripts/lib/orchestration/ticketing/reads.js +39 -250
  411. package/.agents/scripts/lib/orchestration/ticketing/state.js +14 -68
  412. package/.agents/scripts/lib/orchestration/ticketing/transition.js +46 -263
  413. package/.agents/scripts/lib/orchestration/ticketing.js +2 -26
  414. package/.agents/scripts/lib/orchestration/verify-credit.js +18 -79
  415. package/.agents/scripts/lib/orchestration/worktree-dirty.js +5 -30
  416. package/.agents/scripts/lib/path-security.js +3 -6
  417. package/.agents/scripts/lib/plan-phase-cleanup.js +9 -49
  418. package/.agents/scripts/lib/preflight-runner.js +13 -69
  419. package/.agents/scripts/lib/process-group.js +143 -0
  420. package/.agents/scripts/lib/project-root.js +2 -8
  421. package/.agents/scripts/lib/provider-factory.js +2 -25
  422. package/.agents/scripts/lib/qa/console-allowlist.js +10 -59
  423. package/.agents/scripts/lib/qa/qa-session.js +15 -69
  424. package/.agents/scripts/lib/qa/redact-evidence.js +18 -129
  425. package/.agents/scripts/lib/qa/resolve-qa-contract.js +26 -135
  426. package/.agents/scripts/lib/qa/resolve-selection.js +16 -84
  427. package/.agents/scripts/lib/reserved-test-ids.js +9 -47
  428. package/.agents/scripts/lib/runtime-deps/dep-resolution.js +13 -53
  429. package/.agents/scripts/lib/runtime-deps/ensure-installed.js +10 -44
  430. package/.agents/scripts/lib/runtime-deps/manifest.js +10 -30
  431. package/.agents/scripts/lib/runtime-deps/parser-major.js +15 -51
  432. package/.agents/scripts/lib/runtime-deps/preflight.js +4 -22
  433. package/.agents/scripts/lib/runtime-deps/scan-imports.js +11 -55
  434. package/.agents/scripts/lib/signals/detectors/common.js +12 -38
  435. package/.agents/scripts/lib/signals/index.js +2 -19
  436. package/.agents/scripts/lib/signals/schema.js +14 -109
  437. package/.agents/scripts/lib/signals/write.js +2 -11
  438. package/.agents/scripts/lib/single-story/confirm-merge.js +31 -72
  439. package/.agents/scripts/lib/single-story/story-merged-notify.js +8 -49
  440. package/.agents/scripts/lib/single-story-sweep/protection-ctx.js +4 -26
  441. package/.agents/scripts/lib/single-story-sweep/protection.js +13 -100
  442. package/.agents/scripts/lib/single-story-sweep/sweep-lock.js +60 -258
  443. package/.agents/scripts/lib/single-story-sweep.js +14 -97
  444. package/.agents/scripts/lib/skills/parse-skill.js +13 -59
  445. package/.agents/scripts/lib/skills/skills-index.js +8 -29
  446. package/.agents/scripts/lib/skills/walk-skill-files.js +17 -78
  447. package/.agents/scripts/lib/source-extensions.js +11 -42
  448. package/.agents/scripts/lib/source-text/strip-js-comments.js +8 -41
  449. package/.agents/scripts/lib/stdio-flush.js +9 -36
  450. package/.agents/scripts/lib/story-adjacency.js +8 -40
  451. package/.agents/scripts/lib/story-body/body-format-lints.js +22 -83
  452. package/.agents/scripts/lib/story-body/footer-block.js +11 -44
  453. package/.agents/scripts/lib/story-body/story-body.js +83 -358
  454. package/.agents/scripts/lib/temp-retention.js +42 -143
  455. package/.agents/scripts/lib/templates/decomposer-prompts.js +11 -65
  456. package/.agents/scripts/lib/test-env.js +12 -65
  457. package/.agents/scripts/lib/test-run-credit.js +10 -65
  458. package/.agents/scripts/lib/test-runner-contract.js +19 -74
  459. package/.agents/scripts/lib/test-temp.js +38 -184
  460. package/.agents/scripts/lib/test-tiers.js +12 -96
  461. package/.agents/scripts/lib/ticket-body-sections.js +21 -96
  462. package/.agents/scripts/lib/transpile.js +15 -74
  463. package/.agents/scripts/lib/util/concurrent-map.js +6 -25
  464. package/.agents/scripts/lib/util/parse-id-list.js +8 -34
  465. package/.agents/scripts/lib/util/poll-loop.js +8 -28
  466. package/.agents/scripts/lib/util/with-timeout.js +2 -11
  467. package/.agents/scripts/lib/validation-evidence.js +21 -96
  468. package/.agents/scripts/lib/wave-runner/footprint.js +17 -70
  469. package/.agents/scripts/lib/wave-runner/live-probe.js +53 -221
  470. package/.agents/scripts/lib/wave-runner/ready-set.js +72 -301
  471. package/.agents/scripts/lib/workers/crap-worker.js +11 -64
  472. package/.agents/scripts/lib/workers/maintainability-report-worker.js +8 -45
  473. package/.agents/scripts/lib/workers/maintainability-worker.js +5 -21
  474. package/.agents/scripts/lib/workers/serve-worker-messages.js +2 -18
  475. package/.agents/scripts/lib/workflow-closure.js +22 -105
  476. package/.agents/scripts/lib/workspace-provisioner.js +16 -54
  477. package/.agents/scripts/lib/worktree/git-hooks.js +15 -60
  478. package/.agents/scripts/lib/worktree/lifecycle/force-drain.js +20 -60
  479. package/.agents/scripts/lib/worktree/lifecycle/merge-reachability.js +10 -62
  480. package/.agents/scripts/lib/worktree/lifecycle/pending-cleanup.js +22 -86
  481. package/.agents/scripts/lib/worktree/lifecycle/reap.js +24 -126
  482. package/.agents/scripts/lib/worktree/lifecycle-manager.js +2 -20
  483. package/.agents/scripts/lib/worktree/node-modules-strategy.js +46 -180
  484. package/.agents/scripts/lib/worktree-manager.js +15 -40
  485. package/.agents/scripts/lint-issue-body.js +12 -68
  486. package/.agents/scripts/mandrel-update-preflight.js +10 -70
  487. package/.agents/scripts/merge-baseline.js +30 -104
  488. package/.agents/scripts/nav-registry-diff.js +22 -108
  489. package/.agents/scripts/notify.js +12 -69
  490. package/.agents/scripts/plan-context.js +27 -111
  491. package/.agents/scripts/plan-critics.js +12 -66
  492. package/.agents/scripts/plan-persist.js +31 -148
  493. package/.agents/scripts/plan-run-epilogue.js +11 -37
  494. package/.agents/scripts/pr-watch-with-update.js +76 -267
  495. package/.agents/scripts/providers/github/auth.js +3 -8
  496. package/.agents/scripts/providers/github/blocked-by-add.js +14 -61
  497. package/.agents/scripts/providers/github/board-add.js +5 -21
  498. package/.agents/scripts/providers/github/branch-protection.js +11 -43
  499. package/.agents/scripts/providers/github/cache.js +2 -14
  500. package/.agents/scripts/providers/github/comments.js +7 -40
  501. package/.agents/scripts/providers/github/compose.js +3 -19
  502. package/.agents/scripts/providers/github/errors.js +22 -125
  503. package/.agents/scripts/providers/github/issues.js +31 -123
  504. package/.agents/scripts/providers/github/labels.js +24 -124
  505. package/.agents/scripts/providers/github/mappers.js +5 -27
  506. package/.agents/scripts/providers/github/merge-methods.js +3 -22
  507. package/.agents/scripts/providers/github/project-board.js +2 -17
  508. package/.agents/scripts/providers/github/projects-v2-graphql.js +3 -6
  509. package/.agents/scripts/providers/github/request-helpers.js +5 -32
  510. package/.agents/scripts/providers/github/search-budget.js +9 -39
  511. package/.agents/scripts/providers/github/search-query.js +5 -26
  512. package/.agents/scripts/providers/github/sub-issue-add.js +15 -65
  513. package/.agents/scripts/providers/github/sub-issues.js +7 -36
  514. package/.agents/scripts/providers/github/tickets.js +32 -134
  515. package/.agents/scripts/providers/github.js +18 -59
  516. package/.agents/scripts/prune-plan-run-labels.js +12 -46
  517. package/.agents/scripts/quality-preview.js +35 -220
  518. package/.agents/scripts/resolve-doc-tiers.js +3 -26
  519. package/.agents/scripts/resolve-stories.js +16 -67
  520. package/.agents/scripts/resync-status-column.js +6 -25
  521. package/.agents/scripts/run-tests.js +29 -104
  522. package/.agents/scripts/single-story-close.js +23 -135
  523. package/.agents/scripts/single-story-confirm-merge.js +32 -139
  524. package/.agents/scripts/single-story-init.js +47 -209
  525. package/.agents/scripts/stories-wave-tick.js +102 -472
  526. package/.agents/scripts/sync-agentrc.js +3 -21
  527. package/.agents/scripts/sync-claude-agents.js +9 -55
  528. package/.agents/scripts/sync-claude-commands.js +20 -110
  529. package/.agents/scripts/test-wrapper.js +6 -43
  530. package/.agents/scripts/update-coverage-baseline.js +5 -22
  531. package/.agents/scripts/update-crap-baseline.js +7 -30
  532. package/.agents/scripts/update-duplication-baseline.js +16 -92
  533. package/.agents/scripts/update-maintainability-baseline.js +8 -62
  534. package/.agents/scripts/update-ticket-state.js +1 -7
  535. package/.agents/scripts/validate-skills.js +6 -26
  536. package/.agents/templates/agent-protocol.md +2 -2
  537. package/.agents/templates/docs/audit-sweep-runbook.md +3 -4
  538. package/.agents/workflows/audit-accessibility.md +4 -7
  539. package/.agents/workflows/audit-adrs.md +3 -6
  540. package/.agents/workflows/audit-architecture.md +3 -11
  541. package/.agents/workflows/audit-baselines.md +6 -9
  542. package/.agents/workflows/audit-clean-code.md +8 -12
  543. package/.agents/workflows/audit-data-model.md +3 -7
  544. package/.agents/workflows/audit-dependencies.md +4 -7
  545. package/.agents/workflows/audit-devops.md +4 -8
  546. package/.agents/workflows/audit-documentation.md +1 -4
  547. package/.agents/workflows/audit-mobile.md +4 -7
  548. package/.agents/workflows/audit-navigability.md +3 -6
  549. package/.agents/workflows/audit-performance.md +2 -4
  550. package/.agents/workflows/audit-privacy.md +4 -7
  551. package/.agents/workflows/audit-quality.md +4 -7
  552. package/.agents/workflows/audit-security.md +4 -7
  553. package/.agents/workflows/audit-seo.md +4 -7
  554. package/.agents/workflows/audit-sre.md +4 -7
  555. package/.agents/workflows/audit-to-stories.md +17 -30
  556. package/.agents/workflows/audit-ux-ui.md +4 -7
  557. package/.agents/workflows/helpers/audit-lens-core.md +1 -1
  558. package/.agents/workflows/helpers/code-quality-guardrails.md +12 -15
  559. package/.agents/workflows/helpers/deliver-digest.md +6 -4
  560. package/.agents/workflows/helpers/deliver-reference.md +114 -188
  561. package/.agents/workflows/helpers/deliver-story-reference.md +189 -533
  562. package/.agents/workflows/helpers/plan-reference.md +86 -139
  563. package/.agents/workflows/helpers/qa-core.md +12 -0
  564. package/.agents/workflows/memory-consolidate.md +1 -1
  565. package/.agents/workflows/qa-assist.md +27 -71
  566. package/.agents/workflows/qa-explore.md +19 -59
  567. package/.agents/workflows/qa-run.md +11 -33
  568. package/README.md +1 -1
  569. package/bin/mandrel.js +5 -46
  570. package/bin/postinstall.js +18 -107
  571. package/docs/CHANGELOG.md +25 -0
  572. package/lib/cli/doctor.js +11 -71
  573. package/lib/cli/init.js +26 -165
  574. package/lib/cli/migrate.js +5 -64
  575. package/lib/cli/registry.js +84 -467
  576. package/lib/cli/sync-agents.js +4 -64
  577. package/lib/cli/sync-commands.js +11 -64
  578. package/lib/cli/sync.js +34 -213
  579. package/lib/cli/uninstall.js +40 -219
  580. package/lib/cli/update.js +105 -661
  581. package/lib/cli/version-check.js +8 -72
  582. package/lib/cli/version-helpers.js +14 -87
  583. package/lib/migrations/helpers/retire-agentrc-key.js +11 -52
  584. package/lib/migrations/index.js +15 -92
  585. package/lib/migrations/steps/2.1.0-retire-mi-drop-knobs.js +2 -15
  586. package/lib/migrations/steps/2.1.0-retire-verify-concurrency-cap.js +1 -13
  587. package/lib/migrations/steps/2.11.0-retire-max-seed-words.js +2 -15
  588. package/lib/migrations/steps/2.2.0-retire-epic-ac-tags.js +9 -38
  589. package/lib/migrations/steps/2.20.0-retire-codebase-snapshot.js +1 -13
  590. package/lib/migrations/steps/2.32.0-retire-lint-baseline-command.js +2 -27
  591. package/lib/migrations/steps/2.57.0-retire-delivery-limit-knobs.js +2 -23
  592. package/lib/migrations/steps/2.57.0-retire-planning-limit-knobs.js +2 -27
  593. package/lib/migrations/steps/2.60.0-retire-audit-results-autofile.js +2 -21
  594. package/lib/migrations/steps/strip-removed-agentrc-keys.js +333 -0
  595. package/package.json +16 -14
  596. package/.agents/docs/SDLC.md +0 -590
  597. package/.agents/docs/quality-gates.md +0 -1183
  598. package/.agents/rules/known-tooling-behavior.md +0 -200
  599. package/.agents/rules/orchestration-error-handling.md +0 -61
  600. package/.agents/rules/test-seams.md +0 -59
  601. package/.agents/schemas/baselines/lighthouse.schema.json +0 -59
  602. package/.agents/schemas/baselines/lint.schema.json +0 -47
  603. package/.agents/scripts/check-action-pinning.js +0 -260
  604. package/.agents/scripts/check-audit-attribution.js +0 -302
  605. package/.agents/scripts/check-baseline-drift.js +0 -211
  606. package/.agents/scripts/check-baseline-scope.js +0 -362
  607. package/.agents/scripts/check-generated-validator.js +0 -202
  608. package/.agents/scripts/check-knip-entries.js +0 -159
  609. package/.agents/scripts/check-lifecycle-lint.js +0 -294
  610. package/.agents/scripts/check-pinned-override-notes.js +0 -102
  611. package/.agents/scripts/check-schema-references.js +0 -368
  612. package/.agents/scripts/check-test-portability.js +0 -512
  613. package/.agents/scripts/check-workflow-citations.js +0 -218
  614. package/.agents/scripts/check-workflow-cli-lint.js +0 -299
  615. package/.agents/scripts/check-workflow-timeouts.js +0 -291
  616. package/.agents/scripts/install-matrix-assert.js +0 -326
  617. package/.agents/scripts/lib/audit-advisories.js +0 -195
  618. package/.agents/scripts/lib/audit-attribution.js +0 -134
  619. package/.agents/scripts/lib/baselines/drift-detector.js +0 -351
  620. package/.agents/scripts/lib/baselines/kinds/lighthouse.js +0 -87
  621. package/.agents/scripts/lib/baselines/kinds/lint.js +0 -184
  622. package/.agents/scripts/lib/baselines/orphan-pruner.js +0 -233
  623. package/.agents/scripts/lib/baselines/scope-assert.js +0 -223
  624. package/.agents/scripts/lib/baselines/scope-inventory.js +0 -314
  625. package/.agents/scripts/lib/c8-cli-path.js +0 -21
  626. package/.agents/scripts/lib/config/gates/lighthouse.schema.js +0 -51
  627. package/.agents/scripts/lib/config/gates/lint.schema.js +0 -18
  628. package/.agents/scripts/lib/dynamic-workflow/architecture-report-contract.js +0 -70
  629. package/.agents/scripts/lib/dynamic-workflow/audit-orchestrator.js +0 -284
  630. package/.agents/scripts/lib/dynamic-workflow/clean-code-report-contract.js +0 -80
  631. package/.agents/scripts/lib/dynamic-workflow/degraded-coverage.js +0 -81
  632. package/.agents/scripts/lib/dynamic-workflow/documentation-report-contract.js +0 -87
  633. package/.agents/scripts/lib/dynamic-workflow/performance-report-contract.js +0 -74
  634. package/.agents/scripts/lib/dynamic-workflow/quality-report-contract.js +0 -90
  635. package/.agents/scripts/lib/dynamic-workflow/report-contract-core.js +0 -43
  636. package/.agents/scripts/lib/dynamic-workflow/security-report-contract.js +0 -83
  637. package/.agents/scripts/lib/fs-walk.js +0 -52
  638. package/.agents/scripts/lib/knip-config-resolver.js +0 -181
  639. package/.agents/scripts/lib/knip-entry-sync.js +0 -452
  640. package/.agents/scripts/lib/pinned-override-notes.js +0 -88
  641. package/.agents/scripts/lib/pinned-override-resolve.js +0 -212
  642. package/.agents/scripts/lib/test-isolate/cli-options.js +0 -93
  643. package/.agents/scripts/lib/test-isolate/env-snapshot-loader.js +0 -52
  644. package/.agents/scripts/lib/test-isolate/list-files.js +0 -90
  645. package/.agents/scripts/lib/test-isolate/parse-tap.js +0 -75
  646. package/.agents/scripts/lib/test-isolate/progress-log.js +0 -45
  647. package/.agents/scripts/lib/test-isolate/render-report.js +0 -97
  648. package/.agents/scripts/lib/test-isolate/run-isolate.js +0 -87
  649. package/.agents/scripts/lib/test-isolate/runner.js +0 -483
  650. package/.agents/scripts/lib/test-profile/parse-tap.js +0 -136
  651. package/.agents/scripts/lib/test-profile/render-report.js +0 -45
  652. package/.agents/scripts/lint-label-vocabulary.js +0 -214
  653. package/.agents/scripts/post-structured-comment.js +0 -127
  654. package/.agents/scripts/provision-git-hooks.js +0 -85
  655. package/.agents/scripts/prune-baseline-orphans.js +0 -181
  656. package/.agents/scripts/run-coverage.js +0 -197
  657. package/.agents/scripts/run-lint.js +0 -133
  658. package/.agents/scripts/run-test-profile.js +0 -129
  659. package/.agents/scripts/run-verify.js +0 -125
  660. package/.agents/scripts/test-isolate.js +0 -55
  661. package/.agents/scripts/update-dead-exports-baseline.js +0 -321
@@ -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]