mandrel 2.60.0 → 2.61.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (661) hide show
  1. package/.agents/README.md +10 -10
  2. package/.agents/agents/story-worker.md +1 -1
  3. package/.agents/docs/agentrc-reference.json +4 -82
  4. package/.agents/docs/configuration.md +20 -87
  5. package/.agents/docs/workflows.md +1 -1
  6. package/.agents/instructions.md +1 -3
  7. package/.agents/rules/gherkin-standards.md +4 -0
  8. package/.agents/schemas/agentrc.schema.json +11 -486
  9. package/.agents/schemas/story-deliver-terminal.schema.json +10 -0
  10. package/.agents/schemas/validation-evidence.schema.json +2 -1
  11. package/.agents/scripts/README.md +14 -14
  12. package/.agents/scripts/acceptance-eval.js +32 -164
  13. package/.agents/scripts/agents-bootstrap-github.js +27 -129
  14. package/.agents/scripts/apply-quality-bootstrap.js +4 -40
  15. package/.agents/scripts/audit-baselines.js +6 -27
  16. package/.agents/scripts/audit-labels-bootstrap.js +5 -29
  17. package/.agents/scripts/audit-to-stories.js +91 -361
  18. package/.agents/scripts/boot-sweep.js +19 -72
  19. package/.agents/scripts/bootstrap.js +74 -395
  20. package/.agents/scripts/ceremony-derive.js +9 -45
  21. package/.agents/scripts/check-arch-cycles.js +14 -64
  22. package/.agents/scripts/check-baselines.js +8 -48
  23. package/.agents/scripts/check-context-budget.js +46 -172
  24. package/.agents/scripts/check-cyclomatic.js +12 -44
  25. package/.agents/scripts/check-dead-exports.js +13 -64
  26. package/.agents/scripts/check-doc-links.js +38 -186
  27. package/.agents/scripts/check-gherkin-corpus.js +24 -127
  28. package/.agents/scripts/check-test-temp-hygiene.js +28 -169
  29. package/.agents/scripts/coverage-capture.js +32 -99
  30. package/.agents/scripts/deliver-light.js +14 -101
  31. package/.agents/scripts/deliver-recover.js +6 -42
  32. package/.agents/scripts/deliver-run.js +36 -133
  33. package/.agents/scripts/diagnose-friction.js +24 -116
  34. package/.agents/scripts/drain-pending-cleanup.js +1 -1
  35. package/.agents/scripts/evidence-gate.js +23 -85
  36. package/.agents/scripts/file-ci-gap.js +10 -50
  37. package/.agents/scripts/generate-config-docs.js +30 -170
  38. package/.agents/scripts/generate-lens-checklists.js +8 -52
  39. package/.agents/scripts/generate-skills-index.js +14 -112
  40. package/.agents/scripts/generate-workflows-doc.js +10 -70
  41. package/.agents/scripts/git-cleanup.js +2 -34
  42. package/.agents/scripts/lib/Graph.js +24 -81
  43. package/.agents/scripts/lib/ITicketingProvider.js +47 -143
  44. package/.agents/scripts/lib/Logger.js +14 -76
  45. package/.agents/scripts/lib/audit-baselines/engine.js +11 -31
  46. package/.agents/scripts/lib/audit-baselines/gate-surface.js +3 -17
  47. package/.agents/scripts/lib/audit-baselines/headroom.js +4 -20
  48. package/.agents/scripts/lib/audit-baselines/hotspots.js +3 -15
  49. package/.agents/scripts/lib/audit-baselines/kinds.js +23 -89
  50. package/.agents/scripts/lib/audit-baselines/outliers.js +6 -23
  51. package/.agents/scripts/lib/audit-baselines/read.js +3 -16
  52. package/.agents/scripts/lib/audit-baselines/staleness.js +7 -26
  53. package/.agents/scripts/lib/audit-baselines/surface-entry.js +7 -28
  54. package/.agents/scripts/lib/audit-baselines/trend.js +7 -20
  55. package/.agents/scripts/lib/audit-baselines/weights.js +9 -37
  56. package/.agents/scripts/lib/audit-suite/audit-rules-reader.js +3 -18
  57. package/.agents/scripts/lib/audit-suite/checklist-threading.js +26 -124
  58. package/.agents/scripts/lib/audit-suite/dispatch-checklist.js +14 -45
  59. package/.agents/scripts/lib/audit-suite/findings.js +12 -52
  60. package/.agents/scripts/lib/audit-suite/frontmatter.js +5 -29
  61. package/.agents/scripts/lib/audit-suite/index.js +1 -15
  62. package/.agents/scripts/lib/audit-suite/lens-checklist.js +10 -45
  63. package/.agents/scripts/lib/audit-suite/lens-diff-floor.js +11 -76
  64. package/.agents/scripts/lib/audit-suite/runner.js +13 -43
  65. package/.agents/scripts/lib/audit-suite/selector.js +49 -349
  66. package/.agents/scripts/lib/audit-suite/substitutions.js +12 -40
  67. package/.agents/scripts/lib/audit-suite/workflow-loader.js +3 -15
  68. package/.agents/scripts/lib/audit-to-stories/audit-label-taxonomy.js +11 -73
  69. package/.agents/scripts/lib/audit-to-stories/audit-lenses.js +8 -37
  70. package/.agents/scripts/lib/audit-to-stories/build-story-body.js +25 -143
  71. package/.agents/scripts/lib/audit-to-stories/dedupe-against-github.js +14 -80
  72. package/.agents/scripts/lib/audit-to-stories/epic-grouping-directive.js +4 -18
  73. package/.agents/scripts/lib/audit-to-stories/finding-adapter.js +7 -40
  74. package/.agents/scripts/lib/audit-to-stories/group-findings.js +9 -39
  75. package/.agents/scripts/lib/audit-to-stories/issue-corpus.js +10 -66
  76. package/.agents/scripts/lib/audit-to-stories/issue-index.js +6 -30
  77. package/.agents/scripts/lib/audit-to-stories/issues-file.js +6 -36
  78. package/.agents/scripts/lib/audit-to-stories/ledger-commit.js +17 -69
  79. package/.agents/scripts/lib/audit-to-stories/ledger-pr.js +17 -85
  80. package/.agents/scripts/lib/audit-to-stories/ledger-record.js +10 -48
  81. package/.agents/scripts/lib/audit-to-stories/parse-audit-md.js +38 -146
  82. package/.agents/scripts/lib/audit-to-stories/seed-from-findings.js +7 -42
  83. package/.agents/scripts/lib/audit-to-stories/wire-dependencies.js +10 -57
  84. package/.agents/scripts/lib/baseline-loader.js +12 -51
  85. package/.agents/scripts/lib/baseline-schema-registry.js +5 -22
  86. package/.agents/scripts/lib/baselines/component-matcher.js +3 -12
  87. package/.agents/scripts/lib/baselines/components.js +10 -61
  88. package/.agents/scripts/lib/baselines/coverage-updater-cli.js +7 -36
  89. package/.agents/scripts/lib/baselines/crap-preview-incremental.js +5 -21
  90. package/.agents/scripts/lib/baselines/crap-preview-scan.js +19 -45
  91. package/.agents/scripts/lib/baselines/crap-updater-cli.js +16 -65
  92. package/.agents/scripts/lib/baselines/diff-scope-cli.js +5 -33
  93. package/.agents/scripts/lib/baselines/duplication-scanner.js +11 -60
  94. package/.agents/scripts/lib/baselines/env-overrides.js +12 -67
  95. package/.agents/scripts/lib/baselines/envelope.js +13 -129
  96. package/.agents/scripts/lib/baselines/exit-codes.js +6 -49
  97. package/.agents/scripts/lib/baselines/git-base.js +23 -142
  98. package/.agents/scripts/lib/baselines/kernel.js +11 -111
  99. package/.agents/scripts/lib/baselines/kinds/_crap-new-method-gate.js +9 -47
  100. package/.agents/scripts/lib/baselines/kinds/_crap-read.js +8 -51
  101. package/.agents/scripts/lib/baselines/kinds/_shared-metric.js +7 -62
  102. package/.agents/scripts/lib/baselines/kinds/bundle-size.js +8 -29
  103. package/.agents/scripts/lib/baselines/kinds/coverage.js +3 -15
  104. package/.agents/scripts/lib/baselines/kinds/crap.js +94 -415
  105. package/.agents/scripts/lib/baselines/kinds/duplication.js +4 -30
  106. package/.agents/scripts/lib/baselines/kinds/kind-factory.js +7 -53
  107. package/.agents/scripts/lib/baselines/kinds/maintainability.js +15 -80
  108. package/.agents/scripts/lib/baselines/kinds/mutation.js +12 -72
  109. package/.agents/scripts/lib/baselines/maintainability-baseline-io.js +4 -11
  110. package/.agents/scripts/lib/baselines/merge-envelopes.js +30 -146
  111. package/.agents/scripts/lib/baselines/path-canon.js +19 -128
  112. package/.agents/scripts/lib/baselines/preview-gates.js +8 -37
  113. package/.agents/scripts/lib/baselines/reader.js +14 -107
  114. package/.agents/scripts/lib/baselines/refresh-service.js +35 -252
  115. package/.agents/scripts/lib/baselines/scope.js +11 -135
  116. package/.agents/scripts/lib/baselines/writer.js +16 -149
  117. package/.agents/scripts/lib/bdd-runner-detect.js +18 -113
  118. package/.agents/scripts/lib/bdd-scenario-budget.js +9 -36
  119. package/.agents/scripts/lib/bdd-scenario-scanner.js +11 -73
  120. package/.agents/scripts/lib/bdd-step-index.js +26 -100
  121. package/.agents/scripts/lib/bootstrap/baseline-merge-driver.js +23 -103
  122. package/.agents/scripts/lib/bootstrap/branch-protection.js +2 -5
  123. package/.agents/scripts/lib/bootstrap/commit-push.js +12 -50
  124. package/.agents/scripts/lib/bootstrap/gh-preflight.js +14 -101
  125. package/.agents/scripts/lib/bootstrap/hitl-confirm.js +5 -30
  126. package/.agents/scripts/lib/bootstrap/install-ledger.js +17 -73
  127. package/.agents/scripts/lib/bootstrap/issue-forms-template.js +17 -121
  128. package/.agents/scripts/lib/bootstrap/manifest.js +15 -86
  129. package/.agents/scripts/lib/bootstrap/merge-methods.js +4 -33
  130. package/.agents/scripts/lib/bootstrap/preflight.js +12 -61
  131. package/.agents/scripts/lib/bootstrap/project-bootstrap.js +34 -235
  132. package/.agents/scripts/lib/bootstrap/prompt.js +21 -129
  133. package/.agents/scripts/lib/bootstrap/quality-bootstrap.js +27 -141
  134. package/.agents/scripts/lib/bootstrap/summary.js +1 -8
  135. package/.agents/scripts/lib/bootstrap/workflow-audit.js +11 -84
  136. package/.agents/scripts/lib/branch-name-guard.js +4 -23
  137. package/.agents/scripts/lib/changed-files.js +31 -143
  138. package/.agents/scripts/lib/checks/core-bare-clean.js +4 -24
  139. package/.agents/scripts/lib/checks/index.js +18 -101
  140. package/.agents/scripts/lib/checks/loop-health.js +11 -53
  141. package/.agents/scripts/lib/checks/state.js +16 -91
  142. package/.agents/scripts/lib/checks/story-init-not-backgrounded.js +10 -61
  143. package/.agents/scripts/lib/checks/subagent-agent-tool-required.js +14 -83
  144. package/.agents/scripts/lib/child-exec.js +39 -108
  145. package/.agents/scripts/lib/cli/standard-args.js +9 -116
  146. package/.agents/scripts/lib/cli-args.js +31 -146
  147. package/.agents/scripts/lib/cli-usage.js +5 -27
  148. package/.agents/scripts/lib/cli-utils.js +2 -12
  149. package/.agents/scripts/lib/close-validation/commands.js +13 -76
  150. package/.agents/scripts/lib/close-validation/gates.js +92 -331
  151. package/.agents/scripts/lib/close-validation/process.js +121 -151
  152. package/.agents/scripts/lib/close-validation/projections/advisories.js +5 -31
  153. package/.agents/scripts/lib/close-validation/projections/crap.js +19 -67
  154. package/.agents/scripts/lib/close-validation/projections/head-sha.js +1 -17
  155. package/.agents/scripts/lib/close-validation/projections/inputs.js +4 -34
  156. package/.agents/scripts/lib/close-validation/projections/maintainability.js +11 -58
  157. package/.agents/scripts/lib/close-validation/runner.js +53 -110
  158. package/.agents/scripts/lib/command-header.js +6 -28
  159. package/.agents/scripts/lib/config/acceptance-eval.js +4 -30
  160. package/.agents/scripts/lib/config/baselines.js +3 -14
  161. package/.agents/scripts/lib/config/ci.js +8 -38
  162. package/.agents/scripts/lib/config/commands.js +1 -15
  163. package/.agents/scripts/lib/config/defaults.js +4 -33
  164. package/.agents/scripts/lib/config/delivery-routing.js +6 -35
  165. package/.agents/scripts/lib/config/explain.js +9 -80
  166. package/.agents/scripts/lib/config/gates/coverage.schema.js +0 -12
  167. package/.agents/scripts/lib/config/gates/crap-incremental-coverage.schema.js +2 -30
  168. package/.agents/scripts/lib/config/gates/crap.schema.js +1 -34
  169. package/.agents/scripts/lib/config/gates/duplication.schema.js +1 -8
  170. package/.agents/scripts/lib/config/gates/index.js +2 -17
  171. package/.agents/scripts/lib/config/gates/maintainability.schema.js +1 -20
  172. package/.agents/scripts/lib/config/gates/mutation.schema.js +1 -7
  173. package/.agents/scripts/lib/config/gates/shared.js +4 -64
  174. package/.agents/scripts/lib/config/github.js +4 -22
  175. package/.agents/scripts/lib/config/limits.js +4 -57
  176. package/.agents/scripts/lib/config/paths.js +2 -21
  177. package/.agents/scripts/lib/config/qa.js +4 -38
  178. package/.agents/scripts/lib/config/quality.js +76 -432
  179. package/.agents/scripts/lib/config/runners.js +12 -56
  180. package/.agents/scripts/lib/config/runtime.js +13 -57
  181. package/.agents/scripts/lib/config/shared.js +2 -16
  182. package/.agents/scripts/lib/config/sync-agentrc.js +9 -50
  183. package/.agents/scripts/lib/config/temp-paths.js +40 -280
  184. package/.agents/scripts/lib/config/validate-orchestration.js +5 -17
  185. package/.agents/scripts/lib/config/worktree-isolation.js +9 -28
  186. package/.agents/scripts/lib/config-resolver.js +10 -52
  187. package/.agents/scripts/lib/config-schema-shared.js +1 -4
  188. package/.agents/scripts/lib/config-settings-schema-delivery.js +12 -294
  189. package/.agents/scripts/lib/config-settings-schema-quality.js +7 -219
  190. package/.agents/scripts/lib/config-settings-schema.js +37 -274
  191. package/.agents/scripts/lib/coverage-baseline.js +20 -110
  192. package/.agents/scripts/lib/coverage-capture-fullscope.js +12 -37
  193. package/.agents/scripts/lib/coverage-capture-incremental.js +12 -43
  194. package/.agents/scripts/lib/coverage-capture-usage.js +4 -24
  195. package/.agents/scripts/lib/coverage-capture.js +99 -224
  196. package/.agents/scripts/lib/coverage-utils.js +14 -79
  197. package/.agents/scripts/lib/cpu-pool.js +17 -123
  198. package/.agents/scripts/lib/crap-baseline-join.js +16 -88
  199. package/.agents/scripts/lib/crap-coordinates.js +6 -25
  200. package/.agents/scripts/lib/crap-engine.js +40 -153
  201. package/.agents/scripts/lib/crap-method-identity.js +16 -78
  202. package/.agents/scripts/lib/crap-utils.js +31 -155
  203. package/.agents/scripts/lib/cyclomatic-ceiling.js +14 -87
  204. package/.agents/scripts/lib/cyclomatic-scope.js +10 -50
  205. package/.agents/scripts/lib/dead-exports-knip.js +18 -56
  206. package/.agents/scripts/lib/dead-exports-mode.js +5 -24
  207. package/.agents/scripts/lib/degraded-mode.js +3 -26
  208. package/.agents/scripts/lib/dependency-parser.js +8 -40
  209. package/.agents/scripts/lib/dependency-version.js +13 -35
  210. package/.agents/scripts/lib/detect-package-manager.js +6 -36
  211. package/.agents/scripts/lib/doc-tiers.js +22 -126
  212. package/.agents/scripts/lib/duplicate-search.js +8 -72
  213. package/.agents/scripts/lib/env-loader.js +5 -27
  214. package/.agents/scripts/lib/error-redactor.js +6 -31
  215. package/.agents/scripts/lib/errors/index.js +2 -22
  216. package/.agents/scripts/lib/escomplex-ast-compat.js +22 -163
  217. package/.agents/scripts/lib/escomplex-kernel.js +21 -123
  218. package/.agents/scripts/lib/feedback-loop/graduator-core.js +93 -419
  219. package/.agents/scripts/lib/feedback-loop/prior-feedback-fetcher.js +20 -98
  220. package/.agents/scripts/lib/feedback-loop/retro-proposals-graduator.js +27 -151
  221. package/.agents/scripts/lib/findings/audit-ledger.js +23 -97
  222. package/.agents/scripts/lib/findings/classify-finding.js +14 -69
  223. package/.agents/scripts/lib/findings/promote-finding.js +14 -112
  224. package/.agents/scripts/lib/findings/provenance-field.js +11 -52
  225. package/.agents/scripts/lib/findings/route-finding.js +37 -255
  226. package/.agents/scripts/lib/findings/semantic-issue-search.js +14 -59
  227. package/.agents/scripts/lib/findings/severity.js +18 -104
  228. package/.agents/scripts/lib/format-generated-json.js +12 -44
  229. package/.agents/scripts/lib/full-suite-lock.js +160 -429
  230. package/.agents/scripts/lib/full-suite-queue.js +213 -0
  231. package/.agents/scripts/lib/gates/baseline-store.js +5 -9
  232. package/.agents/scripts/lib/gates/friction.js +1 -3
  233. package/.agents/scripts/lib/generated/agentrc-validator.js +2 -2
  234. package/.agents/scripts/lib/gh-exec.js +31 -259
  235. package/.agents/scripts/lib/git/cached-fetch.js +9 -52
  236. package/.agents/scripts/lib/git/sync-from-base.js +15 -107
  237. package/.agents/scripts/lib/git-branch-cleanup.js +14 -61
  238. package/.agents/scripts/lib/git-branch-lifecycle.js +16 -87
  239. package/.agents/scripts/lib/git-utils.js +37 -161
  240. package/.agents/scripts/lib/github/framework-repo.js +8 -71
  241. package/.agents/scripts/lib/github-url.js +2 -17
  242. package/.agents/scripts/lib/import-graph.js +11 -38
  243. package/.agents/scripts/lib/install-cmd-parser.js +4 -13
  244. package/.agents/scripts/lib/json-utils.js +3 -18
  245. package/.agents/scripts/lib/label-constants.js +16 -111
  246. package/.agents/scripts/lib/label-taxonomy.js +4 -30
  247. package/.agents/scripts/lib/maintainability-engine.js +12 -80
  248. package/.agents/scripts/lib/maintainability-unscorable.js +5 -25
  249. package/.agents/scripts/lib/maintainability-utils.js +16 -92
  250. package/.agents/scripts/lib/mandrel-catalog.js +12 -70
  251. package/.agents/scripts/lib/notifications/notifier.js +13 -38
  252. package/.agents/scripts/lib/npm-scripts.js +4 -23
  253. package/.agents/scripts/lib/observability/metrics-ledger.js +16 -76
  254. package/.agents/scripts/lib/observability/runtime-friction.js +44 -286
  255. package/.agents/scripts/lib/observability/signal-validator.js +5 -37
  256. package/.agents/scripts/lib/observability/signals-writer.js +11 -121
  257. package/.agents/scripts/lib/observability/source-classifier.js +21 -203
  258. package/.agents/scripts/lib/observability/terse-result.js +14 -47
  259. package/.agents/scripts/lib/onboard/init-tail.js +13 -74
  260. package/.agents/scripts/lib/onboard/scaffold-docs.js +11 -34
  261. package/.agents/scripts/lib/orchestration/acceptance-eval-decision.js +25 -139
  262. package/.agents/scripts/lib/orchestration/auto-merge-cwd.js +11 -66
  263. package/.agents/scripts/lib/orchestration/behind-recovery.js +10 -55
  264. package/.agents/scripts/lib/orchestration/ceremony-routing.js +5 -75
  265. package/.agents/scripts/lib/orchestration/change-set.js +7 -36
  266. package/.agents/scripts/lib/orchestration/check-baselines/phases/compare.js +9 -46
  267. package/.agents/scripts/lib/orchestration/check-baselines/phases/evaluate.js +11 -44
  268. package/.agents/scripts/lib/orchestration/check-baselines/phases/floors.js +5 -24
  269. package/.agents/scripts/lib/orchestration/check-baselines/phases/friction.js +3 -12
  270. package/.agents/scripts/lib/orchestration/check-baselines/phases/parse-args.js +5 -38
  271. package/.agents/scripts/lib/orchestration/check-baselines/phases/pipeline.js +3 -8
  272. package/.agents/scripts/lib/orchestration/check-baselines/phases/refresh-ack.js +28 -136
  273. package/.agents/scripts/lib/orchestration/check-baselines/phases/report.js +3 -13
  274. package/.agents/scripts/lib/orchestration/check-state.js +92 -0
  275. package/.agents/scripts/lib/orchestration/ci-gap-intake.js +37 -144
  276. package/.agents/scripts/lib/orchestration/ci-rerun-guard.js +42 -189
  277. package/.agents/scripts/lib/orchestration/code-review.js +24 -128
  278. package/.agents/scripts/lib/orchestration/column-sync.js +23 -111
  279. package/.agents/scripts/lib/orchestration/complexity-gate.js +42 -214
  280. package/.agents/scripts/lib/orchestration/deliver-recover.js +36 -168
  281. package/.agents/scripts/lib/orchestration/dependency-analyzer.js +4 -35
  282. package/.agents/scripts/lib/orchestration/dependency-candidates.js +9 -41
  283. package/.agents/scripts/lib/orchestration/diff-magnitude.js +25 -115
  284. package/.agents/scripts/lib/orchestration/doc-reader.js +2 -6
  285. package/.agents/scripts/lib/orchestration/docs-digest.js +13 -51
  286. package/.agents/scripts/lib/orchestration/epic-candidates.js +13 -53
  287. package/.agents/scripts/lib/orchestration/epic-checklist.js +9 -33
  288. package/.agents/scripts/lib/orchestration/epic-container.js +41 -167
  289. package/.agents/scripts/lib/orchestration/epic-expansion.js +10 -40
  290. package/.agents/scripts/lib/orchestration/epic-rollup.js +55 -207
  291. package/.agents/scripts/lib/orchestration/file-assumption-enum.js +2 -22
  292. package/.agents/scripts/lib/orchestration/file-assumptions.js +45 -253
  293. package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-detect.js +9 -46
  294. package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-reap.js +7 -57
  295. package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches.js +21 -126
  296. package/.agents/scripts/lib/orchestration/git-cleanup/phases/cli.js +2 -6
  297. package/.agents/scripts/lib/orchestration/git-cleanup/phases/fast-forward.js +1 -4
  298. package/.agents/scripts/lib/orchestration/git-cleanup/phases/filters.js +1 -5
  299. package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes-ff.js +9 -34
  300. package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes.js +41 -190
  301. package/.agents/scripts/lib/orchestration/git-cleanup/phases/merged-tip.js +9 -45
  302. package/.agents/scripts/lib/orchestration/git-cleanup/phases/parse-args.js +1 -4
  303. package/.agents/scripts/lib/orchestration/git-cleanup/phases/phase-drivers.js +19 -85
  304. package/.agents/scripts/lib/orchestration/git-cleanup/phases/prompts.js +3 -17
  305. package/.agents/scripts/lib/orchestration/git-cleanup/phases/prune.js +1 -5
  306. package/.agents/scripts/lib/orchestration/git-cleanup/phases/render.js +16 -100
  307. package/.agents/scripts/lib/orchestration/git-cleanup/phases/stashes.js +1 -4
  308. package/.agents/scripts/lib/orchestration/lease-guard-shared.js +16 -67
  309. package/.agents/scripts/lib/orchestration/lifecycle/emit-ledger-event.js +9 -33
  310. package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-flip-failed.js +8 -29
  311. package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-unlanded.js +15 -68
  312. package/.agents/scripts/lib/orchestration/light-backstop.js +11 -49
  313. package/.agents/scripts/lib/orchestration/light-escalation.js +21 -89
  314. package/.agents/scripts/lib/orchestration/light-suitability.js +26 -231
  315. package/.agents/scripts/lib/orchestration/merge-block-class.js +39 -216
  316. package/.agents/scripts/lib/orchestration/merge-poll.js +104 -377
  317. package/.agents/scripts/lib/orchestration/pinned-identifier-lint.js +17 -57
  318. package/.agents/scripts/lib/orchestration/plan-context.js +52 -303
  319. package/.agents/scripts/lib/orchestration/plan-critic-conditions.js +22 -79
  320. package/.agents/scripts/lib/orchestration/plan-critics-evaluate.js +5 -31
  321. package/.agents/scripts/lib/orchestration/plan-metrics.js +29 -108
  322. package/.agents/scripts/lib/orchestration/plan-navigation.js +8 -27
  323. package/.agents/scripts/lib/orchestration/plan-persist/acceptance-handle-repair.js +12 -49
  324. package/.agents/scripts/lib/orchestration/plan-persist/audit-provenance.js +18 -73
  325. package/.agents/scripts/lib/orchestration/plan-persist/changes-repair.js +14 -78
  326. package/.agents/scripts/lib/orchestration/plan-persist/cross-plan-links.js +6 -30
  327. package/.agents/scripts/lib/orchestration/plan-persist/epic-adoption.js +14 -65
  328. package/.agents/scripts/lib/orchestration/plan-persist/epic-ops.js +21 -76
  329. package/.agents/scripts/lib/orchestration/plan-persist/external-deps.js +6 -43
  330. package/.agents/scripts/lib/orchestration/plan-persist/persist-helpers.js +14 -68
  331. package/.agents/scripts/lib/orchestration/plan-persist/plan-context-source.js +9 -41
  332. package/.agents/scripts/lib/orchestration/plan-persist/run-plan-persist.js +49 -248
  333. package/.agents/scripts/lib/orchestration/plan-persist/soft-findings.js +2 -12
  334. package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +85 -368
  335. package/.agents/scripts/lib/orchestration/plan-persist/summary.js +8 -38
  336. package/.agents/scripts/lib/orchestration/plan-persist/supersede-ops.js +30 -190
  337. package/.agents/scripts/lib/orchestration/plan-persist/wave-collision-gate.js +9 -49
  338. package/.agents/scripts/lib/orchestration/plan-persist/wave-serialisation.js +7 -28
  339. package/.agents/scripts/lib/orchestration/plan-reachability.js +13 -42
  340. package/.agents/scripts/lib/orchestration/plan-run-labels/reap.js +16 -91
  341. package/.agents/scripts/lib/orchestration/plan-runner/worktree-sweep.js +16 -54
  342. package/.agents/scripts/lib/orchestration/plan-text-hygiene.js +10 -52
  343. package/.agents/scripts/lib/orchestration/planning/authoring-context.js +14 -109
  344. package/.agents/scripts/lib/orchestration/planning/memory-pool-advisory.js +11 -83
  345. package/.agents/scripts/lib/orchestration/pr-watch.js +48 -306
  346. package/.agents/scripts/lib/orchestration/project-meta-cache.js +15 -80
  347. package/.agents/scripts/lib/orchestration/project-meta-resolver.js +10 -51
  348. package/.agents/scripts/lib/orchestration/reassert-status-column.js +12 -76
  349. package/.agents/scripts/lib/orchestration/remote-verifier.js +12 -36
  350. package/.agents/scripts/lib/orchestration/resolve-stories.js +33 -164
  351. package/.agents/scripts/lib/orchestration/retro-proposals.js +66 -361
  352. package/.agents/scripts/lib/orchestration/review-base-ref.js +9 -43
  353. package/.agents/scripts/lib/orchestration/review-depth.js +12 -94
  354. package/.agents/scripts/lib/orchestration/review-providers/codex.js +10 -111
  355. package/.agents/scripts/lib/orchestration/review-providers/degraded-gates.js +13 -71
  356. package/.agents/scripts/lib/orchestration/review-providers/findings-renderer.js +7 -51
  357. package/.agents/scripts/lib/orchestration/review-providers/mi-exemptions.js +8 -53
  358. package/.agents/scripts/lib/orchestration/review-providers/native.js +30 -214
  359. package/.agents/scripts/lib/orchestration/review-providers/parse-findings.js +7 -52
  360. package/.agents/scripts/lib/orchestration/review-providers/review-depth.js +4 -33
  361. package/.agents/scripts/lib/orchestration/review-providers/review-provider-factory.js +11 -71
  362. package/.agents/scripts/lib/orchestration/review-providers/scoped-lint.js +19 -131
  363. package/.agents/scripts/lib/orchestration/review-providers/security-review.js +6 -89
  364. package/.agents/scripts/lib/orchestration/review-providers/types.js +26 -56
  365. package/.agents/scripts/lib/orchestration/review-providers/ultrareview.js +3 -46
  366. package/.agents/scripts/lib/orchestration/run-epilogue.js +40 -199
  367. package/.agents/scripts/lib/orchestration/run-scoped-config.js +13 -81
  368. package/.agents/scripts/lib/orchestration/single-story-close/close-note.js +7 -34
  369. package/.agents/scripts/lib/orchestration/single-story-close/failed-terminal.js +16 -89
  370. package/.agents/scripts/lib/orchestration/single-story-close/gate-log.js +18 -109
  371. package/.agents/scripts/lib/orchestration/single-story-close/phases/auto-merge.js +83 -239
  372. package/.agents/scripts/lib/orchestration/single-story-close/phases/base-sync.js +18 -80
  373. package/.agents/scripts/lib/orchestration/single-story-close/phases/close-validation.js +103 -97
  374. package/.agents/scripts/lib/orchestration/single-story-close/phases/code-review.js +8 -64
  375. package/.agents/scripts/lib/orchestration/single-story-close/phases/confirm-merge.js +136 -486
  376. package/.agents/scripts/lib/orchestration/single-story-close/phases/conventional-subject.js +30 -134
  377. package/.agents/scripts/lib/orchestration/single-story-close/phases/graphql-preflight.js +9 -50
  378. package/.agents/scripts/lib/orchestration/single-story-close/phases/lock-wait-pending.js +49 -0
  379. package/.agents/scripts/lib/orchestration/single-story-close/phases/normalize-pr-title.js +13 -86
  380. package/.agents/scripts/lib/orchestration/single-story-close/phases/options.js +20 -95
  381. package/.agents/scripts/lib/orchestration/single-story-close/phases/post-land.js +46 -203
  382. package/.agents/scripts/lib/orchestration/single-story-close/phases/pre-gate-steps.js +8 -50
  383. package/.agents/scripts/lib/orchestration/single-story-close/phases/pull-request.js +12 -83
  384. package/.agents/scripts/lib/orchestration/single-story-close/phases/push.js +6 -39
  385. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-block.js +1 -6
  386. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-outcome.js +4 -28
  387. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-override.js +6 -51
  388. package/.agents/scripts/lib/orchestration/single-story-close/phases/worktree-reap.js +6 -34
  389. package/.agents/scripts/lib/orchestration/single-story-close/phases/wrong-tree-guard.js +23 -121
  390. package/.agents/scripts/lib/orchestration/single-story-close/runner.js +110 -290
  391. package/.agents/scripts/lib/orchestration/single-story-lease-guard.js +15 -69
  392. package/.agents/scripts/lib/orchestration/story-body-gate.js +4 -23
  393. package/.agents/scripts/lib/orchestration/story-close/baseline-upward-writeback.js +50 -179
  394. package/.agents/scripts/lib/orchestration/story-close/context-budget-writeback.js +11 -41
  395. package/.agents/scripts/lib/orchestration/story-close/format-autofix.js +23 -311
  396. package/.agents/scripts/lib/orchestration/story-close/phases/local-lens-review.js +22 -147
  397. package/.agents/scripts/lib/orchestration/story-close/phases/review-core.js +16 -67
  398. package/.agents/scripts/lib/orchestration/story-deliver-terminal-schema.js +12 -68
  399. package/.agents/scripts/lib/orchestration/story-deliver-terminal.js +42 -201
  400. package/.agents/scripts/lib/orchestration/story-follow-ups.js +43 -245
  401. package/.agents/scripts/lib/orchestration/story-init-envelope.js +4 -23
  402. package/.agents/scripts/lib/orchestration/story-init-remote.js +2 -6
  403. package/.agents/scripts/lib/orchestration/story-reachability.js +3 -23
  404. package/.agents/scripts/lib/orchestration/task-body-validator.js +12 -126
  405. package/.agents/scripts/lib/orchestration/ticket-lease.js +28 -131
  406. package/.agents/scripts/lib/orchestration/ticket-validator-conflicts.js +15 -149
  407. package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +5 -33
  408. package/.agents/scripts/lib/orchestration/ticket-validator.js +39 -181
  409. package/.agents/scripts/lib/orchestration/ticketing/bulk.js +51 -244
  410. package/.agents/scripts/lib/orchestration/ticketing/reads.js +39 -250
  411. package/.agents/scripts/lib/orchestration/ticketing/state.js +14 -68
  412. package/.agents/scripts/lib/orchestration/ticketing/transition.js +46 -263
  413. package/.agents/scripts/lib/orchestration/ticketing.js +2 -26
  414. package/.agents/scripts/lib/orchestration/verify-credit.js +18 -79
  415. package/.agents/scripts/lib/orchestration/worktree-dirty.js +5 -30
  416. package/.agents/scripts/lib/path-security.js +3 -6
  417. package/.agents/scripts/lib/plan-phase-cleanup.js +9 -49
  418. package/.agents/scripts/lib/preflight-runner.js +13 -69
  419. package/.agents/scripts/lib/process-group.js +143 -0
  420. package/.agents/scripts/lib/project-root.js +2 -8
  421. package/.agents/scripts/lib/provider-factory.js +2 -25
  422. package/.agents/scripts/lib/qa/console-allowlist.js +10 -59
  423. package/.agents/scripts/lib/qa/qa-session.js +15 -69
  424. package/.agents/scripts/lib/qa/redact-evidence.js +18 -129
  425. package/.agents/scripts/lib/qa/resolve-qa-contract.js +26 -135
  426. package/.agents/scripts/lib/qa/resolve-selection.js +16 -84
  427. package/.agents/scripts/lib/reserved-test-ids.js +9 -47
  428. package/.agents/scripts/lib/runtime-deps/dep-resolution.js +13 -53
  429. package/.agents/scripts/lib/runtime-deps/ensure-installed.js +10 -44
  430. package/.agents/scripts/lib/runtime-deps/manifest.js +10 -30
  431. package/.agents/scripts/lib/runtime-deps/parser-major.js +15 -51
  432. package/.agents/scripts/lib/runtime-deps/preflight.js +4 -22
  433. package/.agents/scripts/lib/runtime-deps/scan-imports.js +11 -55
  434. package/.agents/scripts/lib/signals/detectors/common.js +12 -38
  435. package/.agents/scripts/lib/signals/index.js +2 -19
  436. package/.agents/scripts/lib/signals/schema.js +14 -109
  437. package/.agents/scripts/lib/signals/write.js +2 -11
  438. package/.agents/scripts/lib/single-story/confirm-merge.js +31 -72
  439. package/.agents/scripts/lib/single-story/story-merged-notify.js +8 -49
  440. package/.agents/scripts/lib/single-story-sweep/protection-ctx.js +4 -26
  441. package/.agents/scripts/lib/single-story-sweep/protection.js +13 -100
  442. package/.agents/scripts/lib/single-story-sweep/sweep-lock.js +60 -258
  443. package/.agents/scripts/lib/single-story-sweep.js +14 -97
  444. package/.agents/scripts/lib/skills/parse-skill.js +13 -59
  445. package/.agents/scripts/lib/skills/skills-index.js +8 -29
  446. package/.agents/scripts/lib/skills/walk-skill-files.js +17 -78
  447. package/.agents/scripts/lib/source-extensions.js +11 -42
  448. package/.agents/scripts/lib/source-text/strip-js-comments.js +8 -41
  449. package/.agents/scripts/lib/stdio-flush.js +9 -36
  450. package/.agents/scripts/lib/story-adjacency.js +8 -40
  451. package/.agents/scripts/lib/story-body/body-format-lints.js +22 -83
  452. package/.agents/scripts/lib/story-body/footer-block.js +11 -44
  453. package/.agents/scripts/lib/story-body/story-body.js +83 -358
  454. package/.agents/scripts/lib/temp-retention.js +42 -143
  455. package/.agents/scripts/lib/templates/decomposer-prompts.js +11 -65
  456. package/.agents/scripts/lib/test-env.js +12 -65
  457. package/.agents/scripts/lib/test-run-credit.js +10 -65
  458. package/.agents/scripts/lib/test-runner-contract.js +19 -74
  459. package/.agents/scripts/lib/test-temp.js +38 -184
  460. package/.agents/scripts/lib/test-tiers.js +12 -96
  461. package/.agents/scripts/lib/ticket-body-sections.js +21 -96
  462. package/.agents/scripts/lib/transpile.js +15 -74
  463. package/.agents/scripts/lib/util/concurrent-map.js +6 -25
  464. package/.agents/scripts/lib/util/parse-id-list.js +8 -34
  465. package/.agents/scripts/lib/util/poll-loop.js +8 -28
  466. package/.agents/scripts/lib/util/with-timeout.js +2 -11
  467. package/.agents/scripts/lib/validation-evidence.js +21 -96
  468. package/.agents/scripts/lib/wave-runner/footprint.js +17 -70
  469. package/.agents/scripts/lib/wave-runner/live-probe.js +53 -221
  470. package/.agents/scripts/lib/wave-runner/ready-set.js +72 -301
  471. package/.agents/scripts/lib/workers/crap-worker.js +11 -64
  472. package/.agents/scripts/lib/workers/maintainability-report-worker.js +8 -45
  473. package/.agents/scripts/lib/workers/maintainability-worker.js +5 -21
  474. package/.agents/scripts/lib/workers/serve-worker-messages.js +2 -18
  475. package/.agents/scripts/lib/workflow-closure.js +22 -105
  476. package/.agents/scripts/lib/workspace-provisioner.js +16 -54
  477. package/.agents/scripts/lib/worktree/git-hooks.js +15 -60
  478. package/.agents/scripts/lib/worktree/lifecycle/force-drain.js +20 -60
  479. package/.agents/scripts/lib/worktree/lifecycle/merge-reachability.js +10 -62
  480. package/.agents/scripts/lib/worktree/lifecycle/pending-cleanup.js +22 -86
  481. package/.agents/scripts/lib/worktree/lifecycle/reap.js +24 -126
  482. package/.agents/scripts/lib/worktree/lifecycle-manager.js +2 -20
  483. package/.agents/scripts/lib/worktree/node-modules-strategy.js +46 -180
  484. package/.agents/scripts/lib/worktree-manager.js +15 -40
  485. package/.agents/scripts/lint-issue-body.js +12 -68
  486. package/.agents/scripts/mandrel-update-preflight.js +10 -70
  487. package/.agents/scripts/merge-baseline.js +30 -104
  488. package/.agents/scripts/nav-registry-diff.js +22 -108
  489. package/.agents/scripts/notify.js +12 -69
  490. package/.agents/scripts/plan-context.js +27 -111
  491. package/.agents/scripts/plan-critics.js +12 -66
  492. package/.agents/scripts/plan-persist.js +31 -148
  493. package/.agents/scripts/plan-run-epilogue.js +11 -37
  494. package/.agents/scripts/pr-watch-with-update.js +76 -267
  495. package/.agents/scripts/providers/github/auth.js +3 -8
  496. package/.agents/scripts/providers/github/blocked-by-add.js +14 -61
  497. package/.agents/scripts/providers/github/board-add.js +5 -21
  498. package/.agents/scripts/providers/github/branch-protection.js +11 -43
  499. package/.agents/scripts/providers/github/cache.js +2 -14
  500. package/.agents/scripts/providers/github/comments.js +7 -40
  501. package/.agents/scripts/providers/github/compose.js +3 -19
  502. package/.agents/scripts/providers/github/errors.js +22 -125
  503. package/.agents/scripts/providers/github/issues.js +31 -123
  504. package/.agents/scripts/providers/github/labels.js +24 -124
  505. package/.agents/scripts/providers/github/mappers.js +5 -27
  506. package/.agents/scripts/providers/github/merge-methods.js +3 -22
  507. package/.agents/scripts/providers/github/project-board.js +2 -17
  508. package/.agents/scripts/providers/github/projects-v2-graphql.js +3 -6
  509. package/.agents/scripts/providers/github/request-helpers.js +5 -32
  510. package/.agents/scripts/providers/github/search-budget.js +9 -39
  511. package/.agents/scripts/providers/github/search-query.js +5 -26
  512. package/.agents/scripts/providers/github/sub-issue-add.js +15 -65
  513. package/.agents/scripts/providers/github/sub-issues.js +7 -36
  514. package/.agents/scripts/providers/github/tickets.js +32 -134
  515. package/.agents/scripts/providers/github.js +18 -59
  516. package/.agents/scripts/prune-plan-run-labels.js +12 -46
  517. package/.agents/scripts/quality-preview.js +35 -220
  518. package/.agents/scripts/resolve-doc-tiers.js +3 -26
  519. package/.agents/scripts/resolve-stories.js +16 -67
  520. package/.agents/scripts/resync-status-column.js +6 -25
  521. package/.agents/scripts/run-tests.js +29 -104
  522. package/.agents/scripts/single-story-close.js +23 -135
  523. package/.agents/scripts/single-story-confirm-merge.js +32 -139
  524. package/.agents/scripts/single-story-init.js +47 -209
  525. package/.agents/scripts/stories-wave-tick.js +102 -472
  526. package/.agents/scripts/sync-agentrc.js +3 -21
  527. package/.agents/scripts/sync-claude-agents.js +9 -55
  528. package/.agents/scripts/sync-claude-commands.js +20 -110
  529. package/.agents/scripts/test-wrapper.js +6 -43
  530. package/.agents/scripts/update-coverage-baseline.js +5 -22
  531. package/.agents/scripts/update-crap-baseline.js +7 -30
  532. package/.agents/scripts/update-duplication-baseline.js +16 -92
  533. package/.agents/scripts/update-maintainability-baseline.js +8 -62
  534. package/.agents/scripts/update-ticket-state.js +1 -7
  535. package/.agents/scripts/validate-skills.js +6 -26
  536. package/.agents/templates/agent-protocol.md +2 -2
  537. package/.agents/templates/docs/audit-sweep-runbook.md +3 -4
  538. package/.agents/workflows/audit-accessibility.md +4 -7
  539. package/.agents/workflows/audit-adrs.md +3 -6
  540. package/.agents/workflows/audit-architecture.md +3 -11
  541. package/.agents/workflows/audit-baselines.md +6 -9
  542. package/.agents/workflows/audit-clean-code.md +8 -12
  543. package/.agents/workflows/audit-data-model.md +3 -7
  544. package/.agents/workflows/audit-dependencies.md +4 -7
  545. package/.agents/workflows/audit-devops.md +4 -8
  546. package/.agents/workflows/audit-documentation.md +1 -4
  547. package/.agents/workflows/audit-mobile.md +4 -7
  548. package/.agents/workflows/audit-navigability.md +3 -6
  549. package/.agents/workflows/audit-performance.md +2 -4
  550. package/.agents/workflows/audit-privacy.md +4 -7
  551. package/.agents/workflows/audit-quality.md +4 -7
  552. package/.agents/workflows/audit-security.md +4 -7
  553. package/.agents/workflows/audit-seo.md +4 -7
  554. package/.agents/workflows/audit-sre.md +4 -7
  555. package/.agents/workflows/audit-to-stories.md +17 -30
  556. package/.agents/workflows/audit-ux-ui.md +4 -7
  557. package/.agents/workflows/helpers/audit-lens-core.md +1 -1
  558. package/.agents/workflows/helpers/code-quality-guardrails.md +12 -15
  559. package/.agents/workflows/helpers/deliver-digest.md +6 -4
  560. package/.agents/workflows/helpers/deliver-reference.md +114 -188
  561. package/.agents/workflows/helpers/deliver-story-reference.md +189 -533
  562. package/.agents/workflows/helpers/plan-reference.md +86 -139
  563. package/.agents/workflows/helpers/qa-core.md +12 -0
  564. package/.agents/workflows/memory-consolidate.md +1 -1
  565. package/.agents/workflows/qa-assist.md +27 -71
  566. package/.agents/workflows/qa-explore.md +19 -59
  567. package/.agents/workflows/qa-run.md +11 -33
  568. package/README.md +1 -1
  569. package/bin/mandrel.js +5 -46
  570. package/bin/postinstall.js +18 -107
  571. package/docs/CHANGELOG.md +25 -0
  572. package/lib/cli/doctor.js +11 -71
  573. package/lib/cli/init.js +26 -165
  574. package/lib/cli/migrate.js +5 -64
  575. package/lib/cli/registry.js +84 -467
  576. package/lib/cli/sync-agents.js +4 -64
  577. package/lib/cli/sync-commands.js +11 -64
  578. package/lib/cli/sync.js +34 -213
  579. package/lib/cli/uninstall.js +40 -219
  580. package/lib/cli/update.js +105 -661
  581. package/lib/cli/version-check.js +8 -72
  582. package/lib/cli/version-helpers.js +14 -87
  583. package/lib/migrations/helpers/retire-agentrc-key.js +11 -52
  584. package/lib/migrations/index.js +15 -92
  585. package/lib/migrations/steps/2.1.0-retire-mi-drop-knobs.js +2 -15
  586. package/lib/migrations/steps/2.1.0-retire-verify-concurrency-cap.js +1 -13
  587. package/lib/migrations/steps/2.11.0-retire-max-seed-words.js +2 -15
  588. package/lib/migrations/steps/2.2.0-retire-epic-ac-tags.js +9 -38
  589. package/lib/migrations/steps/2.20.0-retire-codebase-snapshot.js +1 -13
  590. package/lib/migrations/steps/2.32.0-retire-lint-baseline-command.js +2 -27
  591. package/lib/migrations/steps/2.57.0-retire-delivery-limit-knobs.js +2 -23
  592. package/lib/migrations/steps/2.57.0-retire-planning-limit-knobs.js +2 -27
  593. package/lib/migrations/steps/2.60.0-retire-audit-results-autofile.js +2 -21
  594. package/lib/migrations/steps/strip-removed-agentrc-keys.js +333 -0
  595. package/package.json +16 -14
  596. package/.agents/docs/SDLC.md +0 -590
  597. package/.agents/docs/quality-gates.md +0 -1183
  598. package/.agents/rules/known-tooling-behavior.md +0 -200
  599. package/.agents/rules/orchestration-error-handling.md +0 -61
  600. package/.agents/rules/test-seams.md +0 -59
  601. package/.agents/schemas/baselines/lighthouse.schema.json +0 -59
  602. package/.agents/schemas/baselines/lint.schema.json +0 -47
  603. package/.agents/scripts/check-action-pinning.js +0 -260
  604. package/.agents/scripts/check-audit-attribution.js +0 -302
  605. package/.agents/scripts/check-baseline-drift.js +0 -211
  606. package/.agents/scripts/check-baseline-scope.js +0 -362
  607. package/.agents/scripts/check-generated-validator.js +0 -202
  608. package/.agents/scripts/check-knip-entries.js +0 -159
  609. package/.agents/scripts/check-lifecycle-lint.js +0 -294
  610. package/.agents/scripts/check-pinned-override-notes.js +0 -102
  611. package/.agents/scripts/check-schema-references.js +0 -368
  612. package/.agents/scripts/check-test-portability.js +0 -512
  613. package/.agents/scripts/check-workflow-citations.js +0 -218
  614. package/.agents/scripts/check-workflow-cli-lint.js +0 -299
  615. package/.agents/scripts/check-workflow-timeouts.js +0 -291
  616. package/.agents/scripts/install-matrix-assert.js +0 -326
  617. package/.agents/scripts/lib/audit-advisories.js +0 -195
  618. package/.agents/scripts/lib/audit-attribution.js +0 -134
  619. package/.agents/scripts/lib/baselines/drift-detector.js +0 -351
  620. package/.agents/scripts/lib/baselines/kinds/lighthouse.js +0 -87
  621. package/.agents/scripts/lib/baselines/kinds/lint.js +0 -184
  622. package/.agents/scripts/lib/baselines/orphan-pruner.js +0 -233
  623. package/.agents/scripts/lib/baselines/scope-assert.js +0 -223
  624. package/.agents/scripts/lib/baselines/scope-inventory.js +0 -314
  625. package/.agents/scripts/lib/c8-cli-path.js +0 -21
  626. package/.agents/scripts/lib/config/gates/lighthouse.schema.js +0 -51
  627. package/.agents/scripts/lib/config/gates/lint.schema.js +0 -18
  628. package/.agents/scripts/lib/dynamic-workflow/architecture-report-contract.js +0 -70
  629. package/.agents/scripts/lib/dynamic-workflow/audit-orchestrator.js +0 -284
  630. package/.agents/scripts/lib/dynamic-workflow/clean-code-report-contract.js +0 -80
  631. package/.agents/scripts/lib/dynamic-workflow/degraded-coverage.js +0 -81
  632. package/.agents/scripts/lib/dynamic-workflow/documentation-report-contract.js +0 -87
  633. package/.agents/scripts/lib/dynamic-workflow/performance-report-contract.js +0 -74
  634. package/.agents/scripts/lib/dynamic-workflow/quality-report-contract.js +0 -90
  635. package/.agents/scripts/lib/dynamic-workflow/report-contract-core.js +0 -43
  636. package/.agents/scripts/lib/dynamic-workflow/security-report-contract.js +0 -83
  637. package/.agents/scripts/lib/fs-walk.js +0 -52
  638. package/.agents/scripts/lib/knip-config-resolver.js +0 -181
  639. package/.agents/scripts/lib/knip-entry-sync.js +0 -452
  640. package/.agents/scripts/lib/pinned-override-notes.js +0 -88
  641. package/.agents/scripts/lib/pinned-override-resolve.js +0 -212
  642. package/.agents/scripts/lib/test-isolate/cli-options.js +0 -93
  643. package/.agents/scripts/lib/test-isolate/env-snapshot-loader.js +0 -52
  644. package/.agents/scripts/lib/test-isolate/list-files.js +0 -90
  645. package/.agents/scripts/lib/test-isolate/parse-tap.js +0 -75
  646. package/.agents/scripts/lib/test-isolate/progress-log.js +0 -45
  647. package/.agents/scripts/lib/test-isolate/render-report.js +0 -97
  648. package/.agents/scripts/lib/test-isolate/run-isolate.js +0 -87
  649. package/.agents/scripts/lib/test-isolate/runner.js +0 -483
  650. package/.agents/scripts/lib/test-profile/parse-tap.js +0 -136
  651. package/.agents/scripts/lib/test-profile/render-report.js +0 -45
  652. package/.agents/scripts/lint-label-vocabulary.js +0 -214
  653. package/.agents/scripts/post-structured-comment.js +0 -127
  654. package/.agents/scripts/provision-git-hooks.js +0 -85
  655. package/.agents/scripts/prune-baseline-orphans.js +0 -181
  656. package/.agents/scripts/run-coverage.js +0 -197
  657. package/.agents/scripts/run-lint.js +0 -133
  658. package/.agents/scripts/run-test-profile.js +0 -129
  659. package/.agents/scripts/run-verify.js +0 -125
  660. package/.agents/scripts/test-isolate.js +0 -55
  661. package/.agents/scripts/update-dead-exports-baseline.js +0 -321
@@ -1,9 +1,5 @@
1
1
  /**
2
- * render.js — pure rendering helpers for git-cleanup (Story #2466).
3
- *
4
- * Owns the text + JSON envelope renderers and the `computeExitCode`
5
- * helper. Extracted verbatim from `git-cleanup.js` so every named export
6
- * keeps its contract.
2
+ * Pure text / JSON renderers and exit-code derivation for git-cleanup.
7
3
  *
8
4
  * @module lib/orchestration/git-cleanup/phases/render
9
5
  */
@@ -12,14 +8,8 @@ const TAG = '[git-cleanup]';
12
8
  const DAY_MS = 24 * 60 * 60 * 1000;
13
9
 
14
10
  /**
15
- * Pure: format a last-commit ISO timestamp as a short relative-age string
16
- * for the `not-merged` skip-visibility line (Story #4395). Returns
17
- * `'unknown'` when `iso` is missing or unparseable — a branch whose commit
18
- * date could not be resolved (e.g. `gh`-degraded run, deleted ref) still
19
- * gets a line, just without an age.
20
- *
21
11
  * @param {string|null|undefined} iso
22
- * @param {number} now Epoch-ms reference clock (injectable for tests).
12
+ * @param {number} now
23
13
  * @returns {string}
24
14
  */
25
15
  function formatCommitAge(iso, now) {
@@ -33,17 +23,8 @@ function formatCommitAge(iso, now) {
33
23
  }
34
24
 
35
25
  /**
36
- * Pure: render a single `not-merged` skip-visibility line (Story #4395).
37
- * `renderDryRun` previously kept `not-merged` survivors silent; this
38
- * surfaces each one with its last-commit age so the operator can see why
39
- * a leftover branch isn't reaped instead of hunting for it by hand.
40
- *
41
- * Story #5188 routes the remote-only walk's genuinely-unmerged survivors
42
- * through here too. A `localExists: false` skip is marked `(remote-only)`
43
- * — the same marker {@link renderCandidateRow} puts on a remote-only
44
- * candidate — because the short name it prints has no local ref behind
45
- * it: without the marker the operator reads the line as a local branch and
46
- * hunts for a ref that `git branch` will never list.
26
+ * A remote-only skip is marked `(remote-only)` because its short name has
27
+ * no local ref behind it.
47
28
  *
48
29
  * @param {{ branch: string, reason: string, lastCommitAt?: string|null, localExists?: boolean }} skip
49
30
  * @param {{ now?: number }} [opts]
@@ -57,46 +38,22 @@ export function renderNotMergedSkipLine(skip, opts = {}) {
57
38
  return `${TAG} ⏭️ ${skip.branch}${scope} skipped — not merged (last commit: ${age})`;
58
39
  }
59
40
 
60
- /**
61
- * Pure: render a single content-merged candidate annotation line
62
- * (Story #4395). `content-merged` is a weaker signal than a merged PR or
63
- * git ancestry — this note lets the operator tell it apart in both the
64
- * dry-run list and the confirmation prompt.
65
- */
66
41
  function contentMergedNote(candidate) {
67
42
  return candidate.detectedBy === 'content-merged'
68
43
  ? ' (weaker signal — verify before deleting)'
69
44
  : '';
70
45
  }
71
46
 
72
- /**
73
- * Pure: render a single behind-the-merged-head candidate annotation.
74
- *
75
- * A branch whose tip is a strict ancestor of its merged PR head is a
76
- * stale pre-merge snapshot — reapable, because every commit on it landed
77
- * with the PR, but reapable for a different reason than a branch whose
78
- * tip *matches* the merged head. It used to be skipped outright as a
79
- * post-merge force-push; the note keeps the two visibly distinct in the
80
- * dry-run list and the confirmation prompt so the operator can see why a
81
- * branch that is not at the merged head is nonetheless offered.
82
- */
83
47
  function behindMergeNote(candidate) {
84
48
  return candidate.behindMerge
85
49
  ? ' (tip behind the merged head — content already landed)'
86
50
  : '';
87
51
  }
88
52
 
89
- /** Pure: every provenance annotation a candidate row carries, in order. */
90
53
  function candidateNotes(candidate) {
91
54
  return `${contentMergedNote(candidate)}${behindMergeNote(candidate)}`;
92
55
  }
93
56
 
94
- /**
95
- * Pure: one candidate row — its detection provenance, worktree, locality
96
- * and annotations. Split out of {@link renderDryRun} so that renderer
97
- * stays a loop over rows rather than growing a fourth inline ternary
98
- * every time a candidate gains a new dimension.
99
- */
100
57
  function renderCandidateRow(c) {
101
58
  const pr = c.prNumber ? `PR #${c.prNumber}` : c.detectedBy;
102
59
  const wt = c.hasWorktree ? ` (worktree: ${c.worktreePath})` : '';
@@ -105,15 +62,8 @@ function renderCandidateRow(c) {
105
62
  }
106
63
 
107
64
  /**
108
- * Pure: render the branch-phase candidate list as the operator-facing text
109
- * block.
110
- *
111
- * The header states the run mode: `execute` opts into the reap wording and
112
- * defaults to `false`, so a caller that forgets it still gets the harmless
113
- * preview line. Prefer {@link renderCandidateList}, which derives the mode
114
- * from the phase's own CLI options rather than making the caller restate
115
- * it — the header used to be hardcoded to the preview wording, so an
116
- * `--execute` run announced "nothing deleted" and then reaped.
65
+ * Prefer {@link renderCandidateList}, which derives `execute` from the CLI
66
+ * options.
117
67
  *
118
68
  * @param {{ candidates: Array, skipped?: Array, ghDegraded?: boolean }} plan
119
69
  * @param {{ baseBranch?: string|null, now?: number, execute?: boolean }} [opts]
@@ -159,17 +109,12 @@ export function renderDryRun(plan, opts = {}) {
159
109
  }
160
110
 
161
111
  /**
162
- * Pure: the branch phase's candidate-list block, with the header's run
163
- * mode derived from the phase's own CLI options — the same `opts.dryRun`
164
- * the reap path reads. Taking the whole bag (rather than a restated
165
- * boolean) is the point: the driver cannot get the wording wrong because
166
- * it never names the flag, so a destructive `--execute` run can no longer
167
- * announce itself as a `DRY RUN (nothing deleted)` preview and then
168
- * delete every candidate.
112
+ * Takes the whole CLI option bag — the same `dryRun` the reap path reads —
113
+ * so an `--execute` run can never announce itself as a dry run.
169
114
  *
170
115
  * @param {object} args
171
116
  * @param {{ candidates: Array, skipped?: Array }} args.plan
172
- * @param {{ dryRun?: boolean }} args.opts Parsed CLI options.
117
+ * @param {{ dryRun?: boolean }} args.opts
173
118
  * @param {string|null} [args.baseBranch]
174
119
  * @returns {string[]}
175
120
  */
@@ -177,10 +122,6 @@ export function renderCandidateList({ plan, opts = {}, baseBranch = null }) {
177
122
  return renderDryRun(plan, { baseBranch, execute: !opts.dryRun });
178
123
  }
179
124
 
180
- /**
181
- * Pure: the tip / merged short-SHA pair both merged-tip skip lines quote,
182
- * with a placeholder for either side the planner could not resolve.
183
- */
184
125
  function shortShaPair(skip) {
185
126
  return {
186
127
  tip: skip.tipSha ? skip.tipSha.slice(0, 7) : '<unknown>',
@@ -189,11 +130,7 @@ function shortShaPair(skip) {
189
130
  }
190
131
 
191
132
  /**
192
- * Pure: render a single latest-PR-state skip line. Returns null when the
193
- * skip reason is not one of the latest-PR family — `renderDryRun` filters
194
- * by truthy return value so unrelated skip reasons (`protected`,
195
- * `current-head`, `filtered`) stay quiet here. `not-merged` gets its own
196
- * renderer ({@link renderNotMergedSkipLine}).
133
+ * `null` for any reason outside the latest-PR / merged-tip family.
197
134
  *
198
135
  * @param {{ branch: string, reason: string, prNumber?: number, tipSha?: string, mergedSha?: string, detail?: string }} skip
199
136
  * @returns {string | null}
@@ -227,25 +164,13 @@ export function renderLatestPrSkipLine(skip) {
227
164
  return null;
228
165
  }
229
166
 
230
- /**
231
- * Remedy text per withheld-delete reason (Story #5283). A withheld entry
232
- * that named no way to proceed would read as an unexplained refusal, so
233
- * every reason the executor can record gets its own next step here.
234
- */
167
+ /** Next step per withheld-delete reason, so a withhold never reads as an unexplained refusal. */
235
168
  const WITHHELD_HINTS = {
236
169
  'weak-signal-needs-confirmation':
237
170
  'detected only by content-equivalence; re-run interactively or pass --include-content-merged',
238
171
  };
239
172
 
240
- /**
241
- * Pure: render a per-branch execution line.
242
- *
243
- * An entry marked `skipped` is a delete the executor deliberately
244
- * withheld rather than one it attempted — it must not render with the
245
- * `✅` of a completed reap, which is exactly the misreport that would let
246
- * an operator believe an unattended run had cleaned up a ref it left
247
- * standing.
248
- */
173
+ /** A `skipped` entry was withheld, not attempted — never render it as ✅. */
249
174
  export function renderExecutionLine(entry, scope) {
250
175
  const label = scope.padEnd(8);
251
176
  const tagName =
@@ -263,7 +188,6 @@ export function renderExecutionLine(entry, scope) {
263
188
  return `${TAG} ${icon} ${label} ${tagName}${note}`;
264
189
  }
265
190
 
266
- /** Pure: render the optional prune line. */
267
191
  export function renderPruneLine(prune) {
268
192
  if (!prune?.attempted) return null;
269
193
  if (!prune.ok) {
@@ -277,12 +201,8 @@ export function renderPruneLine(prune) {
277
201
  }
278
202
 
279
203
  /**
280
- * Pure: render a single deferred-worktree line. A lock-class
281
- * worktree-removal failure (Windows file lock on an already-merged
282
- * branch's directory) is non-fatal — the branch ref was still reaped and
283
- * the directory is handed off to the pending-cleanup sweep. Returns the
284
- * operator-facing warning so the deferred signal is visible even on a
285
- * clean (`ok: true`) run.
204
+ * A lock-class worktree removal failure (Windows file lock) is non-fatal:
205
+ * the ref was reaped and the directory deferred. Shown even on an `ok` run.
286
206
  *
287
207
  * @param {{ branch?: string, path: string, pendingCleanup?: object|null }} entry
288
208
  * @returns {string}
@@ -295,7 +215,6 @@ export function renderDeferredLine(entry) {
295
215
  return `${TAG} ⚠️ deferred ${ref}${entry.path} — worktree locked; ref reaped${handoff}`;
296
216
  }
297
217
 
298
- /** Pure: render the trailing summary line. */
299
218
  export function renderExecutionSummary(result) {
300
219
  if (!result.ok) {
301
220
  return `${TAG} ❌ ${result.failures.length} failure(s) during cleanup.`;
@@ -308,8 +227,7 @@ export function renderExecutionSummary(result) {
308
227
  deferredCount > 0
309
228
  ? ` (${deferredCount} worktree(s) deferred to sweep)`
310
229
  : '';
311
- // Story #5283: withheld remote entries are recorded on `remote[]` but
312
- // were never deleted — counting them would overstate the reap.
230
+ // Withheld remote entries were never deleted; don't count them.
313
231
  const remoteDeleted = result.remote.filter((r) => !r.skipped).length;
314
232
  const withheldCount = result.remote.length - remoteDeleted;
315
233
  const withheldNote =
@@ -329,7 +247,6 @@ const EMPTY_RESULT = Object.freeze({
329
247
  ok: true,
330
248
  });
331
249
 
332
- /** Pure: build the JSON envelope emitted in `--json` mode. */
333
250
  export function buildJsonEnvelope({
334
251
  dryRun,
335
252
  baseBranch,
@@ -365,8 +282,7 @@ function legacyExitCode(plan, result) {
365
282
  }
366
283
 
367
284
  /**
368
- * Pure: derive the process exit code. Supports both the legacy
369
- * `(plan, result)` signature and the new multi-phase context object.
285
+ * Accepts `(plan, result)` or a multi-phase context object.
370
286
  *
371
287
  * @param {{ candidates?: Array, branchesPlan?: object, branchesResult?: object, fastForward?: object, prune?: object, stashes?: object } | { candidates: Array }} ctx
372
288
  * @param {{ ok: boolean } | null | undefined} [legacyResult]
@@ -1,8 +1,5 @@
1
1
  /**
2
- * stashes.js — stash-triage phase of git-cleanup (Story #2466).
3
- *
4
- * Owns `parseStashList`, `planStashes`, `executeStashes`, `stashRefIndex`,
5
- * and `buildAllowlistDecider`. Extracted verbatim from `git-cleanup.js`.
2
+ * Stash-triage phase of git-cleanup.
6
3
  *
7
4
  * @module lib/orchestration/git-cleanup/phases/stashes
8
5
  */
@@ -1,69 +1,22 @@
1
1
  /**
2
- * lease-guard-shared.js — Story #3992: single-source the lease-acquisition
3
- * kernel shared by the three per-surface lease guards.
4
- *
5
- * The per-surface lease guards — today `single-story-lease-guard.js`;
6
- * historically also the retired Epic-tier deliver/mandrel-plan guards —
7
- * each carried their own copy of
8
- * the operator-handle resolution and the fail-closed acquire wrapper around
9
- * `ticket-lease.acquireLease` (refuse any foreign assignee, throwing an
10
- * operator-facing message naming the current owner unless `--steal`). The
11
- * three copies had
12
- * already diverged — different `resolveOperator` signatures and different
13
- * missing-handle behaviour (`null` vs `throw`) — and were synchronised only
14
- * by docstring promise ("This mirrors the sibling lease guards…").
15
- *
16
- * This module is the single home for the kernel, modelled on the
17
- * shared plumbing inside `story-close/format-autofix.js` (Story #3332,
18
- * consolidated by Story #4017). The
19
- * per-surface guards now differ only in injected **policy**:
20
- *
21
- * - **Operator candidates** — each surface supplies its own ordered
22
- * candidate list (e.g. `--as` flag → `github.operatorHandle` →
23
- * `git user.email` for `/mandrel-deliver`; bare `operatorHandle` for the
24
- * plan/standalone paths).
25
- * - **Missing-handle behaviour** — `'null'` (return null; the caller fails
26
- * closed at acquire time) vs `'throw'` (refuse immediately with surface
27
- * wording). The divergence between the plan path (`null`) and the
28
- * standalone path (`throw`) is intentional: the plan path also calls
29
- * `resolveOperator` on its best-effort release leg, where a missing
30
- * handle must degrade to a `no-operator` no-op rather than throw.
31
- * - **Refusal wording** — each surface renders its own operator-facing
32
- * message via `renderRefusal(result, ticketId)`.
33
- *
34
- * A third axis, **liveness anchoring**, is gone: Story #5006 deleted the
35
- * lease TTL, so every foreign claim refuses unconditionally and there is no
36
- * heartbeat to anchor.
37
- *
38
- * The unclaimed / already-held / foreign-claim decision table itself (and
39
- * the steal transfer) lives in `ticket-lease.acquireLease`; this kernel owns
40
- * the refuse-by-throw boundary that the three guards previously each
41
- * re-implemented.
42
- *
43
- * Per `.agents/rules/orchestration-error-handling.md`, failures surface via
44
- * `throw new Error(...)`, never `Logger.fatal`.
2
+ * lease-guard-shared.js — the lease-acquisition kernel shared by lease
3
+ * guards; surfaces differ only in injected policy (operator candidates,
4
+ * missing-handle behaviour, refusal wording). The claim decision table lives
5
+ * in `ticket-lease.acquireLease`; this owns the refuse-by-throw boundary.
6
+ * Failures throw, never `Logger.fatal`.
45
7
  */
46
8
 
47
9
  import { acquireLease, normalizeOperatorHandle } from './ticket-lease.js';
48
10
 
49
11
  /**
50
- * Resolve the operator handle from an ordered candidate list, applying the
51
- * surface's missing-handle policy.
52
- *
53
- * Each candidate is passed through the shared `normalizeOperatorHandle` so a
54
- * leading `@` is stripped (the assignees API expects bare logins, not
55
- * `@`-prefixed mentions) and the shipped `@[USERNAME]` placeholder maps to
56
- * `null` — otherwise the assignee PATCH is rejected (HTTP 422) and the
57
- * self-held-claim comparison (`owner === operator`) never matches. The first
58
- * candidate that normalises to a non-null handle wins.
12
+ * First candidate that normalizes to a bare login (strips `@`, maps the
13
+ * `@[USERNAME]` placeholder to `null` — else the assignee PATCH 422s).
14
+ * `'null'` suits paths with a best-effort release leg, which must no-op.
59
15
  *
60
16
  * @param {object} opts
61
17
  * @param {Array<string|null|undefined>} opts.candidates Ordered raw handles.
62
- * @param {'null'|'throw'} [opts.missingHandleBehavior='null'] What to do
63
- * when no candidate resolves: return `null`, or throw with the surface's
64
- * configured wording.
65
- * @param {string} [opts.missingHandleMessage] Error message used when
66
- * `missingHandleBehavior` is `'throw'`.
18
+ * @param {'null'|'throw'} [opts.missingHandleBehavior='null']
19
+ * @param {string} [opts.missingHandleMessage]
67
20
  * @returns {string|null} Bare operator handle, or `null` (policy `'null'`).
68
21
  * @throws {Error} When no candidate resolves and the policy is `'throw'`.
69
22
  */
@@ -83,19 +36,15 @@ export function resolveOperatorFromCandidates({
83
36
  }
84
37
 
85
38
  /**
86
- * Acquire a ticket lease, failing closed by throwing the surface's refusal
87
- * message when the claim is refused (foreign owner, no `steal`).
88
- *
89
- * Unclaimed and self-held tickets proceed — the self-held case without a
90
- * write. A foreign assignee always refuses unless `steal` is set.
39
+ * Acquire a lease; a foreign claim without `steal` throws the surface's
40
+ * refusal.
91
41
  *
92
42
  * @param {object} opts
93
- * @param {object} opts.provider Ticketing provider.
94
- * @param {number} opts.ticketId Ticket to claim.
95
- * @param {string} opts.operator Resolved operator handle.
96
- * @param {boolean} [opts.steal=false] Forcibly transfer a foreign claim.
43
+ * @param {object} opts.provider
44
+ * @param {number} opts.ticketId
45
+ * @param {string} opts.operator
46
+ * @param {boolean} [opts.steal=false]
97
47
  * @param {(result: object, ticketId: number) => string} opts.renderRefusal
98
- * Renders the operator-facing refusal message for a refused claim.
99
48
  * @returns {Promise<{ acquired: boolean, owner: string, previousOwner: string|null, reason: string }>}
100
49
  * @throws {Error} When the claim is refused (`result.acquired === false`).
101
50
  */
@@ -1,16 +1,6 @@
1
1
  /**
2
- * emit-ledger-event.js — shared validate-and-append core for the
3
- * merge-terminal lifecycle emitters (Story #4539).
4
- *
5
- * `emit-merge-unlanded.js` and `emit-merge-flip-failed.js` report the two
6
- * terminal outcomes a landing attempt can reach without ending at
7
- * `agent::done`. They share everything except their schema and their
8
- * payload's meaning, so the Ajv compile/cache, the scope→ledger routing,
9
- * and the NDJSON append live here once rather than being copy-pasted.
10
- *
11
- * Like its callers, this is a bare `appendFileSync` rather than a bus
12
- * publish: these events fire from the `single-story-close` flow, which has
13
- * no bus at all, so a direct append keeps the call site dependency-free.
2
+ * Shared schema-validate-and-append core for the merge-terminal lifecycle
3
+ * emitters (outcomes that end short of `agent::done`).
14
4
  */
15
5
 
16
6
  import { appendFileSync, mkdirSync, readFileSync } from 'node:fs';
@@ -34,14 +24,8 @@ const SCHEMA_DIR = path.resolve(
34
24
  );
35
25
 
36
26
  /**
37
- * The scopes a merge-terminal event may be WRITTEN with. v2.0.0 removed the
38
- * Epic tier, so `'story'` is the only emittable scope.
39
- *
40
- * Note the deliberate asymmetry with the `merge.unlanded` /
41
- * `merge.flip-failed` schema enums, which still accept `'epic'`: archived
42
- * ledger records carry `scope: 'epic'` and the schemas must keep validating
43
- * them on read. The value stays READABLE; only the writer path is gone —
44
- * the same split `merge-block-class.js` keeps for `predicate-refused`.
27
+ * Writable scopes. The schemas still accept `'epic'` so archived records
28
+ * keep validating on read; only the writer path is gone.
45
29
  */
46
30
  const VALID_SCOPES = new Set(['story']);
47
31
 
@@ -49,9 +33,7 @@ const VALID_SCOPES = new Set(['story']);
49
33
  const _validators = new Map();
50
34
 
51
35
  /**
52
- * Compile (once) and return the validator for a lifecycle schema file.
53
- *
54
- * @param {string} schemaFile Basename under `.agents/schemas/lifecycle/`.
36
+ * @param {string} schemaFile
55
37
  * @returns {Function}
56
38
  */
57
39
  function getValidator(schemaFile) {
@@ -68,9 +50,6 @@ function getValidator(schemaFile) {
68
50
  }
69
51
 
70
52
  /**
71
- * Assert the fields every merge-terminal event shares. Throws with the
72
- * caller's own emitter name so the message stays attributable.
73
- *
74
53
  * @param {string} emitter
75
54
  * @param {{ scope: string, ticketId: number, prNumber: number, reason: string, elapsedSeconds: number }} fields
76
55
  */
@@ -98,17 +77,14 @@ export function assertMergeTerminalFields(
98
77
  }
99
78
 
100
79
  /**
101
- * Validate a payload against its lifecycle schema and append exactly one
102
- * NDJSON record to the scope-resolved ledger.
103
- *
104
80
  * @param {object} args
105
- * @param {string} args.emitter Caller name, for error attribution.
106
- * @param {string} args.schemaFile Basename under `schemas/lifecycle/`.
107
- * @param {object} args.payload The event payload (already assembled).
81
+ * @param {string} args.emitter
82
+ * @param {string} args.schemaFile
83
+ * @param {object} args.payload
108
84
  * @param {number} args.ticketId
109
85
  * @param {string} args.timestamp
110
86
  * @param {object} [args.config]
111
- * @param {string} [args.ledgerPath] Override for tests / non-default layouts.
87
+ * @param {string} [args.ledgerPath]
112
88
  * @returns {{ ledgerPath: string, record: object }}
113
89
  */
114
90
  export function appendLedgerEvent({
@@ -1,22 +1,8 @@
1
1
  /**
2
- * emit-merge-flip-failed.js — Story #4539.
3
- *
4
- * Appends a single `merge.flip-failed` NDJSON record when a delivery run
5
- * observed a **confirmed merge** but the `agent::closing → agent::done`
6
- * label write itself failed.
7
- *
8
- * Why this is not `merge.unlanded`: the merge landed. Reporting it as
9
- * unlanded points the operator at branch protection, required checks, and
10
- * poll budgets — none of which are the fault — while the real remedy is a
11
- * re-run of `single-story-confirm-merge.js`, which is idempotent and flips
12
- * the label from the already-merged PR. The two events are deliberately
13
- * distinct so the ledger attributes a label-write API failure differently
14
- * from a merge that never happened.
15
- *
16
- * The Story is still transitioned to `agent::blocked` by the caller: a
17
- * merged PR whose Story sits at `agent::closing` is exactly the silent
18
- * strand the must-land contract exists to prevent, so it terminates
19
- * explicitly — but it terminates with the truth.
2
+ * Record a confirmed merge whose `agent::done` label write failed. Distinct
3
+ * from `merge.unlanded` because the merge landed — the remedy is re-running
4
+ * the idempotent confirm-merge, not chasing branch protection. The caller
5
+ * still blocks the Story so it is never stranded at `agent::closing`.
20
6
  */
21
7
 
22
8
  import {
@@ -24,22 +10,15 @@ import {
24
10
  assertMergeTerminalFields,
25
11
  } from './emit-ledger-event.js';
26
12
 
27
- /**
28
- * The only block class this event carries. Distinct from every
29
- * `merge.unlanded` attribution (`MERGE_UNLANDED_BLOCK_CLASSES`) because the
30
- * merge is not in question here — only the label write is.
31
- */
32
13
  export const MERGED_FLIP_FAILED_BLOCK_CLASS = 'merged-flip-failed';
33
14
 
34
15
  /**
35
- * Append exactly one `merge.flip-failed` record to the resolved ledger.
36
- *
37
16
  * @param {object} opts
38
17
  * @param {'story'} opts.scope
39
- * @param {number} opts.ticketId The storyId.
40
- * @param {number} opts.prNumber The PR that merged.
41
- * @param {string} opts.reason What failed on the label write.
42
- * @param {number} opts.elapsedSeconds Elapsed poll time when the flip failed.
18
+ * @param {number} opts.ticketId
19
+ * @param {number} opts.prNumber
20
+ * @param {string} opts.reason
21
+ * @param {number} opts.elapsedSeconds
43
22
  * @param {string} [opts.timestamp]
44
23
  * @param {object} [opts.config]
45
24
  * @param {string} [opts.ledgerPath]
@@ -1,52 +1,10 @@
1
1
  /**
2
- * emit-merge-unlanded.js — Story #4426 (Epic #4425, slice 1: foundation).
3
- *
4
- * Programmatic helper that appends a single `merge.unlanded` NDJSON
5
- * record to the lifecycle ledger whenever a headless delivery run
6
- * finishes its work without a confirmed merge. Direct schema validation via
7
- * Ajv followed by a synchronous `appendFileSync`: it fires from the standalone
8
- * `single-story-close` flow, and a bare append keeps the call site simple and
9
- * dependency-free. This was the shape that outlived the lifecycle bus — Story
10
- * #5024 retired the bus, leaving this path the only lifecycle-ledger writer.
11
- *
12
- * Ledger destination (Story #4426 AC4): `storyLedgerPath(null, ticketId)`
13
- * — the standalone story-scope destination
14
- * `temp/standalone/stories/story-<id>/lifecycle.ndjson`, where `ticketId`
15
- * is the storyId. The `single-story-close` path has no parent Epic to
16
- * anchor a run directory to, mirroring the `eid === null` standalone
17
- * convention `signalsFile` already uses for Story-level signals.
18
- *
19
- * A caller may always override the destination via `ledgerPath` (tests,
20
- * or a future caller with a non-default temp layout).
21
- *
22
- * Distinct from:
23
- * - `epic.merge.blocked` — AutomergePredicate's "not safe to arm yet"
24
- * signal, evaluated BEFORE arming. `merge.unlanded` fires AFTER a
25
- * delivery flow has already finished trying and gives up.
26
- * - `epic.blocked` / `story.blocked` — the generic `agent::blocked`
27
- * transition signal. `merge.unlanded` is the merge-specific
28
- * diagnosis a `*.blocked` transition is typically paired with, not a
29
- * replacement for it.
30
- *
31
- * The emit is best-effort in the sense that a failure to append MUST NOT
32
- * mask the underlying blocked-state transition the caller is already
33
- * driving — callers should treat this the same way
34
- * `emitStoryHeartbeat` documents: catch, log, and proceed with the label
35
- * flip / friction comment regardless.
36
- *
37
- * Schema contract (merge.unlanded.schema.json):
38
- * { event, scope, ticketId, prNumber, blockClass, reason,
39
- * elapsedSeconds, timestamp? }
40
- *
41
- * The schema declares `additionalProperties: false`, so this emitter's
42
- * signature is deliberately narrow: only the schema-allowed fields are
43
- * accepted. `blockClass` MUST be a valid `merge.unlanded` attribution from
44
- * `merge-block-class.js` (`MERGE_UNLANDED_BLOCK_CLASSES` — the four
45
- * `classifyMergeBlock` outputs plus the directly-emitted `predicate-refused`,
46
- * Story #4472). For a post-arm poll-exhaustion block, pass the classifier's
47
- * verdict straight through (`classifyMergeBlock(...)` returns
48
- * `{ blockClass, reason }`); the predicate/armer refusal paths pass
49
- * `predicate-refused` / a classified arm failure directly.
2
+ * Append one `merge.unlanded` record to the Story's lifecycle ledger when a
3
+ * delivery run gives up without a confirmed merge (after arming, unlike the
4
+ * pre-arm `epic.merge.blocked`). Callers must catch a failed append and still
5
+ * drive the blocked-state transition. The schema forbids extra properties, so
6
+ * the signature is narrow; `blockClass` must be a `merge-block-class.js`
7
+ * value.
50
8
  */
51
9
 
52
10
  import { isValidBlockClass } from '../merge-block-class.js';
@@ -56,27 +14,16 @@ import {
56
14
  } from './emit-ledger-event.js';
57
15
 
58
16
  /**
59
- * Append exactly one `merge.unlanded` NDJSON record to the resolved
60
- * lifecycle ledger.
61
- *
62
17
  * @param {object} opts
63
- * @param {'story'} opts.scope Which delivery path is reporting the
64
- * unlanded merge.
65
- * @param {number} opts.ticketId The storyId.
66
- * @param {number} opts.prNumber The PR number that did not land.
67
- * @param {string} opts.blockClass A valid `merge.unlanded` attribution
68
- * (`MERGE_UNLANDED_BLOCK_CLASSES` in
69
- * `merge-block-class.js`).
70
- * @param {string} opts.reason Free-form diagnosis detail — pass
71
- * the classifier's `reason`.
72
- * @param {number} opts.elapsedSeconds Elapsed watch/poll time when the
73
- * run gave up.
74
- * @param {string} [opts.timestamp] ISO-8601 wall clock. Defaults to
75
- * now().
76
- * @param {object} [opts.config] Optional resolved config for
77
- * tempRoot.
78
- * @param {string} [opts.ledgerPath] Override for tests / non-default
79
- * layouts.
18
+ * @param {'story'} opts.scope
19
+ * @param {number} opts.ticketId
20
+ * @param {number} opts.prNumber
21
+ * @param {string} opts.blockClass
22
+ * @param {string} opts.reason
23
+ * @param {number} opts.elapsedSeconds
24
+ * @param {string} [opts.timestamp]
25
+ * @param {object} [opts.config]
26
+ * @param {string} [opts.ledgerPath]
80
27
  * @returns {{ ledgerPath: string, record: object }}
81
28
  */
82
29
  export function emitMergeUnlanded(opts) {