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,22 +1,8 @@
1
1
  /**
2
- * lib/orchestration/ticketing/bulk.js — Cascade + batch ticketing surface.
3
- *
4
- * Owns the multi-ticket, cross-parent operations: the cascade walk that
5
- * fires when a child ticket reaches `agent::done`, the per-parent
6
- * sequencing lock, the transient-error classifier and retry budget, and
7
- * the partial-failure log helper. Pulled out of `../ticketing.js` under
8
- * Story #1848 so the verb-family split (`reads` / `state` / `bulk`) is
9
- * complete and the parent collapses to a pure re-export facade.
10
- *
11
- * Story #3995 — the single-ticket mutators (`transitionTicketState`,
12
- * `toggleTasklistCheckbox`, `postStructuredComment`) moved to the leaf
13
- * `./transition.js`, so this module now depends **downward** on
14
- * `transition.js` and the former `state.js ↔ bulk.js` import cycle is
15
- * gone. `cascadeCompletion` still recursively transitions parents via
16
- * the imported `transitionTicketState`; the reverse call
17
- * (`transitionTicketState → cascadeParentState`) is injected into
18
- * `transition.js` by `state.js` via `registerCascadeRunner` rather than
19
- * imported, which is what keeps the graph acyclic.
2
+ * lib/orchestration/ticketing/bulk.js — Cascade + batch ticketing surface:
3
+ * the upward cascade walk, the per-parent lock, and transient-error retry.
4
+ * Depends downward on `./transition.js`; the reverse edge is injected via
5
+ * `registerCascadeRunner`, keeping the import graph acyclic.
20
6
  */
21
7
 
22
8
  import { Logger } from '../../Logger.js';
@@ -27,14 +13,7 @@ import {
27
13
  transitionTicketState,
28
14
  } from './transition.js';
29
15
 
30
- /**
31
- * Retry budget for transient `gh` failures (rate limit, secondary rate limit,
32
- * 5xx, transport timeouts) inside the cascade transition. Three attempts with
33
- * exponential backoff (250ms / 500ms / 1000ms) mirrors the budget used by
34
- * `gitFetchWithRetry` (see `lib/git-utils.js`) and the HTTP-client retry path
35
- * referenced by the plan persist surface. Backoff is overridable via
36
- * {@link __setCascadeRetryDelays} so tests don't pay real wall-clock time.
37
- */
16
+ /** Backoff for transient `gh` failures inside the cascade transition. */
38
17
  const CASCADE_RETRY_BACKOFF_MS = [250, 500, 1000];
39
18
  const defaultCascadeSleep = (ms) =>
40
19
  new Promise((resolve) => setTimeout(resolve, ms));
@@ -42,8 +21,7 @@ let _cascadeRetryDelays = CASCADE_RETRY_BACKOFF_MS;
42
21
  let _cascadeSleep = defaultCascadeSleep;
43
22
 
44
23
  /**
45
- * Test seam — replace the backoff schedule and/or the sleep implementation
46
- * used by the cascade retry loop. Restore by calling with no arguments.
24
+ * Test seam; call with no arguments to restore defaults.
47
25
  *
48
26
  * @param {{ delays?: number[], sleep?: (ms: number) => Promise<void> }} [opts]
49
27
  */
@@ -56,21 +34,17 @@ export function __setCascadeRetryDelays(opts = {}) {
56
34
  }
57
35
 
58
36
  /**
59
- * Per-parent serial lock used to prevent two concurrent cascades within the
60
- * same wave from racing the parent's "all children done?" check (Story
61
- * #1817). The map is keyed by parent issue number; entries are reclaimed
62
- * once the last awaiter finishes. The lock is scoped to a single Node
63
- * process — cross-process races (multiple worktrees closing in parallel)
64
- * still rely on the retry/idempotency path.
37
+ * Per-parent serial lock so concurrent cascades cannot race the parent's
38
+ * "all children done?" check. In-process only; cross-process races rely on
39
+ * the retry/idempotency path.
65
40
  *
66
41
  * @type {Map<number, Promise<unknown>>}
67
42
  */
68
43
  const parentCascadeLocks = new Map();
69
44
 
70
45
  /**
71
- * Acquire the per-parent cascade lock, run `fn`, then release. Awaiters
72
- * queue strictly in invocation order. Failures of prior holders do not
73
- * propagate — each acquirer sees a clean entry into `fn`.
46
+ * Awaiters queue in invocation order; a prior holder's failure does not
47
+ * propagate to the next.
74
48
  *
75
49
  * @template R
76
50
  * @param {number} parentId
@@ -93,20 +67,12 @@ async function withParentCascadeLock(parentId, fn) {
93
67
  }
94
68
  }
95
69
 
96
- /**
97
- * Test seam — clear the per-parent cascade lock map between tests so a
98
- * pending entry from one scenario does not leak into the next.
99
- */
100
70
  export function __resetParentCascadeLocks() {
101
71
  parentCascadeLocks.clear();
102
72
  }
103
73
 
104
74
  /**
105
- * Classifies a thrown cascade error as "transient" (rate limit, secondary
106
- * rate limit, 5xx, transport timeout / reset) so the retry loop can back
107
- * off instead of surfacing the failure to the operator. Provider-agnostic:
108
- * matches on typed error names (`GhRateLimitError`), HTTP status, and
109
- * conservative regex over stderr + message.
75
+ * Rate limit, 5xx, or transport failure — worth a backoff retry.
110
76
  *
111
77
  * @param {unknown} err
112
78
  * @returns {boolean}
@@ -133,10 +99,8 @@ function isTransientCascadeError(err) {
133
99
  }
134
100
 
135
101
  /**
136
- * Render a cascade-failure error into a single log-friendly string that
137
- * preserves stderr and exit-code context. The legacy log line collapsed
138
- * `gh-exec`-thrown errors to a bare "exit 1" message, which made the
139
- * failure mode unclassifiable post-hoc (see Story #1817).
102
+ * One-line rendering that keeps stderr and exit code, so a failure stays
103
+ * classifiable after the fact.
140
104
  *
141
105
  * @param {unknown} err
142
106
  * @returns {string}
@@ -158,10 +122,7 @@ function formatCascadeError(err) {
158
122
  }
159
123
 
160
124
  /**
161
- * Run `fn` with exponential backoff on transient errors. Non-transient
162
- * errors propagate immediately on the first attempt. The total attempt
163
- * count is `delays.length + 1` (one initial attempt plus one retry per
164
- * delay).
125
+ * Retry `fn` on transient errors only; attempts = `delays.length + 1`.
165
126
  *
166
127
  * @template R
167
128
  * @param {() => Promise<R>} fn
@@ -192,16 +153,7 @@ async function retryTransient(fn, opts = {}) {
192
153
  }
193
154
 
194
155
  /**
195
- * Emit a warn line for every per-parent cascade failure captured by
196
- * {@link cascadeCompletion}. Each `error` string is pre-formatted with
197
- * stderr + exit-code by `formatCascadeError`, so callers can pass the
198
- * raw envelope through without further wrapping. Called from
199
- * `state.js`'s `transitionTicketState` to keep its cyclomatic
200
- * complexity inside the project's per-method CRAP ceiling (Story #1817,
201
- * Story #1848).
202
- *
203
- * @param {number} ticketId The ticket whose `agent::done` transition
204
- * triggered the cascade.
156
+ * @param {number} ticketId The ticket whose transition triggered the cascade.
205
157
  * @param {{ failed?: Array<{ parentId: number, error: string }> } | null} cascade
206
158
  */
207
159
  export function logCascadePartialFailures(ticketId, cascade) {
@@ -214,10 +166,6 @@ export function logCascadePartialFailures(ticketId, cascade) {
214
166
  }
215
167
 
216
168
  /**
217
- * Per-parent body of {@link cascadeCompletion}. Pulled out so the outer
218
- * walk stays a thin sequential loop while the per-parent work runs under
219
- * the per-parent cascade lock.
220
- *
221
169
  * @param {import('../../ITicketingProvider.js').ITicketingProvider} provider
222
170
  * @param {number} ticketId - The ticket whose `agent::done` transition
223
171
  * triggered the cascade.
@@ -233,11 +181,6 @@ async function processCascadeParent(provider, ticketId, parentId, opts) {
233
181
  }
234
182
 
235
183
  /**
236
- * Body of {@link processCascadeParent} that runs under the per-parent lock.
237
- * Split out so the lock-acquire scaffolding stays a one-liner and the
238
- * cyclomatic complexity of the per-parent worker doesn't drift over the
239
- * project's CRAP ceiling once the retry / idempotency branches are added.
240
- *
241
184
  * @returns {Promise<{ cascadedTo: number[], failed: Array<{ parentId: number, error: string }> }>}
242
185
  */
243
186
  async function processCascadeParentLocked(
@@ -254,11 +197,8 @@ async function processCascadeParentLocked(
254
197
  checked: true,
255
198
  });
256
199
 
257
- // Idempotency check (Story #1817): re-fetch the parent under the lock
258
- // so a concurrent cascade winner that already flipped this parent to
259
- // `agent::done` short-circuits us without re-running the transition.
260
- // The provider cache may still hold a stale row from before the
261
- // winner's PATCH — invalidate first when supported.
200
+ // Idempotency: re-read the parent under the lock (cache invalidated
201
+ // first) so a concurrent winner that already flipped it short-circuits us.
262
202
  if (typeof provider.invalidateTicket === 'function') {
263
203
  try {
264
204
  provider.invalidateTicket(parentId);
@@ -274,13 +214,7 @@ async function processCascadeParentLocked(
274
214
  return { cascadedTo, failed };
275
215
  }
276
216
 
277
- // Fetch siblings with fresh reads to defend against stale-CLOSED entries.
278
- // `{ fresh: true }` threads into the per-child `getTicket` inside
279
- // `getSubTickets`, bypassing the cache in one pass rather than two.
280
- // The per-child try/catch fallback-to-null is preserved by `getSubTickets`
281
- // itself, so a transient read failure cannot silently flip the all-done
282
- // check. The concurrency cap (SUBTICKET_HYDRATION_CONCURRENCY = 8) is
283
- // applied inside `getSubTickets`.
217
+ // Fresh sibling reads defend against stale-CLOSED cache entries.
284
218
  const freshSubTickets = await provider.getSubTickets(parentId, {
285
219
  fresh: true,
286
220
  });
@@ -289,10 +223,6 @@ async function processCascadeParentLocked(
289
223
  );
290
224
  if (!allDone) return { cascadedTo, failed };
291
225
 
292
- // Retry the parent transition on transient `gh` failures (rate limit,
293
- // 5xx, transport timeouts). Permanent failures fall through to the
294
- // outer catch on the first attempt so the operator sees the real
295
- // error rather than three retries' worth of noise.
296
226
  await retryTransient(
297
227
  () =>
298
228
  transitionTicketState(provider, parentId, STATE_LABELS.DONE, {
@@ -330,47 +260,25 @@ async function processCascadeParentLocked(
330
260
  }
331
261
 
332
262
  /**
333
- * Recursively cascade upward.
334
- * If ticket reaches DONE, it toggles its checkbox in its parent.
335
- * Then checks if parent's sub-tickets are ALL DONE.
336
- * If yes, transitions parent to DONE and cascades up.
337
- *
338
- * Parents run strictly sequentially in input order (Story #4017 —
339
- * fan-out is <= 1 under the 2-tier hierarchy, so the former
340
- * shared-ancestor grouping / parallel dispatch was deleted); concurrent
341
- * transitions against a shared ancestor would race the "all children
342
- * done?" check. Within each parent, sibling reads fan out via
343
- * `getSubTickets(parentId, { fresh: true })` with the concurrency cap
344
- * (8) applied inside `getSubTickets`.
345
- *
346
- * Per-parent errors are isolated: a failure updating one parent (network,
347
- * permission, stale ticket) never discards progress on sibling parents.
348
- * Failures are collected and returned so callers can log them with full
349
- * ticket context instead of seeing a single rejection.
263
+ * When a ticket is `agent::done`, tick its checkbox in each parent and, if
264
+ * all the parent's children are done, transition the parent and recurse.
265
+ * Parents run sequentially (a shared ancestor would race the all-done
266
+ * check); per-parent failures are collected, never discarding sibling work.
350
267
  *
351
268
  * @param {import('../../ITicketingProvider.js').ITicketingProvider} provider
352
269
  * @param {number} ticketId
353
- * @param {{ notify?: Function, _logger?: object }} [opts] - `notify` is
354
- * forwarded to any recursive `transitionTicketState` fired on parent
355
- * tickets. `_logger` is an internal hook used by nested cascade calls
356
- * to keep buffered output coherent — external callers should leave it
357
- * unset so the module-level {@link Logger} is used.
270
+ * @param {{ notify?: Function, _logger?: object }} [opts] - `_logger` is for
271
+ * nested calls only.
358
272
  * @returns {Promise<{ cascadedTo: number[], failed: Array<{ parentId: number, error: string }> }>}
359
273
  */
360
274
  async function cascadeCompletion(provider, ticketId, opts = {}) {
361
275
  const ticket = await provider.getTicket(ticketId);
362
276
 
363
- // Determine if this ticket is agent::done
364
277
  if (!ticket.labels.includes(STATE_LABELS.DONE)) {
365
278
  return { cascadedTo: [], failed: [] };
366
279
  }
367
280
 
368
- // Story #4545 — one strategy, not three. The `parent: #N` body footer and
369
- // the native sub-issue link were both written by `createTicket`, the
370
- // Epic-hierarchy write surface deleted in the same Story; with no writer,
371
- // the body regex could only ever miss and the native lookup could only
372
- // ever spend an API call to learn the same. The operator-settable `blocks`
373
- // annotation is the one parent edge that can still exist.
281
+ // The operator-settable `blocks` annotation is the only parent edge.
374
282
  const { blocks: parentIds } = await provider.getTicketDependencies(ticketId);
375
283
  const parsedParents = Array.isArray(parentIds) ? parentIds : [];
376
284
 
@@ -378,12 +286,6 @@ async function cascadeCompletion(provider, ticketId, opts = {}) {
378
286
  return { cascadedTo: [], failed: [] };
379
287
  }
380
288
 
381
- // Story #4017 — under the 2-tier hierarchy a ticket has at most one
382
- // parent, so the shared-ancestor grouping / parallel-group dispatch
383
- // machinery was deleted. Parents (fan-out <= 1
384
- // in practice; the loop stays general for the body-reference fallback)
385
- // run strictly sequentially, which trivially preserves the
386
- // shared-ancestor safety invariant the grouping used to enforce.
387
289
  const cascadedTo = [];
388
290
  const failed = [];
389
291
  for (const parentId of parsedParents) {
@@ -398,49 +300,12 @@ async function cascadeCompletion(provider, ticketId, opts = {}) {
398
300
  }
399
301
 
400
302
  /**
401
- * Derive the parent `agent::*` state from the composition of its children.
402
- *
403
- * Rules (Story #2676):
404
- * - Any **open** child carrying `agent::blocked` → parent should be
405
- * `agent::blocked`.
406
- * - Otherwise, every child is `agent::done` (or closed) → parent should be
407
- * `agent::done`.
408
- * - Otherwise, any **open** child carrying `agent::executing` or
409
- * `agent::closing` → parent should be `agent::executing`.
410
- * - Otherwise (e.g. all children still `agent::ready`) → return `null` to
411
- * signal "leave the parent unchanged". A parent already partway through
412
- * the lifecycle MUST NOT be downgraded just because one child reverted.
413
- *
414
- * **A closed child contributes no `agent::*` state** (Story #5255). Its label
415
- * records the state it was in when it stopped, not outstanding work, and
416
- * nothing clears it on the way out: a Story re-planned out of `agent::blocked`
417
- * is closed as superseded still wearing that label, and the blocked rule then
418
- * pinned its container Epic open forever — `epic-rollup.js` bails before its
419
- * close path on any derived state other than `agent::done`, so the Epic
420
- * reported `pending` every run with every child long since closed. Filtering
421
- * here rather than at that one call site is what also covers a child closed by
422
- * hand with a stale state label attached. The all-done branch already counted
423
- * `state === 'closed'` as done, so a closed child keeps exactly that meaning
424
- * and loses only its vote on the other two.
425
- *
426
- * The function is pure and exported so the rule can be exercised in
427
- * isolation by unit tests without dragging the cascade I/O surface in.
428
- *
429
- * @param {Array<{ labels?: string[], state?: string }>} siblings
430
- * @returns {string|null} A `STATE_LABELS.*` value, or `null` for no-op.
431
- */
432
- /**
433
- * The labels that still describe **live** work on this child.
434
- *
435
- * Empty for a closed child: its `agent::*` label records the state it stopped
436
- * in, not outstanding work, and the two live-state rules in
437
- * {@link deriveParentState} must not read it. The all-done rule reads the
438
- * child's labels directly, so a closed child keeps counting as done.
303
+ * Labels describing live work on a child — empty for a closed child, whose
304
+ * stale `agent::*` label records where it stopped, not outstanding work.
439
305
  *
440
- * Module-level rather than another local arrow inside `deriveParentState`:
441
- * the CRAP baseline keys anonymous functions positionally within their
442
- * enclosing scope, so adding or removing one there renumbers every later
443
- * arrow and reports the shift as drift on code that did not change.
306
+ * Module-level rather than a local arrow: the CRAP baseline keys anonymous
307
+ * functions positionally, so adding one inside `deriveParentState` would
308
+ * renumber later arrows and fake drift.
444
309
  *
445
310
  * @param {{ labels?: string[], state?: string }} sibling
446
311
  * @returns {string[]}
@@ -450,6 +315,16 @@ function liveChildLabels(sibling) {
450
315
  return Array.isArray(sibling?.labels) ? sibling.labels : [];
451
316
  }
452
317
 
318
+ /**
319
+ * Derive a parent's `agent::*` state from its children: any open blocked →
320
+ * blocked; else all done-or-closed → done; else any open executing/closing →
321
+ * executing; else `null` (never downgrade a parent). Closed children vote
322
+ * only as done — a stale `agent::blocked` on a superseded child must not
323
+ * pin its Epic open.
324
+ *
325
+ * @param {Array<{ labels?: string[], state?: string }>} siblings
326
+ * @returns {string|null} A `STATE_LABELS.*` value, or `null` for no-op.
327
+ */
453
328
  export function deriveParentState(siblings) {
454
329
  if (!Array.isArray(siblings) || siblings.length === 0) return null;
455
330
  const labelsOf = (s) => (Array.isArray(s?.labels) ? s.labels : []);
@@ -470,22 +345,9 @@ export function deriveParentState(siblings) {
470
345
  }
471
346
 
472
347
  /**
473
- * Did any of these children actually **land**?
474
- *
475
- * `deriveParentState` answers `agent::done` for a child set in which every
476
- * child is done *or closed*, and it is right to: a closed child is finished
477
- * work as far as the parent's lifecycle goes. But "finished" and "landed" are
478
- * different claims, and the close path spends the difference. A cohort
479
- * re-planned out of existence closes every child as superseded, carrying no
480
- * `agent::done` and having merged nothing — and the container above it then
481
- * closed as `completed`, over a log line claiming every child Story landed.
482
- * Both the state reason and the sentence were false.
483
- *
484
- * So the two questions are asked separately: `deriveParentState` decides
485
- * *whether* the parent is finished, this decides *how* it finished. A single
486
- * landed child is enough — a container that delivered some of its work and
487
- * superseded the rest completed, partially, and `not_planned` is reserved for
488
- * the case where nothing was delivered at all.
348
+ * "Finished" is not "landed": a cohort closed wholly as superseded derives
349
+ * `done` but delivered nothing. One landed child means the container
350
+ * completed; none means `not_planned`.
489
351
  *
490
352
  * @param {Array<{ labels?: string[] }>} children
491
353
  * @returns {boolean} True when at least one child carries `agent::done`.
@@ -500,26 +362,9 @@ export function anyChildLanded(children) {
500
362
  }
501
363
 
502
364
  /**
503
- * Parent-state cascade for non-terminal transitions. Story #2676.
504
- *
505
- * When a child ticket transitions to any `agent::*` state, this function
506
- * walks the parent chain and updates each parent's state to the value
507
- * derived by {@link deriveParentState} — so that moving a Task to
508
- * `agent::executing` propagates "in progress" up to the Story and the
509
- * Epic on the Project board, and moving a Task to `agent::blocked`
510
- * surfaces the HITL signal at every ancestor.
511
- *
512
- * For `agent::done` transitions, propagation is delegated to the
513
- * existing {@link cascadeCompletion} so the long-standing semantics
514
- * (tasklist checkbox toggling, the "All child tickets completed via
515
- * recursive cascade" progress comment, Epic exclusion) are preserved
516
- * verbatim.
517
- *
518
- * Resilience matches {@link cascadeCompletion}: parents run
519
- * sequentially; the per-parent lock from {@link withParentCascadeLock}
520
- * prevents races on shared ancestors; and per-parent errors are
521
- * isolated so a sibling parent's failure does not discard work on the
522
- * others.
365
+ * Propagate any `agent::*` transition up the parent chain using
366
+ * {@link deriveParentState}; `done` delegates to {@link cascadeCompletion}.
367
+ * Same sequential, locked, failure-isolated walk.
523
368
  *
524
369
  * @param {import('../../ITicketingProvider.js').ITicketingProvider} provider
525
370
  * @param {number} ticketId
@@ -527,14 +372,7 @@ export function anyChildLanded(children) {
527
372
  * @returns {Promise<{ cascadedTo: number[], failed: Array<{ parentId: number, error: string }> }>}
528
373
  */
529
374
  export async function cascadeParentState(provider, ticketId, opts = {}) {
530
- // Provider-capability guard. Cascade derivation needs both
531
- // `getTicketDependencies` (to walk the `blocks:` parent edge) and
532
- // `getSubTickets` (to inspect the parent's children). Test fakes
533
- // that stub only the single-ticket surface (e.g. the column-sync
534
- // sibling tests) MUST still be able to drive `transitionTicketState`
535
- // without the cascade blowing up. Silently no-op when the surface
536
- // is missing — propagation is best-effort, matching the contract
537
- // already documented for the column-sync mirror.
375
+ // Best-effort: providers lacking the dependency/sub-ticket surface no-op.
538
376
  if (
539
377
  typeof provider?.getTicketDependencies !== 'function' ||
540
378
  typeof provider?.getSubTickets !== 'function'
@@ -546,9 +384,6 @@ export async function cascadeParentState(provider, ticketId, opts = {}) {
546
384
  const childState = labels.find((l) => ALL_STATES.includes(l));
547
385
  if (!childState) return { cascadedTo: [], failed: [] };
548
386
 
549
- // DONE-cascade keeps the existing path: tasklist checkbox toggle,
550
- // progress comment, Epic-close exclusion, and the legacy log shape are
551
- // all encoded in `cascadeCompletion` and externally observed by tests.
552
387
  if (childState === STATE_LABELS.DONE) {
553
388
  return cascadeCompletion(provider, ticketId, opts);
554
389
  }
@@ -556,8 +391,6 @@ export async function cascadeParentState(provider, ticketId, opts = {}) {
556
391
  const parsedParents = await resolveParentIds(provider, ticket, ticketId);
557
392
  if (parsedParents.length === 0) return { cascadedTo: [], failed: [] };
558
393
 
559
- // Story #4017 — sequential per-parent walk (fan-out <= 1 under the
560
- // 2-tier hierarchy); see cascadeCompletion for the rationale.
561
394
  const cascadedTo = [];
562
395
  const failed = [];
563
396
  for (const parentId of parsedParents) {
@@ -572,10 +405,6 @@ export async function cascadeParentState(provider, ticketId, opts = {}) {
572
405
  }
573
406
 
574
407
  /**
575
- * Resolve the parent issue ids for a ticket from its `blocks:` dependency
576
- * annotations. Mirrors the resolution path used by {@link cascadeCompletion}
577
- * — see there for why the `parent: #NNN` body fallback is gone (Story #4545).
578
- *
579
408
  * @param {import('../../ITicketingProvider.js').ITicketingProvider} provider
580
409
  * @param {object} _ticket
581
410
  * @param {number} ticketId
@@ -587,10 +416,6 @@ async function resolveParentIds(provider, _ticket, ticketId) {
587
416
  }
588
417
 
589
418
  /**
590
- * Per-parent worker for {@link cascadeParentState}. Acquires the shared
591
- * per-parent cascade lock so concurrent transitions on sibling children
592
- * cannot race on the parent's derived-state check.
593
- *
594
419
  * @returns {Promise<{ cascadedTo: number[], failed: Array<{ parentId: number, error: string }> }>}
595
420
  */
596
421
  async function processStateCascadeParent(provider, parentId, opts) {
@@ -600,11 +425,6 @@ async function processStateCascadeParent(provider, parentId, opts) {
600
425
  );
601
426
  }
602
427
 
603
- /**
604
- * Body of {@link processStateCascadeParent} under the per-parent lock.
605
- * Computes the derived state from a fresh sibling read, applies the
606
- * idempotency guard, and recurses upward.
607
- */
608
428
  async function processStateCascadeParentLocked(
609
429
  provider,
610
430
  parentId,
@@ -621,21 +441,13 @@ async function processStateCascadeParentLocked(
621
441
  // best-effort cache invalidation
622
442
  }
623
443
  }
624
- // Fetch siblings fresh in one pass — `{ fresh: true }` threads into the
625
- // per-child `getTicket` inside `getSubTickets`, replacing the previous
626
- // two-step pattern of `getSubTickets` + a second `concurrentMap` fan-out
627
- // with `invalidateTicket` + `getTicket(id, { fresh:true })`.
628
444
  const freshSubs = await provider.getSubTickets(parentId, { fresh: true });
629
445
 
630
446
  const derived = deriveParentState(freshSubs);
631
447
  if (derived === null) return { cascadedTo, failed };
632
448
 
633
- // Defer the all-done case to the legacy DONE-cascade so it
634
- // owns the Epic exclusion, the tasklist toggle, the progress
635
- // comment, and the recursive walk that already pin its
636
- // behaviour via the existing test surface. The closing child's
637
- // id is taken from `freshSubs` — any DONE child suffices because
638
- // cascadeCompletion only uses the child to look up its parents.
449
+ // All-done defers to the DONE cascade; any done child suffices since it
450
+ // is only used to look up the parents.
639
451
  if (derived === STATE_LABELS.DONE) {
640
452
  const doneChild = freshSubs.find(
641
453
  (s) => Array.isArray(s?.labels) && s.labels.includes(STATE_LABELS.DONE),
@@ -654,9 +466,6 @@ async function processStateCascadeParentLocked(
654
466
  const parentLabels = Array.isArray(parent?.labels) ? parent.labels : [];
655
467
  const currentState = parentLabels.find((l) => ALL_STATES.includes(l));
656
468
  if (currentState === derived) {
657
- // Idempotency guard — Project board is already in the derived
658
- // column. Skip the transition entirely so we do not burn a
659
- // GraphQL write for a no-op.
660
469
  return { cascadedTo, failed };
661
470
  }
662
471
 
@@ -664,9 +473,7 @@ async function processStateCascadeParentLocked(
664
473
  () =>
665
474
  transitionTicketState(provider, parentId, derived, {
666
475
  notify: opts.notify,
667
- // Recursion is handled explicitly below — passing cascade:false
668
- // prevents state.js from firing its own cascadeParentState on the
669
- // parent and double-walking the tree.
476
+ // Recursion is explicit below; avoid double-walking the tree.
670
477
  cascade: false,
671
478
  }),
672
479
  {