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,14 +1,6 @@
1
1
  /**
2
- * summary.js — plan-persist terminal summary (v2 Stage 3).
3
- *
4
- * Upserts a single `plan-summary` structured comment on the primary Story
5
- * at terminal success. Carries the persist receipts — including whether the
6
- * operator forced a review stop — and the dry-run `depends_on` ordering table
7
- * for the rare N>1 plan.
8
- *
9
- * Story #4542 removed the risk / review-routing line: no risk level, gate
10
- * decision, or acceptance disposition is computed at plan time any more, so
11
- * 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.
12
4
  *
13
5
  * @module lib/orchestration/plan-persist/summary
14
6
  */
@@ -17,13 +9,6 @@ import { computeStoryWaves } from '../dependency-analyzer.js';
17
9
  import { renderPredictedSerialisationLines } from './wave-serialisation.js';
18
10
 
19
11
  /**
20
- * Structured-comment type for the persist summary.
21
- */
22
- export const PLAN_SUMMARY_COMMENT_TYPE = 'plan-summary';
23
-
24
- /**
25
- * Compute the dry-run wave assignment for a validated ticket set.
26
- *
27
12
  * @param {Array<{ slug: string, title?: string, depends_on?: string[] }>} tickets
28
13
  * @returns {Array<{ wave: number, stories: Array<{ slug: string, title: string }> }>}
29
14
  */
@@ -67,21 +52,11 @@ function renderWaveTableLines(waveTable) {
67
52
  }
68
53
 
69
54
  /**
70
- * Render the shared-editor collisions beside the wave table (Story #5045).
71
- *
72
- * The wave table is a promise about parallelism — "these Stories can run
73
- * together". `computeSharedEditorFindings` knows exactly where that promise
74
- * breaks down: a path two same-wave Stories both write will conflict on every
75
- * merge after the first. Until now those findings degraded to a `Logger.warn`
76
- * on stderr and were discarded, so the comment carried the optimistic half of
77
- * the analysis and none of the caveat. Rendering them here puts the promise
78
- * and its known exceptions on one durable surface.
79
- *
80
- * Advisory by default and labelled as such — `planning.failOnSharedEditors`
81
- * 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.
82
57
  *
83
58
  * @param {object[]|null} conflictFindings
84
- * @returns {string[]} Lines to splice after the wave table, or `[]`.
59
+ * @returns {string[]}
85
60
  */
86
61
  function renderSharedEditorLines(conflictFindings) {
87
62
  const shared = (
@@ -114,8 +89,6 @@ function renderSharedEditorLines(conflictFindings) {
114
89
  }
115
90
 
116
91
  /**
117
- * Build the `plan-summary` structured-comment 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,22 +127,19 @@ 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(' ')}`
169
139
  : '/mandrel-deliver <storyId> [<storyId> ...]';
170
140
 
171
141
  return [
172
- `### 📋 Plan Summary — Story #${epicId} is \`agent::ready\``,
142
+ `#### 📋 Plan Summary — Story #${epicId} is \`agent::ready\``,
173
143
  '',
174
144
  `- ${ticketCount} Story ticket(s) persisted: ${storyList}.`,
175
145
  ...reviewLines,
@@ -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. **`assertSupersedePartition`** — a plan-time, fail-closed check that
19
- * runs *before* any GitHub write. Same fail-closed shape as the
20
- * every id passed to `--tickets` must be claimed by exactly one Story,
21
- * and no Story may claim an id that was not a source ticket. A partial
22
- * supersede map is a planning error, not something to paper over at
23
- * write time.
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,18 +191,10 @@ function describeStoryIds(entries) {
279
191
  }
280
192
 
281
193
  /**
282
- * Fail closed on a partial supersede map.
283
- *
284
- * Runs **before** `createIssue` so a mis-authored map never leaves Stories
285
- * live against an inconsistent tracker.
286
- *
287
- * @param {Array<{ slug: string, supersedes: Array<{ id: number }> }>} stories
288
- * @param {number[]} sourceTicketIds Ids passed to `/mandrel-plan --tickets`.
194
+ * @param {Array<{ slug: string, supersedes?: Array<{ id: number }> }>} list
195
+ * @returns {Map<number, string[]>} id → claiming slugs, in draft order.
289
196
  */
290
- export function assertSupersedePartition(stories, sourceTicketIds = []) {
291
- const list = Array.isArray(stories) ? stories : [];
292
- const sources = new Set(sourceTicketIds);
293
-
197
+ function indexSupersedeClaims(list) {
294
198
  /** @type {Map<number, string[]>} */
295
199
  const claims = new Map();
296
200
  for (const story of list) {
@@ -300,9 +204,25 @@ export function assertSupersedePartition(stories, sourceTicketIds = []) {
300
204
  claims.set(id, owners);
301
205
  }
302
206
  }
207
+ return claims;
208
+ }
303
209
 
304
- const errors = [];
210
+ /**
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.
214
+ *
215
+ * @param {Array<{ slug: string, supersedes: Array<{ id: number, note: string|null }> }>} stories
216
+ * Dependency-ordered and non-empty.
217
+ * @param {number[]} sourceTicketIds Ids passed to `/mandrel-plan --tickets`.
218
+ * @returns {string[]} One warning per id assigned by default.
219
+ */
220
+ export function resolveSupersedePartition(stories, sourceTicketIds = []) {
221
+ const list = Array.isArray(stories) ? stories : [];
222
+ const sources = new Set(sourceTicketIds);
223
+ const claims = indexSupersedeClaims(list);
305
224
 
225
+ const errors = [];
306
226
  for (const [id, owners] of claims) {
307
227
  if (owners.length > 1) {
308
228
  errors.push(
@@ -317,32 +237,31 @@ export function assertSupersedePartition(stories, sourceTicketIds = []) {
317
237
  );
318
238
  }
319
239
  }
320
-
321
- for (const id of sources) {
322
- if (!claims.has(id)) {
323
- errors.push(
324
- `source ticket #${id} is not claimed by any Story's supersedes[] — ` +
325
- 'a partial supersede map is a planning error. Claim it, or drop it ' +
326
- 'from --tickets.',
327
- );
328
- }
329
- }
330
-
331
240
  if (errors.length > 0) {
332
241
  throw new Error(
333
242
  `[plan-persist] supersede partition failed with ${errors.length} ` +
334
243
  `error(s):\n${errors.map((e) => ` - ${e}`).join('\n')}`,
335
244
  );
336
245
  }
246
+
247
+ const primary = list[0];
248
+ const warnings = [];
249
+ for (const id of sources) {
250
+ if (claims.has(id)) continue;
251
+ primary.supersedes = [...(primary.supersedes ?? []), { id, note: null }];
252
+ warnings.push(
253
+ `source ticket #${id} was claimed by no Story's supersedes[] — ` +
254
+ `assigned to the primary Story "${primary.slug}". Author the claim ` +
255
+ 'explicitly if another Story is the one that replaces it.',
256
+ );
257
+ }
258
+ return warnings;
337
259
  }
338
260
 
339
261
  /**
340
- * Render the supersede comment posted on a source issue.
341
- *
342
262
  * @param {object} args
343
263
  * @param {{ id: number, title: string }} args.story The claiming Story.
344
- * @param {string|null} [args.note] Optional per-supersede note authored on
345
- * the Story — carries a correction to this issue's analysis.
264
+ * @param {string|null} [args.note] Correction to this issue's analysis.
346
265
  * @param {number[]} args.sourceTicketIds Full `--tickets` argument.
347
266
  * @returns {string}
348
267
  */
@@ -351,8 +270,6 @@ export function buildSupersedeCommentBody({
351
270
  note = null,
352
271
  sourceTicketIds,
353
272
  }) {
354
- // Story #4540 retired the plan-run label, which used to be listed here
355
- // alongside the type/state labels.
356
273
  const labels = ['`type::story`', '`agent::ready`'];
357
274
 
358
275
  const lines = [
@@ -372,12 +289,7 @@ export function buildSupersedeCommentBody({
372
289
  }
373
290
 
374
291
  /**
375
- * Resolve the live state of a source ticket.
376
- *
377
- * The ticket itself rides along so the close can strip the `agent::*` label
378
- * without a second read: `updateTicket`'s label merge takes a
379
- * `_ticketSnapshot` for exactly this, and this probe has already paid for the
380
- * fresh copy.
292
+ * The ticket rides along so the close needs no second read.
381
293
  *
382
294
  * @returns {Promise<{ ok: true, state: string, ticket: object } | { ok: false, reason: string }>}
383
295
  */
@@ -436,18 +348,13 @@ async function closeOneSupersededTicket({
436
348
  * @property {boolean} enabled
437
349
  * @property {boolean} dryRun
438
350
  * @property {string|null} reason Why the phase was skipped wholesale.
439
- * @property {'flag'|'envelope'|'none'} [sourceTicketOrigin] Which channel the
440
- * source ids came from. Stamped by `runPlanPersist`, not this module.
351
+ * @property {'flag'|'envelope'|'none'} [sourceTicketOrigin] Stamped by `runPlanPersist`.
441
352
  * @property {number[]} closed
442
353
  * @property {Array<{ ticket: number, storySlug: string }>} planned Dry-run
443
- * only. Keyed by slug, not id: under `--dry-run` no issue was created, so
444
- * `createStoryIssues` hands back a synthetic negative placeholder id. The
445
- * slug is the only identifier that means anything before the writes land.
354
+ * only; keyed by slug because dry-run Story ids are placeholders.
446
355
  * @property {Array<{ ticket: number, reason: string }>} skipped
447
356
  * @property {Array<{ ticket: number, reason: string }>} failed
448
- * @property {{ closed: number[], pending: number[] }} epicRollup Container
449
- * Epics this phase's closes resolved. Empty on a dry run and on a phase that
450
- * closed nothing.
357
+ * @property {{ closed: number[], pending: number[] }} epicRollup
451
358
  */
452
359
 
453
360
  function emptyReport(overrides) {
@@ -465,22 +372,10 @@ function emptyReport(overrides) {
465
372
  }
466
373
 
467
374
  /**
468
- * Re-derive the container Epic above every ticket this phase just closed.
469
- *
470
- * Closing a source ticket is a child state change like any other, and it was
471
- * the one edge with no rollup behind it. Superseding a cohort therefore left
472
- * its container open indefinitely: every child was closed, so no delivery
473
- * would ever run and no land tail would ever fire the derivation. The Epic sat
474
- * open above finished work until someone noticed.
475
- *
476
- * Runs **after** the closes land, never alongside them: the rollup reads each
477
- * child's state back, so racing it against the writes it is meant to observe
478
- * would derive from a tree half of which has not been written yet.
479
- *
480
- * Sequential, sharing one `skipEpicIds` set, because siblings share a
481
- * container — without it the second ticket re-derives, and re-closes, the Epic
482
- * the first already closed. `rollUpEpicForStory` never throws, so no guard is
483
- * 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.
484
379
  *
485
380
  * @param {{ closedIds: number[], provider: object, config?: object }} opts
486
381
  * @returns {Promise<{ closed: number[], pending: number[] }>}
@@ -507,11 +402,8 @@ async function rollUpContainersFor({ closedIds, provider, config }) {
507
402
  }
508
403
 
509
404
  /**
510
- * Comment on and close every superseded source ticket.
511
- *
512
- * **Never throws** and never fails the run — Stories are already live by the
513
- * time this executes, so bookkeeping failures degrade to a report the
514
- * 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.
515
407
  *
516
408
  * @param {object} args
517
409
  * @param {object} args.provider
@@ -545,12 +437,9 @@ export async function closeSupersededTickets({
545
437
  );
546
438
  const units = collectSupersedeUnits(stories, createdBySlug);
547
439
 
548
- // Story #4952 — one bounded fan-out across distinct source tickets. The
549
- // mapper inherits `closeOneSupersededTicket`'s never-throw contract (and
550
- // resolves the two pre-write outcomes itself), so `concurrentMap`'s
551
- // first-rejection-wins policy can never fire and no unit is abandoned
552
- // because a sibling failed. Input order is preserved, so the report arrays
553
- // 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.
554
443
  const outcomes = await concurrentMap(
555
444
  units,
556
445
  ({ id, note, createdStory }) => {
@@ -566,13 +455,6 @@ export async function closeSupersededTickets({
566
455
  sourceTicketIds: sources,
567
456
  });
568
457
  },
569
- // The per-source-ticket close (Story #4952) fans out across **distinct**
570
- // tickets — `assertSupersedePartition` has already failed the run closed
571
- // if two Stories claim the same id, so no two units in flight can touch
572
- // the same issue. Within one unit the probe → comment → close sequence
573
- // stays strictly ordered: commenting on an issue the probe reported
574
- // closed, or closing one the comment never landed on, is the whole
575
- // failure mode this phase is careful about.
576
458
  { concurrency: FANOUT_CONCURRENCY },
577
459
  );
578
460
 
@@ -594,9 +476,6 @@ export async function closeSupersededTickets({
594
476
  }
595
477
 
596
478
  /**
597
- * Flatten the per-Story `supersedes[]` maps into one list of close units, in
598
- * the nested iteration order the report arrays are expected to follow.
599
- *
600
479
  * @param {Array<{ slug: string, supersedes?: Array<{ id: number, note: string|null }> }>|undefined} stories
601
480
  * @param {Map<string, { slug: string, id: number, title: string }>} createdBySlug
602
481
  * @returns {Array<{ id: number, note: string|null, createdStory: object|undefined }>}
@@ -613,8 +492,6 @@ function collectSupersedeUnits(stories, createdBySlug) {
613
492
  }
614
493
 
615
494
  /**
616
- * File one unit's outcome onto the report.
617
- *
618
495
  * @param {SupersedeReport} report
619
496
  * @param {{ id: number, createdStory: object|undefined }} unit
620
497
  * @param {{ outcome: string, reason?: string }} result
@@ -640,9 +517,6 @@ function recordSupersedeOutcome(report, unit, result) {
640
517
  }
641
518
 
642
519
  /**
643
- * Surface the supersede outcome on the console so a partial failure is
644
- * visible without reading the JSON envelope.
645
- *
646
520
  * @param {SupersedeReport} report
647
521
  */
648
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[]}