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,39 +1,9 @@
1
1
  /**
2
- * run-plan-persist.js — flat Story persist for the v2 `/mandrel-plan` collapse
3
- * (Stage 3 — `docs/roadmap.md`).
4
- *
5
- * Ordered pipeline — hard gates refuse, everything else is a **warning** the
6
- * dry-run lists (Story #5312):
7
- *
8
- * 1. `changes[]` repair + ticket validator + file-assumption + DAG
9
- * 2. Draft reachability (named soft failure, exit 3)
10
- * 3. Same-wave collision refusal (`assertNoWaveCollisions`) + spec fold
11
- * 4. Create Story issues (`type::story` + sanitized authored labels —
12
- * deliberately NOT `agent::ready`), resumably via a plan fingerprint
13
- * 5. Upsert `story-plan-state` on every created Story; upsert `plan-summary`
14
- * on the primary Story
15
- * 6. Flip every Story to `agent::ready` — the terminal step, so `ready`
16
- * always implies "checkpoints written"
17
- * 7. Comment on + close the superseded `--tickets` source issues
18
- * (Story #4535) — bookkeeping only; never fails the run
19
- * 8. Temp cleanup at terminal success + a stale-plan-dir reap
20
- *
21
- * **Why `agent::ready` moved to the end (Story #4541).** Issues used to be
22
- * born `agent::ready` in the creating POST while the checkpoints were
23
- * written afterwards. Anything picking a Story up in that window — or after
24
- * a comment failure aborted the loop — read the checkpoint as `null`
25
- * (`story-plan-state.js` degrades missing/malformed to `null`). Creating
26
- * unlabelled, writing checkpoints, then flipping closes that race.
27
- *
28
- * **No authored risk artifact (Story #4542).** Persist neither requires nor
29
- * accepts a risk verdict, derives no envelope from one, and computes no
30
- * review routing. Review depth and the acceptance-critic mode are derived from
31
- * the diff at close time (`review-depth.js#deriveChangeLevel`); `--force-review`
32
- * is an explicit operator flag, recorded here as a receipt and never inferred.
33
- *
34
- * Hard cutover: no Epic parent, no reconciler, no `deliveryShape`, no
35
- * `--amend` tree cascades. Those surfaces die with Stages 4–5 for any
36
- * remaining epic-delivery readers.
2
+ * Flat Story persist. Hard gates refuse; everything else is a warning the
3
+ * dry-run lists. Order: validate → reachability → wave-collision gate →
4
+ * create (without `agent::ready`) → plan comment on every Story → flip to
5
+ * `agent::ready` last, so `ready` implies "plan comments written" → close
6
+ * superseded sources (never fails the run) → temp cleanup.
37
7
  *
38
8
  * @module lib/orchestration/plan-persist/run-plan-persist
39
9
  */
@@ -75,65 +45,37 @@ import {
75
45
  createStoryIssues,
76
46
  markStoriesReady,
77
47
  } from './story-ops.js';
78
- import {
79
- buildPlanSummaryCommentBody,
80
- buildWaveTable,
81
- PLAN_SUMMARY_COMMENT_TYPE,
82
- } from './summary.js';
48
+ import { buildPlanSummaryCommentBody, buildWaveTable } from './summary.js';
83
49
  import { closeSupersededTickets } from './supersede-ops.js';
84
50
  import { assertNoWaveCollisions } from './wave-collision-gate.js';
85
51
 
86
- /** Checkpoint schema version written on each Story's story-plan-state. */
87
- const PLAN_CHECKPOINT_SCHEMA_VERSION_V2 = 2;
88
-
89
- /** Structured-comment type for the per-plan Story checkpoint. */
52
+ /** Marker that makes a re-persist upsert the comment in place. */
90
53
  const STORY_PLAN_STATE_TYPE = 'story-plan-state';
91
54
 
92
55
  /**
93
- * Write the `story-plan-state` checkpoint on a Story.
56
+ * The one comment persist posts per Story, carrying the plan summary.
94
57
  *
95
58
  * @param {object} provider
96
59
  * @param {number} storyId
97
- * @param {object} state
60
+ * @param {string} summary Must be non-empty.
61
+ * @returns {Promise<void>}
98
62
  */
99
- export async function writeCheckpointV2(provider, storyId, state) {
63
+ export async function writePlanSummaryComment(provider, storyId, summary) {
100
64
  if (!Number.isInteger(storyId)) {
101
- throw new TypeError('writeCheckpointV2 requires a numeric storyId');
65
+ throw new TypeError('writePlanSummaryComment requires a numeric storyId');
66
+ }
67
+ const body = summary?.trim();
68
+ if (!body) {
69
+ throw new TypeError(
70
+ 'writePlanSummaryComment requires a non-empty plan summary',
71
+ );
102
72
  }
103
- const body = [
104
- '### story-plan-state',
105
- '',
106
- '```json',
107
- JSON.stringify(
108
- {
109
- version: PLAN_CHECKPOINT_SCHEMA_VERSION_V2,
110
- storyId,
111
- ...state,
112
- },
113
- null,
114
- 2,
115
- ),
116
- '```',
117
- ].join('\n');
118
73
  await upsertStructuredComment(provider, storyId, STORY_PLAN_STATE_TYPE, body);
119
- return state;
120
74
  }
121
75
 
122
76
  /**
123
- * Enforce the ticket validator's hard errors and collect its warnings.
124
- *
125
- * Since Story #5312 the only hard refusal the validator batches into
126
- * `errors[]` is a `deletes` naming a path absent at base; every other
127
- * footprint probe — a `creates` / `refactors-existing` mismatch, a goal,
128
- * acceptance or verify path absent at base — lands on `warnings[]`, which
129
- * the dry-run prints and the persist proceeds past. The `changes[]` repairs
130
- * the helper applied are reported alongside so the operator sees what was
131
- * rewritten.
132
- *
133
- * The returned freshness counts feed the posted `plan-summary`'s freshness
134
- * line: every warning is a reference the base branch disagreed with, so it
135
- * counts as `stale` there rather than the comment reading "clean" on a run
136
- * that had something to say.
77
+ * Throw on validator hard errors; return warnings (with applied `changes[]`
78
+ * repairs) and freshness counts for the summary.
137
79
  *
138
80
  * @returns {{ warnings: string[], freshness: { stale: number, ambiguous: number } }}
139
81
  */
@@ -156,10 +98,8 @@ function enforceTicketValidation(validated) {
156
98
  }
157
99
 
158
100
  /**
159
- * Freshness counts for the posted plan summary. Every validator warning is
160
- * a reference the base branch disagreed with — `stale` when a base ref was
161
- * actually read, `ambiguous` when none resolved in this checkout and the
162
- * probes were skipped, since nothing was verified either way.
101
+ * Every validator warning counts `stale` when a base ref was read, else
102
+ * `ambiguous` (the probes were skipped, nothing was verified).
163
103
  *
164
104
  * @param {string|null} probeRef
165
105
  * @param {string[]} warnings
@@ -170,18 +110,13 @@ function freshnessCounts(probeRef, warnings) {
170
110
  return { stale: warnings.length, ambiguous: 0 };
171
111
  }
172
112
 
173
- /** How each text-hygiene finding kind names itself on the warning list. */
174
113
  const TEXT_HYGIENE_LABELS = {
175
114
  'open-question': 'open question in body',
176
115
  'pinned-identifier': 'pinned identifier in acceptance[]',
177
116
  };
178
117
 
179
118
  /**
180
- * The advisory text-hygiene lints over the draft (Story #5312, #5323) — an
181
- * operator-directed question persisted into a Story a non-interactive
182
- * sub-agent executes, and an acceptance item pinning an internal symbol the
183
- * advisory `changes[]` may reshape. Warnings the dry-run lists, never
184
- * refusals.
119
+ * Advisory text-hygiene lints (warnings, never refusals).
185
120
  *
186
121
  * @param {object[]} rawStories
187
122
  * @returns {string[]}
@@ -196,10 +131,6 @@ function collectTextHygieneWarnings(rawStories) {
196
131
  }
197
132
 
198
133
  /**
199
- * Print every warning the run collected under one heading. The dry-run is
200
- * where an operator reads these; the persist prints the same list so a
201
- * `--chain-on-clean` run loses nothing.
202
- *
203
134
  * @param {string[]} warnings
204
135
  * @returns {void}
205
136
  */
@@ -214,12 +145,8 @@ function logWarnings(warnings) {
214
145
  }
215
146
 
216
147
  /**
217
- * Run the supersede close phase behind a belt-and-braces guard.
218
- *
219
- * `closeSupersededTickets` already swallows per-ticket failures, but this
220
- * phase runs *after* `createIssue`, so an unexpected throw anywhere in it
221
- * would leave the run half-done with Stories already live. Degrade to a
222
- * reported failure instead.
148
+ * Runs after the Stories are live, so an unexpected throw degrades to a
149
+ * reported failure rather than a half-done run.
223
150
  *
224
151
  * @returns {Promise<import('./supersede-ops.js').SupersedeReport>}
225
152
  */
@@ -248,28 +175,11 @@ async function runSupersedePhase(args) {
248
175
  }
249
176
 
250
177
  /**
251
- * Render the plan-metrics line for the **posted** `plan-summary` comment,
252
- * scoped to this invocation.
253
- *
254
- * The ordering hazard this closes: the ledger record for the current run is
255
- * appended by `recordPlanInvocation`'s `finally`, which by construction only
256
- * fires once `runPlanPersist` has *resolved* — long after this comment body
257
- * is composed. A plain `since`-filtered ledger read therefore summarized
258
- * every run except the one being summarized, and on an otherwise-quiet
259
- * ledger it rendered "plan-metrics: no invocations recorded" onto the very
260
- * comment reporting the run. (The stdout envelope was always correct: its
261
- * `attachPlanMetrics` read runs after the wrapper returns.)
262
- *
263
- * **The `finally` stays where it is.** It is what guarantees a persist that
264
- * throws is still recorded, so moving the append earlier — or moving this
265
- * read later, past the GitHub writes it feeds — would trade a cosmetic bug
266
- * for a real one. Instead of racing it, fold in a synthetic record standing
267
- * for the in-flight invocation. It is the same record the wrapper is about to
268
- * write, minus a final duration; it cannot double-count, because the real one
269
- * does not exist yet at this point in the pipeline.
270
- *
271
- * `ok: true` is honest here: this line is only ever composed on the success
272
- * path, after `createStoryIssues` has returned.
178
+ * Plan-metrics line for the posted summary, scoped to this invocation. The
179
+ * run's own ledger record is appended by the wrapper's `finally` (which must
180
+ * stay there so a throwing persist is still recorded) only after this
181
+ * resolves, so fold in a synthetic in-flight record; it cannot double-count.
182
+ * `ok: true` holds because this runs only on the success path.
273
183
  *
274
184
  * @param {{ config: object, since: string, startedAt: string, mode: string }} args
275
185
  * @returns {Promise<string|null>}
@@ -305,20 +215,13 @@ async function renderRunScopedPlanMetricsLine({
305
215
  }
306
216
 
307
217
  /**
308
- * Re-run the cross-Story conflict passes over the assembled bodies
309
- * (Story #5045).
310
- *
311
- * `validateTickets` runs before assembly, over the raw payload, so until now
312
- * plan-time conflict analysis judged an artifact that is not the one persist
313
- * writes — and the passes that scan `body.acceptance` / `body.verify` were
314
- * inert on the canonical top-level authoring shape as a result. Findings the
315
- * raw pass already reported are dropped so the same collision is not
316
- * announced twice per run; the rest are returned for the plan-summary
317
- * comment, which is where these findings stop being a stderr line nobody
318
- * keeps. Every finding is advisory (Story #5312).
218
+ * Re-run the conflict passes over the assembled bodies — the artifact persist
219
+ * actually writes (the body-scanning passes are inert on the raw payload).
220
+ * Only findings the raw pass did not already report are surfaced; all are
221
+ * advisory.
319
222
  *
320
223
  * @param {{ stories: object[], rawFindings: object[] }} args
321
- * @returns {object[]} The assembled-pass findings, for the summary comment.
224
+ * @returns {object[]}
322
225
  */
323
226
  function analyzeAssembledStories({ stories, rawFindings }) {
324
227
  const findings = computeAssembledConflictFindings({ stories });
@@ -335,23 +238,9 @@ function analyzeAssembledStories({ stories, rawFindings }) {
335
238
  }
336
239
 
337
240
  /**
338
- * Reap abandoned `plan-*` directories under the temp root (Story #4541).
339
- *
340
- * Terminal-success cleanup only ever removed the *current* run's `planDir`,
341
- * so every plan that failed a gate, was abandoned mid-authoring, or ran
342
- * `--dry-run` left its directory behind forever. This sweeps the stragglers
343
- * on each persist.
344
- *
345
- * Story #4794 folded the age-floored reap into the shared temp-retention
346
- * engine — `planDirs` is one of its declared classes, so the plan path and
347
- * the delivery path now converge on one classifier and one staleness floor
348
- * (`delivery.tempRetention.staleDays`, still 7 days by default) instead of
349
- * this module owning a private constant. Behaviour is unchanged: only
350
- * `plan-*` directories are considered, the age test is the directory's own
351
- * mtime, and the current run's `planDir` is excluded.
352
- *
353
- * Best-effort throughout: this is hygiene, never a reason to fail a run that
354
- * has already created Stories.
241
+ * Reap abandoned `plan-*` directories (failed, abandoned, or dry-run plans)
242
+ * via the shared temp-retention staleness floor, excluding this run's.
243
+ * Best-effort hygiene.
355
244
  *
356
245
  * @param {{ config?: object, keepDir?: string|null, now?: number }} args
357
246
  * @returns {Promise<{ reaped: string[] }>}
@@ -372,11 +261,6 @@ export async function reapStalePlanDirs({
372
261
  }
373
262
 
374
263
  /**
375
- * Fail closed on a payload that cannot be persisted. Extracted from
376
- * `runPlanPersist` (Story #4926) so the entry point carries the flow, not the
377
- * guards. The reviewability budget that used to sit beside this check went
378
- * with Story #5312 — a plan is as many Stories as the split policy yields.
379
- *
380
264
  * @param {unknown} rawStories
381
265
  * @returns {void}
382
266
  * @throws {Error} On an empty payload.
@@ -391,7 +275,7 @@ function assertPersistablePlan(rawStories) {
391
275
  }
392
276
 
393
277
  /**
394
- * Enforce the draft-reachability critic: orphans throw, a skip is ledgered.
278
+ * Orphans throw; a skip is ledgered.
395
279
  *
396
280
  * @param {{ status: string, reasons: string[], orphans?: object[] }} reachability
397
281
  * @param {object} config
@@ -419,63 +303,23 @@ async function enforceReachability(reachability, config) {
419
303
  }
420
304
 
421
305
  /**
422
- * Write the per-Story checkpoint, upsert the plan-summary comment, and flip
423
- * every created Story to `agent::ready`. Terminal ordering is load-bearing:
424
- * `agent::ready` lands last so it can honestly mean "fully persisted"
425
- * (Story #4541). A dry run performs none of it.
426
- *
427
- * **The checkpoints fan out; the phase boundary does not** (Story #4952). The
428
- * per-Story upserts are independent of one another and run under bounded
429
- * concurrency, but the `await` on that whole fan-out is what keeps the
430
- * Story #4541 invariant intact: *every* checkpoint is on its ticket before the
431
- * first `agent::ready` flip is issued, so `ready` still means "fully
432
- * persisted" and a `/mandrel-deliver` that picks a Story up cannot read a null
433
- * checkpoint. Concurrency inside the phase is safe; overlapping the phases is
434
- * the race this ordering exists to close.
306
+ * Plan comments fan out concurrently, but the whole fan-out is awaited before
307
+ * the first `agent::ready` flip, so `ready` always means "fully persisted".
308
+ * Never overlap the two phases.
435
309
  *
436
310
  * @param {object} args
437
311
  * @returns {Promise<void>}
438
312
  */
439
- async function persistStoryArtifacts({
440
- provider,
441
- created,
442
- primary,
443
- summaryBody,
444
- }) {
445
- const cohort = created.map((createdStory) => ({
446
- slug: createdStory.slug,
447
- id: createdStory.id,
448
- }));
313
+ async function persistStoryArtifacts({ provider, created, summaryBody }) {
449
314
  await concurrentMap(
450
315
  created,
451
- (story) =>
452
- writeCheckpointV2(provider, story.id, {
453
- persist: {
454
- completedAt: new Date().toISOString(),
455
- storyCount: created.length,
456
- primaryStoryId: primary.id,
457
- stories: cohort,
458
- },
459
- }),
460
- // The per-Story checkpoint upserts (Story #4952): each targets a
461
- // different issue and reads nothing another writes, so this loop was
462
- // serial only by construction — but see {@link persistStoryArtifacts}
463
- // for the phase ordering that is *not* incidental.
316
+ (story) => writePlanSummaryComment(provider, story.id, summaryBody),
464
317
  { concurrency: FANOUT_CONCURRENCY },
465
318
  );
466
- await upsertStructuredComment(
467
- provider,
468
- primary.id,
469
- PLAN_SUMMARY_COMMENT_TYPE,
470
- summaryBody,
471
- );
472
319
  await markStoriesReady({ provider, created });
473
320
  }
474
321
 
475
322
  /**
476
- * Remove this run's plan directory on terminal success, then sweep the
477
- * abandoned ones terminal-success cleanup can never reach (Story #4541).
478
- *
479
323
  * @param {{ config: object, planDir: string|null, skipCleanup: boolean }} args
480
324
  * @returns {Promise<void>}
481
325
  */
@@ -491,9 +335,6 @@ async function cleanupPlanDirs({ config, planDir, skipCleanup }) {
491
335
  }
492
336
 
493
337
  /**
494
- * Log the operator-facing persist epilogue: adoption, the ready primary, the
495
- * deliver command, and the cohort grouping label.
496
- *
497
338
  * @param {{
498
339
  * created: object[],
499
340
  * primary: object,
@@ -522,11 +363,7 @@ function logPersistEpilogue({
522
363
  Logger.info(
523
364
  `[plan-persist] Deliver with: /mandrel-deliver ${created.map((s2) => s2.id).join(' ')}`,
524
365
  );
525
- // Metadata only — a GitHub filter for the cohort this run authored, never
526
- // a delivery-resolution input (/mandrel-deliver stays ids-only, Story #4540).
527
- // Gated on the ensure result: the label ensure degrades non-fatally, and
528
- // advertising a filter GitHub just refused to create is worse than saying
529
- // nothing (Story #5201). The derived id survives in the result envelope.
366
+ // Never advertise a filter for a label the ensure failed to create.
530
367
  if (planRunLabelApplied) {
531
368
  Logger.info(
532
369
  `[plan-persist] Cohort grouping label: ${planRunLabel} — filter with ` +
@@ -536,8 +373,6 @@ function logPersistEpilogue({
536
373
  }
537
374
 
538
375
  /**
539
- * Execute the flat Story persist end to end.
540
- *
541
376
  * @param {{
542
377
  * provider: object,
543
378
  * artifacts: {
@@ -580,16 +415,11 @@ export async function runPlanPersist({
580
415
  sourceTicketIds = [],
581
416
  sourceTicketOrigin = 'none',
582
417
  closeSuperseded = true,
583
- // Story #5139 — the optional container Epic. `null` (the default) is the
584
- // ordinary shape: no Epic is created unless `/mandrel-plan` offered one
585
- // above the threshold and the operator confirmed it.
418
+ // Optional container Epic; only set when the operator confirmed one.
586
419
  epic = null,
587
420
  } = opts;
588
421
 
589
- // Boundary for the plan-metrics summary below: everything this invocation
590
- // appends to the ledger is stamped at or after this instant, so filtering
591
- // on it scopes the counts to *this* run rather than every plan ever run
592
- // through the shared standalone ledger (Story #4541).
422
+ // Scopes the plan-metrics summary to this run's ledger entries.
593
423
  const runStartedAt = opts.metricsSince ?? new Date().toISOString();
594
424
 
595
425
  assertPersistablePlan(rawStories);
@@ -613,51 +443,38 @@ export async function runPlanPersist({
613
443
  });
614
444
  await enforceReachability(reachability, config);
615
445
 
616
- // Story #5155 — the plan's outward references (`--epic <id>`, and any
617
- // `#<id>` blocker) resolve BEFORE the first create, dry run included.
446
+ // Outward references (`--epic <id>`, `#<id>` blockers) resolve before the
447
+ // first create, dry run included.
618
448
  const adoptionTarget = await resolveCrossPlanLinks({
619
449
  provider,
620
450
  stories: rawStories,
621
451
  epicId: opts.adoptEpicId ?? null,
622
452
  });
623
453
 
624
- // Inline Spec fold (Specs stay inline, never under docs/).
625
454
  const seedContent = planContextEnvelope?.seed?.content ?? '';
626
- const { stories: assembled } = assemblePlanStories(rawStories, {
627
- sharedSpec: techSpecContent,
628
- sourceTicketIds,
629
- // The seed this plan was authored from: an audit sweep's Single-plan seed
630
- // carries the `audit-fingerprints` / `audit-semantic-keys` footers, and
631
- // assembly copies them into the persisted Story bodies so the next sweep
632
- // recognises what it already planned (Story #4877). Since Story #5045 this
633
- // is the **fallback** — it is carried onto every Story that did not
634
- // attribute its own `provenance`, which keeps an un-attributed plan exactly
635
- // as recall-safe as it was. Empty for a `--tickets` run, a no-op there.
636
- provenanceSource: seedContent,
637
- });
455
+ const { stories: assembled, warnings: supersedeWarnings } =
456
+ assemblePlanStories(rawStories, {
457
+ sharedSpec: techSpecContent,
458
+ sourceTicketIds,
459
+ // Audit footers carried onto every Story that did not attribute its own
460
+ // `provenance`; empty for a `--tickets` run.
461
+ provenanceSource: seedContent,
462
+ });
463
+
464
+ warnings.push(...supersedeWarnings);
465
+ logWarnings(supersedeWarnings);
638
466
 
639
- // Stamp the `audit::*` labels the dedup corpus is listed by. Without them a
640
- // Story this path files is absent from the pool an indexed sweep matches
641
- // against, and an indexed run answers exact lookups from that pool without
642
- // ever reaching the provider — so the provenance footers alone leave it
643
- // invisible (Story #5307). A non-audit seed carries none: a no-op there.
467
+ // The dedup corpus is listed by `audit::*` label; footers alone leave the
468
+ // Story invisible to an indexed sweep.
644
469
  const stories = withAuditLabels(assembled, seedContent);
645
470
 
646
- // Story #5045: the cross-Story conflict passes re-run over the assembled,
647
- // footer-stamped bodies — the artifact persist actually writes — before any
648
- // GitHub call, so a policy upgrade still refuses the plan pre-creation.
649
471
  const assembledConflicts = analyzeAssembledStories({
650
472
  stories,
651
473
  rawFindings: validated.findings,
652
474
  });
653
475
 
654
- // Story #5332 — the split gate, ahead of the first create. `buildWaveTable`
655
- // needs only `{slug, title, depends_on}` and the prediction needs only the
656
- // assembled bodies, so both can run before anything is written; they used
657
- // to sit *after* creation, which is why the collision table could only ever
658
- // be a receipt for a plan already live. The same computed value is handed
659
- // to the summary rendering below rather than recomputed, so the refusal and
660
- // the receipt can never disagree.
476
+ // The split gate runs before the first create; the same values feed the
477
+ // summary so the refusal and the receipt cannot disagree.
661
478
  const waveTable = buildWaveTable(
662
479
  stories.map((s) => ({
663
480
  slug: s.slug,
@@ -666,12 +483,8 @@ export async function runPlanPersist({
666
483
  })),
667
484
  );
668
485
 
669
- // Story #5265: the table says which Stories share an order; the dispatcher
670
- // decides which of those actually run together. Run its own predicate over
671
- // the assembled bodies — the exact artifact the tick will read back off
672
- // GitHub — so an N>1 draft it would serialize is refused here, and the
673
- // summary comment names the serialisation instead of promising parallelism
674
- // the next tick refuses. One enumeration feeds both.
486
+ // The dispatcher's own predicate over the assembled bodies, so a draft it
487
+ // would serialize is refused here rather than promised as parallel.
675
488
  const waveCollisions = assertNoWaveCollisions(waveTable, stories, {
676
489
  tempRoot: getPaths(config).tempRoot,
677
490
  });
@@ -683,20 +496,10 @@ export async function runPlanPersist({
683
496
  opts: { dryRun },
684
497
  });
685
498
 
686
- // What this run filed, recorded where the next audit sweep reads it
687
- // (Story #5307). A dry run created nothing, and the call knows it.
688
499
  recordAuditFilings({ stories, created, tickets: rawStories, dryRun });
689
500
 
690
501
  const primary = created[0];
691
502
 
692
- // Story #4541: `readPlanMetrics` is declared `(epicId, config)` but was
693
- // called with `config` first, so the ledger path resolver received the
694
- // config object as an `epicId` and threw its guard on every single run —
695
- // a throw this try/catch then swallowed into a silently absent summary.
696
- // v2 persist is always Epic-less, hence the explicit `null`. The `since`
697
- // filter keeps the counts about this invocation, and the in-flight record
698
- // is folded in because the wrapper has not written it yet — see
699
- // `renderRunScopedPlanMetricsLine`.
700
503
  const planMetricsLine = await renderRunScopedPlanMetricsLine({
701
504
  config,
702
505
  since: runStartedAt,
@@ -714,27 +517,16 @@ export async function runPlanPersist({
714
517
  mode: 'stories',
715
518
  planMetricsLine,
716
519
  stories: created,
717
- // Story #5045: the wave table promises what can run in parallel; the
718
- // collisions the conflict passes found belong on the same surface, or the
719
- // promise is the only half anyone reads.
720
520
  conflictFindings: assembledConflicts,
721
521
  waveCollisions,
722
522
  });
723
523
 
724
524
  if (!dryRun) {
725
- await persistStoryArtifacts({
726
- provider,
727
- created,
728
- primary,
729
- summaryBody,
730
- });
525
+ await persistStoryArtifacts({ provider, created, summaryBody });
731
526
  }
732
527
 
733
- // Story #5139 — the container Epic is created LAST among the writes: its
734
- // body embeds the child issue numbers and its sub-issue edges need their
735
- // database ids, neither of which exists until the Stories are live. It is
736
- // never load-bearing, so a failure here degrades to "no container" and the
737
- // Stories still deliver by id.
528
+ // Last among the writes: the Epic needs the children's numbers and database
529
+ // ids. Never load-bearing — a failure degrades to "no container".
738
530
  const containerEpic = await resolveContainerEpic({
739
531
  provider,
740
532
  adoptionTarget,
@@ -748,16 +540,12 @@ export async function runPlanPersist({
748
540
  stories,
749
541
  created,
750
542
  sourceTicketIds,
751
- // Story #5280 — closing a source ticket is a child state change, so the
752
- // phase re-derives the container above it. It needs the config the rollup
753
- // reads its board and operator handle from.
543
+ // Closing a source ticket re-derives its container Epic's rollup.
754
544
  config,
755
545
  dryRun,
756
546
  closeSuperseded,
757
547
  });
758
- // Record which channel the ids came from so a run that superseded nothing
759
- // says *why* (`none` = neither the envelope nor --source-tickets carried
760
- // any) rather than reading as a clean no-op — Story #4554.
548
+ // Lets a run that superseded nothing say why.
761
549
  supersede.sourceTicketOrigin = sourceTicketOrigin;
762
550
 
763
551
  await cleanupPlanDirs({ config, planDir, skipCleanup });
@@ -775,15 +563,9 @@ export async function runPlanPersist({
775
563
  forceReview,
776
564
  reachability,
777
565
  freshness,
778
- // Story #5312: what the run rewrote and what it noticed. The dry-run is
779
- // the review surface now that the footprint probes warn instead of
780
- // refusing, so the list rides the result envelope, not just stderr.
781
566
  warnings,
782
567
  repairs: validated.repairs ?? [],
783
568
  waveTable,
784
- // Story #5265 AC-2/AC-4: both halves of what persist concluded but used
785
- // to keep to itself — the `refactors-existing` declarations it rewrote,
786
- // and the same-order pairs the dispatcher will serialize.
787
569
  assumptionNormalizations: validated.normalizations ?? [],
788
570
  waveCollisions,
789
571
  supersede,
@@ -1,13 +1,6 @@
1
1
  /**
2
2
  * Soft-finding reporting for plan-persist.
3
3
  *
4
- * Story #5312 retired the fan-out gate that shared this file: the delete
5
- * blast-radius probe never refused a real plan, and its `--allow-large-fan-out`
6
- * override was a flag nobody typed. What remains is the one surface that
7
- * announces every advisory finding the validator produced, each under its
8
- * own kind, so the operator reads a conflict as a conflict and a nudge as a
9
- * nudge (Story #4907).
10
- *
11
4
  * @module lib/orchestration/plan-persist/soft-findings
12
5
  */
13
6
 
@@ -18,11 +11,8 @@ import {
18
11
  } from '../ticket-validator-conflicts.js';
19
12
 
20
13
  /**
21
- * Report every soft finding the validator produced, each under its own kind.
22
- *
23
- * Only the {@link CONFLICT_KINDS} are cross-Story conflicts. Any other soft
24
- * kind is a single-Story nudge, and announcing it as a conflict overstated it
25
- * and taught readers to discount the whole channel.
14
+ * Only {@link CONFLICT_KINDS} are reported as conflicts; other soft kinds are
15
+ * single-Story advisories, so the channel is not overstated.
26
16
  *
27
17
  * @param {object[]} findings
28
18
  * @param {string} [tag]