mandrel 2.60.0 → 2.62.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 (662) 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/merge-queue.js +158 -0
  318. package/.agents/scripts/lib/orchestration/pinned-identifier-lint.js +17 -57
  319. package/.agents/scripts/lib/orchestration/plan-context.js +52 -303
  320. package/.agents/scripts/lib/orchestration/plan-critic-conditions.js +22 -79
  321. package/.agents/scripts/lib/orchestration/plan-critics-evaluate.js +5 -31
  322. package/.agents/scripts/lib/orchestration/plan-metrics.js +29 -108
  323. package/.agents/scripts/lib/orchestration/plan-navigation.js +8 -27
  324. package/.agents/scripts/lib/orchestration/plan-persist/acceptance-handle-repair.js +12 -49
  325. package/.agents/scripts/lib/orchestration/plan-persist/audit-provenance.js +18 -73
  326. package/.agents/scripts/lib/orchestration/plan-persist/changes-repair.js +14 -78
  327. package/.agents/scripts/lib/orchestration/plan-persist/cross-plan-links.js +6 -30
  328. package/.agents/scripts/lib/orchestration/plan-persist/epic-adoption.js +14 -65
  329. package/.agents/scripts/lib/orchestration/plan-persist/epic-ops.js +21 -76
  330. package/.agents/scripts/lib/orchestration/plan-persist/external-deps.js +6 -43
  331. package/.agents/scripts/lib/orchestration/plan-persist/persist-helpers.js +14 -68
  332. package/.agents/scripts/lib/orchestration/plan-persist/plan-context-source.js +9 -41
  333. package/.agents/scripts/lib/orchestration/plan-persist/run-plan-persist.js +49 -248
  334. package/.agents/scripts/lib/orchestration/plan-persist/soft-findings.js +2 -12
  335. package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +85 -368
  336. package/.agents/scripts/lib/orchestration/plan-persist/summary.js +8 -38
  337. package/.agents/scripts/lib/orchestration/plan-persist/supersede-ops.js +30 -190
  338. package/.agents/scripts/lib/orchestration/plan-persist/wave-collision-gate.js +9 -49
  339. package/.agents/scripts/lib/orchestration/plan-persist/wave-serialisation.js +7 -28
  340. package/.agents/scripts/lib/orchestration/plan-reachability.js +13 -42
  341. package/.agents/scripts/lib/orchestration/plan-run-labels/reap.js +16 -91
  342. package/.agents/scripts/lib/orchestration/plan-runner/worktree-sweep.js +16 -54
  343. package/.agents/scripts/lib/orchestration/plan-text-hygiene.js +10 -52
  344. package/.agents/scripts/lib/orchestration/planning/authoring-context.js +14 -109
  345. package/.agents/scripts/lib/orchestration/planning/memory-pool-advisory.js +11 -83
  346. package/.agents/scripts/lib/orchestration/pr-watch.js +48 -306
  347. package/.agents/scripts/lib/orchestration/project-meta-cache.js +15 -80
  348. package/.agents/scripts/lib/orchestration/project-meta-resolver.js +10 -51
  349. package/.agents/scripts/lib/orchestration/reassert-status-column.js +12 -76
  350. package/.agents/scripts/lib/orchestration/remote-verifier.js +12 -36
  351. package/.agents/scripts/lib/orchestration/resolve-stories.js +33 -164
  352. package/.agents/scripts/lib/orchestration/retro-proposals.js +66 -361
  353. package/.agents/scripts/lib/orchestration/review-base-ref.js +9 -43
  354. package/.agents/scripts/lib/orchestration/review-depth.js +12 -94
  355. package/.agents/scripts/lib/orchestration/review-providers/codex.js +10 -111
  356. package/.agents/scripts/lib/orchestration/review-providers/degraded-gates.js +13 -71
  357. package/.agents/scripts/lib/orchestration/review-providers/findings-renderer.js +7 -51
  358. package/.agents/scripts/lib/orchestration/review-providers/mi-exemptions.js +8 -53
  359. package/.agents/scripts/lib/orchestration/review-providers/native.js +30 -214
  360. package/.agents/scripts/lib/orchestration/review-providers/parse-findings.js +7 -52
  361. package/.agents/scripts/lib/orchestration/review-providers/review-depth.js +4 -33
  362. package/.agents/scripts/lib/orchestration/review-providers/review-provider-factory.js +11 -71
  363. package/.agents/scripts/lib/orchestration/review-providers/scoped-lint.js +19 -131
  364. package/.agents/scripts/lib/orchestration/review-providers/security-review.js +6 -89
  365. package/.agents/scripts/lib/orchestration/review-providers/types.js +26 -56
  366. package/.agents/scripts/lib/orchestration/review-providers/ultrareview.js +3 -46
  367. package/.agents/scripts/lib/orchestration/run-epilogue.js +40 -199
  368. package/.agents/scripts/lib/orchestration/run-scoped-config.js +13 -81
  369. package/.agents/scripts/lib/orchestration/single-story-close/close-note.js +7 -34
  370. package/.agents/scripts/lib/orchestration/single-story-close/failed-terminal.js +16 -89
  371. package/.agents/scripts/lib/orchestration/single-story-close/gate-log.js +18 -109
  372. package/.agents/scripts/lib/orchestration/single-story-close/phases/auto-merge.js +190 -280
  373. package/.agents/scripts/lib/orchestration/single-story-close/phases/base-sync.js +18 -80
  374. package/.agents/scripts/lib/orchestration/single-story-close/phases/close-validation.js +103 -97
  375. package/.agents/scripts/lib/orchestration/single-story-close/phases/code-review.js +8 -64
  376. package/.agents/scripts/lib/orchestration/single-story-close/phases/confirm-merge.js +183 -485
  377. package/.agents/scripts/lib/orchestration/single-story-close/phases/conventional-subject.js +30 -134
  378. package/.agents/scripts/lib/orchestration/single-story-close/phases/graphql-preflight.js +9 -50
  379. package/.agents/scripts/lib/orchestration/single-story-close/phases/lock-wait-pending.js +49 -0
  380. package/.agents/scripts/lib/orchestration/single-story-close/phases/normalize-pr-title.js +13 -86
  381. package/.agents/scripts/lib/orchestration/single-story-close/phases/options.js +20 -95
  382. package/.agents/scripts/lib/orchestration/single-story-close/phases/post-land.js +46 -203
  383. package/.agents/scripts/lib/orchestration/single-story-close/phases/pre-gate-steps.js +8 -50
  384. package/.agents/scripts/lib/orchestration/single-story-close/phases/pull-request.js +12 -83
  385. package/.agents/scripts/lib/orchestration/single-story-close/phases/push.js +6 -39
  386. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-block.js +1 -6
  387. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-outcome.js +4 -28
  388. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-override.js +6 -51
  389. package/.agents/scripts/lib/orchestration/single-story-close/phases/worktree-reap.js +6 -34
  390. package/.agents/scripts/lib/orchestration/single-story-close/phases/wrong-tree-guard.js +23 -121
  391. package/.agents/scripts/lib/orchestration/single-story-close/runner.js +110 -290
  392. package/.agents/scripts/lib/orchestration/single-story-lease-guard.js +15 -69
  393. package/.agents/scripts/lib/orchestration/story-body-gate.js +4 -23
  394. package/.agents/scripts/lib/orchestration/story-close/baseline-upward-writeback.js +50 -179
  395. package/.agents/scripts/lib/orchestration/story-close/context-budget-writeback.js +11 -41
  396. package/.agents/scripts/lib/orchestration/story-close/format-autofix.js +23 -311
  397. package/.agents/scripts/lib/orchestration/story-close/phases/local-lens-review.js +22 -147
  398. package/.agents/scripts/lib/orchestration/story-close/phases/review-core.js +16 -67
  399. package/.agents/scripts/lib/orchestration/story-deliver-terminal-schema.js +12 -68
  400. package/.agents/scripts/lib/orchestration/story-deliver-terminal.js +42 -201
  401. package/.agents/scripts/lib/orchestration/story-follow-ups.js +43 -245
  402. package/.agents/scripts/lib/orchestration/story-init-envelope.js +4 -23
  403. package/.agents/scripts/lib/orchestration/story-init-remote.js +2 -6
  404. package/.agents/scripts/lib/orchestration/story-reachability.js +3 -23
  405. package/.agents/scripts/lib/orchestration/task-body-validator.js +12 -126
  406. package/.agents/scripts/lib/orchestration/ticket-lease.js +28 -131
  407. package/.agents/scripts/lib/orchestration/ticket-validator-conflicts.js +15 -149
  408. package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +5 -33
  409. package/.agents/scripts/lib/orchestration/ticket-validator.js +39 -181
  410. package/.agents/scripts/lib/orchestration/ticketing/bulk.js +51 -244
  411. package/.agents/scripts/lib/orchestration/ticketing/reads.js +39 -250
  412. package/.agents/scripts/lib/orchestration/ticketing/state.js +14 -68
  413. package/.agents/scripts/lib/orchestration/ticketing/transition.js +46 -263
  414. package/.agents/scripts/lib/orchestration/ticketing.js +2 -26
  415. package/.agents/scripts/lib/orchestration/verify-credit.js +18 -79
  416. package/.agents/scripts/lib/orchestration/worktree-dirty.js +5 -30
  417. package/.agents/scripts/lib/path-security.js +3 -6
  418. package/.agents/scripts/lib/plan-phase-cleanup.js +9 -49
  419. package/.agents/scripts/lib/preflight-runner.js +13 -69
  420. package/.agents/scripts/lib/process-group.js +143 -0
  421. package/.agents/scripts/lib/project-root.js +2 -8
  422. package/.agents/scripts/lib/provider-factory.js +2 -25
  423. package/.agents/scripts/lib/qa/console-allowlist.js +10 -59
  424. package/.agents/scripts/lib/qa/qa-session.js +15 -69
  425. package/.agents/scripts/lib/qa/redact-evidence.js +18 -129
  426. package/.agents/scripts/lib/qa/resolve-qa-contract.js +26 -135
  427. package/.agents/scripts/lib/qa/resolve-selection.js +16 -84
  428. package/.agents/scripts/lib/reserved-test-ids.js +9 -47
  429. package/.agents/scripts/lib/runtime-deps/dep-resolution.js +13 -53
  430. package/.agents/scripts/lib/runtime-deps/ensure-installed.js +10 -44
  431. package/.agents/scripts/lib/runtime-deps/manifest.js +10 -30
  432. package/.agents/scripts/lib/runtime-deps/parser-major.js +15 -51
  433. package/.agents/scripts/lib/runtime-deps/preflight.js +4 -22
  434. package/.agents/scripts/lib/runtime-deps/scan-imports.js +11 -55
  435. package/.agents/scripts/lib/signals/detectors/common.js +12 -38
  436. package/.agents/scripts/lib/signals/index.js +2 -19
  437. package/.agents/scripts/lib/signals/schema.js +14 -109
  438. package/.agents/scripts/lib/signals/write.js +2 -11
  439. package/.agents/scripts/lib/single-story/confirm-merge.js +31 -72
  440. package/.agents/scripts/lib/single-story/story-merged-notify.js +8 -49
  441. package/.agents/scripts/lib/single-story-sweep/protection-ctx.js +4 -26
  442. package/.agents/scripts/lib/single-story-sweep/protection.js +13 -100
  443. package/.agents/scripts/lib/single-story-sweep/sweep-lock.js +60 -258
  444. package/.agents/scripts/lib/single-story-sweep.js +14 -97
  445. package/.agents/scripts/lib/skills/parse-skill.js +13 -59
  446. package/.agents/scripts/lib/skills/skills-index.js +8 -29
  447. package/.agents/scripts/lib/skills/walk-skill-files.js +17 -78
  448. package/.agents/scripts/lib/source-extensions.js +11 -42
  449. package/.agents/scripts/lib/source-text/strip-js-comments.js +8 -41
  450. package/.agents/scripts/lib/stdio-flush.js +9 -36
  451. package/.agents/scripts/lib/story-adjacency.js +8 -40
  452. package/.agents/scripts/lib/story-body/body-format-lints.js +22 -83
  453. package/.agents/scripts/lib/story-body/footer-block.js +11 -44
  454. package/.agents/scripts/lib/story-body/story-body.js +83 -358
  455. package/.agents/scripts/lib/temp-retention.js +42 -143
  456. package/.agents/scripts/lib/templates/decomposer-prompts.js +11 -65
  457. package/.agents/scripts/lib/test-env.js +12 -65
  458. package/.agents/scripts/lib/test-run-credit.js +10 -65
  459. package/.agents/scripts/lib/test-runner-contract.js +19 -74
  460. package/.agents/scripts/lib/test-temp.js +38 -184
  461. package/.agents/scripts/lib/test-tiers.js +12 -96
  462. package/.agents/scripts/lib/ticket-body-sections.js +21 -96
  463. package/.agents/scripts/lib/transpile.js +15 -74
  464. package/.agents/scripts/lib/util/concurrent-map.js +6 -25
  465. package/.agents/scripts/lib/util/parse-id-list.js +8 -34
  466. package/.agents/scripts/lib/util/poll-loop.js +8 -28
  467. package/.agents/scripts/lib/util/with-timeout.js +2 -11
  468. package/.agents/scripts/lib/validation-evidence.js +21 -96
  469. package/.agents/scripts/lib/wave-runner/footprint.js +17 -70
  470. package/.agents/scripts/lib/wave-runner/live-probe.js +53 -221
  471. package/.agents/scripts/lib/wave-runner/ready-set.js +72 -301
  472. package/.agents/scripts/lib/workers/crap-worker.js +11 -64
  473. package/.agents/scripts/lib/workers/maintainability-report-worker.js +8 -45
  474. package/.agents/scripts/lib/workers/maintainability-worker.js +5 -21
  475. package/.agents/scripts/lib/workers/serve-worker-messages.js +2 -18
  476. package/.agents/scripts/lib/workflow-closure.js +22 -105
  477. package/.agents/scripts/lib/workspace-provisioner.js +16 -54
  478. package/.agents/scripts/lib/worktree/git-hooks.js +15 -60
  479. package/.agents/scripts/lib/worktree/lifecycle/force-drain.js +20 -60
  480. package/.agents/scripts/lib/worktree/lifecycle/merge-reachability.js +10 -62
  481. package/.agents/scripts/lib/worktree/lifecycle/pending-cleanup.js +22 -86
  482. package/.agents/scripts/lib/worktree/lifecycle/reap.js +24 -126
  483. package/.agents/scripts/lib/worktree/lifecycle-manager.js +2 -20
  484. package/.agents/scripts/lib/worktree/node-modules-strategy.js +46 -180
  485. package/.agents/scripts/lib/worktree-manager.js +15 -40
  486. package/.agents/scripts/lint-issue-body.js +12 -68
  487. package/.agents/scripts/mandrel-update-preflight.js +10 -70
  488. package/.agents/scripts/merge-baseline.js +30 -104
  489. package/.agents/scripts/nav-registry-diff.js +22 -108
  490. package/.agents/scripts/notify.js +12 -69
  491. package/.agents/scripts/plan-context.js +27 -111
  492. package/.agents/scripts/plan-critics.js +12 -66
  493. package/.agents/scripts/plan-persist.js +31 -148
  494. package/.agents/scripts/plan-run-epilogue.js +11 -37
  495. package/.agents/scripts/pr-watch-with-update.js +76 -267
  496. package/.agents/scripts/providers/github/auth.js +3 -8
  497. package/.agents/scripts/providers/github/blocked-by-add.js +14 -61
  498. package/.agents/scripts/providers/github/board-add.js +5 -21
  499. package/.agents/scripts/providers/github/branch-protection.js +11 -43
  500. package/.agents/scripts/providers/github/cache.js +2 -14
  501. package/.agents/scripts/providers/github/comments.js +7 -40
  502. package/.agents/scripts/providers/github/compose.js +3 -19
  503. package/.agents/scripts/providers/github/errors.js +22 -125
  504. package/.agents/scripts/providers/github/issues.js +31 -123
  505. package/.agents/scripts/providers/github/labels.js +24 -124
  506. package/.agents/scripts/providers/github/mappers.js +5 -27
  507. package/.agents/scripts/providers/github/merge-methods.js +3 -22
  508. package/.agents/scripts/providers/github/project-board.js +2 -17
  509. package/.agents/scripts/providers/github/projects-v2-graphql.js +3 -6
  510. package/.agents/scripts/providers/github/request-helpers.js +5 -32
  511. package/.agents/scripts/providers/github/search-budget.js +9 -39
  512. package/.agents/scripts/providers/github/search-query.js +5 -26
  513. package/.agents/scripts/providers/github/sub-issue-add.js +15 -65
  514. package/.agents/scripts/providers/github/sub-issues.js +7 -36
  515. package/.agents/scripts/providers/github/tickets.js +32 -134
  516. package/.agents/scripts/providers/github.js +18 -59
  517. package/.agents/scripts/prune-plan-run-labels.js +12 -46
  518. package/.agents/scripts/quality-preview.js +35 -220
  519. package/.agents/scripts/resolve-doc-tiers.js +3 -26
  520. package/.agents/scripts/resolve-stories.js +16 -67
  521. package/.agents/scripts/resync-status-column.js +6 -25
  522. package/.agents/scripts/run-tests.js +29 -104
  523. package/.agents/scripts/single-story-close.js +23 -135
  524. package/.agents/scripts/single-story-confirm-merge.js +32 -139
  525. package/.agents/scripts/single-story-init.js +47 -209
  526. package/.agents/scripts/stories-wave-tick.js +102 -472
  527. package/.agents/scripts/sync-agentrc.js +3 -21
  528. package/.agents/scripts/sync-claude-agents.js +9 -55
  529. package/.agents/scripts/sync-claude-commands.js +20 -110
  530. package/.agents/scripts/test-wrapper.js +6 -43
  531. package/.agents/scripts/update-coverage-baseline.js +5 -22
  532. package/.agents/scripts/update-crap-baseline.js +7 -30
  533. package/.agents/scripts/update-duplication-baseline.js +16 -92
  534. package/.agents/scripts/update-maintainability-baseline.js +8 -62
  535. package/.agents/scripts/update-ticket-state.js +1 -7
  536. package/.agents/scripts/validate-skills.js +6 -26
  537. package/.agents/templates/agent-protocol.md +2 -2
  538. package/.agents/templates/docs/audit-sweep-runbook.md +3 -4
  539. package/.agents/workflows/audit-accessibility.md +4 -7
  540. package/.agents/workflows/audit-adrs.md +3 -6
  541. package/.agents/workflows/audit-architecture.md +3 -11
  542. package/.agents/workflows/audit-baselines.md +6 -9
  543. package/.agents/workflows/audit-clean-code.md +8 -12
  544. package/.agents/workflows/audit-data-model.md +3 -7
  545. package/.agents/workflows/audit-dependencies.md +4 -7
  546. package/.agents/workflows/audit-devops.md +4 -8
  547. package/.agents/workflows/audit-documentation.md +1 -4
  548. package/.agents/workflows/audit-mobile.md +4 -7
  549. package/.agents/workflows/audit-navigability.md +3 -6
  550. package/.agents/workflows/audit-performance.md +2 -4
  551. package/.agents/workflows/audit-privacy.md +4 -7
  552. package/.agents/workflows/audit-quality.md +4 -7
  553. package/.agents/workflows/audit-security.md +4 -7
  554. package/.agents/workflows/audit-seo.md +4 -7
  555. package/.agents/workflows/audit-sre.md +4 -7
  556. package/.agents/workflows/audit-to-stories.md +17 -30
  557. package/.agents/workflows/audit-ux-ui.md +4 -7
  558. package/.agents/workflows/helpers/audit-lens-core.md +1 -1
  559. package/.agents/workflows/helpers/code-quality-guardrails.md +12 -15
  560. package/.agents/workflows/helpers/deliver-digest.md +6 -4
  561. package/.agents/workflows/helpers/deliver-reference.md +114 -188
  562. package/.agents/workflows/helpers/deliver-story-reference.md +189 -533
  563. package/.agents/workflows/helpers/plan-reference.md +86 -139
  564. package/.agents/workflows/helpers/qa-core.md +12 -0
  565. package/.agents/workflows/memory-consolidate.md +1 -1
  566. package/.agents/workflows/qa-assist.md +27 -71
  567. package/.agents/workflows/qa-explore.md +19 -59
  568. package/.agents/workflows/qa-run.md +11 -33
  569. package/README.md +1 -1
  570. package/bin/mandrel.js +5 -46
  571. package/bin/postinstall.js +18 -107
  572. package/docs/CHANGELOG.md +32 -0
  573. package/lib/cli/doctor.js +11 -71
  574. package/lib/cli/init.js +26 -165
  575. package/lib/cli/migrate.js +5 -64
  576. package/lib/cli/registry.js +84 -467
  577. package/lib/cli/sync-agents.js +4 -64
  578. package/lib/cli/sync-commands.js +11 -64
  579. package/lib/cli/sync.js +34 -213
  580. package/lib/cli/uninstall.js +40 -219
  581. package/lib/cli/update.js +105 -661
  582. package/lib/cli/version-check.js +8 -72
  583. package/lib/cli/version-helpers.js +14 -87
  584. package/lib/migrations/helpers/retire-agentrc-key.js +11 -52
  585. package/lib/migrations/index.js +15 -92
  586. package/lib/migrations/steps/2.1.0-retire-mi-drop-knobs.js +2 -15
  587. package/lib/migrations/steps/2.1.0-retire-verify-concurrency-cap.js +1 -13
  588. package/lib/migrations/steps/2.11.0-retire-max-seed-words.js +2 -15
  589. package/lib/migrations/steps/2.2.0-retire-epic-ac-tags.js +9 -38
  590. package/lib/migrations/steps/2.20.0-retire-codebase-snapshot.js +1 -13
  591. package/lib/migrations/steps/2.32.0-retire-lint-baseline-command.js +2 -27
  592. package/lib/migrations/steps/2.57.0-retire-delivery-limit-knobs.js +2 -23
  593. package/lib/migrations/steps/2.57.0-retire-planning-limit-knobs.js +2 -27
  594. package/lib/migrations/steps/2.60.0-retire-audit-results-autofile.js +2 -21
  595. package/lib/migrations/steps/strip-removed-agentrc-keys.js +333 -0
  596. package/package.json +16 -14
  597. package/.agents/docs/SDLC.md +0 -590
  598. package/.agents/docs/quality-gates.md +0 -1183
  599. package/.agents/rules/known-tooling-behavior.md +0 -200
  600. package/.agents/rules/orchestration-error-handling.md +0 -61
  601. package/.agents/rules/test-seams.md +0 -59
  602. package/.agents/schemas/baselines/lighthouse.schema.json +0 -59
  603. package/.agents/schemas/baselines/lint.schema.json +0 -47
  604. package/.agents/scripts/check-action-pinning.js +0 -260
  605. package/.agents/scripts/check-audit-attribution.js +0 -302
  606. package/.agents/scripts/check-baseline-drift.js +0 -211
  607. package/.agents/scripts/check-baseline-scope.js +0 -362
  608. package/.agents/scripts/check-generated-validator.js +0 -202
  609. package/.agents/scripts/check-knip-entries.js +0 -159
  610. package/.agents/scripts/check-lifecycle-lint.js +0 -294
  611. package/.agents/scripts/check-pinned-override-notes.js +0 -102
  612. package/.agents/scripts/check-schema-references.js +0 -368
  613. package/.agents/scripts/check-test-portability.js +0 -512
  614. package/.agents/scripts/check-workflow-citations.js +0 -218
  615. package/.agents/scripts/check-workflow-cli-lint.js +0 -299
  616. package/.agents/scripts/check-workflow-timeouts.js +0 -291
  617. package/.agents/scripts/install-matrix-assert.js +0 -326
  618. package/.agents/scripts/lib/audit-advisories.js +0 -195
  619. package/.agents/scripts/lib/audit-attribution.js +0 -134
  620. package/.agents/scripts/lib/baselines/drift-detector.js +0 -351
  621. package/.agents/scripts/lib/baselines/kinds/lighthouse.js +0 -87
  622. package/.agents/scripts/lib/baselines/kinds/lint.js +0 -184
  623. package/.agents/scripts/lib/baselines/orphan-pruner.js +0 -233
  624. package/.agents/scripts/lib/baselines/scope-assert.js +0 -223
  625. package/.agents/scripts/lib/baselines/scope-inventory.js +0 -314
  626. package/.agents/scripts/lib/c8-cli-path.js +0 -21
  627. package/.agents/scripts/lib/config/gates/lighthouse.schema.js +0 -51
  628. package/.agents/scripts/lib/config/gates/lint.schema.js +0 -18
  629. package/.agents/scripts/lib/dynamic-workflow/architecture-report-contract.js +0 -70
  630. package/.agents/scripts/lib/dynamic-workflow/audit-orchestrator.js +0 -284
  631. package/.agents/scripts/lib/dynamic-workflow/clean-code-report-contract.js +0 -80
  632. package/.agents/scripts/lib/dynamic-workflow/degraded-coverage.js +0 -81
  633. package/.agents/scripts/lib/dynamic-workflow/documentation-report-contract.js +0 -87
  634. package/.agents/scripts/lib/dynamic-workflow/performance-report-contract.js +0 -74
  635. package/.agents/scripts/lib/dynamic-workflow/quality-report-contract.js +0 -90
  636. package/.agents/scripts/lib/dynamic-workflow/report-contract-core.js +0 -43
  637. package/.agents/scripts/lib/dynamic-workflow/security-report-contract.js +0 -83
  638. package/.agents/scripts/lib/fs-walk.js +0 -52
  639. package/.agents/scripts/lib/knip-config-resolver.js +0 -181
  640. package/.agents/scripts/lib/knip-entry-sync.js +0 -452
  641. package/.agents/scripts/lib/pinned-override-notes.js +0 -88
  642. package/.agents/scripts/lib/pinned-override-resolve.js +0 -212
  643. package/.agents/scripts/lib/test-isolate/cli-options.js +0 -93
  644. package/.agents/scripts/lib/test-isolate/env-snapshot-loader.js +0 -52
  645. package/.agents/scripts/lib/test-isolate/list-files.js +0 -90
  646. package/.agents/scripts/lib/test-isolate/parse-tap.js +0 -75
  647. package/.agents/scripts/lib/test-isolate/progress-log.js +0 -45
  648. package/.agents/scripts/lib/test-isolate/render-report.js +0 -97
  649. package/.agents/scripts/lib/test-isolate/run-isolate.js +0 -87
  650. package/.agents/scripts/lib/test-isolate/runner.js +0 -483
  651. package/.agents/scripts/lib/test-profile/parse-tap.js +0 -136
  652. package/.agents/scripts/lib/test-profile/render-report.js +0 -45
  653. package/.agents/scripts/lint-label-vocabulary.js +0 -214
  654. package/.agents/scripts/post-structured-comment.js +0 -127
  655. package/.agents/scripts/provision-git-hooks.js +0 -85
  656. package/.agents/scripts/prune-baseline-orphans.js +0 -181
  657. package/.agents/scripts/run-coverage.js +0 -197
  658. package/.agents/scripts/run-lint.js +0 -133
  659. package/.agents/scripts/run-test-profile.js +0 -129
  660. package/.agents/scripts/run-verify.js +0 -125
  661. package/.agents/scripts/test-isolate.js +0 -55
  662. package/.agents/scripts/update-dead-exports-baseline.js +0 -321
@@ -1,185 +1,76 @@
1
1
  /**
2
- * lib/orchestration/ticketing/reads.js — Ticketing read-side surface.
3
- *
4
- * Holds the read-only helpers, validators, and the process-level
5
- * structured-comment cache. Pure of state mutations; importing this
6
- * module never issues a `ticket-mutating` call to the provider.
7
- *
8
- * Split out of `../ticketing.js` under Story #1848 to keep the verb
9
- * families separated (`reads` / `state` / `bulk`). External callers
10
- * continue importing the same names from `../ticketing.js`, which
11
- * re-exports the surface defined here.
2
+ * lib/orchestration/ticketing/reads.js — Ticketing read-side surface:
3
+ * validators, markers, and the per-provider structured-comment caches.
4
+ * Never issues a mutating provider call.
12
5
  */
13
6
 
14
7
  import { AGENT_LABELS } from '../../label-constants.js';
15
8
 
16
9
  const WAVE_MARKER_RE = /^wave-([0-9]{1,3})-(start|end)$/;
17
10
 
18
- /**
19
- * Canonical agent-state label triad used by every state mutator. Kept on
20
- * the read side so `state.js` and `bulk.js` can both import without
21
- * pulling in any mutation helpers.
22
- */
23
11
  export const STATE_LABELS = {
24
12
  READY: AGENT_LABELS.READY,
25
13
  EXECUTING: AGENT_LABELS.EXECUTING,
26
- // Story #2144 — intermediate state held by a Story between successful
27
- // close-preflight and a confirmed Story PR merge into `main`. Included in
28
- // the state enum so `transitionTicketState` can apply the label via
29
- // the canonical one-state-at-a-time path (which removes every other
30
- // `agent::*` label in the same call) and so the read-side `ALL_STATES`
31
- // export — consumed by `state.js`'s `fromState` lookup — recognises
32
- // `agent::closing` as a valid prior state when a `--resume` flip back
33
- // to `done` fires post-merge.
14
+ // Held between close-preflight and a confirmed PR merge; must be a valid
15
+ // prior state for the post-merge `--resume` flip to `done`.
34
16
  CLOSING: AGENT_LABELS.CLOSING,
35
17
  DONE: AGENT_LABELS.DONE,
36
- // Story #2004 — `agent::blocked` is the framework's single authoritative
37
- // HITL pause point (see `.agents/instructions.md` §1.J). Adding it to the
38
- // state enum lets `transitionTicketState` (and the
39
- // `update-ticket-state.js` CLI) apply the label through the canonical
40
- // one-state-at-a-time path; without it the workflow contract that names
41
- // `agent::blocked` cannot be honoured by the tooling.
18
+ // The single HITL pause point (instructions.md § 1.J).
42
19
  BLOCKED: AGENT_LABELS.BLOCKED,
43
20
  };
44
21
 
45
- /**
46
- * Frozen list of every recognised `agent::*` state label. Exposed for
47
- * downstream guards (e.g. transition predicates) that need to match
48
- * against the full set without re-enumerating `STATE_LABELS`.
49
- */
50
22
  export const ALL_STATES = Object.values(STATE_LABELS);
51
23
 
52
24
  /**
53
- * Enumerated structured-comment types accepted by `postStructuredComment` and
54
- * `upsertStructuredComment`. Parametric `wave-N-start` / `wave-N-end` types
55
- * are matched separately by {@link WAVE_TYPE_PATTERN}.
25
+ * Structured-comment types accepted by the post/upsert paths; parametric
26
+ * `wave-N-start|end` types match {@link WAVE_TYPE_PATTERN}. A kind nothing
27
+ * emits any more is dead wiring and is removed. Some kinds stay registered
28
+ * only so historical comments remain readable.
56
29
  */
57
30
  export const STRUCTURED_COMMENT_TYPES = Object.freeze([
58
- // Legacy core set
59
31
  'progress',
60
32
  'friction',
61
33
  'notification',
62
- // Extended set (Story #449 — retro follow-ons)
63
- // Story #4411 (Epic #4405) — the former `code-review` structured comment
64
- // is unified with the former `audit-results` comment into the single
65
- // `verification-results` findings contract. `runCodeReview` (the sole code
66
- // producer) upserts `verification-results`; the feedback-loop graduators and
67
- // the auto-merge integration gate read it. Both the `code-review` and (as of
68
- // Story #4412's slim-Epic-close cutover) the `audit-results` markers are
69
- // retired here — the Phase 4 standalone lens walk folded into the Phase 5
70
- // code-review pass, whose single `verification-results` comment now carries
71
- // the Epic-close lens findings. Hard cutover, no dual-shape reader per
72
- // `git-conventions.md`.
34
+ // Single findings contract for code review and lens findings.
73
35
  'verification-results',
74
36
  'retro',
75
37
  'retro-partial',
76
- // v2 Story closeout — actionable follow-ups from friction signals
77
38
  'follow-ups',
78
- // v2 plan-run epilogue artifacts (posted on the primary Story)
79
39
  'plan-run-audit-roster',
80
40
  'epic-run-state',
81
41
  'epic-run-progress',
82
42
  'epic-plan-state',
83
- // `parked-follow-ons` retired in Story #5114 with the module that was its
84
- // only writer, and `plan-run-sibling-coherence` in Story #5341 with the
85
- // epilogue step that was its. Story #5367 retired two more on the same
86
- // rule: `story-init` (its write went away in #5343 — the receipt is read
87
- // off disk now) and `model-attribution` (its writer went with the per-Task
88
- // progress writer in #3157, and its reader modules are deleted). A kind the
89
- // reader still recognises but nothing emits is the same dead wiring in a
90
- // new place.
91
- // Story #566 — per-phase wall-clock summary posted by single-story-close.js.
92
43
  'phase-timings',
93
- // Story #2128 — Phase 6 Epic Clarity Gate (CLI retired). Historical
94
- // `clarity-gate-update` comments may still exist on older tickets.
95
44
  'clarity-gate-update',
96
- // Story #2635 — Tech Spec freshness check. `plan-persist.js`
97
- // upserts a `spec-freshness` comment on the Epic listing any
98
- // path-shaped references that don't exist at the base branch, so the
99
- // operator can correct drift before Phase 8 decomposes from a stale
100
- // spec. Advisory: the run continues regardless of the report contents.
45
+ // Advisory: path references missing at the base branch.
101
46
  'spec-freshness',
102
- // Story #2894 — `finalize/post-handoff-comment.js` upserts an
103
- // `epic-handoff` comment on the Epic at the end of the bus-owned
104
- // finalize flow (after `open-or-locate-pr`
105
- // succeed). The marker carries the freshly opened/located PR URL and
106
- // its number so operators can jump straight to the PR from the Epic
107
- // ticket. Re-invocations upsert the same marker rather than appending
108
- // duplicates.
109
47
  'epic-handoff',
110
- // Story #2899 (Epic #2880, F13) — the deleted `epic-deliver-preflight.js`
111
- // upserted a `delivery-preflight` comment on the Epic at the start of
112
- // pre-v2 Epic `/mandrel-deliver` Phase 1, surfacing estimated story count, install cost,
113
- // wave count, GitHub API request volume, Claude quota burn, and any
114
- // threshold breaches against `delivery.preflight.max*`. One entry per
115
- // Epic; re-runs replace prior content.
116
48
  'delivery-preflight',
117
- // Story #3062 (Epic #3051) — the deleted `wave-tick.js` upserted a
118
- // `recurring-failure-class` comment on the Epic when the cross-Story
119
- // detector finds two or more Stories that hit the same `failedGate` in
120
- // `close-validate.end`. One entry per Epic; re-ticks with the same
121
- // findings upsert in place (`upsertStructuredComment` diffs by body).
122
49
  'recurring-failure-class',
123
- // Story #3061 (Epic #3051) — the pre-v2 `/mandrel-deliver` idle-watchdog prose
124
- // instructed the parent host LLM to upsert a `wave-stall` comment on the
125
- // Epic whenever an in-flight Story had been silent for longer than the
126
- // configured cadence. The deleted `wave-tick.js --check-idle` CLI emitted
127
- // the matching envelope; registering the kind here keeps historical
128
- // the documented remediation actually executable
129
- // (assertValidStructuredCommentType would otherwise throw).
130
50
  'wave-stall',
131
- // Story #4019 — the plan-tier lease guard upserts a `plan-lease`
132
- // comment at lease-acquire time, recording the claiming operator and the
133
- // claim timestamp. Nothing emits a per-run liveness beat, so this
134
- // claim-time is the only age signal a reader has when reasoning about the
135
- // documented `--steal` contract. The guard itself fails closed regardless
136
- // (it anchors liveness to `now`), so a stranded claim is cleared with
137
- // `--steal`, not by TTL expiry. One entry per ticket; re-acquires upsert
138
- // in place.
51
+ // Records claimant + claim time; the guard fails closed, so a stranded
52
+ // claim is cleared with `--steal`, not by TTL.
139
53
  'plan-lease',
140
- // Story #4415 (Epic #4406) — the feedback-loop graduator
141
- // (`retro-proposals-graduator.js`) upserts a
142
- // `cross-repo-deferred` comment listing findings that route
143
- // to a different repository and were therefore not filed here. Replaces
144
- // the prior log-line-only trace so the deferral survives the finalize
145
- // run as a durable, operator-visible record. Discriminated by a
146
- // `graduator="<name>"` attr so independent graduators do not clobber each
147
- // other's comment; re-runs upsert in place.
54
+ // Discriminated by a `graduator="<name>"` attr so graduators don't clobber
55
+ // each other.
148
56
  'cross-repo-deferred',
149
- // v2 Stage 3 — the flat Story persist comment on every created Story
150
- // (replaces epic-plan-state for new plans). Since Story #5343 it is the
151
- // ONLY comment persist posts: the primary-Story-only `plan-summary` marker
152
- // was retired and its content — story set, delivery order, deliver command
153
- // — rides this marker on every Story. Story #5367 deleted the machine
154
- // checkpoint that used to lead the body; the marker remains, and it is what
155
- // makes a re-persist upsert in place.
57
+ // The only comment persist posts on each Story; the marker makes a
58
+ // re-persist upsert in place.
156
59
  'story-plan-state',
157
- // Story #4535 — `plan-persist.js` upserts a `superseded-by` comment on
158
- // each `/mandrel-plan --tickets` source issue at persist time, naming the single
159
- // Story that claims it (plus any per-supersede note the plan authored),
160
- // immediately before closing the issue as `not_planned`. Keying off this
161
- // marker rather than a bare `postComment` is what makes a re-run
162
- // non-double-commenting. One entry per source issue.
60
+ // Posted before closing a superseded source issue; the marker keeps
61
+ // re-runs from double-commenting.
163
62
  'superseded-by',
164
63
  ]);
165
64
 
166
65
  export const WAVE_TYPE_PATTERN = WAVE_MARKER_RE;
167
66
 
168
67
  /**
169
- * Pool-mode claim-comment marker. One marker per story-id (the comment is
170
- * upserted, so racing claims on the same story collapse to a single
171
- * authoritative entry — the label set is the actual race-detection signal).
172
- * Bounded to 1-9 digits to mirror the wave-marker safety margin.
68
+ * Pool-mode claim marker, upserted per story-id; the label set, not the
69
+ * comment, is the race-detection signal.
173
70
  */
174
71
  const CLAIM_TYPE_PATTERN = /^claim-([0-9]{1,9})$/;
175
72
 
176
- /**
177
- * Lifecycle-listener marker pattern (Story #2239 / #2241 / #2242). The
178
- * lifecycle StructuredCommentPoster writes minimal markers prefixed with
179
- * `lifecycle-` (e.g. `lifecycle-wave-0-start`, `lifecycle-epic-blocked`,
180
- * `lifecycle-epic-unblocked`). Treated as a generic prefix so future
181
- * listener-owned events can mint new markers without touching this enum.
182
- */
73
+ /** Generic `lifecycle-*` prefix so listeners can mint markers freely. */
183
74
  const LIFECYCLE_TYPE_PATTERN = /^lifecycle-[a-z0-9]+(?:-[a-z0-9]+)*$/;
184
75
 
185
76
  /**
@@ -197,10 +88,6 @@ export function isValidStructuredCommentType(type) {
197
88
  }
198
89
 
199
90
  /**
200
- * Throws if `type` is not a recognized structured-comment type. Error
201
- * message lists the accepted enum plus the wave pattern to make the
202
- * schema discoverable from the failure alone.
203
- *
204
91
  * @param {string} type
205
92
  */
206
93
  export function assertValidStructuredCommentType(type) {
@@ -212,18 +99,9 @@ export function assertValidStructuredCommentType(type) {
212
99
  }
213
100
 
214
101
  /**
215
- * Build an HTML marker that uniquely identifies a structured comment by
216
- * type plus an optional discriminator attribute bag. The marker is embedded
217
- * in the comment body so it can be discovered on read-back via
218
- * `findStructuredComment`.
219
- *
220
- * `attrs` lets a single `type` namespace coexist with multiple in-place
221
- * snapshots keyed by an additional dimension. The canonical use is the
222
- * per-wave `wave-run-progress` comment: each wave upserts its own snapshot
223
- * via `{ wave: N }` so subsequent waves don't overwrite prior rows.
224
- * Without the discriminator the next wave's upsert finds (and deletes) the
225
- * prior wave's comment, leaving the cross-wave epic-run-progress rollup
226
- * with a single row.
102
+ * HTML marker identifying a structured comment. `attrs` discriminates
103
+ * several snapshots of one type (e.g. one per wave) so an upsert doesn't
104
+ * overwrite a sibling.
227
105
  *
228
106
  * @param {string} type
229
107
  * @param {Record<string, string|number>} [attrs]
@@ -241,46 +119,14 @@ export function structuredCommentMarker(type, attrs = null) {
241
119
  }
242
120
 
243
121
  /**
244
- * Per-provider cache mapping `${ticketId}|${type}|${attrsHash}` to the
245
- * comment id (and the cached comment payload) returned by the most
246
- * recent `findStructuredComment` / `upsertStructuredComment` call.
247
- * Story #1795 — every Epic run owns its process for the duration of
248
- * the run, so a single seed-then-reuse window saves one
249
- * `getTicketComments` per repeat upsert on the hot path (`story-init`,
250
- * `verification-results`, etc).
251
- *
252
- * Lifecycle:
253
- * - First call to `findStructuredComment(provider, t, type, attrs)`
254
- * hits `getTicketComments` and seeds the cache with the resolved
255
- * comment (or `null` to record the "no comment yet" miss).
256
- * - Subsequent calls with the same provider return the cached row
257
- * without a list call.
258
- * - `upsertStructuredComment` refreshes the cache to the new
259
- * comment id after `postComment` succeeds.
260
- * - `deleteComment` paths inside this module evict the entry.
261
- *
262
- * Cache is scoped to the provider instance via a WeakMap — different
263
- * providers (including per-test fakes) get isolated caches so state
264
- * cannot leak across boundaries. Tests reset via the exported
265
- * `_resetStructuredCommentCache()` seam.
122
+ * Per-provider `(ticketId, type, attrs)` → resolved comment (or `null` miss).
123
+ * Upsert refreshes and delete evicts entries. WeakMap-scoped so fakes stay
124
+ * isolated.
266
125
  */
267
126
  const _structuredCommentCache = new WeakMap();
268
127
 
269
128
  /**
270
- * Build a well-formed ticket snapshot for a Story that has zero child
271
- * Tasks. Story #3097 (Wave-0 additive, Epic #3078 Strategy B) — the
272
- * 2-tier hierarchy collapses Epic → Story → Task into
273
- * Epic → Story, so a Story may legitimately have no Task
274
- * children. Read-side callers that expect a `subTickets` array on the
275
- * Story can route through this helper to materialise an empty-children
276
- * snapshot without paying a provider round-trip and without risk of
277
- * `undefined.map` dereferences. Pure / synchronous; never touches the
278
- * provider.
279
- *
280
- * The function preserves every field on the input `ticket` and merely
281
- * pins `subTickets` to `[]` when omitted. Callers that already hold a
282
- * resolved children list pass it through; the Storyless path is the
283
- * default.
129
+ * Snapshot of a ticket with `subTickets` pinned (default `[]`); pure.
284
130
  *
285
131
  * @param {object|null|undefined} ticket
286
132
  * @param {{ subTickets?: Array<object> }} [opts]
@@ -294,7 +140,6 @@ export function buildStorylessTicketSnapshot(ticket, opts = {}) {
294
140
  }
295
141
 
296
142
  /**
297
- * Lookup (or lazily create) the per-provider cache map.
298
143
  * @param {object} provider
299
144
  * @returns {Map<string, object|null>}
300
145
  */
@@ -309,8 +154,7 @@ export function getProviderCommentCache(provider) {
309
154
  }
310
155
 
311
156
  /**
312
- * Build a stable cache key for `(ticketId, type, attrs)`. Attrs object
313
- * is normalised by sorted JSON so equivalent keys collide. Story #1795.
157
+ * Attrs are key-sorted so equivalent bags collide.
314
158
  *
315
159
  * @param {number} ticketId
316
160
  * @param {string} type
@@ -329,31 +173,12 @@ export function structuredCommentCacheKey(ticketId, type, attrs) {
329
173
  }
330
174
 
331
175
  /**
332
- * Per-provider raw-comments cache mapping ticketId → the full comment
333
- * array returned by the most recent `provider.getTicketComments(ticketId)`
334
- * call. Story #2465 — `findStructuredComment` is invoked back-to-back for
335
- * different `type` discriminators against the same ticket (e.g.
336
- * `story-init` + `verification-results` + a `friction` probe during a
337
- * single close). Without this cache each lookup pays a full
338
- * pagination round-trip even when the prior call already fetched the
339
- * same comments. The structured-comment-id cache short-circuits *repeat*
340
- * lookups for the same `(type, attrs)` tuple but does not help across
341
- * different types on the same ticket.
342
- *
343
- * Lifecycle:
344
- * - `findStructuredComment` consults this raw cache before issuing
345
- * `provider.getTicketComments`; on cache miss it seeds the entry
346
- * from the response.
347
- * - `postStructuredComment` and `upsertStructuredComment` evict the
348
- * entry for the mutated ticketId — any cached array is stale once
349
- * a new comment lands.
350
- * - Scoped per-provider via WeakMap so test fakes never share state
351
- * with the real GitHubProvider.
176
+ * Per-provider ticketId → full comment array, so lookups for different types
177
+ * on one ticket share one fetch. Structured-comment writes evict the entry.
352
178
  */
353
179
  const _rawCommentsCache = new WeakMap();
354
180
 
355
181
  /**
356
- * Lookup (or lazily create) the per-provider raw-comments cache.
357
182
  * @param {object} provider
358
183
  * @returns {Map<number, object[]>}
359
184
  */
@@ -368,10 +193,6 @@ export function getProviderRawCommentsCache(provider) {
368
193
  }
369
194
 
370
195
  /**
371
- * Evict the cached raw-comments array for a given ticket on a provider.
372
- * Called from the structured-comment write paths after a `postComment`
373
- * lands. Safe to call when no entry exists.
374
- *
375
196
  * @param {object} provider
376
197
  * @param {number} ticketId
377
198
  */
@@ -383,9 +204,6 @@ export function invalidateRawCommentsCache(provider, ticketId) {
383
204
  }
384
205
 
385
206
  /**
386
- * Test seam — reset the raw-comments cache for a provider. Mirrors
387
- * `_resetStructuredCommentCache` for the structured-id cache.
388
- *
389
207
  * @param {object} [provider]
390
208
  */
391
209
  export function _resetRawCommentsCache(provider) {
@@ -395,17 +213,7 @@ export function _resetRawCommentsCache(provider) {
395
213
  }
396
214
 
397
215
  /**
398
- * Test seam — reset the structured-comment ID cache.
399
- * Exported so unit tests can isolate cases without restarting the
400
- * process. Without arguments the entire WeakMap is dropped by
401
- * reassigning the per-provider map of every known provider — in
402
- * practice tests just hand in their fresh provider instance which
403
- * has no cached state yet. Production callers never invoke this.
404
- *
405
- * @param {object} [provider] When supplied, clears just that
406
- * provider's cache; otherwise no-op (per-provider caches are
407
- * already isolated by WeakMap and tests creating fresh providers
408
- * get clean state automatically).
216
+ * @param {object} [provider] Clears that provider's cache; otherwise no-op.
409
217
  */
410
218
  export function _resetStructuredCommentCache(provider) {
411
219
  if (provider && typeof provider === 'object') {
@@ -414,12 +222,9 @@ export function _resetStructuredCommentCache(provider) {
414
222
  }
415
223
 
416
224
  /**
417
- * Test seam — peek at a provider's cache contents. Returns the raw
418
- * Map for read-only inspection (do not mutate). Story #1795.
225
+ * Read-only view of a provider's cache (do not mutate).
419
226
  *
420
- * @param {object} [provider] If supplied, returns that provider's
421
- * cache Map; otherwise returns an empty Map for callers that just
422
- * want a stable shape.
227
+ * @param {object} [provider]
423
228
  */
424
229
  export function _peekStructuredCommentCache(provider) {
425
230
  if (provider && typeof provider === 'object') {
@@ -429,20 +234,8 @@ export function _peekStructuredCommentCache(provider) {
429
234
  }
430
235
 
431
236
  /**
432
- * Find the most recent structured comment of a given type on a ticket.
433
- * Detection is based on the HTML marker produced by
434
- * `structuredCommentMarker(type, attrs)`.
435
- *
436
- * When `attrs` is provided, only comments whose marker carries the same
437
- * discriminator attributes are returned — see `structuredCommentMarker` for
438
- * the per-wave `wave-run-progress` use case.
439
- *
440
- * Story #1795 — results are memoised in a process-level cache keyed by
441
- * `(ticketId, type, attrsHash)`. The first call seeds the cache with
442
- * the resolved comment (or `null` for the "no such comment yet" miss);
443
- * every subsequent call returns the cached row without issuing another
444
- * `getTicketComments`. `upsertStructuredComment` refreshes the cache
445
- * after a successful repost, and its delete path evicts the entry.
237
+ * Latest comment carrying `structuredCommentMarker(type, attrs)`; memoised
238
+ * per `(ticketId, type, attrs)`, including misses.
446
239
  *
447
240
  * @param {import('../../ITicketingProvider.js').ITicketingProvider} provider
448
241
  * @param {number} ticketId
@@ -462,10 +255,6 @@ export async function findStructuredComment(
462
255
  return cache.get(cacheKey);
463
256
  }
464
257
  const marker = structuredCommentMarker(type, attrs);
465
- // Story #2465 — consult the per-ticketId raw-comments cache before
466
- // hitting the wire. Two back-to-back `findStructuredComment` calls for
467
- // different types against the same ticket would otherwise both pay a
468
- // full `getTicketComments` round-trip.
469
258
  const rawCache = getProviderRawCommentsCache(provider);
470
259
  let comments;
471
260
  if (rawCache.has(ticketId)) {
@@ -474,7 +263,7 @@ export async function findStructuredComment(
474
263
  comments = (await provider.getTicketComments(ticketId)) ?? [];
475
264
  rawCache.set(ticketId, comments);
476
265
  }
477
- // Return latest match (comments API sorts ascending by creation; take last).
266
+ // Comments sort ascending by creation; take the last match.
478
267
  const matches = comments.filter(
479
268
  (c) => typeof c.body === 'string' && c.body.includes(marker),
480
269
  );
@@ -1,25 +1,8 @@
1
1
  /**
2
- * lib/orchestration/ticketing/state.js — Ticket state-mutation facade.
3
- *
4
- * Owns the structured-comment upsert (`upsertStructuredComment`) and the
5
- * Storyless direct transition (`transitionStoryDirect`), and re-exports
6
- * the single-ticket mutators that now live in `./transition.js`
7
- * (`transitionTicketState`, `toggleTasklistCheckbox`,
8
- * `postStructuredComment`, `_resetColumnSyncCache`). Pulled out of
9
- * `../ticketing.js` under Story #1848 so the read-side (`./reads.js`) and
10
- * the cascade/bulk side (`./bulk.js`) each live behind a narrower import
11
- * contract.
12
- *
13
- * Story #3995 — the single-ticket mutators were extracted into the leaf
14
- * `./transition.js` to break the `state.js ↔ bulk.js` import cycle.
15
- * `bulk.js`'s cascade walk depends on those primitives, and the primitives
16
- * fire the upward cascade; lifting them into a leaf lets `state.js` and
17
- * `bulk.js` both depend **downward** on `transition.js`. This module is
18
- * the wiring point that injects `bulk.js`'s cascade pair
19
- * (`cascadeParentState` / `logCascadePartialFailures`) into
20
- * `transition.js` via `registerCascadeRunner`, so importing `state.js`
21
- * (or the `../ticketing.js` facade that re-exports through it) always
22
- * loads `bulk.js` and arms the real cascade before any transition runs.
2
+ * lib/orchestration/ticketing/state.js — Ticket state-mutation facade:
3
+ * structured-comment upsert, the direct Story transition, and re-exports of
4
+ * `./transition.js`. Importing this module wires `bulk.js`'s cascade into
5
+ * `transition.js`, so the real cascade is armed before any transition runs.
23
6
  */
24
7
 
25
8
  import { Logger } from '../../Logger.js';
@@ -40,10 +23,6 @@ import {
40
23
  transitionTicketState,
41
24
  } from './transition.js';
42
25
 
43
- // Re-export the single-ticket mutators that moved to `./transition.js`
44
- // (Story #3995) so existing consumers that import them from `./state.js`
45
- // — and the `../ticketing.js` facade — keep working without an import
46
- // path change.
47
26
  export {
48
27
  _resetColumnSyncCache,
49
28
  postStructuredComment,
@@ -51,11 +30,6 @@ export {
51
30
  transitionTicketState,
52
31
  };
53
32
 
54
- // Story #3995 — inject `bulk.js`'s upward-cascade pair into
55
- // `transition.js`. `transition.js` stays a leaf (it does not import
56
- // `bulk.js`); this wiring runs once at module-evaluation time and is the
57
- // single home for the legacy `transitionTicketState → cascadeParentState`
58
- // behaviour, preserving the `cascade` flag and the partial-failure log.
59
33
  registerCascadeRunner(async (provider, ticketId, opts) => {
60
34
  const cascade = await cascadeParentState(provider, ticketId, {
61
35
  notify: opts.notify,
@@ -64,19 +38,8 @@ registerCascadeRunner(async (provider, ticketId, opts) => {
64
38
  });
65
39
 
66
40
  /**
67
- * Transition a Story ticket directly to a new `agent::*` state without
68
- * walking a Task cascade. Story #3097 (Wave-0 additive, Epic #3078
69
- * Strategy B) — in the 2-tier hierarchy a Story has no Task children, so
70
- * the canonical `transitionTicketState` upward-cascade path
71
- * (`cascadeParentState`) is the only meaningful walk. This helper is a
72
- * thin wrapper that pins `cascade: true` (so the parent Epic
73
- * still receives derived-state updates) and is intentionally a no-op
74
- * difference from `transitionTicketState` in 4-tier mode — the helper
75
- * exists so 2-tier callers can opt into a name that documents intent
76
- * (and so F8 can pivot the implementation to skip the now-impossible
77
- * Task-fan-in without rewriting call sites). The wrapper preserves every
78
- * `opts` field the caller supplies; only `cascade` defaults to `true`
79
- * when omitted.
41
+ * `transitionTicketState` with `cascade` defaulting to `true`, so the parent
42
+ * Epic still receives derived-state updates; every other opt passes through.
80
43
  *
81
44
  * @param {import('../../ITicketingProvider.js').ITicketingProvider} provider
82
45
  * @param {number} storyId
@@ -94,20 +57,13 @@ export async function transitionStoryDirect(
94
57
  }
95
58
 
96
59
  /**
97
- * Idempotently post a structured comment identified by an embedded HTML
98
- * marker. If an existing comment with the same `type` marker (and matching
99
- * `attrs`, when supplied) exists it is deleted first, then the new one is
100
- * posted. The marker is prepended to the body automatically.
101
- *
102
- * `attrs` lets the same `type` carry multiple in-place snapshots keyed by
103
- * an additional dimension — e.g., one `wave-run-progress` comment per wave
104
- * via `{ wave: N }` so the cross-wave rollup can read every wave's snapshot
105
- * instead of only the most recent one.
60
+ * Idempotently post a marker-identified structured comment: delete any
61
+ * existing one with the same `type` (and `attrs`), then post with the marker
62
+ * prepended. `attrs` keeps several snapshots of one type side by side.
106
63
  *
107
64
  * @param {import('../../ITicketingProvider.js').ITicketingProvider} provider
108
65
  * @param {number} ticketId
109
- * @param {string} type - arbitrary structured-comment type (e.g.,
110
- * `dispatch-manifest`, `retro`, `code-review`).
66
+ * @param {string} type - a registered structured-comment type.
111
67
  * @param {string} body - markdown payload.
112
68
  * @param {Record<string, string|number>} [attrs]
113
69
  * @returns {Promise<{ commentId: number }>}
@@ -128,11 +84,9 @@ export async function upsertStructuredComment(
128
84
  if (existing && typeof provider.deleteComment === 'function') {
129
85
  try {
130
86
  await provider.deleteComment(existing.id);
131
- // Story #1795 — evict before the repost so a postComment failure
132
- // doesn't leave the cache pointing at a deleted comment id.
87
+ // Evict before the repost so a failed post can't leave the caches
88
+ // pointing at a deleted comment.
133
89
  cache.delete(cacheKey);
134
- // Story #2465 — the raw-comments array still holds the
135
- // just-deleted comment; drop it so subsequent reads re-fetch.
136
90
  invalidateRawCommentsCache(provider, ticketId);
137
91
  } catch (err) {
138
92
  Logger.warn(
@@ -146,17 +100,9 @@ export async function upsertStructuredComment(
146
100
  type,
147
101
  body: annotated,
148
102
  });
149
- // Story #2465 — evict the raw-comments cache so a follow-up
150
- // `findStructuredComment` for a different type on the same ticket
151
- // re-fetches and observes the new comment.
152
103
  invalidateRawCommentsCache(provider, ticketId);
153
- // Story #1795 — refresh the cache to the freshly-posted comment so the
154
- // next upsert short-circuits the `getTicketComments` list call. The
155
- // post result carries the new comment id; we synthesise a minimal
156
- // cached row that `findStructuredComment` callers can rely on (only
157
- // `id` and `body` are read by upstream). Accept either `commentId`
158
- // (production GitHubProvider shape) or `id` (test-fake shape) so the
159
- // cache update fires uniformly across providers.
104
+ // Seed the cache with a minimal `{ id, body }` row so the next upsert
105
+ // skips the list call. Providers return `commentId` (GitHub) or `id` (fakes).
160
106
  const newCommentId =
161
107
  typeof result?.commentId === 'number'
162
108
  ? result.commentId