mandrel 2.60.0 → 2.61.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (661) hide show
  1. package/.agents/README.md +10 -10
  2. package/.agents/agents/story-worker.md +1 -1
  3. package/.agents/docs/agentrc-reference.json +4 -82
  4. package/.agents/docs/configuration.md +20 -87
  5. package/.agents/docs/workflows.md +1 -1
  6. package/.agents/instructions.md +1 -3
  7. package/.agents/rules/gherkin-standards.md +4 -0
  8. package/.agents/schemas/agentrc.schema.json +11 -486
  9. package/.agents/schemas/story-deliver-terminal.schema.json +10 -0
  10. package/.agents/schemas/validation-evidence.schema.json +2 -1
  11. package/.agents/scripts/README.md +14 -14
  12. package/.agents/scripts/acceptance-eval.js +32 -164
  13. package/.agents/scripts/agents-bootstrap-github.js +27 -129
  14. package/.agents/scripts/apply-quality-bootstrap.js +4 -40
  15. package/.agents/scripts/audit-baselines.js +6 -27
  16. package/.agents/scripts/audit-labels-bootstrap.js +5 -29
  17. package/.agents/scripts/audit-to-stories.js +91 -361
  18. package/.agents/scripts/boot-sweep.js +19 -72
  19. package/.agents/scripts/bootstrap.js +74 -395
  20. package/.agents/scripts/ceremony-derive.js +9 -45
  21. package/.agents/scripts/check-arch-cycles.js +14 -64
  22. package/.agents/scripts/check-baselines.js +8 -48
  23. package/.agents/scripts/check-context-budget.js +46 -172
  24. package/.agents/scripts/check-cyclomatic.js +12 -44
  25. package/.agents/scripts/check-dead-exports.js +13 -64
  26. package/.agents/scripts/check-doc-links.js +38 -186
  27. package/.agents/scripts/check-gherkin-corpus.js +24 -127
  28. package/.agents/scripts/check-test-temp-hygiene.js +28 -169
  29. package/.agents/scripts/coverage-capture.js +32 -99
  30. package/.agents/scripts/deliver-light.js +14 -101
  31. package/.agents/scripts/deliver-recover.js +6 -42
  32. package/.agents/scripts/deliver-run.js +36 -133
  33. package/.agents/scripts/diagnose-friction.js +24 -116
  34. package/.agents/scripts/drain-pending-cleanup.js +1 -1
  35. package/.agents/scripts/evidence-gate.js +23 -85
  36. package/.agents/scripts/file-ci-gap.js +10 -50
  37. package/.agents/scripts/generate-config-docs.js +30 -170
  38. package/.agents/scripts/generate-lens-checklists.js +8 -52
  39. package/.agents/scripts/generate-skills-index.js +14 -112
  40. package/.agents/scripts/generate-workflows-doc.js +10 -70
  41. package/.agents/scripts/git-cleanup.js +2 -34
  42. package/.agents/scripts/lib/Graph.js +24 -81
  43. package/.agents/scripts/lib/ITicketingProvider.js +47 -143
  44. package/.agents/scripts/lib/Logger.js +14 -76
  45. package/.agents/scripts/lib/audit-baselines/engine.js +11 -31
  46. package/.agents/scripts/lib/audit-baselines/gate-surface.js +3 -17
  47. package/.agents/scripts/lib/audit-baselines/headroom.js +4 -20
  48. package/.agents/scripts/lib/audit-baselines/hotspots.js +3 -15
  49. package/.agents/scripts/lib/audit-baselines/kinds.js +23 -89
  50. package/.agents/scripts/lib/audit-baselines/outliers.js +6 -23
  51. package/.agents/scripts/lib/audit-baselines/read.js +3 -16
  52. package/.agents/scripts/lib/audit-baselines/staleness.js +7 -26
  53. package/.agents/scripts/lib/audit-baselines/surface-entry.js +7 -28
  54. package/.agents/scripts/lib/audit-baselines/trend.js +7 -20
  55. package/.agents/scripts/lib/audit-baselines/weights.js +9 -37
  56. package/.agents/scripts/lib/audit-suite/audit-rules-reader.js +3 -18
  57. package/.agents/scripts/lib/audit-suite/checklist-threading.js +26 -124
  58. package/.agents/scripts/lib/audit-suite/dispatch-checklist.js +14 -45
  59. package/.agents/scripts/lib/audit-suite/findings.js +12 -52
  60. package/.agents/scripts/lib/audit-suite/frontmatter.js +5 -29
  61. package/.agents/scripts/lib/audit-suite/index.js +1 -15
  62. package/.agents/scripts/lib/audit-suite/lens-checklist.js +10 -45
  63. package/.agents/scripts/lib/audit-suite/lens-diff-floor.js +11 -76
  64. package/.agents/scripts/lib/audit-suite/runner.js +13 -43
  65. package/.agents/scripts/lib/audit-suite/selector.js +49 -349
  66. package/.agents/scripts/lib/audit-suite/substitutions.js +12 -40
  67. package/.agents/scripts/lib/audit-suite/workflow-loader.js +3 -15
  68. package/.agents/scripts/lib/audit-to-stories/audit-label-taxonomy.js +11 -73
  69. package/.agents/scripts/lib/audit-to-stories/audit-lenses.js +8 -37
  70. package/.agents/scripts/lib/audit-to-stories/build-story-body.js +25 -143
  71. package/.agents/scripts/lib/audit-to-stories/dedupe-against-github.js +14 -80
  72. package/.agents/scripts/lib/audit-to-stories/epic-grouping-directive.js +4 -18
  73. package/.agents/scripts/lib/audit-to-stories/finding-adapter.js +7 -40
  74. package/.agents/scripts/lib/audit-to-stories/group-findings.js +9 -39
  75. package/.agents/scripts/lib/audit-to-stories/issue-corpus.js +10 -66
  76. package/.agents/scripts/lib/audit-to-stories/issue-index.js +6 -30
  77. package/.agents/scripts/lib/audit-to-stories/issues-file.js +6 -36
  78. package/.agents/scripts/lib/audit-to-stories/ledger-commit.js +17 -69
  79. package/.agents/scripts/lib/audit-to-stories/ledger-pr.js +17 -85
  80. package/.agents/scripts/lib/audit-to-stories/ledger-record.js +10 -48
  81. package/.agents/scripts/lib/audit-to-stories/parse-audit-md.js +38 -146
  82. package/.agents/scripts/lib/audit-to-stories/seed-from-findings.js +7 -42
  83. package/.agents/scripts/lib/audit-to-stories/wire-dependencies.js +10 -57
  84. package/.agents/scripts/lib/baseline-loader.js +12 -51
  85. package/.agents/scripts/lib/baseline-schema-registry.js +5 -22
  86. package/.agents/scripts/lib/baselines/component-matcher.js +3 -12
  87. package/.agents/scripts/lib/baselines/components.js +10 -61
  88. package/.agents/scripts/lib/baselines/coverage-updater-cli.js +7 -36
  89. package/.agents/scripts/lib/baselines/crap-preview-incremental.js +5 -21
  90. package/.agents/scripts/lib/baselines/crap-preview-scan.js +19 -45
  91. package/.agents/scripts/lib/baselines/crap-updater-cli.js +16 -65
  92. package/.agents/scripts/lib/baselines/diff-scope-cli.js +5 -33
  93. package/.agents/scripts/lib/baselines/duplication-scanner.js +11 -60
  94. package/.agents/scripts/lib/baselines/env-overrides.js +12 -67
  95. package/.agents/scripts/lib/baselines/envelope.js +13 -129
  96. package/.agents/scripts/lib/baselines/exit-codes.js +6 -49
  97. package/.agents/scripts/lib/baselines/git-base.js +23 -142
  98. package/.agents/scripts/lib/baselines/kernel.js +11 -111
  99. package/.agents/scripts/lib/baselines/kinds/_crap-new-method-gate.js +9 -47
  100. package/.agents/scripts/lib/baselines/kinds/_crap-read.js +8 -51
  101. package/.agents/scripts/lib/baselines/kinds/_shared-metric.js +7 -62
  102. package/.agents/scripts/lib/baselines/kinds/bundle-size.js +8 -29
  103. package/.agents/scripts/lib/baselines/kinds/coverage.js +3 -15
  104. package/.agents/scripts/lib/baselines/kinds/crap.js +94 -415
  105. package/.agents/scripts/lib/baselines/kinds/duplication.js +4 -30
  106. package/.agents/scripts/lib/baselines/kinds/kind-factory.js +7 -53
  107. package/.agents/scripts/lib/baselines/kinds/maintainability.js +15 -80
  108. package/.agents/scripts/lib/baselines/kinds/mutation.js +12 -72
  109. package/.agents/scripts/lib/baselines/maintainability-baseline-io.js +4 -11
  110. package/.agents/scripts/lib/baselines/merge-envelopes.js +30 -146
  111. package/.agents/scripts/lib/baselines/path-canon.js +19 -128
  112. package/.agents/scripts/lib/baselines/preview-gates.js +8 -37
  113. package/.agents/scripts/lib/baselines/reader.js +14 -107
  114. package/.agents/scripts/lib/baselines/refresh-service.js +35 -252
  115. package/.agents/scripts/lib/baselines/scope.js +11 -135
  116. package/.agents/scripts/lib/baselines/writer.js +16 -149
  117. package/.agents/scripts/lib/bdd-runner-detect.js +18 -113
  118. package/.agents/scripts/lib/bdd-scenario-budget.js +9 -36
  119. package/.agents/scripts/lib/bdd-scenario-scanner.js +11 -73
  120. package/.agents/scripts/lib/bdd-step-index.js +26 -100
  121. package/.agents/scripts/lib/bootstrap/baseline-merge-driver.js +23 -103
  122. package/.agents/scripts/lib/bootstrap/branch-protection.js +2 -5
  123. package/.agents/scripts/lib/bootstrap/commit-push.js +12 -50
  124. package/.agents/scripts/lib/bootstrap/gh-preflight.js +14 -101
  125. package/.agents/scripts/lib/bootstrap/hitl-confirm.js +5 -30
  126. package/.agents/scripts/lib/bootstrap/install-ledger.js +17 -73
  127. package/.agents/scripts/lib/bootstrap/issue-forms-template.js +17 -121
  128. package/.agents/scripts/lib/bootstrap/manifest.js +15 -86
  129. package/.agents/scripts/lib/bootstrap/merge-methods.js +4 -33
  130. package/.agents/scripts/lib/bootstrap/preflight.js +12 -61
  131. package/.agents/scripts/lib/bootstrap/project-bootstrap.js +34 -235
  132. package/.agents/scripts/lib/bootstrap/prompt.js +21 -129
  133. package/.agents/scripts/lib/bootstrap/quality-bootstrap.js +27 -141
  134. package/.agents/scripts/lib/bootstrap/summary.js +1 -8
  135. package/.agents/scripts/lib/bootstrap/workflow-audit.js +11 -84
  136. package/.agents/scripts/lib/branch-name-guard.js +4 -23
  137. package/.agents/scripts/lib/changed-files.js +31 -143
  138. package/.agents/scripts/lib/checks/core-bare-clean.js +4 -24
  139. package/.agents/scripts/lib/checks/index.js +18 -101
  140. package/.agents/scripts/lib/checks/loop-health.js +11 -53
  141. package/.agents/scripts/lib/checks/state.js +16 -91
  142. package/.agents/scripts/lib/checks/story-init-not-backgrounded.js +10 -61
  143. package/.agents/scripts/lib/checks/subagent-agent-tool-required.js +14 -83
  144. package/.agents/scripts/lib/child-exec.js +39 -108
  145. package/.agents/scripts/lib/cli/standard-args.js +9 -116
  146. package/.agents/scripts/lib/cli-args.js +31 -146
  147. package/.agents/scripts/lib/cli-usage.js +5 -27
  148. package/.agents/scripts/lib/cli-utils.js +2 -12
  149. package/.agents/scripts/lib/close-validation/commands.js +13 -76
  150. package/.agents/scripts/lib/close-validation/gates.js +92 -331
  151. package/.agents/scripts/lib/close-validation/process.js +121 -151
  152. package/.agents/scripts/lib/close-validation/projections/advisories.js +5 -31
  153. package/.agents/scripts/lib/close-validation/projections/crap.js +19 -67
  154. package/.agents/scripts/lib/close-validation/projections/head-sha.js +1 -17
  155. package/.agents/scripts/lib/close-validation/projections/inputs.js +4 -34
  156. package/.agents/scripts/lib/close-validation/projections/maintainability.js +11 -58
  157. package/.agents/scripts/lib/close-validation/runner.js +53 -110
  158. package/.agents/scripts/lib/command-header.js +6 -28
  159. package/.agents/scripts/lib/config/acceptance-eval.js +4 -30
  160. package/.agents/scripts/lib/config/baselines.js +3 -14
  161. package/.agents/scripts/lib/config/ci.js +8 -38
  162. package/.agents/scripts/lib/config/commands.js +1 -15
  163. package/.agents/scripts/lib/config/defaults.js +4 -33
  164. package/.agents/scripts/lib/config/delivery-routing.js +6 -35
  165. package/.agents/scripts/lib/config/explain.js +9 -80
  166. package/.agents/scripts/lib/config/gates/coverage.schema.js +0 -12
  167. package/.agents/scripts/lib/config/gates/crap-incremental-coverage.schema.js +2 -30
  168. package/.agents/scripts/lib/config/gates/crap.schema.js +1 -34
  169. package/.agents/scripts/lib/config/gates/duplication.schema.js +1 -8
  170. package/.agents/scripts/lib/config/gates/index.js +2 -17
  171. package/.agents/scripts/lib/config/gates/maintainability.schema.js +1 -20
  172. package/.agents/scripts/lib/config/gates/mutation.schema.js +1 -7
  173. package/.agents/scripts/lib/config/gates/shared.js +4 -64
  174. package/.agents/scripts/lib/config/github.js +4 -22
  175. package/.agents/scripts/lib/config/limits.js +4 -57
  176. package/.agents/scripts/lib/config/paths.js +2 -21
  177. package/.agents/scripts/lib/config/qa.js +4 -38
  178. package/.agents/scripts/lib/config/quality.js +76 -432
  179. package/.agents/scripts/lib/config/runners.js +12 -56
  180. package/.agents/scripts/lib/config/runtime.js +13 -57
  181. package/.agents/scripts/lib/config/shared.js +2 -16
  182. package/.agents/scripts/lib/config/sync-agentrc.js +9 -50
  183. package/.agents/scripts/lib/config/temp-paths.js +40 -280
  184. package/.agents/scripts/lib/config/validate-orchestration.js +5 -17
  185. package/.agents/scripts/lib/config/worktree-isolation.js +9 -28
  186. package/.agents/scripts/lib/config-resolver.js +10 -52
  187. package/.agents/scripts/lib/config-schema-shared.js +1 -4
  188. package/.agents/scripts/lib/config-settings-schema-delivery.js +12 -294
  189. package/.agents/scripts/lib/config-settings-schema-quality.js +7 -219
  190. package/.agents/scripts/lib/config-settings-schema.js +37 -274
  191. package/.agents/scripts/lib/coverage-baseline.js +20 -110
  192. package/.agents/scripts/lib/coverage-capture-fullscope.js +12 -37
  193. package/.agents/scripts/lib/coverage-capture-incremental.js +12 -43
  194. package/.agents/scripts/lib/coverage-capture-usage.js +4 -24
  195. package/.agents/scripts/lib/coverage-capture.js +99 -224
  196. package/.agents/scripts/lib/coverage-utils.js +14 -79
  197. package/.agents/scripts/lib/cpu-pool.js +17 -123
  198. package/.agents/scripts/lib/crap-baseline-join.js +16 -88
  199. package/.agents/scripts/lib/crap-coordinates.js +6 -25
  200. package/.agents/scripts/lib/crap-engine.js +40 -153
  201. package/.agents/scripts/lib/crap-method-identity.js +16 -78
  202. package/.agents/scripts/lib/crap-utils.js +31 -155
  203. package/.agents/scripts/lib/cyclomatic-ceiling.js +14 -87
  204. package/.agents/scripts/lib/cyclomatic-scope.js +10 -50
  205. package/.agents/scripts/lib/dead-exports-knip.js +18 -56
  206. package/.agents/scripts/lib/dead-exports-mode.js +5 -24
  207. package/.agents/scripts/lib/degraded-mode.js +3 -26
  208. package/.agents/scripts/lib/dependency-parser.js +8 -40
  209. package/.agents/scripts/lib/dependency-version.js +13 -35
  210. package/.agents/scripts/lib/detect-package-manager.js +6 -36
  211. package/.agents/scripts/lib/doc-tiers.js +22 -126
  212. package/.agents/scripts/lib/duplicate-search.js +8 -72
  213. package/.agents/scripts/lib/env-loader.js +5 -27
  214. package/.agents/scripts/lib/error-redactor.js +6 -31
  215. package/.agents/scripts/lib/errors/index.js +2 -22
  216. package/.agents/scripts/lib/escomplex-ast-compat.js +22 -163
  217. package/.agents/scripts/lib/escomplex-kernel.js +21 -123
  218. package/.agents/scripts/lib/feedback-loop/graduator-core.js +93 -419
  219. package/.agents/scripts/lib/feedback-loop/prior-feedback-fetcher.js +20 -98
  220. package/.agents/scripts/lib/feedback-loop/retro-proposals-graduator.js +27 -151
  221. package/.agents/scripts/lib/findings/audit-ledger.js +23 -97
  222. package/.agents/scripts/lib/findings/classify-finding.js +14 -69
  223. package/.agents/scripts/lib/findings/promote-finding.js +14 -112
  224. package/.agents/scripts/lib/findings/provenance-field.js +11 -52
  225. package/.agents/scripts/lib/findings/route-finding.js +37 -255
  226. package/.agents/scripts/lib/findings/semantic-issue-search.js +14 -59
  227. package/.agents/scripts/lib/findings/severity.js +18 -104
  228. package/.agents/scripts/lib/format-generated-json.js +12 -44
  229. package/.agents/scripts/lib/full-suite-lock.js +160 -429
  230. package/.agents/scripts/lib/full-suite-queue.js +213 -0
  231. package/.agents/scripts/lib/gates/baseline-store.js +5 -9
  232. package/.agents/scripts/lib/gates/friction.js +1 -3
  233. package/.agents/scripts/lib/generated/agentrc-validator.js +2 -2
  234. package/.agents/scripts/lib/gh-exec.js +31 -259
  235. package/.agents/scripts/lib/git/cached-fetch.js +9 -52
  236. package/.agents/scripts/lib/git/sync-from-base.js +15 -107
  237. package/.agents/scripts/lib/git-branch-cleanup.js +14 -61
  238. package/.agents/scripts/lib/git-branch-lifecycle.js +16 -87
  239. package/.agents/scripts/lib/git-utils.js +37 -161
  240. package/.agents/scripts/lib/github/framework-repo.js +8 -71
  241. package/.agents/scripts/lib/github-url.js +2 -17
  242. package/.agents/scripts/lib/import-graph.js +11 -38
  243. package/.agents/scripts/lib/install-cmd-parser.js +4 -13
  244. package/.agents/scripts/lib/json-utils.js +3 -18
  245. package/.agents/scripts/lib/label-constants.js +16 -111
  246. package/.agents/scripts/lib/label-taxonomy.js +4 -30
  247. package/.agents/scripts/lib/maintainability-engine.js +12 -80
  248. package/.agents/scripts/lib/maintainability-unscorable.js +5 -25
  249. package/.agents/scripts/lib/maintainability-utils.js +16 -92
  250. package/.agents/scripts/lib/mandrel-catalog.js +12 -70
  251. package/.agents/scripts/lib/notifications/notifier.js +13 -38
  252. package/.agents/scripts/lib/npm-scripts.js +4 -23
  253. package/.agents/scripts/lib/observability/metrics-ledger.js +16 -76
  254. package/.agents/scripts/lib/observability/runtime-friction.js +44 -286
  255. package/.agents/scripts/lib/observability/signal-validator.js +5 -37
  256. package/.agents/scripts/lib/observability/signals-writer.js +11 -121
  257. package/.agents/scripts/lib/observability/source-classifier.js +21 -203
  258. package/.agents/scripts/lib/observability/terse-result.js +14 -47
  259. package/.agents/scripts/lib/onboard/init-tail.js +13 -74
  260. package/.agents/scripts/lib/onboard/scaffold-docs.js +11 -34
  261. package/.agents/scripts/lib/orchestration/acceptance-eval-decision.js +25 -139
  262. package/.agents/scripts/lib/orchestration/auto-merge-cwd.js +11 -66
  263. package/.agents/scripts/lib/orchestration/behind-recovery.js +10 -55
  264. package/.agents/scripts/lib/orchestration/ceremony-routing.js +5 -75
  265. package/.agents/scripts/lib/orchestration/change-set.js +7 -36
  266. package/.agents/scripts/lib/orchestration/check-baselines/phases/compare.js +9 -46
  267. package/.agents/scripts/lib/orchestration/check-baselines/phases/evaluate.js +11 -44
  268. package/.agents/scripts/lib/orchestration/check-baselines/phases/floors.js +5 -24
  269. package/.agents/scripts/lib/orchestration/check-baselines/phases/friction.js +3 -12
  270. package/.agents/scripts/lib/orchestration/check-baselines/phases/parse-args.js +5 -38
  271. package/.agents/scripts/lib/orchestration/check-baselines/phases/pipeline.js +3 -8
  272. package/.agents/scripts/lib/orchestration/check-baselines/phases/refresh-ack.js +28 -136
  273. package/.agents/scripts/lib/orchestration/check-baselines/phases/report.js +3 -13
  274. package/.agents/scripts/lib/orchestration/check-state.js +92 -0
  275. package/.agents/scripts/lib/orchestration/ci-gap-intake.js +37 -144
  276. package/.agents/scripts/lib/orchestration/ci-rerun-guard.js +42 -189
  277. package/.agents/scripts/lib/orchestration/code-review.js +24 -128
  278. package/.agents/scripts/lib/orchestration/column-sync.js +23 -111
  279. package/.agents/scripts/lib/orchestration/complexity-gate.js +42 -214
  280. package/.agents/scripts/lib/orchestration/deliver-recover.js +36 -168
  281. package/.agents/scripts/lib/orchestration/dependency-analyzer.js +4 -35
  282. package/.agents/scripts/lib/orchestration/dependency-candidates.js +9 -41
  283. package/.agents/scripts/lib/orchestration/diff-magnitude.js +25 -115
  284. package/.agents/scripts/lib/orchestration/doc-reader.js +2 -6
  285. package/.agents/scripts/lib/orchestration/docs-digest.js +13 -51
  286. package/.agents/scripts/lib/orchestration/epic-candidates.js +13 -53
  287. package/.agents/scripts/lib/orchestration/epic-checklist.js +9 -33
  288. package/.agents/scripts/lib/orchestration/epic-container.js +41 -167
  289. package/.agents/scripts/lib/orchestration/epic-expansion.js +10 -40
  290. package/.agents/scripts/lib/orchestration/epic-rollup.js +55 -207
  291. package/.agents/scripts/lib/orchestration/file-assumption-enum.js +2 -22
  292. package/.agents/scripts/lib/orchestration/file-assumptions.js +45 -253
  293. package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-detect.js +9 -46
  294. package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-reap.js +7 -57
  295. package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches.js +21 -126
  296. package/.agents/scripts/lib/orchestration/git-cleanup/phases/cli.js +2 -6
  297. package/.agents/scripts/lib/orchestration/git-cleanup/phases/fast-forward.js +1 -4
  298. package/.agents/scripts/lib/orchestration/git-cleanup/phases/filters.js +1 -5
  299. package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes-ff.js +9 -34
  300. package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes.js +41 -190
  301. package/.agents/scripts/lib/orchestration/git-cleanup/phases/merged-tip.js +9 -45
  302. package/.agents/scripts/lib/orchestration/git-cleanup/phases/parse-args.js +1 -4
  303. package/.agents/scripts/lib/orchestration/git-cleanup/phases/phase-drivers.js +19 -85
  304. package/.agents/scripts/lib/orchestration/git-cleanup/phases/prompts.js +3 -17
  305. package/.agents/scripts/lib/orchestration/git-cleanup/phases/prune.js +1 -5
  306. package/.agents/scripts/lib/orchestration/git-cleanup/phases/render.js +16 -100
  307. package/.agents/scripts/lib/orchestration/git-cleanup/phases/stashes.js +1 -4
  308. package/.agents/scripts/lib/orchestration/lease-guard-shared.js +16 -67
  309. package/.agents/scripts/lib/orchestration/lifecycle/emit-ledger-event.js +9 -33
  310. package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-flip-failed.js +8 -29
  311. package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-unlanded.js +15 -68
  312. package/.agents/scripts/lib/orchestration/light-backstop.js +11 -49
  313. package/.agents/scripts/lib/orchestration/light-escalation.js +21 -89
  314. package/.agents/scripts/lib/orchestration/light-suitability.js +26 -231
  315. package/.agents/scripts/lib/orchestration/merge-block-class.js +39 -216
  316. package/.agents/scripts/lib/orchestration/merge-poll.js +104 -377
  317. package/.agents/scripts/lib/orchestration/pinned-identifier-lint.js +17 -57
  318. package/.agents/scripts/lib/orchestration/plan-context.js +52 -303
  319. package/.agents/scripts/lib/orchestration/plan-critic-conditions.js +22 -79
  320. package/.agents/scripts/lib/orchestration/plan-critics-evaluate.js +5 -31
  321. package/.agents/scripts/lib/orchestration/plan-metrics.js +29 -108
  322. package/.agents/scripts/lib/orchestration/plan-navigation.js +8 -27
  323. package/.agents/scripts/lib/orchestration/plan-persist/acceptance-handle-repair.js +12 -49
  324. package/.agents/scripts/lib/orchestration/plan-persist/audit-provenance.js +18 -73
  325. package/.agents/scripts/lib/orchestration/plan-persist/changes-repair.js +14 -78
  326. package/.agents/scripts/lib/orchestration/plan-persist/cross-plan-links.js +6 -30
  327. package/.agents/scripts/lib/orchestration/plan-persist/epic-adoption.js +14 -65
  328. package/.agents/scripts/lib/orchestration/plan-persist/epic-ops.js +21 -76
  329. package/.agents/scripts/lib/orchestration/plan-persist/external-deps.js +6 -43
  330. package/.agents/scripts/lib/orchestration/plan-persist/persist-helpers.js +14 -68
  331. package/.agents/scripts/lib/orchestration/plan-persist/plan-context-source.js +9 -41
  332. package/.agents/scripts/lib/orchestration/plan-persist/run-plan-persist.js +49 -248
  333. package/.agents/scripts/lib/orchestration/plan-persist/soft-findings.js +2 -12
  334. package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +85 -368
  335. package/.agents/scripts/lib/orchestration/plan-persist/summary.js +8 -38
  336. package/.agents/scripts/lib/orchestration/plan-persist/supersede-ops.js +30 -190
  337. package/.agents/scripts/lib/orchestration/plan-persist/wave-collision-gate.js +9 -49
  338. package/.agents/scripts/lib/orchestration/plan-persist/wave-serialisation.js +7 -28
  339. package/.agents/scripts/lib/orchestration/plan-reachability.js +13 -42
  340. package/.agents/scripts/lib/orchestration/plan-run-labels/reap.js +16 -91
  341. package/.agents/scripts/lib/orchestration/plan-runner/worktree-sweep.js +16 -54
  342. package/.agents/scripts/lib/orchestration/plan-text-hygiene.js +10 -52
  343. package/.agents/scripts/lib/orchestration/planning/authoring-context.js +14 -109
  344. package/.agents/scripts/lib/orchestration/planning/memory-pool-advisory.js +11 -83
  345. package/.agents/scripts/lib/orchestration/pr-watch.js +48 -306
  346. package/.agents/scripts/lib/orchestration/project-meta-cache.js +15 -80
  347. package/.agents/scripts/lib/orchestration/project-meta-resolver.js +10 -51
  348. package/.agents/scripts/lib/orchestration/reassert-status-column.js +12 -76
  349. package/.agents/scripts/lib/orchestration/remote-verifier.js +12 -36
  350. package/.agents/scripts/lib/orchestration/resolve-stories.js +33 -164
  351. package/.agents/scripts/lib/orchestration/retro-proposals.js +66 -361
  352. package/.agents/scripts/lib/orchestration/review-base-ref.js +9 -43
  353. package/.agents/scripts/lib/orchestration/review-depth.js +12 -94
  354. package/.agents/scripts/lib/orchestration/review-providers/codex.js +10 -111
  355. package/.agents/scripts/lib/orchestration/review-providers/degraded-gates.js +13 -71
  356. package/.agents/scripts/lib/orchestration/review-providers/findings-renderer.js +7 -51
  357. package/.agents/scripts/lib/orchestration/review-providers/mi-exemptions.js +8 -53
  358. package/.agents/scripts/lib/orchestration/review-providers/native.js +30 -214
  359. package/.agents/scripts/lib/orchestration/review-providers/parse-findings.js +7 -52
  360. package/.agents/scripts/lib/orchestration/review-providers/review-depth.js +4 -33
  361. package/.agents/scripts/lib/orchestration/review-providers/review-provider-factory.js +11 -71
  362. package/.agents/scripts/lib/orchestration/review-providers/scoped-lint.js +19 -131
  363. package/.agents/scripts/lib/orchestration/review-providers/security-review.js +6 -89
  364. package/.agents/scripts/lib/orchestration/review-providers/types.js +26 -56
  365. package/.agents/scripts/lib/orchestration/review-providers/ultrareview.js +3 -46
  366. package/.agents/scripts/lib/orchestration/run-epilogue.js +40 -199
  367. package/.agents/scripts/lib/orchestration/run-scoped-config.js +13 -81
  368. package/.agents/scripts/lib/orchestration/single-story-close/close-note.js +7 -34
  369. package/.agents/scripts/lib/orchestration/single-story-close/failed-terminal.js +16 -89
  370. package/.agents/scripts/lib/orchestration/single-story-close/gate-log.js +18 -109
  371. package/.agents/scripts/lib/orchestration/single-story-close/phases/auto-merge.js +83 -239
  372. package/.agents/scripts/lib/orchestration/single-story-close/phases/base-sync.js +18 -80
  373. package/.agents/scripts/lib/orchestration/single-story-close/phases/close-validation.js +103 -97
  374. package/.agents/scripts/lib/orchestration/single-story-close/phases/code-review.js +8 -64
  375. package/.agents/scripts/lib/orchestration/single-story-close/phases/confirm-merge.js +136 -486
  376. package/.agents/scripts/lib/orchestration/single-story-close/phases/conventional-subject.js +30 -134
  377. package/.agents/scripts/lib/orchestration/single-story-close/phases/graphql-preflight.js +9 -50
  378. package/.agents/scripts/lib/orchestration/single-story-close/phases/lock-wait-pending.js +49 -0
  379. package/.agents/scripts/lib/orchestration/single-story-close/phases/normalize-pr-title.js +13 -86
  380. package/.agents/scripts/lib/orchestration/single-story-close/phases/options.js +20 -95
  381. package/.agents/scripts/lib/orchestration/single-story-close/phases/post-land.js +46 -203
  382. package/.agents/scripts/lib/orchestration/single-story-close/phases/pre-gate-steps.js +8 -50
  383. package/.agents/scripts/lib/orchestration/single-story-close/phases/pull-request.js +12 -83
  384. package/.agents/scripts/lib/orchestration/single-story-close/phases/push.js +6 -39
  385. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-block.js +1 -6
  386. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-outcome.js +4 -28
  387. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-override.js +6 -51
  388. package/.agents/scripts/lib/orchestration/single-story-close/phases/worktree-reap.js +6 -34
  389. package/.agents/scripts/lib/orchestration/single-story-close/phases/wrong-tree-guard.js +23 -121
  390. package/.agents/scripts/lib/orchestration/single-story-close/runner.js +110 -290
  391. package/.agents/scripts/lib/orchestration/single-story-lease-guard.js +15 -69
  392. package/.agents/scripts/lib/orchestration/story-body-gate.js +4 -23
  393. package/.agents/scripts/lib/orchestration/story-close/baseline-upward-writeback.js +50 -179
  394. package/.agents/scripts/lib/orchestration/story-close/context-budget-writeback.js +11 -41
  395. package/.agents/scripts/lib/orchestration/story-close/format-autofix.js +23 -311
  396. package/.agents/scripts/lib/orchestration/story-close/phases/local-lens-review.js +22 -147
  397. package/.agents/scripts/lib/orchestration/story-close/phases/review-core.js +16 -67
  398. package/.agents/scripts/lib/orchestration/story-deliver-terminal-schema.js +12 -68
  399. package/.agents/scripts/lib/orchestration/story-deliver-terminal.js +42 -201
  400. package/.agents/scripts/lib/orchestration/story-follow-ups.js +43 -245
  401. package/.agents/scripts/lib/orchestration/story-init-envelope.js +4 -23
  402. package/.agents/scripts/lib/orchestration/story-init-remote.js +2 -6
  403. package/.agents/scripts/lib/orchestration/story-reachability.js +3 -23
  404. package/.agents/scripts/lib/orchestration/task-body-validator.js +12 -126
  405. package/.agents/scripts/lib/orchestration/ticket-lease.js +28 -131
  406. package/.agents/scripts/lib/orchestration/ticket-validator-conflicts.js +15 -149
  407. package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +5 -33
  408. package/.agents/scripts/lib/orchestration/ticket-validator.js +39 -181
  409. package/.agents/scripts/lib/orchestration/ticketing/bulk.js +51 -244
  410. package/.agents/scripts/lib/orchestration/ticketing/reads.js +39 -250
  411. package/.agents/scripts/lib/orchestration/ticketing/state.js +14 -68
  412. package/.agents/scripts/lib/orchestration/ticketing/transition.js +46 -263
  413. package/.agents/scripts/lib/orchestration/ticketing.js +2 -26
  414. package/.agents/scripts/lib/orchestration/verify-credit.js +18 -79
  415. package/.agents/scripts/lib/orchestration/worktree-dirty.js +5 -30
  416. package/.agents/scripts/lib/path-security.js +3 -6
  417. package/.agents/scripts/lib/plan-phase-cleanup.js +9 -49
  418. package/.agents/scripts/lib/preflight-runner.js +13 -69
  419. package/.agents/scripts/lib/process-group.js +143 -0
  420. package/.agents/scripts/lib/project-root.js +2 -8
  421. package/.agents/scripts/lib/provider-factory.js +2 -25
  422. package/.agents/scripts/lib/qa/console-allowlist.js +10 -59
  423. package/.agents/scripts/lib/qa/qa-session.js +15 -69
  424. package/.agents/scripts/lib/qa/redact-evidence.js +18 -129
  425. package/.agents/scripts/lib/qa/resolve-qa-contract.js +26 -135
  426. package/.agents/scripts/lib/qa/resolve-selection.js +16 -84
  427. package/.agents/scripts/lib/reserved-test-ids.js +9 -47
  428. package/.agents/scripts/lib/runtime-deps/dep-resolution.js +13 -53
  429. package/.agents/scripts/lib/runtime-deps/ensure-installed.js +10 -44
  430. package/.agents/scripts/lib/runtime-deps/manifest.js +10 -30
  431. package/.agents/scripts/lib/runtime-deps/parser-major.js +15 -51
  432. package/.agents/scripts/lib/runtime-deps/preflight.js +4 -22
  433. package/.agents/scripts/lib/runtime-deps/scan-imports.js +11 -55
  434. package/.agents/scripts/lib/signals/detectors/common.js +12 -38
  435. package/.agents/scripts/lib/signals/index.js +2 -19
  436. package/.agents/scripts/lib/signals/schema.js +14 -109
  437. package/.agents/scripts/lib/signals/write.js +2 -11
  438. package/.agents/scripts/lib/single-story/confirm-merge.js +31 -72
  439. package/.agents/scripts/lib/single-story/story-merged-notify.js +8 -49
  440. package/.agents/scripts/lib/single-story-sweep/protection-ctx.js +4 -26
  441. package/.agents/scripts/lib/single-story-sweep/protection.js +13 -100
  442. package/.agents/scripts/lib/single-story-sweep/sweep-lock.js +60 -258
  443. package/.agents/scripts/lib/single-story-sweep.js +14 -97
  444. package/.agents/scripts/lib/skills/parse-skill.js +13 -59
  445. package/.agents/scripts/lib/skills/skills-index.js +8 -29
  446. package/.agents/scripts/lib/skills/walk-skill-files.js +17 -78
  447. package/.agents/scripts/lib/source-extensions.js +11 -42
  448. package/.agents/scripts/lib/source-text/strip-js-comments.js +8 -41
  449. package/.agents/scripts/lib/stdio-flush.js +9 -36
  450. package/.agents/scripts/lib/story-adjacency.js +8 -40
  451. package/.agents/scripts/lib/story-body/body-format-lints.js +22 -83
  452. package/.agents/scripts/lib/story-body/footer-block.js +11 -44
  453. package/.agents/scripts/lib/story-body/story-body.js +83 -358
  454. package/.agents/scripts/lib/temp-retention.js +42 -143
  455. package/.agents/scripts/lib/templates/decomposer-prompts.js +11 -65
  456. package/.agents/scripts/lib/test-env.js +12 -65
  457. package/.agents/scripts/lib/test-run-credit.js +10 -65
  458. package/.agents/scripts/lib/test-runner-contract.js +19 -74
  459. package/.agents/scripts/lib/test-temp.js +38 -184
  460. package/.agents/scripts/lib/test-tiers.js +12 -96
  461. package/.agents/scripts/lib/ticket-body-sections.js +21 -96
  462. package/.agents/scripts/lib/transpile.js +15 -74
  463. package/.agents/scripts/lib/util/concurrent-map.js +6 -25
  464. package/.agents/scripts/lib/util/parse-id-list.js +8 -34
  465. package/.agents/scripts/lib/util/poll-loop.js +8 -28
  466. package/.agents/scripts/lib/util/with-timeout.js +2 -11
  467. package/.agents/scripts/lib/validation-evidence.js +21 -96
  468. package/.agents/scripts/lib/wave-runner/footprint.js +17 -70
  469. package/.agents/scripts/lib/wave-runner/live-probe.js +53 -221
  470. package/.agents/scripts/lib/wave-runner/ready-set.js +72 -301
  471. package/.agents/scripts/lib/workers/crap-worker.js +11 -64
  472. package/.agents/scripts/lib/workers/maintainability-report-worker.js +8 -45
  473. package/.agents/scripts/lib/workers/maintainability-worker.js +5 -21
  474. package/.agents/scripts/lib/workers/serve-worker-messages.js +2 -18
  475. package/.agents/scripts/lib/workflow-closure.js +22 -105
  476. package/.agents/scripts/lib/workspace-provisioner.js +16 -54
  477. package/.agents/scripts/lib/worktree/git-hooks.js +15 -60
  478. package/.agents/scripts/lib/worktree/lifecycle/force-drain.js +20 -60
  479. package/.agents/scripts/lib/worktree/lifecycle/merge-reachability.js +10 -62
  480. package/.agents/scripts/lib/worktree/lifecycle/pending-cleanup.js +22 -86
  481. package/.agents/scripts/lib/worktree/lifecycle/reap.js +24 -126
  482. package/.agents/scripts/lib/worktree/lifecycle-manager.js +2 -20
  483. package/.agents/scripts/lib/worktree/node-modules-strategy.js +46 -180
  484. package/.agents/scripts/lib/worktree-manager.js +15 -40
  485. package/.agents/scripts/lint-issue-body.js +12 -68
  486. package/.agents/scripts/mandrel-update-preflight.js +10 -70
  487. package/.agents/scripts/merge-baseline.js +30 -104
  488. package/.agents/scripts/nav-registry-diff.js +22 -108
  489. package/.agents/scripts/notify.js +12 -69
  490. package/.agents/scripts/plan-context.js +27 -111
  491. package/.agents/scripts/plan-critics.js +12 -66
  492. package/.agents/scripts/plan-persist.js +31 -148
  493. package/.agents/scripts/plan-run-epilogue.js +11 -37
  494. package/.agents/scripts/pr-watch-with-update.js +76 -267
  495. package/.agents/scripts/providers/github/auth.js +3 -8
  496. package/.agents/scripts/providers/github/blocked-by-add.js +14 -61
  497. package/.agents/scripts/providers/github/board-add.js +5 -21
  498. package/.agents/scripts/providers/github/branch-protection.js +11 -43
  499. package/.agents/scripts/providers/github/cache.js +2 -14
  500. package/.agents/scripts/providers/github/comments.js +7 -40
  501. package/.agents/scripts/providers/github/compose.js +3 -19
  502. package/.agents/scripts/providers/github/errors.js +22 -125
  503. package/.agents/scripts/providers/github/issues.js +31 -123
  504. package/.agents/scripts/providers/github/labels.js +24 -124
  505. package/.agents/scripts/providers/github/mappers.js +5 -27
  506. package/.agents/scripts/providers/github/merge-methods.js +3 -22
  507. package/.agents/scripts/providers/github/project-board.js +2 -17
  508. package/.agents/scripts/providers/github/projects-v2-graphql.js +3 -6
  509. package/.agents/scripts/providers/github/request-helpers.js +5 -32
  510. package/.agents/scripts/providers/github/search-budget.js +9 -39
  511. package/.agents/scripts/providers/github/search-query.js +5 -26
  512. package/.agents/scripts/providers/github/sub-issue-add.js +15 -65
  513. package/.agents/scripts/providers/github/sub-issues.js +7 -36
  514. package/.agents/scripts/providers/github/tickets.js +32 -134
  515. package/.agents/scripts/providers/github.js +18 -59
  516. package/.agents/scripts/prune-plan-run-labels.js +12 -46
  517. package/.agents/scripts/quality-preview.js +35 -220
  518. package/.agents/scripts/resolve-doc-tiers.js +3 -26
  519. package/.agents/scripts/resolve-stories.js +16 -67
  520. package/.agents/scripts/resync-status-column.js +6 -25
  521. package/.agents/scripts/run-tests.js +29 -104
  522. package/.agents/scripts/single-story-close.js +23 -135
  523. package/.agents/scripts/single-story-confirm-merge.js +32 -139
  524. package/.agents/scripts/single-story-init.js +47 -209
  525. package/.agents/scripts/stories-wave-tick.js +102 -472
  526. package/.agents/scripts/sync-agentrc.js +3 -21
  527. package/.agents/scripts/sync-claude-agents.js +9 -55
  528. package/.agents/scripts/sync-claude-commands.js +20 -110
  529. package/.agents/scripts/test-wrapper.js +6 -43
  530. package/.agents/scripts/update-coverage-baseline.js +5 -22
  531. package/.agents/scripts/update-crap-baseline.js +7 -30
  532. package/.agents/scripts/update-duplication-baseline.js +16 -92
  533. package/.agents/scripts/update-maintainability-baseline.js +8 -62
  534. package/.agents/scripts/update-ticket-state.js +1 -7
  535. package/.agents/scripts/validate-skills.js +6 -26
  536. package/.agents/templates/agent-protocol.md +2 -2
  537. package/.agents/templates/docs/audit-sweep-runbook.md +3 -4
  538. package/.agents/workflows/audit-accessibility.md +4 -7
  539. package/.agents/workflows/audit-adrs.md +3 -6
  540. package/.agents/workflows/audit-architecture.md +3 -11
  541. package/.agents/workflows/audit-baselines.md +6 -9
  542. package/.agents/workflows/audit-clean-code.md +8 -12
  543. package/.agents/workflows/audit-data-model.md +3 -7
  544. package/.agents/workflows/audit-dependencies.md +4 -7
  545. package/.agents/workflows/audit-devops.md +4 -8
  546. package/.agents/workflows/audit-documentation.md +1 -4
  547. package/.agents/workflows/audit-mobile.md +4 -7
  548. package/.agents/workflows/audit-navigability.md +3 -6
  549. package/.agents/workflows/audit-performance.md +2 -4
  550. package/.agents/workflows/audit-privacy.md +4 -7
  551. package/.agents/workflows/audit-quality.md +4 -7
  552. package/.agents/workflows/audit-security.md +4 -7
  553. package/.agents/workflows/audit-seo.md +4 -7
  554. package/.agents/workflows/audit-sre.md +4 -7
  555. package/.agents/workflows/audit-to-stories.md +17 -30
  556. package/.agents/workflows/audit-ux-ui.md +4 -7
  557. package/.agents/workflows/helpers/audit-lens-core.md +1 -1
  558. package/.agents/workflows/helpers/code-quality-guardrails.md +12 -15
  559. package/.agents/workflows/helpers/deliver-digest.md +6 -4
  560. package/.agents/workflows/helpers/deliver-reference.md +114 -188
  561. package/.agents/workflows/helpers/deliver-story-reference.md +189 -533
  562. package/.agents/workflows/helpers/plan-reference.md +86 -139
  563. package/.agents/workflows/helpers/qa-core.md +12 -0
  564. package/.agents/workflows/memory-consolidate.md +1 -1
  565. package/.agents/workflows/qa-assist.md +27 -71
  566. package/.agents/workflows/qa-explore.md +19 -59
  567. package/.agents/workflows/qa-run.md +11 -33
  568. package/README.md +1 -1
  569. package/bin/mandrel.js +5 -46
  570. package/bin/postinstall.js +18 -107
  571. package/docs/CHANGELOG.md +25 -0
  572. package/lib/cli/doctor.js +11 -71
  573. package/lib/cli/init.js +26 -165
  574. package/lib/cli/migrate.js +5 -64
  575. package/lib/cli/registry.js +84 -467
  576. package/lib/cli/sync-agents.js +4 -64
  577. package/lib/cli/sync-commands.js +11 -64
  578. package/lib/cli/sync.js +34 -213
  579. package/lib/cli/uninstall.js +40 -219
  580. package/lib/cli/update.js +105 -661
  581. package/lib/cli/version-check.js +8 -72
  582. package/lib/cli/version-helpers.js +14 -87
  583. package/lib/migrations/helpers/retire-agentrc-key.js +11 -52
  584. package/lib/migrations/index.js +15 -92
  585. package/lib/migrations/steps/2.1.0-retire-mi-drop-knobs.js +2 -15
  586. package/lib/migrations/steps/2.1.0-retire-verify-concurrency-cap.js +1 -13
  587. package/lib/migrations/steps/2.11.0-retire-max-seed-words.js +2 -15
  588. package/lib/migrations/steps/2.2.0-retire-epic-ac-tags.js +9 -38
  589. package/lib/migrations/steps/2.20.0-retire-codebase-snapshot.js +1 -13
  590. package/lib/migrations/steps/2.32.0-retire-lint-baseline-command.js +2 -27
  591. package/lib/migrations/steps/2.57.0-retire-delivery-limit-knobs.js +2 -23
  592. package/lib/migrations/steps/2.57.0-retire-planning-limit-knobs.js +2 -27
  593. package/lib/migrations/steps/2.60.0-retire-audit-results-autofile.js +2 -21
  594. package/lib/migrations/steps/strip-removed-agentrc-keys.js +333 -0
  595. package/package.json +16 -14
  596. package/.agents/docs/SDLC.md +0 -590
  597. package/.agents/docs/quality-gates.md +0 -1183
  598. package/.agents/rules/known-tooling-behavior.md +0 -200
  599. package/.agents/rules/orchestration-error-handling.md +0 -61
  600. package/.agents/rules/test-seams.md +0 -59
  601. package/.agents/schemas/baselines/lighthouse.schema.json +0 -59
  602. package/.agents/schemas/baselines/lint.schema.json +0 -47
  603. package/.agents/scripts/check-action-pinning.js +0 -260
  604. package/.agents/scripts/check-audit-attribution.js +0 -302
  605. package/.agents/scripts/check-baseline-drift.js +0 -211
  606. package/.agents/scripts/check-baseline-scope.js +0 -362
  607. package/.agents/scripts/check-generated-validator.js +0 -202
  608. package/.agents/scripts/check-knip-entries.js +0 -159
  609. package/.agents/scripts/check-lifecycle-lint.js +0 -294
  610. package/.agents/scripts/check-pinned-override-notes.js +0 -102
  611. package/.agents/scripts/check-schema-references.js +0 -368
  612. package/.agents/scripts/check-test-portability.js +0 -512
  613. package/.agents/scripts/check-workflow-citations.js +0 -218
  614. package/.agents/scripts/check-workflow-cli-lint.js +0 -299
  615. package/.agents/scripts/check-workflow-timeouts.js +0 -291
  616. package/.agents/scripts/install-matrix-assert.js +0 -326
  617. package/.agents/scripts/lib/audit-advisories.js +0 -195
  618. package/.agents/scripts/lib/audit-attribution.js +0 -134
  619. package/.agents/scripts/lib/baselines/drift-detector.js +0 -351
  620. package/.agents/scripts/lib/baselines/kinds/lighthouse.js +0 -87
  621. package/.agents/scripts/lib/baselines/kinds/lint.js +0 -184
  622. package/.agents/scripts/lib/baselines/orphan-pruner.js +0 -233
  623. package/.agents/scripts/lib/baselines/scope-assert.js +0 -223
  624. package/.agents/scripts/lib/baselines/scope-inventory.js +0 -314
  625. package/.agents/scripts/lib/c8-cli-path.js +0 -21
  626. package/.agents/scripts/lib/config/gates/lighthouse.schema.js +0 -51
  627. package/.agents/scripts/lib/config/gates/lint.schema.js +0 -18
  628. package/.agents/scripts/lib/dynamic-workflow/architecture-report-contract.js +0 -70
  629. package/.agents/scripts/lib/dynamic-workflow/audit-orchestrator.js +0 -284
  630. package/.agents/scripts/lib/dynamic-workflow/clean-code-report-contract.js +0 -80
  631. package/.agents/scripts/lib/dynamic-workflow/degraded-coverage.js +0 -81
  632. package/.agents/scripts/lib/dynamic-workflow/documentation-report-contract.js +0 -87
  633. package/.agents/scripts/lib/dynamic-workflow/performance-report-contract.js +0 -74
  634. package/.agents/scripts/lib/dynamic-workflow/quality-report-contract.js +0 -90
  635. package/.agents/scripts/lib/dynamic-workflow/report-contract-core.js +0 -43
  636. package/.agents/scripts/lib/dynamic-workflow/security-report-contract.js +0 -83
  637. package/.agents/scripts/lib/fs-walk.js +0 -52
  638. package/.agents/scripts/lib/knip-config-resolver.js +0 -181
  639. package/.agents/scripts/lib/knip-entry-sync.js +0 -452
  640. package/.agents/scripts/lib/pinned-override-notes.js +0 -88
  641. package/.agents/scripts/lib/pinned-override-resolve.js +0 -212
  642. package/.agents/scripts/lib/test-isolate/cli-options.js +0 -93
  643. package/.agents/scripts/lib/test-isolate/env-snapshot-loader.js +0 -52
  644. package/.agents/scripts/lib/test-isolate/list-files.js +0 -90
  645. package/.agents/scripts/lib/test-isolate/parse-tap.js +0 -75
  646. package/.agents/scripts/lib/test-isolate/progress-log.js +0 -45
  647. package/.agents/scripts/lib/test-isolate/render-report.js +0 -97
  648. package/.agents/scripts/lib/test-isolate/run-isolate.js +0 -87
  649. package/.agents/scripts/lib/test-isolate/runner.js +0 -483
  650. package/.agents/scripts/lib/test-profile/parse-tap.js +0 -136
  651. package/.agents/scripts/lib/test-profile/render-report.js +0 -45
  652. package/.agents/scripts/lint-label-vocabulary.js +0 -214
  653. package/.agents/scripts/post-structured-comment.js +0 -127
  654. package/.agents/scripts/provision-git-hooks.js +0 -85
  655. package/.agents/scripts/prune-baseline-orphans.js +0 -181
  656. package/.agents/scripts/run-coverage.js +0 -197
  657. package/.agents/scripts/run-lint.js +0 -133
  658. package/.agents/scripts/run-test-profile.js +0 -129
  659. package/.agents/scripts/run-verify.js +0 -125
  660. package/.agents/scripts/test-isolate.js +0 -55
  661. package/.agents/scripts/update-dead-exports-baseline.js +0 -321
@@ -2,53 +2,16 @@
2
2
  /* node:coverage ignore file */
3
3
 
4
4
  /**
5
- * plan-context.js — step 1 of the collapsed `/mandrel-plan` pipeline.
5
+ * plan-context.js — build the `/mandrel-plan` authoring-context envelope from
6
+ * exactly one entry form (`--seed`, `--seed-file`, `--tickets`, `--amends`),
7
+ * write it with `stories.template.json` under `<tempRoot>/plan-<slug>/`
8
+ * (where `plan-persist.js` discovers the `--tickets` source ids), and print a
9
+ * compact JSON digest as the only stdout.
6
10
  *
7
- * Emits one stdout-pure JSON envelope for the `/mandrel-plan` authoring middle.
8
- *
9
- * Two operator modes (exactly one is required):
10
- *
11
- * --seed "<text>" Chat/text ideation. Dup search runs off the
12
- * raw seed; envelope carries `seed`.
13
- *
14
- * --seed-file <path> Same as --seed, but the corpus is read from
15
- * disk (audit-to-stories handoff, notes).
16
- *
17
- * --tickets 123[,456…] Analyze existing issue(s) into proper
18
- * Stories. Envelope carries `sourceTickets[]`.
19
- *
20
- * --amends 123 | #123 Amendment (delta) planning. Composes a DELTA
21
- * envelope from the prior Story's body, its
22
- * acceptance criteria, and its delivered file map
23
- * instead of re-interrogating the repo from
24
- * scratch (Story #4741). Envelope carries `amends`.
25
- *
26
- * Flags:
27
- * --out <path> Override where the envelope is written (parent dirs
28
- * created). **Optional since Story #5342** — with no
29
- * `--out` the envelope lands at
30
- * `<tempRoot>/plan-<slug>/plan-context.json`, the plan
31
- * directory `/mandrel-plan` would have named by hand, and
32
- * `stories.template.json` lands beside it. That is where
33
- * `plan-persist.js` auto-discovers the `--tickets` source
34
- * ids from (Story #4554); without a captured envelope
35
- * persist cannot know a `--tickets` run happened, and
36
- * superseding degrades to the `--source-tickets` flag.
37
- * --pretty Pretty-print the written JSON envelope.
38
- *
39
- * stdout is reserved for a single JSON payload (Story #2278 discipline) —
40
- * the compact digest naming the written artifacts (Story #4708
41
- * script-output contract): `routeAllOutputToStderr()` runs before any
42
- * pipeline code so the stream is unconditionally parseable by `JSON.parse`.
43
- *
44
- * Exit codes:
45
- * 0 — envelope emitted.
46
- * 1 — fatal error (see stderr).
11
+ * Exit codes: 0 envelope emitted; 1 fatal.
47
12
  */
48
13
 
49
- // Fail-fast if the framework's runtime deps are not installed — must be the
50
- // first import so the check runs before any third-party-importing sibling
51
- // module is evaluated (Story #3432).
14
+ // Must be the first import: fail fast before any third-party import runs.
52
15
  import './lib/runtime-deps/ensure-installed.js';
53
16
  import { mkdir, writeFile } from 'node:fs/promises';
54
17
  import path from 'node:path';
@@ -69,19 +32,14 @@ import {
69
32
  import { recordPlanInvocation } from './lib/orchestration/plan-metrics.js';
70
33
  import { createProvider } from './lib/provider-factory.js';
71
34
 
72
- /** Longest slug segment a default plan directory carries. */
73
35
  const PLAN_SLUG_MAX_LENGTH = 48;
74
36
 
75
37
  /**
76
- * Reduce free text to the hyphen-case segment a plan directory is named by.
77
- *
78
- * Deliberately lossy: the slug is a human-readable handle on a temp
79
- * directory, not an identity — two runs from the same seed land in the same
80
- * directory and the second overwrites the first, which is the idempotent
81
- * behaviour the operator already got from typing the same `--out` twice.
38
+ * Deliberately lossy: a handle, not an identity — the same seed reuses (and
39
+ * overwrites) the same directory.
82
40
  *
83
41
  * @param {string} raw
84
- * @returns {string} A non-empty hyphen-case slug (`plan` when nothing survives).
42
+ * @returns {string} `plan` when nothing survives.
85
43
  */
86
44
  export function slugifyPlanLabel(raw) {
87
45
  const slug = String(raw ?? '')
@@ -94,28 +52,18 @@ export function slugifyPlanLabel(raw) {
94
52
  }
95
53
 
96
54
  /**
97
- * Resolve where the envelope is written when the operator passed no `--out`
98
- * (Story #5342).
99
- *
100
- * `--out` was mandatory in practice and optional in the CLI: persist
101
- * auto-discovers the envelope and the `stories.template.json` beside it from
102
- * the plan directory, so a run without it silently lost superseding and the
103
- * authoring skeleton. The path it always pointed at is derivable — the
104
- * configured `tempRoot`, a `plan-<slug>` directory named for what is being
105
- * planned — so the CLI derives it rather than asking.
106
- *
107
- * Exported for tests: this is the join where a missing flag stops costing
108
- * the plan its source ids.
55
+ * Envelope path when no `--out` is given. Always written, because persist
56
+ * discovers source ids and the template from this directory.
109
57
  *
110
58
  * @param {object} args
111
- * @param {string} args.mode One of `seed` | `seed-file` | `tickets` | `amends`.
59
+ * @param {string} args.mode
112
60
  * @param {string} [args.seedText]
113
61
  * @param {string} [args.seedFilePath]
114
62
  * @param {number[]} [args.ticketIds]
115
63
  * @param {number} [args.amendsId]
116
- * @param {object} [args.config] Resolved config (for `project.paths.tempRoot`).
64
+ * @param {object} [args.config]
117
65
  * @param {string} [args.cwd]
118
- * @returns {string} Absolute path to the envelope file.
66
+ * @returns {string} Absolute path.
119
67
  */
120
68
  export function resolveDefaultOutPath({
121
69
  mode,
@@ -141,8 +89,6 @@ export function resolveDefaultOutPath({
141
89
  }
142
90
 
143
91
  /**
144
- * Parse a comma-/space-separated ticket id list into positive integers.
145
- *
146
92
  * @param {string} raw
147
93
  * @returns {number[]}
148
94
  */
@@ -164,8 +110,6 @@ export function parseTicketIds(raw) {
164
110
  }
165
111
 
166
112
  /**
167
- * Parse a single `--amends` id, tolerating a leading `#` (`#123` or `123`).
168
- *
169
113
  * @param {string} raw
170
114
  * @returns {number}
171
115
  */
@@ -183,11 +127,6 @@ export function parseAmendsId(raw) {
183
127
  }
184
128
 
185
129
  /**
186
- * Build the envelope, write it (plus the `stories.template.json` skeleton)
187
- * to `outPath` — or to the derived default when none was passed
188
- * (Story #5342) — and print the compact digest on stdout. Exported for
189
- * tests.
190
- *
191
130
  * @param {object} args
192
131
  * @returns {Promise<object>} the emitted envelope.
193
132
  */
@@ -233,11 +172,8 @@ export async function emitPlanContext({
233
172
  cwd: cwd ?? undefined,
234
173
  });
235
174
  {
236
- // Script-output contract (Story #4708, AC-5): the full envelope is a
237
- // ~40KB artifact that would ride resident in the transcript for every
238
- // later turn. It is always captured to disk (Story #5342 derives the
239
- // path when `--out` is absent), so stdout carries a compact digest
240
- // naming the artifacts instead of the payload itself.
175
+ // The ~40KB envelope goes to disk; stdout carries only a digest so it
176
+ // does not ride resident in the transcript.
241
177
  await writeEnvelopeFile(resolvedOut, json);
242
178
  await writeStoriesTemplateFile(resolvedOut, envelope);
243
179
  const resolved = path.resolve(resolvedOut);
@@ -252,10 +188,7 @@ export async function emitPlanContext({
252
188
  bytes: Buffer.byteLength(json, 'utf8'),
253
189
  sourceTickets: (envelope.sourceTickets ?? []).map((t) => t.id),
254
190
  duplicates: (envelope.duplicates ?? []).length,
255
- // Advisory only: signals, no route. `uiSurface` is the recorded
256
- // /prototype offer — advisory, never an automatic reroute. It rides the
257
- // digest because with `--out` the digest is the only thing the planner
258
- // reads.
191
+ // Advisory signals only, never a reroute.
259
192
  complexitySignals: envelope.complexitySignals
260
193
  ? {
261
194
  artifactCount: envelope.complexitySignals.artifactCount,
@@ -264,8 +197,7 @@ export async function emitPlanContext({
264
197
  uiSurface: envelope.complexitySignals.uiSurface ?? null,
265
198
  }
266
199
  : null,
267
- // Story #5312: an envelope over the planner-context ceiling is written
268
- // truncated, and the digest names what was cut.
200
+ // Names what was cut when the envelope exceeded the context ceiling.
269
201
  truncated: envelope.truncated ?? null,
270
202
  amends: envelope.amends ? { id: envelope.amends.id } : null,
271
203
  };
@@ -275,12 +207,8 @@ export async function emitPlanContext({
275
207
  }
276
208
 
277
209
  /**
278
- * Persist the envelope to `--out` so `plan-persist.js` can derive the
279
- * `--tickets` source ids from it without an operator re-typing them.
280
- *
281
- * Writing is part of emitting, not a best-effort extra: a failed write means
282
- * persist will silently see no source tickets, so it throws rather than
283
- * warning past the problem.
210
+ * Throws on failure: a missing envelope makes persist silently see no source
211
+ * tickets.
284
212
  *
285
213
  * @param {string} outPath
286
214
  * @param {string} json
@@ -299,19 +227,11 @@ async function writeEnvelopeFile(outPath, json) {
299
227
  }
300
228
 
301
229
  /**
302
- * Emit the ready-to-fill Story authoring template next to the captured
303
- * envelope (Story #4707 — one-shot authoring). The planner copies it to
304
- * `stories.json` and fills the placeholders; no step of the authoring path
305
- * requires reading `story-body.js` source. Written on every run (Story
306
- * #5342), and throwing on failure for the same reason the envelope write
307
- * does: a silently missing template re-opens the format-discovery loop it
308
- * exists to close. The envelope's advisory `complexitySignals` are threaded
309
- * through so the skeleton's `changes[]` arrive pre-resolved to
310
- * creates-vs-refactors against the repo snapshot (Story #4723).
230
+ * Write the ready-to-fill authoring template beside the envelope, with
231
+ * `changes[]` pre-resolved from `complexitySignals`. Throws on failure.
311
232
  *
312
- * @param {string} outPath The envelope `--out` path; the template lands in
313
- * the same directory as {@link STORIES_TEMPLATE_FILENAME}.
314
- * @param {object} [envelope] The emitted plan-context envelope.
233
+ * @param {string} outPath
234
+ * @param {object} [envelope]
315
235
  */
316
236
  async function writeStoriesTemplateFile(outPath, envelope = {}) {
317
237
  const resolved = path.resolve(
@@ -380,18 +300,14 @@ async function main() {
380
300
  mode = 'seed';
381
301
  }
382
302
 
383
- // stdout is reserved for the JSON envelope: flip every Logger sink that
384
- // could land on stdout to stderr BEFORE any pipeline code runs
385
- // (Story #2278 — the same stdout-purity guarantee the retired pipeline
386
- // gives; this CLI is emit-only so the flip is unconditional).
303
+ // stdout is reserved for the JSON digest.
387
304
  routeAllOutputToStderr();
388
305
 
389
306
  let config;
390
307
  let settings;
391
308
  try {
392
309
  config = resolveConfig();
393
- // `settings` retains the legacy bag shape `buildAuthoringContext` and
394
- // friends consume: `{ baseBranch, paths, planning, docsContextFiles }`.
310
+ // The bag shape `buildAuthoringContext` consumes.
395
311
  settings = {
396
312
  baseBranch: config.project?.baseBranch,
397
313
  paths: config.project?.paths,
@@ -1,45 +1,11 @@
1
1
  #!/usr/bin/env node
2
2
 
3
3
  /**
4
- * plan-critics.js — the /mandrel-plan pre-mortem dispatch verdict CLI
5
- * (Story #4592; pre-mortem only since Story #5312).
6
- *
7
- * The operator runs this between Author and Persist when they want the
8
- * pre-mortem — it is no longer a step of the `/mandrel-plan` spine. It
9
- * evaluates the pre-mortem dispatch condition against the draft
10
- * `stories.json` and prints the verdict as JSON on stdout so the workflow can
11
- * act on it — dispatching a fresh-context critic sub-agent and folding its
12
- * findings into a re-author round **before** the plan is persisted.
13
- *
14
- * The pre-mortem's external-dependency arm (Story #4700) needs the repo's own
15
- * manifests to tell an external scoped package from a local one, so this CLI
16
- * reads them (`collectRepoPackages`) and passes the specifier set down — the
17
- * pure evaluation modules never touch the filesystem.
18
- *
19
- * Why here and nowhere else. The evaluation used to run inside
20
- * `run-plan-persist.js`, after authoring was finished and immediately before
21
- * `createStoryIssues` — the one point in the flow where nothing can act on a
22
- * `dispatch: true` verdict, because the artifacts are about to become live
23
- * issues. It logged the verdict and moved on. This CLI is now the **single**
24
- * evaluation point, sited where a re-author loop actually exists.
25
- *
26
- * Advisory by contract: a `dispatch: true` verdict routes work to the
27
- * workflow, it does not gate the run. This CLI exits 0 on any verdict; only a
28
- * usage/IO error is a failure. Every `dispatch: false` decision is recorded to
29
- * the plan-metrics ledger (`appendCriticSkip`) so under-firing stays auditable.
30
- *
31
- * CLI:
32
- * --stories <file> Required. The draft Story ticket array (JSON).
33
- * --tech-spec <file> Optional. Shared Tech Spec, folded into the plan
34
- * text the external-dependency probe scans.
35
- *
36
- * stdout is reserved for the verdict JSON (Story #2278 discipline):
37
- *
38
- * {
39
- * "premortem": { "critic": "pre-mortem", "dispatch": true, "reasons": [...] }
40
- * }
41
- *
42
- * Human-readable log lines go to stderr, matching the sibling `plan-persist`.
4
+ * plan-critics.js — operator-run pre-mortem dispatch verdict for a draft plan,
5
+ * evaluated between Author and Persist, where a re-author loop can still act
6
+ * on it. Advisory: exits 0 on any verdict; each skip is recorded to the
7
+ * plan-metrics ledger so under-firing stays auditable. stdout carries only
8
+ * `{ "premortem": { critic, dispatch, reasons } }`.
43
9
  *
44
10
  * Exit codes: 0 success (any verdict); 1 usage/IO error.
45
11
  */
@@ -61,10 +27,8 @@ const CLI_OPTIONS = {
61
27
 
62
28
  const USAGE = 'Usage: plan-critics.js --stories <file> [--tech-spec <file>]';
63
29
 
64
- /** The `cli` discriminator every ledger record from this surface carries. */
65
30
  export const PLAN_CRITICS_CLI = 'plan-critics';
66
31
 
67
- /** Dependency maps a manifest can declare a package under. */
68
32
  const DEP_MAP_KEYS = [
69
33
  'dependencies',
70
34
  'devDependencies',
@@ -72,7 +36,6 @@ const DEP_MAP_KEYS = [
72
36
  'peerDependencies',
73
37
  ];
74
38
 
75
- /** Add a manifest's own name and every declared dependency to `names`. */
76
39
  function collectPackageIdentity(names, pkg) {
77
40
  if (typeof pkg?.name === 'string') names.add(pkg.name);
78
41
  for (const key of DEP_MAP_KEYS) {
@@ -92,7 +55,6 @@ async function readJsonIfPresent(filePath) {
92
55
  }
93
56
  }
94
57
 
95
- /** Normalize the `workspaces` field (array or `{ packages: [] }`) to a list. */
96
58
  function workspacePatterns(pkg) {
97
59
  const ws = pkg?.workspaces;
98
60
  if (Array.isArray(ws)) return ws;
@@ -101,9 +63,7 @@ function workspacePatterns(pkg) {
101
63
  }
102
64
 
103
65
  /**
104
- * Resolve `workspaces` patterns to child `package.json` paths. Handles the two
105
- * common shapes — a `dir/*` glob (expanded one level) and a literal path — and
106
- * never throws: an unreadable base directory is skipped.
66
+ * Handles `dir/*` (one level) and literal paths; never throws.
107
67
  *
108
68
  * @param {string} rootDir
109
69
  * @param {string[]} patterns
@@ -134,11 +94,9 @@ async function resolveWorkspaceManifestPaths(rootDir, patterns) {
134
94
  }
135
95
 
136
96
  /**
137
- * Gather the package specifiers the repo's own manifests declare — the set the
138
- * pre-mortem external-dependency probe (Story #4700) measures a scoped-package
139
- * reference against. Includes the root manifest's own name and dependency maps
140
- * plus every workspace manifest's. Best-effort: a repo with no `package.json`
141
- * yields `[]`, which only widens what the probe treats as external.
97
+ * Package specifiers the repo's own manifests (root + workspaces) declare, so
98
+ * the external-dependency probe can tell local from external. No manifest
99
+ * yields `[]`, which only widens what counts as external.
142
100
  *
143
101
  * @param {{ rootDir?: string }} [opts]
144
102
  * @returns {Promise<string[]>}
@@ -160,8 +118,6 @@ export async function collectRepoPackages({ rootDir = process.cwd() } = {}) {
160
118
  }
161
119
 
162
120
  /**
163
- * Read the draft artifacts the critics evaluate.
164
- *
165
121
  * @param {{ storiesPath: string, techSpecPath?: string|null }} paths
166
122
  * @returns {Promise<{ tickets: object[], techSpecContent: string }>}
167
123
  */
@@ -188,9 +144,7 @@ export async function loadCriticArtifacts({
188
144
  }
189
145
 
190
146
  /**
191
- * Log the decision and record a skip on the plan-metrics ledger. The
192
- * ledger write is best-effort by `appendCriticSkip`'s own contract — it can
193
- * never fail the plan step.
147
+ * The ledger write is best-effort and never fails the plan step.
194
148
  *
195
149
  * @param {{ premortem: object }} verdict
196
150
  * @param {object} config
@@ -221,10 +175,6 @@ export async function recordCriticSkips(
221
175
  }
222
176
 
223
177
  /**
224
- * Load the artifacts, evaluate the pre-mortem, record a skip, and return the
225
- * verdict. Exported as the CLI's whole body so tests drive it in-process with
226
- * an explicit config and ledger seam.
227
- *
228
178
  * @param {{
229
179
  * storiesPath: string,
230
180
  * techSpecPath?: string|null,
@@ -232,10 +182,7 @@ export async function recordCriticSkips(
232
182
  * knownPackages?: string[],
233
183
  * append?: typeof appendCriticSkip,
234
184
  * }} args
235
- * @param {string[]} [args.knownPackages] - Package specifiers the repo's own
236
- * manifests declare, forwarded to the pre-mortem external-dependency probe
237
- * (Story #4700). `main()` resolves them via `collectRepoPackages`; tests may
238
- * pass an explicit set or omit it (defaults to `[]`).
185
+ * @param {string[]} [args.knownPackages]
239
186
  * @returns {Promise<{ premortem: object }>}
240
187
  */
241
188
  export async function evaluateCriticArtifacts({
@@ -266,8 +213,7 @@ async function main() {
266
213
  throw new Error(USAGE);
267
214
  }
268
215
 
269
- // stdout is reserved for the verdict JSON — flip every Logger sink that
270
- // could land on stdout to stderr before any evaluation runs.
216
+ // stdout is reserved for the verdict JSON.
271
217
  routeAllOutputToStderr();
272
218
 
273
219
  const verdict = await evaluateCriticArtifacts({
@@ -1,56 +1,10 @@
1
1
  #!/usr/bin/env node
2
2
 
3
3
  /**
4
- * plan-persist.js — flat Story GitHub-write surface for v2 `/mandrel-plan`
5
- * (Stage 3 — `docs/roadmap.md`).
6
- *
7
- * Given the author-written planning artifacts (`stories.json`, optional shared
8
- * Tech Spec), this CLI validates and creates Story issue(s) directly:
9
- *
10
- * changes[] repair → ticket validator / DAG → reachability →
11
- * split-policy partition → fold Spec into each Story body →
12
- * createIssue(s) with type::story, resumably by plan fingerprint (NOT
13
- * agent::ready) → one `story-plan-state` comment (the plan summary) on
14
- * every Story → flip every Story to agent::ready →
15
- * comment + close superseded source tickets → temp cleanup + stale reap.
16
- *
17
- * Story #4542 retired the authored risk verdict: persist neither requires nor
18
- * accepts one, and no plan-time step produces one. Review depth and the
19
- * acceptance-critic mode are derived from the diff at close time
20
- * (`review-depth.js#deriveChangeLevel`). `--force-review` is the only review
21
- * gate the planner still carries, and it is an explicit operator flag.
22
- *
23
- * CLI:
24
- * --stories <file> Required Story ticket array (default length 1)
25
- * --tech-spec <file> Optional shared Tech Spec folded into each Story
26
- * --plan-dir <dir> Optional temp dir deleted at terminal success.
27
- * Also where the `plan-context.json` envelope is
28
- * auto-discovered from (see --plan-context)
29
- * --plan-context <file> Optional explicit path to the `plan-context.js`
30
- * envelope. Its `sourceTickets[]` is what makes
31
- * `--tickets` superseding work without a flag
32
- * --source-tickets <ids> Explicit OVERRIDE of the envelope-derived source
33
- * ids, for hand-driven runs. Each id must be
34
- * claimed by exactly one Story's `supersedes[]`;
35
- * they are commented on and closed as superseded
36
- * --no-close-superseded Keep the source tickets open (no comment, no
37
- * close) — for a genuinely partial supersede
38
- * --dry-run Assemble + validate without GitHub writes
39
- * --force-review Operator-forced review stop before persist lands
40
- *
41
- * **Persist is one command (Story #5342).** Without `--dry-run` the CLI runs
42
- * the write-free dry-run first — the
43
- * changes[] repair, the validator, DAG, reachability, split/supersede
44
- * partition, Spec fold — and, when the gate list comes back clean, chains
45
- * straight into the real persist in the SAME invocation. A dry-run failure
46
- * stops before any `createIssue`, and the run lists every warning (a
47
- * footprint probe that disagrees with the base branch, an empty `verify[]`,
48
- * an open question in a body) either way. `--dry-run` still creates nothing.
49
- *
50
- * stdout is reserved for the JSON result (Story #2278 discipline, extended to
51
- * this CLI by Story #4541): `routeAllOutputToStderr()` runs before any
52
- * pipeline code so a headless driver can `JSON.parse` stdout unconditionally.
53
- * Human-readable log lines go to stderr, matching the sibling `plan-context`.
4
+ * plan-persist.js — validate authored plan artifacts and create the Story
5
+ * issue(s). Without `--dry-run` it runs the write-free dry-run first and
6
+ * persists in the same invocation only if every gate passes. stdout carries
7
+ * only the JSON result; logs go to stderr.
54
8
  *
55
9
  * Exit codes: 0 success; 1 fatal; 3 reachability orphans (nothing mutated).
56
10
  */
@@ -137,9 +91,6 @@ async function readJsonFile(filePath, label) {
137
91
  }
138
92
 
139
93
  /**
140
- * Resolve every input path the CLI accepts, including where the
141
- * `plan-context.js` envelope is discovered from. Exported for tests.
142
- *
143
94
  * @param {object} values Parsed `parseArgs` values.
144
95
  */
145
96
  export function resolveInputPaths(values) {
@@ -171,16 +122,11 @@ async function loadArtifacts(paths) {
171
122
  }
172
123
 
173
124
  /**
174
- * Resolve the optional container-Epic request from the CLI flags.
125
+ * Title and goal are required together; exactly one is a usage error rather
126
+ * than a silent no-Epic run.
175
127
  *
176
- * Both halves are required together: an Epic with a title and no goal is a
177
- * container with nothing explaining the grouping, and a goal with no title
178
- * cannot be opened at all. Supplying exactly one is a **usage error**, not a
179
- * silent no-Epic run — the operator asked for a container and would otherwise
180
- * never learn they did not get one.
181
- *
182
- * @param {object} values Parsed `parseArgs` values.
183
- * @returns {{ title: string, goal: string }|null} `null` when no Epic was requested.
128
+ * @param {object} values
129
+ * @returns {{ title: string, goal: string }|null}
184
130
  */
185
131
  export function resolveEpicRequest(values) {
186
132
  const title = (values['epic-title'] ?? '').trim();
@@ -197,15 +143,11 @@ export function resolveEpicRequest(values) {
197
143
  }
198
144
 
199
145
  /**
200
- * Refuse `--epic` alongside `--epic-title`/`--epic-goal`.
201
- *
202
- * A run either joins a container or opens one; asking for both names no
203
- * coherent outcome, so it is a usage error rather than a silent precedence
204
- * rule the operator would have to know.
146
+ * A run joins an Epic or opens one, never both.
205
147
  *
206
- * @param {object} values Parsed `parseArgs` values.
148
+ * @param {object} values
207
149
  * @returns {void}
208
- * @throws {Error} When both forms were supplied.
150
+ * @throws {Error}
209
151
  */
210
152
  export function assertEpicFlagsExclusive(values) {
211
153
  const adopts = (values.epic ?? '').trim() !== '';
@@ -222,14 +164,11 @@ export function assertEpicFlagsExclusive(values) {
222
164
  }
223
165
 
224
166
  /**
225
- * Resolve `--epic <id>`: the existing open container this run joins.
226
- *
227
- * Story #5155. Parsed here rather than deep in the engine so a typo costs a
228
- * usage error before any provider call — the id itself is verified against
229
- * live state later, before the first create.
167
+ * `--epic <id>` shape check before any provider call; existence is verified
168
+ * later against live state.
230
169
  *
231
- * @param {object} values Parsed `parseArgs` values.
232
- * @returns {number|null} `null` when no adoption was requested.
170
+ * @param {object} values
171
+ * @returns {number|null}
233
172
  */
234
173
  export function resolveEpicAdoptionId(values) {
235
174
  const raw = (values.epic ?? '').trim();
@@ -244,16 +183,13 @@ export function resolveEpicAdoptionId(values) {
244
183
  }
245
184
 
246
185
  /**
247
- * Assemble the `runPlanPersist` opts bag from parsed CLI values.
186
+ * Where envelope-derived source ids meet the engine; a break here silently
187
+ * un-wires `--tickets` superseding.
248
188
  *
249
- * Exported for tests: this is the join where the envelope-derived source ids
250
- * meet the persist engine, so a regression here silently un-wires
251
- * `/mandrel-plan --tickets` superseding (Story #4554).
252
- *
253
- * @param {object} values Parsed `parseArgs` values.
189
+ * @param {object} values
254
190
  * @param {ReturnType<typeof resolveInputPaths>} paths
255
191
  * @param {object|null} planContextEnvelope
256
- * @returns {object} opts for `runPlanPersist`.
192
+ * @returns {object}
257
193
  */
258
194
  export function buildPersistOptions(values, paths, planContextEnvelope) {
259
195
  const source = resolveSourceTicketIds({
@@ -270,8 +206,7 @@ export function buildPersistOptions(values, paths, planContextEnvelope) {
270
206
  sourceTicketOrigin: source.origin,
271
207
  epic: resolveEpicRequest(values),
272
208
  adoptEpicId: resolveEpicAdoptionId(values),
273
- // Default-on: `--no-close-superseded` is the explicit escape and always
274
- // wins over the (default `true`) `--close-superseded`.
209
+ // `--no-close-superseded` always wins.
275
210
  closeSuperseded:
276
211
  values['no-close-superseded'] === true
277
212
  ? false
@@ -313,32 +248,10 @@ async function runPersistInvocation({
313
248
  }
314
249
 
315
250
  /**
316
- * The default persist path (Story #4741 AC-1/AC-3; widened to any plan by
317
- * Story #5312; made the default by Story #5342): chain a clean dry-run into
318
- * the real persist in ONE operator invocation.
319
- *
320
- * Two passes over the **same** loaded artifacts:
321
- *
322
- * 1. A write-free dry-run. Every gate runs before any `createIssue` can
323
- * happen, so a validation failure — which throws or returns reachability
324
- * orphans — stops here, before a single issue exists (AC-3).
325
- * 2. The real write, run when the dry-run passed clean. Because it replays
326
- * the identical artifacts, the persisted output is byte-identical to
327
- * what the dry-run validated (AC-1). The lite-route condition that used
328
- * to gate this step went with the plan-side lite claim: a clean dry-run
329
- * is the review the chain exists to fold.
330
- *
331
- * The caller reads the **second** pass's envelope, so the first pass's
332
- * evidence has to be carried onto it (Story #5361). The repair pass mutates
333
- * the loaded tickets in place, which is what makes replaying the identical
334
- * artifacts possible at all — and it is also why pass 2 recomputes an empty
335
- * `repairs[]`: by then there is nothing left to repair. The evidence is
336
- * preserved rather than re-derived, because re-running the repair pass would
337
- * report repairs the persisting pass did not make.
338
- *
339
- * Exported for tests — this is where the round-trip collapse lives, so a
340
- * regression here silently re-opens the second operator round-trip (or
341
- * worse, persists a plan the dry-run never gated).
251
+ * Dry-run then persist over the SAME artifacts: a gate failure throws before
252
+ * any issue exists, and the write replays exactly what was validated. The
253
+ * repair pass mutates tickets in place, so pass 2 sees no repairs — carry pass
254
+ * 1's evidence onto the returned envelope.
342
255
  *
343
256
  * @param {{ values: object, config: object, provider: object,
344
257
  * artifacts: object, metricsSince: string }} args
@@ -385,10 +298,7 @@ export async function runPersistChain({
385
298
  }
386
299
 
387
300
  /**
388
- * Union two evidence lists, dry-run first, dropping an entry the second pass
389
- * reported identically. Order is the operator's reading order; the dedupe is
390
- * by rendered content because a repair is a plain record and a warning is a
391
- * string, so two passes that noticed the same thing noticed it byte-for-byte.
301
+ * Ordered union, deduped by serialized content.
392
302
  *
393
303
  * @param {unknown} first
394
304
  * @param {unknown} second
@@ -410,19 +320,7 @@ function mergeEvidence(first, second) {
410
320
  }
411
321
 
412
322
  /**
413
- * Decide whether this invocation persists after its gates, or only validates.
414
- *
415
- * Story #5342: chaining is the default, not a flag. Every invocation that is
416
- * not an explicit `--dry-run` runs the gate list and then persists what it
417
- * passed, so the two operator round-trips collapse without anyone having to
418
- * remember an opt-in. Story #5361 removed the no-op alias Story #5342 had
419
- * kept for existing call-sites, rather than accepting and ignoring it: a flag
420
- * that cannot change an outcome is a shim, and `parseArgs` refuses an unknown
421
- * option, so passing it now fails loudly instead of reading as honoured.
422
- *
423
- * Exported for tests: this one predicate is what makes the CLI one command.
424
- *
425
- * @param {object} values Parsed `parseArgs` values.
323
+ * @param {object} values
426
324
  * @returns {boolean} `true` to run the gates and then persist.
427
325
  */
428
326
  export function shouldChainPersist(values) {
@@ -430,18 +328,8 @@ export function shouldChainPersist(values) {
430
328
  }
431
329
 
432
330
  /**
433
- * Attach the plan-metrics roll-up for **this** invocation.
434
- *
435
- * Two Story #4541 fixes meet here. `readPlanMetrics` is declared
436
- * `(epicId, config)` but was called with `config` first, so it threw its
437
- * `epicId` guard on every run and the catch below turned that into a
438
- * silently missing summary — v2 persist is always Epic-less, hence the
439
- * explicit `null`. And the Epic-less ledger is shared across every plan the
440
- * repo has ever run, so `since` scopes the counts to the current invocation
441
- * instead of reporting lifetime totals under an invocation-shaped line.
442
- *
443
- * This runs *after* `recordPlanInvocation` has appended this run's own
444
- * record, so the summary always has at least that one entry to report.
331
+ * Attach the plan-metrics roll-up for this invocation. The Epic-less (`null`)
332
+ * ledger is shared by every plan run, so `since` scopes it to this one.
445
333
  *
446
334
  * @param {object} result Mutated in place with `planMetrics`.
447
335
  * @param {object} config
@@ -468,14 +356,10 @@ async function main() {
468
356
  throw new Error(USAGE);
469
357
  }
470
358
 
471
- // stdout is reserved for the JSON result: flip every Logger sink that could
472
- // land on stdout to stderr BEFORE any pipeline code runs (Story #2278
473
- // discipline, extended here by Story #4541 — this CLI interleaved Logger
474
- // lines with its own JSON, so a headless driver could not parse stdout).
359
+ // stdout is reserved for the JSON result.
475
360
  routeAllOutputToStderr();
476
361
 
477
- // Boundary for this invocation's plan-metrics roll-up — stamped before any
478
- // ledger-writing work so every record this run appends falls inside it.
362
+ // Stamped before any ledger write so this run's records fall inside it.
479
363
  const metricsSince = new Date().toISOString();
480
364
 
481
365
  let config;
@@ -485,8 +369,7 @@ async function main() {
485
369
  } catch (err) {
486
370
  throw new Error(`Config schema validation failed:\n${err.message}`);
487
371
  }
488
- // Argument-shape refusals fire before any I/O (Story #5155): a usage error
489
- // the operator can see without waiting on artifact reads or a provider.
372
+ // Argument-shape refusals fire before any I/O.
490
373
  assertEpicFlagsExclusive(values);
491
374
  resolveEpicRequest(values);
492
375
  resolveEpicAdoptionId(values);