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,29 +1,9 @@
1
1
  /* node:coverage ignore file -- node_modules placement strategies (symlink/copy/install); pure filesystem I/O, integration-shaped */
2
2
 
3
3
  /**
4
- * worktree/node-modules-strategy.js
5
- *
6
- * Strategies for populating `node_modules` inside a freshly created worktree:
7
- *
8
- * - `per-worktree` — run the project's package-manager install inside the
9
- * worktree (lock-file aware).
10
- * - `clone` — copy-on-write (reflink/clonefile) clone of the donor's
11
- * `node_modules` into the worktree (`cp -c` on darwin,
12
- * `cp --reflink=auto` on linux). Effectively free in time
13
- * and disk on APFS / reflink-capable filesystems. Falls
14
- * back to `per-worktree` cleanly on any failure
15
- * (unsupported filesystem, cross-volume clone, Windows).
16
- * When the worktree's lockfile byte-matches the donor's
17
- * and the donor's install markers are present, the
18
- * per-tree install is skipped.
19
- * - `symlink` — symlink (or junction on Windows) the worktree's
20
- * `node_modules` to a donor worktree's copy. Refuses on
21
- * Windows unless `allowSymlinkOnWindows=true`.
22
- * - `pnpm-store` — run `pnpm install --frozen-lockfile` against the
23
- * shared content-addressable store.
24
- *
25
- * The context passed to each helper carries the minimum state the strategy
26
- * needs: config, platform, logger, and repoRoot (for `symlink` / `clone`).
4
+ * Strategies for populating a new worktree's `node_modules`: `per-worktree`
5
+ * (PM install), `clone` (copy-on-write clone of the donor, falling back to
6
+ * install), `symlink` (to a donor; opt-in on Windows) and `pnpm-store`.
27
7
  */
28
8
 
29
9
  import { spawnSync } from 'node:child_process';
@@ -39,12 +19,10 @@ function sleepSync(ms) {
39
19
  }
40
20
 
41
21
  /**
42
- * Resolve the copy-on-write clone donor directory. Defaults to the repo root
43
- * (the main checkout, which is primed by the host's own install) unless the
44
- * operator pinned a `primeFromPath`.
22
+ * Clone donor: `primeFromPath` when pinned, else the (host-installed) repo root.
45
23
  *
46
24
  * @param {{ config: object, repoRoot: string }} ctx
47
- * @returns {string} Absolute donor path.
25
+ * @returns {string}
48
26
  */
49
27
  function resolveCloneDonor(ctx) {
50
28
  const primeFromPath = ctx.config?.primeFromPath;
@@ -54,11 +32,10 @@ function resolveCloneDonor(ctx) {
54
32
  }
55
33
 
56
34
  /**
57
- * Apply the configured `nodeModulesStrategy` after a fresh worktree is added.
58
- * Called only during creation.
35
+ * Apply `nodeModulesStrategy` to a freshly created worktree.
59
36
  *
60
37
  * @param {{ config: object, platform: NodeJS.Platform, logger: object, repoRoot: string }} ctx
61
- * @param {string} wtPath Absolute worktree path.
38
+ * @param {string} wtPath
62
39
  */
63
40
  export function applyNodeModulesStrategy(ctx, wtPath) {
64
41
  const strategy = ctx.config.nodeModulesStrategy ?? 'per-worktree';
@@ -99,10 +76,8 @@ export function applyNodeModulesStrategy(ctx, wtPath) {
99
76
 
100
77
  const target = path.join(wtPath, 'node_modules');
101
78
  try {
102
- // On Windows, `junction` works without Administrator privileges
103
- // (unlike `dir`/`file` symlinks) and is adequate for same-volume
104
- // node_modules priming. Key off the real host OS — `ctx.platform` is a
105
- // test-injection hook and does not change what the filesystem accepts.
79
+ // A junction needs no admin rights on Windows. Keyed off the real host
80
+ // OS: `ctx.platform` is a test hook the filesystem ignores.
106
81
  const linkType = process.platform === 'win32' ? 'junction' : 'dir';
107
82
  fs.symlinkSync(primeNodeModules, target, linkType);
108
83
  } catch (err) {
@@ -125,28 +100,19 @@ export function applyNodeModulesStrategy(ctx, wtPath) {
125
100
  }
126
101
 
127
102
  /**
128
- * Copy-on-write clone the donor's `node_modules` into the worktree. On a
129
- * reflink-capable filesystem (APFS on darwin, btrfs/XFS/etc. on linux) the
130
- * clone is effectively free in both time and disk; the subsequent
131
- * lockfile-match probe in `installDependencies` then skips the per-tree
132
- * install entirely.
133
- *
134
- * Non-fatal by design: any failure (unsupported filesystem, cross-volume
135
- * clone, Windows, missing donor) falls back to `per-worktree` cleanly — the
136
- * worktree is simply left without a cloned `node_modules`, and the regular
137
- * per-tree install runs. Failure NEVER throws; the clone is a fast-path
138
- * optimization, not a correctness requirement.
103
+ * Copy-on-write clone the donor's `node_modules` into the worktree. A fast
104
+ * path only: every failure returns `cloned: false` (never throws) and the
105
+ * regular install runs instead.
139
106
  *
140
107
  * @param {{ config: object, platform: NodeJS.Platform, logger: object, repoRoot: string }} ctx
141
- * @param {string} wtPath Absolute worktree path.
142
- * @param {{ spawnFn?: typeof spawnSync, fsLike?: typeof fs }} [io] Injectable for tests.
108
+ * @param {string} wtPath
109
+ * @param {{ spawnFn?: typeof spawnSync, fsLike?: typeof fs }} [io]
143
110
  * @returns {{ cloned: boolean, reason?: string }}
144
111
  */
145
112
  export function cloneNodeModules(ctx, wtPath, io = {}) {
146
113
  const spawnFn = io.spawnFn ?? spawnSync;
147
114
  const fsLike = io.fsLike ?? fs;
148
- // Key off the real host OS, not the test-injection `ctx.platform`, for the
149
- // capability decision: Windows has no `cp -c`/`--reflink` equivalent here.
115
+ // Real host OS, not `ctx.platform`: Windows has no clone `cp` here.
150
116
  if (process.platform === 'win32') {
151
117
  ctx.logger.info(
152
118
  'worktree.node_modules strategy=clone fallback=per-worktree reason=windows-unsupported',
@@ -165,19 +131,15 @@ export function cloneNodeModules(ctx, wtPath, io = {}) {
165
131
 
166
132
  const target = path.join(wtPath, 'node_modules');
167
133
  if (fsLike.existsSync(target)) {
168
- // A worktree that already carries node_modules must not be clobbered by a
169
- // clone-on-top (cp would nest into the existing dir). Treat as already
170
- // populated and let the install-skip probe decide freshness.
134
+ // cp would nest into an existing dir; let the install-skip probe decide.
171
135
  ctx.logger.info(
172
136
  `worktree.node_modules strategy=clone skip reason=target-exists target=${target}`,
173
137
  );
174
138
  return { cloned: false, reason: 'target-exists' };
175
139
  }
176
140
 
177
- // darwin: `cp -c` requests a clonefile (APFS). linux: `cp --reflink=auto`
178
- // requests a reflink, silently degrading to a full copy on non-reflink
179
- // filesystems — which we deliberately reject below so a slow full-tree copy
180
- // never masquerades as a free clone.
141
+ // `--reflink=always` (not `auto`) so a slow full copy never masquerades as
142
+ // a free clone.
181
143
  const cloneArgs =
182
144
  process.platform === 'darwin'
183
145
  ? ['-c', '-R', donorNodeModules, target]
@@ -189,8 +151,7 @@ export function cloneNodeModules(ctx, wtPath, io = {}) {
189
151
  timeout: 120_000,
190
152
  });
191
153
  if (result.status !== 0) {
192
- // Clean up a partial copy so the per-worktree fallback install starts from
193
- // a known-empty target.
154
+ // Remove a partial copy so the fallback install starts empty.
194
155
  try {
195
156
  fsLike.rmSync(target, { recursive: true, force: true });
196
157
  } catch {
@@ -210,17 +171,11 @@ export function cloneNodeModules(ctx, wtPath, io = {}) {
210
171
  }
211
172
 
212
173
  /**
213
- * Pure: pick the package-manager command + args for a given strategy and
214
- * worktree path. Returns `null` when the strategy is `symlink` (handled
215
- * elsewhere) or the worktree has no `package.json`.
216
- *
217
- * `clone` shares `per-worktree`'s PM-detection: when the install is *not*
218
- * skipped (lockfile mismatch), the worktree still installs with the project's
219
- * detected package manager.
174
+ * Install command for a strategy, or `null` for `symlink` / no `package.json`.
220
175
  *
221
- * @param {string} strategy One of `per-worktree | clone | pnpm-store | symlink`.
222
- * @param {string} wtPath Absolute worktree path.
223
- * @param {{ existsSync: (p: string) => boolean }} [fsLike] Injectable for tests.
176
+ * @param {string} strategy
177
+ * @param {string} wtPath
178
+ * @param {{ existsSync: (p: string) => boolean }} [fsLike]
224
179
  * @returns {{ cmd: string, args: string[] } | null}
225
180
  */
226
181
  export function selectInstallCommand(strategy, wtPath, fsLike = fs) {
@@ -230,8 +185,6 @@ export function selectInstallCommand(strategy, wtPath, fsLike = fs) {
230
185
  if (strategy === 'pnpm-store') {
231
186
  return { cmd: 'pnpm', args: ['install', '--frozen-lockfile'] };
232
187
  }
233
- // Shared lockfile probe (Story #4048 B3 — one implementation per concept).
234
- // `per-worktree` and `clone` both fall through to PM detection here.
235
188
  const pm = detectPackageManager(wtPath, (p) => fsLike.existsSync(p)) ?? 'npm';
236
189
  if (pm === 'pnpm') {
237
190
  return { cmd: 'pnpm', args: ['install', '--frozen-lockfile'] };
@@ -242,13 +195,7 @@ export function selectInstallCommand(strategy, wtPath, fsLike = fs) {
242
195
  return { cmd: 'npm', args: ['ci'] };
243
196
  }
244
197
 
245
- /**
246
- * Per-package-manager "install completed" marker files written into
247
- * `node_modules/` by the install command itself. Their presence (and
248
- * freshness relative to the lockfile) is the cheapest reliable signal that a
249
- * prior install ran to completion — a failed/interrupted install leaves
250
- * `node_modules` partially populated without (or with a stale) marker.
251
- */
198
+ /** Markers a PM writes only once an install completes. */
252
199
  const INSTALL_MARKERS = [
253
200
  '.package-lock.json', // npm ci / npm install
254
201
  '.modules.yaml', // pnpm
@@ -259,14 +206,10 @@ const INSTALL_MARKERS = [
259
206
  const LOCKFILES = ['package-lock.json', 'pnpm-lock.yaml', 'yarn.lock'];
260
207
 
261
208
  /**
262
- * Pure: locate the first present lockfile in `dir` and return its byte-exact
263
- * SHA-256 hash, or `null` when no lockfile exists / cannot be read.
264
- *
265
- * The hash is the load-bearing freshness key for the install-skip decision —
266
- * never an mtime, which clone (clonefile/reflink) does not preserve reliably
267
- * and which is trivially perturbed by a no-op `git checkout`.
209
+ * SHA-256 of the first lockfile in `dir`, or `null`. The freshness key is a
210
+ * content hash, never mtime, which clones and checkouts do not preserve.
268
211
  *
269
- * @param {string} dir Absolute directory containing the lockfile.
212
+ * @param {string} dir
270
213
  * @param {{ existsSync: Function, readFileSync: Function }} [fsLike]
271
214
  * @returns {string | null}
272
215
  */
@@ -284,23 +227,12 @@ export function lockfileHash(dir, fsLike = fs) {
284
227
  }
285
228
 
286
229
  /**
287
- * Pure: the single shared "is the per-tree install skippable?" predicate
288
- * (generalized from `probeReusedInstall`). The install is safe to skip iff:
289
- *
290
- * 1. the worktree carries a completed-install marker
291
- * (`node_modules/<INSTALL_MARKERS>`), AND
292
- * 2. the worktree's lockfile byte-exactly matches the donor's lockfile.
293
- *
294
- * The lockfile match is keyed on a byte-exact SHA-256 hash, NEVER mtime: a
295
- * reflink/clonefile clone does not preserve mtime relationships, so an mtime
296
- * comparison would either mis-skip a real change or force a redundant install
297
- * on every clone. When the donor is omitted (reuse path, no clone donor), the
298
- * worktree's own lockfile is hashed against itself — i.e. the lockfile-match
299
- * leg is vacuously satisfied and only the marker presence gates the skip.
230
+ * The install is skippable iff a completed-install marker exists and the
231
+ * worktree lockfile hash matches the donor's (vacuous with no donor).
300
232
  *
301
233
  * @param {object} opts
302
- * @param {string} opts.wtPath Absolute worktree path.
303
- * @param {string} [opts.donorPath] Absolute donor path (the clone source).
234
+ * @param {string} opts.wtPath
235
+ * @param {string} [opts.donorPath]
304
236
  * @param {{ existsSync: Function, readFileSync: Function }} [opts.fsLike]
305
237
  * @returns {{ skippable: boolean, reason: string }}
306
238
  */
@@ -317,8 +249,6 @@ export function isInstallSkippable({ wtPath, donorPath, fsLike = fs }) {
317
249
  }
318
250
  const wtHash = lockfileHash(wtPath, fsLike);
319
251
  if (wtHash === null) {
320
- // No lockfile in the worktree — nothing to pin freshness against. The
321
- // marker alone is the signal (matches a lockfile-less project).
322
252
  return { skippable: true, reason: 'marker-present-no-lockfile' };
323
253
  }
324
254
  if (donorPath) {
@@ -331,31 +261,15 @@ export function isInstallSkippable({ wtPath, donorPath, fsLike = fs }) {
331
261
  }
332
262
 
333
263
  /**
334
- * Pure: probe whether a **reused** worktree already carries a completed,
335
- * up-to-date install. Worktree reuse must not blindly report
336
- * `skipped/worktree-reused` — when the prior run's install *failed*, that
337
- * status defeats the install retry exactly when it matters
338
- * (`deriveInstallAction('skipped')` treats it as "nothing to do").
264
+ * Whether a reused worktree has a completed install. Reports `failed` rather
265
+ * than a blind `skipped` so a prior failed install is retried.
339
266
  *
340
- * Returns the same shape as `installDependencies`:
341
- * - `{ status: 'skipped', reason: 'worktree-reused' }` — a completed
342
- * install was detected (or the strategy never installs per-tree);
343
- * safe to skip.
344
- * - `{ status: 'failed', reason }` — missing/incomplete install detected;
345
- * callers should retry the install.
346
- *
347
- * Thin wrapper over the shared `isInstallSkippable` predicate (Story #4249 —
348
- * one freshness predicate, keyed on a byte-exact lockfile hash, never mtime).
349
- * The reuse path has no separate donor, so freshness reduces to marker
350
- * presence (the worktree's own lockfile is its own baseline).
351
- *
352
- * @param {string} strategy One of `per-worktree | clone | pnpm-store | symlink`.
353
- * @param {string} wtPath Absolute worktree path.
354
- * @param {{ existsSync: Function, readFileSync: Function }} [fsLike] Injectable for tests.
267
+ * @param {string} strategy
268
+ * @param {string} wtPath
269
+ * @param {{ existsSync: Function, readFileSync: Function }} [fsLike]
355
270
  * @returns {{ status: 'skipped' | 'failed', reason: string }}
356
271
  */
357
272
  export function probeReusedInstall(strategy, wtPath, fsLike = fs) {
358
- // `symlink` re-points node_modules at a donor — no per-tree install to probe.
359
273
  if (strategy === 'symlink') {
360
274
  return { status: 'skipped', reason: 'worktree-reused' };
361
275
  }
@@ -375,16 +289,7 @@ export function probeReusedInstall(strategy, wtPath, fsLike = fs) {
375
289
  };
376
290
  }
377
291
 
378
- /**
379
- * Pure: retry policy keyed off the chosen command. pnpm gets 3× + 5min.
380
- *
381
- * Story #4249: npm/yarn now get a real `maxAttempts` of 2 (was 1). The
382
- * formerly hardcoded `npm ci` retry inside `runStoryInitPrepare` was deleted
383
- * in the same change; this in-`ensure` retry budget is what compensates so
384
- * npm install reliability does not regress — a transient first-attempt
385
- * failure now retries here, with the correct (PM-detected) command, instead
386
- * of an unconditional `npm ci` re-run after init.
387
- */
292
+ /** Retry policy per command; this is the only install retry. */
388
293
  export function installRetryPolicy(cmd) {
389
294
  const isPnpm = cmd === 'pnpm';
390
295
  return {
@@ -404,20 +309,9 @@ export function describeAttemptFailure(result, timeoutMs) {
404
309
  const PNPM_STORE_PRIME_SENTINEL = path.join('temp', '.pnpm-store-primed');
405
310
 
406
311
  /**
407
- * Pure: one-time per-machine pnpm content-addressable-store prime.
408
- *
409
- * The `pnpm-store` strategy relies on a hydrated shared store. On a cold
410
- * machine the first `pnpm install --frozen-lockfile` inside a worktree races
411
- * other workers, and the per-tree retries can all hit the same un-populated
412
- * store and exhaust without any single attempt succeeding. Priming the store
413
- * once at `repoRoot` (where the lockfile lives) before any worktree install
414
- * eliminates that class of transient failure.
415
- *
416
- * The sentinel is a zero-byte file under `<repoRoot>/temp/`. The directory
417
- * lives outside Git (the project's standard scratch root) so the sentinel
418
- * persists across worktrees on the same machine but never ships to commits.
419
- *
420
- * No-op for strategies other than `pnpm-store`.
312
+ * Prime the shared pnpm store once per machine (sentinel under `temp/`): on a
313
+ * cold store, concurrent worktree installs can exhaust their retries racing
314
+ * each other.
421
315
  *
422
316
  * @returns {{ primed: 'primed' | 'cached' | 'failed' | 'skipped', reason?: string }}
423
317
  */
@@ -469,8 +363,7 @@ function primePnpmStore({
469
363
  }
470
364
 
471
365
  /**
472
- * Run the package-manager install with the configured retry policy. Pure
473
- * w.r.t. `spawnFn` + `sleepFn` — the CLI wires real ones; tests inject stubs.
366
+ * Run the install under the retry policy.
474
367
  *
475
368
  * @returns {{ ok: boolean, attempts: number, lastResult: object }}
476
369
  */
@@ -517,24 +410,11 @@ export function runInstallWithRetry({
517
410
  }
518
411
 
519
412
  /**
520
- * Run the appropriate package-manager install inside a freshly created
521
- * worktree. Non-fatal: logs a warning on failure so the agent can retry.
522
- *
523
- * Return shape:
524
- * - `{ status: 'installed' }` — per-worktree install succeeded.
525
- * - `{ status: 'failed', reason }` — per-worktree install attempted and
526
- * failed (or finished 0 but produced
527
- * no `node_modules/`).
528
- * - `{ status: 'skipped', reason }` — strategy intentionally skips a
529
- * per-worktree install. Covers
530
- * `symlink` (donor `node_modules` is
531
- * re-pointed), `pnpm-store` (relies
532
- * on the shared content-addressable
533
- * store), and the no-`package.json`
534
- * case.
413
+ * Failure verdict for an install run (non-zero exit, or exit 0 without
414
+ * `node_modules`), or `null` on success.
535
415
  *
536
416
  * @param {{ config: object, platform: NodeJS.Platform, logger: object }} ctx
537
- * @param {string} wtPath Absolute worktree path.
417
+ * @param {string} wtPath
538
418
  * @returns {{ status: 'installed' | 'failed' | 'skipped', reason?: string }}
539
419
  */
540
420
  function verifyInstallOutcome(ctx, wtPath, selection, run, policy) {
@@ -564,7 +444,6 @@ function verifyInstallOutcome(ctx, wtPath, selection, run, policy) {
564
444
 
565
445
  export function installDependencies(ctx, wtPath) {
566
446
  const strategy = ctx.config.nodeModulesStrategy ?? 'per-worktree';
567
- // `symlink` re-points node_modules at a donor — no install command runs.
568
447
  if (strategy === 'symlink') {
569
448
  return { status: 'skipped', reason: 'symlink-strategy' };
570
449
  }
@@ -572,13 +451,6 @@ export function installDependencies(ctx, wtPath) {
572
451
  if (selection === null) {
573
452
  return { status: 'skipped', reason: 'no-package-json' };
574
453
  }
575
- // `clone` reflink-clones the donor's node_modules in `applyNodeModulesStrategy`.
576
- // When the cloned tree carries a completed-install marker AND the worktree's
577
- // lockfile byte-matches the donor's, the per-tree install is pure waste —
578
- // skip it. The freshness predicate is the single shared `isInstallSkippable`
579
- // (byte-exact lockfile hash, never mtime). On a lockfile mismatch (donor
580
- // drifted, or no clone happened) this returns false and the install below
581
- // runs normally.
582
454
  if (strategy === 'clone') {
583
455
  const donor = resolveCloneDonor(ctx);
584
456
  const probe = isInstallSkippable({ wtPath, donorPath: donor });
@@ -592,10 +464,7 @@ export function installDependencies(ctx, wtPath) {
592
464
  `worktree.install strategy=clone install reason=${probe.reason} path=${wtPath}`,
593
465
  );
594
466
  }
595
- // Prime the pnpm content-addressable store once per machine before the
596
- // worktree's own install runs. No-op for non-pnpm-store strategies. Prime
597
- // failures are surfaced as warnings but do not short-circuit the install —
598
- // the retry ladder below still gets its full budget of attempts.
467
+ // A failed prime only warns; the install keeps its full retry budget.
599
468
  if (strategy === 'pnpm-store' && ctx.repoRoot) {
600
469
  primePnpmStore({
601
470
  strategy,
@@ -618,10 +487,7 @@ export function installDependencies(ctx, wtPath) {
618
487
  });
619
488
  const verdict = verifyInstallOutcome(ctx, wtPath, selection, run, policy);
620
489
  if (verdict) return verdict;
621
- // `pnpm-store` runs `pnpm install --frozen-lockfile`, but the resulting
622
- // node_modules is backed by a shared content-addressable store rather
623
- // than a self-contained tree. Report `skipped` so the workflow treats
624
- // dependency state as N/A and trusts the strategy.
490
+ // Store-backed, not self-contained: report `skipped` (dependency state N/A).
625
491
  if (strategy === 'pnpm-store') {
626
492
  return { status: 'skipped', reason: 'pnpm-store-strategy' };
627
493
  }
@@ -1,20 +1,8 @@
1
1
  /**
2
- * WorktreeManager — single authority over per-story git worktrees.
3
- *
4
- * This file is a thin facade over `lib/worktree/*`:
5
- * - `lib/worktree/lifecycle-manager.js` — ensure / reap / list / gc / prune.
6
- * - `lib/worktree/node-modules-strategy.js` — per-worktree / symlink / pnpm-store.
7
- * - `lib/worktree/bootstrapper.js` — bootstrap-file copy.
8
- * - `lib/worktree/inspector.js` — pure path + porcelain parsing helpers.
9
- *
10
- * External callers import `WorktreeManager` and `parseWorktreePorcelain` from
11
- * this module path; those exports are preserved verbatim so no other file in
12
- * the repo needs to change.
13
- *
14
- * No other script may call `git worktree` directly. All git calls flow
15
- * through the injected `ctx.git` (defaults to `./git-utils.js`). Paths are
16
- * resolved and asserted to live inside `repoRoot`, and callers cannot request
17
- * force removal; bounded internal fallbacks live in the lifecycle module.
2
+ * WorktreeManager — the single authority over per-story git worktrees, a
3
+ * facade over `lib/worktree/*`. No other script may call `git worktree`.
4
+ * Paths are asserted inside `repoRoot` and callers cannot request force
5
+ * removal.
18
6
  */
19
7
 
20
8
  import path from 'node:path';
@@ -46,16 +34,13 @@ export { parseWorktreePorcelain };
46
34
  export class WorktreeManager {
47
35
  /**
48
36
  * @param {object} opts
49
- * @param {string} opts.repoRoot Absolute path to the main repo.
37
+ * @param {string} opts.repoRoot
50
38
  * @param {object} [opts.config] Resolved `orchestration.worktreeIsolation` config.
51
- * @param {object} [opts.logger] Logger with info/warn/error (defaults to console-style).
52
- * @param {object} [opts.git] Injected `{ gitSync, gitSpawn }` (defaults to git-utils).
53
- * @param {NodeJS.Platform} [opts.platform] Defaults to `process.platform`.
39
+ * @param {object} [opts.logger]
40
+ * @param {object} [opts.git] Injected `{ gitSync, gitSpawn }`.
41
+ * @param {NodeJS.Platform} [opts.platform]
54
42
  * @param {(phase: 'worktree-create'|'bootstrap'|'install') => void} [opts.onPhase]
55
- * Optional phase-boundary callback fired from `ensure()` just before each
56
- * internal phase (git worktree add, bootstrap-file copy, dependency
57
- * install), so a caller can attribute wall-clock to the sub-phases of
58
- * worktree provisioning.
43
+ * Fired before each `ensure()` phase, for wall-clock attribution.
59
44
  */
60
45
  constructor({
61
46
  repoRoot,
@@ -101,9 +86,7 @@ export class WorktreeManager {
101
86
  }
102
87
 
103
88
  /**
104
- * Build the context bag shared by every lifecycle helper. Regenerated on
105
- * each call so mutating `this.config` between calls is respected, but the
106
- * cache slot is a stable object so all helpers see the same list.
89
+ * Rebuilt per call so config mutations are seen; the cache slot is stable.
107
90
  */
108
91
  _ctx() {
109
92
  return {
@@ -120,9 +103,7 @@ export class WorktreeManager {
120
103
  maybeWarnWindowsPath(
121
104
  {
122
105
  platform: this.platform,
123
- // Hardcoded post-reshape (Epic #1720 Story #1739). The value
124
- // tracks Windows MAX_PATH minus headroom for the worktree's own
125
- // path overhead — not a domain knob operators tune.
106
+ // Windows MAX_PATH minus headroom; not an operator knob.
126
107
  threshold: 240,
127
108
  logger: this.logger,
128
109
  },
@@ -177,23 +158,20 @@ export class WorktreeManager {
177
158
  };
178
159
  }
179
160
 
180
- /** Absolute path for a given storyId. */
181
161
  pathFor(storyId) {
182
162
  return pathFor(this._ctx(), storyId);
183
163
  }
184
164
 
185
165
  /**
186
- * True when this manager was constructed with `config.enabled === false`.
187
- * The mutating lifecycle methods (`ensure`, `reap`, `gc`, `sweepStaleLocks`)
188
- * short-circuit to no-op shapes in that case so the off-branch never
189
- * touches fs or git regardless of caller-side gating drift.
166
+ * When disabled, mutating methods return no-op shapes and never touch fs or
167
+ * git, whatever the caller's gating.
190
168
  */
191
169
  _isDisabled() {
192
170
  return this.config?.enabled === false;
193
171
  }
194
172
 
195
173
  /**
196
- * Idempotently ensure a worktree exists at `.worktrees/story-<id>/` on `branch`.
174
+ * Idempotent.
197
175
  *
198
176
  * @param {number|string} storyId
199
177
  * @param {string} branch
@@ -210,22 +188,19 @@ export class WorktreeManager {
210
188
  return ensure(this._ctx(), storyId, branch);
211
189
  }
212
190
 
213
- /** Enumerate all worktrees known to git. */
214
191
  list() {
215
192
  return list(this._ctx());
216
193
  }
217
194
 
218
- /** Check whether a worktree is safe to remove. */
219
195
  isSafeToRemove(wtPath, opts) {
220
196
  return isSafeToRemove(this._ctx(), wtPath, opts);
221
197
  }
222
198
 
223
- /** Prune stale git worktree registrations for directories that no longer exist. */
224
199
  prune() {
225
200
  return prune(this._ctx());
226
201
  }
227
202
 
228
- /** Remove the worktree for a given storyId. Rejects caller-requested force. */
203
+ /** Rejects caller-requested force. */
229
204
  reap(storyId, opts) {
230
205
  if (this._isDisabled()) {
231
206
  return {