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,59 +1,10 @@
1
1
  /**
2
- * Signals schema — single source of truth for event-kind constants and
3
- * shape guards (Epic #1181 / Story #1438 / Task #1458).
2
+ * Signals schema — the single source of event-kind constants, field names
3
+ * and the envelope guard for the NDJSON signal streams. Pure, no I/O.
4
4
  *
5
- * Both writers (`lib/observability/signals-writer.js` callers) and readers
6
- * (its `forEachLine` / `forEachSignalStreamLine` walkers, and the retro's
7
- * gather-signals phase) import their field names from this module so the
8
- * on-disk NDJSON shape stays under one schema.
9
- *
10
- * Pure module: importing has **no I/O side effects**. The exported
11
- * `EVENT_KINDS` object is `Object.freeze`'d so consumers can use it as a
12
- * compile-time-ish constant without worrying about mutation.
13
- *
14
- * ## Event-kind enumeration
15
- *
16
- * The set below is the audited union of `kind:` literals emitted via
17
- * `signals-writer.appendSignal` across the codebase as of Epic #1181
18
- * (audit-snapshot 2026-05-11):
19
- *
20
- * Signals-writer `appendSignal` call sites:
21
- * - `friction` — quality-gate / runtime friction (diagnose-friction.js,
22
- * lib/gates/friction.js)
23
- * - `acceptance-eval` — acceptance-eval.js per-criterion terminus signal.
24
- * - `wave-start` / `wave-complete` — wave-window anchors.
25
- * - `wave-end` — wave-window pairing anchor.
26
- * - `state-transition` — notification-derived window anchor.
27
- *
28
- * The `dispatched` kind was deleted in the Epic #4406 signal-contract
29
- * cutover — it had no live emitter and no consumer.
30
- *
31
- * Producerless kinds, pinned in the enum so a re-introduction needs no schema
32
- * bump. Story #5003 deleted the last emitters of `trace` (the tool-trace hook
33
- * and its `appendTrace` writer limb) and of `rework` / `retry` (the detector
34
- * pair the hook fed); `hotspot`, `churn`, `idle` never had one:
35
- * - `trace`, `hotspot`, `rework`, `churn`, `idle`, `retry`
36
- *
37
- * ## Common envelope (canonical — Epic #4406 / Story #4413)
38
- *
39
- * Every signal MUST carry at minimum:
40
- * - `ts` — ISO-8601 timestamp string. The single canonical
41
- * timestamp key; the legacy `timestamp:` alias was deleted
42
- * from every writer and this guard in the same PR.
43
- * - `kind` — one of `EVENT_KINDS`.
44
- *
45
- * Scoped signals additionally carry:
46
- * - `epicId` — integer Epic ID (or `null` for standalone-Story
47
- * friction). The single canonical epic-id key; the legacy
48
- * `epic:` alias was deleted.
49
- *
50
- * Optional but commonly carried:
51
- * - `storyId` — integer Story ID
52
- * - `taskId` — integer Task ID (nullable)
53
- * - `emitter` — `{ tool: string, command?: string }` provenance
54
- * - `source` — `"framework" | "consumer"` classifier tag
55
- * - `category` — top-level friction category string
56
- * - `details` — kind-specific payload (always an object)
5
+ * Envelope: `ts` (ISO string), `kind` (an `EVENT_KINDS` value) and `epicId`
6
+ * (integer, or `null` for standalone-Story friction). No legacy aliases
7
+ * (`timestamp`, `epic`, …) are tolerated.
57
8
  *
58
9
  * @module lib/signals/schema
59
10
  */
@@ -62,71 +13,42 @@ import { isObject } from '../json-utils.js';
62
13
  import { isPositiveInt } from './detectors/common.js';
63
14
 
64
15
  /**
65
- * Frozen enumeration of every event kind currently emitted by
66
- * `signals-writer.appendSignal`, plus the producerless kinds a future Story
67
- * may re-introduce an emitter for.
68
- *
69
- * Field names are kebab-cased to match the on-disk literals.
16
+ * Every emitted kind, plus producerless kinds (`trace`, wave-*, `hotspot`,
17
+ * `rework`, `churn`, `idle`, `retry`) pinned so a re-introduced emitter or
18
+ * reader needs no schema bump.
70
19
  */
71
20
  export const EVENT_KINDS = Object.freeze({
72
21
  FRICTION: 'friction',
73
22
  TRACE: 'trace',
74
- // Wave-window forensics signals. Story #4545 deleted the `waveParallelism`
75
- // consumer (perf-aggregator) with the execution-analysis surface, and
76
- // Story #5003 deleted the span-tree that paired them; the kinds stay
77
- // pinned so a re-introduced window reader needs no schema bump.
78
23
  WAVE_START: 'wave-start',
79
24
  WAVE_END: 'wave-end',
80
25
  WAVE_COMPLETE: 'wave-complete',
81
- // Story #3909 — the write-only wave-lifecycle kinds with no consumer
82
- // (`wave-tick`, `epic-complete`) were retired. They duplicated the
83
- // `epic-run-state` checkpoint and the `epic-run-progress` rollup and nothing
84
- // read them back.
85
26
  STATE_TRANSITION: 'state-transition',
86
27
  HOTSPOT: 'hotspot',
87
28
  REWORK: 'rework',
88
29
  CHURN: 'churn',
89
30
  IDLE: 'idle',
90
31
  RETRY: 'retry',
91
- // Story #3819 — per-criterion acceptance self-eval signal emitted by
92
- // acceptance-eval.js. One record per Story per eval-loop terminus,
93
- // carrying which acceptance items needed rework and the round count, so
94
- // the retro and /mandrel-plan Phase 0 feedback fetch can see acceptance
95
- // churn alongside friction/hotspot data.
96
32
  ACCEPTANCE_EVAL: 'acceptance-eval',
97
- // Forensic breadcrumb appended to the per-Epic stream by the notify
98
- // dispatcher (lib/orchestration/lifecycle/listeners/notify-dispatcher.js)
99
- // when a lifecycle event maps to a webhook notification — the resume
100
- // suite reads it back to prove a dispatch survived a crash window without
101
- // duplicating. Enumerated so the write-time validator (Story #4413) does
102
- // not drop it; it is a deliberate write, not malformed data.
33
+ // Written by the notify dispatcher so resume can prove a dispatch survived a
34
+ // crash window; enumerated so the write-time validator does not drop it.
103
35
  NOTIFICATION_EMITTED: 'notification.emitted',
104
36
  });
105
37
 
106
38
  /**
107
- * The set of event-kind string values (for fast membership checks).
108
- *
109
39
  * @type {ReadonlySet<string>}
110
40
  */
111
41
  export const EVENT_KIND_VALUES = Object.freeze(
112
42
  new Set(Object.values(EVENT_KINDS)),
113
43
  );
114
44
 
115
- /**
116
- * Field-name constants exported so reader/aggregator code does not
117
- * spread string literals across the module graph.
118
- */
119
45
  export const FIELDS = Object.freeze({
120
- // Canonical envelope keys — there is exactly one key per concept. The
121
- // legacy `timestamp` / `epic` / `story` / `task` aliases were deleted in
122
- // the Epic #4406 signal-contract cutover; no reader tolerates them.
123
46
  TS: 'ts',
124
47
  EPIC_ID: 'epicId',
125
48
  STORY_ID: 'storyId',
126
49
  TASK_ID: 'taskId',
127
50
  KIND: 'kind',
128
51
 
129
- // Common payload fields
130
52
  EMITTER: 'emitter',
131
53
  SOURCE: 'source',
132
54
  DETAILS: 'details',
@@ -135,9 +57,7 @@ export const FIELDS = Object.freeze({
135
57
  });
136
58
 
137
59
  /**
138
- * Return true when `v` is a non-empty ISO-8601-ish timestamp string.
139
- * We don't fully validate format here — the schema's contract is "looks
140
- * like a timestamp string", not "round-trips through Date.parse exactly".
60
+ * "Looks like a timestamp string" — the format is not validated.
141
61
  *
142
62
  * @param {unknown} v
143
63
  * @returns {boolean}
@@ -147,13 +67,6 @@ function isTimestamp(v) {
147
67
  }
148
68
 
149
69
  /**
150
- * Common envelope guard: every signal MUST carry `ts`, `epicId`, and a
151
- * recognised `kind`. Canonical keys only — the legacy `timestamp` / `epic`
152
- * aliases were deleted in the Epic #4406 cutover.
153
- *
154
- * Returns true when the envelope is well-formed. Used by the stream readers
155
- * to discard malformed lines before yielding them to the consumer.
156
- *
157
70
  * @param {unknown} evt
158
71
  * @returns {boolean}
159
72
  */
@@ -163,23 +76,15 @@ export function hasCommonEnvelope(evt) {
163
76
  return false;
164
77
  }
165
78
  if (!isTimestamp(evt.ts)) return false;
166
- // The canonical `epicId` key MUST be present — a record carrying only the
167
- // legacy `epic` alias is rejected (the cutover deleted that alias). Its
168
- // value is nullable by contract: standalone-Story friction carries
169
- // `epicId: null` (see signal-event.schema.json, where epicId is
170
- // `["integer","null"]`). So accept an explicit null, reject a missing key
171
- // or a present-but-non-positive-int value.
79
+ // The key must be present; its value may be null but never a non-positive int.
172
80
  if (!Object.hasOwn(evt, 'epicId')) return false;
173
81
  if (evt.epicId !== null && !isPositiveInt(evt.epicId)) return false;
174
82
  return true;
175
83
  }
176
84
 
177
85
  /**
178
- * Generic per-kind guard. Returns true when the envelope is well-formed
179
- * AND (when `kind` is supplied) the event's `kind` matches. The full
180
- * canonical-shape check lives in the AJV validator compiled from
181
- * `signal-event.schema.json` (see `lib/observability/signal-validator.js`);
182
- * this predicate is the cheap envelope gate the streaming reader uses.
86
+ * Cheap envelope gate for the streaming reader; the full shape check is the
87
+ * AJV validator in `lib/observability/signal-validator.js`.
183
88
  *
184
89
  * @param {unknown} evt
185
90
  * @param {string} [kind] — optional kind to match (one of `EVENT_KINDS`).
@@ -1,15 +1,6 @@
1
1
  /**
2
- * `lib/signals/write.js` — thin re-export of the signals writer.
3
- *
4
- * The real implementation lives at `../observability/signals-writer.js`
5
- * (Epic #1030 / Story #1041). This module exists so callers can converge
6
- * on `lib/signals/` for the write surface. New code should
7
- * `import { appendSignal } from './lib/signals/index.js'` (or
8
- * `'./lib/signals/write.js'` for a narrower import); legacy direct imports
9
- * from `lib/observability/` keep working unchanged.
10
- *
11
- * `appendTrace` was removed in Story #5003 together with the tool-trace
12
- * hook — its only producer — and the viewer that was its only reader.
2
+ * `lib/signals/write.js` — re-export of `../observability/signals-writer.js`
3
+ * so callers converge on `lib/signals/` for the write surface.
13
4
  */
14
5
 
15
6
  export {
@@ -1,62 +1,31 @@
1
1
  /**
2
2
  * confirm-merge.js — post-merge confirmation for a standalone Story.
3
3
  *
4
- * Story #3385 — `single-story-close.js` leaves a standalone Story at
5
- * `agent::closing` with its GitHub issue OPEN while the PR is open with
6
- * auto-merge armed. GitHub auto-merge completes *asynchronously* after the
7
- * close script exits, so the `agent::done` flip (which closes the issue)
8
- * must be driven by a post-merge confirmation rather than fired at
9
- * PR-open. This module is that driver: it reads the live PR state, and
10
- * only once the merge is confirmed (`state === 'MERGED'`) flips
11
- * `agent::closing → agent::done` — which routes through the canonical
12
- * `transitionTicketState` mutator that closes the issue
13
- * (`state: 'closed'`, `state_reason: 'completed'`).
14
- *
15
- * Outcomes (returned as a structured envelope, never thrown for the
16
- * not-yet-merged / recoverable cases so the CI-watch loop can re-poll):
17
- *
18
- * - `{ action: 'done', merged: true }`
19
- * PR merged → flipped `agent::done`, issue closed.
20
- * - `{ action: 'noop', reason: 'already-done' }`
21
- * Story already carries `agent::done`. A closed issue *alone* does
22
- * NOT short-circuit — GitHub's `Closes #<id>` footer closes the issue
23
- * on auto-merge before this step runs, so a closed issue whose label
24
- * is still `agent::closing` must still drive the `agent::done` flip
25
- * (Story #3415).
26
- * - `{ action: 'pending', reason: 'pr-open' | 'pr-not-merged' }`
27
- * PR is still open (or closed-without-merge); the Story is left at
28
- * `agent::closing` and the issue stays OPEN. Recoverable — re-run
29
- * once the merge lands.
30
- *
31
- * This mirrors the epic path's `assertMergeReachable` gate in
32
- * `post-merge-close.js`: the `agent::done` transition is the single
33
- * writer gated behind a confirmed merge, so the label sequence is exactly
34
- * `executing → closing → done` on a successful close and
35
- * `executing → closing` (sticky) on a stalled / failed PR.
4
+ * Auto-merge completes asynchronously after close exits, so the
5
+ * `agent::closing → agent::done` flip (which closes the issue) is gated on a
6
+ * confirmed `MERGED` PR here, never fired at PR-open. Not-yet-merged cases
7
+ * return `pending` rather than throw so the CI-watch loop can re-poll; a
8
+ * stalled PR leaves the Story sticky at `agent::closing`.
36
9
  */
37
10
 
38
11
  import { notify as defaultNotify } from '../../notify.js';
39
12
  import { gh as defaultGh } from '../gh-exec.js';
40
13
  import { Logger } from '../Logger.js';
14
+ import { isPrMerged } from '../orchestration/merge-poll.js';
41
15
  import {
42
16
  STATE_LABELS,
43
17
  transitionTicketState,
44
18
  } from '../orchestration/ticketing.js';
45
19
 
46
20
  /**
47
- * Read the live PR state for `prNumber` via `gh pr view --json`.
48
- *
49
21
  * @param {{ cwd: string, prNumber: number, gh?: object }} args
50
22
  * @returns {Promise<{ state: string|null, mergedAt: string|null }>}
51
23
  */
52
24
  export async function readPrMergeState({ cwd, prNumber, gh = defaultGh }) {
53
- // `cwd` is accepted on the signature for call-site clarity, but the
54
- // `gh-exec` facade spawns `gh` against the current process cwd (matching
55
- // `ensurePullRequestWith`); the CLI runs from the main-repo so the
56
- // effective cwd is correct.
25
+ // gh-exec spawns against the process cwd (the main repo); `cwd` is
26
+ // accepted for call-site clarity only.
57
27
  void cwd;
58
28
  const view = await gh.pr.view(prNumber, ['state', 'mergedAt']);
59
- // `gh.pr.view` resolves the parsed JSON when `--json` fields are passed.
60
29
  return {
61
30
  state: typeof view?.state === 'string' ? view.state : null,
62
31
  mergedAt: typeof view?.mergedAt === 'string' ? view.mergedAt : null,
@@ -64,22 +33,22 @@ export async function readPrMergeState({ cwd, prNumber, gh = defaultGh }) {
64
33
  }
65
34
 
66
35
  /**
67
- * Confirm a standalone Story's PR merged and flip `agent::closing →
68
- * agent::done` (closing the issue) when it has.
69
- *
70
36
  * @param {object} args
71
37
  * @param {object} args.provider Ticketing provider.
72
38
  * @param {number} args.storyId
73
39
  * @param {number} args.prNumber
74
40
  * @param {string} [args.prUrl]
75
- * @param {string} args.cwd Working directory for `gh`.
76
- * @param {object} [args.config] Resolved config (threaded to notify).
41
+ * @param {string} args.cwd
42
+ * @param {object} [args.config]
77
43
  * @param {Function} [args.progress]
78
- * @param {object} [args.injectedGh] Test seam for the `gh` facade.
79
- * @param {Function} [args.injectedNotify] Test seam for the notify fn.
44
+ * @param {object} [args.injectedGh]
45
+ * @param {Function} [args.injectedNotify]
80
46
  * @param {(args: object) => Promise<{state: string|null, mergedAt: string|null}>} [args.readPrMergeStateFn]
81
- * Test seam for the PR-state reader.
82
- * @returns {Promise<object>} structured envelope (see module docblock).
47
+ * @param {{ state: string|null, mergedAt: string|null }} [args.prState] The
48
+ * merge state the caller already read, so a land reads it once; omitted,
49
+ * it is read here.
50
+ * @returns {Promise<object>} `done` | `noop` (already-done) | `pending`
51
+ * (pr-open / pr-not-merged) | `flip-failed`.
83
52
  */
84
53
  export async function confirmStoryMerged({
85
54
  provider,
@@ -92,23 +61,16 @@ export async function confirmStoryMerged({
92
61
  injectedGh,
93
62
  injectedNotify,
94
63
  readPrMergeStateFn = readPrMergeState,
64
+ prState,
95
65
  }) {
96
66
  progress?.('CONFIRM', `Confirming merge for standalone Story #${storyId}...`);
97
67
 
98
68
  const story = await provider.getTicket(storyId);
99
69
 
100
- // Idempotence: short-circuit only when the Story already carries
101
- // `agent::done`. A *closed issue alone* is NOT sufficient — GitHub
102
- // auto-merge closes the issue via the `Closes #<id>` PR footer *before*
103
- // this confirm step runs, so a Story whose label is still `agent::closing`
104
- // routinely arrives here with `state === 'closed'`. Gating the noop on
105
- // `state === 'closed'` mistook that for already-done and skipped the
106
- // `agent::closing → agent::done` flip, stranding the label and the
107
- // Projects board at "In Progress" (reproduced on Story #3413 / PR #3414).
108
- // Requiring the `agent::done` label preserves idempotence for a genuinely
109
- // finished Story while still driving the flip for the closed-by-footer
110
- // case below (`transitionTicketState` is idempotent against an
111
- // already-closed issue).
70
+ // Only the `agent::done` label short-circuits. A closed issue alone does
71
+ // not: the PR's `Closes #<id>` footer closes it before this step runs, and
72
+ // the flip must still happen (transitionTicketState is idempotent on a
73
+ // closed issue).
112
74
  if (story.labels?.includes(STATE_LABELS.DONE)) {
113
75
  progress?.(
114
76
  'CONFIRM',
@@ -117,14 +79,15 @@ export async function confirmStoryMerged({
117
79
  return { storyId, action: 'noop', reason: 'already-done', merged: true };
118
80
  }
119
81
 
120
- const { state, mergedAt } = await readPrMergeStateFn({
121
- cwd,
122
- prNumber,
123
- gh: injectedGh,
124
- });
82
+ const { state, mergedAt } =
83
+ prState ??
84
+ (await readPrMergeStateFn({
85
+ cwd,
86
+ prNumber,
87
+ gh: injectedGh,
88
+ }));
125
89
 
126
- const isMerged = state === 'MERGED' || Boolean(mergedAt);
127
- if (!isMerged) {
90
+ if (!isPrMerged({ state, mergedAt })) {
128
91
  const reason = state === 'CLOSED' ? 'pr-not-merged' : 'pr-open';
129
92
  progress?.(
130
93
  'CONFIRM',
@@ -133,11 +96,7 @@ export async function confirmStoryMerged({
133
96
  return { storyId, action: 'pending', reason, merged: false };
134
97
  }
135
98
 
136
- // Merge confirmed — flip agent::closing → agent::done. This routes
137
- // through the canonical mutator, which closes the issue
138
- // (`state: 'closed'`, `state_reason: 'completed'`) on the `agent::done`
139
- // transition. Best-effort: a flaky GitHub API must not crash the
140
- // confirmation (the CI-watch loop re-runs idempotently).
99
+ // Best-effort: a flaky API must not crash confirmation; re-runs are idempotent.
141
100
  const flipped = await flipDone(provider, storyId, story, progress);
142
101
  if (flipped) {
143
102
  await fireStoryMergedNotify({
@@ -1,26 +1,9 @@
1
1
  /**
2
2
  * story-merged-notify.js — flip a standalone Story to its close-entry rest
3
- * state and fire the matching operator notification.
4
- *
5
- * Story #3385 — the standalone close path no longer flips `agent::done`
6
- * (and no longer closes the GitHub issue) at PR-open time. GitHub
7
- * auto-merge completes *asynchronously* after `single-story-close.js`
8
- * exits, so closing the issue at PR-open left the Story marked "done"
9
- * while its PR could still fail CI, go `BEHIND` base, or be closed
10
- * without merging — stranding a CLOSED issue with no merged work.
11
- *
12
- * The fix brings the standalone path to parity with the epic path
13
- * (#2155): the Story rests at `agent::closing` while the PR is open with
14
- * auto-merge armed, and only flips `agent::done` (closing the issue) once
15
- * the merge is confirmed by the post-merge confirmation step
16
- * (`single-story-confirm-merge.js`, invoked by the CI-watch loop in
17
- * `single-story-deliver.md` Step 5). This module owns the close-entry
18
- * `agent::closing` flip + the `story-closing` notify; the `agent::done`
19
- * flip + the `story-merged` notify live in `./confirm-merge.js`.
20
- *
21
- * Both the label flip and the notify dispatch are best-effort: failures
22
- * are logged and swallowed so neither a flaky GitHub API nor a flaky
23
- * webhook ever fails the close.
3
+ * state, `agent::closing`, and fire the `story-closing` notify. The issue
4
+ * stays open until confirm-merge.js sees the merge, because auto-merge lands
5
+ * asynchronously and the PR can still fail. Both steps are best-effort:
6
+ * failures are logged and swallowed, never failing the close.
24
7
  */
25
8
 
26
9
  import { notify as defaultNotify } from '../../notify.js';
@@ -63,34 +46,10 @@ export async function flipLabelAndNotify({
63
46
 
64
47
  async function flipLabel(provider, storyId, story, progress, config) {
65
48
  try {
66
- // Story #3385 — flip to `agent::closing`, NOT `agent::done`. The
67
- // canonical mutator (`transitionTicketState`) only closes the GitHub
68
- // issue (`state: 'closed'`, `state_reason: 'completed'`) on a
69
- // transition to `agent::done`; flipping to `agent::closing` leaves the
70
- // issue OPEN, which is exactly the rest state the standalone path must
71
- // hold while the PR is open with auto-merge armed.
72
- //
73
- // Route through the canonical state mutator so the Projects v2 Status
74
- // column mirrors the `agent::closing` flip (Story #2548 wires
75
- // column-sync inside `transitionTicketState`). Threading the
76
- // prefetched `story` as `ticketSnapshot` preserves the round-trip
77
- // elimination from Story #1795.
78
- //
79
- // Cascade is left at the default (true) so Stories that have a parent
80
- // Feature (e.g. an Epic-parented Story closed via the standalone path)
81
- // propagate the `agent::closing` state upward. For truly standalone
82
- // Stories with no parent the cascade short-circuits immediately via
83
- // the provider-capability guard in `cascadeParentState`, so there is
84
- // no extra cost.
85
- //
86
- // We deliberately omit `notify` here: the `state-transition`
87
- // notification that `transitionTicketState` would dispatch is
88
- // redundant with the typed `story-closing` event that
89
- // `fireStoryClosingNotify` emits immediately afterwards.
90
- //
91
- // `config` is threaded so the on-disk board-metadata cache (issue #4555)
92
- // lands under the project's configured `tempRoot` rather than the
93
- // framework default, matching every other transition call site.
49
+ // Only an `agent::done` transition closes the issue, so this leaves it
50
+ // open. The canonical mutator also syncs the board column and cascades
51
+ // to any parent. `notify` is omitted: the typed `story-closing` event
52
+ // below supersedes the generic state-transition one.
94
53
  await transitionTicketState(provider, storyId, STATE_LABELS.CLOSING, {
95
54
  ticketSnapshot: story,
96
55
  config,
@@ -1,35 +1,17 @@
1
1
  /**
2
2
  * single-story-sweep/protection-ctx.js
3
3
  *
4
- * Shared builder for the `evaluateProtection` context the boot-sweep
5
- * engine ([`sweepMergedBranches`](../single-story-sweep.js)) threads into
6
- * every candidate protection check. Single-homed here so the three boot
7
- * callers — `single-story-init.js` and the
8
- * `boot-sweep.js` CLI — build an identical ctx instead of each re-wiring
9
- * the git/gh/ticket ports.
10
- *
11
- * Story #2990: the sweep protection-ctx `ghRunner` stays on raw
12
- * `spawnSync('gh', …)` (not the `lib/gh-exec.js` async facade) because
13
- * `executeCleanup` invokes the protection checks inside a synchronous
14
- * candidate-filter loop. The runner contract is the legacy
15
- * `(args, opts) => stdout string` shape.
4
+ * The one builder of the `evaluateProtection` ctx for every sweep caller.
5
+ * `ghRunner` stays on synchronous `spawnSync` (not the async gh-exec facade)
6
+ * because the checks run inside a synchronous candidate-filter loop.
16
7
  */
17
8
 
18
9
  import { spawnSync as defaultSpawnSync } from 'node:child_process';
19
10
  import { gitSpawn } from '../git-utils.js';
20
11
 
21
12
  /**
22
- * Build the synchronous `gh` runner the sweep uses for its
23
- * candidate-protection checks.
24
- *
25
- * Story #4073: the `spawnImpl` seam injects the `spawnSync` boundary so
26
- * the runner's success/error handling can be unit-tested without a live
27
- * `gh` binary. It defaults to `child_process.spawnSync`, so the
28
- * production CLI path is unchanged.
29
- *
30
13
  * @param {string} cwd Repo root used as the default spawn cwd.
31
- * @param {typeof defaultSpawnSync} [spawnImpl] Injectable spawn boundary —
32
- * defaults to `child_process.spawnSync`.
14
+ * @param {typeof defaultSpawnSync} [spawnImpl]
33
15
  * @returns {(args: string[], opts?: { cwd?: string }) => string}
34
16
  */
35
17
  export function makeGhRunner(cwd, spawnImpl = defaultSpawnSync) {
@@ -49,10 +31,6 @@ export function makeGhRunner(cwd, spawnImpl = defaultSpawnSync) {
49
31
  }
50
32
 
51
33
  /**
52
- * Build the `evaluateProtection` ctx bag: the repo root, the `gitSpawn`
53
- * port, the synchronous `gh` runner, and a `getTicket` port bound to the
54
- * supplied provider.
55
- *
56
34
  * @param {{
57
35
  * cwd: string,
58
36
  * provider: { getTicket: (id: number) => Promise<object> },