mandrel 2.60.0 → 2.62.0

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