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,11 +1,5 @@
1
1
  /**
2
- * phases/options.js — CLI / injection option parsing for
3
- * `single-story-close`.
4
- *
5
- * Handles the conditional param-vs-CLI branch and all flag defaults in one
6
- * place so the main `runSingleStoryClose` body stays focused on close
7
- * pipeline logic. Each `??` operator counts as a branch in escomplex; the
8
- * `resolveFlag` helper keeps the cyclomatic complexity tally bounded.
2
+ * phases/options.js — CLI / injection option parsing for `single-story-close`.
9
3
  */
10
4
 
11
5
  import path from 'node:path';
@@ -19,13 +13,8 @@ import { PROJECT_ROOT } from '../../../project-root.js';
19
13
  import { isOperatorMergeReason } from './auto-merge.js';
20
14
 
21
15
  /**
22
- * Resolve a flag value from an explicit override or a parsed CLI arg.
23
- *
24
- * Returns `undefined` when neither is supplied — that absence is itself the
25
- * answer here, letting each caller below apply its own default (a `!!` coerce,
26
- * a config lookup, or a deliberate `undefined` passed further down). The
27
- * former third `defaultValue` parameter was dropped in Story #4961: no call
28
- * site passed it, so it documented a mode nobody used.
16
+ * Param beats parsed arg; `undefined` lets each caller apply its own default.
17
+ * (A helper, since each `??` counts toward cyclomatic complexity.)
29
18
  *
30
19
  * @template T
31
20
  * @param {T|undefined} paramValue
@@ -37,13 +26,7 @@ function resolveFlag(paramValue, parsedValue) {
37
26
  }
38
27
 
39
28
  /**
40
- * An integer flag at or above `min`, or `undefined` — the shape BOTH numeric
41
- * close flags share (Story #5266 deduplicated them): absence is preserved so
42
- * the reader downstream applies its own config default, and a junk value is
43
- * treated as absent rather than coerced into a bound nobody asked for.
44
- *
45
- * `min` is what separates them: `--max-wait-seconds 0` is a typo (a
46
- * zero-second wait), while `--rerun-advisory 0` is the meaningful default.
29
+ * Junk reads as absent (so the config default applies), never coerced.
47
30
  *
48
31
  * @param {unknown} value
49
32
  * @param {number} min
@@ -54,26 +37,9 @@ function intAtLeast(value, min) {
54
37
  }
55
38
 
56
39
  /**
57
- * Resolve whether close lands the PR in-process (`waitForMerge`).
58
- *
59
- * Called by `runSingleStoryClose` **after** config resolution and the
60
- * auto-merge phase, because two of its four inputs are not knowable at
61
- * parse time: the resolved config (whose `cwd` this parse produces) and the
62
- * actual arm outcome. Resolving it here — once, where every input exists —
63
- * is what makes `delivery.routing.closeAndLand` governable at all.
64
- *
65
- * Precedence, highest first:
66
- * 1. `--no-wait-merge` / injected opt-out — always wins.
67
- * 2. **Operator owns the merge** (`--no-auto-merge`, or
68
- * `delivery.ci.autoMerge: "strict"`): the PR was deliberately left
69
- * un-armed, so there is nothing for close to land. Resting at
70
- * `agent::closing` for the human IS the documented contract for both
71
- * surfaces; waiting would only burn the poll budget and then block a
72
- * perfectly healthy Story. An explicit `--wait-merge` cannot override
73
- * this — you cannot land-in-one-close a PR you refused to arm — so the
74
- * caller is told rather than silently ignored.
75
- * 3. Explicit `--wait-merge` / injected boolean.
76
- * 4. `delivery.routing.closeAndLand` (framework default `true`).
40
+ * Precedence: `--no-wait-merge`; then an un-armed PR (operator owns the
41
+ * merge — not even `--wait-merge` can land it); then `--wait-merge`; then
42
+ * `delivery.routing.closeAndLand`.
77
43
  *
78
44
  * @param {{
79
45
  * waitForMergeExplicit?: boolean,
@@ -105,21 +71,9 @@ export function resolveWaitForMerge({
105
71
  }
106
72
 
107
73
  /**
108
- * Flags this CLI advertised in its `--help` descriptor and never implemented
109
- * (Story #5100). `--dry-run` was transcribed into the usage block by the
110
- * #4750 self-describing sweep and read by nothing in this pipeline —
111
- * `git log -S dryRun` over it is empty in every revision — so an operator who
112
- * trusted it got a real base-sync merge, an `agent::blocked` Story, and a
113
- * terminal envelope that then captured `deliver-recover`'s routing.
114
- * `--no-evidence` names a working flag on the gate wrappers
115
- * (`evidence-gate.js`), but the slot this CLI parsed had no reader at all.
116
- *
117
- * Deleting them from the descriptor is NOT enough. `parseSprintArgs` runs
118
- * `parseArgs` with `strict: false`, so an unknown flag is silently ignored and
119
- * the close proceeds for real — the identical injury, now with no help text to
120
- * explain it. Fail closed instead, exactly as `parseMergeWatchMode` does for an
121
- * unrecognized mode: throw during option parsing, before the first phase, so
122
- * the CLI boundary reports `failed` at phase `init` and nothing is mutated.
74
+ * Flags once advertised but never implemented. Parsing is `strict: false`,
75
+ * so an unknown flag would be silently ignored and the close run for real;
76
+ * reject them before any phase instead.
123
77
  */
124
78
  const RETIRED_FLAGS = Object.freeze({
125
79
  '--dry-run':
@@ -129,13 +83,10 @@ const RETIRED_FLAGS = Object.freeze({
129
83
  });
130
84
 
131
85
  /**
132
- * Reject a retired flag before any phase runs.
86
+ * Matches `--flag` and `--flag=value` only.
133
87
  *
134
- * Matches `--flag` and `--flag=value`; a bare `--` terminator or a positional
135
- * that merely contains the text is not a flag and does not trip it.
136
- *
137
- * @param {string[]} argv argv tail (`process.argv.slice(2)`)
138
- * @throws {Error} naming the flag, why it is gone, and that nothing was mutated
88
+ * @param {string[]} argv
89
+ * @throws {Error}
139
90
  */
140
91
  function assertNoRetiredFlags(argv) {
141
92
  for (const [flag, why] of Object.entries(RETIRED_FLAGS)) {
@@ -149,12 +100,7 @@ function assertNoRetiredFlags(argv) {
149
100
  }
150
101
 
151
102
  /**
152
- * Parse and resolve all CLI / injection options for `runSingleStoryClose`.
153
- *
154
- * `waitForMerge` is deliberately **not** resolved here — see
155
- * {@link resolveWaitForMerge}. This returns the raw operator intent
156
- * (`waitForMergeExplicit` / `noWaitForMerge`) for the runner to resolve once
157
- * the config and the arm outcome exist.
103
+ * Returns raw wait-for-merge intent; the runner resolves it after the arm.
158
104
  *
159
105
  * @param {{ storyIdParam, cwdParam, skipValidationParam, skipSyncParam, noAutoMergeParam, waitForMergeParam, noWaitForMergeParam, maxWaitSecondsParam, mergeWatchModeParam, rerunAdvisoryParam, overrideReviewBlockParam }} raw
160
106
  * @returns {{ storyId, cwd, skipValidation, skipSync, noAutoMerge, waitForMergeExplicit, noWaitForMerge, maxWaitSeconds, mergeWatchMode, rerunAdvisory, overrideReviewBlock }}
@@ -172,22 +118,14 @@ export function parseCloseOptions({
172
118
  rerunAdvisoryParam,
173
119
  overrideReviewBlockParam,
174
120
  }) {
175
- // An injecting caller (`storyIdParam` supplied) is not reading argv at all,
176
- // so there is nothing to parse and `parsed` stays empty. This used to build a
177
- // stand-in object that copied every `*Param` into the slot of the same name —
178
- // which is precisely what `resolveFlag` already does below, preferring the
179
- // param over the parsed slot. One expression per flag now serves both
180
- // callers, so a new flag is added in one place instead of two that can drift.
181
- // The guard runs on the argv door only: an injecting caller supplies
182
- // `storyIdParam` and never reads argv, so the host process's flags (a test
183
- // runner's, say) are none of its business.
121
+ // An injecting caller never reads argv (the host's flags are not its
122
+ // business), so `parsed` stays empty and the retired-flag guard is skipped.
184
123
  let parsed = {};
185
124
  if (storyIdParam === undefined) {
186
125
  assertNoRetiredFlags(process.argv.slice(2));
187
126
  parsed = parseSprintArgs();
188
127
  }
189
- // Preserve undefined so resolveWaitForMerge can apply the closeAndLand
190
- // config default when neither flag was supplied.
128
+ // Undefined when unsupplied, so the closeAndLand default applies.
191
129
  const waitForMergeExplicit = resolveFlag(
192
130
  waitForMergeParam,
193
131
  parsed.waitForMerge,
@@ -200,22 +138,12 @@ export function parseCloseOptions({
200
138
  return {
201
139
  storyId: resolveFlag(storyIdParam, parsed.storyId),
202
140
  cwd: path.resolve(cwdParam ?? parsed.cwd ?? PROJECT_ROOT),
203
- // `undefined` when unsupplied — the merge wait then reads
204
- // `delivery.mergeWatch.maxWaitSeconds`. A per-run override exists so a
205
- // headless caller with no host tool-invocation ceiling can keep
206
- // single-block semantics without editing the consumer's config.
141
+ // Unsupplied values stay `undefined` so config defaults apply; 0 is a
142
+ // typo for a wait but a meaningful rerun allowance.
207
143
  maxWaitSeconds: intAtLeast(maxWaitSeconds, 1),
208
- // `undefined` when unsupplied — the merge wait then reads
209
- // `delivery.mergeWatch.mode`. The two merge-watch flags stay composable and
210
- // mode-agnostic: `--merge-watch-mode async` picks the posture, and an
211
- // explicit `--max-wait-seconds` still wins over that posture's probe cap.
212
144
  mergeWatchMode: parseMergeWatchMode(
213
145
  resolveFlag(mergeWatchModeParam, parsed.mergeWatchMode),
214
146
  ),
215
- // Story #5266 — `undefined` when unsupplied, so the merge wait reads
216
- // `delivery.ci.rerunAdvisory` (default 0). An explicit 0 is preserved as
217
- // an explicit 0: it means "spend nothing", which is also the default, but
218
- // an operator who typed it must not have it read as absent.
219
147
  rerunAdvisory: intAtLeast(rerunAdvisory, 0),
220
148
  skipValidation: !!resolveFlag(skipValidationParam, parsed.skipValidation),
221
149
  skipSync: !!resolveFlag(skipSyncParam, parsed.skipSync),
@@ -225,10 +153,7 @@ export function parseCloseOptions({
225
153
  ? waitForMergeExplicit
226
154
  : undefined,
227
155
  noWaitForMerge: !!resolveFlag(noWaitForMergeParam, parsed.noWaitForMerge),
228
- // `undefined` when unsupplied, which is what keeps a review
229
- // critical blocker blocking. An injecting caller passes the reason string
230
- // directly; both doors run the same validating parser, so neither can arm
231
- // a reasonless override.
156
+ // Both doors validate, so neither can arm a reasonless override.
232
157
  overrideReviewBlock: parseOverrideReviewBlock(
233
158
  resolveFlag(overrideReviewBlockParam, parsed.overrideReviewBlock),
234
159
  ),
@@ -1,32 +1,11 @@
1
1
  /**
2
- * phases/post-land.js — the script-owned land tail (Story #4543).
2
+ * phases/post-land.js — the land tail, the one seam both landing surfaces
3
+ * (the in-close wait and the standalone confirm CLI) reach, so "landed"
4
+ * means the whole tail ran on either.
3
5
  *
4
- * Everything after "the PR merged and the Story is `agent::done`" used to be
5
- * prose in `helpers/deliver-story.md`: Step 5.5 resync, Step 6 cleanup, and
6
- * follow-up capture, each a separate CLI an agent may or may not have run.
7
- * Follow-up capture was the sharpest edge — it lived only on the standalone
8
- * `single-story-confirm-merge.js` path, which close-and-land (the DEFAULT)
9
- * is explicitly told to skip, so per-Story follow-ups were captured *never*
10
- * on the default path, and a belated manual confirm could not backfill (the
11
- * Story is already `agent::done`, so confirm short-circuits `noop` and the
12
- * capture's `action === 'done'` gate never opens).
13
- *
14
- * This module folds every such step into one phase both landing surfaces
15
- * reach — the in-close wait (`phases/confirm-merge.js`) and the standalone
16
- * `single-story-confirm-merge.js` CLI — so the two paths cannot diverge and
17
- * "landed" means the whole tail ran.
18
- *
19
- * **Per-step booleans, not an aggregate.** {@link runPostLandTail} reports
20
- * each step's outcome individually. That is not bookkeeping fastidiousness:
21
- * the worktree-reap defect this repo fixed existed because a phase reported
22
- * an outcome it never checked, and a single `tailOk: true` bit invites that
23
- * class of bug straight back. A degraded step is visible in the terminal
24
- * envelope without failing an otherwise-healthy land.
25
- *
26
- * **Never throws.** The merge already landed — the code is on the base
27
- * branch. Failing the land because a Projects v2 mutation flaked would
28
- * report a false negative about work that is demonstrably done. Every step
29
- * is best-effort and records its own reason.
6
+ * Reports per-step booleans, never one aggregate bit, so a step cannot claim
7
+ * an outcome it never checked. Never throws: the merge already landed, and a
8
+ * flaky step must degrade the report, not the land.
30
9
  */
31
10
 
32
11
  import path from 'node:path';
@@ -51,12 +30,7 @@ import { releaseStoryLease as defaultReleaseStoryLease } from '../../single-stor
51
30
  import { captureStoryFollowUps as defaultCaptureStoryFollowUps } from '../../story-follow-ups.js';
52
31
 
53
32
  /**
54
- * Lockfile that serializes the local-checkout git mutations of the land tail
55
- * across concurrent closes. Keyed on the **main checkout** (never a
56
- * worktree): every concurrent `single-story-close` runs its tail against the
57
- * same `cwd`, so anchoring the lock under that checkout's `.git` directory
58
- * makes them all contend on one file. `.git` is always present, is one per
59
- * checkout, and is never itself tracked, so it is a safe rendezvous home.
33
+ * Under the MAIN checkout's `.git`, so every concurrent close contends on one file.
60
34
  *
61
35
  * @param {string} cwd Main checkout root.
62
36
  * @returns {string}
@@ -66,9 +40,7 @@ function postLandLockPath(cwd) {
66
40
  }
67
41
 
68
42
  /**
69
- * Run one tail step, converting any throw into a `false` + reason. Keeps
70
- * each step's own body free of defensive boilerplate while guaranteeing the
71
- * module-level never-throws contract.
43
+ * Converts any throw into `{ ok: false, detail }`.
72
44
  *
73
45
  * @template T
74
46
  * @param {() => Promise<{ ok: boolean, detail?: string|null }>} run
@@ -94,13 +66,8 @@ async function step(run, { name, progress }) {
94
66
  }
95
67
 
96
68
  /**
97
- * Capture the Story's follow-ups from its friction signal stream.
98
- *
99
- * Calls `captureStoryFollowUps` **directly** rather than through the
100
- * `captureFollowUpsAfterConfirm` action-gate wrapper: by the time the tail
101
- * runs, the merge is already confirmed, so re-deriving that fact from a
102
- * confirmation envelope's `action` field is the exact coupling that made
103
- * the default path skip capture entirely.
69
+ * Calls capture directly, not via the `action`-gated wrapper: the merge is
70
+ * already confirmed, and that gate never opens on an already-done Story.
104
71
  */
105
72
  async function stepFollowUps({
106
73
  storyId,
@@ -125,11 +92,7 @@ async function stepFollowUps({
125
92
 
126
93
  /**
127
94
  * Re-assert the Projects v2 Status column against the bot's late write.
128
- *
129
- * A `skipped` envelope (`no-project`, `not-on-project`, `no-meta`) is a
130
- * **success**: the board the helper would defend does not exist, so there
131
- * is nothing to get wrong. Only a genuine `drifted` outcome — the helper
132
- * fired, polled, and still lost — degrades the step.
95
+ * `skipped` (no board) is success; only `drifted` degrades.
133
96
  */
134
97
  async function stepStatusResync({
135
98
  storyId,
@@ -156,14 +119,7 @@ async function stepStatusResync({
156
119
  };
157
120
  }
158
121
 
159
- /**
160
- * Reap the local `story-<id>` ref. GitHub deletes the *remote* branch on
161
- * squash-merge (`--delete-branch`), but the local ref lingers in the main
162
- * checkout until something prunes it.
163
- *
164
- * An absent ref is a success, not a failure — the sweep is idempotent and
165
- * a previous run (or the init-time merged-sweep) may have already reaped it.
166
- */
122
+ /** Reap the local `story-<id>` ref; already absent is success. */
167
123
  async function stepRefCleanup({ cwd, storyBranch, progress, gitSpawnFn }) {
168
124
  const exists = gitSpawnFn(
169
125
  cwd,
@@ -185,14 +141,8 @@ async function stepRefCleanup({ cwd, storyBranch, progress, gitSpawnFn }) {
185
141
  }
186
142
 
187
143
  /**
188
- * Fast-forward local `baseBranch` so the next Story seeds from the tip that
189
- * now contains this merge. Reuses the same planner/executor pair
190
- * `single-story-init.js` imports (rather than shelling out to
191
- * `/git-cleanup`), which is the established in-process composition pattern.
192
- *
193
- * `already-up-to-date` is a success. A dirty tree is a legitimate, expected
194
- * skip on a shared checkout — another worker is mid-flight — so it degrades
195
- * the step's report without pretending the base moved.
144
+ * Fast-forward local `baseBranch` so the next Story seeds from this merge. A
145
+ * dirty shared checkout is an expected skip that degrades the report.
196
146
  */
197
147
  async function stepBaseFastForward({
198
148
  cwd,
@@ -228,16 +178,7 @@ async function stepBaseFastForward({
228
178
  };
229
179
  }
230
180
 
231
- /**
232
- * Purge this Story's spent temp artifacts now that its merge is confirmed
233
- * (Story #4794).
234
- *
235
- * The engine already emits its own one-line summary and returns a disabled
236
- * policy as `skipped` with no errors, so this step needs no branching of its
237
- * own: errors degrade it, everything else — including a deliberate
238
- * config-disabled no-op — is a success. Reporting a disabled purge as a failed
239
- * step would train readers to ignore the field.
240
- */
181
+ /** Only errors degrade; a config-disabled purge is success. */
241
182
  async function stepTempPurge({ storyId, config, purgeStoryTempArtifactsFn }) {
242
183
  const result = await purgeStoryTempArtifactsFn({ storyId, config });
243
184
  const errors = result?.errors ?? [];
@@ -245,32 +186,9 @@ async function stepTempPurge({ storyId, config, purgeStoryTempArtifactsFn }) {
245
186
  }
246
187
 
247
188
  /**
248
- * Release the Story's assignee-lease now that the merge is confirmed
249
- * (Story #4860).
250
- *
251
- * The close used to release here-ish — immediately after the PR was opened
252
- * and armed, before the merge wait ran — so a Story's ticket read *unassigned*
253
- * for the entire window its PR was open, and indefinitely on the
254
- * operator-merge path where a human owns the land. The claim is the only
255
- * ticket-visible record of who owns in-flight work, so dropping it at PR
256
- * creation is dropping it at exactly the wrong moment.
257
- *
258
- * It lives in the tail rather than in either landing surface because the tail
259
- * is the one seam **both** reach — the in-close merge wait
260
- * (`phases/confirm-merge.js`) and the standalone
261
- * `single-story-confirm-merge.js` CLI. Homing it anywhere else re-opens the
262
- * surface divergence this module exists to close.
263
- *
264
- * Idempotent by construction: `releaseStoryLease` no-ops when the resolved
265
- * operator is no longer the recorded owner, so a re-run (or the belated
266
- * manual confirm that backfills an already-`agent::done` Story) reports the
267
- * no-op reason rather than yanking a claim someone else has since taken.
268
- *
269
- * A `released: false` no-op is **not** a step failure: an already-released
270
- * ticket is the desired end state, and reporting it as `false` would train
271
- * readers to ignore the field. Only a throw — an unreachable API, an
272
- * unresolvable operator identity — degrades the step, and like every tail
273
- * step that degrades the report, never the land.
189
+ * Release the lease only once the merge is confirmed: the claim is the
190
+ * ticket's record of who owns in-flight work. Idempotent (no-ops for a
191
+ * non-owner); a `released: false` no-op is success, only a throw degrades.
274
192
  */
275
193
  async function stepLeaseRelease({
276
194
  storyId,
@@ -292,26 +210,13 @@ async function stepLeaseRelease({
292
210
  };
293
211
  }
294
212
 
295
- /**
296
- * The whole-repository sweep an operator runs when the automatic reap could
297
- * not finish its job. Named in the warning itself so the next step is in the
298
- * message rather than in a runbook nobody opens mid-incident.
299
- */
213
+ /** Named in the reap warning so the remedy is in the message. */
300
214
  const REAP_SWEEP_REMEDY = 'node .agents/scripts/prune-plan-run-labels.js';
301
215
 
302
216
  /**
303
- * Roll the closing Story's container Epic up from its children (Story #5205).
304
- *
305
- * Wired here for the same reason the cohort-label reap is: this is the only
306
- * seam both a single- and a multi-Story run reach. The run epilogue that used
307
- * to own the Epic close runs at N>1 only, so a container whose last open
308
- * child was one Story stayed open forever.
309
- *
310
- * Unlike the reap, the outcome IS reported in the returned `tail`. The
311
- * distinction is what an operator can act on: a stale cohort label is read by
312
- * nothing, whereas an Epic left open or showing the wrong column is a visible
313
- * board state someone will otherwise correct by hand, so a false here earns
314
- * its line in the envelope.
217
+ * Roll up the container Epic; here because only this seam fires for both
218
+ * single- and multi-Story runs. Reported in `tail` (unlike the label reap):
219
+ * a wrong Epic state is visible and actionable.
315
220
  *
316
221
  * @returns {Promise<{ ok: boolean, detail: string|null }>}
317
222
  */
@@ -339,28 +244,9 @@ async function stepEpicRollup({
339
244
  }
340
245
 
341
246
  /**
342
- * Reap the cohort labels the closing Story carried (Story #5189).
343
- *
344
- * This seam is chosen deliberately. It is the only one that fires for both
345
- * single- and multi-Story runs: the multi-Story run epilogue is keyed on a
346
- * synthesized ad-hoc id, never sees the cohort label, and reports
347
- * `applicable: false` at N=1 — which is the planning default, so wiring the
348
- * reap there would leave the common case unreaped forever.
349
- *
350
- * Best-effort in the strongest sense the tail offers: the outcome is
351
- * deliberately NOT reported in the returned `tail` envelope. A per-step
352
- * boolean is the right shape for a step whose failure degrades the *report of
353
- * the land* — a missed follow-up, an unresynced status column. Label
354
- * vocabulary hygiene is not that: nothing downstream reads a cohort label as
355
- * an input, so a failed reap costs one stale label. Surfacing it in the
356
- * envelope would make a close whose label read flaked terminate differently
357
- * from one where no label was reapable, for no difference an operator can act
358
- * on. The failure is named in a warning instead, and the whole-repository
359
- * sweep (`node .agents/scripts/prune-plan-run-labels.js`) collects whatever
360
- * the automatic path misses.
361
- *
362
- * Never reaps a zero-issue label: that shape is indistinguishable from a label
363
- * an in-flight persist has just minted, so the opt-in stays off here.
247
+ * Reap the Story's cohort labels (the run epilogue never sees them). Not
248
+ * reported in `tail`: nothing reads a cohort label, so a failure only warns.
249
+ * Never reaps a zero-issue label — it may be one a persist just minted.
364
250
  */
365
251
  async function stepPlanRunLabelReap({
366
252
  storyId,
@@ -396,26 +282,11 @@ async function stepPlanRunLabelReap({
396
282
  }
397
283
 
398
284
  /**
399
- * Run the whole post-land tail. Never throws.
400
- *
401
- * Steps run **sequentially** and in this order deliberately: follow-up
402
- * capture and the status resync touch GitHub, while the ref reap and the
403
- * fast-forward mutate the local checkout — and the fast-forward must run
404
- * after the ref reap so `git branch -D` is not fighting a checkout that just
405
- * moved HEAD.
406
- *
407
- * **Cross-process serialization (Story #4622).** The two local-checkout
408
- * mutations — `stepRefCleanup` (`git branch -D`) and `stepBaseFastForward`
409
- * (fast-forward `baseBranch`) — run inside a best-effort cross-process lock
410
- * keyed on the main checkout. Under concurrent delivery (multiple
411
- * story-workers closing against one shared checkout + per-Story worktrees),
412
- * an unserialized tail races on the `main` ref and the worktree registry —
413
- * the `refCleanup:false` ("used by worktree") / `baseFastForward:false`
414
- * ("not-fast-forward") signature reported in swarm-os friction #579. The
415
- * GitHub-touching steps stay OUTSIDE the lock so a contended checkout never
416
- * delays them. The lock is never load-bearing: on sustained contention the
417
- * bounded wait expires and the mutations run anyway (proceeding is the same
418
- * best-effort contract every tail step already has).
285
+ * Run the post-land tail, sequentially. The ref reap and fast-forward (the
286
+ * local-checkout mutations, reap first) run under a cross-process lock on the
287
+ * main checkout, since concurrent closes race on the base ref and worktree
288
+ * registry; GitHub steps stay outside it. The lock is best-effort: on
289
+ * timeout the mutations run anyway.
419
290
  *
420
291
  * @param {object} args
421
292
  * @param {number} args.storyId
@@ -425,18 +296,18 @@ async function stepPlanRunLabelReap({
425
296
  * @param {object} args.provider
426
297
  * @param {object} [args.config]
427
298
  * @param {(tag: string, msg: string) => void} [args.progress]
428
- * @param {Function} [args.captureStoryFollowUpsFn] Test seam.
429
- * @param {Function} [args.emitCloseRecoveredFrictionFn] Test seam.
430
- * @param {Function} [args.emitRecoveredFrictionMarkerFn] Test seam.
431
- * @param {Function} [args.reassertStatusColumnFn] Test seam.
432
- * @param {Function} [args.gitSpawnFn] Test seam.
433
- * @param {Function} [args.planFastForwardFn] Test seam.
434
- * @param {Function} [args.executeFastForwardFn] Test seam.
435
- * @param {Function} [args.acquireLockWithWaitFn] Test seam.
436
- * @param {Function} [args.purgeStoryTempArtifactsFn] Test seam.
437
- * @param {Function} [args.releaseStoryLeaseFn] Test seam.
438
- * @param {Function} [args.reapPlanRunLabelsForStoryFn] Test seam.
439
- * @param {Function} [args.rollUpEpicForStoryFn] Test seam.
299
+ * @param {Function} [args.captureStoryFollowUpsFn]
300
+ * @param {Function} [args.emitCloseRecoveredFrictionFn]
301
+ * @param {Function} [args.emitRecoveredFrictionMarkerFn]
302
+ * @param {Function} [args.reassertStatusColumnFn]
303
+ * @param {Function} [args.gitSpawnFn]
304
+ * @param {Function} [args.planFastForwardFn]
305
+ * @param {Function} [args.executeFastForwardFn]
306
+ * @param {Function} [args.acquireLockWithWaitFn]
307
+ * @param {Function} [args.purgeStoryTempArtifactsFn]
308
+ * @param {Function} [args.releaseStoryLeaseFn]
309
+ * @param {Function} [args.reapPlanRunLabelsForStoryFn]
310
+ * @param {Function} [args.rollUpEpicForStoryFn]
440
311
  * @returns {Promise<{ followUps: boolean, statusResync: boolean, refCleanup: boolean, baseFastForward: boolean, tempPurge: boolean, leaseRelease: boolean, epicRollup: boolean, details: Record<string, string|null> }>}
441
312
  */
442
313
  export async function runPostLandTail({
@@ -462,20 +333,9 @@ export async function runPostLandTail({
462
333
  }) {
463
334
  progress?.('POST-LAND', `🧾 Running land tail for Story #${storyId}...`);
464
335
 
465
- // The close landed, so every friction incident on this Story's stream is
466
- // provably resolved. Emit the recovery markers BEFORE follow-up capture
467
- // reads the stream: the `landed` terminal envelope is emitted after this
468
- // whole tail, so a marker written there would arrive too late to net
469
- // anything out of the very run that produced the incident. Each emit is
470
- // conditional on an un-recovered record already present, so a Story that
471
- // never hit the incident gets no spurious (and bucket-suppressing) row.
472
- // - `close-failed` — Story #4649.
473
- // - `story-blocked` — a Story that blocked then reached
474
- // `agent::done` (Story #4654); resolves the occurrence-1 force-file.
475
- // - `merge-wait-exhausted` — a merge that spent its whole budget and
476
- // landed on a later resume (Story #4654); the residual case the
477
- // `frictionForTerminal` budget guard cannot suppress at the source.
478
- // Best-effort and never throws, exactly like every other tail step.
336
+ // The land resolves this Story's friction incidents. Mark them recovered
337
+ // BEFORE follow-up capture reads the stream; each emit fires only over an
338
+ // un-recovered record, so no spurious rows.
479
339
  await emitCloseRecoveredFrictionFn({ storyId, config });
480
340
  await emitRecoveredFrictionMarkerFn({
481
341
  storyId,
@@ -511,9 +371,6 @@ export async function runPostLandTail({
511
371
  }),
512
372
  { name: 'status-column resync', progress },
513
373
  );
514
- // Story #5189 — the cohort label's end of life. Runs with the other
515
- // GitHub-touching steps (outside the checkout lock) and contributes nothing
516
- // to `tail`; see `stepPlanRunLabelReap` for why that omission is the point.
517
374
  await step(
518
375
  () =>
519
376
  stepPlanRunLabelReap({
@@ -525,9 +382,6 @@ export async function runPostLandTail({
525
382
  { name: 'plan-run label reap', progress },
526
383
  );
527
384
 
528
- // Story #5205 — the container Epic's state is derived from its children, so
529
- // the child reaching `agent::done` is the edge that can close it. Runs with
530
- // the other GitHub-touching steps, outside the checkout lock.
531
385
  const epicRollup = await step(
532
386
  () =>
533
387
  stepEpicRollup({
@@ -540,8 +394,6 @@ export async function runPostLandTail({
540
394
  { name: 'epic rollup', progress },
541
395
  );
542
396
 
543
- // Local-checkout mutations: serialized behind a best-effort cross-process
544
- // lock (Story #4622). Acquire once, run both steps, release in `finally`.
545
397
  const lockCfg = config?.delivery?.postLandLock ?? {};
546
398
  const lock = await acquireLockWithWaitFn({
547
399
  lockPath: postLandLockPath(cwd),
@@ -551,9 +403,6 @@ export async function runPostLandTail({
551
403
  ownerId: `post-land-${storyId}`,
552
404
  });
553
405
  if (!lock.acquired) {
554
- // Never load-bearing: proceed anyway. The bounded wait already gave the
555
- // concurrent holder its window; blocking the land on a lock we could not
556
- // take would turn a best-effort damper into a false negative.
557
406
  progress?.(
558
407
  'POST-LAND',
559
408
  `⚠️ post-land lock not acquired (${lock.reason}); proceeding unserialized.`,
@@ -581,18 +430,12 @@ export async function runPostLandTail({
581
430
  if (lock.acquired) lock.release();
582
431
  }
583
432
 
584
- // Story #4794 — the merge is confirmed, so this Story's gate transcripts and
585
- // validation evidence are spent. Runs LAST so a purge can never race a step
586
- // that still reads them, and outside the checkout lock because it touches
587
- // only the temp tree. Its `signals.ndjson` survives by construction.
433
+ // After every step that reads the temp artifacts; `signals.ndjson` survives.
588
434
  const tempPurge = await step(
589
435
  () => stepTempPurge({ storyId, config, purgeStoryTempArtifactsFn }),
590
436
  { name: 'temp purge', progress },
591
437
  );
592
438
 
593
- // Story #4860 — the merge is confirmed, so the operator's claim on this
594
- // Story has finally done its job. Released here rather than at PR creation
595
- // so the ticket stays assigned for the whole time its PR is open.
596
439
  const leaseRelease = await step(
597
440
  () =>
598
441
  stepLeaseRelease({