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,34 +1,10 @@
1
1
  /**
2
- * lib/orchestration/ticketing/transition.js — Single-ticket state mutators.
2
+ * lib/orchestration/ticketing/transition.js — Single-ticket state mutators:
3
+ * state-label transitions, tasklist checkbox toggling, structured comments.
3
4
  *
4
- * Owns the one-ticket-at-a-time mutation surface: state-label
5
- * transitions, tasklist checkbox toggling, and structured-comment
6
- * posting. Extracted from `./state.js` under Story #3995 to break the
7
- * `state.js ↔ bulk.js` import cycle: `bulk.js`'s cascade walk needs these
8
- * single-ticket primitives, and `transitionTicketState` needs the upward
9
- * cascade. Pulling the primitives down into this leaf lets both
10
- * `state.js` and `bulk.js` depend **downward** on `transition.js`, so the
11
- * dependency graph is a DAG.
12
- *
13
- * Cascade wiring: `transitionTicketState` fires the upward parent cascade
14
- * (which lives in `bulk.js`) on every transition unless `cascade: false`.
15
- * To keep this module a leaf, the cascade implementation is **injected**
16
- * via {@link registerCascadeRunner} rather than imported. `bulk.js`
17
- * registers the real runner at module-evaluation time; until it does,
18
- * the cascade step is a safe no-op. Every production path that fires a
19
- * transition reaches `bulk.js` (directly, through the `./ticketing.js`
20
- * facade, or through `./state.js`, all of which load `bulk.js`), so the
21
- * runner is always registered before a cascade-bearing transition runs.
22
- *
23
- * Story #3661 — `_columnSyncRegistry` is a module-level WeakMap that
24
- * retains one `ColumnSync` instance per provider for the lifetime of the
25
- * process. `ColumnSync` already caches the project metadata (projectId,
26
- * fieldId, option ids) inside the instance after the first GraphQL fetch
27
- * (`this._meta`), but that cache was discarded on every label transition
28
- * because `syncProjectStatusColumn` constructed a fresh instance each
29
- * call. The registry lets the instance — and therefore its `_meta`
30
- * cache — survive across transitions, so the invariant metadata is
31
- * resolved exactly once per run rather than once per label flip.
5
+ * A leaf module: the upward cascade lives in `bulk.js` and `state.js` injects
6
+ * it via {@link registerCascadeRunner}, so both depend downward on this file
7
+ * without a cycle.
32
8
  */
33
9
 
34
10
  import { extractEpicIdFromBody } from '../../dependency-parser.js';
@@ -51,22 +27,15 @@ import {
51
27
  } from './reads.js';
52
28
 
53
29
  /**
54
- * Injected upward-cascade runner. `bulk.js` registers the real
55
- * implementation (`cascadeParentState` + `logCascadePartialFailures`) at
56
- * module load via {@link registerCascadeRunner}; until then this no-op
57
- * default keeps `transitionTicketState` safe to call in isolation (e.g.
58
- * a unit test that imports only this module).
30
+ * Injected upward-cascade runner; a no-op until `state.js` registers the real
31
+ * one at module load, so this module is safe to use in isolation.
59
32
  *
60
33
  * @type {(provider: object, ticketId: number, opts: object) => Promise<void>}
61
34
  */
62
35
  let _runUpwardCascade = async () => {};
63
36
 
64
37
  /**
65
- * Register the upward-cascade runner. Called once by `bulk.js` at
66
- * module-evaluation time to wire its `cascadeParentState` /
67
- * `logCascadePartialFailures` pair into `transitionTicketState` without
68
- * `transition.js` importing `bulk.js` (which would re-introduce the
69
- * Story #3995 cycle).
38
+ * Called once by `state.js` at module-evaluation time.
70
39
  *
71
40
  * @param {(provider: object, ticketId: number, opts: object) => Promise<void>} runner
72
41
  */
@@ -77,24 +46,12 @@ export function registerCascadeRunner(runner) {
77
46
  }
78
47
 
79
48
  /**
80
- * One `ColumnSync` instance per provider, retained for the process
81
- * lifetime so the invariant project metadata (`projectId`, `fieldId`,
82
- * option ids) is fetched exactly once per run regardless of how many
83
- * label transitions fire. The `ColumnSync` instance already caches
84
- * the metadata internally (`_meta`), but that cache was thrown away on
85
- * every call to `syncProjectStatusColumn` because the function
86
- * constructed a fresh instance each time. Story #3661.
87
- *
88
- * `WeakMap` keys are GC-friendly: when a provider is collected the
89
- * entry is automatically removed without a manual eviction step.
49
+ * One `ColumnSync` per provider for the process lifetime, so its cached
50
+ * project metadata is fetched once per run rather than once per label flip.
90
51
  */
91
52
  const _columnSyncRegistry = new WeakMap();
92
53
 
93
54
  /**
94
- * Drop the cached `ColumnSync` for a given provider. Exposed as a
95
- * named export so unit tests that swap providers between assertions can
96
- * reset the registry without reloading the module.
97
- *
98
55
  * @param {object} provider
99
56
  */
100
57
  export function _resetColumnSyncCache(provider) {
@@ -102,16 +59,6 @@ export function _resetColumnSyncCache(provider) {
102
59
  }
103
60
 
104
61
  /**
105
- * Guard the inputs to {@link transitionTicketState}. Extracted from the
106
- * outer function so that the per-method cyclomatic complexity of
107
- * `transitionTicketState` lands below the CRAP-12 ceiling required by
108
- * Story #1848 (was CRAP 16 prior to the split — see baselines/crap.json).
109
- *
110
- * Currently a single label-membership predicate, but extracting it as a
111
- * named function lets future input guards (e.g. provider-shape checks,
112
- * concurrency-token validation) accrete here without re-inflating the
113
- * caller's complexity.
114
- *
115
62
  * @param {string} newState - Target `agent::*` label.
116
63
  * @returns {string} The validated newState, returned for fluent reuse.
117
64
  * @throws {Error} when `newState` is not a recognised state label.
@@ -124,25 +71,16 @@ function validateTransitionInputs(newState) {
124
71
  }
125
72
 
126
73
  /**
127
- * Active states a `agent::blocked` Story can recover into (Story #4622). A
128
- * `blocked → {executing|ready}` transition is a self-resolved block; every
129
- * other target (`done`, `closing`) is a real terminal outcome, not a
130
- * recovery.
74
+ * Active states a blocked Story can recover into; `done`/`closing` are real
75
+ * terminal outcomes, not recoveries.
131
76
  */
132
77
  const BLOCK_RECOVERY_TARGETS = [STATE_LABELS.EXECUTING, STATE_LABELS.READY];
133
78
 
134
79
  /**
135
- * Resolve the pre-transition ticket snapshot that drives the notify
136
- * payload and the provider's label-merge path. Honors the caller-supplied
137
- * `opts.ticketSnapshot` (Story #1795) when present; otherwise issues a
138
- * best-effort `getTicket` and returns `null` on transient failure.
139
- *
140
- * The snapshot is loaded when a caller threads `notify` (its `fromState`
141
- * feeds the notification payload) OR when `needFromState` is set — Story
142
- * #4622's recovery detection needs the *prior* state, and `getTicket` after
143
- * `updateTicket` would already read the new label. Bounding the extra read
144
- * to recovery-target transitions keeps every other flip on the snapshot-free
145
- * fast path.
80
+ * Resolve the pre-transition snapshot, honoring `opts.ticketSnapshot`. Loaded
81
+ * only when `notify` needs `fromState` or `needFromState` is set (recovery
82
+ * detection must read the prior label before `updateTicket` overwrites it).
83
+ * Returns `null` on transient failure.
146
84
  *
147
85
  * @param {object} provider
148
86
  * @param {{ notify?: Function, ticketSnapshot?: object|null }} opts
@@ -169,31 +107,9 @@ async function loadTicketSnapshot(provider, opts, ticketId, needFromState) {
169
107
  }
170
108
 
171
109
  /**
172
- * Mirror the post-flip label set onto the GitHub Projects v2 Status
173
- * column. Story #2548 — wiring this here makes every caller of
174
- * `transitionTicketState` (`single-story-init.js`, `single-story-close.js`,
175
- * `story-phase.js`, the LabelTransitioner lifecycle listener, the
176
- * update-ticket-state CLI, batch transitions) update the board automatically.
177
- * Prior to #2548 the sync was only wired from the deleted epic-runner against
178
- * the Epic ticket, so Stories and Tasks never had their `agent::executing` /
179
- * `agent::blocked` flips reflected on the board.
180
- *
181
- * Best-effort: a project-board misconfig, missing scope, or transient
182
- * GraphQL failure MUST NOT block the label transition itself. Errors
183
- * surface via `Logger.warn` and the function resolves cleanly.
184
- *
185
- * The `_makeColumnSync` default param is a DIP seam: production callers
186
- * accept the default (which constructs a real `ColumnSync`); tests inject
187
- * a factory stub that avoids the GraphQL dependency without mocking the
188
- * module. Story #3645.
189
- *
190
- * Story #3661 — when the caller uses the default factory (i.e. did not
191
- * inject a stub), the function looks up or creates a `ColumnSync`
192
- * instance in `_columnSyncRegistry` keyed by `provider`. This keeps the
193
- * instance — and therefore its `_meta` cache — alive across transitions
194
- * so the invariant project metadata is fetched exactly once per run.
195
- * Test-injected factories bypass the registry entirely; their synthetic
196
- * stubs are never stored in `_columnSyncRegistry`.
110
+ * Mirror the new state onto the Projects v2 Status column. Best-effort: a
111
+ * board failure is logged and never blocks the label transition. An injected
112
+ * `_makeColumnSync` bypasses the registry so test stubs are never cached.
197
113
  *
198
114
  * @param {object} provider
199
115
  * @param {number} ticketId
@@ -210,19 +126,10 @@ async function syncProjectStatusColumn(
210
126
  try {
211
127
  let sync;
212
128
  if (_makeColumnSync) {
213
- // Test-injected factory: bypass the registry so stubs are never
214
- // accidentally cached and reused in subsequent calls.
215
129
  sync = _makeColumnSync({ provider, logger: Logger });
216
130
  } else {
217
- // Production path: look up or create the per-provider instance.
218
- // The instance's `_meta` cache survives across label transitions
219
- // so the invariant project metadata (projectId, fieldId, options)
220
- // is only fetched once per process run. Story #3661.
221
- //
222
- // Story #4252 — `config` is threaded so the on-disk board-metadata
223
- // cache lands under the project's configured tempRoot. It is read at
224
- // construction only; the registry caches the first instance per
225
- // provider, so a later transition's config is intentionally ignored.
131
+ // `config` is read at construction only; the first instance per
132
+ // provider wins, so a later transition's config is ignored.
226
133
  if (!_columnSyncRegistry.has(provider)) {
227
134
  _columnSyncRegistry.set(
228
135
  provider,
@@ -240,11 +147,8 @@ async function syncProjectStatusColumn(
240
147
  }
241
148
 
242
149
  /**
243
- * Dispatch the state-transition notification once the label flip has
244
- * landed. Pulled out of `transitionTicketState` so the outer function
245
- * stays below the CRAP-12 ceiling: this is where the severity gating,
246
- * the ticket-type derivation, the level mapping, and the fire-and-forget
247
- * dispatch all live.
150
+ * Fire-and-forget state-transition notification, posted to the Epic when one
151
+ * is referenced (else the ticket itself); failures are logged, not thrown.
248
152
  *
249
153
  * @param {{
250
154
  * notify: Function,
@@ -271,20 +175,10 @@ function dispatchTransitionNotification(args) {
271
175
  toState: newState,
272
176
  };
273
177
  const severity = eventSeverity(event);
274
- // Suppress the dispatch entirely for low-severity transitions (task-
275
- // level, or non-terminal story / epic flips). Pre-migration the
276
- // comment channel filtered these out via `commentMinLevel: medium`;
277
- // post-migration the channel is event-allowlist gated and would
278
- // surface every transition equally, so the noise filter moves to
279
- // the emit point.
178
+ // The channel is event-allowlist gated, so the low-severity noise filter
179
+ // lives at the emit point.
280
180
  if (severity === 'low') return;
281
181
  const message = renderTransitionMessage(event);
282
- // Post to the epic so operators get a single timeline feed; fall back
283
- // to the transitioned ticket itself when no epic reference is present.
284
- // The dispatch is fire-and-forget by design (a failed notification must
285
- // not block the state transition itself), but surfacing the failure via
286
- // the logger preserves operator visibility — the previous empty-handler
287
- // .catch swallowed network blips and webhook 5xxs without any signal.
288
182
  const targetId = epicId ?? ticketId;
289
183
  const level =
290
184
  ticketType === 'epic' || ticketType === 'wave' || ticketType === 'story'
@@ -306,32 +200,13 @@ function dispatchTransitionNotification(args) {
306
200
  }
307
201
 
308
202
  /**
309
- * Emit a runtime-derived `friction` signal when a ticket parks at
310
- * `agent::blocked` (Story #4578). No-op for every other target state.
203
+ * Emit a `story-blocked` friction signal on entering `agent::blocked` (the
204
+ * single HITL pause point, so this one hook catches every block), or a
205
+ * recovery marker on `blocked → active` so the retro can net out transient
206
+ * blocks. The terminal-envelope hook skips `blocked` to avoid double counting.
311
207
  *
312
- * Why here: `agent::blocked` is the single runtime HITL pause point
313
- * (`.agents/instructions.md` § 1.J), and this is its canonical mutator — so
314
- * one hook catches every block regardless of which path drove it (the
315
- * `merge.unlanded` and `merge.flip-failed` paths in
316
- * `single-story-close/phases/confirm-merge.js`, the review-block path, an
317
- * operator's `update-ticket-state.js`, a Story worker giving up). Before
318
- * this, a block was only ever a *label* — it left no trace in the friction
319
- * stream the retro reads, so a run could park a worker and still produce a
320
- * zero-signal roll-up.
321
- *
322
- * This is also why the terminal-envelope hook deliberately skips `blocked`
323
- * (see `frictionForTerminal`): the two would otherwise count one incident
324
- * twice.
325
- *
326
- * Story #4622 extends the hook to the inverse edge: a `blocked → active`
327
- * transition emits a recovery marker so a transient block that self-resolved
328
- * can be netted out of the retro's `story-blocked` recurrence total.
329
- *
330
- * Best-effort and awaited: the friction emitters swallow their own failures
331
- * and resolve `false`, so this can neither throw nor block the transition.
332
- * It is awaited rather than fire-and-forget because CLI entry points exit
333
- * via `process.exit` as soon as `main` resolves (`cli-utils.runAsCli` with
334
- * `propagateExitCode`), which would discard a still-pending append.
208
+ * Awaited, not fire-and-forget: CLI entry points `process.exit` as soon as
209
+ * `main` resolves, which would drop a pending append. The emitters never throw.
335
210
  *
336
211
  * @param {number} ticketId
337
212
  * @param {string|null} fromState Prior state label, or null.
@@ -350,12 +225,6 @@ async function emitBlockedFriction(ticketId, fromState, newState, opts) {
350
225
  });
351
226
  return;
352
227
  }
353
- // Story #4622 — a transition *out* of `agent::blocked` into an active state
354
- // is a recovery: the earlier block self-resolved. Emit its recovery marker
355
- // so the retro composer can net the transient block out of the
356
- // `story-blocked` recurrence total (swarm-os friction #581). Only a genuine
357
- // block→active recovery qualifies; blocked→done/closing is a real
358
- // terminal outcome, not a recovery, so it is left counted.
359
228
  if (
360
229
  fromState === STATE_LABELS.BLOCKED &&
361
230
  BLOCK_RECOVERY_TARGETS.includes(newState)
@@ -370,44 +239,17 @@ async function emitBlockedFriction(ticketId, fromState, newState, opts) {
370
239
  }
371
240
 
372
241
  /**
373
- * Transitions a ticket's label to the new state.
374
- * Removes other agent:: state labels.
242
+ * Set a ticket's `agent::*` state label, removing the others; `done` also
243
+ * closes the issue.
375
244
  *
376
245
  * @param {import('../../ITicketingProvider.js').ITicketingProvider} provider
377
246
  * @param {number} ticketId
378
247
  * @param {string} newState - Must be one of STATE_LABELS.
379
248
  * @param {{ notify?: Function, cascade?: boolean, ticketSnapshot?: object, _makeColumnSync?: Function }} [opts]
380
- * Optional notify function (the exported `notify(ticketId, payload, opts)`
381
- * from `notify.js`, or any stub matching its shape). When provided, a
382
- * state-transition notification fires after a successful transition.
383
- * Story/Epic → `agent::done` events are dispatched as `medium`; all other
384
- * transitions are `low` and filtered out at the default `medium` channel
385
- * thresholds. The dispatched payload carries the typed envelope fields
386
- * (`event: 'state-transition'`, `level: 'task'|'story'|'wave'|'epic'`,
387
- * `epicId`) for routable webhook subscribers.
388
- *
389
- * `cascade` (default `true`) controls whether a `done` transition fans the
390
- * `cascadeCompletion` upward to parents. Per-Task closes invoked mid-Story
391
- * from the retired per-Task progress writer (4-tier era, removed under
392
- * #3157) passed `cascade: false` so the Story/Epic only flipped to
393
- * `agent::done` at story-close (after the merge lands), not when the
394
- * last Task commit landed on the still-unmerged Story branch. The
395
- * parameter is preserved for callers that still suppress cascade
396
- * explicitly (`single-story-init.js`, and `bulk.js` where the upward
397
- * recursion is driven by hand instead).
398
- *
399
- * `ticketSnapshot` (Story #1795 / Epic #1788) is an optional pre-fetched
400
- * ticket object. When the caller already holds the ticket — e.g. it
401
- * hydrated the ticket to inspect its labels first — passing the
402
- * snapshot eliminates the two `getTicket` round-trips that
403
- * `transitionTicketState` would otherwise issue — one for the notify
404
- * `fromState` lookup and one inside `provider.updateTicket`'s label
405
- * merge path. Backwards compatible: when omitted, behaviour is unchanged.
406
- *
407
- * `_makeColumnSync` (Story #3645 DIP seam) — factory for the board-sync
408
- * object. Production callers omit it (the default constructs a real
409
- * `ColumnSync`); tests inject a stub to avoid GraphQL calls without
410
- * module-level mocking.
249
+ * `notify` fires a state-transition notification after success.
250
+ * `cascade: false` suppresses the upward parent cascade.
251
+ * `ticketSnapshot` is a pre-fetched ticket that saves the `fromState` read
252
+ * and the provider's label-merge read. `_makeColumnSync` is a test seam.
411
253
  */
412
254
  export async function transitionTicketState(
413
255
  provider,
@@ -419,16 +261,6 @@ export async function transitionTicketState(
419
261
 
420
262
  const toRemove = ALL_STATES.filter((state) => state !== newState);
421
263
 
422
- // Snapshot prior state for the notification payload (best-effort; skip on
423
- // error). A transient read failure MUST NOT block a label transition —
424
- // the transition itself is idempotent and `fromState: null` is a valid
425
- // payload value.
426
- //
427
- // Story #1795 — when the caller threads `opts.ticketSnapshot` we reuse
428
- // it as the notify snapshot without issuing a fresh `getTicket`. The
429
- // snapshot is also forwarded to `provider.updateTicket` so the label
430
- // merge path skips its own `getTicket` call (the second of the two
431
- // round-trips this seam eliminates).
432
264
  const ticketSnapshot = await loadTicketSnapshot(
433
265
  provider,
434
266
  opts,
@@ -438,8 +270,6 @@ export async function transitionTicketState(
438
270
  const fromState =
439
271
  ticketSnapshot?.labels?.find((l) => ALL_STATES.includes(l)) ?? null;
440
272
 
441
- // Closing/reopening mirrors the label state so GitHub shows the correct
442
- // issue state without requiring a separate manual close step.
443
273
  const isDone = newState === STATE_LABELS.DONE;
444
274
 
445
275
  await provider.updateTicket(ticketId, {
@@ -449,22 +279,12 @@ export async function transitionTicketState(
449
279
  },
450
280
  state: isDone ? 'closed' : 'open',
451
281
  state_reason: isDone ? 'completed' : null,
452
- // Internal-only escape hatch threaded through `provider.updateTicket`
453
- // to `_applyLabelMutations`. Honored by `providers/github.js`; ignored
454
- // by providers that don't recognise it. Underscore-prefixed to mark
455
- // it as a provider-internal contract rather than part of the public
456
- // `mutations` shape.
282
+ // Provider-internal: lets the label merge skip its own getTicket.
457
283
  _ticketSnapshot: ticketSnapshot,
458
284
  });
459
285
 
460
- // Story #4578 — derive a friction signal from the block, at the point the
461
- // runtime already knows. Story #4622 also emits the recovery marker on the
462
- // inverse block→active transition. Best-effort; never blocks the transition.
463
286
  await emitBlockedFriction(ticketId, fromState, newState, opts);
464
287
 
465
- // Story #2548 — mirror the new state onto the Projects v2 Status
466
- // column. Best-effort; never blocks the transition.
467
- // Story #3645 — thread the DIP seam so callers can inject a stub.
468
288
  await syncProjectStatusColumn(
469
289
  provider,
470
290
  ticketId,
@@ -473,32 +293,14 @@ export async function transitionTicketState(
473
293
  opts.config,
474
294
  );
475
295
 
476
- // Automatically trigger upward cascade on every transition (Story
477
- // #2676). The unified entry point is `cascadeParentState`, which:
478
- // - delegates `agent::done` transitions to the legacy
479
- // `cascadeCompletion` (preserving tasklist-checkbox toggling, the
480
- // "All child tickets completed" progress comment, and the Epic
481
- // close-exclusion);
482
- // - for every other `agent::*` transition (`executing`, `blocked`,
483
- // `closing`, …) walks the parent chain and updates each parent to
484
- // the state derived from its children's current composition. This
485
- // keeps the GitHub Project board accurate when work begins on a
486
- // Task ("In Progress" surfaces up to the Story and Epic) or when a
487
- // child enters the HITL pause state.
488
- //
489
- // The cascade implementation lives in `bulk.js` and is injected via
490
- // `registerCascadeRunner` (Story #3995) so this module stays a leaf in
491
- // the import graph. Callers that intentionally suppress propagation
492
- // (historically the per-Task progress writer, which closed Tasks at
493
- // commit-time but deferred the Story flip to story-close after the
494
- // branch was merged) opt out by passing `cascade: false`.
296
+ // Every transition re-derives parent state from children (not just `done`),
297
+ // keeping the board accurate when work starts or a child blocks.
495
298
  if (opts.cascade !== false) {
496
299
  await _runUpwardCascade(provider, ticketId, {
497
300
  notify: opts.notify,
498
301
  });
499
302
  }
500
303
 
501
- // Fire the state-transition notification (fire-and-forget).
502
304
  if (typeof opts.notify === 'function') {
503
305
  dispatchTransitionNotification({
504
306
  notify: opts.notify,
@@ -511,13 +313,7 @@ export async function transitionTicketState(
511
313
  }
512
314
 
513
315
  /**
514
- * Mutates the tasklist checkbox in the parent's body.
515
- * E.g., `- [ ] #123` to `- [x] #123`
516
- *
517
- * Story #3645 — positional `checked` boolean replaced with a named
518
- * `{ checked }` options bag to eliminate the boolean-trap smell (SRP /
519
- * naming clarity audit finding). All call sites updated in the same PR
520
- * per the No-Shim cutover rule.
316
+ * Toggle `- [ ] #N` ↔ `- [x] #N` in the parent's body.
521
317
  *
522
318
  * @param {import('../../ITicketingProvider.js').ITicketingProvider} provider
523
319
  * @param {number} ticketId - ID of parent ticket
@@ -534,7 +330,7 @@ export async function toggleTasklistCheckbox(
534
330
  const body = ticket.body || '';
535
331
 
536
332
  if (!body.includes(`#${subIssueId}`)) {
537
- return; // sub-issue not directly referenced in body
333
+ return;
538
334
  }
539
335
 
540
336
  const targetBox = checked ? '- [x]' : '- [ ]';
@@ -542,11 +338,9 @@ export async function toggleTasklistCheckbox(
542
338
  let newBody = body;
543
339
 
544
340
  if (checked) {
545
- // replace `- [ ] #123` or `- [] #123` with `- [x] #123`
546
341
  const re = new RegExp(`-\\s*\\[\\s*\\]\\s+#${subIssueId}\\b`, 'g');
547
342
  newBody = newBody.replace(re, `${targetBox} #${subIssueId}`);
548
343
  } else {
549
- // replace `- [x] #123` or `- [X] #123` with `- [ ] #123`
550
344
  const re = new RegExp(`-\\s*\\[[xX]\\]\\s+#${subIssueId}\\b`, 'g');
551
345
  newBody = newBody.replace(re, `${targetBox} #${subIssueId}`);
552
346
  }
@@ -559,23 +353,15 @@ export async function toggleTasklistCheckbox(
559
353
  }
560
354
 
561
355
  /**
562
- * Post a structured comment to a ticket.
563
- *
564
- * Returns whatever the provider's `postComment` resolved to (Story #4543).
565
- * Previously the result was swallowed, which made it impossible for a caller
566
- * to reference the comment it had just written — the terminal envelope's
567
- * `blocked.frictionCommentId` pointer needs exactly that, so an operator can
568
- * be sent straight to the remediation instead of told to go find it. Callers
569
- * that don't need the id simply ignore the return, so this is additive.
570
- *
571
- * The shape is provider-defined and may be `undefined` for providers that do
572
- * not surface one; callers must treat the id as best-effort.
356
+ * Post a structured comment and evict the raw-comments cache so the next
357
+ * read sees it.
573
358
  *
574
359
  * @param {import('../../ITicketingProvider.js').ITicketingProvider} provider
575
360
  * @param {number} ticketId
576
361
  * @param {'progress'|'friction'|'notification'} type
577
362
  * @param {string} payload
578
- * @returns {Promise<unknown>} The provider's `postComment` result.
363
+ * @returns {Promise<unknown>} The provider's `postComment` result (may be
364
+ * `undefined`; treat any id as best-effort).
579
365
  */
580
366
  export async function postStructuredComment(provider, ticketId, type, payload) {
581
367
  assertValidStructuredCommentType(type);
@@ -583,9 +369,6 @@ export async function postStructuredComment(provider, ticketId, type, payload) {
583
369
  type,
584
370
  body: payload,
585
371
  });
586
- // Story #2465 — evict the raw-comments cache entry so the next
587
- // `findStructuredComment` against this ticket re-fetches and sees the
588
- // freshly-posted comment.
589
372
  invalidateRawCommentsCache(provider, ticketId);
590
373
  return posted;
591
374
  }
@@ -1,39 +1,17 @@
1
1
  /**
2
- * lib/orchestration/ticketing.js — Ticketing Operations SDK (facade).
3
- *
4
- * Stateless logic for updating ticket states, toggling checkboxes,
5
- * posting comments, and cascading completions. This module delegates
6
- * all API calls to the provided ITicketingProvider instance.
7
- *
8
- * Story #1848 — the implementation is split by verb family across the
9
- * sibling `ticketing/` sub-directory:
10
- *
11
- * - `./ticketing/reads.js` — read-only helpers, validators, and the
12
- * process-level structured-comment cache.
13
- * - `./ticketing/state.js` — per-ticket mutators including
14
- * `transitionTicketState` (below CRAP 12
15
- * via predicate extraction).
16
- * - `./ticketing/bulk.js` — cascade walk, per-parent serial lock,
17
- * transient-error retry budget, and the
18
- * partial-failure log helper.
19
- *
20
- * This file is a pure re-export facade: external callers continue to
21
- * import every name from `./ticketing.js`, so the split is invisible at
22
- * the import boundary.
2
+ * Re-export facade over `ticketing/` (reads, state mutators, bulk cascade)
3
+ * so callers import everything from one path.
23
4
  */
24
5
 
25
- // Re-export the cascade + bulk surface.
26
6
  export {
27
7
  __resetParentCascadeLocks,
28
8
  __setCascadeRetryDelays,
29
9
  logCascadePartialFailures,
30
10
  } from './ticketing/bulk.js';
31
- // Re-export the read surface.
32
11
  export {
33
12
  _peekStructuredCommentCache,
34
13
  _resetStructuredCommentCache,
35
14
  assertValidStructuredCommentType,
36
- // Story #3097 (Wave-0 additive, Epic #3078) — Storyless snapshot helper.
37
15
  buildStorylessTicketSnapshot,
38
16
  findStructuredComment,
39
17
  isValidStructuredCommentType,
@@ -42,11 +20,9 @@ export {
42
20
  structuredCommentMarker,
43
21
  WAVE_TYPE_PATTERN,
44
22
  } from './ticketing/reads.js';
45
- // Re-export the per-ticket state-mutation surface.
46
23
  export {
47
24
  postStructuredComment,
48
25
  toggleTasklistCheckbox,
49
- // Story #3097 (Wave-0 additive, Epic #3078) — Storyless direct transition.
50
26
  transitionStoryDirect,
51
27
  transitionTicketState,
52
28
  upsertStructuredComment,