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,25 +1,8 @@
1
1
  /**
2
- * phases/base-sync.js — pre-push base-sync phase for `single-story-close`.
3
- *
4
- * Story #2580: sync the Story branch from `origin/<baseBranch>` before
5
- * push so the PR opens with the latest base commits already integrated.
6
- * Defends against the parallel-`/single-story-deliver` race where one
7
- * Story's auto-merge bumps `main` while sibling Stories are mid-flight —
8
- * without the sync, the lagging PRs open "behind base" and stall against
9
- * the `up-to-date branch` protection rule.
10
- *
11
- * The sync runs INSIDE the worktree (where the Story branch is checked
12
- * out); falls back to the main checkout when the worktree is absent.
13
- * On a merge conflict the Story is transitioned to `agent::blocked` via
14
- * `handleSyncFailure` and the caller throws — the operator resolves in
15
- * the worktree and re-runs.
16
- *
17
- * Story #5267: a sync that lands tracked content also spends the worker's
18
- * pre-push credit, because that credit is keyed on the tree. The phase says
19
- * so out loud — see `buildStampInvalidatedWarning` — instead of leaving
20
- * close's second full suite looking like a bug. Story #5278 splits the claim
21
- * in two: gate evidence is spent by any tracked path, the capture stamp only
22
- * by one under `crap.targetDirs`.
2
+ * phases/base-sync.js — sync the Story branch from `origin/<baseBranch>`
3
+ * before push, so a PR does not open behind a base a sibling's merge just
4
+ * moved. Runs in the worktree (else the main checkout); a failure blocks the
5
+ * Story and throws.
23
6
  */
24
7
 
25
8
  import { getQuality } from '../../../config/quality.js';
@@ -35,11 +18,7 @@ import {
35
18
  } from '../../ticketing.js';
36
19
 
37
20
  /**
38
- * Orchestrate the pre-push base-sync step: run `syncBranchFromBase`
39
- * inside the worktree (or main checkout when no worktree exists). On
40
- * failure, post a friction comment, flip the Story to `agent::blocked`,
41
- * and throw so the caller fails non-zero. The `--skip-sync` flag is
42
- * handled by the caller; this function assumes the sync is desired.
21
+ * `--skip-sync` is the caller's concern.
43
22
  *
44
23
  * @param {{
45
24
  * cwd: string,
@@ -109,10 +88,7 @@ export async function runBaseSyncPhase({
109
88
  }
110
89
 
111
90
  /**
112
- * The CRAP scoring scope, or `[]` when it cannot be resolved. A `[]` makes
113
- * the warning below fall back to naming the capture stamp unconditionally —
114
- * the pre-#5278 wording — because an unresolvable scope is no evidence that
115
- * the stamp survived.
91
+ * The CRAP scoring scope, or `[]` when unresolvable.
116
92
  *
117
93
  * @param {typeof resolveConfig} resolveConfigImpl
118
94
  * @param {string} cwd
@@ -126,37 +102,13 @@ function resolveCrapTargetDirs(resolveConfigImpl, cwd) {
126
102
  }
127
103
  }
128
104
 
129
- /**
130
- * How many changed paths the warning names before it stops listing.
131
- * Enough to recognise the change set; short enough that the warning still
132
- * reads as a warning rather than as a diff.
133
- */
134
105
  const WARNED_PATH_LIMIT = 12;
135
106
 
136
107
  /**
137
- * The loud "your credit is spent" warning, or `[]` when the sync changed
138
- * nothing (Story #5267, narrowed by #5278).
139
- *
140
- * The worker banks two kinds of credit before the push: gate evidence keyed
141
- * on the tree (lint, typecheck) and one full-suite capture stamp keyed on the
142
- * content of `crap.targetDirs`. This sync runs after that, and the two are
143
- * spent on different conditions — which is why #5267's single blanket
144
- * sentence was wrong half the time:
145
- *
146
- * - **Gate evidence** is spent by any tracked path at all, because the tree
147
- * hash it is keyed on moves with the first byte.
148
- * - **The capture stamp** is spent only when a merged path lands under
149
- * `crap.targetDirs`. A sync that brings in docs, workflows or CI config
150
- * leaves it perfectly valid, and announcing it as spent taught operators
151
- * to expect a second full suite that close was never going to run.
152
- *
153
- * Quiet by construction on the outcome that cannot spend either: a
154
- * `noop-already-current` sync never touched the tree. A content-changing
155
- * fast-forward DOES warn — it moves the tree exactly as a merge commit does,
156
- * and staying quiet there would be a lie of omission.
157
- *
158
- * Pure. Module-private: the phase is the seam tests drive it through
159
- * (`injectedSync` + a `progress` spy), so it needs no export of its own.
108
+ * Warn that the sync spent pre-push credit, or `[]` when it changed nothing.
109
+ * Gate evidence is keyed on the tree, so any tracked path spends it; the
110
+ * full-suite capture stamp is spent only by a path under `crap.targetDirs`.
111
+ * A content-changing fast-forward warns just as a merge does.
160
112
  *
161
113
  * @param {{ baseBranch: string, result: { kind?: string, changedPaths?: string[] }, targetDirs?: string[] }} args
162
114
  * @returns {string[]} Progress lines, in order. Empty when nothing changed.
@@ -167,8 +119,7 @@ function buildStampInvalidatedWarning({ baseBranch, result, targetDirs }) {
167
119
  : [];
168
120
  if (changed.length === 0) return [];
169
121
  const dirs = Array.isArray(targetDirs) ? targetDirs : [];
170
- // An unresolvable scope (`[]`) cannot prove the stamp survived, so it fails
171
- // closed to the unconditional wording.
122
+ // An unresolvable scope cannot prove the stamp survived: fail closed.
172
123
  const scored =
173
124
  dirs.length === 0 ? changed : filterFilesUnderTargets(changed, dirs);
174
125
  const shown = changed.slice(0, WARNED_PATH_LIMIT);
@@ -191,8 +142,7 @@ function buildStampInvalidatedWarning({ baseBranch, result, targetDirs }) {
191
142
  }
192
143
 
193
144
  /**
194
- * Post a `friction` structured comment summarising a base-sync failure
195
- * and transition the Story to `agent::blocked`. Exported for testing.
145
+ * Post a `friction` comment and block the Story; both best-effort.
196
146
  *
197
147
  * @param {{
198
148
  * provider: object,
@@ -224,10 +174,8 @@ export async function handleSyncFailure({
224
174
  result,
225
175
  });
226
176
 
227
- // Post the structured comment first so the operator's recovery
228
- // surface lands even if the label flip fails. Both are best-effort:
229
- // we never want a notification-side failure to mask the real reason
230
- // close threw.
177
+ // Comment first so the recovery surface lands even if the flip fails; a
178
+ // notification failure must never mask why close threw.
231
179
  try {
232
180
  await upsertStructuredComment(provider, storyId, 'friction', body);
233
181
  progress('SYNC', `📝 Posted friction comment on #${storyId}.`);
@@ -237,9 +185,7 @@ export async function handleSyncFailure({
237
185
  );
238
186
  }
239
187
 
240
- // Story #4539 — the canonical mutator, not a direct label write: a bare
241
- // `provider.updateTicket` skips the Projects v2 column sync (Story
242
- // #2548) and strands the board on the Story's prior status.
188
+ // The canonical mutator: a bare label write skips the Projects v2 sync.
243
189
  try {
244
190
  await transitionTicketState(provider, storyId, STATE_LABELS.BLOCKED, {});
245
191
  progress('SYNC', `🚧 Flipped Story #${storyId} → ${AGENT_LABELS.BLOCKED}.`);
@@ -251,17 +197,9 @@ export async function handleSyncFailure({
251
197
  }
252
198
 
253
199
  /**
254
- * Build the markdown body posted on a base-sync failure. Pure; exported
255
- * for tests so the operator-recoverable surface stays reviewable.
256
- *
257
- * Story #4891 — `baseConfirmed` gates the merge-the-base recovery block, and
258
- * defaults to `false` so it fails closed. Telling the operator to run
259
- * `git merge origin/<baseBranch>` is actively harmful when `<baseBranch>` is
260
- * not the base the Story was seeded from: it permanently contaminates the
261
- * branch and its PR diff with an unrelated base. Close confirms the base
262
- * against the run's init receipt before that advice is emitted; when
263
- * it could not (receipt absent, unreadable, or unpinned), the operator is
264
- * told to establish the real base first instead.
200
+ * `baseConfirmed` (default false, fail-closed) gates the merge-the-base
201
+ * advice: merging a base the Story was not seeded from contaminates the
202
+ * branch and PR diff, so an unconfirmed base gets "establish it first".
265
203
  *
266
204
  * @param {{ storyId: number, storyBranch: string, baseBranch: string, baseConfirmed?: boolean, syncCwd: string, result: { kind: string, conflictFiles?: string[], stderr?: string } }} args
267
205
  * @returns {string}
@@ -1,69 +1,23 @@
1
1
  /**
2
- * phases/close-validation.js — run the canonical close-validation gate
3
- * chain for a standalone Story.
2
+ * phases/close-validation.js — the close-validation gate chain for a Story.
4
3
  *
5
- * The standalone path uses the same `runCloseValidation` chain as
6
- * Epic-attached Stories so the experience matches — only the baseline
7
- * ref changes (`main`, not `epic/<id>`).
8
- *
9
- * Standalone evidence keyspace (Story #4250). Standalone Stories have no
10
- * parent Epic, so they cannot scope a `validation-evidence.json` under a
11
- * `temp/run-<id>/` tree. Rather than feed a null `epicId` into the
12
- * Epic-keyed path (which structurally disabled the evidence cache and
13
- * forced every re-run — base-sync conflict, review remediation, baseline
14
- * absorb — to re-execute ALL gates including the coverage suite), the
15
- * standalone close now passes `standalone: true`. `runCloseValidation`
16
- * then anchors the cache on the Story id alone at
17
- * `temp/standalone/stories/story-<id>/validation-evidence.json`, so a
18
- * second close at unchanged HEAD short-circuits the already-passed gates.
19
- *
20
- * Pre-gate self-heal (Stories #4250, #5224). Two best-effort steps run on the
21
- * Story branch before the check-only gates score it — the scoped format
22
- * autofix and the upward maintainability write-back — so whatever they commit
23
- * is part of what the gates see and part of the branch's own PR. Both live in
24
- * [`pre-gate-steps.js`](pre-gate-steps.js); neither can fail a close, because
25
- * an authoritative gate for each runs immediately below.
26
- *
27
- * Bounded gate output (Story #4736). Every gate line goes to the run's
28
- * `gate-log.js` sink — an artifact under the gitignored temp tree — instead
29
- * of straight to the agent's stdout, where a passing `npm test` alone once
30
- * pushed a successful close past the host's inline tool-result ceiling. A
31
- * clean run reports one digest line naming the artifact; a failing gate
32
- * replays its captured tail inline, because that is exactly when the caller
33
- * needs the evidence in front of them. `AGENT_LOG_LEVEL=verbose` restores
34
- * live streaming.
35
- *
36
- * Projection advisories (Story #4776). `baseBranch`, `storyBranch` and the
37
- * resolved `config` are forwarded to `runCloseValidation` so its projection
38
- * phase can run. They surface, after the gates pass, which committed
39
- * baseline rows the post-merge tree would breach and the exact
40
- * `*:update` + `baseline-refresh:` remedy — advisory only, so the close
41
- * verdict is unchanged.
42
- *
43
- * `runCloseValidation`, `buildDefaultGates` and the pre-gate steps (whole, or
44
- * their two individual collaborators) are accepted as injected dependencies so
45
- * the parent CLI's cache-busted bindings win in tests that mock the upstream
46
- * module URLs.
4
+ * Gate output goes to an artifact sink (inline output once overflowed the
5
+ * host's tool-result ceiling): a pass reports one digest line, a failure
6
+ * replays its tail inline. Full-suite lock-wait lines are also teed to
7
+ * `progress()` so a long wait doesn't read as a hang, and an expired wait
8
+ * defers to `pending` rather than failing.
47
9
  */
48
10
 
49
11
  import { buildDefaultGates as defaultBuildDefaultGates } from '../../../close-validation/gates.js';
50
12
  import { runCloseValidation as defaultRunCloseValidation } from '../../../close-validation/runner.js';
13
+ import { LOCK_WAIT_EXPIRED_EXIT_CODE } from '../../../full-suite-lock.js';
14
+ import { parseLockWaitOutcome } from '../../../full-suite-queue.js';
51
15
  import { createGateLogSink as defaultCreateGateLogSink } from '../gate-log.js';
52
16
  import { runPreGateSteps as defaultRunPreGateSteps } from './pre-gate-steps.js';
53
17
 
54
18
  /**
55
- * Run the close-validation gate chain. Throws on first gate failure.
56
- *
57
- * Order: pre-gate self-heal steps → close-validation gates. The steps scope
58
- * to the `baseBranch...storyBranch` diff, commit inside the Story worktree,
59
- * and are best-effort — a missing `storyBranch` (resume/legacy callers) skips
60
- * them with a log line rather than failing.
61
- *
62
- * Gates are built from the canonical resolved config (`buildDefaultGates`
63
- * reads `project.commands` and `delivery.quality.gates.crap.enabled`); the
64
- * `baseBranch` is forwarded as the gate `baseBranch` so the format gate's
65
- * changed-file scope anchors on it. `standalone: true` routes the evidence
66
- * cache to the storyId-anchored keyspace.
19
+ * Pre-gate self-heal steps, then the gates (throws on first failure). The
20
+ * steps commit in the worktree before scoring, so the gates see their output.
67
21
  *
68
22
  * @param {{
69
23
  * cwd: string,
@@ -81,10 +35,12 @@ import { runPreGateSteps as defaultRunPreGateSteps } from './pre-gate-steps.js';
81
35
  * runContextBudgetWriteback?: Function,
82
36
  * createGateLogSink?: typeof defaultCreateGateLogSink,
83
37
  * }} args
84
- * @returns {Promise<{ gates: Record<string, 'passed'|'skipped'> }>} Per-gate
85
- * outcomes keyed by gate name — the terminal envelope reports the split
86
- * baselines entries from this (Story #5172). A failure throws instead, with
87
- * `err.closeGate` naming the gate that died.
38
+ * @returns {Promise<{
39
+ * gates: Record<string, 'passed'|'skipped'>|null,
40
+ * lockWait: { waitedSeconds: number, expired: boolean }|null,
41
+ * pending: boolean,
42
+ * }>} `pending` (with `gates: null`) when a lock wait expired; any other
43
+ * failure throws with `err.closeGate` naming the gate.
88
44
  */
89
45
  export async function runCloseValidationPhase({
90
46
  cwd,
@@ -119,15 +75,15 @@ export async function runCloseValidationPhase({
119
75
  'VALIDATE',
120
76
  `Running close-validation gates against baseline ${baseBranch}${worktreePath ? ` in ${worktreePath}` : ''}...`,
121
77
  );
122
- // Story #4736 — one sink for both `log` seams (gate construction and gate
123
- // execution), so nothing in the chain can route around the artifact.
78
+ // One sink for both `log` seams so nothing routes around the artifact.
124
79
  const gateLog = createGateLogSink({ storyId, config });
80
+ const lockWaits = trackLockWaits({ sink: gateLog.log, progress });
125
81
  const gateList = buildDefaultGates({
126
82
  config,
127
83
  baseBranch,
128
84
  cwd: worktreePath || cwd,
129
85
  log: gateLog.log,
130
- storyId, // Story #5313 — a credited bare `npm test` registers `test`.
86
+ storyId,
131
87
  evidenceCwd: cwd,
132
88
  });
133
89
  let validation;
@@ -136,57 +92,107 @@ export async function runCloseValidationPhase({
136
92
  cwd,
137
93
  worktreePath,
138
94
  gates: gateList,
139
- log: gateLog.log,
95
+ log: lockWaits.log,
140
96
  storyId,
141
- // Story #4250 — standalone storyId-anchored evidence keyspace. No
142
- // epicId; the standalone flag routes the cache to
143
- // temp/standalone/stories/story-<id>/validation-evidence.json.
97
+ // Anchors the evidence cache on the Story id, so a re-close at an
98
+ // unchanged HEAD skips already-passed gates.
144
99
  standalone: true,
145
- // Story #4776 — the branch pair and resolved config the advisory
146
- // projections need. Without them the runner skips the projection
147
- // phase entirely, which is the correct behaviour for resume/legacy
148
- // callers that have no story branch to diff.
100
+ // Needed for the advisory baseline projections; absent, they're skipped.
149
101
  baseBranch,
150
102
  storyBranch,
151
103
  config,
104
+ deferOnLockExpiry: true,
152
105
  });
153
106
  } finally {
154
- // Story #4766 — gate lines are buffered to an async stream so the drain
155
- // never blocks a gate child's pipe. Settle the artifact before anything
156
- // reads it, replays from it, or reports its path — including on the throw
157
- // path, where the artifact is the only surviving record.
107
+ // The sink is async-buffered; settle it before anything reads it, on
108
+ // the throw path too.
158
109
  await gateLog.flush();
159
110
  }
111
+ const lockWait = lockWaits.summary();
160
112
  if (!validation.ok) {
161
- const [first] = validation.failed;
162
- const { gate, status, cwd: gateCwd } = first;
163
- // The evidence is the point on this path: replay the captured tail inline
164
- // rather than making the caller open a file to learn why close stopped.
165
- gateLog.replay();
166
- const err = new Error(
167
- `[single-story-close] Gate failed: ${gate.name} (exit ${status})${gateCwd ? ` in ${gateCwd}` : ''}.` +
168
- (gate.hint ? ` ${gate.hint}` : ''),
169
- );
170
- // Story #5172 — the phase tracker tags `closePhase`; this tags WHICH gate
171
- // inside the phase died, so the failed terminal can name the split
172
- // baselines entry rather than reporting a generic validation failure.
173
- err.closeGate = gate.name;
174
- throw err;
113
+ return settleFailedValidation({ validation, lockWait, gateLog, progress });
175
114
  }
176
115
  progress('VALIDATE', `✅ All gates passed. ${gateLog.digest()}`);
177
- return { gates: gateOutcomes(gateList, validation) };
116
+ return {
117
+ gates: gateOutcomes(gateList, validation),
118
+ lockWait,
119
+ pending: false,
120
+ };
121
+ }
122
+
123
+ /**
124
+ * Deferred on an expired lock wait → `pending`; otherwise throws.
125
+ *
126
+ * @param {{
127
+ * validation: { failed: Array<{ gate: { name: string, hint?: string }, status: number, cwd?: string }> },
128
+ * lockWait: { waitedSeconds: number, expired: boolean }|null,
129
+ * gateLog: { replay: () => void },
130
+ * progress: (tag: string, msg: string) => void,
131
+ * }} args
132
+ * @returns {{ gates: null, lockWait: object, pending: true }}
133
+ */
134
+ function settleFailedValidation({ validation, lockWait, gateLog, progress }) {
135
+ const [first] = validation.failed;
136
+ const { gate, status, cwd: gateCwd } = first;
137
+ if (isDeferredLockWait(first, lockWait)) {
138
+ progress(
139
+ 'VALIDATE',
140
+ `⏸ ${gate.name} deferred: the full-suite lock wait expired after ${lockWait.waitedSeconds}s. Nothing was spawned; close will report pending.`,
141
+ );
142
+ return { gates: null, lockWait, pending: true };
143
+ }
144
+ gateLog.replay();
145
+ const err = new Error(
146
+ `[single-story-close] Gate failed: ${gate.name} (exit ${status})${gateCwd ? ` in ${gateCwd}` : ''}.` +
147
+ (gate.hint ? ` ${gate.hint}` : ''),
148
+ );
149
+ err.closeGate = gate.name;
150
+ throw err;
178
151
  }
179
152
 
180
153
  /**
181
- * Per-gate outcomes for a validation run that passed (Story #5172).
154
+ * Parsed from the gate log because it is the one place that sees waits both
155
+ * in-process and in gate children.
182
156
  *
183
- * Every registered gate passed unless the runner reported it skipped — an
184
- * evidence short-circuit at unchanged HEAD, or a changed-file scope that
185
- * matched nothing. `skipped` is the honest verdict for both: the gate did not
186
- * run in THIS invocation, and the terminal schema's own contract is that a
187
- * skipped gate is reported as skipped rather than quietly counted as a pass.
157
+ * @param {{ sink: (m: string) => void, progress: (tag: string, msg: string) => void }} args
158
+ * @returns {{ log: (m: string) => void, summary: () => { waitedSeconds: number, expired: boolean }|null }}
159
+ */
160
+ function trackLockWaits({ sink, progress }) {
161
+ let tally = null;
162
+ return {
163
+ log(line) {
164
+ sink(line);
165
+ if (!String(line).includes('[full-suite-lock]')) return;
166
+ progress('LOCK', line);
167
+ const outcome = parseLockWaitOutcome(line);
168
+ if (!outcome) return;
169
+ tally = {
170
+ waitedSeconds: (tally?.waitedSeconds ?? 0) + outcome.waitedSeconds,
171
+ expired: Boolean(tally?.expired) || outcome.expired,
172
+ };
173
+ },
174
+ summary: () => tally,
175
+ };
176
+ }
177
+
178
+ /**
179
+ * Needs both the exit code and a recorded expiry — either alone is ambiguous.
180
+ *
181
+ * @param {{ status: number }|undefined} failure
182
+ * @param {{ expired: boolean }|null} lockWait
183
+ * @returns {boolean}
184
+ */
185
+ function isDeferredLockWait(failure, lockWait) {
186
+ return (
187
+ failure?.status === LOCK_WAIT_EXPIRED_EXIT_CODE &&
188
+ lockWait?.expired === true
189
+ );
190
+ }
191
+
192
+ /**
193
+ * A gate that did not run this invocation reports `skipped`, never `passed`.
188
194
  *
189
- * @param {Array<{ name: string }>} gateList The gates this run registered.
195
+ * @param {Array<{ name: string }>} gateList
190
196
  * @param {{ skipped?: Array<{ gate: { name: string } }> }} validation
191
197
  * @returns {Record<string, 'passed'|'skipped'>}
192
198
  */
@@ -1,38 +1,11 @@
1
1
  /**
2
- * phases/code-review.js — Story-scope code review phase for
3
- * `single-story-close`.
2
+ * phases/code-review.js — Story-scope code review: findings post to the PR,
3
+ * with a cross-reference on the Story issue. Critical findings return
4
+ * `halted: true` so the caller never arms auto-merge.
4
5
  *
5
- * Runs the Story-scope code review against `main`, posts the structured
6
- * findings comment to the PR (not the Story issue), and adds a one-line
7
- * cross-reference comment on the Story issue linking back to the PR
8
- * review comment. The render header still labels the comment "Story #N"
9
- * even though the post target is the PR — the PR is the comment surface,
10
- * the Story is the ticket the findings *describe*.
11
- *
12
- * Cross-reference URL shape: GitHub serves issue comments at
13
- * `<prUrl>#issuecomment-<commentId>` — the same URL pattern for PR
14
- * conversation comments and issue comments, because PRs are issues at
15
- * the API level.
16
- *
17
- * Re-exports `parsePrNumber` (delegates to `lib/github-url.js`) so
18
- * existing call sites need not change. Story #3649.
19
- *
20
- * Critical findings cause `runStoryScopeReview` to return `halted: true`;
21
- * the caller raises that to a thrown error so auto-merge is not enabled.
22
- *
23
- * Delegates the `runCodeReview` invocation to `runStoryReviewCore`
24
- * (exported from `story-close/phases/review-core.js`) so the close path
25
- * shares a single invocation pattern (Story #3653). Review depth needs no
26
- * input here: it is derived from this Story's own diff inside `runCodeReview`
27
- * (Story #4542).
28
- *
29
- * Story #5325 — this phase boundary is where the base ref is resolved, once.
30
- * The resolved ref threads into `runStoryReviewCore`, which hands it to both
31
- * the change-set enumeration (and through it the provider review) and the
32
- * local lens pass, so one resolution corrects both arms. It resolves to
33
- * `origin/<baseBranch>` — the ref base-sync merged from — rather than the bare
34
- * branch name git would resolve to the local `refs/heads/<baseBranch>`, whose
35
- * drift would otherwise be scored as this Story's own change.
6
+ * The base ref is resolved once, here, to `origin/<baseBranch>` (what
7
+ * base-sync merged from) — the local branch's drift would otherwise be
8
+ * scored as this Story's change.
36
9
  */
37
10
 
38
11
  import { parsePrNumberFromUrl } from '../../../github-url.js';
@@ -49,23 +22,12 @@ import {
49
22
  } from './review-outcome.js';
50
23
 
51
24
  /**
52
- * Extract the numeric PR ID from a `gh pr create` URL. The CLI returns a
53
- * URL like `https://github.com/<owner>/<repo>/pull/<n>`; we want `<n>`.
54
- * Returns `null` when the URL doesn't match. Exported for testing.
55
- *
56
- * Delegates to `parsePrNumberFromUrl` in `lib/github-url.js`.
57
- * Re-exported under the original name so existing call sites and tests
58
- * do not need to change. Story #3649.
59
- *
60
25
  * @param {string|null|undefined} prUrl
61
26
  * @returns {number|null}
62
27
  */
63
28
  export const parsePrNumber = parsePrNumberFromUrl;
64
29
 
65
30
  /**
66
- * Build the cross-reference comment body posted on the Story issue when
67
- * the PR-side review comment lands. Pure; exported for testing.
68
- *
69
31
  * @param {{
70
32
  * prUrl: string,
71
33
  * prNumber: number,
@@ -109,9 +71,6 @@ async function invokeStoryReviewCore({
109
71
  progressTag: 'REVIEW',
110
72
  runCodeReviewFn,
111
73
  gitSpawnFn,
112
- // Forward the seams only when the caller injects them; otherwise
113
- // `runStoryReviewCore` uses its defaults. `undefined` deep-merges to
114
- // the default via the destructuring default there.
115
74
  ...(runLocalLensReviewFn ? { runLocalLensReviewFn } : {}),
116
75
  ...(appendFindingsYieldFn ? { appendFindingsYieldFn } : {}),
117
76
  });
@@ -160,21 +119,8 @@ async function postStoryReviewCrossRef({
160
119
  }
161
120
 
162
121
  /**
163
- * Run the Story-scope code review against `main`, post the structured
164
- * findings comment to the PR, and add a one-line cross-reference comment
165
- * on the Story issue linking back to the PR review comment.
166
- *
167
- * Failure modes:
168
- * - When `prNumber` is null (couldn't parse), the review is skipped
169
- * and the function returns `{ halted: false, skipped: true }`.
170
- * - When `origin/<baseBranch>` cannot be resolved, the review is skipped,
171
- * a `base-ref-resolution` degradation is recorded on the returned
172
- * envelope, and no findings are raised (Story #5325).
173
- * - When the runner throws, the close fails non-zero (the throw
174
- * propagates) — a Story-scope review failure is not silently
175
- * ignored.
176
- *
177
- * Exported for testing.
122
+ * Skips on an unparseable PR number or an unresolvable base (recording a
123
+ * degradation); a runner throw propagates and fails the close.
178
124
  *
179
125
  * @param {{
180
126
  * cwd: string,
@@ -224,8 +170,6 @@ export async function runStoryScopeReview({
224
170
  return { halted: false, skipped: true };
225
171
  }
226
172
 
227
- // One resolution per close, at the phase boundary: `baseRef` threads from
228
- // here into the change set, the provider review and the local lens pass.
229
173
  const base = resolveSharedBaseRef({ baseBranch, cwd, gitSpawnFn });
230
174
  if (!base.resolved) {
231
175
  return unresolvedBaseReviewOutcome({