mandrel 2.59.0 → 2.61.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (678) hide show
  1. package/.agents/README.md +21 -19
  2. package/.agents/agents/acceptance-critic.md +24 -43
  3. package/.agents/agents/story-worker.md +20 -21
  4. package/.agents/docs/agentrc-reference.json +5 -84
  5. package/.agents/docs/configuration.md +48 -132
  6. package/.agents/docs/workflows.md +2 -2
  7. package/.agents/instructions.md +5 -8
  8. package/.agents/rules/ci-remediation.md +41 -8
  9. package/.agents/rules/gherkin-standards.md +4 -0
  10. package/.agents/schemas/acceptance-eval-verdict.schema.json +1 -1
  11. package/.agents/schemas/agentrc.schema.json +16 -496
  12. package/.agents/schemas/story-deliver-terminal.schema.json +13 -3
  13. package/.agents/schemas/validation-evidence.schema.json +2 -1
  14. package/.agents/scripts/README.md +23 -13
  15. package/.agents/scripts/acceptance-eval.js +35 -169
  16. package/.agents/scripts/agents-bootstrap-github.js +27 -129
  17. package/.agents/scripts/apply-quality-bootstrap.js +4 -40
  18. package/.agents/scripts/audit-baselines.js +6 -27
  19. package/.agents/scripts/audit-labels-bootstrap.js +5 -29
  20. package/.agents/scripts/audit-to-stories.js +91 -361
  21. package/.agents/scripts/boot-sweep.js +19 -72
  22. package/.agents/scripts/bootstrap.js +74 -395
  23. package/.agents/scripts/ceremony-derive.js +10 -41
  24. package/.agents/scripts/check-arch-cycles.js +14 -64
  25. package/.agents/scripts/check-baselines.js +8 -48
  26. package/.agents/scripts/check-context-budget.js +105 -311
  27. package/.agents/scripts/check-cyclomatic.js +12 -44
  28. package/.agents/scripts/check-dead-exports.js +13 -64
  29. package/.agents/scripts/check-doc-links.js +38 -186
  30. package/.agents/scripts/check-gherkin-corpus.js +24 -127
  31. package/.agents/scripts/check-test-temp-hygiene.js +28 -169
  32. package/.agents/scripts/coverage-capture.js +34 -98
  33. package/.agents/scripts/deliver-light.js +25 -171
  34. package/.agents/scripts/deliver-recover.js +6 -42
  35. package/.agents/scripts/deliver-run.js +534 -0
  36. package/.agents/scripts/diagnose-friction.js +24 -116
  37. package/.agents/scripts/drain-pending-cleanup.js +1 -1
  38. package/.agents/scripts/evidence-gate.js +23 -85
  39. package/.agents/scripts/file-ci-gap.js +57 -49
  40. package/.agents/scripts/generate-config-docs.js +30 -170
  41. package/.agents/scripts/generate-lens-checklists.js +8 -52
  42. package/.agents/scripts/generate-skills-index.js +14 -112
  43. package/.agents/scripts/generate-workflows-doc.js +10 -70
  44. package/.agents/scripts/git-cleanup.js +2 -34
  45. package/.agents/scripts/lib/Graph.js +24 -81
  46. package/.agents/scripts/lib/ITicketingProvider.js +47 -143
  47. package/.agents/scripts/lib/Logger.js +14 -76
  48. package/.agents/scripts/lib/audit-baselines/engine.js +11 -31
  49. package/.agents/scripts/lib/audit-baselines/gate-surface.js +3 -17
  50. package/.agents/scripts/lib/audit-baselines/headroom.js +4 -20
  51. package/.agents/scripts/lib/audit-baselines/hotspots.js +3 -15
  52. package/.agents/scripts/lib/audit-baselines/kinds.js +23 -89
  53. package/.agents/scripts/lib/audit-baselines/outliers.js +6 -23
  54. package/.agents/scripts/lib/audit-baselines/read.js +3 -16
  55. package/.agents/scripts/lib/audit-baselines/staleness.js +7 -26
  56. package/.agents/scripts/lib/audit-baselines/surface-entry.js +7 -28
  57. package/.agents/scripts/lib/audit-baselines/trend.js +7 -20
  58. package/.agents/scripts/lib/audit-baselines/weights.js +9 -37
  59. package/.agents/scripts/lib/audit-suite/audit-rules-reader.js +3 -18
  60. package/.agents/scripts/lib/audit-suite/checklist-threading.js +26 -124
  61. package/.agents/scripts/lib/audit-suite/dispatch-checklist.js +14 -45
  62. package/.agents/scripts/lib/audit-suite/findings.js +12 -52
  63. package/.agents/scripts/lib/audit-suite/frontmatter.js +5 -29
  64. package/.agents/scripts/lib/audit-suite/index.js +1 -15
  65. package/.agents/scripts/lib/audit-suite/lens-checklist.js +10 -45
  66. package/.agents/scripts/lib/audit-suite/lens-diff-floor.js +11 -76
  67. package/.agents/scripts/lib/audit-suite/runner.js +13 -43
  68. package/.agents/scripts/lib/audit-suite/selector.js +49 -349
  69. package/.agents/scripts/lib/audit-suite/substitutions.js +12 -40
  70. package/.agents/scripts/lib/audit-suite/workflow-loader.js +3 -15
  71. package/.agents/scripts/lib/audit-to-stories/audit-label-taxonomy.js +11 -73
  72. package/.agents/scripts/lib/audit-to-stories/audit-lenses.js +8 -37
  73. package/.agents/scripts/lib/audit-to-stories/build-story-body.js +25 -143
  74. package/.agents/scripts/lib/audit-to-stories/dedupe-against-github.js +14 -80
  75. package/.agents/scripts/lib/audit-to-stories/epic-grouping-directive.js +4 -18
  76. package/.agents/scripts/lib/audit-to-stories/finding-adapter.js +7 -40
  77. package/.agents/scripts/lib/audit-to-stories/group-findings.js +9 -39
  78. package/.agents/scripts/lib/audit-to-stories/issue-corpus.js +10 -66
  79. package/.agents/scripts/lib/audit-to-stories/issue-index.js +6 -30
  80. package/.agents/scripts/lib/audit-to-stories/issues-file.js +6 -36
  81. package/.agents/scripts/lib/audit-to-stories/ledger-commit.js +17 -69
  82. package/.agents/scripts/lib/audit-to-stories/ledger-pr.js +17 -85
  83. package/.agents/scripts/lib/audit-to-stories/ledger-record.js +10 -48
  84. package/.agents/scripts/lib/audit-to-stories/parse-audit-md.js +38 -146
  85. package/.agents/scripts/lib/audit-to-stories/seed-from-findings.js +7 -42
  86. package/.agents/scripts/lib/audit-to-stories/wire-dependencies.js +10 -57
  87. package/.agents/scripts/lib/baseline-loader.js +12 -51
  88. package/.agents/scripts/lib/baseline-schema-registry.js +5 -22
  89. package/.agents/scripts/lib/baselines/component-matcher.js +3 -12
  90. package/.agents/scripts/lib/baselines/components.js +10 -61
  91. package/.agents/scripts/lib/baselines/coverage-updater-cli.js +7 -36
  92. package/.agents/scripts/lib/baselines/crap-preview-incremental.js +7 -19
  93. package/.agents/scripts/lib/baselines/crap-preview-scan.js +19 -45
  94. package/.agents/scripts/lib/baselines/crap-updater-cli.js +16 -65
  95. package/.agents/scripts/lib/baselines/diff-scope-cli.js +5 -33
  96. package/.agents/scripts/lib/baselines/duplication-scanner.js +11 -60
  97. package/.agents/scripts/lib/baselines/env-overrides.js +12 -67
  98. package/.agents/scripts/lib/baselines/envelope.js +13 -129
  99. package/.agents/scripts/lib/baselines/exit-codes.js +6 -49
  100. package/.agents/scripts/lib/baselines/git-base.js +23 -142
  101. package/.agents/scripts/lib/baselines/kernel.js +11 -111
  102. package/.agents/scripts/lib/baselines/kinds/_crap-new-method-gate.js +9 -47
  103. package/.agents/scripts/lib/baselines/kinds/_crap-read.js +8 -51
  104. package/.agents/scripts/lib/baselines/kinds/_shared-metric.js +7 -62
  105. package/.agents/scripts/lib/baselines/kinds/bundle-size.js +8 -29
  106. package/.agents/scripts/lib/baselines/kinds/coverage.js +3 -15
  107. package/.agents/scripts/lib/baselines/kinds/crap.js +94 -415
  108. package/.agents/scripts/lib/baselines/kinds/duplication.js +4 -30
  109. package/.agents/scripts/lib/baselines/kinds/kind-factory.js +7 -53
  110. package/.agents/scripts/lib/baselines/kinds/maintainability.js +15 -80
  111. package/.agents/scripts/lib/baselines/kinds/mutation.js +12 -72
  112. package/.agents/scripts/lib/baselines/maintainability-baseline-io.js +4 -11
  113. package/.agents/scripts/lib/baselines/merge-envelopes.js +30 -146
  114. package/.agents/scripts/lib/baselines/path-canon.js +19 -128
  115. package/.agents/scripts/lib/baselines/preview-gates.js +8 -37
  116. package/.agents/scripts/lib/baselines/reader.js +14 -107
  117. package/.agents/scripts/lib/baselines/refresh-service.js +35 -252
  118. package/.agents/scripts/lib/baselines/scope.js +11 -135
  119. package/.agents/scripts/lib/baselines/writer.js +16 -149
  120. package/.agents/scripts/lib/bdd-runner-detect.js +18 -113
  121. package/.agents/scripts/lib/bdd-scenario-budget.js +9 -36
  122. package/.agents/scripts/lib/bdd-scenario-scanner.js +11 -73
  123. package/.agents/scripts/lib/bdd-step-index.js +26 -100
  124. package/.agents/scripts/lib/bootstrap/baseline-merge-driver.js +23 -103
  125. package/.agents/scripts/lib/bootstrap/branch-protection.js +2 -5
  126. package/.agents/scripts/lib/bootstrap/commit-push.js +12 -50
  127. package/.agents/scripts/lib/bootstrap/gh-preflight.js +14 -101
  128. package/.agents/scripts/lib/bootstrap/hitl-confirm.js +5 -30
  129. package/.agents/scripts/lib/bootstrap/install-ledger.js +17 -73
  130. package/.agents/scripts/lib/bootstrap/issue-forms-template.js +17 -121
  131. package/.agents/scripts/lib/bootstrap/manifest.js +15 -86
  132. package/.agents/scripts/lib/bootstrap/merge-methods.js +4 -33
  133. package/.agents/scripts/lib/bootstrap/preflight.js +12 -61
  134. package/.agents/scripts/lib/bootstrap/project-bootstrap.js +34 -235
  135. package/.agents/scripts/lib/bootstrap/prompt.js +21 -129
  136. package/.agents/scripts/lib/bootstrap/quality-bootstrap.js +27 -141
  137. package/.agents/scripts/lib/bootstrap/summary.js +1 -8
  138. package/.agents/scripts/lib/bootstrap/workflow-audit.js +11 -84
  139. package/.agents/scripts/lib/branch-name-guard.js +4 -23
  140. package/.agents/scripts/lib/changed-files.js +39 -121
  141. package/.agents/scripts/lib/checks/core-bare-clean.js +4 -24
  142. package/.agents/scripts/lib/checks/index.js +18 -101
  143. package/.agents/scripts/lib/checks/loop-health.js +11 -53
  144. package/.agents/scripts/lib/checks/state.js +16 -91
  145. package/.agents/scripts/lib/checks/story-init-not-backgrounded.js +10 -61
  146. package/.agents/scripts/lib/checks/subagent-agent-tool-required.js +14 -83
  147. package/.agents/scripts/lib/child-exec.js +39 -108
  148. package/.agents/scripts/lib/cli/standard-args.js +9 -116
  149. package/.agents/scripts/lib/cli-args.js +31 -146
  150. package/.agents/scripts/lib/cli-usage.js +5 -27
  151. package/.agents/scripts/lib/cli-utils.js +2 -12
  152. package/.agents/scripts/lib/close-validation/commands.js +13 -76
  153. package/.agents/scripts/lib/close-validation/gates.js +92 -331
  154. package/.agents/scripts/lib/close-validation/process.js +121 -151
  155. package/.agents/scripts/lib/close-validation/projections/advisories.js +5 -31
  156. package/.agents/scripts/lib/close-validation/projections/crap.js +19 -67
  157. package/.agents/scripts/lib/close-validation/projections/head-sha.js +1 -17
  158. package/.agents/scripts/lib/close-validation/projections/inputs.js +4 -34
  159. package/.agents/scripts/lib/close-validation/projections/maintainability.js +11 -58
  160. package/.agents/scripts/lib/close-validation/runner.js +53 -110
  161. package/.agents/scripts/lib/command-header.js +6 -28
  162. package/.agents/scripts/lib/config/acceptance-eval.js +4 -30
  163. package/.agents/scripts/lib/config/baselines.js +3 -14
  164. package/.agents/scripts/lib/config/ci.js +8 -38
  165. package/.agents/scripts/lib/config/commands.js +1 -15
  166. package/.agents/scripts/lib/config/defaults.js +4 -33
  167. package/.agents/scripts/lib/config/delivery-routing.js +6 -34
  168. package/.agents/scripts/lib/config/explain.js +10 -83
  169. package/.agents/scripts/lib/config/gates/coverage.schema.js +0 -12
  170. package/.agents/scripts/lib/config/gates/crap-incremental-coverage.schema.js +3 -31
  171. package/.agents/scripts/lib/config/gates/crap.schema.js +1 -34
  172. package/.agents/scripts/lib/config/gates/duplication.schema.js +1 -8
  173. package/.agents/scripts/lib/config/gates/index.js +2 -17
  174. package/.agents/scripts/lib/config/gates/maintainability.schema.js +1 -20
  175. package/.agents/scripts/lib/config/gates/mutation.schema.js +1 -7
  176. package/.agents/scripts/lib/config/gates/shared.js +4 -64
  177. package/.agents/scripts/lib/config/github.js +4 -22
  178. package/.agents/scripts/lib/config/limits.js +4 -57
  179. package/.agents/scripts/lib/config/paths.js +2 -21
  180. package/.agents/scripts/lib/config/qa.js +4 -38
  181. package/.agents/scripts/lib/config/quality.js +76 -432
  182. package/.agents/scripts/lib/config/runners.js +12 -56
  183. package/.agents/scripts/lib/config/runtime.js +13 -57
  184. package/.agents/scripts/lib/config/shared.js +2 -16
  185. package/.agents/scripts/lib/config/sync-agentrc.js +9 -50
  186. package/.agents/scripts/lib/config/temp-paths.js +40 -280
  187. package/.agents/scripts/lib/config/validate-orchestration.js +5 -17
  188. package/.agents/scripts/lib/config/worktree-isolation.js +9 -28
  189. package/.agents/scripts/lib/config-resolver.js +11 -52
  190. package/.agents/scripts/lib/config-schema-shared.js +1 -4
  191. package/.agents/scripts/lib/config-settings-schema-delivery.js +16 -291
  192. package/.agents/scripts/lib/config-settings-schema-quality.js +7 -219
  193. package/.agents/scripts/lib/config-settings-schema.js +37 -274
  194. package/.agents/scripts/lib/coverage-baseline.js +20 -110
  195. package/.agents/scripts/lib/coverage-capture-fullscope.js +18 -35
  196. package/.agents/scripts/lib/coverage-capture-incremental.js +15 -45
  197. package/.agents/scripts/lib/coverage-capture-usage.js +8 -25
  198. package/.agents/scripts/lib/coverage-capture.js +99 -224
  199. package/.agents/scripts/lib/coverage-utils.js +14 -79
  200. package/.agents/scripts/lib/cpu-pool.js +17 -123
  201. package/.agents/scripts/lib/crap-baseline-join.js +16 -88
  202. package/.agents/scripts/lib/crap-coordinates.js +6 -25
  203. package/.agents/scripts/lib/crap-engine.js +40 -153
  204. package/.agents/scripts/lib/crap-method-identity.js +16 -78
  205. package/.agents/scripts/lib/crap-utils.js +31 -155
  206. package/.agents/scripts/lib/cyclomatic-ceiling.js +14 -87
  207. package/.agents/scripts/lib/cyclomatic-scope.js +10 -50
  208. package/.agents/scripts/lib/dead-exports-knip.js +18 -56
  209. package/.agents/scripts/lib/dead-exports-mode.js +5 -24
  210. package/.agents/scripts/lib/degraded-mode.js +3 -26
  211. package/.agents/scripts/lib/dependency-parser.js +8 -40
  212. package/.agents/scripts/lib/dependency-version.js +13 -35
  213. package/.agents/scripts/lib/detect-package-manager.js +6 -36
  214. package/.agents/scripts/lib/doc-tiers.js +22 -124
  215. package/.agents/scripts/lib/duplicate-search.js +8 -72
  216. package/.agents/scripts/lib/env-loader.js +5 -27
  217. package/.agents/scripts/lib/error-redactor.js +6 -31
  218. package/.agents/scripts/lib/errors/index.js +2 -22
  219. package/.agents/scripts/lib/escomplex-ast-compat.js +22 -163
  220. package/.agents/scripts/lib/escomplex-kernel.js +21 -123
  221. package/.agents/scripts/lib/feedback-loop/graduator-core.js +94 -419
  222. package/.agents/scripts/lib/feedback-loop/prior-feedback-fetcher.js +20 -98
  223. package/.agents/scripts/lib/feedback-loop/retro-proposals-graduator.js +27 -149
  224. package/.agents/scripts/lib/findings/audit-ledger.js +23 -97
  225. package/.agents/scripts/lib/findings/classify-finding.js +14 -69
  226. package/.agents/scripts/lib/findings/promote-finding.js +14 -112
  227. package/.agents/scripts/lib/findings/provenance-field.js +11 -52
  228. package/.agents/scripts/lib/findings/route-finding.js +37 -255
  229. package/.agents/scripts/lib/findings/semantic-issue-search.js +14 -59
  230. package/.agents/scripts/lib/findings/severity.js +18 -104
  231. package/.agents/scripts/lib/format-generated-json.js +12 -44
  232. package/.agents/scripts/lib/full-suite-lock.js +160 -429
  233. package/.agents/scripts/lib/full-suite-queue.js +213 -0
  234. package/.agents/scripts/lib/gates/baseline-store.js +5 -9
  235. package/.agents/scripts/lib/gates/friction.js +1 -3
  236. package/.agents/scripts/lib/generated/agentrc-validator.js +2 -2
  237. package/.agents/scripts/lib/gh-exec.js +123 -191
  238. package/.agents/scripts/lib/git/cached-fetch.js +9 -52
  239. package/.agents/scripts/lib/git/sync-from-base.js +15 -107
  240. package/.agents/scripts/lib/git-branch-cleanup.js +14 -61
  241. package/.agents/scripts/lib/git-branch-lifecycle.js +16 -87
  242. package/.agents/scripts/lib/git-utils.js +37 -161
  243. package/.agents/scripts/lib/github/framework-repo.js +8 -71
  244. package/.agents/scripts/lib/github-url.js +2 -17
  245. package/.agents/scripts/lib/import-graph.js +11 -38
  246. package/.agents/scripts/lib/install-cmd-parser.js +4 -13
  247. package/.agents/scripts/lib/json-utils.js +3 -18
  248. package/.agents/scripts/lib/label-constants.js +16 -111
  249. package/.agents/scripts/lib/label-taxonomy.js +4 -30
  250. package/.agents/scripts/lib/maintainability-engine.js +12 -80
  251. package/.agents/scripts/lib/maintainability-unscorable.js +5 -25
  252. package/.agents/scripts/lib/maintainability-utils.js +16 -92
  253. package/.agents/scripts/lib/mandrel-catalog.js +12 -70
  254. package/.agents/scripts/lib/notifications/notifier.js +13 -38
  255. package/.agents/scripts/lib/npm-scripts.js +4 -23
  256. package/.agents/scripts/lib/observability/metrics-ledger.js +16 -76
  257. package/.agents/scripts/lib/observability/runtime-friction.js +44 -286
  258. package/.agents/scripts/lib/observability/signal-validator.js +5 -37
  259. package/.agents/scripts/lib/observability/signals-writer.js +11 -121
  260. package/.agents/scripts/lib/observability/source-classifier.js +22 -203
  261. package/.agents/scripts/lib/observability/terse-result.js +14 -47
  262. package/.agents/scripts/lib/onboard/init-tail.js +13 -74
  263. package/.agents/scripts/lib/onboard/scaffold-docs.js +11 -34
  264. package/.agents/scripts/lib/orchestration/acceptance-eval-decision.js +25 -139
  265. package/.agents/scripts/lib/orchestration/auto-merge-cwd.js +11 -66
  266. package/.agents/scripts/lib/orchestration/behind-recovery.js +10 -55
  267. package/.agents/scripts/lib/orchestration/ceremony-routing.js +28 -156
  268. package/.agents/scripts/lib/orchestration/change-set.js +7 -36
  269. package/.agents/scripts/lib/orchestration/check-baselines/phases/compare.js +9 -46
  270. package/.agents/scripts/lib/orchestration/check-baselines/phases/evaluate.js +11 -44
  271. package/.agents/scripts/lib/orchestration/check-baselines/phases/floors.js +5 -24
  272. package/.agents/scripts/lib/orchestration/check-baselines/phases/friction.js +3 -12
  273. package/.agents/scripts/lib/orchestration/check-baselines/phases/parse-args.js +5 -38
  274. package/.agents/scripts/lib/orchestration/check-baselines/phases/pipeline.js +3 -8
  275. package/.agents/scripts/lib/orchestration/check-baselines/phases/refresh-ack.js +28 -136
  276. package/.agents/scripts/lib/orchestration/check-baselines/phases/report.js +3 -13
  277. package/.agents/scripts/lib/orchestration/check-state.js +92 -0
  278. package/.agents/scripts/lib/orchestration/ci-gap-intake.js +37 -144
  279. package/.agents/scripts/lib/orchestration/ci-rerun-guard.js +121 -157
  280. package/.agents/scripts/lib/orchestration/code-review.js +24 -128
  281. package/.agents/scripts/lib/orchestration/column-sync.js +23 -111
  282. package/.agents/scripts/lib/orchestration/complexity-gate.js +118 -462
  283. package/.agents/scripts/lib/orchestration/deliver-recover.js +36 -168
  284. package/.agents/scripts/lib/orchestration/dependency-analyzer.js +4 -35
  285. package/.agents/scripts/lib/orchestration/dependency-candidates.js +9 -41
  286. package/.agents/scripts/lib/orchestration/diff-magnitude.js +25 -115
  287. package/.agents/scripts/lib/orchestration/doc-reader.js +2 -6
  288. package/.agents/scripts/lib/orchestration/docs-digest.js +13 -51
  289. package/.agents/scripts/lib/orchestration/epic-candidates.js +13 -53
  290. package/.agents/scripts/lib/orchestration/epic-checklist.js +9 -33
  291. package/.agents/scripts/lib/orchestration/epic-container.js +41 -167
  292. package/.agents/scripts/lib/orchestration/epic-expansion.js +10 -40
  293. package/.agents/scripts/lib/orchestration/epic-rollup.js +55 -207
  294. package/.agents/scripts/lib/orchestration/file-assumption-enum.js +2 -22
  295. package/.agents/scripts/lib/orchestration/file-assumptions.js +45 -253
  296. package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-detect.js +9 -46
  297. package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-reap.js +7 -57
  298. package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches.js +21 -126
  299. package/.agents/scripts/lib/orchestration/git-cleanup/phases/cli.js +2 -6
  300. package/.agents/scripts/lib/orchestration/git-cleanup/phases/fast-forward.js +1 -4
  301. package/.agents/scripts/lib/orchestration/git-cleanup/phases/filters.js +1 -5
  302. package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes-ff.js +9 -34
  303. package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes.js +41 -190
  304. package/.agents/scripts/lib/orchestration/git-cleanup/phases/merged-tip.js +9 -45
  305. package/.agents/scripts/lib/orchestration/git-cleanup/phases/parse-args.js +1 -4
  306. package/.agents/scripts/lib/orchestration/git-cleanup/phases/phase-drivers.js +19 -85
  307. package/.agents/scripts/lib/orchestration/git-cleanup/phases/prompts.js +3 -17
  308. package/.agents/scripts/lib/orchestration/git-cleanup/phases/prune.js +1 -5
  309. package/.agents/scripts/lib/orchestration/git-cleanup/phases/render.js +16 -100
  310. package/.agents/scripts/lib/orchestration/git-cleanup/phases/stashes.js +1 -4
  311. package/.agents/scripts/lib/orchestration/lease-guard-shared.js +16 -67
  312. package/.agents/scripts/lib/orchestration/lifecycle/emit-ledger-event.js +9 -33
  313. package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-flip-failed.js +8 -29
  314. package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-unlanded.js +15 -68
  315. package/.agents/scripts/lib/orchestration/light-backstop.js +11 -49
  316. package/.agents/scripts/lib/orchestration/light-escalation.js +21 -89
  317. package/.agents/scripts/lib/orchestration/light-suitability.js +37 -307
  318. package/.agents/scripts/lib/orchestration/merge-block-class.js +39 -216
  319. package/.agents/scripts/lib/orchestration/merge-poll.js +104 -377
  320. package/.agents/scripts/lib/orchestration/pinned-identifier-lint.js +17 -57
  321. package/.agents/scripts/lib/orchestration/plan-context.js +55 -318
  322. package/.agents/scripts/lib/orchestration/plan-critic-conditions.js +22 -79
  323. package/.agents/scripts/lib/orchestration/plan-critics-evaluate.js +5 -31
  324. package/.agents/scripts/lib/orchestration/plan-metrics.js +29 -108
  325. package/.agents/scripts/lib/orchestration/plan-navigation.js +8 -27
  326. package/.agents/scripts/lib/orchestration/plan-persist/acceptance-handle-repair.js +12 -49
  327. package/.agents/scripts/lib/orchestration/plan-persist/audit-provenance.js +18 -73
  328. package/.agents/scripts/lib/orchestration/plan-persist/changes-repair.js +16 -78
  329. package/.agents/scripts/lib/orchestration/plan-persist/cross-plan-links.js +6 -30
  330. package/.agents/scripts/lib/orchestration/plan-persist/epic-adoption.js +14 -65
  331. package/.agents/scripts/lib/orchestration/plan-persist/epic-ops.js +21 -76
  332. package/.agents/scripts/lib/orchestration/plan-persist/external-deps.js +6 -43
  333. package/.agents/scripts/lib/orchestration/plan-persist/persist-helpers.js +14 -68
  334. package/.agents/scripts/lib/orchestration/plan-persist/plan-context-source.js +9 -41
  335. package/.agents/scripts/lib/orchestration/plan-persist/run-plan-persist.js +71 -289
  336. package/.agents/scripts/lib/orchestration/plan-persist/soft-findings.js +2 -12
  337. package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +96 -362
  338. package/.agents/scripts/lib/orchestration/plan-persist/summary.js +9 -39
  339. package/.agents/scripts/lib/orchestration/plan-persist/supersede-ops.js +60 -186
  340. package/.agents/scripts/lib/orchestration/plan-persist/wave-collision-gate.js +9 -49
  341. package/.agents/scripts/lib/orchestration/plan-persist/wave-serialisation.js +7 -28
  342. package/.agents/scripts/lib/orchestration/plan-reachability.js +13 -42
  343. package/.agents/scripts/lib/orchestration/plan-run-labels/reap.js +16 -91
  344. package/.agents/scripts/lib/orchestration/plan-runner/worktree-sweep.js +16 -54
  345. package/.agents/scripts/lib/orchestration/plan-text-hygiene.js +10 -52
  346. package/.agents/scripts/lib/orchestration/planning/authoring-context.js +14 -109
  347. package/.agents/scripts/lib/orchestration/planning/memory-pool-advisory.js +11 -83
  348. package/.agents/scripts/lib/orchestration/pr-watch.js +48 -306
  349. package/.agents/scripts/lib/orchestration/project-meta-cache.js +15 -80
  350. package/.agents/scripts/lib/orchestration/project-meta-resolver.js +10 -51
  351. package/.agents/scripts/lib/orchestration/reassert-status-column.js +12 -76
  352. package/.agents/scripts/lib/orchestration/remote-verifier.js +12 -36
  353. package/.agents/scripts/lib/orchestration/resolve-stories.js +33 -164
  354. package/.agents/scripts/lib/orchestration/retro-proposals.js +66 -361
  355. package/.agents/scripts/lib/orchestration/review-base-ref.js +9 -43
  356. package/.agents/scripts/lib/orchestration/review-depth.js +12 -91
  357. package/.agents/scripts/lib/orchestration/review-providers/codex.js +10 -111
  358. package/.agents/scripts/lib/orchestration/review-providers/degraded-gates.js +13 -71
  359. package/.agents/scripts/lib/orchestration/review-providers/findings-renderer.js +7 -51
  360. package/.agents/scripts/lib/orchestration/review-providers/mi-exemptions.js +8 -53
  361. package/.agents/scripts/lib/orchestration/review-providers/native.js +30 -214
  362. package/.agents/scripts/lib/orchestration/review-providers/parse-findings.js +7 -52
  363. package/.agents/scripts/lib/orchestration/review-providers/review-depth.js +4 -33
  364. package/.agents/scripts/lib/orchestration/review-providers/review-provider-factory.js +11 -71
  365. package/.agents/scripts/lib/orchestration/review-providers/scoped-lint.js +19 -131
  366. package/.agents/scripts/lib/orchestration/review-providers/security-review.js +6 -89
  367. package/.agents/scripts/lib/orchestration/review-providers/types.js +26 -56
  368. package/.agents/scripts/lib/orchestration/review-providers/ultrareview.js +3 -46
  369. package/.agents/scripts/lib/orchestration/run-epilogue.js +245 -326
  370. package/.agents/scripts/lib/orchestration/run-scoped-config.js +55 -159
  371. package/.agents/scripts/lib/orchestration/single-story-close/close-note.js +7 -34
  372. package/.agents/scripts/lib/orchestration/single-story-close/failed-terminal.js +16 -89
  373. package/.agents/scripts/lib/orchestration/single-story-close/gate-log.js +18 -109
  374. package/.agents/scripts/lib/orchestration/single-story-close/phases/auto-merge.js +83 -239
  375. package/.agents/scripts/lib/orchestration/single-story-close/phases/base-sync.js +20 -82
  376. package/.agents/scripts/lib/orchestration/single-story-close/phases/close-validation.js +103 -97
  377. package/.agents/scripts/lib/orchestration/single-story-close/phases/code-review.js +8 -64
  378. package/.agents/scripts/lib/orchestration/single-story-close/phases/confirm-merge.js +136 -486
  379. package/.agents/scripts/lib/orchestration/single-story-close/phases/conventional-subject.js +30 -134
  380. package/.agents/scripts/lib/orchestration/single-story-close/phases/graphql-preflight.js +96 -0
  381. package/.agents/scripts/lib/orchestration/single-story-close/phases/lock-wait-pending.js +49 -0
  382. package/.agents/scripts/lib/orchestration/single-story-close/phases/normalize-pr-title.js +13 -86
  383. package/.agents/scripts/lib/orchestration/single-story-close/phases/options.js +20 -95
  384. package/.agents/scripts/lib/orchestration/single-story-close/phases/post-land.js +46 -203
  385. package/.agents/scripts/lib/orchestration/single-story-close/phases/pre-gate-steps.js +8 -50
  386. package/.agents/scripts/lib/orchestration/single-story-close/phases/pull-request.js +12 -83
  387. package/.agents/scripts/lib/orchestration/single-story-close/phases/push.js +6 -39
  388. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-block.js +1 -6
  389. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-outcome.js +4 -28
  390. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-override.js +6 -51
  391. package/.agents/scripts/lib/orchestration/single-story-close/phases/worktree-reap.js +6 -34
  392. package/.agents/scripts/lib/orchestration/single-story-close/phases/wrong-tree-guard.js +23 -121
  393. package/.agents/scripts/lib/orchestration/single-story-close/runner.js +180 -273
  394. package/.agents/scripts/lib/orchestration/single-story-lease-guard.js +15 -69
  395. package/.agents/scripts/lib/orchestration/story-body-gate.js +4 -23
  396. package/.agents/scripts/lib/orchestration/story-close/baseline-upward-writeback.js +50 -179
  397. package/.agents/scripts/lib/orchestration/story-close/context-budget-writeback.js +11 -41
  398. package/.agents/scripts/lib/orchestration/story-close/format-autofix.js +23 -311
  399. package/.agents/scripts/lib/orchestration/story-close/phases/local-lens-review.js +22 -147
  400. package/.agents/scripts/lib/orchestration/story-close/phases/review-core.js +16 -67
  401. package/.agents/scripts/lib/orchestration/story-deliver-terminal-schema.js +12 -68
  402. package/.agents/scripts/lib/orchestration/story-deliver-terminal.js +42 -200
  403. package/.agents/scripts/lib/orchestration/story-follow-ups.js +167 -252
  404. package/.agents/scripts/lib/orchestration/story-init-envelope.js +52 -0
  405. package/.agents/scripts/lib/orchestration/story-init-remote.js +2 -6
  406. package/.agents/scripts/lib/orchestration/story-reachability.js +3 -23
  407. package/.agents/scripts/lib/orchestration/task-body-validator.js +12 -135
  408. package/.agents/scripts/lib/orchestration/ticket-lease.js +28 -131
  409. package/.agents/scripts/lib/orchestration/ticket-validator-conflicts.js +15 -149
  410. package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +5 -33
  411. package/.agents/scripts/lib/orchestration/ticket-validator.js +63 -344
  412. package/.agents/scripts/lib/orchestration/ticketing/bulk.js +51 -244
  413. package/.agents/scripts/lib/orchestration/ticketing/reads.js +39 -261
  414. package/.agents/scripts/lib/orchestration/ticketing/state.js +14 -68
  415. package/.agents/scripts/lib/orchestration/ticketing/transition.js +46 -263
  416. package/.agents/scripts/lib/orchestration/ticketing.js +2 -26
  417. package/.agents/scripts/lib/orchestration/verify-credit.js +18 -79
  418. package/.agents/scripts/lib/orchestration/worktree-dirty.js +5 -30
  419. package/.agents/scripts/lib/path-security.js +3 -6
  420. package/.agents/scripts/lib/plan-phase-cleanup.js +9 -49
  421. package/.agents/scripts/lib/preflight-runner.js +13 -69
  422. package/.agents/scripts/lib/process-group.js +143 -0
  423. package/.agents/scripts/lib/project-root.js +2 -8
  424. package/.agents/scripts/lib/provider-factory.js +2 -25
  425. package/.agents/scripts/lib/qa/console-allowlist.js +10 -59
  426. package/.agents/scripts/lib/qa/qa-session.js +15 -69
  427. package/.agents/scripts/lib/qa/redact-evidence.js +18 -129
  428. package/.agents/scripts/lib/qa/resolve-qa-contract.js +26 -135
  429. package/.agents/scripts/lib/qa/resolve-selection.js +16 -84
  430. package/.agents/scripts/lib/reserved-test-ids.js +9 -47
  431. package/.agents/scripts/lib/runtime-deps/dep-resolution.js +13 -53
  432. package/.agents/scripts/lib/runtime-deps/ensure-installed.js +10 -44
  433. package/.agents/scripts/lib/runtime-deps/manifest.js +10 -30
  434. package/.agents/scripts/lib/runtime-deps/parser-major.js +15 -51
  435. package/.agents/scripts/lib/runtime-deps/preflight.js +4 -22
  436. package/.agents/scripts/lib/runtime-deps/scan-imports.js +11 -55
  437. package/.agents/scripts/lib/signals/detectors/common.js +12 -38
  438. package/.agents/scripts/lib/signals/index.js +2 -19
  439. package/.agents/scripts/lib/signals/schema.js +14 -109
  440. package/.agents/scripts/lib/signals/write.js +2 -11
  441. package/.agents/scripts/lib/single-story/confirm-merge.js +31 -72
  442. package/.agents/scripts/lib/single-story/story-merged-notify.js +8 -49
  443. package/.agents/scripts/lib/single-story-sweep/protection-ctx.js +4 -26
  444. package/.agents/scripts/lib/single-story-sweep/protection.js +13 -100
  445. package/.agents/scripts/lib/single-story-sweep/sweep-lock.js +60 -258
  446. package/.agents/scripts/lib/single-story-sweep.js +14 -97
  447. package/.agents/scripts/lib/skills/parse-skill.js +13 -59
  448. package/.agents/scripts/lib/skills/skills-index.js +8 -29
  449. package/.agents/scripts/lib/skills/walk-skill-files.js +17 -78
  450. package/.agents/scripts/lib/source-extensions.js +11 -42
  451. package/.agents/scripts/lib/source-text/strip-js-comments.js +8 -41
  452. package/.agents/scripts/lib/stdio-flush.js +9 -36
  453. package/.agents/scripts/lib/story-adjacency.js +8 -40
  454. package/.agents/scripts/lib/story-body/body-format-lints.js +51 -66
  455. package/.agents/scripts/lib/story-body/footer-block.js +11 -44
  456. package/.agents/scripts/lib/story-body/story-body.js +123 -344
  457. package/.agents/scripts/lib/temp-retention.js +42 -143
  458. package/.agents/scripts/lib/templates/decomposer-prompts.js +18 -80
  459. package/.agents/scripts/lib/test-env.js +12 -65
  460. package/.agents/scripts/lib/test-run-credit.js +10 -65
  461. package/.agents/scripts/lib/test-runner-contract.js +19 -74
  462. package/.agents/scripts/lib/test-temp.js +38 -184
  463. package/.agents/scripts/lib/test-tiers.js +12 -96
  464. package/.agents/scripts/lib/ticket-body-sections.js +21 -96
  465. package/.agents/scripts/lib/transpile.js +15 -74
  466. package/.agents/scripts/lib/util/concurrent-map.js +6 -25
  467. package/.agents/scripts/lib/util/parse-id-list.js +8 -34
  468. package/.agents/scripts/lib/util/poll-loop.js +8 -28
  469. package/.agents/scripts/lib/util/with-timeout.js +2 -11
  470. package/.agents/scripts/lib/validation-evidence.js +21 -96
  471. package/.agents/scripts/lib/wave-runner/footprint.js +17 -70
  472. package/.agents/scripts/lib/wave-runner/live-probe.js +67 -209
  473. package/.agents/scripts/lib/wave-runner/ready-set.js +72 -301
  474. package/.agents/scripts/lib/workers/crap-worker.js +11 -64
  475. package/.agents/scripts/lib/workers/maintainability-report-worker.js +8 -45
  476. package/.agents/scripts/lib/workers/maintainability-worker.js +5 -21
  477. package/.agents/scripts/lib/workers/serve-worker-messages.js +2 -18
  478. package/.agents/scripts/lib/workflow-closure.js +22 -105
  479. package/.agents/scripts/lib/workspace-provisioner.js +16 -54
  480. package/.agents/scripts/lib/worktree/git-hooks.js +15 -60
  481. package/.agents/scripts/lib/worktree/lifecycle/force-drain.js +20 -60
  482. package/.agents/scripts/lib/worktree/lifecycle/merge-reachability.js +10 -62
  483. package/.agents/scripts/lib/worktree/lifecycle/pending-cleanup.js +22 -86
  484. package/.agents/scripts/lib/worktree/lifecycle/reap.js +24 -126
  485. package/.agents/scripts/lib/worktree/lifecycle-manager.js +2 -20
  486. package/.agents/scripts/lib/worktree/node-modules-strategy.js +46 -180
  487. package/.agents/scripts/lib/worktree-manager.js +15 -40
  488. package/.agents/scripts/lint-issue-body.js +12 -68
  489. package/.agents/scripts/mandrel-update-preflight.js +10 -70
  490. package/.agents/scripts/merge-baseline.js +30 -105
  491. package/.agents/scripts/nav-registry-diff.js +22 -108
  492. package/.agents/scripts/notify.js +12 -69
  493. package/.agents/scripts/plan-context.js +97 -92
  494. package/.agents/scripts/plan-critics.js +12 -66
  495. package/.agents/scripts/plan-persist.js +71 -137
  496. package/.agents/scripts/plan-run-epilogue.js +20 -43
  497. package/.agents/scripts/pr-watch-with-update.js +79 -263
  498. package/.agents/scripts/providers/github/auth.js +3 -8
  499. package/.agents/scripts/providers/github/blocked-by-add.js +14 -61
  500. package/.agents/scripts/providers/github/board-add.js +5 -21
  501. package/.agents/scripts/providers/github/branch-protection.js +11 -43
  502. package/.agents/scripts/providers/github/cache.js +2 -14
  503. package/.agents/scripts/providers/github/comments.js +7 -40
  504. package/.agents/scripts/providers/github/compose.js +3 -19
  505. package/.agents/scripts/providers/github/errors.js +22 -125
  506. package/.agents/scripts/providers/github/issues.js +31 -123
  507. package/.agents/scripts/providers/github/labels.js +24 -124
  508. package/.agents/scripts/providers/github/mappers.js +5 -27
  509. package/.agents/scripts/providers/github/merge-methods.js +3 -22
  510. package/.agents/scripts/providers/github/project-board.js +2 -17
  511. package/.agents/scripts/providers/github/projects-v2-graphql.js +3 -6
  512. package/.agents/scripts/providers/github/request-helpers.js +5 -32
  513. package/.agents/scripts/providers/github/search-budget.js +9 -39
  514. package/.agents/scripts/providers/github/search-query.js +5 -26
  515. package/.agents/scripts/providers/github/sub-issue-add.js +15 -65
  516. package/.agents/scripts/providers/github/sub-issues.js +7 -36
  517. package/.agents/scripts/providers/github/tickets.js +32 -134
  518. package/.agents/scripts/providers/github.js +18 -59
  519. package/.agents/scripts/prune-plan-run-labels.js +12 -46
  520. package/.agents/scripts/quality-preview.js +35 -220
  521. package/.agents/scripts/resolve-doc-tiers.js +3 -26
  522. package/.agents/scripts/resolve-stories.js +16 -67
  523. package/.agents/scripts/resync-status-column.js +6 -25
  524. package/.agents/scripts/run-tests.js +29 -104
  525. package/.agents/scripts/single-story-close.js +23 -135
  526. package/.agents/scripts/single-story-confirm-merge.js +32 -139
  527. package/.agents/scripts/single-story-init.js +47 -259
  528. package/.agents/scripts/stories-wave-tick.js +179 -415
  529. package/.agents/scripts/sync-agentrc.js +3 -21
  530. package/.agents/scripts/sync-claude-agents.js +9 -55
  531. package/.agents/scripts/sync-claude-commands.js +20 -110
  532. package/.agents/scripts/test-wrapper.js +6 -43
  533. package/.agents/scripts/update-coverage-baseline.js +5 -22
  534. package/.agents/scripts/update-crap-baseline.js +7 -30
  535. package/.agents/scripts/update-duplication-baseline.js +16 -92
  536. package/.agents/scripts/update-maintainability-baseline.js +8 -62
  537. package/.agents/scripts/update-ticket-state.js +1 -7
  538. package/.agents/scripts/validate-skills.js +6 -26
  539. package/.agents/skills/core/gates-and-baselines/reference.md +0 -1
  540. package/.agents/skills/skills.index.json +2 -2
  541. package/.agents/skills/stack/qa/playwright/SKILL.md +26 -0
  542. package/.agents/templates/agent-protocol.md +2 -2
  543. package/.agents/templates/docs/audit-sweep-runbook.md +3 -4
  544. package/.agents/workflows/audit-accessibility.md +4 -7
  545. package/.agents/workflows/audit-adrs.md +3 -6
  546. package/.agents/workflows/audit-architecture.md +3 -11
  547. package/.agents/workflows/audit-baselines.md +6 -9
  548. package/.agents/workflows/audit-clean-code.md +8 -12
  549. package/.agents/workflows/audit-data-model.md +3 -7
  550. package/.agents/workflows/audit-dependencies.md +4 -7
  551. package/.agents/workflows/audit-devops.md +4 -8
  552. package/.agents/workflows/audit-documentation.md +1 -4
  553. package/.agents/workflows/audit-mobile.md +4 -7
  554. package/.agents/workflows/audit-navigability.md +3 -6
  555. package/.agents/workflows/audit-performance.md +2 -4
  556. package/.agents/workflows/audit-privacy.md +4 -7
  557. package/.agents/workflows/audit-quality.md +4 -7
  558. package/.agents/workflows/audit-security.md +4 -7
  559. package/.agents/workflows/audit-seo.md +4 -7
  560. package/.agents/workflows/audit-sre.md +4 -7
  561. package/.agents/workflows/audit-to-stories.md +17 -30
  562. package/.agents/workflows/audit-ux-ui.md +4 -7
  563. package/.agents/workflows/helpers/acceptance-self-eval.md +84 -157
  564. package/.agents/workflows/helpers/audit-lens-core.md +1 -1
  565. package/.agents/workflows/helpers/code-quality-guardrails.md +12 -15
  566. package/.agents/workflows/helpers/code-review.md +4 -2
  567. package/.agents/workflows/helpers/deliver-digest.md +37 -28
  568. package/.agents/workflows/helpers/deliver-light.md +92 -101
  569. package/.agents/workflows/helpers/deliver-reference.md +162 -220
  570. package/.agents/workflows/helpers/deliver-story-reference.md +197 -607
  571. package/.agents/workflows/helpers/deliver-story.md +17 -18
  572. package/.agents/workflows/helpers/plan-reference.md +125 -167
  573. package/.agents/workflows/helpers/qa-core.md +12 -0
  574. package/.agents/workflows/mandrel-deliver.md +47 -31
  575. package/.agents/workflows/mandrel-plan.md +22 -21
  576. package/.agents/workflows/mandrel-update.md +36 -21
  577. package/.agents/workflows/memory-consolidate.md +1 -1
  578. package/.agents/workflows/qa-assist.md +27 -71
  579. package/.agents/workflows/qa-explore.md +19 -59
  580. package/.agents/workflows/qa-run.md +11 -33
  581. package/README.md +1 -1
  582. package/bin/mandrel.js +5 -46
  583. package/bin/postinstall.js +18 -107
  584. package/docs/CHANGELOG.md +60 -0
  585. package/lib/cli/doctor.js +11 -71
  586. package/lib/cli/init.js +26 -165
  587. package/lib/cli/migrate.js +5 -64
  588. package/lib/cli/registry.js +84 -467
  589. package/lib/cli/sync-agents.js +4 -64
  590. package/lib/cli/sync-commands.js +11 -64
  591. package/lib/cli/sync.js +34 -213
  592. package/lib/cli/uninstall.js +40 -219
  593. package/lib/cli/update.js +326 -523
  594. package/lib/cli/version-check.js +8 -72
  595. package/lib/cli/version-helpers.js +14 -87
  596. package/lib/migrations/helpers/retire-agentrc-key.js +11 -52
  597. package/lib/migrations/index.js +17 -92
  598. package/lib/migrations/steps/2.1.0-retire-mi-drop-knobs.js +2 -15
  599. package/lib/migrations/steps/2.1.0-retire-verify-concurrency-cap.js +1 -13
  600. package/lib/migrations/steps/2.11.0-retire-max-seed-words.js +2 -15
  601. package/lib/migrations/steps/2.2.0-retire-epic-ac-tags.js +9 -38
  602. package/lib/migrations/steps/2.20.0-retire-codebase-snapshot.js +1 -13
  603. package/lib/migrations/steps/2.32.0-retire-lint-baseline-command.js +2 -27
  604. package/lib/migrations/steps/2.57.0-retire-delivery-limit-knobs.js +2 -23
  605. package/lib/migrations/steps/2.57.0-retire-planning-limit-knobs.js +2 -27
  606. package/lib/migrations/steps/2.60.0-retire-audit-results-autofile.js +21 -0
  607. package/lib/migrations/steps/strip-removed-agentrc-keys.js +333 -0
  608. package/package.json +17 -14
  609. package/.agents/docs/SDLC.md +0 -590
  610. package/.agents/docs/quality-gates.md +0 -1179
  611. package/.agents/rules/known-tooling-behavior.md +0 -150
  612. package/.agents/rules/orchestration-error-handling.md +0 -61
  613. package/.agents/rules/test-seams.md +0 -59
  614. package/.agents/schemas/baselines/lighthouse.schema.json +0 -59
  615. package/.agents/schemas/baselines/lint.schema.json +0 -47
  616. package/.agents/schemas/model-attribution.schema.json +0 -53
  617. package/.agents/scripts/check-action-pinning.js +0 -260
  618. package/.agents/scripts/check-audit-attribution.js +0 -302
  619. package/.agents/scripts/check-baseline-drift.js +0 -211
  620. package/.agents/scripts/check-baseline-scope.js +0 -362
  621. package/.agents/scripts/check-generated-validator.js +0 -202
  622. package/.agents/scripts/check-knip-entries.js +0 -159
  623. package/.agents/scripts/check-lifecycle-lint.js +0 -294
  624. package/.agents/scripts/check-pinned-override-notes.js +0 -102
  625. package/.agents/scripts/check-schema-references.js +0 -366
  626. package/.agents/scripts/check-test-portability.js +0 -512
  627. package/.agents/scripts/check-workflow-citations.js +0 -332
  628. package/.agents/scripts/check-workflow-cli-lint.js +0 -299
  629. package/.agents/scripts/check-workflow-timeouts.js +0 -291
  630. package/.agents/scripts/install-matrix-assert.js +0 -326
  631. package/.agents/scripts/lib/audit-advisories.js +0 -195
  632. package/.agents/scripts/lib/audit-attribution.js +0 -134
  633. package/.agents/scripts/lib/baselines/drift-detector.js +0 -351
  634. package/.agents/scripts/lib/baselines/kinds/lighthouse.js +0 -87
  635. package/.agents/scripts/lib/baselines/kinds/lint.js +0 -184
  636. package/.agents/scripts/lib/baselines/orphan-pruner.js +0 -233
  637. package/.agents/scripts/lib/baselines/scope-assert.js +0 -223
  638. package/.agents/scripts/lib/baselines/scope-inventory.js +0 -314
  639. package/.agents/scripts/lib/c8-cli-path.js +0 -21
  640. package/.agents/scripts/lib/config/gates/lighthouse.schema.js +0 -51
  641. package/.agents/scripts/lib/config/gates/lint.schema.js +0 -18
  642. package/.agents/scripts/lib/dynamic-workflow/architecture-report-contract.js +0 -70
  643. package/.agents/scripts/lib/dynamic-workflow/audit-orchestrator.js +0 -284
  644. package/.agents/scripts/lib/dynamic-workflow/clean-code-report-contract.js +0 -80
  645. package/.agents/scripts/lib/dynamic-workflow/degraded-coverage.js +0 -81
  646. package/.agents/scripts/lib/dynamic-workflow/documentation-report-contract.js +0 -87
  647. package/.agents/scripts/lib/dynamic-workflow/performance-report-contract.js +0 -74
  648. package/.agents/scripts/lib/dynamic-workflow/quality-report-contract.js +0 -90
  649. package/.agents/scripts/lib/dynamic-workflow/report-contract-core.js +0 -43
  650. package/.agents/scripts/lib/dynamic-workflow/security-report-contract.js +0 -83
  651. package/.agents/scripts/lib/fs-walk.js +0 -52
  652. package/.agents/scripts/lib/knip-config-resolver.js +0 -181
  653. package/.agents/scripts/lib/knip-entry-sync.js +0 -452
  654. package/.agents/scripts/lib/orchestration/model-attribution.js +0 -418
  655. package/.agents/scripts/lib/orchestration/story-plan-state.js +0 -33
  656. package/.agents/scripts/lib/orchestration/structured-comment-parser.js +0 -67
  657. package/.agents/scripts/lib/pinned-override-notes.js +0 -88
  658. package/.agents/scripts/lib/pinned-override-resolve.js +0 -212
  659. package/.agents/scripts/lib/test-isolate/cli-options.js +0 -93
  660. package/.agents/scripts/lib/test-isolate/env-snapshot-loader.js +0 -52
  661. package/.agents/scripts/lib/test-isolate/list-files.js +0 -90
  662. package/.agents/scripts/lib/test-isolate/parse-tap.js +0 -75
  663. package/.agents/scripts/lib/test-isolate/progress-log.js +0 -45
  664. package/.agents/scripts/lib/test-isolate/render-report.js +0 -97
  665. package/.agents/scripts/lib/test-isolate/run-isolate.js +0 -87
  666. package/.agents/scripts/lib/test-isolate/runner.js +0 -483
  667. package/.agents/scripts/lib/test-profile/parse-tap.js +0 -136
  668. package/.agents/scripts/lib/test-profile/render-report.js +0 -45
  669. package/.agents/scripts/lint-label-vocabulary.js +0 -214
  670. package/.agents/scripts/post-structured-comment.js +0 -127
  671. package/.agents/scripts/provision-git-hooks.js +0 -85
  672. package/.agents/scripts/prune-baseline-orphans.js +0 -181
  673. package/.agents/scripts/run-coverage.js +0 -197
  674. package/.agents/scripts/run-lint.js +0 -133
  675. package/.agents/scripts/run-test-profile.js +0 -129
  676. package/.agents/scripts/run-verify.js +0 -118
  677. package/.agents/scripts/test-isolate.js +0 -55
  678. package/.agents/scripts/update-dead-exports-baseline.js +0 -321
@@ -1,57 +1,19 @@
1
1
  // lib/cli/version-check.js
2
2
  /**
3
- * Daily-cached version freshness check (Story #3500, Epic #3437 — Auto-Update
4
- * & Version Lifecycle).
5
- *
6
- * Detects a stale install ("f-notify-stale") via a daily on-disk JSON cache so
7
- * callers learn that a newer version exists **without** issuing a network call
8
- * on every command. The cache lives under the project's temp root as a small
9
- * JSON document:
10
- *
11
- * { "latestVersion": "<semver>", "checkedAt": "<ISO-8601 timestamp>" }
12
- *
13
- * `isStale` reads that cache and only invokes the injected network `runner`
14
- * seam when the cached `checkedAt` is older than 24h. A fresh cache short-
15
- * circuits with zero network I/O; a missing, unreadable, or stale cache
16
- * triggers exactly one `runner` call and a cache refresh.
17
- *
18
- * Security (security-baseline § 5 — Data Leakage & Logging):
19
- * - Logs only version strings and filesystem paths. Never logs tokens,
20
- * credentials, environment values, or raw file contents.
21
- * - Performs no shell-string interpolation; the network probe is delegated
22
- * to the injected `runner` seam so the host owns transport and auth.
23
- *
24
- * Injectable seams (used by lib/cli/__tests__/version-check.test.js):
25
- * - `cachePath` — absolute path to the daily cache JSON file
26
- * - `now` — Date provider (defaults to `new Date()`)
27
- * - `runner` — async network seam returning the latest version string
28
- * - `fs` — node:fs surface (readFileSync / writeFileSync / mkdirSync)
29
- * - `log` — structured logger seam (defaults to a no-op)
30
- *
31
- * Following the lib/cli/*.js convention: Node built-ins only, every effectful
32
- * dependency is an injectable seam, and the default export is the seam-free
33
- * production wiring.
3
+ * Daily-cached newest-version check: `{ latestVersion, checkedAt }` JSON under
4
+ * the temp root, so commands learn of a newer release without a network call
5
+ * each time. Logs only versions and paths.
34
6
  */
35
7
 
36
8
  import nodeFs from 'node:fs';
37
9
  import path from 'node:path';
38
10
 
39
- /** Cache freshness window in milliseconds (24 hours). */
40
11
  export const STALE_AFTER_MS = 24 * 60 * 60 * 1000;
41
12
 
42
- /** Default cache filename under the temp root. */
43
13
  export const DEFAULT_CACHE_FILENAME = 'version-check.json';
44
14
 
45
15
  /**
46
- * Read and parse the daily cache JSON.
47
- *
48
- * Returns `null` when the file is absent, unreadable, malformed, or missing
49
- * the required `checkedAt` / `latestVersion` fields — every one of those is a
50
- * "treat as no cache" condition for `isStale`, so callers never have to
51
- * distinguish them.
52
- *
53
- * Never throws: a corrupt or missing cache must degrade to a refresh, not a
54
- * crash.
16
+ * `null` (never a throw) for any absent, unreadable or malformed cache.
55
17
  *
56
18
  * @param {{
57
19
  * cachePath: string,
@@ -66,7 +28,6 @@ export function readCache({ cachePath, fs = nodeFs }) {
66
28
  try {
67
29
  raw = fs.readFileSync(cachePath, 'utf8');
68
30
  } catch {
69
- // Missing or unreadable file → no cache.
70
31
  return null;
71
32
  }
72
33
 
@@ -74,7 +35,6 @@ export function readCache({ cachePath, fs = nodeFs }) {
74
35
  try {
75
36
  parsed = JSON.parse(raw);
76
37
  } catch {
77
- // Malformed JSON → no cache.
78
38
  return null;
79
39
  }
80
40
 
@@ -91,11 +51,6 @@ export function readCache({ cachePath, fs = nodeFs }) {
91
51
  }
92
52
 
93
53
  /**
94
- * Persist `{ latestVersion, checkedAt }` JSON to the cache path, creating the
95
- * parent directory (the temp root) when needed.
96
- *
97
- * Logs only the version string and the cache path — never the raw payload.
98
- *
99
54
  * @param {{
100
55
  * cachePath: string,
101
56
  * latestVersion: string,
@@ -103,7 +58,7 @@ export function readCache({ cachePath, fs = nodeFs }) {
103
58
  * fs?: typeof import('node:fs'),
104
59
  * log?: (msg: string) => void,
105
60
  * }} opts
106
- * @returns {{ latestVersion: string, checkedAt: string }} The persisted record.
61
+ * @returns {{ latestVersion: string, checkedAt: string }}
107
62
  */
108
63
  export function refreshCache({
109
64
  cachePath,
@@ -121,32 +76,15 @@ export function refreshCache({
121
76
  fs.mkdirSync(dir, { recursive: true });
122
77
  fs.writeFileSync(cachePath, `${JSON.stringify(record, null, 2)}\n`, 'utf8');
123
78
 
124
- // Safe to log: version string + path only (security-baseline § 5).
125
79
  log(`version-check: cached latestVersion=${latestVersion} at ${cachePath}`);
126
80
 
127
81
  return record;
128
82
  }
129
83
 
130
84
  /**
131
- * Decide whether the cached freshness check is stale and, when it is, refresh
132
- * it through the network `runner` seam.
133
- *
134
- * Behaviour:
135
- * - **Fresh cache** (`checkedAt` within 24h): returns immediately with the
136
- * cached version. The `runner` seam is **never** invoked — no per-command
137
- * network call.
138
- * - **Missing / corrupt / stale cache**: invokes `runner` exactly once to
139
- * fetch the latest version, persists the result via `refreshCache`, and
140
- * returns the refreshed record.
141
- *
142
- * The freshness comparison uses `>=` so an exactly-24h-old cache counts as
143
- * stale (the boundary is treated as "due for refresh").
144
- *
145
- * `forceRefresh` skips the freshness read entirely and always probes. It is
146
- * the supported way to bypass the cache: callers must **not** fake staleness
147
- * by shifting `now` forward, because `now` is also the clock stamped into the
148
- * refreshed `checkedAt` — a shifted clock persists a future timestamp and
149
- * defeats the freshness window for every later reader (Story #4878).
85
+ * A cache under 24h old returns without calling `runner`; otherwise one probe
86
+ * refreshes it. Bypass with `forceRefresh`, never by shifting `now`: `now` is
87
+ * stamped as `checkedAt`, and a future stamp defeats every later reader.
150
88
  *
151
89
  * @param {{
152
90
  * cachePath: string,
@@ -179,7 +117,6 @@ export async function isStale({
179
117
  Number.isFinite(ageMs) && ageMs >= 0 && ageMs < STALE_AFTER_MS;
180
118
 
181
119
  if (cacheIsFresh) {
182
- // Fresh cache → no network call.
183
120
  log(
184
121
  `version-check: cache fresh latestVersion=${cached.latestVersion} (no network)`,
185
122
  );
@@ -192,7 +129,6 @@ export async function isStale({
192
129
  }
193
130
  }
194
131
 
195
- // Missing, corrupt, or stale cache → one network probe + refresh.
196
132
  if (typeof runner !== 'function') {
197
133
  throw new Error(
198
134
  'version-check: runner seam is required to refresh a stale cache',
@@ -1,39 +1,18 @@
1
1
  // lib/cli/version-helpers.js
2
2
  /**
3
- * Shared semver-ish parse and compare helpers used by both
4
- * `lib/cli/update.js` and `lib/cli/registry.js`.
5
- *
6
- * Both files previously defined local copies of `parseVersion` and
7
- * `compareVersions`; this module is the single authoritative
8
- * implementation (Story #4048 B3 — multiplied helpers).
9
- *
10
- * `resolveConsumerPinVersion` (Story #4530) lives here for the same
11
- * no-mirror-copies reason rather than in either file directly: `update.js`
12
- * already imports `registry.js` (for the drift-check fallback), so a
13
- * function needed by both would otherwise force a two-way circular import
14
- * between them. This module is a dependency-free leaf both already import.
15
- *
16
- * Builtins only — this module is imported from both the CLI surface
17
- * (`lib/cli/`) and the doctor registry which runs before third-party
18
- * packages are guaranteed to be present.
19
- *
20
- * The two filesystem-touching helpers below take the module's injectable
21
- * seam as their optional final `fsImpl` parameter, defaulting to the real
22
- * `node:fs` (`.agents/rules/test-seams.md` rules 1-2);
23
- * `resolveConsumerPinVersion` forwards that seam to
24
- * `resolveConsumerPinSpec` rather than re-acquiring `fs` itself (rule 4).
25
- * Every other export here is pure, so it needs no seam of its own.
3
+ * Version parse/compare and consumer-pin helpers shared by `update.js` and
4
+ * `registry.js`. A dependency-free, builtins-only leaf: `update.js` imports
5
+ * `registry.js` (a cycle otherwise), and the doctor registry runs before
6
+ * third-party packages are guaranteed present.
26
7
  */
27
8
 
28
9
  import nodeFs from 'node:fs';
29
10
  import path from 'node:path';
30
11
 
31
- /** The published package whose consumer pin is resolved below. */
32
12
  const PACKAGE_NAME = 'mandrel';
33
13
 
34
14
  /**
35
- * Parse a dotted semver-ish string into a numeric tuple. Non-numeric or
36
- * missing segments coerce to 0 so a partial version still compares sanely.
15
+ * Missing or non-numeric segments coerce to 0.
37
16
  *
38
17
  * @param {string} version
39
18
  * @returns {[number, number, number]}
@@ -48,8 +27,7 @@ export function parseVersion(version) {
48
27
  }
49
28
 
50
29
  /**
51
- * Compare two version strings. Negative when `a < b`, zero when equal,
52
- * positive when `a > b` (the standard `Array.sort` comparator contract).
30
+ * `Array.sort` comparator contract.
53
31
  *
54
32
  * @param {string} a
55
33
  * @param {string} b
@@ -65,10 +43,6 @@ export function compareVersions(a, b) {
65
43
  }
66
44
 
67
45
  /**
68
- * True when `target`'s major axis is strictly greater than `current`'s —
69
- * the gated "crosses a major boundary" condition used by the update
70
- * orchestrator.
71
- *
72
46
  * @param {string} current
73
47
  * @param {string} target
74
48
  * @returns {boolean}
@@ -78,25 +52,8 @@ export function crossesMajor(current, target) {
78
52
  }
79
53
 
80
54
  /**
81
- * Does `version` satisfy the range described by `spec` — a
82
- * `{ operator, version }` pin spec as returned by
83
- * {@link resolveConsumerPinSpec}?
84
- *
85
- * A deliberately minimal caret/tilde/exact implementation rather than a
86
- * `semver` dependency: `version-helpers.js` is builtins-only (it is imported
87
- * by the doctor registry, which runs before third-party packages are
88
- * guaranteed to be present), and the only ranges
89
- * {@link resolveConsumerPinSpec} ever yields are `^`, `~`, and exact.
90
- *
91
- * Semantics match npm's:
92
- * - `''` (exact) → `version === spec.version`
93
- * - `~1.2.3` → `>=1.2.3 <1.3.0`
94
- * - `^1.2.3` → `>=1.2.3 <2.0.0`
95
- * - `^0.2.3` → `>=0.2.3 <0.3.0` (0.x: the minor axis is the API axis)
96
- * - `^0.0.3` → `>=0.0.3 <0.0.4`
97
- *
98
- * Prerelease tags are ignored on both sides, consistent with
99
- * {@link parseVersion}'s numeric-tuple contract.
55
+ * npm caret/tilde/exact semantics (incl. 0.x caret), prereleases ignored —
56
+ * the only ranges {@link resolveConsumerPinSpec} yields, so no `semver` dep.
100
57
  *
101
58
  * @param {string} version
102
59
  * @param {{ operator: '^' | '~' | '', version: string }} spec
@@ -120,20 +77,10 @@ export function satisfiesPinSpec(version, spec) {
120
77
  }
121
78
 
122
79
  /**
123
- * Read the consumer's declared `mandrel` dependency pin from
124
- * `<consumerRoot>/package.json` (checking `dependencies` then
125
- * `devDependencies`), returning both the range `operator` and the base
126
- * `version` it decorates.
127
- *
128
- * Callers that only need to decide whether `npm install mandrel@<target>`
129
- * would move the declared pin want {@link resolveConsumerPinVersion} (the
130
- * base version alone). Callers that need to ask whether an installed
131
- * version is *in range* — `mandrel doctor`'s `pin-current` check — need the
132
- * operator too, because `^2.1.0` and `2.1.0` make very different claims
133
- * about an installed 2.4.0.
134
- *
135
- * Returns `null` under exactly the same conditions as
136
- * {@link resolveConsumerPinVersion} — see its contract.
80
+ * The consumer's declared `mandrel` pin (dependencies, then devDependencies)
81
+ * as operator + base version; the operator matters for in-range checks.
82
+ * `null`, never a throw, for no readable manifest, no entry, or anything but
83
+ * a plain exact/caret/tilde semver (`workspace:`, `latest`, ranges, …).
137
84
  *
138
85
  * @param {string} consumerRoot
139
86
  * @param {typeof nodeFs} [fsImpl]
@@ -165,28 +112,8 @@ export function resolveConsumerPinSpec(consumerRoot, fsImpl = nodeFs) {
165
112
  }
166
113
 
167
114
  /**
168
- * Read the consumer's declared `mandrel` dependency pin from
169
- * `<consumerRoot>/package.json` (checking `dependencies` then
170
- * `devDependencies`), stripping a leading `^`/`~` range operator to
171
- * recover a base semver for comparison against the registry's newest
172
- * published version.
173
- *
174
- * A base-version compare against the target is the right question here
175
- * regardless of what the full range technically already matches: the
176
- * declared pin is exactly what `npm install mandrel@<target>` (the
177
- * `mandrel update` `npm-update` step) moves, so comparing its base version
178
- * decides whether that step needs to run.
179
- *
180
- * Returns `null` — never throws — when there is no readable `package.json`,
181
- * no `mandrel` entry in either dependency block, or the declared value
182
- * isn't a plain exact/caret/tilde semver (a `workspace:`/`file:`/`git+`
183
- * specifier, `latest`, `*`, or a comparator range). Callers fall back to
184
- * resolving the actually-installed version in that case — see
185
- * `lib/cli/update.js#resolveCurrentVersionForUpdate` and
186
- * `lib/cli/registry.js`'s `pin-current` doctor check (both Story #4530),
187
- * which is also how a project with no `mandrel` dependency at all —
188
- * including mandrel's own repo, which carries no self-dependency —
189
- * degrades to a clean skip rather than a false failure.
115
+ * The pin's base version: what `npm-update` moves, so comparing it decides
116
+ * whether that step runs whatever the range already matches.
190
117
  *
191
118
  * @param {string} consumerRoot
192
119
  * @param {typeof nodeFs} [fsImpl]
@@ -1,53 +1,20 @@
1
1
  // lib/migrations/helpers/retire-agentrc-key.js
2
2
  /**
3
- * The shared scaffold behind every "strip a retired `.agentrc.json` key"
4
- * migration step.
5
- *
6
- * Retiring a config key is the framework's most common migration: a key is
7
- * dropped from the runtime AJV schema, the block it lived under carries
8
- * `additionalProperties: false`, and a consumer whose config still sets it
9
- * hits a hard validation failure on upgrade rather than a warning. Every such
10
- * step reads the config, decides whether the key is present, deletes it,
11
- * prunes whatever containers that emptied, and writes the file back — the
12
- * same mechanics each time, previously copy-pasted per step (jscpd recorded
13
- * five of them between 48 and 58 percent duplicated).
14
- *
15
- * Only three things actually vary between steps, so only those three are
16
- * declared:
17
- *
18
- * - **which config surfaces to sweep** — `.agentrc.json` alone, or that plus
19
- * the gitignored `.agentrc.local.json`. `config-resolver.js` deep-merges
20
- * the overlay over the base *before* the AJV gate runs, so a key surviving
21
- * in the overlay fails exactly as a base one would. A step that swept only
22
- * the base would report "nothing to migrate" and leave that consumer hard
23
- * broken with no self-service remedy.
24
- * - **which key paths are retired** — a step may retire more than one.
25
- * - **how far to prune emptied ancestors** — this is deliberately per-key
26
- * and not a global policy. `planning` is optional, so an emptied
27
- * `planning` block is removed; `project` is required and an empty
28
- * `commands` object is valid against the schema, so pruning it would be a
29
- * cosmetic edit to a config the consumer owns.
30
- *
31
- * Builtins only, and the `fs` seam stays injectable via `ctx.fs`, because
32
- * these steps run during `mandrel update` before third-party packages are
33
- * guaranteed to be present.
3
+ * Scaffold for steps that strip a retired `.agentrc` key (its block is
4
+ * `additionalProperties: false`, so a surviving key fails validation on
5
+ * upgrade). The default sweep includes `.agentrc.local.json`: the resolver
6
+ * merges it before validation. Prune depth is per-key, since pruning a
7
+ * required block is a gratuitous edit. Builtins only: runs during `mandrel
8
+ * update` before third-party packages are guaranteed present.
34
9
  */
35
10
 
36
11
  import nodeFs from 'node:fs';
37
12
  import path from 'node:path';
38
13
 
39
- /** The committed config every consumer has. */
40
14
  export const AGENTRC_BASE_FILENAME = '.agentrc.json';
41
15
 
42
- /** The operator-owned, gitignored overlay the resolver merges over the base. */
43
16
  const AGENTRC_LOCAL_FILENAME = '.agentrc.local.json';
44
17
 
45
- /**
46
- * Both surfaces the resolver reads — the default sweep for a retired key.
47
- *
48
- * Module-local: a step that wants both surfaces takes the default and names
49
- * nothing, so exporting this would ship a symbol with no importer.
50
- */
51
18
  const AGENTRC_FILENAMES = Object.freeze([
52
19
  AGENTRC_BASE_FILENAME,
53
20
  AGENTRC_LOCAL_FILENAME,
@@ -64,8 +31,7 @@ function resolveAgentrcPath(ctx, filename) {
64
31
  }
65
32
 
66
33
  /**
67
- * Read and parse one config surface. An absent or unparseable file is the
68
- * common case (no overlay, fresh checkout), not an error.
34
+ * Absent or unparseable is the common case (no overlay), not an error.
69
35
  *
70
36
  * @param {unknown} ctx
71
37
  * @param {string} filename
@@ -82,9 +48,7 @@ function readAgentrcConfig(ctx, filename, fsImpl) {
82
48
  }
83
49
 
84
50
  /**
85
- * Walk the container chain for a key path, returning every object along it.
86
- * Returns `null` as soon as a level is missing or is not a plain object, which
87
- * is what makes `hasKey` false for a config that never had the block.
51
+ * Every container along the key path; `null` if any level is missing.
88
52
  *
89
53
  * @param {object | null} config
90
54
  * @param {string[]} keyPath
@@ -116,8 +80,7 @@ function hasKey(config, keyPath) {
116
80
  }
117
81
 
118
82
  /**
119
- * Delete the leaf key, then remove up to `pruneDepth` ancestors that the
120
- * deletion left empty. `pruneDepth: 0` deletes the key and nothing else.
83
+ * Delete the leaf, then up to `pruneDepth` ancestors it left empty.
121
84
  *
122
85
  * @param {object} config
123
86
  * @param {{ path: string[], pruneDepth?: number }} key
@@ -142,12 +105,8 @@ function stripKey(config, key) {
142
105
  }
143
106
 
144
107
  /**
145
- * Build a migration step that strips one or more retired keys from the
146
- * consumer's config surfaces.
147
- *
148
- * `detect` is true when any declared key is present in any swept surface;
149
- * `apply` rewrites only the surfaces that actually carry one, which is what
150
- * makes a repeat pass a genuine no-op rather than a reformat.
108
+ * `apply` rewrites only surfaces carrying a key, so a repeat pass never
109
+ * reformats.
151
110
  *
152
111
  * @param {{
153
112
  * version: string,
@@ -1,55 +1,8 @@
1
1
  // lib/migrations/index.js
2
2
  /**
3
- * Version-keyed migration runner.
4
- *
5
- * A migration is a one-time, version-gated transformation of a consumer
6
- * project's on-disk state (config shape, baseline layout, materialized
7
- * `.agents/` tree, …). When a consumer upgrades `mandrel` across a
8
- * version boundary that changed a contract (see
9
- * `.agents/rules/git-conventions.md` § Contract Cutovers), the upgrade path
10
- * runs every migration whose `version` falls inside the upgrade range so the
11
- * consumer's working tree matches the new release.
12
- *
13
- * The engine here is deliberately content-free: it owns ordering, version
14
- * filtering, idempotency enforcement, and the actionable log line. The
15
- * `migrations` registry is the single source of truth for which steps exist
16
- * and in what order they run.
17
- *
18
- * ## Step shape
19
- *
20
- * Each entry in `migrations` is:
21
- *
22
- * ```js
23
- * {
24
- * version: '1.4.0', // semver the step graduates the tree to
25
- * description: 'rename foo to bar', // short, operator-facing summary
26
- * detect(ctx) { return boolean }, // true ⇒ this step still needs applying
27
- * apply(ctx) { ... }, // perform the change (mutates ctx state)
28
- * }
29
- * ```
30
- *
31
- * ## Idempotency contract
32
- *
33
- * `detect(ctx)` MUST return `false` once `apply(ctx)` has run against the same
34
- * context. The runner consults `detect` before every `apply`, so a step whose
35
- * change is already present is skipped. This makes a second `runMigrations`
36
- * pass over the same context a no-op — the property the unit test asserts.
37
- *
38
- * ## Version filtering
39
- *
40
- * `runMigrations({ fromVersion, toVersion, ctx })` applies only steps whose
41
- * `version` is strictly greater than `fromVersion` and less than or equal to
42
- * `toVersion`, in ascending version order. A step at exactly `fromVersion` is
43
- * already in the tree (the consumer was on that version) and is skipped; a
44
- * step at exactly `toVersion` is the target and runs.
45
- *
46
- * v2.0.0's Story-collapse cutover did not register a config migration step
47
- * (consumers wipe/re-sync `.agents/` and re-seed `.agentrc.json` from the
48
- * starter). Story #4531 registered the first real step — see
49
- * `steps/2.1.0-retire-mi-drop-knobs.js` — alongside the fixture steps in
50
- * `__tests__/index.test.js` that prove the machinery independent of any
51
- * real step. When the next contract cutover lands, add its step here
52
- * (ascending by version) with an idempotent `detect`/`apply`.
3
+ * Version-keyed migration runner. A step is `{ version, description,
4
+ * detect(ctx), apply(ctx) }`; `detect` MUST return false once `apply` has run
5
+ * on the same ctx, which makes a repeat pass a no-op.
53
6
  */
54
7
 
55
8
  import { compareVersions } from '../cli/version-helpers.js';
@@ -61,10 +14,11 @@ import { retireCodebaseSnapshot } from './steps/2.20.0-retire-codebase-snapshot.
61
14
  import { retireLintBaselineCommand } from './steps/2.32.0-retire-lint-baseline-command.js';
62
15
  import { retireDeliveryLimitKnobs } from './steps/2.57.0-retire-delivery-limit-knobs.js';
63
16
  import { retirePlanningLimitKnobs } from './steps/2.57.0-retire-planning-limit-knobs.js';
17
+ import { retireAuditResultsAutoFile } from './steps/2.60.0-retire-audit-results-autofile.js';
18
+ import { stripRemovedAgentrcKeys } from './steps/strip-removed-agentrc-keys.js';
64
19
 
65
20
  /**
66
- * Ordered registry of migration steps. MUST stay sorted ascending by
67
- * `version`.
21
+ * MUST stay sorted ascending by `version`.
68
22
  *
69
23
  * @type {Array<{
70
24
  * version: string,
@@ -82,29 +36,15 @@ export const migrations = [
82
36
  retireLintBaselineCommand,
83
37
  retirePlanningLimitKnobs,
84
38
  retireDeliveryLimitKnobs,
39
+ retireAuditResultsAutoFile,
40
+ stripRemovedAgentrcKeys,
85
41
  ];
86
42
 
87
- /**
88
- * The version ordering every migration decision uses.
89
- *
90
- * Re-exported from `lib/cli/version-helpers.js` — the dependency-free leaf
91
- * that owns the canonical `parseVersion` / `compareVersions` pair (Story
92
- * #4048 B3). The runner previously carried its own copy, so an ordering fix
93
- * had to be made in three places or the copies drifted apart. Re-exporting
94
- * rather than moving keeps this module's public surface intact for the
95
- * callers that import `compareVersions` from here.
96
- */
97
43
  export { compareVersions };
98
44
 
99
45
  /**
100
- * The steps that apply for an upgrade, in the order they must run:
101
- * `fromVersion < step.version <= toVersion`, ascending.
102
- *
103
- * Exported because `mandrel migrate --dry-run` has to preview exactly what the
104
- * live run would do. That preview previously re-implemented this filter and
105
- * carried a comment promising it "mirrors the runner's own comparator" — a
106
- * sync obligation nothing enforced, and the reason a third `compareVersions`
107
- * copy existed. One selector means the preview cannot drift from the run.
46
+ * `fromVersion < step.version <= toVersion`, ascending. Shared with
47
+ * `mandrel migrate --dry-run` so the preview cannot drift from the run.
108
48
  *
109
49
  * @param {{ registry?: Array<object>, fromVersion: string, toVersion: string }} params
110
50
  * @returns {Array<object>}
@@ -124,35 +64,20 @@ export function selectStepsInRange({
124
64
  }
125
65
 
126
66
  /**
127
- * Run the version-keyed migrations between two versions.
128
- *
129
- * Steps are filtered to `fromVersion < version <= toVersion`, sorted ascending
130
- * by version, and applied in order. Before each `apply`, the step's `detect`
131
- * is consulted: a step whose change is already present (detect returns false)
132
- * is skipped, which is what makes a repeat pass a no-op. Every step that
133
- * actually applies prints `migrated <version>: <description>` through the
134
- * injected `log` seam.
67
+ * Apply each in-range step whose `detect` is true.
135
68
  *
136
69
  * @param {object} params
137
- * @param {string} params.fromVersion - Version the tree is currently on
138
- * (exclusive lower bound).
139
- * @param {string} params.toVersion - Version the tree is upgrading to
140
- * (inclusive upper bound).
141
- * @param {unknown} params.ctx - Opaque context threaded to each step's
142
- * `detect`/`apply`. Migrations mutate this to record their change.
143
- * @param {(message: string) => void} [params.log] - Log seam for the
144
- * actionable per-step line. Defaults to `console.log`. Injected by tests so
145
- * no real stdout write occurs.
70
+ * @param {string} params.fromVersion - Exclusive.
71
+ * @param {string} params.toVersion - Inclusive.
72
+ * @param {unknown} params.ctx
73
+ * @param {(message: string) => void} [params.log]
146
74
  * @param {Array<{
147
75
  * version: string,
148
76
  * description: string,
149
77
  * detect: (ctx: unknown) => boolean,
150
78
  * apply: (ctx: unknown) => void,
151
- * }>} [params.registry] - Step registry. Defaults to the module `migrations`
152
- * array; injected by tests with fixture steps.
153
- * @returns {{ applied: string[], skipped: string[] }} The versions that
154
- * applied and those that were in-range but skipped because `detect` returned
155
- * false.
79
+ * }>} [params.registry]
80
+ * @returns {{ applied: string[], skipped: string[] }}
156
81
  */
157
82
  export function runMigrations({
158
83
  fromVersion,
@@ -1,20 +1,7 @@
1
1
  // lib/migrations/steps/2.1.0-retire-mi-drop-knobs.js
2
2
  /**
3
- * Story #4531 — the first real step in the migration registry.
4
- *
5
- * `delivery.quality.codingGuardrails.miDropMustRefactor` and
6
- * `delivery.quality.autoRefresh.miDropCap` were schema-validated, defaulted,
7
- * and seeded by `apply-quality-bootstrap.js` into a consumer's
8
- * `.agentrc.json` — but never consumed by the gate they were named for
9
- * (`maintainability.tolerance` is the knob actually in force; see the
10
- * Story body for the full diagnosis). Both retired keys lived under
11
- * sub-schemas with `additionalProperties: false`, so a consumer whose
12
- * config still carries either key hits a hard AJV validation failure on
13
- * upgrade, not a warning. This step strips them before that check runs.
14
- *
15
- * Unlike the later retire-steps this one sweeps the committed config only:
16
- * the knobs were written by the bootstrap script, never hand-pinned in an
17
- * operator's `.agentrc.local.json`.
3
+ * Strip the never-read MI-drop knobs. Base config only: the bootstrap script
4
+ * wrote them, never an operator's local overlay.
18
5
  */
19
6
 
20
7
  import {
@@ -1,17 +1,5 @@
1
1
  // lib/migrations/steps/2.1.0-retire-verify-concurrency-cap.js
2
- /**
3
- * Story #4531 — `delivery.deliverRunner.verifyConcurrencyCap` was retired
4
- * when verification stopped being separately capped, but it stayed
5
- * schema-validated in consumers' configs under a block carrying
6
- * `additionalProperties: false`, so a config still setting it fails AJV
7
- * validation on upgrade rather than warning. This step strips it before
8
- * that check runs.
9
- *
10
- * Unlike the 2.1.0 mi-drop step, this one also sweeps `.agentrc.local.json`:
11
- * the resolver deep-merges the local override over `.agentrc.json` and
12
- * validates the *merged* result, so a key left in the local file fails the
13
- * same way a key in the committed file does.
14
- */
2
+ /** Strip `delivery.deliverRunner.verifyConcurrencyCap`. */
15
3
 
16
4
  import { createRetireAgentrcKeyStep } from '../helpers/retire-agentrc-key.js';
17
5
 
@@ -1,20 +1,7 @@
1
1
  // lib/migrations/steps/2.11.0-retire-max-seed-words.js
2
2
  /**
3
- * Story #4722 follow-up — strip the retired
4
- * `planning.complexityGate.maxSeedWords` knob from a consumer's
5
- * `.agentrc.json`.
6
- *
7
- * #4722 (PR #4725) hard-cutover-removed word-count complexity routing:
8
- * the route derives from the authored Story's shape, never from seed word
9
- * count, and `maxSeedWords` was dropped from the runtime AJV schema and
10
- * the published mirror. The `complexityGate` block carries
11
- * `additionalProperties: false`, so a consumer whose config still sets
12
- * `maxSeedWords` hits a hard validation failure on upgrade, not a
13
- * warning. This step strips the key before that check runs — the same
14
- * contract-cutover pattern as `2.1.0-retire-mi-drop-knobs.js`.
15
- *
16
- * `planning` is an optional block, so an emptied `complexityGate` and an
17
- * emptied `planning` are both pruned rather than left as orphan objects.
3
+ * Strip `planning.complexityGate.maxSeedWords`, pruning emptied optional
4
+ * ancestors.
18
5
  */
19
6
 
20
7
  import {