mandrel 2.59.0 → 2.61.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (678) hide show
  1. package/.agents/README.md +21 -19
  2. package/.agents/agents/acceptance-critic.md +24 -43
  3. package/.agents/agents/story-worker.md +20 -21
  4. package/.agents/docs/agentrc-reference.json +5 -84
  5. package/.agents/docs/configuration.md +48 -132
  6. package/.agents/docs/workflows.md +2 -2
  7. package/.agents/instructions.md +5 -8
  8. package/.agents/rules/ci-remediation.md +41 -8
  9. package/.agents/rules/gherkin-standards.md +4 -0
  10. package/.agents/schemas/acceptance-eval-verdict.schema.json +1 -1
  11. package/.agents/schemas/agentrc.schema.json +16 -496
  12. package/.agents/schemas/story-deliver-terminal.schema.json +13 -3
  13. package/.agents/schemas/validation-evidence.schema.json +2 -1
  14. package/.agents/scripts/README.md +23 -13
  15. package/.agents/scripts/acceptance-eval.js +35 -169
  16. package/.agents/scripts/agents-bootstrap-github.js +27 -129
  17. package/.agents/scripts/apply-quality-bootstrap.js +4 -40
  18. package/.agents/scripts/audit-baselines.js +6 -27
  19. package/.agents/scripts/audit-labels-bootstrap.js +5 -29
  20. package/.agents/scripts/audit-to-stories.js +91 -361
  21. package/.agents/scripts/boot-sweep.js +19 -72
  22. package/.agents/scripts/bootstrap.js +74 -395
  23. package/.agents/scripts/ceremony-derive.js +10 -41
  24. package/.agents/scripts/check-arch-cycles.js +14 -64
  25. package/.agents/scripts/check-baselines.js +8 -48
  26. package/.agents/scripts/check-context-budget.js +105 -311
  27. package/.agents/scripts/check-cyclomatic.js +12 -44
  28. package/.agents/scripts/check-dead-exports.js +13 -64
  29. package/.agents/scripts/check-doc-links.js +38 -186
  30. package/.agents/scripts/check-gherkin-corpus.js +24 -127
  31. package/.agents/scripts/check-test-temp-hygiene.js +28 -169
  32. package/.agents/scripts/coverage-capture.js +34 -98
  33. package/.agents/scripts/deliver-light.js +25 -171
  34. package/.agents/scripts/deliver-recover.js +6 -42
  35. package/.agents/scripts/deliver-run.js +534 -0
  36. package/.agents/scripts/diagnose-friction.js +24 -116
  37. package/.agents/scripts/drain-pending-cleanup.js +1 -1
  38. package/.agents/scripts/evidence-gate.js +23 -85
  39. package/.agents/scripts/file-ci-gap.js +57 -49
  40. package/.agents/scripts/generate-config-docs.js +30 -170
  41. package/.agents/scripts/generate-lens-checklists.js +8 -52
  42. package/.agents/scripts/generate-skills-index.js +14 -112
  43. package/.agents/scripts/generate-workflows-doc.js +10 -70
  44. package/.agents/scripts/git-cleanup.js +2 -34
  45. package/.agents/scripts/lib/Graph.js +24 -81
  46. package/.agents/scripts/lib/ITicketingProvider.js +47 -143
  47. package/.agents/scripts/lib/Logger.js +14 -76
  48. package/.agents/scripts/lib/audit-baselines/engine.js +11 -31
  49. package/.agents/scripts/lib/audit-baselines/gate-surface.js +3 -17
  50. package/.agents/scripts/lib/audit-baselines/headroom.js +4 -20
  51. package/.agents/scripts/lib/audit-baselines/hotspots.js +3 -15
  52. package/.agents/scripts/lib/audit-baselines/kinds.js +23 -89
  53. package/.agents/scripts/lib/audit-baselines/outliers.js +6 -23
  54. package/.agents/scripts/lib/audit-baselines/read.js +3 -16
  55. package/.agents/scripts/lib/audit-baselines/staleness.js +7 -26
  56. package/.agents/scripts/lib/audit-baselines/surface-entry.js +7 -28
  57. package/.agents/scripts/lib/audit-baselines/trend.js +7 -20
  58. package/.agents/scripts/lib/audit-baselines/weights.js +9 -37
  59. package/.agents/scripts/lib/audit-suite/audit-rules-reader.js +3 -18
  60. package/.agents/scripts/lib/audit-suite/checklist-threading.js +26 -124
  61. package/.agents/scripts/lib/audit-suite/dispatch-checklist.js +14 -45
  62. package/.agents/scripts/lib/audit-suite/findings.js +12 -52
  63. package/.agents/scripts/lib/audit-suite/frontmatter.js +5 -29
  64. package/.agents/scripts/lib/audit-suite/index.js +1 -15
  65. package/.agents/scripts/lib/audit-suite/lens-checklist.js +10 -45
  66. package/.agents/scripts/lib/audit-suite/lens-diff-floor.js +11 -76
  67. package/.agents/scripts/lib/audit-suite/runner.js +13 -43
  68. package/.agents/scripts/lib/audit-suite/selector.js +49 -349
  69. package/.agents/scripts/lib/audit-suite/substitutions.js +12 -40
  70. package/.agents/scripts/lib/audit-suite/workflow-loader.js +3 -15
  71. package/.agents/scripts/lib/audit-to-stories/audit-label-taxonomy.js +11 -73
  72. package/.agents/scripts/lib/audit-to-stories/audit-lenses.js +8 -37
  73. package/.agents/scripts/lib/audit-to-stories/build-story-body.js +25 -143
  74. package/.agents/scripts/lib/audit-to-stories/dedupe-against-github.js +14 -80
  75. package/.agents/scripts/lib/audit-to-stories/epic-grouping-directive.js +4 -18
  76. package/.agents/scripts/lib/audit-to-stories/finding-adapter.js +7 -40
  77. package/.agents/scripts/lib/audit-to-stories/group-findings.js +9 -39
  78. package/.agents/scripts/lib/audit-to-stories/issue-corpus.js +10 -66
  79. package/.agents/scripts/lib/audit-to-stories/issue-index.js +6 -30
  80. package/.agents/scripts/lib/audit-to-stories/issues-file.js +6 -36
  81. package/.agents/scripts/lib/audit-to-stories/ledger-commit.js +17 -69
  82. package/.agents/scripts/lib/audit-to-stories/ledger-pr.js +17 -85
  83. package/.agents/scripts/lib/audit-to-stories/ledger-record.js +10 -48
  84. package/.agents/scripts/lib/audit-to-stories/parse-audit-md.js +38 -146
  85. package/.agents/scripts/lib/audit-to-stories/seed-from-findings.js +7 -42
  86. package/.agents/scripts/lib/audit-to-stories/wire-dependencies.js +10 -57
  87. package/.agents/scripts/lib/baseline-loader.js +12 -51
  88. package/.agents/scripts/lib/baseline-schema-registry.js +5 -22
  89. package/.agents/scripts/lib/baselines/component-matcher.js +3 -12
  90. package/.agents/scripts/lib/baselines/components.js +10 -61
  91. package/.agents/scripts/lib/baselines/coverage-updater-cli.js +7 -36
  92. package/.agents/scripts/lib/baselines/crap-preview-incremental.js +7 -19
  93. package/.agents/scripts/lib/baselines/crap-preview-scan.js +19 -45
  94. package/.agents/scripts/lib/baselines/crap-updater-cli.js +16 -65
  95. package/.agents/scripts/lib/baselines/diff-scope-cli.js +5 -33
  96. package/.agents/scripts/lib/baselines/duplication-scanner.js +11 -60
  97. package/.agents/scripts/lib/baselines/env-overrides.js +12 -67
  98. package/.agents/scripts/lib/baselines/envelope.js +13 -129
  99. package/.agents/scripts/lib/baselines/exit-codes.js +6 -49
  100. package/.agents/scripts/lib/baselines/git-base.js +23 -142
  101. package/.agents/scripts/lib/baselines/kernel.js +11 -111
  102. package/.agents/scripts/lib/baselines/kinds/_crap-new-method-gate.js +9 -47
  103. package/.agents/scripts/lib/baselines/kinds/_crap-read.js +8 -51
  104. package/.agents/scripts/lib/baselines/kinds/_shared-metric.js +7 -62
  105. package/.agents/scripts/lib/baselines/kinds/bundle-size.js +8 -29
  106. package/.agents/scripts/lib/baselines/kinds/coverage.js +3 -15
  107. package/.agents/scripts/lib/baselines/kinds/crap.js +94 -415
  108. package/.agents/scripts/lib/baselines/kinds/duplication.js +4 -30
  109. package/.agents/scripts/lib/baselines/kinds/kind-factory.js +7 -53
  110. package/.agents/scripts/lib/baselines/kinds/maintainability.js +15 -80
  111. package/.agents/scripts/lib/baselines/kinds/mutation.js +12 -72
  112. package/.agents/scripts/lib/baselines/maintainability-baseline-io.js +4 -11
  113. package/.agents/scripts/lib/baselines/merge-envelopes.js +30 -146
  114. package/.agents/scripts/lib/baselines/path-canon.js +19 -128
  115. package/.agents/scripts/lib/baselines/preview-gates.js +8 -37
  116. package/.agents/scripts/lib/baselines/reader.js +14 -107
  117. package/.agents/scripts/lib/baselines/refresh-service.js +35 -252
  118. package/.agents/scripts/lib/baselines/scope.js +11 -135
  119. package/.agents/scripts/lib/baselines/writer.js +16 -149
  120. package/.agents/scripts/lib/bdd-runner-detect.js +18 -113
  121. package/.agents/scripts/lib/bdd-scenario-budget.js +9 -36
  122. package/.agents/scripts/lib/bdd-scenario-scanner.js +11 -73
  123. package/.agents/scripts/lib/bdd-step-index.js +26 -100
  124. package/.agents/scripts/lib/bootstrap/baseline-merge-driver.js +23 -103
  125. package/.agents/scripts/lib/bootstrap/branch-protection.js +2 -5
  126. package/.agents/scripts/lib/bootstrap/commit-push.js +12 -50
  127. package/.agents/scripts/lib/bootstrap/gh-preflight.js +14 -101
  128. package/.agents/scripts/lib/bootstrap/hitl-confirm.js +5 -30
  129. package/.agents/scripts/lib/bootstrap/install-ledger.js +17 -73
  130. package/.agents/scripts/lib/bootstrap/issue-forms-template.js +17 -121
  131. package/.agents/scripts/lib/bootstrap/manifest.js +15 -86
  132. package/.agents/scripts/lib/bootstrap/merge-methods.js +4 -33
  133. package/.agents/scripts/lib/bootstrap/preflight.js +12 -61
  134. package/.agents/scripts/lib/bootstrap/project-bootstrap.js +34 -235
  135. package/.agents/scripts/lib/bootstrap/prompt.js +21 -129
  136. package/.agents/scripts/lib/bootstrap/quality-bootstrap.js +27 -141
  137. package/.agents/scripts/lib/bootstrap/summary.js +1 -8
  138. package/.agents/scripts/lib/bootstrap/workflow-audit.js +11 -84
  139. package/.agents/scripts/lib/branch-name-guard.js +4 -23
  140. package/.agents/scripts/lib/changed-files.js +39 -121
  141. package/.agents/scripts/lib/checks/core-bare-clean.js +4 -24
  142. package/.agents/scripts/lib/checks/index.js +18 -101
  143. package/.agents/scripts/lib/checks/loop-health.js +11 -53
  144. package/.agents/scripts/lib/checks/state.js +16 -91
  145. package/.agents/scripts/lib/checks/story-init-not-backgrounded.js +10 -61
  146. package/.agents/scripts/lib/checks/subagent-agent-tool-required.js +14 -83
  147. package/.agents/scripts/lib/child-exec.js +39 -108
  148. package/.agents/scripts/lib/cli/standard-args.js +9 -116
  149. package/.agents/scripts/lib/cli-args.js +31 -146
  150. package/.agents/scripts/lib/cli-usage.js +5 -27
  151. package/.agents/scripts/lib/cli-utils.js +2 -12
  152. package/.agents/scripts/lib/close-validation/commands.js +13 -76
  153. package/.agents/scripts/lib/close-validation/gates.js +92 -331
  154. package/.agents/scripts/lib/close-validation/process.js +121 -151
  155. package/.agents/scripts/lib/close-validation/projections/advisories.js +5 -31
  156. package/.agents/scripts/lib/close-validation/projections/crap.js +19 -67
  157. package/.agents/scripts/lib/close-validation/projections/head-sha.js +1 -17
  158. package/.agents/scripts/lib/close-validation/projections/inputs.js +4 -34
  159. package/.agents/scripts/lib/close-validation/projections/maintainability.js +11 -58
  160. package/.agents/scripts/lib/close-validation/runner.js +53 -110
  161. package/.agents/scripts/lib/command-header.js +6 -28
  162. package/.agents/scripts/lib/config/acceptance-eval.js +4 -30
  163. package/.agents/scripts/lib/config/baselines.js +3 -14
  164. package/.agents/scripts/lib/config/ci.js +8 -38
  165. package/.agents/scripts/lib/config/commands.js +1 -15
  166. package/.agents/scripts/lib/config/defaults.js +4 -33
  167. package/.agents/scripts/lib/config/delivery-routing.js +6 -34
  168. package/.agents/scripts/lib/config/explain.js +10 -83
  169. package/.agents/scripts/lib/config/gates/coverage.schema.js +0 -12
  170. package/.agents/scripts/lib/config/gates/crap-incremental-coverage.schema.js +3 -31
  171. package/.agents/scripts/lib/config/gates/crap.schema.js +1 -34
  172. package/.agents/scripts/lib/config/gates/duplication.schema.js +1 -8
  173. package/.agents/scripts/lib/config/gates/index.js +2 -17
  174. package/.agents/scripts/lib/config/gates/maintainability.schema.js +1 -20
  175. package/.agents/scripts/lib/config/gates/mutation.schema.js +1 -7
  176. package/.agents/scripts/lib/config/gates/shared.js +4 -64
  177. package/.agents/scripts/lib/config/github.js +4 -22
  178. package/.agents/scripts/lib/config/limits.js +4 -57
  179. package/.agents/scripts/lib/config/paths.js +2 -21
  180. package/.agents/scripts/lib/config/qa.js +4 -38
  181. package/.agents/scripts/lib/config/quality.js +76 -432
  182. package/.agents/scripts/lib/config/runners.js +12 -56
  183. package/.agents/scripts/lib/config/runtime.js +13 -57
  184. package/.agents/scripts/lib/config/shared.js +2 -16
  185. package/.agents/scripts/lib/config/sync-agentrc.js +9 -50
  186. package/.agents/scripts/lib/config/temp-paths.js +40 -280
  187. package/.agents/scripts/lib/config/validate-orchestration.js +5 -17
  188. package/.agents/scripts/lib/config/worktree-isolation.js +9 -28
  189. package/.agents/scripts/lib/config-resolver.js +11 -52
  190. package/.agents/scripts/lib/config-schema-shared.js +1 -4
  191. package/.agents/scripts/lib/config-settings-schema-delivery.js +16 -291
  192. package/.agents/scripts/lib/config-settings-schema-quality.js +7 -219
  193. package/.agents/scripts/lib/config-settings-schema.js +37 -274
  194. package/.agents/scripts/lib/coverage-baseline.js +20 -110
  195. package/.agents/scripts/lib/coverage-capture-fullscope.js +18 -35
  196. package/.agents/scripts/lib/coverage-capture-incremental.js +15 -45
  197. package/.agents/scripts/lib/coverage-capture-usage.js +8 -25
  198. package/.agents/scripts/lib/coverage-capture.js +99 -224
  199. package/.agents/scripts/lib/coverage-utils.js +14 -79
  200. package/.agents/scripts/lib/cpu-pool.js +17 -123
  201. package/.agents/scripts/lib/crap-baseline-join.js +16 -88
  202. package/.agents/scripts/lib/crap-coordinates.js +6 -25
  203. package/.agents/scripts/lib/crap-engine.js +40 -153
  204. package/.agents/scripts/lib/crap-method-identity.js +16 -78
  205. package/.agents/scripts/lib/crap-utils.js +31 -155
  206. package/.agents/scripts/lib/cyclomatic-ceiling.js +14 -87
  207. package/.agents/scripts/lib/cyclomatic-scope.js +10 -50
  208. package/.agents/scripts/lib/dead-exports-knip.js +18 -56
  209. package/.agents/scripts/lib/dead-exports-mode.js +5 -24
  210. package/.agents/scripts/lib/degraded-mode.js +3 -26
  211. package/.agents/scripts/lib/dependency-parser.js +8 -40
  212. package/.agents/scripts/lib/dependency-version.js +13 -35
  213. package/.agents/scripts/lib/detect-package-manager.js +6 -36
  214. package/.agents/scripts/lib/doc-tiers.js +22 -124
  215. package/.agents/scripts/lib/duplicate-search.js +8 -72
  216. package/.agents/scripts/lib/env-loader.js +5 -27
  217. package/.agents/scripts/lib/error-redactor.js +6 -31
  218. package/.agents/scripts/lib/errors/index.js +2 -22
  219. package/.agents/scripts/lib/escomplex-ast-compat.js +22 -163
  220. package/.agents/scripts/lib/escomplex-kernel.js +21 -123
  221. package/.agents/scripts/lib/feedback-loop/graduator-core.js +94 -419
  222. package/.agents/scripts/lib/feedback-loop/prior-feedback-fetcher.js +20 -98
  223. package/.agents/scripts/lib/feedback-loop/retro-proposals-graduator.js +27 -149
  224. package/.agents/scripts/lib/findings/audit-ledger.js +23 -97
  225. package/.agents/scripts/lib/findings/classify-finding.js +14 -69
  226. package/.agents/scripts/lib/findings/promote-finding.js +14 -112
  227. package/.agents/scripts/lib/findings/provenance-field.js +11 -52
  228. package/.agents/scripts/lib/findings/route-finding.js +37 -255
  229. package/.agents/scripts/lib/findings/semantic-issue-search.js +14 -59
  230. package/.agents/scripts/lib/findings/severity.js +18 -104
  231. package/.agents/scripts/lib/format-generated-json.js +12 -44
  232. package/.agents/scripts/lib/full-suite-lock.js +160 -429
  233. package/.agents/scripts/lib/full-suite-queue.js +213 -0
  234. package/.agents/scripts/lib/gates/baseline-store.js +5 -9
  235. package/.agents/scripts/lib/gates/friction.js +1 -3
  236. package/.agents/scripts/lib/generated/agentrc-validator.js +2 -2
  237. package/.agents/scripts/lib/gh-exec.js +123 -191
  238. package/.agents/scripts/lib/git/cached-fetch.js +9 -52
  239. package/.agents/scripts/lib/git/sync-from-base.js +15 -107
  240. package/.agents/scripts/lib/git-branch-cleanup.js +14 -61
  241. package/.agents/scripts/lib/git-branch-lifecycle.js +16 -87
  242. package/.agents/scripts/lib/git-utils.js +37 -161
  243. package/.agents/scripts/lib/github/framework-repo.js +8 -71
  244. package/.agents/scripts/lib/github-url.js +2 -17
  245. package/.agents/scripts/lib/import-graph.js +11 -38
  246. package/.agents/scripts/lib/install-cmd-parser.js +4 -13
  247. package/.agents/scripts/lib/json-utils.js +3 -18
  248. package/.agents/scripts/lib/label-constants.js +16 -111
  249. package/.agents/scripts/lib/label-taxonomy.js +4 -30
  250. package/.agents/scripts/lib/maintainability-engine.js +12 -80
  251. package/.agents/scripts/lib/maintainability-unscorable.js +5 -25
  252. package/.agents/scripts/lib/maintainability-utils.js +16 -92
  253. package/.agents/scripts/lib/mandrel-catalog.js +12 -70
  254. package/.agents/scripts/lib/notifications/notifier.js +13 -38
  255. package/.agents/scripts/lib/npm-scripts.js +4 -23
  256. package/.agents/scripts/lib/observability/metrics-ledger.js +16 -76
  257. package/.agents/scripts/lib/observability/runtime-friction.js +44 -286
  258. package/.agents/scripts/lib/observability/signal-validator.js +5 -37
  259. package/.agents/scripts/lib/observability/signals-writer.js +11 -121
  260. package/.agents/scripts/lib/observability/source-classifier.js +22 -203
  261. package/.agents/scripts/lib/observability/terse-result.js +14 -47
  262. package/.agents/scripts/lib/onboard/init-tail.js +13 -74
  263. package/.agents/scripts/lib/onboard/scaffold-docs.js +11 -34
  264. package/.agents/scripts/lib/orchestration/acceptance-eval-decision.js +25 -139
  265. package/.agents/scripts/lib/orchestration/auto-merge-cwd.js +11 -66
  266. package/.agents/scripts/lib/orchestration/behind-recovery.js +10 -55
  267. package/.agents/scripts/lib/orchestration/ceremony-routing.js +28 -156
  268. package/.agents/scripts/lib/orchestration/change-set.js +7 -36
  269. package/.agents/scripts/lib/orchestration/check-baselines/phases/compare.js +9 -46
  270. package/.agents/scripts/lib/orchestration/check-baselines/phases/evaluate.js +11 -44
  271. package/.agents/scripts/lib/orchestration/check-baselines/phases/floors.js +5 -24
  272. package/.agents/scripts/lib/orchestration/check-baselines/phases/friction.js +3 -12
  273. package/.agents/scripts/lib/orchestration/check-baselines/phases/parse-args.js +5 -38
  274. package/.agents/scripts/lib/orchestration/check-baselines/phases/pipeline.js +3 -8
  275. package/.agents/scripts/lib/orchestration/check-baselines/phases/refresh-ack.js +28 -136
  276. package/.agents/scripts/lib/orchestration/check-baselines/phases/report.js +3 -13
  277. package/.agents/scripts/lib/orchestration/check-state.js +92 -0
  278. package/.agents/scripts/lib/orchestration/ci-gap-intake.js +37 -144
  279. package/.agents/scripts/lib/orchestration/ci-rerun-guard.js +121 -157
  280. package/.agents/scripts/lib/orchestration/code-review.js +24 -128
  281. package/.agents/scripts/lib/orchestration/column-sync.js +23 -111
  282. package/.agents/scripts/lib/orchestration/complexity-gate.js +118 -462
  283. package/.agents/scripts/lib/orchestration/deliver-recover.js +36 -168
  284. package/.agents/scripts/lib/orchestration/dependency-analyzer.js +4 -35
  285. package/.agents/scripts/lib/orchestration/dependency-candidates.js +9 -41
  286. package/.agents/scripts/lib/orchestration/diff-magnitude.js +25 -115
  287. package/.agents/scripts/lib/orchestration/doc-reader.js +2 -6
  288. package/.agents/scripts/lib/orchestration/docs-digest.js +13 -51
  289. package/.agents/scripts/lib/orchestration/epic-candidates.js +13 -53
  290. package/.agents/scripts/lib/orchestration/epic-checklist.js +9 -33
  291. package/.agents/scripts/lib/orchestration/epic-container.js +41 -167
  292. package/.agents/scripts/lib/orchestration/epic-expansion.js +10 -40
  293. package/.agents/scripts/lib/orchestration/epic-rollup.js +55 -207
  294. package/.agents/scripts/lib/orchestration/file-assumption-enum.js +2 -22
  295. package/.agents/scripts/lib/orchestration/file-assumptions.js +45 -253
  296. package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-detect.js +9 -46
  297. package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-reap.js +7 -57
  298. package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches.js +21 -126
  299. package/.agents/scripts/lib/orchestration/git-cleanup/phases/cli.js +2 -6
  300. package/.agents/scripts/lib/orchestration/git-cleanup/phases/fast-forward.js +1 -4
  301. package/.agents/scripts/lib/orchestration/git-cleanup/phases/filters.js +1 -5
  302. package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes-ff.js +9 -34
  303. package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes.js +41 -190
  304. package/.agents/scripts/lib/orchestration/git-cleanup/phases/merged-tip.js +9 -45
  305. package/.agents/scripts/lib/orchestration/git-cleanup/phases/parse-args.js +1 -4
  306. package/.agents/scripts/lib/orchestration/git-cleanup/phases/phase-drivers.js +19 -85
  307. package/.agents/scripts/lib/orchestration/git-cleanup/phases/prompts.js +3 -17
  308. package/.agents/scripts/lib/orchestration/git-cleanup/phases/prune.js +1 -5
  309. package/.agents/scripts/lib/orchestration/git-cleanup/phases/render.js +16 -100
  310. package/.agents/scripts/lib/orchestration/git-cleanup/phases/stashes.js +1 -4
  311. package/.agents/scripts/lib/orchestration/lease-guard-shared.js +16 -67
  312. package/.agents/scripts/lib/orchestration/lifecycle/emit-ledger-event.js +9 -33
  313. package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-flip-failed.js +8 -29
  314. package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-unlanded.js +15 -68
  315. package/.agents/scripts/lib/orchestration/light-backstop.js +11 -49
  316. package/.agents/scripts/lib/orchestration/light-escalation.js +21 -89
  317. package/.agents/scripts/lib/orchestration/light-suitability.js +37 -307
  318. package/.agents/scripts/lib/orchestration/merge-block-class.js +39 -216
  319. package/.agents/scripts/lib/orchestration/merge-poll.js +104 -377
  320. package/.agents/scripts/lib/orchestration/pinned-identifier-lint.js +17 -57
  321. package/.agents/scripts/lib/orchestration/plan-context.js +55 -318
  322. package/.agents/scripts/lib/orchestration/plan-critic-conditions.js +22 -79
  323. package/.agents/scripts/lib/orchestration/plan-critics-evaluate.js +5 -31
  324. package/.agents/scripts/lib/orchestration/plan-metrics.js +29 -108
  325. package/.agents/scripts/lib/orchestration/plan-navigation.js +8 -27
  326. package/.agents/scripts/lib/orchestration/plan-persist/acceptance-handle-repair.js +12 -49
  327. package/.agents/scripts/lib/orchestration/plan-persist/audit-provenance.js +18 -73
  328. package/.agents/scripts/lib/orchestration/plan-persist/changes-repair.js +16 -78
  329. package/.agents/scripts/lib/orchestration/plan-persist/cross-plan-links.js +6 -30
  330. package/.agents/scripts/lib/orchestration/plan-persist/epic-adoption.js +14 -65
  331. package/.agents/scripts/lib/orchestration/plan-persist/epic-ops.js +21 -76
  332. package/.agents/scripts/lib/orchestration/plan-persist/external-deps.js +6 -43
  333. package/.agents/scripts/lib/orchestration/plan-persist/persist-helpers.js +14 -68
  334. package/.agents/scripts/lib/orchestration/plan-persist/plan-context-source.js +9 -41
  335. package/.agents/scripts/lib/orchestration/plan-persist/run-plan-persist.js +71 -289
  336. package/.agents/scripts/lib/orchestration/plan-persist/soft-findings.js +2 -12
  337. package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +96 -362
  338. package/.agents/scripts/lib/orchestration/plan-persist/summary.js +9 -39
  339. package/.agents/scripts/lib/orchestration/plan-persist/supersede-ops.js +60 -186
  340. package/.agents/scripts/lib/orchestration/plan-persist/wave-collision-gate.js +9 -49
  341. package/.agents/scripts/lib/orchestration/plan-persist/wave-serialisation.js +7 -28
  342. package/.agents/scripts/lib/orchestration/plan-reachability.js +13 -42
  343. package/.agents/scripts/lib/orchestration/plan-run-labels/reap.js +16 -91
  344. package/.agents/scripts/lib/orchestration/plan-runner/worktree-sweep.js +16 -54
  345. package/.agents/scripts/lib/orchestration/plan-text-hygiene.js +10 -52
  346. package/.agents/scripts/lib/orchestration/planning/authoring-context.js +14 -109
  347. package/.agents/scripts/lib/orchestration/planning/memory-pool-advisory.js +11 -83
  348. package/.agents/scripts/lib/orchestration/pr-watch.js +48 -306
  349. package/.agents/scripts/lib/orchestration/project-meta-cache.js +15 -80
  350. package/.agents/scripts/lib/orchestration/project-meta-resolver.js +10 -51
  351. package/.agents/scripts/lib/orchestration/reassert-status-column.js +12 -76
  352. package/.agents/scripts/lib/orchestration/remote-verifier.js +12 -36
  353. package/.agents/scripts/lib/orchestration/resolve-stories.js +33 -164
  354. package/.agents/scripts/lib/orchestration/retro-proposals.js +66 -361
  355. package/.agents/scripts/lib/orchestration/review-base-ref.js +9 -43
  356. package/.agents/scripts/lib/orchestration/review-depth.js +12 -91
  357. package/.agents/scripts/lib/orchestration/review-providers/codex.js +10 -111
  358. package/.agents/scripts/lib/orchestration/review-providers/degraded-gates.js +13 -71
  359. package/.agents/scripts/lib/orchestration/review-providers/findings-renderer.js +7 -51
  360. package/.agents/scripts/lib/orchestration/review-providers/mi-exemptions.js +8 -53
  361. package/.agents/scripts/lib/orchestration/review-providers/native.js +30 -214
  362. package/.agents/scripts/lib/orchestration/review-providers/parse-findings.js +7 -52
  363. package/.agents/scripts/lib/orchestration/review-providers/review-depth.js +4 -33
  364. package/.agents/scripts/lib/orchestration/review-providers/review-provider-factory.js +11 -71
  365. package/.agents/scripts/lib/orchestration/review-providers/scoped-lint.js +19 -131
  366. package/.agents/scripts/lib/orchestration/review-providers/security-review.js +6 -89
  367. package/.agents/scripts/lib/orchestration/review-providers/types.js +26 -56
  368. package/.agents/scripts/lib/orchestration/review-providers/ultrareview.js +3 -46
  369. package/.agents/scripts/lib/orchestration/run-epilogue.js +245 -326
  370. package/.agents/scripts/lib/orchestration/run-scoped-config.js +55 -159
  371. package/.agents/scripts/lib/orchestration/single-story-close/close-note.js +7 -34
  372. package/.agents/scripts/lib/orchestration/single-story-close/failed-terminal.js +16 -89
  373. package/.agents/scripts/lib/orchestration/single-story-close/gate-log.js +18 -109
  374. package/.agents/scripts/lib/orchestration/single-story-close/phases/auto-merge.js +83 -239
  375. package/.agents/scripts/lib/orchestration/single-story-close/phases/base-sync.js +20 -82
  376. package/.agents/scripts/lib/orchestration/single-story-close/phases/close-validation.js +103 -97
  377. package/.agents/scripts/lib/orchestration/single-story-close/phases/code-review.js +8 -64
  378. package/.agents/scripts/lib/orchestration/single-story-close/phases/confirm-merge.js +136 -486
  379. package/.agents/scripts/lib/orchestration/single-story-close/phases/conventional-subject.js +30 -134
  380. package/.agents/scripts/lib/orchestration/single-story-close/phases/graphql-preflight.js +96 -0
  381. package/.agents/scripts/lib/orchestration/single-story-close/phases/lock-wait-pending.js +49 -0
  382. package/.agents/scripts/lib/orchestration/single-story-close/phases/normalize-pr-title.js +13 -86
  383. package/.agents/scripts/lib/orchestration/single-story-close/phases/options.js +20 -95
  384. package/.agents/scripts/lib/orchestration/single-story-close/phases/post-land.js +46 -203
  385. package/.agents/scripts/lib/orchestration/single-story-close/phases/pre-gate-steps.js +8 -50
  386. package/.agents/scripts/lib/orchestration/single-story-close/phases/pull-request.js +12 -83
  387. package/.agents/scripts/lib/orchestration/single-story-close/phases/push.js +6 -39
  388. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-block.js +1 -6
  389. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-outcome.js +4 -28
  390. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-override.js +6 -51
  391. package/.agents/scripts/lib/orchestration/single-story-close/phases/worktree-reap.js +6 -34
  392. package/.agents/scripts/lib/orchestration/single-story-close/phases/wrong-tree-guard.js +23 -121
  393. package/.agents/scripts/lib/orchestration/single-story-close/runner.js +180 -273
  394. package/.agents/scripts/lib/orchestration/single-story-lease-guard.js +15 -69
  395. package/.agents/scripts/lib/orchestration/story-body-gate.js +4 -23
  396. package/.agents/scripts/lib/orchestration/story-close/baseline-upward-writeback.js +50 -179
  397. package/.agents/scripts/lib/orchestration/story-close/context-budget-writeback.js +11 -41
  398. package/.agents/scripts/lib/orchestration/story-close/format-autofix.js +23 -311
  399. package/.agents/scripts/lib/orchestration/story-close/phases/local-lens-review.js +22 -147
  400. package/.agents/scripts/lib/orchestration/story-close/phases/review-core.js +16 -67
  401. package/.agents/scripts/lib/orchestration/story-deliver-terminal-schema.js +12 -68
  402. package/.agents/scripts/lib/orchestration/story-deliver-terminal.js +42 -200
  403. package/.agents/scripts/lib/orchestration/story-follow-ups.js +167 -252
  404. package/.agents/scripts/lib/orchestration/story-init-envelope.js +52 -0
  405. package/.agents/scripts/lib/orchestration/story-init-remote.js +2 -6
  406. package/.agents/scripts/lib/orchestration/story-reachability.js +3 -23
  407. package/.agents/scripts/lib/orchestration/task-body-validator.js +12 -135
  408. package/.agents/scripts/lib/orchestration/ticket-lease.js +28 -131
  409. package/.agents/scripts/lib/orchestration/ticket-validator-conflicts.js +15 -149
  410. package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +5 -33
  411. package/.agents/scripts/lib/orchestration/ticket-validator.js +63 -344
  412. package/.agents/scripts/lib/orchestration/ticketing/bulk.js +51 -244
  413. package/.agents/scripts/lib/orchestration/ticketing/reads.js +39 -261
  414. package/.agents/scripts/lib/orchestration/ticketing/state.js +14 -68
  415. package/.agents/scripts/lib/orchestration/ticketing/transition.js +46 -263
  416. package/.agents/scripts/lib/orchestration/ticketing.js +2 -26
  417. package/.agents/scripts/lib/orchestration/verify-credit.js +18 -79
  418. package/.agents/scripts/lib/orchestration/worktree-dirty.js +5 -30
  419. package/.agents/scripts/lib/path-security.js +3 -6
  420. package/.agents/scripts/lib/plan-phase-cleanup.js +9 -49
  421. package/.agents/scripts/lib/preflight-runner.js +13 -69
  422. package/.agents/scripts/lib/process-group.js +143 -0
  423. package/.agents/scripts/lib/project-root.js +2 -8
  424. package/.agents/scripts/lib/provider-factory.js +2 -25
  425. package/.agents/scripts/lib/qa/console-allowlist.js +10 -59
  426. package/.agents/scripts/lib/qa/qa-session.js +15 -69
  427. package/.agents/scripts/lib/qa/redact-evidence.js +18 -129
  428. package/.agents/scripts/lib/qa/resolve-qa-contract.js +26 -135
  429. package/.agents/scripts/lib/qa/resolve-selection.js +16 -84
  430. package/.agents/scripts/lib/reserved-test-ids.js +9 -47
  431. package/.agents/scripts/lib/runtime-deps/dep-resolution.js +13 -53
  432. package/.agents/scripts/lib/runtime-deps/ensure-installed.js +10 -44
  433. package/.agents/scripts/lib/runtime-deps/manifest.js +10 -30
  434. package/.agents/scripts/lib/runtime-deps/parser-major.js +15 -51
  435. package/.agents/scripts/lib/runtime-deps/preflight.js +4 -22
  436. package/.agents/scripts/lib/runtime-deps/scan-imports.js +11 -55
  437. package/.agents/scripts/lib/signals/detectors/common.js +12 -38
  438. package/.agents/scripts/lib/signals/index.js +2 -19
  439. package/.agents/scripts/lib/signals/schema.js +14 -109
  440. package/.agents/scripts/lib/signals/write.js +2 -11
  441. package/.agents/scripts/lib/single-story/confirm-merge.js +31 -72
  442. package/.agents/scripts/lib/single-story/story-merged-notify.js +8 -49
  443. package/.agents/scripts/lib/single-story-sweep/protection-ctx.js +4 -26
  444. package/.agents/scripts/lib/single-story-sweep/protection.js +13 -100
  445. package/.agents/scripts/lib/single-story-sweep/sweep-lock.js +60 -258
  446. package/.agents/scripts/lib/single-story-sweep.js +14 -97
  447. package/.agents/scripts/lib/skills/parse-skill.js +13 -59
  448. package/.agents/scripts/lib/skills/skills-index.js +8 -29
  449. package/.agents/scripts/lib/skills/walk-skill-files.js +17 -78
  450. package/.agents/scripts/lib/source-extensions.js +11 -42
  451. package/.agents/scripts/lib/source-text/strip-js-comments.js +8 -41
  452. package/.agents/scripts/lib/stdio-flush.js +9 -36
  453. package/.agents/scripts/lib/story-adjacency.js +8 -40
  454. package/.agents/scripts/lib/story-body/body-format-lints.js +51 -66
  455. package/.agents/scripts/lib/story-body/footer-block.js +11 -44
  456. package/.agents/scripts/lib/story-body/story-body.js +123 -344
  457. package/.agents/scripts/lib/temp-retention.js +42 -143
  458. package/.agents/scripts/lib/templates/decomposer-prompts.js +18 -80
  459. package/.agents/scripts/lib/test-env.js +12 -65
  460. package/.agents/scripts/lib/test-run-credit.js +10 -65
  461. package/.agents/scripts/lib/test-runner-contract.js +19 -74
  462. package/.agents/scripts/lib/test-temp.js +38 -184
  463. package/.agents/scripts/lib/test-tiers.js +12 -96
  464. package/.agents/scripts/lib/ticket-body-sections.js +21 -96
  465. package/.agents/scripts/lib/transpile.js +15 -74
  466. package/.agents/scripts/lib/util/concurrent-map.js +6 -25
  467. package/.agents/scripts/lib/util/parse-id-list.js +8 -34
  468. package/.agents/scripts/lib/util/poll-loop.js +8 -28
  469. package/.agents/scripts/lib/util/with-timeout.js +2 -11
  470. package/.agents/scripts/lib/validation-evidence.js +21 -96
  471. package/.agents/scripts/lib/wave-runner/footprint.js +17 -70
  472. package/.agents/scripts/lib/wave-runner/live-probe.js +67 -209
  473. package/.agents/scripts/lib/wave-runner/ready-set.js +72 -301
  474. package/.agents/scripts/lib/workers/crap-worker.js +11 -64
  475. package/.agents/scripts/lib/workers/maintainability-report-worker.js +8 -45
  476. package/.agents/scripts/lib/workers/maintainability-worker.js +5 -21
  477. package/.agents/scripts/lib/workers/serve-worker-messages.js +2 -18
  478. package/.agents/scripts/lib/workflow-closure.js +22 -105
  479. package/.agents/scripts/lib/workspace-provisioner.js +16 -54
  480. package/.agents/scripts/lib/worktree/git-hooks.js +15 -60
  481. package/.agents/scripts/lib/worktree/lifecycle/force-drain.js +20 -60
  482. package/.agents/scripts/lib/worktree/lifecycle/merge-reachability.js +10 -62
  483. package/.agents/scripts/lib/worktree/lifecycle/pending-cleanup.js +22 -86
  484. package/.agents/scripts/lib/worktree/lifecycle/reap.js +24 -126
  485. package/.agents/scripts/lib/worktree/lifecycle-manager.js +2 -20
  486. package/.agents/scripts/lib/worktree/node-modules-strategy.js +46 -180
  487. package/.agents/scripts/lib/worktree-manager.js +15 -40
  488. package/.agents/scripts/lint-issue-body.js +12 -68
  489. package/.agents/scripts/mandrel-update-preflight.js +10 -70
  490. package/.agents/scripts/merge-baseline.js +30 -105
  491. package/.agents/scripts/nav-registry-diff.js +22 -108
  492. package/.agents/scripts/notify.js +12 -69
  493. package/.agents/scripts/plan-context.js +97 -92
  494. package/.agents/scripts/plan-critics.js +12 -66
  495. package/.agents/scripts/plan-persist.js +71 -137
  496. package/.agents/scripts/plan-run-epilogue.js +20 -43
  497. package/.agents/scripts/pr-watch-with-update.js +79 -263
  498. package/.agents/scripts/providers/github/auth.js +3 -8
  499. package/.agents/scripts/providers/github/blocked-by-add.js +14 -61
  500. package/.agents/scripts/providers/github/board-add.js +5 -21
  501. package/.agents/scripts/providers/github/branch-protection.js +11 -43
  502. package/.agents/scripts/providers/github/cache.js +2 -14
  503. package/.agents/scripts/providers/github/comments.js +7 -40
  504. package/.agents/scripts/providers/github/compose.js +3 -19
  505. package/.agents/scripts/providers/github/errors.js +22 -125
  506. package/.agents/scripts/providers/github/issues.js +31 -123
  507. package/.agents/scripts/providers/github/labels.js +24 -124
  508. package/.agents/scripts/providers/github/mappers.js +5 -27
  509. package/.agents/scripts/providers/github/merge-methods.js +3 -22
  510. package/.agents/scripts/providers/github/project-board.js +2 -17
  511. package/.agents/scripts/providers/github/projects-v2-graphql.js +3 -6
  512. package/.agents/scripts/providers/github/request-helpers.js +5 -32
  513. package/.agents/scripts/providers/github/search-budget.js +9 -39
  514. package/.agents/scripts/providers/github/search-query.js +5 -26
  515. package/.agents/scripts/providers/github/sub-issue-add.js +15 -65
  516. package/.agents/scripts/providers/github/sub-issues.js +7 -36
  517. package/.agents/scripts/providers/github/tickets.js +32 -134
  518. package/.agents/scripts/providers/github.js +18 -59
  519. package/.agents/scripts/prune-plan-run-labels.js +12 -46
  520. package/.agents/scripts/quality-preview.js +35 -220
  521. package/.agents/scripts/resolve-doc-tiers.js +3 -26
  522. package/.agents/scripts/resolve-stories.js +16 -67
  523. package/.agents/scripts/resync-status-column.js +6 -25
  524. package/.agents/scripts/run-tests.js +29 -104
  525. package/.agents/scripts/single-story-close.js +23 -135
  526. package/.agents/scripts/single-story-confirm-merge.js +32 -139
  527. package/.agents/scripts/single-story-init.js +47 -259
  528. package/.agents/scripts/stories-wave-tick.js +179 -415
  529. package/.agents/scripts/sync-agentrc.js +3 -21
  530. package/.agents/scripts/sync-claude-agents.js +9 -55
  531. package/.agents/scripts/sync-claude-commands.js +20 -110
  532. package/.agents/scripts/test-wrapper.js +6 -43
  533. package/.agents/scripts/update-coverage-baseline.js +5 -22
  534. package/.agents/scripts/update-crap-baseline.js +7 -30
  535. package/.agents/scripts/update-duplication-baseline.js +16 -92
  536. package/.agents/scripts/update-maintainability-baseline.js +8 -62
  537. package/.agents/scripts/update-ticket-state.js +1 -7
  538. package/.agents/scripts/validate-skills.js +6 -26
  539. package/.agents/skills/core/gates-and-baselines/reference.md +0 -1
  540. package/.agents/skills/skills.index.json +2 -2
  541. package/.agents/skills/stack/qa/playwright/SKILL.md +26 -0
  542. package/.agents/templates/agent-protocol.md +2 -2
  543. package/.agents/templates/docs/audit-sweep-runbook.md +3 -4
  544. package/.agents/workflows/audit-accessibility.md +4 -7
  545. package/.agents/workflows/audit-adrs.md +3 -6
  546. package/.agents/workflows/audit-architecture.md +3 -11
  547. package/.agents/workflows/audit-baselines.md +6 -9
  548. package/.agents/workflows/audit-clean-code.md +8 -12
  549. package/.agents/workflows/audit-data-model.md +3 -7
  550. package/.agents/workflows/audit-dependencies.md +4 -7
  551. package/.agents/workflows/audit-devops.md +4 -8
  552. package/.agents/workflows/audit-documentation.md +1 -4
  553. package/.agents/workflows/audit-mobile.md +4 -7
  554. package/.agents/workflows/audit-navigability.md +3 -6
  555. package/.agents/workflows/audit-performance.md +2 -4
  556. package/.agents/workflows/audit-privacy.md +4 -7
  557. package/.agents/workflows/audit-quality.md +4 -7
  558. package/.agents/workflows/audit-security.md +4 -7
  559. package/.agents/workflows/audit-seo.md +4 -7
  560. package/.agents/workflows/audit-sre.md +4 -7
  561. package/.agents/workflows/audit-to-stories.md +17 -30
  562. package/.agents/workflows/audit-ux-ui.md +4 -7
  563. package/.agents/workflows/helpers/acceptance-self-eval.md +84 -157
  564. package/.agents/workflows/helpers/audit-lens-core.md +1 -1
  565. package/.agents/workflows/helpers/code-quality-guardrails.md +12 -15
  566. package/.agents/workflows/helpers/code-review.md +4 -2
  567. package/.agents/workflows/helpers/deliver-digest.md +37 -28
  568. package/.agents/workflows/helpers/deliver-light.md +92 -101
  569. package/.agents/workflows/helpers/deliver-reference.md +162 -220
  570. package/.agents/workflows/helpers/deliver-story-reference.md +197 -607
  571. package/.agents/workflows/helpers/deliver-story.md +17 -18
  572. package/.agents/workflows/helpers/plan-reference.md +125 -167
  573. package/.agents/workflows/helpers/qa-core.md +12 -0
  574. package/.agents/workflows/mandrel-deliver.md +47 -31
  575. package/.agents/workflows/mandrel-plan.md +22 -21
  576. package/.agents/workflows/mandrel-update.md +36 -21
  577. package/.agents/workflows/memory-consolidate.md +1 -1
  578. package/.agents/workflows/qa-assist.md +27 -71
  579. package/.agents/workflows/qa-explore.md +19 -59
  580. package/.agents/workflows/qa-run.md +11 -33
  581. package/README.md +1 -1
  582. package/bin/mandrel.js +5 -46
  583. package/bin/postinstall.js +18 -107
  584. package/docs/CHANGELOG.md +60 -0
  585. package/lib/cli/doctor.js +11 -71
  586. package/lib/cli/init.js +26 -165
  587. package/lib/cli/migrate.js +5 -64
  588. package/lib/cli/registry.js +84 -467
  589. package/lib/cli/sync-agents.js +4 -64
  590. package/lib/cli/sync-commands.js +11 -64
  591. package/lib/cli/sync.js +34 -213
  592. package/lib/cli/uninstall.js +40 -219
  593. package/lib/cli/update.js +326 -523
  594. package/lib/cli/version-check.js +8 -72
  595. package/lib/cli/version-helpers.js +14 -87
  596. package/lib/migrations/helpers/retire-agentrc-key.js +11 -52
  597. package/lib/migrations/index.js +17 -92
  598. package/lib/migrations/steps/2.1.0-retire-mi-drop-knobs.js +2 -15
  599. package/lib/migrations/steps/2.1.0-retire-verify-concurrency-cap.js +1 -13
  600. package/lib/migrations/steps/2.11.0-retire-max-seed-words.js +2 -15
  601. package/lib/migrations/steps/2.2.0-retire-epic-ac-tags.js +9 -38
  602. package/lib/migrations/steps/2.20.0-retire-codebase-snapshot.js +1 -13
  603. package/lib/migrations/steps/2.32.0-retire-lint-baseline-command.js +2 -27
  604. package/lib/migrations/steps/2.57.0-retire-delivery-limit-knobs.js +2 -23
  605. package/lib/migrations/steps/2.57.0-retire-planning-limit-knobs.js +2 -27
  606. package/lib/migrations/steps/2.60.0-retire-audit-results-autofile.js +21 -0
  607. package/lib/migrations/steps/strip-removed-agentrc-keys.js +333 -0
  608. package/package.json +17 -14
  609. package/.agents/docs/SDLC.md +0 -590
  610. package/.agents/docs/quality-gates.md +0 -1179
  611. package/.agents/rules/known-tooling-behavior.md +0 -150
  612. package/.agents/rules/orchestration-error-handling.md +0 -61
  613. package/.agents/rules/test-seams.md +0 -59
  614. package/.agents/schemas/baselines/lighthouse.schema.json +0 -59
  615. package/.agents/schemas/baselines/lint.schema.json +0 -47
  616. package/.agents/schemas/model-attribution.schema.json +0 -53
  617. package/.agents/scripts/check-action-pinning.js +0 -260
  618. package/.agents/scripts/check-audit-attribution.js +0 -302
  619. package/.agents/scripts/check-baseline-drift.js +0 -211
  620. package/.agents/scripts/check-baseline-scope.js +0 -362
  621. package/.agents/scripts/check-generated-validator.js +0 -202
  622. package/.agents/scripts/check-knip-entries.js +0 -159
  623. package/.agents/scripts/check-lifecycle-lint.js +0 -294
  624. package/.agents/scripts/check-pinned-override-notes.js +0 -102
  625. package/.agents/scripts/check-schema-references.js +0 -366
  626. package/.agents/scripts/check-test-portability.js +0 -512
  627. package/.agents/scripts/check-workflow-citations.js +0 -332
  628. package/.agents/scripts/check-workflow-cli-lint.js +0 -299
  629. package/.agents/scripts/check-workflow-timeouts.js +0 -291
  630. package/.agents/scripts/install-matrix-assert.js +0 -326
  631. package/.agents/scripts/lib/audit-advisories.js +0 -195
  632. package/.agents/scripts/lib/audit-attribution.js +0 -134
  633. package/.agents/scripts/lib/baselines/drift-detector.js +0 -351
  634. package/.agents/scripts/lib/baselines/kinds/lighthouse.js +0 -87
  635. package/.agents/scripts/lib/baselines/kinds/lint.js +0 -184
  636. package/.agents/scripts/lib/baselines/orphan-pruner.js +0 -233
  637. package/.agents/scripts/lib/baselines/scope-assert.js +0 -223
  638. package/.agents/scripts/lib/baselines/scope-inventory.js +0 -314
  639. package/.agents/scripts/lib/c8-cli-path.js +0 -21
  640. package/.agents/scripts/lib/config/gates/lighthouse.schema.js +0 -51
  641. package/.agents/scripts/lib/config/gates/lint.schema.js +0 -18
  642. package/.agents/scripts/lib/dynamic-workflow/architecture-report-contract.js +0 -70
  643. package/.agents/scripts/lib/dynamic-workflow/audit-orchestrator.js +0 -284
  644. package/.agents/scripts/lib/dynamic-workflow/clean-code-report-contract.js +0 -80
  645. package/.agents/scripts/lib/dynamic-workflow/degraded-coverage.js +0 -81
  646. package/.agents/scripts/lib/dynamic-workflow/documentation-report-contract.js +0 -87
  647. package/.agents/scripts/lib/dynamic-workflow/performance-report-contract.js +0 -74
  648. package/.agents/scripts/lib/dynamic-workflow/quality-report-contract.js +0 -90
  649. package/.agents/scripts/lib/dynamic-workflow/report-contract-core.js +0 -43
  650. package/.agents/scripts/lib/dynamic-workflow/security-report-contract.js +0 -83
  651. package/.agents/scripts/lib/fs-walk.js +0 -52
  652. package/.agents/scripts/lib/knip-config-resolver.js +0 -181
  653. package/.agents/scripts/lib/knip-entry-sync.js +0 -452
  654. package/.agents/scripts/lib/orchestration/model-attribution.js +0 -418
  655. package/.agents/scripts/lib/orchestration/story-plan-state.js +0 -33
  656. package/.agents/scripts/lib/orchestration/structured-comment-parser.js +0 -67
  657. package/.agents/scripts/lib/pinned-override-notes.js +0 -88
  658. package/.agents/scripts/lib/pinned-override-resolve.js +0 -212
  659. package/.agents/scripts/lib/test-isolate/cli-options.js +0 -93
  660. package/.agents/scripts/lib/test-isolate/env-snapshot-loader.js +0 -52
  661. package/.agents/scripts/lib/test-isolate/list-files.js +0 -90
  662. package/.agents/scripts/lib/test-isolate/parse-tap.js +0 -75
  663. package/.agents/scripts/lib/test-isolate/progress-log.js +0 -45
  664. package/.agents/scripts/lib/test-isolate/render-report.js +0 -97
  665. package/.agents/scripts/lib/test-isolate/run-isolate.js +0 -87
  666. package/.agents/scripts/lib/test-isolate/runner.js +0 -483
  667. package/.agents/scripts/lib/test-profile/parse-tap.js +0 -136
  668. package/.agents/scripts/lib/test-profile/render-report.js +0 -45
  669. package/.agents/scripts/lint-label-vocabulary.js +0 -214
  670. package/.agents/scripts/post-structured-comment.js +0 -127
  671. package/.agents/scripts/provision-git-hooks.js +0 -85
  672. package/.agents/scripts/prune-baseline-orphans.js +0 -181
  673. package/.agents/scripts/run-coverage.js +0 -197
  674. package/.agents/scripts/run-lint.js +0 -133
  675. package/.agents/scripts/run-test-profile.js +0 -129
  676. package/.agents/scripts/run-verify.js +0 -118
  677. package/.agents/scripts/test-isolate.js +0 -55
  678. package/.agents/scripts/update-dead-exports-baseline.js +0 -321
@@ -1,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> },