mandrel 2.60.0 → 2.62.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (662) hide show
  1. package/.agents/README.md +10 -10
  2. package/.agents/agents/story-worker.md +1 -1
  3. package/.agents/docs/agentrc-reference.json +4 -82
  4. package/.agents/docs/configuration.md +20 -87
  5. package/.agents/docs/workflows.md +1 -1
  6. package/.agents/instructions.md +1 -3
  7. package/.agents/rules/gherkin-standards.md +4 -0
  8. package/.agents/schemas/agentrc.schema.json +11 -486
  9. package/.agents/schemas/story-deliver-terminal.schema.json +10 -0
  10. package/.agents/schemas/validation-evidence.schema.json +2 -1
  11. package/.agents/scripts/README.md +14 -14
  12. package/.agents/scripts/acceptance-eval.js +32 -164
  13. package/.agents/scripts/agents-bootstrap-github.js +27 -129
  14. package/.agents/scripts/apply-quality-bootstrap.js +4 -40
  15. package/.agents/scripts/audit-baselines.js +6 -27
  16. package/.agents/scripts/audit-labels-bootstrap.js +5 -29
  17. package/.agents/scripts/audit-to-stories.js +91 -361
  18. package/.agents/scripts/boot-sweep.js +19 -72
  19. package/.agents/scripts/bootstrap.js +74 -395
  20. package/.agents/scripts/ceremony-derive.js +9 -45
  21. package/.agents/scripts/check-arch-cycles.js +14 -64
  22. package/.agents/scripts/check-baselines.js +8 -48
  23. package/.agents/scripts/check-context-budget.js +46 -172
  24. package/.agents/scripts/check-cyclomatic.js +12 -44
  25. package/.agents/scripts/check-dead-exports.js +13 -64
  26. package/.agents/scripts/check-doc-links.js +38 -186
  27. package/.agents/scripts/check-gherkin-corpus.js +24 -127
  28. package/.agents/scripts/check-test-temp-hygiene.js +28 -169
  29. package/.agents/scripts/coverage-capture.js +32 -99
  30. package/.agents/scripts/deliver-light.js +14 -101
  31. package/.agents/scripts/deliver-recover.js +6 -42
  32. package/.agents/scripts/deliver-run.js +36 -133
  33. package/.agents/scripts/diagnose-friction.js +24 -116
  34. package/.agents/scripts/drain-pending-cleanup.js +1 -1
  35. package/.agents/scripts/evidence-gate.js +23 -85
  36. package/.agents/scripts/file-ci-gap.js +10 -50
  37. package/.agents/scripts/generate-config-docs.js +30 -170
  38. package/.agents/scripts/generate-lens-checklists.js +8 -52
  39. package/.agents/scripts/generate-skills-index.js +14 -112
  40. package/.agents/scripts/generate-workflows-doc.js +10 -70
  41. package/.agents/scripts/git-cleanup.js +2 -34
  42. package/.agents/scripts/lib/Graph.js +24 -81
  43. package/.agents/scripts/lib/ITicketingProvider.js +47 -143
  44. package/.agents/scripts/lib/Logger.js +14 -76
  45. package/.agents/scripts/lib/audit-baselines/engine.js +11 -31
  46. package/.agents/scripts/lib/audit-baselines/gate-surface.js +3 -17
  47. package/.agents/scripts/lib/audit-baselines/headroom.js +4 -20
  48. package/.agents/scripts/lib/audit-baselines/hotspots.js +3 -15
  49. package/.agents/scripts/lib/audit-baselines/kinds.js +23 -89
  50. package/.agents/scripts/lib/audit-baselines/outliers.js +6 -23
  51. package/.agents/scripts/lib/audit-baselines/read.js +3 -16
  52. package/.agents/scripts/lib/audit-baselines/staleness.js +7 -26
  53. package/.agents/scripts/lib/audit-baselines/surface-entry.js +7 -28
  54. package/.agents/scripts/lib/audit-baselines/trend.js +7 -20
  55. package/.agents/scripts/lib/audit-baselines/weights.js +9 -37
  56. package/.agents/scripts/lib/audit-suite/audit-rules-reader.js +3 -18
  57. package/.agents/scripts/lib/audit-suite/checklist-threading.js +26 -124
  58. package/.agents/scripts/lib/audit-suite/dispatch-checklist.js +14 -45
  59. package/.agents/scripts/lib/audit-suite/findings.js +12 -52
  60. package/.agents/scripts/lib/audit-suite/frontmatter.js +5 -29
  61. package/.agents/scripts/lib/audit-suite/index.js +1 -15
  62. package/.agents/scripts/lib/audit-suite/lens-checklist.js +10 -45
  63. package/.agents/scripts/lib/audit-suite/lens-diff-floor.js +11 -76
  64. package/.agents/scripts/lib/audit-suite/runner.js +13 -43
  65. package/.agents/scripts/lib/audit-suite/selector.js +49 -349
  66. package/.agents/scripts/lib/audit-suite/substitutions.js +12 -40
  67. package/.agents/scripts/lib/audit-suite/workflow-loader.js +3 -15
  68. package/.agents/scripts/lib/audit-to-stories/audit-label-taxonomy.js +11 -73
  69. package/.agents/scripts/lib/audit-to-stories/audit-lenses.js +8 -37
  70. package/.agents/scripts/lib/audit-to-stories/build-story-body.js +25 -143
  71. package/.agents/scripts/lib/audit-to-stories/dedupe-against-github.js +14 -80
  72. package/.agents/scripts/lib/audit-to-stories/epic-grouping-directive.js +4 -18
  73. package/.agents/scripts/lib/audit-to-stories/finding-adapter.js +7 -40
  74. package/.agents/scripts/lib/audit-to-stories/group-findings.js +9 -39
  75. package/.agents/scripts/lib/audit-to-stories/issue-corpus.js +10 -66
  76. package/.agents/scripts/lib/audit-to-stories/issue-index.js +6 -30
  77. package/.agents/scripts/lib/audit-to-stories/issues-file.js +6 -36
  78. package/.agents/scripts/lib/audit-to-stories/ledger-commit.js +17 -69
  79. package/.agents/scripts/lib/audit-to-stories/ledger-pr.js +17 -85
  80. package/.agents/scripts/lib/audit-to-stories/ledger-record.js +10 -48
  81. package/.agents/scripts/lib/audit-to-stories/parse-audit-md.js +38 -146
  82. package/.agents/scripts/lib/audit-to-stories/seed-from-findings.js +7 -42
  83. package/.agents/scripts/lib/audit-to-stories/wire-dependencies.js +10 -57
  84. package/.agents/scripts/lib/baseline-loader.js +12 -51
  85. package/.agents/scripts/lib/baseline-schema-registry.js +5 -22
  86. package/.agents/scripts/lib/baselines/component-matcher.js +3 -12
  87. package/.agents/scripts/lib/baselines/components.js +10 -61
  88. package/.agents/scripts/lib/baselines/coverage-updater-cli.js +7 -36
  89. package/.agents/scripts/lib/baselines/crap-preview-incremental.js +5 -21
  90. package/.agents/scripts/lib/baselines/crap-preview-scan.js +19 -45
  91. package/.agents/scripts/lib/baselines/crap-updater-cli.js +16 -65
  92. package/.agents/scripts/lib/baselines/diff-scope-cli.js +5 -33
  93. package/.agents/scripts/lib/baselines/duplication-scanner.js +11 -60
  94. package/.agents/scripts/lib/baselines/env-overrides.js +12 -67
  95. package/.agents/scripts/lib/baselines/envelope.js +13 -129
  96. package/.agents/scripts/lib/baselines/exit-codes.js +6 -49
  97. package/.agents/scripts/lib/baselines/git-base.js +23 -142
  98. package/.agents/scripts/lib/baselines/kernel.js +11 -111
  99. package/.agents/scripts/lib/baselines/kinds/_crap-new-method-gate.js +9 -47
  100. package/.agents/scripts/lib/baselines/kinds/_crap-read.js +8 -51
  101. package/.agents/scripts/lib/baselines/kinds/_shared-metric.js +7 -62
  102. package/.agents/scripts/lib/baselines/kinds/bundle-size.js +8 -29
  103. package/.agents/scripts/lib/baselines/kinds/coverage.js +3 -15
  104. package/.agents/scripts/lib/baselines/kinds/crap.js +94 -415
  105. package/.agents/scripts/lib/baselines/kinds/duplication.js +4 -30
  106. package/.agents/scripts/lib/baselines/kinds/kind-factory.js +7 -53
  107. package/.agents/scripts/lib/baselines/kinds/maintainability.js +15 -80
  108. package/.agents/scripts/lib/baselines/kinds/mutation.js +12 -72
  109. package/.agents/scripts/lib/baselines/maintainability-baseline-io.js +4 -11
  110. package/.agents/scripts/lib/baselines/merge-envelopes.js +30 -146
  111. package/.agents/scripts/lib/baselines/path-canon.js +19 -128
  112. package/.agents/scripts/lib/baselines/preview-gates.js +8 -37
  113. package/.agents/scripts/lib/baselines/reader.js +14 -107
  114. package/.agents/scripts/lib/baselines/refresh-service.js +35 -252
  115. package/.agents/scripts/lib/baselines/scope.js +11 -135
  116. package/.agents/scripts/lib/baselines/writer.js +16 -149
  117. package/.agents/scripts/lib/bdd-runner-detect.js +18 -113
  118. package/.agents/scripts/lib/bdd-scenario-budget.js +9 -36
  119. package/.agents/scripts/lib/bdd-scenario-scanner.js +11 -73
  120. package/.agents/scripts/lib/bdd-step-index.js +26 -100
  121. package/.agents/scripts/lib/bootstrap/baseline-merge-driver.js +23 -103
  122. package/.agents/scripts/lib/bootstrap/branch-protection.js +2 -5
  123. package/.agents/scripts/lib/bootstrap/commit-push.js +12 -50
  124. package/.agents/scripts/lib/bootstrap/gh-preflight.js +14 -101
  125. package/.agents/scripts/lib/bootstrap/hitl-confirm.js +5 -30
  126. package/.agents/scripts/lib/bootstrap/install-ledger.js +17 -73
  127. package/.agents/scripts/lib/bootstrap/issue-forms-template.js +17 -121
  128. package/.agents/scripts/lib/bootstrap/manifest.js +15 -86
  129. package/.agents/scripts/lib/bootstrap/merge-methods.js +4 -33
  130. package/.agents/scripts/lib/bootstrap/preflight.js +12 -61
  131. package/.agents/scripts/lib/bootstrap/project-bootstrap.js +34 -235
  132. package/.agents/scripts/lib/bootstrap/prompt.js +21 -129
  133. package/.agents/scripts/lib/bootstrap/quality-bootstrap.js +27 -141
  134. package/.agents/scripts/lib/bootstrap/summary.js +1 -8
  135. package/.agents/scripts/lib/bootstrap/workflow-audit.js +11 -84
  136. package/.agents/scripts/lib/branch-name-guard.js +4 -23
  137. package/.agents/scripts/lib/changed-files.js +31 -143
  138. package/.agents/scripts/lib/checks/core-bare-clean.js +4 -24
  139. package/.agents/scripts/lib/checks/index.js +18 -101
  140. package/.agents/scripts/lib/checks/loop-health.js +11 -53
  141. package/.agents/scripts/lib/checks/state.js +16 -91
  142. package/.agents/scripts/lib/checks/story-init-not-backgrounded.js +10 -61
  143. package/.agents/scripts/lib/checks/subagent-agent-tool-required.js +14 -83
  144. package/.agents/scripts/lib/child-exec.js +39 -108
  145. package/.agents/scripts/lib/cli/standard-args.js +9 -116
  146. package/.agents/scripts/lib/cli-args.js +31 -146
  147. package/.agents/scripts/lib/cli-usage.js +5 -27
  148. package/.agents/scripts/lib/cli-utils.js +2 -12
  149. package/.agents/scripts/lib/close-validation/commands.js +13 -76
  150. package/.agents/scripts/lib/close-validation/gates.js +92 -331
  151. package/.agents/scripts/lib/close-validation/process.js +121 -151
  152. package/.agents/scripts/lib/close-validation/projections/advisories.js +5 -31
  153. package/.agents/scripts/lib/close-validation/projections/crap.js +19 -67
  154. package/.agents/scripts/lib/close-validation/projections/head-sha.js +1 -17
  155. package/.agents/scripts/lib/close-validation/projections/inputs.js +4 -34
  156. package/.agents/scripts/lib/close-validation/projections/maintainability.js +11 -58
  157. package/.agents/scripts/lib/close-validation/runner.js +53 -110
  158. package/.agents/scripts/lib/command-header.js +6 -28
  159. package/.agents/scripts/lib/config/acceptance-eval.js +4 -30
  160. package/.agents/scripts/lib/config/baselines.js +3 -14
  161. package/.agents/scripts/lib/config/ci.js +8 -38
  162. package/.agents/scripts/lib/config/commands.js +1 -15
  163. package/.agents/scripts/lib/config/defaults.js +4 -33
  164. package/.agents/scripts/lib/config/delivery-routing.js +6 -35
  165. package/.agents/scripts/lib/config/explain.js +9 -80
  166. package/.agents/scripts/lib/config/gates/coverage.schema.js +0 -12
  167. package/.agents/scripts/lib/config/gates/crap-incremental-coverage.schema.js +2 -30
  168. package/.agents/scripts/lib/config/gates/crap.schema.js +1 -34
  169. package/.agents/scripts/lib/config/gates/duplication.schema.js +1 -8
  170. package/.agents/scripts/lib/config/gates/index.js +2 -17
  171. package/.agents/scripts/lib/config/gates/maintainability.schema.js +1 -20
  172. package/.agents/scripts/lib/config/gates/mutation.schema.js +1 -7
  173. package/.agents/scripts/lib/config/gates/shared.js +4 -64
  174. package/.agents/scripts/lib/config/github.js +4 -22
  175. package/.agents/scripts/lib/config/limits.js +4 -57
  176. package/.agents/scripts/lib/config/paths.js +2 -21
  177. package/.agents/scripts/lib/config/qa.js +4 -38
  178. package/.agents/scripts/lib/config/quality.js +76 -432
  179. package/.agents/scripts/lib/config/runners.js +12 -56
  180. package/.agents/scripts/lib/config/runtime.js +13 -57
  181. package/.agents/scripts/lib/config/shared.js +2 -16
  182. package/.agents/scripts/lib/config/sync-agentrc.js +9 -50
  183. package/.agents/scripts/lib/config/temp-paths.js +40 -280
  184. package/.agents/scripts/lib/config/validate-orchestration.js +5 -17
  185. package/.agents/scripts/lib/config/worktree-isolation.js +9 -28
  186. package/.agents/scripts/lib/config-resolver.js +10 -52
  187. package/.agents/scripts/lib/config-schema-shared.js +1 -4
  188. package/.agents/scripts/lib/config-settings-schema-delivery.js +12 -294
  189. package/.agents/scripts/lib/config-settings-schema-quality.js +7 -219
  190. package/.agents/scripts/lib/config-settings-schema.js +37 -274
  191. package/.agents/scripts/lib/coverage-baseline.js +20 -110
  192. package/.agents/scripts/lib/coverage-capture-fullscope.js +12 -37
  193. package/.agents/scripts/lib/coverage-capture-incremental.js +12 -43
  194. package/.agents/scripts/lib/coverage-capture-usage.js +4 -24
  195. package/.agents/scripts/lib/coverage-capture.js +99 -224
  196. package/.agents/scripts/lib/coverage-utils.js +14 -79
  197. package/.agents/scripts/lib/cpu-pool.js +17 -123
  198. package/.agents/scripts/lib/crap-baseline-join.js +16 -88
  199. package/.agents/scripts/lib/crap-coordinates.js +6 -25
  200. package/.agents/scripts/lib/crap-engine.js +40 -153
  201. package/.agents/scripts/lib/crap-method-identity.js +16 -78
  202. package/.agents/scripts/lib/crap-utils.js +31 -155
  203. package/.agents/scripts/lib/cyclomatic-ceiling.js +14 -87
  204. package/.agents/scripts/lib/cyclomatic-scope.js +10 -50
  205. package/.agents/scripts/lib/dead-exports-knip.js +18 -56
  206. package/.agents/scripts/lib/dead-exports-mode.js +5 -24
  207. package/.agents/scripts/lib/degraded-mode.js +3 -26
  208. package/.agents/scripts/lib/dependency-parser.js +8 -40
  209. package/.agents/scripts/lib/dependency-version.js +13 -35
  210. package/.agents/scripts/lib/detect-package-manager.js +6 -36
  211. package/.agents/scripts/lib/doc-tiers.js +22 -126
  212. package/.agents/scripts/lib/duplicate-search.js +8 -72
  213. package/.agents/scripts/lib/env-loader.js +5 -27
  214. package/.agents/scripts/lib/error-redactor.js +6 -31
  215. package/.agents/scripts/lib/errors/index.js +2 -22
  216. package/.agents/scripts/lib/escomplex-ast-compat.js +22 -163
  217. package/.agents/scripts/lib/escomplex-kernel.js +21 -123
  218. package/.agents/scripts/lib/feedback-loop/graduator-core.js +93 -419
  219. package/.agents/scripts/lib/feedback-loop/prior-feedback-fetcher.js +20 -98
  220. package/.agents/scripts/lib/feedback-loop/retro-proposals-graduator.js +27 -151
  221. package/.agents/scripts/lib/findings/audit-ledger.js +23 -97
  222. package/.agents/scripts/lib/findings/classify-finding.js +14 -69
  223. package/.agents/scripts/lib/findings/promote-finding.js +14 -112
  224. package/.agents/scripts/lib/findings/provenance-field.js +11 -52
  225. package/.agents/scripts/lib/findings/route-finding.js +37 -255
  226. package/.agents/scripts/lib/findings/semantic-issue-search.js +14 -59
  227. package/.agents/scripts/lib/findings/severity.js +18 -104
  228. package/.agents/scripts/lib/format-generated-json.js +12 -44
  229. package/.agents/scripts/lib/full-suite-lock.js +160 -429
  230. package/.agents/scripts/lib/full-suite-queue.js +213 -0
  231. package/.agents/scripts/lib/gates/baseline-store.js +5 -9
  232. package/.agents/scripts/lib/gates/friction.js +1 -3
  233. package/.agents/scripts/lib/generated/agentrc-validator.js +2 -2
  234. package/.agents/scripts/lib/gh-exec.js +31 -259
  235. package/.agents/scripts/lib/git/cached-fetch.js +9 -52
  236. package/.agents/scripts/lib/git/sync-from-base.js +15 -107
  237. package/.agents/scripts/lib/git-branch-cleanup.js +14 -61
  238. package/.agents/scripts/lib/git-branch-lifecycle.js +16 -87
  239. package/.agents/scripts/lib/git-utils.js +37 -161
  240. package/.agents/scripts/lib/github/framework-repo.js +8 -71
  241. package/.agents/scripts/lib/github-url.js +2 -17
  242. package/.agents/scripts/lib/import-graph.js +11 -38
  243. package/.agents/scripts/lib/install-cmd-parser.js +4 -13
  244. package/.agents/scripts/lib/json-utils.js +3 -18
  245. package/.agents/scripts/lib/label-constants.js +16 -111
  246. package/.agents/scripts/lib/label-taxonomy.js +4 -30
  247. package/.agents/scripts/lib/maintainability-engine.js +12 -80
  248. package/.agents/scripts/lib/maintainability-unscorable.js +5 -25
  249. package/.agents/scripts/lib/maintainability-utils.js +16 -92
  250. package/.agents/scripts/lib/mandrel-catalog.js +12 -70
  251. package/.agents/scripts/lib/notifications/notifier.js +13 -38
  252. package/.agents/scripts/lib/npm-scripts.js +4 -23
  253. package/.agents/scripts/lib/observability/metrics-ledger.js +16 -76
  254. package/.agents/scripts/lib/observability/runtime-friction.js +44 -286
  255. package/.agents/scripts/lib/observability/signal-validator.js +5 -37
  256. package/.agents/scripts/lib/observability/signals-writer.js +11 -121
  257. package/.agents/scripts/lib/observability/source-classifier.js +21 -203
  258. package/.agents/scripts/lib/observability/terse-result.js +14 -47
  259. package/.agents/scripts/lib/onboard/init-tail.js +13 -74
  260. package/.agents/scripts/lib/onboard/scaffold-docs.js +11 -34
  261. package/.agents/scripts/lib/orchestration/acceptance-eval-decision.js +25 -139
  262. package/.agents/scripts/lib/orchestration/auto-merge-cwd.js +11 -66
  263. package/.agents/scripts/lib/orchestration/behind-recovery.js +10 -55
  264. package/.agents/scripts/lib/orchestration/ceremony-routing.js +5 -75
  265. package/.agents/scripts/lib/orchestration/change-set.js +7 -36
  266. package/.agents/scripts/lib/orchestration/check-baselines/phases/compare.js +9 -46
  267. package/.agents/scripts/lib/orchestration/check-baselines/phases/evaluate.js +11 -44
  268. package/.agents/scripts/lib/orchestration/check-baselines/phases/floors.js +5 -24
  269. package/.agents/scripts/lib/orchestration/check-baselines/phases/friction.js +3 -12
  270. package/.agents/scripts/lib/orchestration/check-baselines/phases/parse-args.js +5 -38
  271. package/.agents/scripts/lib/orchestration/check-baselines/phases/pipeline.js +3 -8
  272. package/.agents/scripts/lib/orchestration/check-baselines/phases/refresh-ack.js +28 -136
  273. package/.agents/scripts/lib/orchestration/check-baselines/phases/report.js +3 -13
  274. package/.agents/scripts/lib/orchestration/check-state.js +92 -0
  275. package/.agents/scripts/lib/orchestration/ci-gap-intake.js +37 -144
  276. package/.agents/scripts/lib/orchestration/ci-rerun-guard.js +42 -189
  277. package/.agents/scripts/lib/orchestration/code-review.js +24 -128
  278. package/.agents/scripts/lib/orchestration/column-sync.js +23 -111
  279. package/.agents/scripts/lib/orchestration/complexity-gate.js +42 -214
  280. package/.agents/scripts/lib/orchestration/deliver-recover.js +36 -168
  281. package/.agents/scripts/lib/orchestration/dependency-analyzer.js +4 -35
  282. package/.agents/scripts/lib/orchestration/dependency-candidates.js +9 -41
  283. package/.agents/scripts/lib/orchestration/diff-magnitude.js +25 -115
  284. package/.agents/scripts/lib/orchestration/doc-reader.js +2 -6
  285. package/.agents/scripts/lib/orchestration/docs-digest.js +13 -51
  286. package/.agents/scripts/lib/orchestration/epic-candidates.js +13 -53
  287. package/.agents/scripts/lib/orchestration/epic-checklist.js +9 -33
  288. package/.agents/scripts/lib/orchestration/epic-container.js +41 -167
  289. package/.agents/scripts/lib/orchestration/epic-expansion.js +10 -40
  290. package/.agents/scripts/lib/orchestration/epic-rollup.js +55 -207
  291. package/.agents/scripts/lib/orchestration/file-assumption-enum.js +2 -22
  292. package/.agents/scripts/lib/orchestration/file-assumptions.js +45 -253
  293. package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-detect.js +9 -46
  294. package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-reap.js +7 -57
  295. package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches.js +21 -126
  296. package/.agents/scripts/lib/orchestration/git-cleanup/phases/cli.js +2 -6
  297. package/.agents/scripts/lib/orchestration/git-cleanup/phases/fast-forward.js +1 -4
  298. package/.agents/scripts/lib/orchestration/git-cleanup/phases/filters.js +1 -5
  299. package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes-ff.js +9 -34
  300. package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes.js +41 -190
  301. package/.agents/scripts/lib/orchestration/git-cleanup/phases/merged-tip.js +9 -45
  302. package/.agents/scripts/lib/orchestration/git-cleanup/phases/parse-args.js +1 -4
  303. package/.agents/scripts/lib/orchestration/git-cleanup/phases/phase-drivers.js +19 -85
  304. package/.agents/scripts/lib/orchestration/git-cleanup/phases/prompts.js +3 -17
  305. package/.agents/scripts/lib/orchestration/git-cleanup/phases/prune.js +1 -5
  306. package/.agents/scripts/lib/orchestration/git-cleanup/phases/render.js +16 -100
  307. package/.agents/scripts/lib/orchestration/git-cleanup/phases/stashes.js +1 -4
  308. package/.agents/scripts/lib/orchestration/lease-guard-shared.js +16 -67
  309. package/.agents/scripts/lib/orchestration/lifecycle/emit-ledger-event.js +9 -33
  310. package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-flip-failed.js +8 -29
  311. package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-unlanded.js +15 -68
  312. package/.agents/scripts/lib/orchestration/light-backstop.js +11 -49
  313. package/.agents/scripts/lib/orchestration/light-escalation.js +21 -89
  314. package/.agents/scripts/lib/orchestration/light-suitability.js +26 -231
  315. package/.agents/scripts/lib/orchestration/merge-block-class.js +39 -216
  316. package/.agents/scripts/lib/orchestration/merge-poll.js +104 -377
  317. package/.agents/scripts/lib/orchestration/merge-queue.js +158 -0
  318. package/.agents/scripts/lib/orchestration/pinned-identifier-lint.js +17 -57
  319. package/.agents/scripts/lib/orchestration/plan-context.js +52 -303
  320. package/.agents/scripts/lib/orchestration/plan-critic-conditions.js +22 -79
  321. package/.agents/scripts/lib/orchestration/plan-critics-evaluate.js +5 -31
  322. package/.agents/scripts/lib/orchestration/plan-metrics.js +29 -108
  323. package/.agents/scripts/lib/orchestration/plan-navigation.js +8 -27
  324. package/.agents/scripts/lib/orchestration/plan-persist/acceptance-handle-repair.js +12 -49
  325. package/.agents/scripts/lib/orchestration/plan-persist/audit-provenance.js +18 -73
  326. package/.agents/scripts/lib/orchestration/plan-persist/changes-repair.js +14 -78
  327. package/.agents/scripts/lib/orchestration/plan-persist/cross-plan-links.js +6 -30
  328. package/.agents/scripts/lib/orchestration/plan-persist/epic-adoption.js +14 -65
  329. package/.agents/scripts/lib/orchestration/plan-persist/epic-ops.js +21 -76
  330. package/.agents/scripts/lib/orchestration/plan-persist/external-deps.js +6 -43
  331. package/.agents/scripts/lib/orchestration/plan-persist/persist-helpers.js +14 -68
  332. package/.agents/scripts/lib/orchestration/plan-persist/plan-context-source.js +9 -41
  333. package/.agents/scripts/lib/orchestration/plan-persist/run-plan-persist.js +49 -248
  334. package/.agents/scripts/lib/orchestration/plan-persist/soft-findings.js +2 -12
  335. package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +85 -368
  336. package/.agents/scripts/lib/orchestration/plan-persist/summary.js +8 -38
  337. package/.agents/scripts/lib/orchestration/plan-persist/supersede-ops.js +30 -190
  338. package/.agents/scripts/lib/orchestration/plan-persist/wave-collision-gate.js +9 -49
  339. package/.agents/scripts/lib/orchestration/plan-persist/wave-serialisation.js +7 -28
  340. package/.agents/scripts/lib/orchestration/plan-reachability.js +13 -42
  341. package/.agents/scripts/lib/orchestration/plan-run-labels/reap.js +16 -91
  342. package/.agents/scripts/lib/orchestration/plan-runner/worktree-sweep.js +16 -54
  343. package/.agents/scripts/lib/orchestration/plan-text-hygiene.js +10 -52
  344. package/.agents/scripts/lib/orchestration/planning/authoring-context.js +14 -109
  345. package/.agents/scripts/lib/orchestration/planning/memory-pool-advisory.js +11 -83
  346. package/.agents/scripts/lib/orchestration/pr-watch.js +48 -306
  347. package/.agents/scripts/lib/orchestration/project-meta-cache.js +15 -80
  348. package/.agents/scripts/lib/orchestration/project-meta-resolver.js +10 -51
  349. package/.agents/scripts/lib/orchestration/reassert-status-column.js +12 -76
  350. package/.agents/scripts/lib/orchestration/remote-verifier.js +12 -36
  351. package/.agents/scripts/lib/orchestration/resolve-stories.js +33 -164
  352. package/.agents/scripts/lib/orchestration/retro-proposals.js +66 -361
  353. package/.agents/scripts/lib/orchestration/review-base-ref.js +9 -43
  354. package/.agents/scripts/lib/orchestration/review-depth.js +12 -94
  355. package/.agents/scripts/lib/orchestration/review-providers/codex.js +10 -111
  356. package/.agents/scripts/lib/orchestration/review-providers/degraded-gates.js +13 -71
  357. package/.agents/scripts/lib/orchestration/review-providers/findings-renderer.js +7 -51
  358. package/.agents/scripts/lib/orchestration/review-providers/mi-exemptions.js +8 -53
  359. package/.agents/scripts/lib/orchestration/review-providers/native.js +30 -214
  360. package/.agents/scripts/lib/orchestration/review-providers/parse-findings.js +7 -52
  361. package/.agents/scripts/lib/orchestration/review-providers/review-depth.js +4 -33
  362. package/.agents/scripts/lib/orchestration/review-providers/review-provider-factory.js +11 -71
  363. package/.agents/scripts/lib/orchestration/review-providers/scoped-lint.js +19 -131
  364. package/.agents/scripts/lib/orchestration/review-providers/security-review.js +6 -89
  365. package/.agents/scripts/lib/orchestration/review-providers/types.js +26 -56
  366. package/.agents/scripts/lib/orchestration/review-providers/ultrareview.js +3 -46
  367. package/.agents/scripts/lib/orchestration/run-epilogue.js +40 -199
  368. package/.agents/scripts/lib/orchestration/run-scoped-config.js +13 -81
  369. package/.agents/scripts/lib/orchestration/single-story-close/close-note.js +7 -34
  370. package/.agents/scripts/lib/orchestration/single-story-close/failed-terminal.js +16 -89
  371. package/.agents/scripts/lib/orchestration/single-story-close/gate-log.js +18 -109
  372. package/.agents/scripts/lib/orchestration/single-story-close/phases/auto-merge.js +190 -280
  373. package/.agents/scripts/lib/orchestration/single-story-close/phases/base-sync.js +18 -80
  374. package/.agents/scripts/lib/orchestration/single-story-close/phases/close-validation.js +103 -97
  375. package/.agents/scripts/lib/orchestration/single-story-close/phases/code-review.js +8 -64
  376. package/.agents/scripts/lib/orchestration/single-story-close/phases/confirm-merge.js +183 -485
  377. package/.agents/scripts/lib/orchestration/single-story-close/phases/conventional-subject.js +30 -134
  378. package/.agents/scripts/lib/orchestration/single-story-close/phases/graphql-preflight.js +9 -50
  379. package/.agents/scripts/lib/orchestration/single-story-close/phases/lock-wait-pending.js +49 -0
  380. package/.agents/scripts/lib/orchestration/single-story-close/phases/normalize-pr-title.js +13 -86
  381. package/.agents/scripts/lib/orchestration/single-story-close/phases/options.js +20 -95
  382. package/.agents/scripts/lib/orchestration/single-story-close/phases/post-land.js +46 -203
  383. package/.agents/scripts/lib/orchestration/single-story-close/phases/pre-gate-steps.js +8 -50
  384. package/.agents/scripts/lib/orchestration/single-story-close/phases/pull-request.js +12 -83
  385. package/.agents/scripts/lib/orchestration/single-story-close/phases/push.js +6 -39
  386. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-block.js +1 -6
  387. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-outcome.js +4 -28
  388. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-override.js +6 -51
  389. package/.agents/scripts/lib/orchestration/single-story-close/phases/worktree-reap.js +6 -34
  390. package/.agents/scripts/lib/orchestration/single-story-close/phases/wrong-tree-guard.js +23 -121
  391. package/.agents/scripts/lib/orchestration/single-story-close/runner.js +110 -290
  392. package/.agents/scripts/lib/orchestration/single-story-lease-guard.js +15 -69
  393. package/.agents/scripts/lib/orchestration/story-body-gate.js +4 -23
  394. package/.agents/scripts/lib/orchestration/story-close/baseline-upward-writeback.js +50 -179
  395. package/.agents/scripts/lib/orchestration/story-close/context-budget-writeback.js +11 -41
  396. package/.agents/scripts/lib/orchestration/story-close/format-autofix.js +23 -311
  397. package/.agents/scripts/lib/orchestration/story-close/phases/local-lens-review.js +22 -147
  398. package/.agents/scripts/lib/orchestration/story-close/phases/review-core.js +16 -67
  399. package/.agents/scripts/lib/orchestration/story-deliver-terminal-schema.js +12 -68
  400. package/.agents/scripts/lib/orchestration/story-deliver-terminal.js +42 -201
  401. package/.agents/scripts/lib/orchestration/story-follow-ups.js +43 -245
  402. package/.agents/scripts/lib/orchestration/story-init-envelope.js +4 -23
  403. package/.agents/scripts/lib/orchestration/story-init-remote.js +2 -6
  404. package/.agents/scripts/lib/orchestration/story-reachability.js +3 -23
  405. package/.agents/scripts/lib/orchestration/task-body-validator.js +12 -126
  406. package/.agents/scripts/lib/orchestration/ticket-lease.js +28 -131
  407. package/.agents/scripts/lib/orchestration/ticket-validator-conflicts.js +15 -149
  408. package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +5 -33
  409. package/.agents/scripts/lib/orchestration/ticket-validator.js +39 -181
  410. package/.agents/scripts/lib/orchestration/ticketing/bulk.js +51 -244
  411. package/.agents/scripts/lib/orchestration/ticketing/reads.js +39 -250
  412. package/.agents/scripts/lib/orchestration/ticketing/state.js +14 -68
  413. package/.agents/scripts/lib/orchestration/ticketing/transition.js +46 -263
  414. package/.agents/scripts/lib/orchestration/ticketing.js +2 -26
  415. package/.agents/scripts/lib/orchestration/verify-credit.js +18 -79
  416. package/.agents/scripts/lib/orchestration/worktree-dirty.js +5 -30
  417. package/.agents/scripts/lib/path-security.js +3 -6
  418. package/.agents/scripts/lib/plan-phase-cleanup.js +9 -49
  419. package/.agents/scripts/lib/preflight-runner.js +13 -69
  420. package/.agents/scripts/lib/process-group.js +143 -0
  421. package/.agents/scripts/lib/project-root.js +2 -8
  422. package/.agents/scripts/lib/provider-factory.js +2 -25
  423. package/.agents/scripts/lib/qa/console-allowlist.js +10 -59
  424. package/.agents/scripts/lib/qa/qa-session.js +15 -69
  425. package/.agents/scripts/lib/qa/redact-evidence.js +18 -129
  426. package/.agents/scripts/lib/qa/resolve-qa-contract.js +26 -135
  427. package/.agents/scripts/lib/qa/resolve-selection.js +16 -84
  428. package/.agents/scripts/lib/reserved-test-ids.js +9 -47
  429. package/.agents/scripts/lib/runtime-deps/dep-resolution.js +13 -53
  430. package/.agents/scripts/lib/runtime-deps/ensure-installed.js +10 -44
  431. package/.agents/scripts/lib/runtime-deps/manifest.js +10 -30
  432. package/.agents/scripts/lib/runtime-deps/parser-major.js +15 -51
  433. package/.agents/scripts/lib/runtime-deps/preflight.js +4 -22
  434. package/.agents/scripts/lib/runtime-deps/scan-imports.js +11 -55
  435. package/.agents/scripts/lib/signals/detectors/common.js +12 -38
  436. package/.agents/scripts/lib/signals/index.js +2 -19
  437. package/.agents/scripts/lib/signals/schema.js +14 -109
  438. package/.agents/scripts/lib/signals/write.js +2 -11
  439. package/.agents/scripts/lib/single-story/confirm-merge.js +31 -72
  440. package/.agents/scripts/lib/single-story/story-merged-notify.js +8 -49
  441. package/.agents/scripts/lib/single-story-sweep/protection-ctx.js +4 -26
  442. package/.agents/scripts/lib/single-story-sweep/protection.js +13 -100
  443. package/.agents/scripts/lib/single-story-sweep/sweep-lock.js +60 -258
  444. package/.agents/scripts/lib/single-story-sweep.js +14 -97
  445. package/.agents/scripts/lib/skills/parse-skill.js +13 -59
  446. package/.agents/scripts/lib/skills/skills-index.js +8 -29
  447. package/.agents/scripts/lib/skills/walk-skill-files.js +17 -78
  448. package/.agents/scripts/lib/source-extensions.js +11 -42
  449. package/.agents/scripts/lib/source-text/strip-js-comments.js +8 -41
  450. package/.agents/scripts/lib/stdio-flush.js +9 -36
  451. package/.agents/scripts/lib/story-adjacency.js +8 -40
  452. package/.agents/scripts/lib/story-body/body-format-lints.js +22 -83
  453. package/.agents/scripts/lib/story-body/footer-block.js +11 -44
  454. package/.agents/scripts/lib/story-body/story-body.js +83 -358
  455. package/.agents/scripts/lib/temp-retention.js +42 -143
  456. package/.agents/scripts/lib/templates/decomposer-prompts.js +11 -65
  457. package/.agents/scripts/lib/test-env.js +12 -65
  458. package/.agents/scripts/lib/test-run-credit.js +10 -65
  459. package/.agents/scripts/lib/test-runner-contract.js +19 -74
  460. package/.agents/scripts/lib/test-temp.js +38 -184
  461. package/.agents/scripts/lib/test-tiers.js +12 -96
  462. package/.agents/scripts/lib/ticket-body-sections.js +21 -96
  463. package/.agents/scripts/lib/transpile.js +15 -74
  464. package/.agents/scripts/lib/util/concurrent-map.js +6 -25
  465. package/.agents/scripts/lib/util/parse-id-list.js +8 -34
  466. package/.agents/scripts/lib/util/poll-loop.js +8 -28
  467. package/.agents/scripts/lib/util/with-timeout.js +2 -11
  468. package/.agents/scripts/lib/validation-evidence.js +21 -96
  469. package/.agents/scripts/lib/wave-runner/footprint.js +17 -70
  470. package/.agents/scripts/lib/wave-runner/live-probe.js +53 -221
  471. package/.agents/scripts/lib/wave-runner/ready-set.js +72 -301
  472. package/.agents/scripts/lib/workers/crap-worker.js +11 -64
  473. package/.agents/scripts/lib/workers/maintainability-report-worker.js +8 -45
  474. package/.agents/scripts/lib/workers/maintainability-worker.js +5 -21
  475. package/.agents/scripts/lib/workers/serve-worker-messages.js +2 -18
  476. package/.agents/scripts/lib/workflow-closure.js +22 -105
  477. package/.agents/scripts/lib/workspace-provisioner.js +16 -54
  478. package/.agents/scripts/lib/worktree/git-hooks.js +15 -60
  479. package/.agents/scripts/lib/worktree/lifecycle/force-drain.js +20 -60
  480. package/.agents/scripts/lib/worktree/lifecycle/merge-reachability.js +10 -62
  481. package/.agents/scripts/lib/worktree/lifecycle/pending-cleanup.js +22 -86
  482. package/.agents/scripts/lib/worktree/lifecycle/reap.js +24 -126
  483. package/.agents/scripts/lib/worktree/lifecycle-manager.js +2 -20
  484. package/.agents/scripts/lib/worktree/node-modules-strategy.js +46 -180
  485. package/.agents/scripts/lib/worktree-manager.js +15 -40
  486. package/.agents/scripts/lint-issue-body.js +12 -68
  487. package/.agents/scripts/mandrel-update-preflight.js +10 -70
  488. package/.agents/scripts/merge-baseline.js +30 -104
  489. package/.agents/scripts/nav-registry-diff.js +22 -108
  490. package/.agents/scripts/notify.js +12 -69
  491. package/.agents/scripts/plan-context.js +27 -111
  492. package/.agents/scripts/plan-critics.js +12 -66
  493. package/.agents/scripts/plan-persist.js +31 -148
  494. package/.agents/scripts/plan-run-epilogue.js +11 -37
  495. package/.agents/scripts/pr-watch-with-update.js +76 -267
  496. package/.agents/scripts/providers/github/auth.js +3 -8
  497. package/.agents/scripts/providers/github/blocked-by-add.js +14 -61
  498. package/.agents/scripts/providers/github/board-add.js +5 -21
  499. package/.agents/scripts/providers/github/branch-protection.js +11 -43
  500. package/.agents/scripts/providers/github/cache.js +2 -14
  501. package/.agents/scripts/providers/github/comments.js +7 -40
  502. package/.agents/scripts/providers/github/compose.js +3 -19
  503. package/.agents/scripts/providers/github/errors.js +22 -125
  504. package/.agents/scripts/providers/github/issues.js +31 -123
  505. package/.agents/scripts/providers/github/labels.js +24 -124
  506. package/.agents/scripts/providers/github/mappers.js +5 -27
  507. package/.agents/scripts/providers/github/merge-methods.js +3 -22
  508. package/.agents/scripts/providers/github/project-board.js +2 -17
  509. package/.agents/scripts/providers/github/projects-v2-graphql.js +3 -6
  510. package/.agents/scripts/providers/github/request-helpers.js +5 -32
  511. package/.agents/scripts/providers/github/search-budget.js +9 -39
  512. package/.agents/scripts/providers/github/search-query.js +5 -26
  513. package/.agents/scripts/providers/github/sub-issue-add.js +15 -65
  514. package/.agents/scripts/providers/github/sub-issues.js +7 -36
  515. package/.agents/scripts/providers/github/tickets.js +32 -134
  516. package/.agents/scripts/providers/github.js +18 -59
  517. package/.agents/scripts/prune-plan-run-labels.js +12 -46
  518. package/.agents/scripts/quality-preview.js +35 -220
  519. package/.agents/scripts/resolve-doc-tiers.js +3 -26
  520. package/.agents/scripts/resolve-stories.js +16 -67
  521. package/.agents/scripts/resync-status-column.js +6 -25
  522. package/.agents/scripts/run-tests.js +29 -104
  523. package/.agents/scripts/single-story-close.js +23 -135
  524. package/.agents/scripts/single-story-confirm-merge.js +32 -139
  525. package/.agents/scripts/single-story-init.js +47 -209
  526. package/.agents/scripts/stories-wave-tick.js +102 -472
  527. package/.agents/scripts/sync-agentrc.js +3 -21
  528. package/.agents/scripts/sync-claude-agents.js +9 -55
  529. package/.agents/scripts/sync-claude-commands.js +20 -110
  530. package/.agents/scripts/test-wrapper.js +6 -43
  531. package/.agents/scripts/update-coverage-baseline.js +5 -22
  532. package/.agents/scripts/update-crap-baseline.js +7 -30
  533. package/.agents/scripts/update-duplication-baseline.js +16 -92
  534. package/.agents/scripts/update-maintainability-baseline.js +8 -62
  535. package/.agents/scripts/update-ticket-state.js +1 -7
  536. package/.agents/scripts/validate-skills.js +6 -26
  537. package/.agents/templates/agent-protocol.md +2 -2
  538. package/.agents/templates/docs/audit-sweep-runbook.md +3 -4
  539. package/.agents/workflows/audit-accessibility.md +4 -7
  540. package/.agents/workflows/audit-adrs.md +3 -6
  541. package/.agents/workflows/audit-architecture.md +3 -11
  542. package/.agents/workflows/audit-baselines.md +6 -9
  543. package/.agents/workflows/audit-clean-code.md +8 -12
  544. package/.agents/workflows/audit-data-model.md +3 -7
  545. package/.agents/workflows/audit-dependencies.md +4 -7
  546. package/.agents/workflows/audit-devops.md +4 -8
  547. package/.agents/workflows/audit-documentation.md +1 -4
  548. package/.agents/workflows/audit-mobile.md +4 -7
  549. package/.agents/workflows/audit-navigability.md +3 -6
  550. package/.agents/workflows/audit-performance.md +2 -4
  551. package/.agents/workflows/audit-privacy.md +4 -7
  552. package/.agents/workflows/audit-quality.md +4 -7
  553. package/.agents/workflows/audit-security.md +4 -7
  554. package/.agents/workflows/audit-seo.md +4 -7
  555. package/.agents/workflows/audit-sre.md +4 -7
  556. package/.agents/workflows/audit-to-stories.md +17 -30
  557. package/.agents/workflows/audit-ux-ui.md +4 -7
  558. package/.agents/workflows/helpers/audit-lens-core.md +1 -1
  559. package/.agents/workflows/helpers/code-quality-guardrails.md +12 -15
  560. package/.agents/workflows/helpers/deliver-digest.md +6 -4
  561. package/.agents/workflows/helpers/deliver-reference.md +114 -188
  562. package/.agents/workflows/helpers/deliver-story-reference.md +189 -533
  563. package/.agents/workflows/helpers/plan-reference.md +86 -139
  564. package/.agents/workflows/helpers/qa-core.md +12 -0
  565. package/.agents/workflows/memory-consolidate.md +1 -1
  566. package/.agents/workflows/qa-assist.md +27 -71
  567. package/.agents/workflows/qa-explore.md +19 -59
  568. package/.agents/workflows/qa-run.md +11 -33
  569. package/README.md +1 -1
  570. package/bin/mandrel.js +5 -46
  571. package/bin/postinstall.js +18 -107
  572. package/docs/CHANGELOG.md +32 -0
  573. package/lib/cli/doctor.js +11 -71
  574. package/lib/cli/init.js +26 -165
  575. package/lib/cli/migrate.js +5 -64
  576. package/lib/cli/registry.js +84 -467
  577. package/lib/cli/sync-agents.js +4 -64
  578. package/lib/cli/sync-commands.js +11 -64
  579. package/lib/cli/sync.js +34 -213
  580. package/lib/cli/uninstall.js +40 -219
  581. package/lib/cli/update.js +105 -661
  582. package/lib/cli/version-check.js +8 -72
  583. package/lib/cli/version-helpers.js +14 -87
  584. package/lib/migrations/helpers/retire-agentrc-key.js +11 -52
  585. package/lib/migrations/index.js +15 -92
  586. package/lib/migrations/steps/2.1.0-retire-mi-drop-knobs.js +2 -15
  587. package/lib/migrations/steps/2.1.0-retire-verify-concurrency-cap.js +1 -13
  588. package/lib/migrations/steps/2.11.0-retire-max-seed-words.js +2 -15
  589. package/lib/migrations/steps/2.2.0-retire-epic-ac-tags.js +9 -38
  590. package/lib/migrations/steps/2.20.0-retire-codebase-snapshot.js +1 -13
  591. package/lib/migrations/steps/2.32.0-retire-lint-baseline-command.js +2 -27
  592. package/lib/migrations/steps/2.57.0-retire-delivery-limit-knobs.js +2 -23
  593. package/lib/migrations/steps/2.57.0-retire-planning-limit-knobs.js +2 -27
  594. package/lib/migrations/steps/2.60.0-retire-audit-results-autofile.js +2 -21
  595. package/lib/migrations/steps/strip-removed-agentrc-keys.js +333 -0
  596. package/package.json +16 -14
  597. package/.agents/docs/SDLC.md +0 -590
  598. package/.agents/docs/quality-gates.md +0 -1183
  599. package/.agents/rules/known-tooling-behavior.md +0 -200
  600. package/.agents/rules/orchestration-error-handling.md +0 -61
  601. package/.agents/rules/test-seams.md +0 -59
  602. package/.agents/schemas/baselines/lighthouse.schema.json +0 -59
  603. package/.agents/schemas/baselines/lint.schema.json +0 -47
  604. package/.agents/scripts/check-action-pinning.js +0 -260
  605. package/.agents/scripts/check-audit-attribution.js +0 -302
  606. package/.agents/scripts/check-baseline-drift.js +0 -211
  607. package/.agents/scripts/check-baseline-scope.js +0 -362
  608. package/.agents/scripts/check-generated-validator.js +0 -202
  609. package/.agents/scripts/check-knip-entries.js +0 -159
  610. package/.agents/scripts/check-lifecycle-lint.js +0 -294
  611. package/.agents/scripts/check-pinned-override-notes.js +0 -102
  612. package/.agents/scripts/check-schema-references.js +0 -368
  613. package/.agents/scripts/check-test-portability.js +0 -512
  614. package/.agents/scripts/check-workflow-citations.js +0 -218
  615. package/.agents/scripts/check-workflow-cli-lint.js +0 -299
  616. package/.agents/scripts/check-workflow-timeouts.js +0 -291
  617. package/.agents/scripts/install-matrix-assert.js +0 -326
  618. package/.agents/scripts/lib/audit-advisories.js +0 -195
  619. package/.agents/scripts/lib/audit-attribution.js +0 -134
  620. package/.agents/scripts/lib/baselines/drift-detector.js +0 -351
  621. package/.agents/scripts/lib/baselines/kinds/lighthouse.js +0 -87
  622. package/.agents/scripts/lib/baselines/kinds/lint.js +0 -184
  623. package/.agents/scripts/lib/baselines/orphan-pruner.js +0 -233
  624. package/.agents/scripts/lib/baselines/scope-assert.js +0 -223
  625. package/.agents/scripts/lib/baselines/scope-inventory.js +0 -314
  626. package/.agents/scripts/lib/c8-cli-path.js +0 -21
  627. package/.agents/scripts/lib/config/gates/lighthouse.schema.js +0 -51
  628. package/.agents/scripts/lib/config/gates/lint.schema.js +0 -18
  629. package/.agents/scripts/lib/dynamic-workflow/architecture-report-contract.js +0 -70
  630. package/.agents/scripts/lib/dynamic-workflow/audit-orchestrator.js +0 -284
  631. package/.agents/scripts/lib/dynamic-workflow/clean-code-report-contract.js +0 -80
  632. package/.agents/scripts/lib/dynamic-workflow/degraded-coverage.js +0 -81
  633. package/.agents/scripts/lib/dynamic-workflow/documentation-report-contract.js +0 -87
  634. package/.agents/scripts/lib/dynamic-workflow/performance-report-contract.js +0 -74
  635. package/.agents/scripts/lib/dynamic-workflow/quality-report-contract.js +0 -90
  636. package/.agents/scripts/lib/dynamic-workflow/report-contract-core.js +0 -43
  637. package/.agents/scripts/lib/dynamic-workflow/security-report-contract.js +0 -83
  638. package/.agents/scripts/lib/fs-walk.js +0 -52
  639. package/.agents/scripts/lib/knip-config-resolver.js +0 -181
  640. package/.agents/scripts/lib/knip-entry-sync.js +0 -452
  641. package/.agents/scripts/lib/pinned-override-notes.js +0 -88
  642. package/.agents/scripts/lib/pinned-override-resolve.js +0 -212
  643. package/.agents/scripts/lib/test-isolate/cli-options.js +0 -93
  644. package/.agents/scripts/lib/test-isolate/env-snapshot-loader.js +0 -52
  645. package/.agents/scripts/lib/test-isolate/list-files.js +0 -90
  646. package/.agents/scripts/lib/test-isolate/parse-tap.js +0 -75
  647. package/.agents/scripts/lib/test-isolate/progress-log.js +0 -45
  648. package/.agents/scripts/lib/test-isolate/render-report.js +0 -97
  649. package/.agents/scripts/lib/test-isolate/run-isolate.js +0 -87
  650. package/.agents/scripts/lib/test-isolate/runner.js +0 -483
  651. package/.agents/scripts/lib/test-profile/parse-tap.js +0 -136
  652. package/.agents/scripts/lib/test-profile/render-report.js +0 -45
  653. package/.agents/scripts/lint-label-vocabulary.js +0 -214
  654. package/.agents/scripts/post-structured-comment.js +0 -127
  655. package/.agents/scripts/provision-git-hooks.js +0 -85
  656. package/.agents/scripts/prune-baseline-orphans.js +0 -181
  657. package/.agents/scripts/run-coverage.js +0 -197
  658. package/.agents/scripts/run-lint.js +0 -133
  659. package/.agents/scripts/run-test-profile.js +0 -129
  660. package/.agents/scripts/run-verify.js +0 -125
  661. package/.agents/scripts/test-isolate.js +0 -55
  662. package/.agents/scripts/update-dead-exports-baseline.js +0 -321
@@ -1,18 +1,6 @@
1
1
  /**
2
- * summary.js — plan-persist terminal summary (v2 Stage 3).
3
- *
4
- * Renders the persist receipts — the created Story set, whether the operator
5
- * forced a review stop, the `depends_on` ordering table and the exact deliver
6
- * command. Story #5343 moved that rendering onto the **`story-plan-state`**
7
- * marker every created Story already carries: it used to be a second,
8
- * primary-Story-only `plan-summary` comment, which cost one more write per
9
- * plan and split the operator's reading between two markers. Story #5367
10
- * deleted the machine checkpoint that shared the marker with it, so this
11
- * rendering is now the whole body of the one comment persist posts.
12
- *
13
- * Story #4542 removed the risk / review-routing line: no risk level, gate
14
- * decision, or acceptance disposition is computed at plan time any more, so
15
- * reporting one here would document a mechanism that does not run.
2
+ * The plan summary — the whole body of each Story's `story-plan-state`
3
+ * comment: created Stories, delivery order, and the deliver command.
16
4
  *
17
5
  * @module lib/orchestration/plan-persist/summary
18
6
  */
@@ -21,8 +9,6 @@ import { computeStoryWaves } from '../dependency-analyzer.js';
21
9
  import { renderPredictedSerialisationLines } from './wave-serialisation.js';
22
10
 
23
11
  /**
24
- * Compute the dry-run wave assignment for a validated ticket set.
25
- *
26
12
  * @param {Array<{ slug: string, title?: string, depends_on?: string[] }>} tickets
27
13
  * @returns {Array<{ wave: number, stories: Array<{ slug: string, title: string }> }>}
28
14
  */
@@ -66,21 +52,11 @@ function renderWaveTableLines(waveTable) {
66
52
  }
67
53
 
68
54
  /**
69
- * Render the shared-editor collisions beside the wave table (Story #5045).
70
- *
71
- * The wave table is a promise about parallelism — "these Stories can run
72
- * together". `computeSharedEditorFindings` knows exactly where that promise
73
- * breaks down: a path two same-wave Stories both write will conflict on every
74
- * merge after the first. Until now those findings degraded to a `Logger.warn`
75
- * on stderr and were discarded, so the comment carried the optimistic half of
76
- * the analysis and none of the caveat. Rendering them here puts the promise
77
- * and its known exceptions on one durable surface.
78
- *
79
- * Advisory by default and labelled as such — `planning.failOnSharedEditors`
80
- * is the knob that makes a collision refuse the plan, and it stays off.
55
+ * Same-wave Stories writing one path — the caveat to the wave table's
56
+ * parallelism promise, kept on the same durable surface. Advisory.
81
57
  *
82
58
  * @param {object[]|null} conflictFindings
83
- * @returns {string[]} Lines to splice after the wave table, or `[]`.
59
+ * @returns {string[]}
84
60
  */
85
61
  function renderSharedEditorLines(conflictFindings) {
86
62
  const shared = (
@@ -113,9 +89,6 @@ function renderSharedEditorLines(conflictFindings) {
113
89
  }
114
90
 
115
91
  /**
116
- * Build the body of each Story's `story-plan-state` comment (Story #5343;
117
- * Story #5367 made it the whole body).
118
- *
119
92
  * @param {object} input
120
93
  * @returns {string}
121
94
  */
@@ -131,7 +104,7 @@ export function buildPlanSummaryCommentBody({
131
104
  stories = null,
132
105
  conflictFindings = null,
133
106
  waveCollisions = null,
134
- // legacy unused knobs kept so older test call sites don't crash mid-migration
107
+ // Unused; accepted so older call sites don't crash.
135
108
  single = null,
136
109
  amend = null,
137
110
  }) {
@@ -154,15 +127,12 @@ export function buildPlanSummaryCommentBody({
154
127
  ? stories.map((s) => `#${s.id} (\`${s.slug}\`)`).join(', ')
155
128
  : `${ticketCount} Story(ies)`;
156
129
 
157
- // The only planning-time review gate left (Story #4542): an explicit
158
- // operator flag, never a value derived from a self-authored risk verdict.
130
+ // An explicit operator flag, never derived from a risk verdict.
159
131
  const reviewLines = forceReview
160
132
  ? ['- ⚠️ Review: operator-forced via `--force-review`.']
161
133
  : [];
162
134
 
163
- // The exact command to run — Story #4540. This comment is posted to
164
- // GitHub on every plan, so it is the operator's primary instruction: it
165
- // must name real ids, not a batch token that no longer exists.
135
+ // The operator's primary instruction: must name real ids.
166
136
  const deliverCommand =
167
137
  Array.isArray(stories) && stories.length > 0
168
138
  ? `/mandrel-deliver ${stories.map((s) => s.id).join(' ')}`
@@ -1,45 +1,7 @@
1
1
  /**
2
- * supersede-ops.js — close the `/mandrel-plan --tickets` source issues that the
3
- * authored Stories supersede (Story #4535).
4
- *
5
- * `plan-context.js` fetches the source issues, emits `sourceTickets[]` on the
6
- * `/mandrel-plan` envelope, and (with `--out`) writes that envelope to disk.
7
- * `resolveSourceTicketIds` below reads the id set back off it, so the normal
8
- * `/mandrel-plan --tickets` path needs no flag; an explicit `--source-tickets` still
9
- * wins when passed, as the override for hand-driven runs (Story #4554).
10
- * Before that thread existed the ids reached
11
- * this module *solely* via the hand-passed flag, so a forgotten flag left
12
- * `sourceTicketIds` empty — the partition below then passed **vacuously** (an
13
- * empty set trivially partitions), the close phase short-circuited, and the
14
- * run reported success while every source issue stayed open.
15
- *
16
- * Two halves, deliberately separated by the `createIssue` boundary:
17
- *
18
- * 1. **`resolveSupersedePartition`** — the plan-time completion pass that
19
- * runs *before* any GitHub write. No id may be claimed by two Stories
20
- * and no Story may claim an id that was not a source ticket — both fail
21
- * closed. A source id nobody claimed is assigned to the primary Story
22
- * with a warning (Story #5342): the plan is replacing it either way, so
23
- * the only open question was bookkeeping.
24
- * 2. **`closeSupersededTickets`** — the bookkeeping pass that runs *after*
25
- * the Stories exist. It **never throws**: a throw here would leave the
26
- * run half-done with Stories already live. An already-closed, deleted,
27
- * or inaccessible source ticket is a clean skip-and-report, and a
28
- * partial failure reports which tickets were and were not closed so the
29
- * operator can finish by hand.
30
- *
31
- * The close also strips the source ticket's `agent::*` label (Story #5255).
32
- * A retired ticket has no agent state, and the one it kept was read as live
33
- * work: `agent::blocked` is the state a Story must be in to be re-planned, so
34
- * this path closes exactly the tickets carrying it, and a closed-but-blocked
35
- * child pinned its container Epic open on every rollup thereafter. The
36
- * derivation in `ticketing/bulk.js` now ignores closed children's labels too —
37
- * that half covers the tickets already closed and the ones closed by hand;
38
- * this one stops new ones being written.
39
- *
40
- * Idempotency is keyed off the `superseded-by` structured-comment marker
41
- * (`upsertStructuredComment`), not a bare `postComment`, so a re-run cannot
42
- * double-comment.
2
+ * supersede-ops.js — close the `/mandrel-plan --tickets` source issues the
3
+ * authored Stories supersede. The `superseded-by` marker makes re-runs
4
+ * idempotent.
43
5
  *
44
6
  * @module lib/orchestration/plan-persist/supersede-ops
45
7
  */
@@ -53,41 +15,20 @@ import {
53
15
  import { rollUpEpicForStory } from '../epic-rollup.js';
54
16
  import { upsertStructuredComment } from '../ticketing.js';
55
17
 
56
- /** Structured-comment type marking a source issue as superseded. */
57
18
  const SUPERSEDED_BY_COMMENT_TYPE = 'superseded-by';
58
19
 
59
- /**
60
- * GitHub `state_reason` used when closing a superseded source issue.
61
- *
62
- * At persist time nothing has shipped — the issue will not be actioned in
63
- * its own right, so `not_planned` (not `completed`) is the honest reason.
64
- * The repo history was inconsistent here (#4211 used `completed`, #2870
65
- * `not_planned`); this constant settles it.
66
- */
20
+ /** Nothing has shipped at persist time, so `not_planned`, not `completed`. */
67
21
  export const SUPERSEDE_CLOSE_REASON = 'not_planned';
68
22
 
69
23
  /**
70
- * Every `agent::*` label, as the set the supersede close strips.
71
- *
72
- * A retired ticket has no agent state. `agent::done` would be the wrong
73
- * substitute — the work was re-planned, never delivered — so the label is
74
- * removed rather than rewritten, and the ticket ends carrying only its
75
- * `type::`/domain labels and the supersede comment that explains it.
24
+ * Stripped, not rewritten to `agent::done`: a retired ticket has no agent
25
+ * state, and a lingering `agent::blocked` pins its container Epic open.
76
26
  */
77
27
  const AGENT_STATE_LABELS = Object.freeze(Object.values(AGENT_LABELS));
78
28
 
79
29
  /**
80
- * The single `updateTicket` mutation that retires a source ticket.
81
- *
82
- * Closing and clearing the state ride one write: two calls could leave the
83
- * ticket closed but still wearing `agent::blocked`, which is the shape that
84
- * pinned a container Epic open forever (Story #5255).
85
- *
86
- * A ticket with no `agent::*` label gets the bare close, unchanged from before
87
- * that Story — `updateTicket` merges a `labels` mutation by reading the issue
88
- * back, so an unconditional empty `remove` would buy a wasted round-trip per
89
- * superseded ticket. `_ticketSnapshot` feeds that merge the copy
90
- * `probeSourceTicket` already fetched.
30
+ * Close and strip `agent::*` in ONE write, so the ticket never ends closed
31
+ * but still blocked. No agent label → bare close, sparing a read-back.
91
32
  *
92
33
  * @param {{ labels?: unknown }} ticket The probe's fresh copy.
93
34
  * @returns {object} Mutations for `provider.updateTicket`.
@@ -101,12 +42,7 @@ function supersedeCloseMutations(ticket) {
101
42
  }
102
43
 
103
44
  /**
104
- * Coerce one `supersedes[]` entry into `{ id, note }`.
105
- *
106
- * Accepts a bare issue number (`4525`), a numeric string (`"4525"`, `"#4525"`),
107
- * or an object carrying an optional per-supersede note
108
- * (`{ id: 4525, note: "…" }`). The note is what lets a Story record a
109
- * *correction* to the source issue's analysis rather than template-only prose.
45
+ * Coerce a number, `"#N"` string, or `{ id, note }` into `{ id, note }`.
110
46
  *
111
47
  * @param {unknown} entry
112
48
  * @param {string} slug Story slug, for error reporting.
@@ -137,9 +73,6 @@ function normalizeSupersedeEntry(entry, slug) {
137
73
  }
138
74
 
139
75
  /**
140
- * Normalize a plan Story ticket's `supersedes[]` into `{ id, note }[]`.
141
- * Absent / empty is a no-op returning `[]`.
142
- *
143
76
  * @param {object} ticket
144
77
  * @param {string} slug
145
78
  * @returns {Array<{ id: number, note: string|null }>}
@@ -167,11 +100,8 @@ export function normalizeSupersedes(ticket, slug) {
167
100
  }
168
101
 
169
102
  /**
170
- * Normalize a source-ticket id list into deduped positive integers.
171
- *
172
103
  * @param {unknown} ids
173
- * @param {string} [label] Channel name used in the error message, so an
174
- * envelope-derived failure does not blame the `--source-tickets` flag.
104
+ * @param {string} [label] Channel named in the error message.
175
105
  * @returns {number[]}
176
106
  */
177
107
  export function normalizeSourceTicketIds(ids, label = '--source-tickets') {
@@ -197,12 +127,6 @@ export function normalizeSourceTicketIds(ids, label = '--source-tickets') {
197
127
  }
198
128
 
199
129
  /**
200
- * Pull the `--tickets` id set out of a `plan-context.js` envelope.
201
- *
202
- * The envelope's `sourceTickets[]` carries whole ticket records
203
- * (`{ id, title, body, … }`); only the ids matter here. A non-`tickets`-mode
204
- * envelope (seed / seed-file) has no source tickets and yields `[]`.
205
- *
206
130
  * @param {object|null} envelope
207
131
  * @returns {number[]}
208
132
  */
@@ -222,21 +146,9 @@ function sameIdSet(a, b) {
222
146
  }
223
147
 
224
148
  /**
225
- * Resolve which source-ticket ids reach the partition and the close phase.
226
- *
227
- * Precedence — an explicit flag wins, the envelope is the default channel
228
- * (Story #4554):
229
- *
230
- * 1. `--source-tickets` when supplied — the explicit override for
231
- * hand-driven runs. A disagreement with the envelope is warned about
232
- * loudly (the operator is overriding what the run actually fetched)
233
- * but honoured.
234
- * 2. otherwise the envelope's `sourceTickets[]` — so the common
235
- * `/mandrel-plan --tickets` path needs no flag at all.
236
- * 3. otherwise empty, reported as `origin: 'none'`.
237
- *
238
- * `origin` is surfaced on the persist envelope so a run that superseded
239
- * nothing says *why* rather than looking like a clean no-op.
149
+ * Resolve the source-ticket ids: an explicit `--source-tickets` wins (warned
150
+ * when it disagrees with the envelope), else the envelope's
151
+ * `sourceTickets[]`. `origin` lets a run that superseded nothing say why.
240
152
  *
241
153
  * @param {object} [args]
242
154
  * @param {unknown} [args.explicitIds] Raw `--source-tickets` value.
@@ -279,8 +191,6 @@ function describeStoryIds(entries) {
279
191
  }
280
192
 
281
193
  /**
282
- * Index which Story claims each source id.
283
- *
284
194
  * @param {Array<{ slug: string, supersedes?: Array<{ id: number }> }>} list
285
195
  * @returns {Map<number, string[]>} id → claiming slugs, in draft order.
286
196
  */
@@ -298,31 +208,9 @@ function indexSupersedeClaims(list) {
298
208
  }
299
209
 
300
210
  /**
301
- * Complete the supersede map, refusing only what the plan gets wrong.
302
- *
303
- * Two halves, split by who can be right (Story #5342):
304
- *
305
- * - **Refused.** A Story claiming an id that was never a source ticket, and
306
- * two Stories claiming the same id. Both name an intent the run cannot
307
- * act on — the first would comment on and close an issue nobody asked
308
- * about, the second cannot say which Story replaced it — so they fail
309
- * closed, **before** `createIssue`, and no Story goes live against an
310
- * inconsistent tracker.
311
- * - **Assigned with a warning.** A source id no Story claimed. Every id
312
- * passed to `--tickets` is being replaced by this plan by construction;
313
- * which Story records it is a bookkeeping detail, and the primary Story
314
- * is the answer the operator would have given. Refusing cost a whole
315
- * re-author round to type back a fact the run already knew.
316
- *
317
- * Mutates the unclaimed ids onto the primary Story's `supersedes[]`.
318
- *
319
- * **`stories[0]` is the primary, and it is the *only* derivation of it**
320
- * (Story #5361): `assemblePlanStories` hands this list over already sorted by
321
- * `orderStoriesByDependencies`, which is the same order the create loop files
322
- * the Stories in — so the `superseded-by` comment this assignment produces
323
- * can never name a different Story from the checkpoint and the plan summary.
324
- * A non-empty list is the caller's contract (assembly refuses an empty
325
- * draft before it gets here).
211
+ * Runs before `createIssue`. A non-source or doubly-claimed id throws; an
212
+ * unclaimed source id goes to the primary Story (`stories[0]`, as the list
213
+ * arrives in create order) with a warning.
326
214
  *
327
215
  * @param {Array<{ slug: string, supersedes: Array<{ id: number, note: string|null }> }>} stories
328
216
  * Dependency-ordered and non-empty.
@@ -371,12 +259,9 @@ export function resolveSupersedePartition(stories, sourceTicketIds = []) {
371
259
  }
372
260
 
373
261
  /**
374
- * Render the supersede comment posted on a source issue.
375
- *
376
262
  * @param {object} args
377
263
  * @param {{ id: number, title: string }} args.story The claiming Story.
378
- * @param {string|null} [args.note] Optional per-supersede note authored on
379
- * the Story — carries a correction to this issue's analysis.
264
+ * @param {string|null} [args.note] Correction to this issue's analysis.
380
265
  * @param {number[]} args.sourceTicketIds Full `--tickets` argument.
381
266
  * @returns {string}
382
267
  */
@@ -385,8 +270,6 @@ export function buildSupersedeCommentBody({
385
270
  note = null,
386
271
  sourceTicketIds,
387
272
  }) {
388
- // Story #4540 retired the plan-run label, which used to be listed here
389
- // alongside the type/state labels.
390
273
  const labels = ['`type::story`', '`agent::ready`'];
391
274
 
392
275
  const lines = [
@@ -406,12 +289,7 @@ export function buildSupersedeCommentBody({
406
289
  }
407
290
 
408
291
  /**
409
- * Resolve the live state of a source ticket.
410
- *
411
- * The ticket itself rides along so the close can strip the `agent::*` label
412
- * without a second read: `updateTicket`'s label merge takes a
413
- * `_ticketSnapshot` for exactly this, and this probe has already paid for the
414
- * fresh copy.
292
+ * The ticket rides along so the close needs no second read.
415
293
  *
416
294
  * @returns {Promise<{ ok: true, state: string, ticket: object } | { ok: false, reason: string }>}
417
295
  */
@@ -470,18 +348,13 @@ async function closeOneSupersededTicket({
470
348
  * @property {boolean} enabled
471
349
  * @property {boolean} dryRun
472
350
  * @property {string|null} reason Why the phase was skipped wholesale.
473
- * @property {'flag'|'envelope'|'none'} [sourceTicketOrigin] Which channel the
474
- * source ids came from. Stamped by `runPlanPersist`, not this module.
351
+ * @property {'flag'|'envelope'|'none'} [sourceTicketOrigin] Stamped by `runPlanPersist`.
475
352
  * @property {number[]} closed
476
353
  * @property {Array<{ ticket: number, storySlug: string }>} planned Dry-run
477
- * only. Keyed by slug, not id: under `--dry-run` no issue was created, so
478
- * `createStoryIssues` hands back a synthetic negative placeholder id. The
479
- * slug is the only identifier that means anything before the writes land.
354
+ * only; keyed by slug because dry-run Story ids are placeholders.
480
355
  * @property {Array<{ ticket: number, reason: string }>} skipped
481
356
  * @property {Array<{ ticket: number, reason: string }>} failed
482
- * @property {{ closed: number[], pending: number[] }} epicRollup Container
483
- * Epics this phase's closes resolved. Empty on a dry run and on a phase that
484
- * closed nothing.
357
+ * @property {{ closed: number[], pending: number[] }} epicRollup
485
358
  */
486
359
 
487
360
  function emptyReport(overrides) {
@@ -499,22 +372,10 @@ function emptyReport(overrides) {
499
372
  }
500
373
 
501
374
  /**
502
- * Re-derive the container Epic above every ticket this phase just closed.
503
- *
504
- * Closing a source ticket is a child state change like any other, and it was
505
- * the one edge with no rollup behind it. Superseding a cohort therefore left
506
- * its container open indefinitely: every child was closed, so no delivery
507
- * would ever run and no land tail would ever fire the derivation. The Epic sat
508
- * open above finished work until someone noticed.
509
- *
510
- * Runs **after** the closes land, never alongside them: the rollup reads each
511
- * child's state back, so racing it against the writes it is meant to observe
512
- * would derive from a tree half of which has not been written yet.
513
- *
514
- * Sequential, sharing one `skipEpicIds` set, because siblings share a
515
- * container — without it the second ticket re-derives, and re-closes, the Epic
516
- * the first already closed. `rollUpEpicForStory` never throws, so no guard is
517
- * needed here beyond the phase-level one the caller already holds.
375
+ * Re-derive the container Epic above every closed ticket — no delivery will
376
+ * ever fire that rollup for a superseded cohort. Runs after the closes land
377
+ * (it reads child state back), and sequentially with one shared `skipEpicIds`
378
+ * so siblings do not re-close the same Epic.
518
379
  *
519
380
  * @param {{ closedIds: number[], provider: object, config?: object }} opts
520
381
  * @returns {Promise<{ closed: number[], pending: number[] }>}
@@ -541,11 +402,8 @@ async function rollUpContainersFor({ closedIds, provider, config }) {
541
402
  }
542
403
 
543
404
  /**
544
- * Comment on and close every superseded source ticket.
545
- *
546
- * **Never throws** and never fails the run — Stories are already live by the
547
- * time this executes, so bookkeeping failures degrade to a report the
548
- * operator can act on.
405
+ * Comment on and close every superseded source ticket. Never throws: Stories
406
+ * are already live, so failures degrade to a report.
549
407
  *
550
408
  * @param {object} args
551
409
  * @param {object} args.provider
@@ -579,12 +437,9 @@ export async function closeSupersededTickets({
579
437
  );
580
438
  const units = collectSupersedeUnits(stories, createdBySlug);
581
439
 
582
- // Story #4952 — one bounded fan-out across distinct source tickets. The
583
- // mapper inherits `closeOneSupersededTicket`'s never-throw contract (and
584
- // resolves the two pre-write outcomes itself), so `concurrentMap`'s
585
- // first-rejection-wins policy can never fire and no unit is abandoned
586
- // because a sibling failed. Input order is preserved, so the report arrays
587
- // below read exactly as the serial nested loop wrote them.
440
+ // The mapper never throws, so no unit is abandoned for a sibling's failure.
441
+ // Units are distinct tickets (the partition refused duplicates); within one
442
+ // the probe → comment → close sequence stays strictly ordered.
588
443
  const outcomes = await concurrentMap(
589
444
  units,
590
445
  ({ id, note, createdStory }) => {
@@ -600,13 +455,6 @@ export async function closeSupersededTickets({
600
455
  sourceTicketIds: sources,
601
456
  });
602
457
  },
603
- // The per-source-ticket close (Story #4952) fans out across **distinct**
604
- // tickets — `resolveSupersedePartition` has already failed the run closed
605
- // if two Stories claim the same id, so no two units in flight can touch
606
- // the same issue. Within one unit the probe → comment → close sequence
607
- // stays strictly ordered: commenting on an issue the probe reported
608
- // closed, or closing one the comment never landed on, is the whole
609
- // failure mode this phase is careful about.
610
458
  { concurrency: FANOUT_CONCURRENCY },
611
459
  );
612
460
 
@@ -628,9 +476,6 @@ export async function closeSupersededTickets({
628
476
  }
629
477
 
630
478
  /**
631
- * Flatten the per-Story `supersedes[]` maps into one list of close units, in
632
- * the nested iteration order the report arrays are expected to follow.
633
- *
634
479
  * @param {Array<{ slug: string, supersedes?: Array<{ id: number, note: string|null }> }>|undefined} stories
635
480
  * @param {Map<string, { slug: string, id: number, title: string }>} createdBySlug
636
481
  * @returns {Array<{ id: number, note: string|null, createdStory: object|undefined }>}
@@ -647,8 +492,6 @@ function collectSupersedeUnits(stories, createdBySlug) {
647
492
  }
648
493
 
649
494
  /**
650
- * File one unit's outcome onto the report.
651
- *
652
495
  * @param {SupersedeReport} report
653
496
  * @param {{ id: number, createdStory: object|undefined }} unit
654
497
  * @param {{ outcome: string, reason?: string }} result
@@ -674,9 +517,6 @@ function recordSupersedeOutcome(report, unit, result) {
674
517
  }
675
518
 
676
519
  /**
677
- * Surface the supersede outcome on the console so a partial failure is
678
- * visible without reading the JSON envelope.
679
- *
680
520
  * @param {SupersedeReport} report
681
521
  */
682
522
  function logSupersedeReport(report) {
@@ -1,11 +1,6 @@
1
1
  /**
2
- * wave-collision-gate.js — the split gate (Story #5332).
3
- *
4
- * Kept out of `wave-serialisation.js` because it answers a different
5
- * question. That module *predicts* what the dispatcher will do with a draft
6
- * and renders the prediction as a receipt; this one decides whether the draft
7
- * may be created at all, and so owns both the one enumeration the refusal and
8
- * the receipt share and the shape reconciliation that enumeration needs.
2
+ * wave-collision-gate.js — the split gate: decides whether an N>1 draft may
3
+ * be created at all, where `wave-serialisation.js` only predicts.
9
4
  *
10
5
  * @module lib/orchestration/plan-persist/wave-collision-gate
11
6
  */
@@ -13,21 +8,9 @@
13
8
  import { predictWaveSerialisation } from './wave-serialisation.js';
14
9
 
15
10
  /**
16
- * Expose an assembled Story's declared footprint where `storyFootprint`
17
- * looks for it.
18
- *
19
- * `assemblePlanStories` returns the persisted artifact — `{ slug, title,
20
- * body, bodyObject, acceptance, depends_on, … }` — and carries the parsed
21
- * `changes[]` inside `bodyObject`, not at the top level. `storyFootprint`
22
- * reads `files` / `changes` / `changeset` only, so from Story #5313 (which
23
- * retired the body scrape that had been widening the footprint out of the
24
- * markdown) until this Story the production call saw an empty footprint for
25
- * every assembled Story and predicted nothing — the unit fixtures passed a
26
- * top-level `changes` and so could not show it. The prediction is now the
27
- * split gate, and a gate that cannot see a declaration cannot fire, so the
28
- * shapes are reconciled here rather than by widening the dispatcher's own
29
- * predicate: the runtime's records (`resolve-stories.js`) already carry
30
- * `changes` at the top level and pass through untouched.
11
+ * Assembled Stories carry `changes[]` inside `bodyObject`, but
12
+ * `storyFootprint` reads only top-level `files`/`changes`/`changeset` — lift
13
+ * it, or the gate sees an empty footprint and can never fire.
31
14
  *
32
15
  * @param {object} story
33
16
  * @returns {object} The same record, with a top-level `changes` when one can
@@ -44,8 +27,6 @@ function withDeclaredFootprint(story) {
44
27
  }
45
28
 
46
29
  /**
47
- * Render one refused pair as a report line.
48
- *
49
30
  * @param {{ wave: number, slugs: [string, string], paths: string[], source: string }} collision
50
31
  * @returns {string}
51
32
  */
@@ -55,31 +36,10 @@ function formatCollision({ wave, slugs, paths, source }) {
55
36
  }
56
37
 
57
38
  /**
58
- * Compute the same-wave collisions of a draft and refuse an N>1 draft that
59
- * has any — the split gate.
60
- *
61
- * ADR `20260912-5312` deleted every numeric plan-time ceiling and left the
62
- * default-single policy enforced by prose plus `assertAcceptancePartition`,
63
- * which refused only byte-identical acceptance text across siblings — a shape
64
- * model output does not produce. The measured result was a plan of 18 Stories
65
- * whose own summary comment recorded 39 shared files across 14 same-wave
66
- * Stories: the plan refuted its own parallelism claim, after persist, with
67
- * nothing acting on it.
68
- *
69
- * So the gate is the dispatcher's own predicate rather than a proxy for it. A
70
- * pair {@link predictWaveSerialisation} names is a pair
71
- * `stories-wave-tick.js` will refuse to co-dispatch, so the split buys no
72
- * parallelism while still paying a delivery session per Story. Two remedies,
73
- * both the author's to take before anything is created: merge the pair into
74
- * the one Story it already is, or order it with `depends_on` so the members
75
- * land in different waves.
76
- *
77
- * **N=1 can never trip it.** A single-Story draft has no pair to score, so
78
- * the prediction is empty by construction.
79
- *
80
- * The computed collisions are **returned** so the caller hands the same value
81
- * to the plan-summary receipt instead of recomputing it — a recomputation is
82
- * how the refusal and the receipt would come to disagree.
39
+ * Refuse an N>1 draft with any same-wave collision. The gate is the
40
+ * dispatcher's own predicate: a pair it names will never co-dispatch, so the
41
+ * split buys no parallelism. Collisions are returned so the summary receipt
42
+ * reuses them rather than recomputing (and disagreeing).
83
43
  *
84
44
  * @param {ReturnType<typeof import('./summary.js').buildWaveTable>} waveTable
85
45
  * @param {Array<object>} stories The assembled Stories, in draft order.
@@ -1,11 +1,6 @@
1
1
  /**
2
- * wave-serialisation.js — what the dispatcher will actually do with the wave
3
- * table plan-persist prints (Story #5265).
4
- *
5
- * Kept out of `summary.js` because it answers a different question. The
6
- * summary module renders receipts persist already computed; this one runs the
7
- * *runtime's* collision predicate over the assembled Story bodies to work out
8
- * which of the table's promises the next tick will refuse to keep.
2
+ * wave-serialisation.js — predicts which of the wave table's parallelism
3
+ * promises the dispatcher will refuse to keep.
9
4
  *
10
5
  * @module lib/orchestration/plan-persist/wave-serialisation
11
6
  */
@@ -13,20 +8,9 @@
13
8
  import { detectCollision } from '../../wave-runner/footprint.js';
14
9
 
15
10
  /**
16
- * Predict which same-wave pairs the dispatch guard will actually refuse to
17
- * co-dispatch (Story #5265).
18
- *
19
- * The wave table answers a `depends_on` question, and the runtime answers a
20
- * different one: `stories-wave-tick.js` withholds on {@link detectCollision}
21
- * over the declared `changes[]` (Story #5313 retired the text scrape), so
22
- * two same-wave Stories that both declare a path — a shared generated
23
- * baseline, say — are shown in one order and dispatched one at a time. The
24
- * table promised parallelism the next tick refused, with nothing anywhere
25
- * reconciling the two.
26
- *
27
- * This runs the runtime's own exported predicate — not a reimplementation of
28
- * it — pairwise within each wave, so the prediction cannot drift from the
29
- * behaviour it predicts.
11
+ * Same-wave pairs the dispatch guard will refuse to co-dispatch, computed by
12
+ * running the runtime's own {@link detectCollision} pairwise — never a
13
+ * reimplementation — so the prediction cannot drift from the behaviour.
30
14
  *
31
15
  * @param {ReturnType<typeof buildWaveTable>} waveTable
32
16
  * @param {Array<{ slug: string, title?: string, body?: string, spec?: string, changes?: Array }>} stories
@@ -61,13 +45,8 @@ export function predictWaveSerialisation(waveTable, stories, options = {}) {
61
45
  }
62
46
 
63
47
  /**
64
- * Render the predicted serialisation beside the wave table (Story #5265).
65
- *
66
- * Same shape as {@link renderSharedEditorLines} on purpose: both are caveats
67
- * against the same promise, and an operator should read them the same way.
68
- * The difference is what they know — the shared-editor pass names paths two
69
- * Stories both *write*, this one names every pair the dispatcher will refuse
70
- * to run together, glob declarations included.
48
+ * Same shape as {@link renderSharedEditorLines} on purpose: both caveat the
49
+ * same promise.
71
50
  *
72
51
  * @param {ReturnType<typeof predictWaveSerialisation>} collisions
73
52
  * @returns {string[]}