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,56 +1,8 @@
1
1
  /**
2
- * Story body schema validator (v5.33+).
3
- *
4
- * Enforces the four-section structured body shape on 2-tier Stories emitted
5
- * by the decomposer. The canonical decomposition serializes every Story
6
- * `body` to a **markdown string** via `serialize()` from
7
- * `lib/story-body/story-body.js` (the decompose-author skill mandates this,
8
- * and `createOp` in `epic-spec-reconciler-ops.js` throws on an object body —
9
- * Story #3302). So at plan-time validation the Story body is a string, not an
10
- * object. To make the rules below actually fire on canonical plans, a string
11
- * body is **parsed** back into its structured form via `parseStoryBody`
12
- * before the section checks run (Story #3906 — previously the validator
13
- * `shouldSkipTicket`-skipped every string body, so the vague-verb check and
14
- * non-empty-goal check never ran on any real decomposition). A still-structured object body (e.g. a caller that passes
15
- * the pre-serialize shape directly) is validated as-is.
16
- *
17
- * Only `type: 'story'` tickets are validated; Feature/Epic tickets and
18
- * null/empty bodies pass through. There is no `type::task` ticket layer in
19
- * the 2-tier hierarchy (Epic → Story).
20
- *
21
- * Required after parse/normalize: a non-empty `goal`, and non-empty
22
- * `changes` and `acceptance` arrays — and `changes` items must name at least
23
- * one path-shaped token so vague verbs ("clean up", "refactor") can't slip
24
- * through. Story #5342 dropped the non-empty `verify` requirement: an empty
25
- * `verify[]` is a dry-run warning the ticket validator raises, not a
26
- * refusal.
27
- *
28
- * `acceptance` / `verify` are the **top-level machine contract** (Story
29
- * #4541). The decomposer prompt tells authors to write those lists once at
30
- * the ticket's top level and omit the matching body sections; persist syncs
31
- * them into the body at assemble time. Validation runs *before* that sync,
32
- * so this validator resolves each contract field from the parsed body and
33
- * falls back to the ticket's top-level array when the body section is
34
- * absent. Without that fallback the validator rejected the very shape its
35
- * own prompt prescribes.
36
- *
37
- * `body.changes` items must be object-form `{ path: string, assumption: enum }`
38
- * entries (Story #2636 shape). Plain string bullets are rejected at parse
39
- * time and by this validator.
40
- *
41
- * Object-form items must declare an `assumption` ∈ `creates |
42
- * refactors-existing | exists | deletes`. The optional `body.references`
43
- * array uses the same object shape and is the home for paths the Story
44
- * reads but does not modify (test fixtures, sibling modules, etc.).
45
- *
46
- * `body.verify` entries are commands, nothing more: Story #5312 deleted the
47
- * `(<tier>)` suffix, the `manual:<reason>` escape and the repair pass that
48
- * appended the suffix for the author, and Story #5342 deleted the last rule
49
- * — the non-empty check. This validator no longer scores `verify` at all.
50
- *
51
- * The errors are batched and surfaced as a single thrown Error so the
52
- * planner can see every offending slug in one pass instead of fixing one
53
- * at a time.
2
+ * Story body schema validator. String bodies (the canonical serialized form)
3
+ * are parsed before checking. Requires a non-empty `goal`, `acceptance`, and
4
+ * `changes` of `{ path, assumption }` objects; `references` is optional, same
5
+ * shape. `verify` is not scored. Errors are batched into one throw.
54
6
  */
55
7
 
56
8
  import { suggestPathEntryFix } from '../story-body/body-format-lints.js';
@@ -61,48 +13,23 @@ import {
61
13
  import { FILE_ASSUMPTION_VALUES } from './file-assumption-enum.js';
62
14
 
63
15
  /**
64
- * Predicate: should the validator skip this ticket entirely? Skip when:
65
- * - it is not a Story (only `type: 'story'` tickets are validated here),
66
- * - it has no body (null / undefined / empty-or-whitespace string — there
67
- * is nothing to inspect).
68
- *
69
- * Under the 2-tier hierarchy (Epic → Story), Stories carry the
70
- * implementation scope inline. A canonical decomposition serializes the
71
- * Story body to a markdown string, so a *string* body is NOT skipped here
72
- * (Story #3906) — `validateTaskBodyShape` parses it back into structured
73
- * form via `parseStoryBody` before applying the section rules. This is what
74
- * makes the vague-verb / non-empty-goal checks actually fire
75
- * on real plans. Features (and everything else) use narrative string bodies
76
- * and are skipped by the `type !== 'story'` guard.
77
- *
78
- * Returns `true` when the ticket should be ignored by
79
- * `collectTaskBodyErrors`, `false` when the body should be inspected.
16
+ * Non-Stories and empty bodies are skipped; string bodies are NOT.
80
17
  *
81
18
  * @param {object} ticket
82
19
  * @returns {boolean}
83
20
  */
84
21
  function shouldSkipTicket(ticket) {
85
22
  if (!ticket) return true;
86
- // Only Stories carry an inline implementation contract in the 2-tier
87
- // world. Features (and everything else) use narrative bodies.
88
23
  if (ticket.type !== 'story') return true;
89
24
  const body = ticket.body;
90
25
  if (body == null) return true;
91
- // An empty / whitespace-only string body carries no contract to inspect.
92
26
  if (typeof body === 'string' && body.trim() === '') return true;
93
27
  return false;
94
28
  }
95
29
 
96
30
  /**
97
- * Resolve a Story ticket's body to the structured object the section rules
98
- * operate on. A string body is the canonical serialized form — parse it via
99
- * `parseStoryBody` (Story #3906). An object body is already structured and
100
- * is returned verbatim (a caller may pass the pre-serialize shape directly).
101
- *
102
31
  * @param {object} ticket Story whose body passed `shouldSkipTicket`.
103
- * @returns {{ body: object|null, error: string|null }} `body` is the
104
- * structured object when resolvable; `error` is a single message when a
105
- * string body could not be parsed (mutually exclusive with `body`).
32
+ * @returns {{ body: object|null, error: string|null }} Mutually exclusive.
106
33
  */
107
34
  function resolveStructuredBody(ticket) {
108
35
  const raw = ticket.body;
@@ -122,25 +49,15 @@ function resolveStructuredBody(ticket) {
122
49
  }
123
50
  }
124
51
 
125
- /**
126
- * The two contract fields that live at the ticket's top level and are
127
- * synced into the body by `plan-persist` at assemble time.
128
- */
129
52
  const CONTRACT_FIELDS = Object.freeze(['acceptance', 'verify']);
130
53
 
131
54
  /**
132
- * Resolve the body's contract fields against the ticket's top-level arrays
133
- * (Story #4541). The decomposer prompt prescribes authoring `acceptance[]`
134
- * / `verify[]` **once** at top level and omitting the matching body
135
- * sections; `assemblePlanStories#syncContractFieldFromTopLevel` performs
136
- * the sync, but it runs *after* validation. So an absent body section is
137
- * not a violation when the ticket carries the list at top level — it is the
138
- * preferred shape. A body section that is present and disagrees with the
139
- * top level is left alone here: the sync itself fails closed on that
140
- * mismatch, and duplicating the check would report it twice.
55
+ * Fall back to top-level `acceptance[]` / `verify[]` (the preferred authoring
56
+ * shape): assembly syncs them into the body only after validation. A
57
+ * disagreeing body section is left to the sync, which fails closed.
141
58
  *
142
59
  * @param {object} ticket
143
- * @param {object} bodyObject Parsed / structured body.
60
+ * @param {object} bodyObject
144
61
  * @returns {object} A copy of `bodyObject` with the contract fields resolved.
145
62
  */
146
63
  function resolveContractFieldsFromTopLevel(ticket, bodyObject) {
@@ -156,19 +73,7 @@ function resolveContractFieldsFromTopLevel(ticket, bodyObject) {
156
73
  }
157
74
 
158
75
  /**
159
- * Validate one Story body and return every violation it exhibits. Empty
160
- * array means clean. Splits the per-ticket cascade out of
161
- * `collectTaskBodyErrors` so the iteration stays straight-line and so
162
- * each section's defensive checks are independently testable.
163
- *
164
- * Accepts both the canonical **serialized string** body (parsed back into
165
- * structured form via `parseStoryBody` — Story #3906) and the
166
- * pre-serialize **structured object** body. A string body that cannot be
167
- * parsed surfaces a single error.
168
- *
169
- * @param {object} ticket Story whose `body` has already passed the
170
- * `shouldSkipTicket` filter (i.e. `body` is a non-empty string or an
171
- * object).
76
+ * @param {object} ticket Story whose `body` passed `shouldSkipTicket`.
172
77
  * @returns {string[]}
173
78
  */
174
79
  export function validateTaskBodyShape(ticket) {
@@ -192,12 +97,6 @@ export function validateTaskBodyShape(ticket) {
192
97
  }
193
98
 
194
99
  /**
195
- * Predicate: is `entry` a well-formed object-form path entry? Returns
196
- * `true` only when it carries a non-empty `path` string and an
197
- * `assumption` from the canonical enum. Bare objects without these
198
- * fields surface as errors via `collectChangesErrors` /
199
- * `collectReferencesErrors`.
200
- *
201
100
  * @param {unknown} entry
202
101
  * @returns {entry is { path: string, assumption: typeof FILE_ASSUMPTION_VALUES[number] }}
203
102
  */
@@ -209,10 +108,7 @@ export function isObjectPathEntry(entry) {
209
108
  }
210
109
 
211
110
  /**
212
- * Predicate: is `entry` an object that *looks* like the new shape but
213
- * has at least one invalid field? Distinct from `isObjectPathEntry` so
214
- * we can route bad objects through a specific error message instead of
215
- * silently collapsing them into the "name no path-shaped token" bucket.
111
+ * An object that is not a valid entry, so it gets a specific error message.
216
112
  *
217
113
  * @param {unknown} entry
218
114
  * @returns {boolean}
@@ -220,8 +116,6 @@ export function isObjectPathEntry(entry) {
220
116
  export function isMalformedObjectPathEntry(entry) {
221
117
  if (entry === null || typeof entry !== 'object') return false;
222
118
  if (isObjectPathEntry(entry)) return false;
223
- // Anything that's an object and isn't a valid entry is malformed —
224
- // string-form bullets fall through this predicate (they're not objects).
225
119
  return true;
226
120
  }
227
121
 
@@ -269,7 +163,6 @@ function collectChangesErrors(prefix, rawChanges) {
269
163
  * @returns {string[]}
270
164
  */
271
165
  function collectReferencesErrors(prefix, rawReferences) {
272
- // `body.references` is optional — absent / null / undefined is fine.
273
166
  if (rawReferences === undefined || rawReferences === null) return [];
274
167
  if (!Array.isArray(rawReferences)) {
275
168
  return [
@@ -308,10 +201,6 @@ function collectAcceptanceErrors(prefix, rawAcceptance) {
308
201
  * @returns {string[]}
309
202
  */
310
203
  /**
311
- * Validate every 2-tier Story in `tickets` whose `body` is a structured
312
- * object. Returns an array of error strings (one per offending slug); empty
313
- * array means clean.
314
- *
315
204
  * @param {object[]} tickets
316
205
  * @returns {string[]}
317
206
  */
@@ -325,9 +214,6 @@ export function collectTaskBodyErrors(tickets) {
325
214
  }
326
215
 
327
216
  /**
328
- * Throw a single batched error if any Story body is malformed; otherwise
329
- * return `tickets` unchanged.
330
- *
331
217
  * @param {object[]} tickets
332
218
  * @returns {object[]}
333
219
  */
@@ -1,49 +1,13 @@
1
1
  /**
2
- * ticket-lease.js — assignee-as-lease primitive (Story #3480, Epic #3457).
3
- *
4
- * The workflow-guards Feature (#3478) needs a way for one operator to take an
5
- * exclusive claim on a ticket so two concurrent runs do not both drive the
6
- * same Story. Rather than invent a new state column, the lease rides the
7
- * ticket's existing **assignees** surface: the single assignee *is* the lease
8
- * owner.
9
- *
10
- * **A foreign claim is a refusal, full stop (Story #5006).** The lease shipped
11
- * with a TTL: a claim whose owner's last heartbeat was older than
12
- * `delivery.lease.ttlMs` counted as stale and was silently reclaimed. The
13
- * `story.heartbeat` emitter that would have fed it was structurally inert (it
14
- * demanded an `epicId >= 1` that v2, which has no Epics, never supplies) and
15
- * was deleted, after which every guard pinned `heartbeatAt` to `now` so the
16
- * liveness test always answered "live" — the TTL, the heartbeat parameter and
17
- * the reclaim branch were an elaborate way of writing `true`. They are gone.
18
- * A stranded claim is cleared with `--steal`, which is now the only way past
19
- * a foreign owner.
20
- *
21
- * The two exported operations are deliberately thin and provider-agnostic:
22
- *
23
- * - `acquireLease` — claim an unassigned ticket, re-affirm a self-held
24
- * claim, or — with `steal: true` — forcibly transfer a
25
- * foreign claim.
26
- * - `releaseLease` — clear the assignment, but only when the operator
27
- * still holds it (a no-op once the ticket was
28
- * reassigned elsewhere, so a late release never steals
29
- * a claim back from whoever took over).
30
- *
31
- * Provider contract (a subset of `ITicketingProvider`):
32
- * - `getTicket(id)` → `{ assignees: string[], ... }`
33
- * - `updateTicket(id, { assignees })` replaces the assignee list.
34
- * - `updateTicket(id, { addAssignees })` appends to it (Story #5112).
2
+ * Assignee-as-lease: the ticket's single assignee is the lease owner. A
3
+ * foreign claim is always refused; `steal: true` (`--steal`) is the only way
4
+ * past one. Provider needs `getTicket` and `updateTicket` with `assignees`
5
+ * (replace) or `addAssignees` (append).
35
6
  */
36
7
 
37
8
  /**
38
- * The shipped, non-personal operator-identity placeholder (and its bare,
39
- * post-normalise form). The committed `.agentrc.json` and the distributed
40
- * templates carry this sentinel so `github.operatorHandle` is schema-present
41
- * without naming a real person; each contributor overrides it with their own
42
- * handle in the gitignored `.agentrc.local.json`. It is NOT a usable lease
43
- * owner: `normalizeOperatorHandle` maps it to `null` so the guards fail closed
44
- * (a contributor who never set their handle is loudly refused, never silently
45
- * coordinated under a shared identity) and no assignee PATCH ever writes a
46
- * literal `[USERNAME]` (HTTP 422).
9
+ * Shipped placeholder handle. Normalizes to `null` so an unset handle fails
10
+ * closed and no PATCH writes a literal `[USERNAME]` (HTTP 422).
47
11
  */
48
12
  // kept (dead-export allowlist): public config sentinel — the distributed
49
13
  // `.agentrc.json` / templates carry this literal; exported so consumers and
@@ -52,17 +16,8 @@ export const OPERATOR_HANDLE_PLACEHOLDER = '@[USERNAME]';
52
16
  const OPERATOR_HANDLE_PLACEHOLDER_BARE = '[USERNAME]';
53
17
 
54
18
  /**
55
- * Normalise an operator handle into the bare login GitHub writes to (and
56
- * returns from) a ticket's `assignees`. Trims surrounding whitespace and
57
- * strips a single leading `@` so an `@`-prefixed `operatorHandle` matches a
58
- * bare assignee login (otherwise the assignee PATCH is rejected HTTP 422 and
59
- * the self-held-claim comparison `owner === operator` never matches).
60
- *
61
- * Returns `null` for a non-string, empty, whitespace-only, or placeholder
62
- * handle (`@[USERNAME]`) so each caller can apply its own absent-handling
63
- * (degrade to a no-op, or throw). Treating the placeholder as unset is what
64
- * makes the shipped sentinel safe: a contributor who never overrode it is
65
- * indistinguishable from one who set nothing, so the guards fail closed.
19
+ * Bare login (trimmed, one leading `@` stripped) so it matches assignee
20
+ * logins. `null` for empty or placeholder input; callers decide how to fail.
66
21
  *
67
22
  * @param {unknown} raw
68
23
  * @returns {string|null}
@@ -77,9 +32,7 @@ export function normalizeOperatorHandle(raw) {
77
32
  }
78
33
 
79
34
  /**
80
- * Normalise the assignee list into a single current owner. The lease model is
81
- * single-holder: the first assignee is authoritative. Returns `null` for an
82
- * unassigned ticket.
35
+ * The first assignee is authoritative.
83
36
  *
84
37
  * @param {string[]|undefined|null} assignees
85
38
  * @returns {string|null}
@@ -90,8 +43,6 @@ export function currentOwner(assignees) {
90
43
  }
91
44
 
92
45
  /**
93
- * Validate and normalise the shared option bag for the lease operations.
94
- *
95
46
  * @param {string} op
96
47
  * @param {object} opts
97
48
  * @returns {{ provider: object, ticketId: number, operator: string }}
@@ -113,34 +64,13 @@ function normaliseOpts(op, opts) {
113
64
  }
114
65
 
115
66
  /**
116
- * Acquire (or re-affirm) a lease on a ticket for `operator`.
117
- *
118
- * Outcomes:
119
- * - Unassigned ticket → assign operator, `acquired: true`,
120
- * `reason: 'unclaimed'`.
121
- * - Operator already holds it → no write, `acquired: true`,
122
- * `reason: 'already-held'`.
123
- * - Foreign claim, no steal → no write, `acquired: false`,
124
- * `owner: <foreign>`, `reason: 'held'`.
125
- * - Foreign claim + `steal:true` → reassign operator, `acquired: true`,
126
- * `reason: 'stolen'`.
127
- * - Lost a write race → a foreign login co-assigned between our
128
- * PATCH and the verify re-read; back the
129
- * operator out, `acquired: false`,
130
- * `owner: <foreign>`, `reason: 'lost-race'`.
131
- *
132
- * Every claiming write is verified: GitHub's assignee write is not a
133
- * compare-and-set, so two runs that both read the ticket unassigned will both
134
- * write themselves. {@link claimAndVerify} re-reads after the write and refuses
135
- * (fail-closed) when a foreign login is present, so the loser of a simultaneous
136
- * claim never proceeds as though it holds the lease. Story #5112 made the
137
- * first claim **additive** so that verify can actually see the collision —
138
- * see {@link claimAndVerify}.
67
+ * Every claiming write is verified by re-read, since assignee writes are not
68
+ * compare-and-set; a co-assigned foreign login yields `lost-race`.
139
69
  *
140
70
  * @param {object} opts
141
- * @param {object} opts.provider Ticketing provider.
142
- * @param {number} opts.ticketId Ticket to claim.
143
- * @param {string} opts.operator Operator acquiring the lease.
71
+ * @param {object} opts.provider
72
+ * @param {number} opts.ticketId
73
+ * @param {string} opts.operator
144
74
  * @param {boolean} [opts.steal=false] Transfer a foreign claim.
145
75
  * @returns {Promise<{
146
76
  * acquired: boolean,
@@ -156,7 +86,6 @@ export async function acquireLease(opts) {
156
86
  const ticket = await provider.getTicket(ticketId);
157
87
  const owner = currentOwner(ticket?.assignees);
158
88
 
159
- // Unclaimed → take it.
160
89
  if (owner === null) {
161
90
  return claimAndVerify({
162
91
  provider,
@@ -167,7 +96,6 @@ export async function acquireLease(opts) {
167
96
  });
168
97
  }
169
98
 
170
- // Already ours → no write needed.
171
99
  if (owner === operator) {
172
100
  return {
173
101
  acquired: true,
@@ -177,7 +105,6 @@ export async function acquireLease(opts) {
177
105
  };
178
106
  }
179
107
 
180
- // Foreign claim — refuse unless the operator explicitly steals it.
181
108
  if (!steal) {
182
109
  return {
183
110
  acquired: false,
@@ -197,44 +124,21 @@ export async function acquireLease(opts) {
197
124
  }
198
125
 
199
126
  /**
200
- * Write the operator to a ticket's assignees, then re-read to confirm the
201
- * claim actually stuck before reporting success.
202
- *
203
- * The assignee write is not atomic — GitHub offers no compare-and-set on the
204
- * assignees surface — so two runs that both observed the ticket unassigned (or
205
- * a stale foreign claim) will both write themselves in. Without a check the
206
- * loser of that race returns `acquired: true` and marches into the worktree
207
- * the winner is already building. The verify closes that window: it re-reads
208
- * with `fresh: true` (bypassing any provider cache so it sees the other run's
209
- * write, not our own), and if a foreign login is present it concedes — removes
210
- * the operator from the assignee set so no phantom co-owner lingers, and
211
- * returns `acquired: false` / `reason: 'lost-race'` so the fail-closed caller
212
- * refuses. A clean read (assignees exactly `[operator]`) confirms the claim.
213
- *
214
- * **The write must be additive for the verify to work (Story #5112).** With
215
- * the replacing PATCH this used unconditionally, a simultaneous claim
216
- * *evicted* the other operator rather than joining it, so the co-assignment
217
- * the `lost-race` branch keys on was a state the PATCH could never produce:
218
- * each run read a clean `[self]` on verify and both proceeded. Claiming an
219
- * unowned ticket therefore goes through the additive assignees endpoint
220
- * (`addAssignees`), which makes the collision observable and lets exactly one
221
- * claimer survive. The replacing form stays for the two cases that genuinely
222
- * mean "replace": the `--steal` transfer of a foreign claim, and the loser's
223
- * own back-out below.
127
+ * Write, then re-read with `fresh: true`; on a foreign co-assignee, back out
128
+ * and report `lost-race` so the loser never builds the winner's worktree.
224
129
  *
225
130
  * @param {object} args
226
- * @param {object} args.provider Ticketing provider.
227
- * @param {number} args.ticketId Ticket being claimed.
228
- * @param {string} args.operator Operator acquiring the lease.
229
- * @param {string|null} args.previousOwner Owner before this write (for the result).
131
+ * @param {object} args.provider
132
+ * @param {number} args.ticketId
133
+ * @param {string} args.operator
134
+ * @param {string|null} args.previousOwner
230
135
  * @param {string} args.reason Success reason when the claim holds.
231
136
  * @returns {Promise<{ acquired: boolean, owner: string, previousOwner: string|null, reason: string }>}
232
137
  */
233
138
  /**
234
- * The assignee mutation a claim writes. Additive when the ticket has no
235
- * previous owner — that is what makes a simultaneous claim show up as a
236
- * co-assignment {@link claimAndVerify} can detect. Replacing only for a
237
- * steal, where evicting the previous owner *is* the intent.
139
+ * Additive for an unowned ticket — a replacing PATCH would evict a
140
+ * simultaneous claimer, hiding the collision verify keys on. Replacing only
141
+ * for a steal.
238
142
  *
239
143
  * @param {string} operator
240
144
  * @param {string|null} previousOwner
@@ -262,9 +166,7 @@ async function claimAndVerify({
262
166
  return { acquired: true, owner: operator, previousOwner, reason };
263
167
  }
264
168
 
265
- // A foreign login co-assigned after our write — we lost a simultaneous
266
- // claim. Back ourselves out so the winner is the sole assignee, and report
267
- // the loss so the fail-closed caller refuses rather than double-delivering.
169
+ // Lost the race: leave the winner as sole assignee.
268
170
  await provider
269
171
  .updateTicket(ticketId, { assignees: foreign })
270
172
  .catch(() => undefined);
@@ -277,17 +179,12 @@ async function claimAndVerify({
277
179
  }
278
180
 
279
181
  /**
280
- * Release a lease the operator currently holds.
281
- *
282
- * Clears the ticket's assignees only when `operator` is still the recorded
283
- * owner. If the ticket has since been reassigned (or was never held by this
284
- * operator), the call is a no-op — a stale release must never yank a claim
285
- * away from whoever legitimately holds it now.
182
+ * No-op unless `operator` still owns it — a stale release never yanks a claim.
286
183
  *
287
184
  * @param {object} opts
288
- * @param {object} opts.provider Ticketing provider.
289
- * @param {number} opts.ticketId Ticket to release.
290
- * @param {string} opts.operator Operator releasing the lease.
185
+ * @param {object} opts.provider
186
+ * @param {number} opts.ticketId
187
+ * @param {string} opts.operator
291
188
  * @returns {Promise<{
292
189
  * released: boolean,
293
190
  * owner: string|null,