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,24 +1,14 @@
1
1
  /**
2
- * phases/local-lens-review.js — the Story-scope local-lens pass.
3
- *
4
- * Extracted from `phases/code-review.js` (Story #4603) so the review spine and
5
- * the lens pass each carry one reason to change. The spine
6
- * (`runStoryReviewCore`) owns the single per-close-run diff enumeration and the
7
- * `runCodeReview` invocation; this module owns lens selection + materialization.
8
- *
9
- * Shift-left tier (Epic #4405): local concerns are cheap to decide on a single
10
- * Story's diff, so the maker-blind Story-scope review runs its matched local
11
- * lenses here, inside the story-close subprocess, rather than paying a deeper
12
- * pass at Epic close.
2
+ * phases/local-lens-review.js — the Story-scope local-lens pass: selects the
3
+ * local lenses matching the Story diff and materializes their prompts. The
4
+ * review spine (`runStoryReviewCore`) owns diff enumeration and code review.
13
5
  */
14
6
 
15
7
  import {
16
8
  evaluateLensDiffFloor,
17
- resolveLensDiffFloor,
18
9
  runAuditSuite,
19
10
  selectLocalLenses,
20
11
  } from '../../../audit-suite/index.js';
21
- import { resolveConfig } from '../../../config-resolver.js';
22
12
  import { gitSpawn } from '../../../git-utils.js';
23
13
  import {
24
14
  emitRuntimeFriction,
@@ -26,35 +16,12 @@ import {
26
16
  } from '../../../observability/runtime-friction.js';
27
17
  import { computeChangeSet } from '../../change-set.js';
28
18
 
29
- /**
30
- * The review depth the Story-scope local-lens pass runs at. Fixed for this
31
- * tier — it is not risk-scaled like the code-review pillar depth.
32
- *
33
- * Module-local: it is an implementation detail of {@link runLocalLensReview}
34
- * (it rides out on the returned envelope's `depth` field), not a public seam.
35
- * Tests assert the observable `'light'` on that envelope rather than importing
36
- * the constant, so it stays off the public surface (Story #4603).
37
- */
19
+ /** Fixed for this tier; not risk-scaled. */
38
20
  const STORY_SCOPE_LENS_DEPTH = 'light';
39
21
 
40
22
  /**
41
- * Render the host-MUST-walk roster of materialized lens-prompt artifacts
42
- * (Story #4627). The Story-scope lens pass materializes each matched lens's
43
- * substituted prompt body to a scoped artifact file; the default review
44
- * provider is a mechanical sweep that never reads them, so the artifacts are
45
- * inert unless the close's stdout tells the host to walk them. This mirrors
46
- * the plan-run audit-roster comment's "host MUST walk each" contract
47
- * (`run-epilogue.js`): the close names each artifact path and the host reads
48
- * each one against the diff.
49
- *
50
- * Pure: derives the block from the `runAuditSuite` envelope's `workflows[]`,
51
- * keeping only entries that actually wrote an artifact. Returns `null` when no
52
- * artifact was written (nothing to walk), so the caller emits nothing.
53
- *
54
- * Module-local: an implementation detail of {@link runLocalLensReview}, whose
55
- * host-MUST-walk output rides out on the `progress` stream. Exercised through
56
- * that public entry point (assert the progress lines name each artifact path)
57
- * rather than imported directly, so it adds no production-dead public export.
23
+ * Roster of materialized lens-prompt artifacts the host MUST walk — the
24
+ * default review provider never reads them, so without this they are inert.
58
25
  *
59
26
  * @param {object|null} materialized the `runAuditSuite` result envelope.
60
27
  * @returns {string|null} the roster block, or `null` when there is nothing to walk.
@@ -71,12 +38,7 @@ function renderLensArtifactRoster(materialized) {
71
38
  }
72
39
 
73
40
  /**
74
- * Build the `runAuditSuite` substitutions for the Story-scope lens pass
75
- * (Story #4627). Resolves the `{{changedFiles}}` token from the actual Story
76
- * diff (newline-joined, the shape the lens templates' `## Scope` block reads)
77
- * and the `{{ticketId}}` token from the Story id when known. Both are built-in
78
- * substitution keys (`substitutions.js#BUILT_IN_SUBSTITUTION_KEYS`), so the
79
- * runner accepts them without a per-lens `substitutionKeys` declaration.
41
+ * Built-in substitution keys, so no per-lens declaration is needed.
80
42
  *
81
43
  * @param {{ changedFiles: string[], storyId?: number|string|null }} args
82
44
  * @returns {Record<string, string>}
@@ -90,26 +52,14 @@ function buildLensSubstitutions({ changedFiles, storyId }) {
90
52
  }
91
53
 
92
54
  /**
93
- * Enumerate the files changed in the `baseRef...headRef` diff. Thin adapter over
94
- * the shared {@link computeChangeSet} enumerator (Story #4593) that flattens its
95
- * `files: string[]|null` envelope to this phase's historical `[]`-on-failure
96
- * contract: the lens roster treats "nothing changed" and "diff unknown"
97
- * identically, because an unknown diff matches no `filePatterns` and therefore
98
- * adds no lens work either way.
99
- *
100
- * Best-effort and total — never throws, mirroring the advisory posture of the
101
- * surrounding review phase. Retained as the self-enumeration fallback for
102
- * {@link runLocalLensReview} when no change set is injected.
55
+ * Never throws: an unknown diff returns `[]`, which matches no lens, same as
56
+ * an empty one.
103
57
  *
104
58
  * @param {{
105
59
  * baseRef: string,
106
60
  * headRef: string,
107
61
  * gitSpawnFn?: import('../../change-set.js').GitSpawnFn,
108
62
  * }} args
109
- * Module-local (Story #4603): a private fallback of {@link runLocalLensReview},
110
- * exercised through that public entry point rather than imported directly, so it
111
- * adds no public export a production path fails to reach.
112
- *
113
63
  * @returns {string[]} Changed file paths, or `[]` on any failure.
114
64
  */
115
65
  function enumerateChangedFiles({ baseRef, headRef, gitSpawnFn = gitSpawn }) {
@@ -117,28 +67,9 @@ function enumerateChangedFiles({ baseRef, headRef, gitSpawnFn = gitSpawn }) {
117
67
  }
118
68
 
119
69
  /**
120
- * Resolve the change set the lens roster reads, honouring all THREE injection
121
- * states (Story #4603 — the fix for #4593's single-enumeration leak).
122
- *
123
- * The distinction between `null` and `undefined` is load-bearing and mirrors
124
- * the sibling contract in `orchestration/code-review.js#resolveInjectedChangedFiles`:
125
- *
126
- * - **array** — the caller's change set; use it verbatim.
127
- * - **`null`** — the caller (`runStoryReviewCore`) already tried and the
128
- * diff is unenumerable. Re-running git here would only fail
129
- * again, so degrade straight to the fail-safe empty roster.
130
- * - **`undefined`** — nobody enumerated (standalone callers), so the shared
131
- * enumerator runs as the fallback.
132
- *
133
- * The prior `Array.isArray()` discriminator collapsed `null` and `undefined`
134
- * into one branch and re-spawned git on the unenumerable path, contradicting the
135
- * spine's documented "the one enumeration per close run" invariant.
136
- *
137
- * Module-local (Story #4603): a private detail of {@link runLocalLensReview}.
138
- * The three-state contract is asserted through that public entry point (does an
139
- * injected `null` re-spawn git? does `undefined` self-enumerate?), so it needs
140
- * no public export — keeping the fix from re-introducing the very kind of
141
- * production-dead public symbol this Story's ratchet root-cause is about.
70
+ * Three-state injection: an array is used verbatim; `null` means the spine
71
+ * already failed to enumerate, so don't re-spawn git; `undefined` means
72
+ * nobody enumerated, so self-enumerate.
142
73
  *
143
74
  * @param {{
144
75
  * changedFiles: string[]|null|undefined,
@@ -161,40 +92,11 @@ function resolveLensChangeSet({
161
92
  }
162
93
 
163
94
  /**
164
- * Run the Story-scope local-lens pass: select the LOCAL-tier lenses whose
165
- * `filePatterns` match the actual Story diff (`baseRef...headRef`) and
166
- * materialize their lens-prompt bodies at `light` depth. Called only from
167
- * `runStoryReviewCore`, never in the delivering child's (maker's) context, so a
168
- * maker never grades its own work.
169
- *
170
- * A diff that matches no local lens adds **no** lens work: the roster is empty
171
- * and `runAuditSuite` is never invoked. Best-effort and total — a git or
172
- * materialization failure degrades to `{ skipped: true, lenses: [] }` and is
173
- * logged via `progress`, matching the advisory posture the review phase already
174
- * takes for provider/transport failures.
175
- *
176
- * Story #4593 — `changedFiles` is injected by `runStoryReviewCore`, which
177
- * computes the change set once per close run and hands the same list to this
178
- * pass and to `runCodeReview`. Self-enumeration is the **fallback only**, kept
179
- * for standalone callers that supply no list; see {@link resolveLensChangeSet}
180
- * for the three-state contract.
181
- *
182
- * Story #4627 — the pass now delivers lens **content** to a reader. It threads
183
- * `{{changedFiles}}` / `{{ticketId}}` substitutions and an `artifactPrefix`
184
- * into `runAuditSuite` so each matched lens's substituted prompt body is
185
- * written to a scoped artifact under the run's audit output dir, then emits a
186
- * host-MUST-walk roster of those artifact paths to the close's stdout. Before
187
- * this the default review provider dropped the materialized envelope, so the
188
- * pass was a progress log line with no reader.
189
- *
190
- * Story #4699 — the **lens diff-floor**. When the caller supplies a known
191
- * `changedLineCount` and the diff sits strictly below the configured floor
192
- * (`delivery.review.lensDiffFloor`, default 40) with zero sensitive-path
193
- * hits, the pass records the matched roster but skips materialization
194
- * entirely (`skipped: true` with the lenses retained and a `floorSkip`
195
- * verdict) — the maker-blind code-review pillar and every hard gate are
196
- * untouched. An unknown line count, a disabled floor, or a sensitive-path
197
- * hit all fail open to the full materialization.
95
+ * Run the maker-blind Story-scope lens pass (called only from
96
+ * `runStoryReviewCore`). No matching lens → no lens work. A diff below the
97
+ * lens diff-floor with no sensitive-path hits records the roster but skips
98
+ * materialization; an unknown line count fails open. Advisory: any failure
99
+ * degrades to a skipped envelope plus a friction signal.
198
100
  *
199
101
  * @param {{
200
102
  * baseRef: string,
@@ -209,7 +111,6 @@ function resolveLensChangeSet({
209
111
  * gitSpawnFn?: import('../../change-set.js').GitSpawnFn,
210
112
  * selectLocalLensesFn?: typeof selectLocalLenses,
211
113
  * runAuditSuiteFn?: typeof runAuditSuite,
212
- * resolveConfigFn?: typeof resolveConfig,
213
114
  * evaluateLensDiffFloorFn?: typeof evaluateLensDiffFloor,
214
115
  * emitToolDegradationFn?: typeof emitRuntimeFriction,
215
116
  * }} args
@@ -235,7 +136,6 @@ export async function runLocalLensReview({
235
136
  gitSpawnFn = gitSpawn,
236
137
  selectLocalLensesFn = selectLocalLenses,
237
138
  runAuditSuiteFn = runAuditSuite,
238
- resolveConfigFn = resolveConfig,
239
139
  evaluateLensDiffFloorFn = evaluateLensDiffFloor,
240
140
  emitToolDegradationFn = emitRuntimeFriction,
241
141
  }) {
@@ -263,16 +163,11 @@ export async function runLocalLensReview({
263
163
  return empty;
264
164
  }
265
165
 
266
- // Lens diff-floor (Story #4699). Deliberately evaluated AFTER lens
267
- // selection so a floor-skip still records WHICH lenses it skipped —
268
- // the findings-yield ledger needs the roster either way.
166
+ // After selection so a floor-skip still records which lenses it skipped.
269
167
  const floorVerdict = evaluateLensDiffFloorFn({
270
168
  changedFiles,
271
169
  changedLineCount,
272
- floor:
273
- typeof lensDiffFloor === 'number'
274
- ? lensDiffFloor
275
- : resolveLensDiffFloor(safeResolveConfig(resolveConfigFn)),
170
+ floor: lensDiffFloor,
276
171
  });
277
172
  if (floorVerdict.skip) {
278
173
  progress(
@@ -290,8 +185,7 @@ export async function runLocalLensReview({
290
185
  artifactPaths: [],
291
186
  };
292
187
  }
293
- // Scope the artifact filenames to this Story so concurrent closes on a
294
- // shared audit output dir cannot clobber each other's prompts.
188
+ // Story-scoped names so concurrent closes can't clobber each other.
295
189
  const effectivePrefix =
296
190
  artifactPrefix ?? (storyId != null ? `story-${storyId}` : 'story-scope');
297
191
  const materialized = await runAuditSuiteFn({
@@ -317,10 +211,7 @@ export async function runLocalLensReview({
317
211
  artifactPaths,
318
212
  };
319
213
  } catch (err) {
320
- // The lens pass is advisory: a git or materialization failure must not
321
- // fail the close. Log, route the tool-execution degradation to friction
322
- // telemetry (Story #4699 — degradations are operational signals, not
323
- // findings), and degrade to a skipped envelope.
214
+ // Degradations are operational signals (friction), not findings.
324
215
  progress(
325
216
  progressTag,
326
217
  `⚠️ local lens pass failed (continuing without it): ${err?.message ?? err}`,
@@ -336,24 +227,8 @@ export async function runLocalLensReview({
336
227
  },
337
228
  });
338
229
  } catch {
339
- // Observability must never fail the close (best-effort contract).
230
+ // Observability must never fail the close.
340
231
  }
341
232
  return empty;
342
233
  }
343
234
  }
344
-
345
- /**
346
- * Resolve config for the floor read without letting a resolver failure
347
- * fail the (advisory) lens pass. Module-local: a degraded config simply
348
- * yields the framework-default floor.
349
- *
350
- * @param {typeof resolveConfig} resolveConfigFn
351
- * @returns {object|undefined}
352
- */
353
- function safeResolveConfig(resolveConfigFn) {
354
- try {
355
- return resolveConfigFn();
356
- } catch {
357
- return undefined;
358
- }
359
- }
@@ -1,13 +1,6 @@
1
1
  /**
2
- * phases/review-core.js — the shared Story-scope review spine.
3
- *
4
- * Extracted from the Epic-era `phases/code-review.js` (Story #4603) so the
5
- * spine belonged to neither close path. `runStoryReviewCore` is the one
6
- * implementation `runCodeReview` is called through; since Story #5006 retired
7
- * the Epic-attached phase, its sole caller is the v2 standalone path
8
- * (`single-story-close/phases/code-review.js#runStoryScopeReview`). It stays
9
- * here — the shared-spine contract (Story #3653) is what keeps the maker-blind
10
- * review invocation out of a phase file.
2
+ * phases/review-core.js — the shared Story-scope review spine; keeps the
3
+ * maker-blind `runCodeReview` invocation out of any phase file.
11
4
  */
12
5
 
13
6
  import { countChangedLines } from '../../../audit-suite/index.js';
@@ -18,35 +11,15 @@ import { runCodeReview } from '../../code-review.js';
18
11
  import { runLocalLensReview } from './local-lens-review.js';
19
12
 
20
13
  /**
21
- * Invoke `runCodeReviewFn` with the canonical Story-scope envelope and return
22
- * the raw result.
23
- *
24
- * The caller is responsible for error handling and result interpretation —
25
- * this function propagates throws rather than swallowing them, because the
26
- * two callers have different advisory postures:
27
- *
28
- * - Epic-attached close: swallows throws (non-blocking advisory, same as
29
- * `refresh.js`).
30
- * - Standalone close: propagates throws (a review failure stops the close).
14
+ * Run the local-lens pass and `runCodeReview` over one change set and return
15
+ * the review result. Throws propagate; the caller picks the advisory posture.
16
+ * Review depth is derived by `runCodeReview` from the changed files and is
17
+ * input-only — it never alters the output envelope.
31
18
  *
32
- * Review depth is not passed in: `runCodeReview` derives it from the changed
33
- * files — their sensitive-path intersection plus their count (Story #4542, which
34
- * retired the planner-authored risk envelope this spine used to forward). Depth
35
- * remains an **input-only** signal: it tells the provider how thorough to be and
36
- * never alters the review's output envelope or the posted structured-comment
37
- * body.
38
- *
39
- * Story #4593 — this spine is the **single injection point** for the change set.
40
- * It enumerates `baseRef...headRef` exactly once via {@link computeChangeSet}
41
- * and threads the resulting list into both the local-lens pass and
42
- * `runCodeReview`, which otherwise each enumerated the diff for themselves. Both
43
- * consumers ultimately route through `deriveChangeLevel`, so feeding them one
44
- * list is what makes the lens roster and the review depth provably agree about
45
- * what changed — even when a commit lands between the two calls.
46
- *
47
- * Story #4603 — the invariant now holds on the failure path too: an unenumerable
48
- * diff injects an explicit `null`, and both consumers distinguish that from
49
- * `undefined` ("nobody enumerated") rather than re-spawning git.
19
+ * The diff is enumerated exactly once here and injected into both consumers,
20
+ * so lens roster and review depth agree on what changed even if a commit
21
+ * lands in between. An unenumerable diff injects `null` ("already tried"),
22
+ * which both consumers honour without re-spawning git.
50
23
  *
51
24
  * @param {{
52
25
  * storyId: number|string,
@@ -63,10 +36,8 @@ import { runLocalLensReview } from './local-lens-review.js';
63
36
  * countChangedLinesFn?: typeof countChangedLines,
64
37
  * appendFindingsYieldFn?: typeof appendFindingsYield,
65
38
  * }} args
66
- * @returns {Promise<object>} Raw result envelope from `runCodeReview`, augmented
67
- * with a `localLensReview` field carrying the Story-scope local-lens pass
68
- * outcome (Epic #4405, Story #4409) and the `changeSet` this run computed
69
- * (Story #4593).
39
+ * @returns {Promise<object>} The `runCodeReview` result plus
40
+ * `localLensReview` and the computed `changeSet`.
70
41
  */
71
42
  export async function runStoryReviewCore({
72
43
  storyId,
@@ -85,17 +56,10 @@ export async function runStoryReviewCore({
85
56
  }) {
86
57
  const storyIdNum = Number(storyId);
87
58
 
88
- // The one enumeration per close run. Every consumer below is injected from
89
- // this list; none of them re-derives the diff. `files` is `null` when the
90
- // diff is unenumerable — an explicit "already tried" signal both consumers
91
- // honour without retrying (Story #4603).
92
59
  const changeSet = computeChangeSetFn({ baseRef, headRef, gitSpawnFn });
93
60
 
94
- // The one changed-LINE enumeration (Story #4699 — the lens diff-floor's
95
- // size signal). Probed only when the file enumeration succeeded with a
96
- // non-empty set: a null/empty set already yields an empty lens roster, so
97
- // a second git spawn would buy nothing. `null` = count unknown → the
98
- // floor fails open (no skip).
61
+ // Line count for the lens diff-floor, probed only for a non-empty file set;
62
+ // `null` = unknown, and the floor fails open.
99
63
  const changedLineCount =
100
64
  Array.isArray(changeSet.files) && changeSet.files.length > 0
101
65
  ? countChangedLinesFn({ baseRef, headRef, gitSpawnFn })
@@ -118,11 +82,6 @@ export async function runStoryReviewCore({
118
82
  opts.commentTargetId = commentTargetId;
119
83
  }
120
84
 
121
- // Shift-left local-lens pass (Epic #4405). Runs matched local lenses at
122
- // `light` depth against the actual Story diff, inside this close-subprocess
123
- // spine so the maker never grades its own work. Advisory — it never blocks
124
- // the close and its outcome rides on the returned envelope for downstream
125
- // consumers.
126
85
  const localLensReview = await runLocalLensReviewFn({
127
86
  baseRef,
128
87
  headRef,
@@ -136,9 +95,7 @@ export async function runStoryReviewCore({
136
95
 
137
96
  const result = await runCodeReviewFn(opts);
138
97
 
139
- // Findings-yield ledger (Story #4699) — record what this close's lens
140
- // pass produced (or floor-skipped) so the roster can later be tuned on
141
- // measurement. Best-effort: a ledger failure never fails the review.
98
+ // Best-effort findings-yield ledger, for tuning the roster on measurement.
142
99
  try {
143
100
  const yieldEntries = buildLensYieldEntries(localLensReview);
144
101
  if (yieldEntries !== null) {
@@ -160,15 +117,7 @@ export async function runStoryReviewCore({
160
117
  }
161
118
 
162
119
  /**
163
- * Fold the lens-pass envelope into per-lens findings-yield entries
164
- * (Story #4699). One entry per lens in the matched roster: the lens name,
165
- * the count of materialization findings attributed to it, and whether the
166
- * diff-floor skipped its materialization. Returns `null` when the roster is
167
- * empty (nothing ran, nothing skipped — no record to write).
168
- *
169
- * Module-local: an implementation detail of {@link runStoryReviewCore},
170
- * asserted through the appended record's shape rather than imported
171
- * directly.
120
+ * One findings-yield entry per matched lens; `null` for an empty roster.
172
121
  *
173
122
  * @param {object|null|undefined} localLensReview
174
123
  * @returns {Array<{ lens: string, findings: number, skippedByFloor: boolean }>|null}
@@ -1,30 +1,8 @@
1
1
  /**
2
- * story-deliver-terminal-schema.js — load `story-deliver-terminal.schema.json`
3
- * and validate envelopes against it.
4
- *
5
- * Split out of `story-deliver-terminal.js` so the envelope WRITER holds only
6
- * the contract's shape and vocabulary, and this module holds the one thing
7
- * the writer must never depend on at call time: the filesystem.
8
- *
9
- * That separation is the fix, not just tidiness. `single-story-close.js`
10
- * invoked by a *worktree-relative* path runs the Story worktree's own copy of
11
- * the script and then **reaps that worktree** as one of its phases. The schema
12
- * used to be read lazily, on the first envelope build — which happens after
13
- * the reap — so the read hit a path that no longer existed. The throw landed
14
- * inside the close CLI's error path, so a Story whose PR had merged, whose
15
- * label was `agent::done`, and whose post-land tail was green exited non-zero
16
- * emitting NO envelope at all: the delivery engine's documented return
17
- * contract lost to a success, recoverable only by a second close run from the
18
- * main checkout.
19
- *
20
- * Two guarantees close that, and both live here:
21
- *
22
- * 1. The schema is read and parsed ONCE, at module load. The parsed schema
23
- * outlives the file, so what happens to the directory afterwards is
24
- * irrelevant. Compilation stays lazy — it needs no filesystem — so an
25
- * import costs one small read and nothing else.
26
- * 2. An unreadable schema DEGRADES validation rather than throwing. A
27
- * schema violation still fails loudly; see {@link validateTerminalEnvelope}.
2
+ * Load `story-deliver-terminal.schema.json` and validate envelopes. The schema
3
+ * is read ONCE at module load: close may run from a worktree it later reaps,
4
+ * so a lazy read after the reap would lose the envelope. An unreadable schema
5
+ * degrades validation rather than throwing.
28
6
  */
29
7
 
30
8
  import fs from 'node:fs';
@@ -36,14 +14,6 @@ import addFormats from 'ajv-formats';
36
14
 
37
15
  const __dirname = path.dirname(fileURLToPath(import.meta.url));
38
16
 
39
- /**
40
- * Absolute path to the shipped schema — the SSOT this module reads.
41
- *
42
- * Module-private, like every other `SCHEMA_PATH` in the tree
43
- * (`validation-evidence.js`, `signal-validator.js`): the path is an
44
- * implementation detail of loading, and callers want the verdict, not the
45
- * location.
46
- */
47
17
  const SCHEMA_PATH = path.resolve(
48
18
  __dirname,
49
19
  '..',
@@ -54,9 +24,7 @@ const SCHEMA_PATH = path.resolve(
54
24
  );
55
25
 
56
26
  /**
57
- * Read and parse the shipped schema. Never throws: a read failure is recorded
58
- * on the returned source and degrades validation downstream, because importing
59
- * this module must never be what breaks a delivery.
27
+ * Never throws: importing this module must never break a delivery.
60
28
  *
61
29
  * @returns {{ schema: object|null, error: string|null }}
62
30
  */
@@ -71,28 +39,17 @@ function loadSchemaSource() {
71
39
  }
72
40
  }
73
41
 
74
- /**
75
- * The schema, read and parsed at module load. Deliberately eager — see the
76
- * module header for the failure that made it so.
77
- *
78
- * @type {{ schema: object|null, error: string|null }}
79
- */
42
+ /** @type {{ schema: object|null, error: string|null }} */
80
43
  const SCHEMA_SOURCE = loadSchemaSource();
81
44
 
82
45
  /**
83
- * Compiled validators keyed by the source object they came from.
84
- *
85
- * A `WeakMap` rather than one module-level slot so an injected `schemaSource`
86
- * (the test seam) can never poison the validator the production path memoizes.
46
+ * Keyed by source so an injected test source never poisons production's.
87
47
  *
88
48
  * @type {WeakMap<object, Function>}
89
49
  */
90
50
  const VALIDATORS = new WeakMap();
91
51
 
92
52
  /**
93
- * Compile (once per source) and return the terminal-envelope validator, or
94
- * `null` when the source carries no usable schema.
95
- *
96
53
  * @param {{ schema: object|null }} source
97
54
  * @returns {Function|null}
98
55
  */
@@ -110,13 +67,8 @@ function getValidator(source) {
110
67
  let _unvalidatedWarned = false;
111
68
 
112
69
  /**
113
- * Announce — once per process — that an envelope is going out unvalidated.
114
- *
115
- * Written straight to stderr rather than through `Logger.warn` for the same
116
- * reason `emitTerminalEnvelope` bypasses `Logger.info`: the envelope itself is
117
- * unsuppressible, so the notice that one was not checked has to be too. Under
118
- * `AGENT_LOG_LEVEL=silent` a level-gated warning would vanish and the degrade
119
- * would be invisible.
70
+ * Once per process, straight to stderr: like the envelope itself, the notice
71
+ * must survive `AGENT_LOG_LEVEL=silent`.
120
72
  *
121
73
  * @param {string|null|undefined} error
122
74
  * @returns {void}
@@ -132,20 +84,12 @@ function warnUnvalidated(error) {
132
84
  }
133
85
 
134
86
  /**
135
- * Validate a candidate envelope against the shipped schema.
136
- *
137
- * When the schema is unavailable the result reports `validated: false` and
138
- * `valid: true` — a **deliberate degrade**, not an oversight. Losing the shape
139
- * check costs a guard against a malformed envelope; throwing here costs the
140
- * envelope entirely, and the envelope is the documented return contract of the
141
- * delivery engine. An unvalidated terminal a caller can act on beats no
142
- * terminal at all, so the unreadable-schema case degrades and says so on
143
- * stderr while a schema *violation* still fails loudly at the writer.
87
+ * With no schema: `valid: true, validated: false` — deliberately, since an
88
+ * unvalidated envelope beats none. A violation still fails at the writer.
144
89
  *
145
90
  * @param {object} envelope
146
91
  * @param {{ schemaSource?: { schema: object|null, error: string|null } }} [opts]
147
- * `schemaSource` is a test seam — production always uses the eagerly loaded
148
- * module-level source.
92
+ * Test seam.
149
93
  * @returns {{ valid: boolean, errors: string[], validated: boolean }}
150
94
  */
151
95
  export function validateTerminalEnvelope(