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,196 +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
- 'plan-run-sibling-coherence',
81
40
  'epic-run-state',
82
41
  'epic-run-progress',
83
42
  'epic-plan-state',
84
- // `parked-follow-ons` retired in Story #5114 with the module that was its
85
- // only writer. A kind the reader still recognises but nothing emits is the
86
- // same dead wiring in a new place.
87
- // Story #566 — per-phase wall-clock summary posted by single-story-close.js.
88
43
  'phase-timings',
89
- // Story #831 — story-init upserts a `story-init` comment that
90
- // surfaces `dependenciesInstalled` (and the underlying installStatus) so
91
- // downstream workflow steps don't have to infer install state from
92
- // node_modules presence.
93
- 'story-init',
94
- // Story #2128 — Phase 6 Epic Clarity Gate (CLI retired). Historical
95
- // `clarity-gate-update` comments may still exist on older tickets.
96
44
  'clarity-gate-update',
97
- // Story #2635 — Tech Spec freshness check. `plan-persist.js`
98
- // upserts a `spec-freshness` comment on the Epic listing any
99
- // path-shaped references that don't exist at the base branch, so the
100
- // operator can correct drift before Phase 8 decomposes from a stale
101
- // spec. Advisory: the run continues regardless of the report contents.
45
+ // Advisory: path references missing at the base branch.
102
46
  'spec-freshness',
103
- // Story #2813 — the per-Task progress writer (since retired under
104
- // #3157) upserted a `model-attribution` comment on a Task ticket at
105
- // the moment it transitioned to `agent::executing`, recording which
106
- // Claude model was actively executing the work. One entry per Task
107
- // (upsert is idempotent across resume re-runs). Story- and Epic-level
108
- // rollups are computed at query time by `rollupModelAttribution` in
109
- // `lib/orchestration/model-attribution.js` — no Story/Epic-scope
110
- // emissions are written. Schema:
111
- // `.agents/schemas/model-attribution.schema.json`.
112
- 'model-attribution',
113
- // Story #2894 — `finalize/post-handoff-comment.js` upserts an
114
- // `epic-handoff` comment on the Epic at the end of the bus-owned
115
- // finalize flow (after `open-or-locate-pr`
116
- // succeed). The marker carries the freshly opened/located PR URL and
117
- // its number so operators can jump straight to the PR from the Epic
118
- // ticket. Re-invocations upsert the same marker rather than appending
119
- // duplicates.
120
47
  'epic-handoff',
121
- // Story #2899 (Epic #2880, F13) — the deleted `epic-deliver-preflight.js`
122
- // upserted a `delivery-preflight` comment on the Epic at the start of
123
- // pre-v2 Epic `/mandrel-deliver` Phase 1, surfacing estimated story count, install cost,
124
- // wave count, GitHub API request volume, Claude quota burn, and any
125
- // threshold breaches against `delivery.preflight.max*`. One entry per
126
- // Epic; re-runs replace prior content.
127
48
  'delivery-preflight',
128
- // Story #3062 (Epic #3051) — the deleted `wave-tick.js` upserted a
129
- // `recurring-failure-class` comment on the Epic when the cross-Story
130
- // detector finds two or more Stories that hit the same `failedGate` in
131
- // `close-validate.end`. One entry per Epic; re-ticks with the same
132
- // findings upsert in place (`upsertStructuredComment` diffs by body).
133
49
  'recurring-failure-class',
134
- // Story #3061 (Epic #3051) — the pre-v2 `/mandrel-deliver` idle-watchdog prose
135
- // instructed the parent host LLM to upsert a `wave-stall` comment on the
136
- // Epic whenever an in-flight Story had been silent for longer than the
137
- // configured cadence. The deleted `wave-tick.js --check-idle` CLI emitted
138
- // the matching envelope; registering the kind here keeps historical
139
- // the documented remediation actually executable
140
- // (assertValidStructuredCommentType would otherwise throw).
141
50
  'wave-stall',
142
- // Story #4019 — the plan-tier lease guard upserts a `plan-lease`
143
- // comment at lease-acquire time, recording the claiming operator and the
144
- // claim timestamp. Nothing emits a per-run liveness beat, so this
145
- // claim-time is the only age signal a reader has when reasoning about the
146
- // documented `--steal` contract. The guard itself fails closed regardless
147
- // (it anchors liveness to `now`), so a stranded claim is cleared with
148
- // `--steal`, not by TTL expiry. One entry per ticket; re-acquires upsert
149
- // in place.
51
+ // Records claimant + claim time; the guard fails closed, so a stranded
52
+ // claim is cleared with `--steal`, not by TTL.
150
53
  'plan-lease',
151
- // Story #4415 (Epic #4406) — the feedback-loop graduator
152
- // (`retro-proposals-graduator.js`) upserts a
153
- // `cross-repo-deferred` comment listing findings that route
154
- // to a different repository and were therefore not filed here. Replaces
155
- // the prior log-line-only trace so the deferral survives the finalize
156
- // run as a durable, operator-visible record. Discriminated by a
157
- // `graduator="<name>"` attr so independent graduators do not clobber each
158
- // other's comment; re-runs upsert in place.
54
+ // Discriminated by a `graduator="<name>"` attr so graduators don't clobber
55
+ // each other.
159
56
  'cross-repo-deferred',
160
- // Epic #4474 (PR3) / v2 Stage 3 — `plan-persist.js` upserts a single
161
- // `plan-summary` comment on the primary Story at terminal persist
162
- // success, carrying risk / routing receipts and the depends_on order
163
- // table. One entry per plan; a re-persist upserts in place.
164
- 'plan-summary',
165
- // v2 Stage 3 — flat Story persist checkpoint on every created Story
166
- // (replaces epic-plan-state for new plans). plan-summary stays primary-only.
57
+ // The only comment persist posts on each Story; the marker makes a
58
+ // re-persist upsert in place.
167
59
  'story-plan-state',
168
- // Story #4535 — `plan-persist.js` upserts a `superseded-by` comment on
169
- // each `/mandrel-plan --tickets` source issue at persist time, naming the single
170
- // Story that claims it (plus any per-supersede note the plan authored),
171
- // immediately before closing the issue as `not_planned`. Keying off this
172
- // marker rather than a bare `postComment` is what makes a re-run
173
- // 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.
174
62
  'superseded-by',
175
63
  ]);
176
64
 
177
65
  export const WAVE_TYPE_PATTERN = WAVE_MARKER_RE;
178
66
 
179
67
  /**
180
- * Pool-mode claim-comment marker. One marker per story-id (the comment is
181
- * upserted, so racing claims on the same story collapse to a single
182
- * authoritative entry — the label set is the actual race-detection signal).
183
- * 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.
184
70
  */
185
71
  const CLAIM_TYPE_PATTERN = /^claim-([0-9]{1,9})$/;
186
72
 
187
- /**
188
- * Lifecycle-listener marker pattern (Story #2239 / #2241 / #2242). The
189
- * lifecycle StructuredCommentPoster writes minimal markers prefixed with
190
- * `lifecycle-` (e.g. `lifecycle-wave-0-start`, `lifecycle-epic-blocked`,
191
- * `lifecycle-epic-unblocked`). Treated as a generic prefix so future
192
- * listener-owned events can mint new markers without touching this enum.
193
- */
73
+ /** Generic `lifecycle-*` prefix so listeners can mint markers freely. */
194
74
  const LIFECYCLE_TYPE_PATTERN = /^lifecycle-[a-z0-9]+(?:-[a-z0-9]+)*$/;
195
75
 
196
76
  /**
@@ -208,10 +88,6 @@ export function isValidStructuredCommentType(type) {
208
88
  }
209
89
 
210
90
  /**
211
- * Throws if `type` is not a recognized structured-comment type. Error
212
- * message lists the accepted enum plus the wave pattern to make the
213
- * schema discoverable from the failure alone.
214
- *
215
91
  * @param {string} type
216
92
  */
217
93
  export function assertValidStructuredCommentType(type) {
@@ -223,18 +99,9 @@ export function assertValidStructuredCommentType(type) {
223
99
  }
224
100
 
225
101
  /**
226
- * Build an HTML marker that uniquely identifies a structured comment by
227
- * type plus an optional discriminator attribute bag. The marker is embedded
228
- * in the comment body so it can be discovered on read-back via
229
- * `findStructuredComment`.
230
- *
231
- * `attrs` lets a single `type` namespace coexist with multiple in-place
232
- * snapshots keyed by an additional dimension. The canonical use is the
233
- * per-wave `wave-run-progress` comment: each wave upserts its own snapshot
234
- * via `{ wave: N }` so subsequent waves don't overwrite prior rows.
235
- * Without the discriminator the next wave's upsert finds (and deletes) the
236
- * prior wave's comment, leaving the cross-wave epic-run-progress rollup
237
- * 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.
238
105
  *
239
106
  * @param {string} type
240
107
  * @param {Record<string, string|number>} [attrs]
@@ -252,46 +119,14 @@ export function structuredCommentMarker(type, attrs = null) {
252
119
  }
253
120
 
254
121
  /**
255
- * Per-provider cache mapping `${ticketId}|${type}|${attrsHash}` to the
256
- * comment id (and the cached comment payload) returned by the most
257
- * recent `findStructuredComment` / `upsertStructuredComment` call.
258
- * Story #1795 — every Epic run owns its process for the duration of
259
- * the run, so a single seed-then-reuse window saves one
260
- * `getTicketComments` per repeat upsert on the hot path (`story-init`,
261
- * `verification-results`, etc).
262
- *
263
- * Lifecycle:
264
- * - First call to `findStructuredComment(provider, t, type, attrs)`
265
- * hits `getTicketComments` and seeds the cache with the resolved
266
- * comment (or `null` to record the "no comment yet" miss).
267
- * - Subsequent calls with the same provider return the cached row
268
- * without a list call.
269
- * - `upsertStructuredComment` refreshes the cache to the new
270
- * comment id after `postComment` succeeds.
271
- * - `deleteComment` paths inside this module evict the entry.
272
- *
273
- * Cache is scoped to the provider instance via a WeakMap — different
274
- * providers (including per-test fakes) get isolated caches so state
275
- * cannot leak across boundaries. Tests reset via the exported
276
- * `_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.
277
125
  */
278
126
  const _structuredCommentCache = new WeakMap();
279
127
 
280
128
  /**
281
- * Build a well-formed ticket snapshot for a Story that has zero child
282
- * Tasks. Story #3097 (Wave-0 additive, Epic #3078 Strategy B) — the
283
- * 2-tier hierarchy collapses Epic → Story → Task into
284
- * Epic → Story, so a Story may legitimately have no Task
285
- * children. Read-side callers that expect a `subTickets` array on the
286
- * Story can route through this helper to materialise an empty-children
287
- * snapshot without paying a provider round-trip and without risk of
288
- * `undefined.map` dereferences. Pure / synchronous; never touches the
289
- * provider.
290
- *
291
- * The function preserves every field on the input `ticket` and merely
292
- * pins `subTickets` to `[]` when omitted. Callers that already hold a
293
- * resolved children list pass it through; the Storyless path is the
294
- * default.
129
+ * Snapshot of a ticket with `subTickets` pinned (default `[]`); pure.
295
130
  *
296
131
  * @param {object|null|undefined} ticket
297
132
  * @param {{ subTickets?: Array<object> }} [opts]
@@ -305,7 +140,6 @@ export function buildStorylessTicketSnapshot(ticket, opts = {}) {
305
140
  }
306
141
 
307
142
  /**
308
- * Lookup (or lazily create) the per-provider cache map.
309
143
  * @param {object} provider
310
144
  * @returns {Map<string, object|null>}
311
145
  */
@@ -320,8 +154,7 @@ export function getProviderCommentCache(provider) {
320
154
  }
321
155
 
322
156
  /**
323
- * Build a stable cache key for `(ticketId, type, attrs)`. Attrs object
324
- * is normalised by sorted JSON so equivalent keys collide. Story #1795.
157
+ * Attrs are key-sorted so equivalent bags collide.
325
158
  *
326
159
  * @param {number} ticketId
327
160
  * @param {string} type
@@ -340,31 +173,12 @@ export function structuredCommentCacheKey(ticketId, type, attrs) {
340
173
  }
341
174
 
342
175
  /**
343
- * Per-provider raw-comments cache mapping ticketId → the full comment
344
- * array returned by the most recent `provider.getTicketComments(ticketId)`
345
- * call. Story #2465 — `findStructuredComment` is invoked back-to-back for
346
- * different `type` discriminators against the same ticket (e.g.
347
- * `story-init` + `verification-results` + a `friction` probe during a
348
- * single close). Without this cache each lookup pays a full
349
- * pagination round-trip even when the prior call already fetched the
350
- * same comments. The structured-comment-id cache short-circuits *repeat*
351
- * lookups for the same `(type, attrs)` tuple but does not help across
352
- * different types on the same ticket.
353
- *
354
- * Lifecycle:
355
- * - `findStructuredComment` consults this raw cache before issuing
356
- * `provider.getTicketComments`; on cache miss it seeds the entry
357
- * from the response.
358
- * - `postStructuredComment` and `upsertStructuredComment` evict the
359
- * entry for the mutated ticketId — any cached array is stale once
360
- * a new comment lands.
361
- * - Scoped per-provider via WeakMap so test fakes never share state
362
- * 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.
363
178
  */
364
179
  const _rawCommentsCache = new WeakMap();
365
180
 
366
181
  /**
367
- * Lookup (or lazily create) the per-provider raw-comments cache.
368
182
  * @param {object} provider
369
183
  * @returns {Map<number, object[]>}
370
184
  */
@@ -379,10 +193,6 @@ export function getProviderRawCommentsCache(provider) {
379
193
  }
380
194
 
381
195
  /**
382
- * Evict the cached raw-comments array for a given ticket on a provider.
383
- * Called from the structured-comment write paths after a `postComment`
384
- * lands. Safe to call when no entry exists.
385
- *
386
196
  * @param {object} provider
387
197
  * @param {number} ticketId
388
198
  */
@@ -394,9 +204,6 @@ export function invalidateRawCommentsCache(provider, ticketId) {
394
204
  }
395
205
 
396
206
  /**
397
- * Test seam — reset the raw-comments cache for a provider. Mirrors
398
- * `_resetStructuredCommentCache` for the structured-id cache.
399
- *
400
207
  * @param {object} [provider]
401
208
  */
402
209
  export function _resetRawCommentsCache(provider) {
@@ -406,17 +213,7 @@ export function _resetRawCommentsCache(provider) {
406
213
  }
407
214
 
408
215
  /**
409
- * Test seam — reset the structured-comment ID cache.
410
- * Exported so unit tests can isolate cases without restarting the
411
- * process. Without arguments the entire WeakMap is dropped by
412
- * reassigning the per-provider map of every known provider — in
413
- * practice tests just hand in their fresh provider instance which
414
- * has no cached state yet. Production callers never invoke this.
415
- *
416
- * @param {object} [provider] When supplied, clears just that
417
- * provider's cache; otherwise no-op (per-provider caches are
418
- * already isolated by WeakMap and tests creating fresh providers
419
- * get clean state automatically).
216
+ * @param {object} [provider] Clears that provider's cache; otherwise no-op.
420
217
  */
421
218
  export function _resetStructuredCommentCache(provider) {
422
219
  if (provider && typeof provider === 'object') {
@@ -425,12 +222,9 @@ export function _resetStructuredCommentCache(provider) {
425
222
  }
426
223
 
427
224
  /**
428
- * Test seam — peek at a provider's cache contents. Returns the raw
429
- * Map for read-only inspection (do not mutate). Story #1795.
225
+ * Read-only view of a provider's cache (do not mutate).
430
226
  *
431
- * @param {object} [provider] If supplied, returns that provider's
432
- * cache Map; otherwise returns an empty Map for callers that just
433
- * want a stable shape.
227
+ * @param {object} [provider]
434
228
  */
435
229
  export function _peekStructuredCommentCache(provider) {
436
230
  if (provider && typeof provider === 'object') {
@@ -440,20 +234,8 @@ export function _peekStructuredCommentCache(provider) {
440
234
  }
441
235
 
442
236
  /**
443
- * Find the most recent structured comment of a given type on a ticket.
444
- * Detection is based on the HTML marker produced by
445
- * `structuredCommentMarker(type, attrs)`.
446
- *
447
- * When `attrs` is provided, only comments whose marker carries the same
448
- * discriminator attributes are returned — see `structuredCommentMarker` for
449
- * the per-wave `wave-run-progress` use case.
450
- *
451
- * Story #1795 — results are memoised in a process-level cache keyed by
452
- * `(ticketId, type, attrsHash)`. The first call seeds the cache with
453
- * the resolved comment (or `null` for the "no such comment yet" miss);
454
- * every subsequent call returns the cached row without issuing another
455
- * `getTicketComments`. `upsertStructuredComment` refreshes the cache
456
- * 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.
457
239
  *
458
240
  * @param {import('../../ITicketingProvider.js').ITicketingProvider} provider
459
241
  * @param {number} ticketId
@@ -473,10 +255,6 @@ export async function findStructuredComment(
473
255
  return cache.get(cacheKey);
474
256
  }
475
257
  const marker = structuredCommentMarker(type, attrs);
476
- // Story #2465 — consult the per-ticketId raw-comments cache before
477
- // hitting the wire. Two back-to-back `findStructuredComment` calls for
478
- // different types against the same ticket would otherwise both pay a
479
- // full `getTicketComments` round-trip.
480
258
  const rawCache = getProviderRawCommentsCache(provider);
481
259
  let comments;
482
260
  if (rawCache.has(ticketId)) {
@@ -485,7 +263,7 @@ export async function findStructuredComment(
485
263
  comments = (await provider.getTicketComments(ticketId)) ?? [];
486
264
  rawCache.set(ticketId, comments);
487
265
  }
488
- // Return latest match (comments API sorts ascending by creation; take last).
266
+ // Comments sort ascending by creation; take the last match.
489
267
  const matches = comments.filter(
490
268
  (c) => typeof c.body === 'string' && c.body.includes(marker),
491
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