mandrel 2.60.0 → 2.61.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (661) 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/pinned-identifier-lint.js +17 -57
  318. package/.agents/scripts/lib/orchestration/plan-context.js +52 -303
  319. package/.agents/scripts/lib/orchestration/plan-critic-conditions.js +22 -79
  320. package/.agents/scripts/lib/orchestration/plan-critics-evaluate.js +5 -31
  321. package/.agents/scripts/lib/orchestration/plan-metrics.js +29 -108
  322. package/.agents/scripts/lib/orchestration/plan-navigation.js +8 -27
  323. package/.agents/scripts/lib/orchestration/plan-persist/acceptance-handle-repair.js +12 -49
  324. package/.agents/scripts/lib/orchestration/plan-persist/audit-provenance.js +18 -73
  325. package/.agents/scripts/lib/orchestration/plan-persist/changes-repair.js +14 -78
  326. package/.agents/scripts/lib/orchestration/plan-persist/cross-plan-links.js +6 -30
  327. package/.agents/scripts/lib/orchestration/plan-persist/epic-adoption.js +14 -65
  328. package/.agents/scripts/lib/orchestration/plan-persist/epic-ops.js +21 -76
  329. package/.agents/scripts/lib/orchestration/plan-persist/external-deps.js +6 -43
  330. package/.agents/scripts/lib/orchestration/plan-persist/persist-helpers.js +14 -68
  331. package/.agents/scripts/lib/orchestration/plan-persist/plan-context-source.js +9 -41
  332. package/.agents/scripts/lib/orchestration/plan-persist/run-plan-persist.js +49 -248
  333. package/.agents/scripts/lib/orchestration/plan-persist/soft-findings.js +2 -12
  334. package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +85 -368
  335. package/.agents/scripts/lib/orchestration/plan-persist/summary.js +8 -38
  336. package/.agents/scripts/lib/orchestration/plan-persist/supersede-ops.js +30 -190
  337. package/.agents/scripts/lib/orchestration/plan-persist/wave-collision-gate.js +9 -49
  338. package/.agents/scripts/lib/orchestration/plan-persist/wave-serialisation.js +7 -28
  339. package/.agents/scripts/lib/orchestration/plan-reachability.js +13 -42
  340. package/.agents/scripts/lib/orchestration/plan-run-labels/reap.js +16 -91
  341. package/.agents/scripts/lib/orchestration/plan-runner/worktree-sweep.js +16 -54
  342. package/.agents/scripts/lib/orchestration/plan-text-hygiene.js +10 -52
  343. package/.agents/scripts/lib/orchestration/planning/authoring-context.js +14 -109
  344. package/.agents/scripts/lib/orchestration/planning/memory-pool-advisory.js +11 -83
  345. package/.agents/scripts/lib/orchestration/pr-watch.js +48 -306
  346. package/.agents/scripts/lib/orchestration/project-meta-cache.js +15 -80
  347. package/.agents/scripts/lib/orchestration/project-meta-resolver.js +10 -51
  348. package/.agents/scripts/lib/orchestration/reassert-status-column.js +12 -76
  349. package/.agents/scripts/lib/orchestration/remote-verifier.js +12 -36
  350. package/.agents/scripts/lib/orchestration/resolve-stories.js +33 -164
  351. package/.agents/scripts/lib/orchestration/retro-proposals.js +66 -361
  352. package/.agents/scripts/lib/orchestration/review-base-ref.js +9 -43
  353. package/.agents/scripts/lib/orchestration/review-depth.js +12 -94
  354. package/.agents/scripts/lib/orchestration/review-providers/codex.js +10 -111
  355. package/.agents/scripts/lib/orchestration/review-providers/degraded-gates.js +13 -71
  356. package/.agents/scripts/lib/orchestration/review-providers/findings-renderer.js +7 -51
  357. package/.agents/scripts/lib/orchestration/review-providers/mi-exemptions.js +8 -53
  358. package/.agents/scripts/lib/orchestration/review-providers/native.js +30 -214
  359. package/.agents/scripts/lib/orchestration/review-providers/parse-findings.js +7 -52
  360. package/.agents/scripts/lib/orchestration/review-providers/review-depth.js +4 -33
  361. package/.agents/scripts/lib/orchestration/review-providers/review-provider-factory.js +11 -71
  362. package/.agents/scripts/lib/orchestration/review-providers/scoped-lint.js +19 -131
  363. package/.agents/scripts/lib/orchestration/review-providers/security-review.js +6 -89
  364. package/.agents/scripts/lib/orchestration/review-providers/types.js +26 -56
  365. package/.agents/scripts/lib/orchestration/review-providers/ultrareview.js +3 -46
  366. package/.agents/scripts/lib/orchestration/run-epilogue.js +40 -199
  367. package/.agents/scripts/lib/orchestration/run-scoped-config.js +13 -81
  368. package/.agents/scripts/lib/orchestration/single-story-close/close-note.js +7 -34
  369. package/.agents/scripts/lib/orchestration/single-story-close/failed-terminal.js +16 -89
  370. package/.agents/scripts/lib/orchestration/single-story-close/gate-log.js +18 -109
  371. package/.agents/scripts/lib/orchestration/single-story-close/phases/auto-merge.js +83 -239
  372. package/.agents/scripts/lib/orchestration/single-story-close/phases/base-sync.js +18 -80
  373. package/.agents/scripts/lib/orchestration/single-story-close/phases/close-validation.js +103 -97
  374. package/.agents/scripts/lib/orchestration/single-story-close/phases/code-review.js +8 -64
  375. package/.agents/scripts/lib/orchestration/single-story-close/phases/confirm-merge.js +136 -486
  376. package/.agents/scripts/lib/orchestration/single-story-close/phases/conventional-subject.js +30 -134
  377. package/.agents/scripts/lib/orchestration/single-story-close/phases/graphql-preflight.js +9 -50
  378. package/.agents/scripts/lib/orchestration/single-story-close/phases/lock-wait-pending.js +49 -0
  379. package/.agents/scripts/lib/orchestration/single-story-close/phases/normalize-pr-title.js +13 -86
  380. package/.agents/scripts/lib/orchestration/single-story-close/phases/options.js +20 -95
  381. package/.agents/scripts/lib/orchestration/single-story-close/phases/post-land.js +46 -203
  382. package/.agents/scripts/lib/orchestration/single-story-close/phases/pre-gate-steps.js +8 -50
  383. package/.agents/scripts/lib/orchestration/single-story-close/phases/pull-request.js +12 -83
  384. package/.agents/scripts/lib/orchestration/single-story-close/phases/push.js +6 -39
  385. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-block.js +1 -6
  386. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-outcome.js +4 -28
  387. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-override.js +6 -51
  388. package/.agents/scripts/lib/orchestration/single-story-close/phases/worktree-reap.js +6 -34
  389. package/.agents/scripts/lib/orchestration/single-story-close/phases/wrong-tree-guard.js +23 -121
  390. package/.agents/scripts/lib/orchestration/single-story-close/runner.js +110 -290
  391. package/.agents/scripts/lib/orchestration/single-story-lease-guard.js +15 -69
  392. package/.agents/scripts/lib/orchestration/story-body-gate.js +4 -23
  393. package/.agents/scripts/lib/orchestration/story-close/baseline-upward-writeback.js +50 -179
  394. package/.agents/scripts/lib/orchestration/story-close/context-budget-writeback.js +11 -41
  395. package/.agents/scripts/lib/orchestration/story-close/format-autofix.js +23 -311
  396. package/.agents/scripts/lib/orchestration/story-close/phases/local-lens-review.js +22 -147
  397. package/.agents/scripts/lib/orchestration/story-close/phases/review-core.js +16 -67
  398. package/.agents/scripts/lib/orchestration/story-deliver-terminal-schema.js +12 -68
  399. package/.agents/scripts/lib/orchestration/story-deliver-terminal.js +42 -201
  400. package/.agents/scripts/lib/orchestration/story-follow-ups.js +43 -245
  401. package/.agents/scripts/lib/orchestration/story-init-envelope.js +4 -23
  402. package/.agents/scripts/lib/orchestration/story-init-remote.js +2 -6
  403. package/.agents/scripts/lib/orchestration/story-reachability.js +3 -23
  404. package/.agents/scripts/lib/orchestration/task-body-validator.js +12 -126
  405. package/.agents/scripts/lib/orchestration/ticket-lease.js +28 -131
  406. package/.agents/scripts/lib/orchestration/ticket-validator-conflicts.js +15 -149
  407. package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +5 -33
  408. package/.agents/scripts/lib/orchestration/ticket-validator.js +39 -181
  409. package/.agents/scripts/lib/orchestration/ticketing/bulk.js +51 -244
  410. package/.agents/scripts/lib/orchestration/ticketing/reads.js +39 -250
  411. package/.agents/scripts/lib/orchestration/ticketing/state.js +14 -68
  412. package/.agents/scripts/lib/orchestration/ticketing/transition.js +46 -263
  413. package/.agents/scripts/lib/orchestration/ticketing.js +2 -26
  414. package/.agents/scripts/lib/orchestration/verify-credit.js +18 -79
  415. package/.agents/scripts/lib/orchestration/worktree-dirty.js +5 -30
  416. package/.agents/scripts/lib/path-security.js +3 -6
  417. package/.agents/scripts/lib/plan-phase-cleanup.js +9 -49
  418. package/.agents/scripts/lib/preflight-runner.js +13 -69
  419. package/.agents/scripts/lib/process-group.js +143 -0
  420. package/.agents/scripts/lib/project-root.js +2 -8
  421. package/.agents/scripts/lib/provider-factory.js +2 -25
  422. package/.agents/scripts/lib/qa/console-allowlist.js +10 -59
  423. package/.agents/scripts/lib/qa/qa-session.js +15 -69
  424. package/.agents/scripts/lib/qa/redact-evidence.js +18 -129
  425. package/.agents/scripts/lib/qa/resolve-qa-contract.js +26 -135
  426. package/.agents/scripts/lib/qa/resolve-selection.js +16 -84
  427. package/.agents/scripts/lib/reserved-test-ids.js +9 -47
  428. package/.agents/scripts/lib/runtime-deps/dep-resolution.js +13 -53
  429. package/.agents/scripts/lib/runtime-deps/ensure-installed.js +10 -44
  430. package/.agents/scripts/lib/runtime-deps/manifest.js +10 -30
  431. package/.agents/scripts/lib/runtime-deps/parser-major.js +15 -51
  432. package/.agents/scripts/lib/runtime-deps/preflight.js +4 -22
  433. package/.agents/scripts/lib/runtime-deps/scan-imports.js +11 -55
  434. package/.agents/scripts/lib/signals/detectors/common.js +12 -38
  435. package/.agents/scripts/lib/signals/index.js +2 -19
  436. package/.agents/scripts/lib/signals/schema.js +14 -109
  437. package/.agents/scripts/lib/signals/write.js +2 -11
  438. package/.agents/scripts/lib/single-story/confirm-merge.js +31 -72
  439. package/.agents/scripts/lib/single-story/story-merged-notify.js +8 -49
  440. package/.agents/scripts/lib/single-story-sweep/protection-ctx.js +4 -26
  441. package/.agents/scripts/lib/single-story-sweep/protection.js +13 -100
  442. package/.agents/scripts/lib/single-story-sweep/sweep-lock.js +60 -258
  443. package/.agents/scripts/lib/single-story-sweep.js +14 -97
  444. package/.agents/scripts/lib/skills/parse-skill.js +13 -59
  445. package/.agents/scripts/lib/skills/skills-index.js +8 -29
  446. package/.agents/scripts/lib/skills/walk-skill-files.js +17 -78
  447. package/.agents/scripts/lib/source-extensions.js +11 -42
  448. package/.agents/scripts/lib/source-text/strip-js-comments.js +8 -41
  449. package/.agents/scripts/lib/stdio-flush.js +9 -36
  450. package/.agents/scripts/lib/story-adjacency.js +8 -40
  451. package/.agents/scripts/lib/story-body/body-format-lints.js +22 -83
  452. package/.agents/scripts/lib/story-body/footer-block.js +11 -44
  453. package/.agents/scripts/lib/story-body/story-body.js +83 -358
  454. package/.agents/scripts/lib/temp-retention.js +42 -143
  455. package/.agents/scripts/lib/templates/decomposer-prompts.js +11 -65
  456. package/.agents/scripts/lib/test-env.js +12 -65
  457. package/.agents/scripts/lib/test-run-credit.js +10 -65
  458. package/.agents/scripts/lib/test-runner-contract.js +19 -74
  459. package/.agents/scripts/lib/test-temp.js +38 -184
  460. package/.agents/scripts/lib/test-tiers.js +12 -96
  461. package/.agents/scripts/lib/ticket-body-sections.js +21 -96
  462. package/.agents/scripts/lib/transpile.js +15 -74
  463. package/.agents/scripts/lib/util/concurrent-map.js +6 -25
  464. package/.agents/scripts/lib/util/parse-id-list.js +8 -34
  465. package/.agents/scripts/lib/util/poll-loop.js +8 -28
  466. package/.agents/scripts/lib/util/with-timeout.js +2 -11
  467. package/.agents/scripts/lib/validation-evidence.js +21 -96
  468. package/.agents/scripts/lib/wave-runner/footprint.js +17 -70
  469. package/.agents/scripts/lib/wave-runner/live-probe.js +53 -221
  470. package/.agents/scripts/lib/wave-runner/ready-set.js +72 -301
  471. package/.agents/scripts/lib/workers/crap-worker.js +11 -64
  472. package/.agents/scripts/lib/workers/maintainability-report-worker.js +8 -45
  473. package/.agents/scripts/lib/workers/maintainability-worker.js +5 -21
  474. package/.agents/scripts/lib/workers/serve-worker-messages.js +2 -18
  475. package/.agents/scripts/lib/workflow-closure.js +22 -105
  476. package/.agents/scripts/lib/workspace-provisioner.js +16 -54
  477. package/.agents/scripts/lib/worktree/git-hooks.js +15 -60
  478. package/.agents/scripts/lib/worktree/lifecycle/force-drain.js +20 -60
  479. package/.agents/scripts/lib/worktree/lifecycle/merge-reachability.js +10 -62
  480. package/.agents/scripts/lib/worktree/lifecycle/pending-cleanup.js +22 -86
  481. package/.agents/scripts/lib/worktree/lifecycle/reap.js +24 -126
  482. package/.agents/scripts/lib/worktree/lifecycle-manager.js +2 -20
  483. package/.agents/scripts/lib/worktree/node-modules-strategy.js +46 -180
  484. package/.agents/scripts/lib/worktree-manager.js +15 -40
  485. package/.agents/scripts/lint-issue-body.js +12 -68
  486. package/.agents/scripts/mandrel-update-preflight.js +10 -70
  487. package/.agents/scripts/merge-baseline.js +30 -104
  488. package/.agents/scripts/nav-registry-diff.js +22 -108
  489. package/.agents/scripts/notify.js +12 -69
  490. package/.agents/scripts/plan-context.js +27 -111
  491. package/.agents/scripts/plan-critics.js +12 -66
  492. package/.agents/scripts/plan-persist.js +31 -148
  493. package/.agents/scripts/plan-run-epilogue.js +11 -37
  494. package/.agents/scripts/pr-watch-with-update.js +76 -267
  495. package/.agents/scripts/providers/github/auth.js +3 -8
  496. package/.agents/scripts/providers/github/blocked-by-add.js +14 -61
  497. package/.agents/scripts/providers/github/board-add.js +5 -21
  498. package/.agents/scripts/providers/github/branch-protection.js +11 -43
  499. package/.agents/scripts/providers/github/cache.js +2 -14
  500. package/.agents/scripts/providers/github/comments.js +7 -40
  501. package/.agents/scripts/providers/github/compose.js +3 -19
  502. package/.agents/scripts/providers/github/errors.js +22 -125
  503. package/.agents/scripts/providers/github/issues.js +31 -123
  504. package/.agents/scripts/providers/github/labels.js +24 -124
  505. package/.agents/scripts/providers/github/mappers.js +5 -27
  506. package/.agents/scripts/providers/github/merge-methods.js +3 -22
  507. package/.agents/scripts/providers/github/project-board.js +2 -17
  508. package/.agents/scripts/providers/github/projects-v2-graphql.js +3 -6
  509. package/.agents/scripts/providers/github/request-helpers.js +5 -32
  510. package/.agents/scripts/providers/github/search-budget.js +9 -39
  511. package/.agents/scripts/providers/github/search-query.js +5 -26
  512. package/.agents/scripts/providers/github/sub-issue-add.js +15 -65
  513. package/.agents/scripts/providers/github/sub-issues.js +7 -36
  514. package/.agents/scripts/providers/github/tickets.js +32 -134
  515. package/.agents/scripts/providers/github.js +18 -59
  516. package/.agents/scripts/prune-plan-run-labels.js +12 -46
  517. package/.agents/scripts/quality-preview.js +35 -220
  518. package/.agents/scripts/resolve-doc-tiers.js +3 -26
  519. package/.agents/scripts/resolve-stories.js +16 -67
  520. package/.agents/scripts/resync-status-column.js +6 -25
  521. package/.agents/scripts/run-tests.js +29 -104
  522. package/.agents/scripts/single-story-close.js +23 -135
  523. package/.agents/scripts/single-story-confirm-merge.js +32 -139
  524. package/.agents/scripts/single-story-init.js +47 -209
  525. package/.agents/scripts/stories-wave-tick.js +102 -472
  526. package/.agents/scripts/sync-agentrc.js +3 -21
  527. package/.agents/scripts/sync-claude-agents.js +9 -55
  528. package/.agents/scripts/sync-claude-commands.js +20 -110
  529. package/.agents/scripts/test-wrapper.js +6 -43
  530. package/.agents/scripts/update-coverage-baseline.js +5 -22
  531. package/.agents/scripts/update-crap-baseline.js +7 -30
  532. package/.agents/scripts/update-duplication-baseline.js +16 -92
  533. package/.agents/scripts/update-maintainability-baseline.js +8 -62
  534. package/.agents/scripts/update-ticket-state.js +1 -7
  535. package/.agents/scripts/validate-skills.js +6 -26
  536. package/.agents/templates/agent-protocol.md +2 -2
  537. package/.agents/templates/docs/audit-sweep-runbook.md +3 -4
  538. package/.agents/workflows/audit-accessibility.md +4 -7
  539. package/.agents/workflows/audit-adrs.md +3 -6
  540. package/.agents/workflows/audit-architecture.md +3 -11
  541. package/.agents/workflows/audit-baselines.md +6 -9
  542. package/.agents/workflows/audit-clean-code.md +8 -12
  543. package/.agents/workflows/audit-data-model.md +3 -7
  544. package/.agents/workflows/audit-dependencies.md +4 -7
  545. package/.agents/workflows/audit-devops.md +4 -8
  546. package/.agents/workflows/audit-documentation.md +1 -4
  547. package/.agents/workflows/audit-mobile.md +4 -7
  548. package/.agents/workflows/audit-navigability.md +3 -6
  549. package/.agents/workflows/audit-performance.md +2 -4
  550. package/.agents/workflows/audit-privacy.md +4 -7
  551. package/.agents/workflows/audit-quality.md +4 -7
  552. package/.agents/workflows/audit-security.md +4 -7
  553. package/.agents/workflows/audit-seo.md +4 -7
  554. package/.agents/workflows/audit-sre.md +4 -7
  555. package/.agents/workflows/audit-to-stories.md +17 -30
  556. package/.agents/workflows/audit-ux-ui.md +4 -7
  557. package/.agents/workflows/helpers/audit-lens-core.md +1 -1
  558. package/.agents/workflows/helpers/code-quality-guardrails.md +12 -15
  559. package/.agents/workflows/helpers/deliver-digest.md +6 -4
  560. package/.agents/workflows/helpers/deliver-reference.md +114 -188
  561. package/.agents/workflows/helpers/deliver-story-reference.md +189 -533
  562. package/.agents/workflows/helpers/plan-reference.md +86 -139
  563. package/.agents/workflows/helpers/qa-core.md +12 -0
  564. package/.agents/workflows/memory-consolidate.md +1 -1
  565. package/.agents/workflows/qa-assist.md +27 -71
  566. package/.agents/workflows/qa-explore.md +19 -59
  567. package/.agents/workflows/qa-run.md +11 -33
  568. package/README.md +1 -1
  569. package/bin/mandrel.js +5 -46
  570. package/bin/postinstall.js +18 -107
  571. package/docs/CHANGELOG.md +25 -0
  572. package/lib/cli/doctor.js +11 -71
  573. package/lib/cli/init.js +26 -165
  574. package/lib/cli/migrate.js +5 -64
  575. package/lib/cli/registry.js +84 -467
  576. package/lib/cli/sync-agents.js +4 -64
  577. package/lib/cli/sync-commands.js +11 -64
  578. package/lib/cli/sync.js +34 -213
  579. package/lib/cli/uninstall.js +40 -219
  580. package/lib/cli/update.js +105 -661
  581. package/lib/cli/version-check.js +8 -72
  582. package/lib/cli/version-helpers.js +14 -87
  583. package/lib/migrations/helpers/retire-agentrc-key.js +11 -52
  584. package/lib/migrations/index.js +15 -92
  585. package/lib/migrations/steps/2.1.0-retire-mi-drop-knobs.js +2 -15
  586. package/lib/migrations/steps/2.1.0-retire-verify-concurrency-cap.js +1 -13
  587. package/lib/migrations/steps/2.11.0-retire-max-seed-words.js +2 -15
  588. package/lib/migrations/steps/2.2.0-retire-epic-ac-tags.js +9 -38
  589. package/lib/migrations/steps/2.20.0-retire-codebase-snapshot.js +1 -13
  590. package/lib/migrations/steps/2.32.0-retire-lint-baseline-command.js +2 -27
  591. package/lib/migrations/steps/2.57.0-retire-delivery-limit-knobs.js +2 -23
  592. package/lib/migrations/steps/2.57.0-retire-planning-limit-knobs.js +2 -27
  593. package/lib/migrations/steps/2.60.0-retire-audit-results-autofile.js +2 -21
  594. package/lib/migrations/steps/strip-removed-agentrc-keys.js +333 -0
  595. package/package.json +16 -14
  596. package/.agents/docs/SDLC.md +0 -590
  597. package/.agents/docs/quality-gates.md +0 -1183
  598. package/.agents/rules/known-tooling-behavior.md +0 -200
  599. package/.agents/rules/orchestration-error-handling.md +0 -61
  600. package/.agents/rules/test-seams.md +0 -59
  601. package/.agents/schemas/baselines/lighthouse.schema.json +0 -59
  602. package/.agents/schemas/baselines/lint.schema.json +0 -47
  603. package/.agents/scripts/check-action-pinning.js +0 -260
  604. package/.agents/scripts/check-audit-attribution.js +0 -302
  605. package/.agents/scripts/check-baseline-drift.js +0 -211
  606. package/.agents/scripts/check-baseline-scope.js +0 -362
  607. package/.agents/scripts/check-generated-validator.js +0 -202
  608. package/.agents/scripts/check-knip-entries.js +0 -159
  609. package/.agents/scripts/check-lifecycle-lint.js +0 -294
  610. package/.agents/scripts/check-pinned-override-notes.js +0 -102
  611. package/.agents/scripts/check-schema-references.js +0 -368
  612. package/.agents/scripts/check-test-portability.js +0 -512
  613. package/.agents/scripts/check-workflow-citations.js +0 -218
  614. package/.agents/scripts/check-workflow-cli-lint.js +0 -299
  615. package/.agents/scripts/check-workflow-timeouts.js +0 -291
  616. package/.agents/scripts/install-matrix-assert.js +0 -326
  617. package/.agents/scripts/lib/audit-advisories.js +0 -195
  618. package/.agents/scripts/lib/audit-attribution.js +0 -134
  619. package/.agents/scripts/lib/baselines/drift-detector.js +0 -351
  620. package/.agents/scripts/lib/baselines/kinds/lighthouse.js +0 -87
  621. package/.agents/scripts/lib/baselines/kinds/lint.js +0 -184
  622. package/.agents/scripts/lib/baselines/orphan-pruner.js +0 -233
  623. package/.agents/scripts/lib/baselines/scope-assert.js +0 -223
  624. package/.agents/scripts/lib/baselines/scope-inventory.js +0 -314
  625. package/.agents/scripts/lib/c8-cli-path.js +0 -21
  626. package/.agents/scripts/lib/config/gates/lighthouse.schema.js +0 -51
  627. package/.agents/scripts/lib/config/gates/lint.schema.js +0 -18
  628. package/.agents/scripts/lib/dynamic-workflow/architecture-report-contract.js +0 -70
  629. package/.agents/scripts/lib/dynamic-workflow/audit-orchestrator.js +0 -284
  630. package/.agents/scripts/lib/dynamic-workflow/clean-code-report-contract.js +0 -80
  631. package/.agents/scripts/lib/dynamic-workflow/degraded-coverage.js +0 -81
  632. package/.agents/scripts/lib/dynamic-workflow/documentation-report-contract.js +0 -87
  633. package/.agents/scripts/lib/dynamic-workflow/performance-report-contract.js +0 -74
  634. package/.agents/scripts/lib/dynamic-workflow/quality-report-contract.js +0 -90
  635. package/.agents/scripts/lib/dynamic-workflow/report-contract-core.js +0 -43
  636. package/.agents/scripts/lib/dynamic-workflow/security-report-contract.js +0 -83
  637. package/.agents/scripts/lib/fs-walk.js +0 -52
  638. package/.agents/scripts/lib/knip-config-resolver.js +0 -181
  639. package/.agents/scripts/lib/knip-entry-sync.js +0 -452
  640. package/.agents/scripts/lib/pinned-override-notes.js +0 -88
  641. package/.agents/scripts/lib/pinned-override-resolve.js +0 -212
  642. package/.agents/scripts/lib/test-isolate/cli-options.js +0 -93
  643. package/.agents/scripts/lib/test-isolate/env-snapshot-loader.js +0 -52
  644. package/.agents/scripts/lib/test-isolate/list-files.js +0 -90
  645. package/.agents/scripts/lib/test-isolate/parse-tap.js +0 -75
  646. package/.agents/scripts/lib/test-isolate/progress-log.js +0 -45
  647. package/.agents/scripts/lib/test-isolate/render-report.js +0 -97
  648. package/.agents/scripts/lib/test-isolate/run-isolate.js +0 -87
  649. package/.agents/scripts/lib/test-isolate/runner.js +0 -483
  650. package/.agents/scripts/lib/test-profile/parse-tap.js +0 -136
  651. package/.agents/scripts/lib/test-profile/render-report.js +0 -45
  652. package/.agents/scripts/lint-label-vocabulary.js +0 -214
  653. package/.agents/scripts/post-structured-comment.js +0 -127
  654. package/.agents/scripts/provision-git-hooks.js +0 -85
  655. package/.agents/scripts/prune-baseline-orphans.js +0 -181
  656. package/.agents/scripts/run-coverage.js +0 -197
  657. package/.agents/scripts/run-lint.js +0 -133
  658. package/.agents/scripts/run-test-profile.js +0 -129
  659. package/.agents/scripts/run-verify.js +0 -125
  660. package/.agents/scripts/test-isolate.js +0 -55
  661. package/.agents/scripts/update-dead-exports-baseline.js +0 -321
@@ -1,76 +1,12 @@
1
1
  #!/usr/bin/env node
2
2
 
3
- // .agents/scripts/check-gherkin-corpus.js — static gate over a project's
4
- // Gherkin corpus: must-compile, then must-bind, scoped per step root.
5
- //
6
- // The framework ships the bddgen harness but nothing that inspects the corpus
7
- // it generates from. Two corpus-wide failures are invisible until generation
8
- // time, and both take the whole acceptance suite dark at once: a `.feature`
9
- // the parser rejects, and a step no definition claims. This gate catches both
10
- // offline, in the same `npm run lint` that already guards every other
11
- // framework-owned surface.
12
- //
13
- // Two contracts make the findings trustworthy rather than merely loud:
14
- //
15
- // must-compile parses with the REAL `@cucumber/gherkin` parser. A gate that
16
- // re-implements acceptance is the defect it is trying to prevent: a
17
- // hand-rolled line reader silently skips what it does not recognise, so a
18
- // corpus that cannot generate reads clean. Whatever bddgen accepts is what
19
- // this gate must accept, and the only way to guarantee that is to run the
20
- // same parser.
21
- //
22
- // A file failing must-compile is EXCLUDED from must-bind. A broken file
23
- // parses as an arbitrary subset of itself, so linting its surviving steps
24
- // invents unbound findings that bury the one actionable line — the syntax
25
- // error — under noise.
26
- //
27
- // The parser is an optional peer dependency (plus a framework devDependency),
28
- // resolved through a require path rooted at the consumer project rather than
29
- // imported by bare specifier. `.agents/` reaches a consumer by plain file
30
- // copy, so a bare specifier here would resolve against the consumer's own
31
- // module chain, which under a non-hoisting linker need not hold it at all.
32
- // This mirrors the `typescript` optional-peer precedent and keeps a consumer
33
- // with no BDD tier from gaining a runtime dependency.
34
- //
35
- // Exit codes:
36
- // 0 clean, or `qa.gherkinLint` is not configured
37
- // 1 a parse error, an unbound step, or a fail-closed condition
38
-
39
- // .agents/scripts/check-gherkin-corpus.js — static gate over a project's
40
- // Gherkin corpus: must-compile, then must-bind, scoped per step root.
41
- //
42
- // The framework ships the bddgen harness but nothing that inspects the corpus
43
- // it generates from. Two corpus-wide failures are invisible until generation
44
- // time, and both take the whole acceptance suite dark at once: a `.feature`
45
- // the parser rejects, and a step no definition claims. This gate catches both
46
- // offline, in the same `npm run lint` that already guards every other
47
- // framework-owned surface.
48
- //
49
- // Two contracts make the findings trustworthy rather than merely loud:
50
- //
51
- // must-compile parses with the REAL `@cucumber/gherkin` parser. A gate that
52
- // re-implements acceptance is the defect it is trying to prevent: a
53
- // hand-rolled line reader silently skips what it does not recognise, so a
54
- // corpus that cannot generate reads clean. Whatever bddgen accepts is what
55
- // this gate must accept, and the only way to guarantee that is to run the
56
- // same parser.
57
- //
58
- // A file failing must-compile is EXCLUDED from must-bind. A broken file
59
- // parses as an arbitrary subset of itself, so linting its surviving steps
60
- // invents unbound findings that bury the one actionable line — the syntax
61
- // error — under noise.
62
- //
63
- // The parser is an optional peer dependency (plus a framework devDependency),
64
- // resolved through a require path rooted at the consumer project rather than
65
- // imported by bare specifier. `.agents/` reaches a consumer by plain file
66
- // copy, so a bare specifier here would resolve against the consumer's own
67
- // module chain, which under a non-hoisting linker need not hold it at all.
68
- // This mirrors the `typescript` optional-peer precedent and keeps a consumer
69
- // with no BDD tier from gaining a runtime dependency.
70
- //
71
- // Exit codes:
72
- // 0 clean, or `qa.gherkinLint` is not configured
73
- // 1 a parse error, an unbound step, or a fail-closed condition
3
+ // Static gate over a Gherkin corpus: every in-scope `.feature` must compile
4
+ // with the REAL `@cucumber/gherkin` parser (a hand-rolled reader skips what it
5
+ // cannot parse and reads clean), then every active step must bind under its own
6
+ // scope. A file failing to compile is excluded from must-bind: it parses as an
7
+ // arbitrary subset and would bury the syntax error under invented findings.
8
+ // The parser is an optional peer resolved from the consumer root, since
9
+ // `.agents/` is a plain file copy and a bare specifier need not resolve there.
74
10
 
75
11
  import fs, { readFileSync } from 'node:fs';
76
12
  import { createRequire } from 'node:module';
@@ -104,8 +40,6 @@ const HELP = {
104
40
  };
105
41
 
106
42
  /**
107
- * Parse argv into an options bag.
108
- *
109
43
  * @param {string[]} argv
110
44
  * @returns {{ cwd: string | null }}
111
45
  */
@@ -124,12 +58,10 @@ export function parseArgs(argv = []) {
124
58
  }
125
59
 
126
60
  /**
127
- * Resolve `@cucumber/gherkin` through a require path anchored at the project
128
- * being checked, falling back to the framework's own installation.
129
- *
61
+ * Resolves from the checked project first, then the framework's own install.
130
62
  * @param {{ cwd: string }} params
131
63
  * @returns {Promise<{ parse: (source: string) => object }>}
132
- * @throws {Error} when the package cannot be resolved from either anchor
64
+ * @throws {Error}
133
65
  */
134
66
  export async function loadGherkinParser({ cwd }) {
135
67
  const anchors = [
@@ -142,7 +74,7 @@ export async function loadGherkinParser({ cwd }) {
142
74
  resolved = anchor.resolve(PARSER_PACKAGE);
143
75
  break;
144
76
  } catch {
145
- // Try the next anchor; the aggregate failure is reported by the caller.
77
+ // Next anchor; the caller reports the aggregate failure.
146
78
  }
147
79
  }
148
80
  if (!resolved) {
@@ -155,8 +87,7 @@ export async function loadGherkinParser({ cwd }) {
155
87
  );
156
88
  return {
157
89
  parse(source) {
158
- // The id counter is supplied locally so `@cucumber/messages`
159
- // (`IdGenerator.uuid`) is not a second import to resolve.
90
+ // Local id counter, so `@cucumber/messages` is not a second import.
160
91
  let seq = 0;
161
92
  const nextId = () => {
162
93
  seq += 1;
@@ -172,10 +103,8 @@ export async function loadGherkinParser({ cwd }) {
172
103
  }
173
104
 
174
105
  /**
175
- * Normalize a parser exception into one finding per reported position.
176
- *
177
106
  * @param {unknown} error
178
- * @param {string} file repo-relative path
107
+ * @param {string} file
179
108
  * @returns {Array<{ kind: 'parse-error', file: string, line: number, column: number, message: string }>}
180
109
  */
181
110
  export function toParseFindings(error, file) {
@@ -189,15 +118,11 @@ export function toParseFindings(error, file) {
189
118
  }));
190
119
  }
191
120
 
192
- /** Tag names carried by an AST node, as a plain string array. */
193
121
  function tagNames(node) {
194
122
  return (node?.tags ?? []).map((tag) => tag.name);
195
123
  }
196
124
 
197
125
  /**
198
- * Expand one step's text against an Examples table. A step with no `<param>`
199
- * placeholder yields itself; an outline step yields one variant per row.
200
- *
201
126
  * @param {string} text
202
127
  * @param {Array<{ tableHeader?: object, tableBody?: object[] }>} examples
203
128
  * @returns {string[]}
@@ -220,14 +145,9 @@ export function expandStepText(text, examples) {
220
145
  }
221
146
 
222
147
  /**
223
- * Flatten a compiled feature into the steps must-bind is responsible for.
224
- *
225
- * Background steps run for every scenario in their container, so they are
226
- * checked once — but only when the container still holds a non-exempt
227
- * scenario, otherwise exempting every scenario in a file would leave its
228
- * background as the sole remaining source of findings.
229
- *
230
- * @param {object} feature the `document.feature` node
148
+ * Background steps are checked once, and only while their container still
149
+ * holds a non-exempt scenario.
150
+ * @param {object} feature
231
151
  * @param {string[]} exemptionTags
232
152
  * @returns {Array<{ line: number, text: string, examples: object[] }>}
233
153
  */
@@ -236,9 +156,7 @@ export function collectActiveSteps(feature, exemptionTags) {
236
156
  const featureTags = tagNames(feature);
237
157
  const steps = [];
238
158
 
239
- // A background step is reachable from more than one container once Rules are
240
- // in play, so emitting is keyed on the step's own line to check it exactly
241
- // once per feature rather than once per container that inherits it.
159
+ // Keyed by line: under Rules one background is inherited by many containers.
242
160
  const emittedBackgroundLines = new Set();
243
161
  const pushBackgroundSteps = (backgrounds) => {
244
162
  for (const background of backgrounds) {
@@ -257,11 +175,8 @@ export function collectActiveSteps(feature, exemptionTags) {
257
175
  if (child.background) backgrounds.push(child.background);
258
176
  if (child.scenario) scenarios.push(child.scenario);
259
177
  }
260
- // Gherkin runs a feature-level Background for every scenario in the
261
- // feature, Rule-nested ones included, so the rule walk inherits the
262
- // backgrounds collected above. Recursing before the no-active-scenarios
263
- // return is what lets a feature whose scenarios all live under Rules still
264
- // have its Background checked.
178
+ // Recurse before the no-active-scenarios return, so a feature whose
179
+ // scenarios all live under Rules still has its Background checked.
265
180
  for (const child of container?.children ?? []) {
266
181
  if (!child.rule) continue;
267
182
  walkContainer(
@@ -294,13 +209,8 @@ export function collectActiveSteps(feature, exemptionTags) {
294
209
  }
295
210
 
296
211
  /**
297
- * Score one feature file's active steps against a scope's step index.
298
- *
299
- * A step counts as bound when **any** of its Examples expansions matches. The
300
- * conservative direction is deliberate: a partially-binding outline step is
301
- * almost always a parameter-type mismatch in the index, and reporting it would
302
- * spend the operator's attention on the heuristic rather than on the corpus.
303
- *
212
+ * Bound when ANY Examples expansion matches: a partial bind is almost always
213
+ * an index parameter-type mismatch, not a corpus defect.
304
214
  * @returns {Array<{ kind: 'unbound', file: string, line: number, text: string, scope: string }>}
305
215
  */
306
216
  function bindFindings({ feature, file, scope, index, exemptionTags, waivers }) {
@@ -325,8 +235,6 @@ function bindFindings({ feature, file, scope, index, exemptionTags, waivers }) {
325
235
  }
326
236
 
327
237
  /**
328
- * Run must-compile then must-bind across one scope.
329
- *
330
238
  * @returns {{ findings: object[], featureCount: number, stepDefinitionCount: number }}
331
239
  */
332
240
  export function scanScope({
@@ -354,8 +262,6 @@ export function scanScope({
354
262
  readFile ? readFile(absolute) : readFileSync(absolute, 'utf8'),
355
263
  );
356
264
  } catch (error) {
357
- // Excluded from must-bind: a broken file parses as an arbitrary subset
358
- // of itself, and its invented findings would bury this one.
359
265
  findings.push(...toParseFindings(error, file));
360
266
  continue;
361
267
  }
@@ -380,16 +286,11 @@ export function scanScope({
380
286
  }
381
287
 
382
288
  /**
383
- * The featureRoots half of the blackout contract the stepRoots check already
384
- * covers on the definitions side. A renamed or typo'd root resolves zero
385
- * features, and "nothing to check" would then report green over a corpus
386
- * nobody is checking. A root that exists but holds no `.feature` file yet is
387
- * the legitimate not-written-them-yet case and stays passing — absence of the
388
- * directory is what separates misconfiguration from an empty corpus.
389
- *
289
+ * A missing featureRoot is a blackout (green over an unchecked corpus); an
290
+ * existing but empty one is a legitimate not-yet-written corpus.
390
291
  * @param {Array<{ name: string, featureRoots: string[] }>} scopes
391
292
  * @param {string} root
392
- * @returns {string | null} the operator-facing message, or null when clean
293
+ * @returns {string | null}
393
294
  */
394
295
  function findMissingFeatureRoots(scopes, root) {
395
296
  for (const scope of scopes) {
@@ -406,7 +307,6 @@ function findMissingFeatureRoots(scopes, root) {
406
307
  return null;
407
308
  }
408
309
 
409
- /** Render one finding as a single operator-readable line. */
410
310
  export function renderFinding(finding) {
411
311
  if (finding.kind === 'parse-error') {
412
312
  return `${TAG} parse-error ${finding.file}:${finding.line}:${finding.column} ${finding.message}`;
@@ -415,10 +315,7 @@ export function renderFinding(finding) {
415
315
  }
416
316
 
417
317
  /**
418
- * CLI body. Exported so the suite can drive the whole pipeline against fixture
419
- * projects, including the unresolvable-parser path via `loadParser`.
420
- *
421
- * @returns {Promise<number>} process exit code
318
+ * @returns {Promise<number>}
422
319
  */
423
320
  export async function runCli({
424
321
  argv = process.argv.slice(2),
@@ -1,68 +1,12 @@
1
1
  #!/usr/bin/env node
2
2
 
3
3
  /**
4
- * Test-temp hygiene guard (Story #4696).
5
- *
6
- * The friction / lifecycle / trace NDJSON streams under `temp/` are the
7
- * substrate every retro, rollup, and loop-health consumer reads. When the
8
- * test suite appends fixture records to the *real* `temp/` tree (the #4555
9
- * defect class, re-surfaced for the signal writers), those consumers read
10
- * noise: at the time this guard shipped, 99% of friction records were
11
- * test-fixture pollution.
12
- *
13
- * The writer-layer fix (`lib/config/temp-paths.js` scratch seam +
14
- * `lib/test-env.js` bootstrap) redirects stray test writes into an absolute
15
- * per-process scratch dir. This script is the regression guard that keeps
16
- * the fix honest, plus a local cleanup mode for the accumulated noise:
17
- *
18
- * The guard covers two distinct temp roots, and conflating them is how the
19
- * second one went unmeasured for so long:
20
- *
21
- * 1. The repo's own `temp/` telemetry tree — the original dimension above.
22
- * 2. The **OS temp root** (Story #4808). The redirect in (1) sends stray
23
- * writes into `os.tmpdir()` scratch dirs, and nothing ever reaped them:
24
- * the remedy for (1) became the largest single leaker into (2). Since
25
- * the damaging axis there is entry *count*, the suite now nests every
26
- * managed dir inside one per-process `mandrel-suite-*` root
27
- * (`lib/test-temp.js`) and reaps it, and this guard asserts that no
28
- * such root survives a run.
29
- *
30
- * --snapshot Record a fingerprint (size + sha256) of every stream
31
- * file under `temp/`, plus the `mandrel-suite-*` roots
32
- * already present in the OS temp root, to the snapshot
33
- * baseline. Run this before the suite.
34
- * --assert Re-scan and fail if any stream file was added or grew
35
- * relative to the snapshot, or if a suite root appeared
36
- * and survived. Run this after the suite. A missing
37
- * snapshot is a hard failure ("snapshot missing
38
- * — guard cannot attest"), never a silent re-baseline:
39
- * the baseline lives *outside* the protected `temp/`
40
- * tree (Story #4711), so a test wiping `temp/` can no
41
- * longer destroy the baseline and fail the guard open.
42
- * Recording pre-existing suite roots (rather than
43
- * asserting an empty set) is what keeps a concurrent
44
- * suite in another checkout from failing this one.
45
- * --lint-globs <g> Comma-separated repo-relative globs to scan for test
46
- * files that call `mkdtemp` against `os.tmpdir()`
47
- * directly instead of going through `makeTempDir`.
48
- * **Off unless passed**: this script ships in the
49
- * materialized `.agents/` payload and a consumer's
50
- * tests are none of this rule's business. A line (or
51
- * the line above it) carrying `test-temp-allow` opts
52
- * out.
53
- * --baseline <path> Explicit snapshot-baseline path (CI sets this to a
54
- * runner-temp path). Defaults to an OS scratch location
55
- * keyed by the resolved repo root. Refused when it
56
- * resolves inside the protected `temp/` tree.
57
- * --clean List stream directories whose Epic/Story id matches a
58
- * known fixture id (report-only; nothing is deleted).
59
- * --clean --yes Delete those directories.
60
- * --ids 1,2,3 Override the fixture-id list for --clean.
61
- * --root <dir> Operate against <dir> instead of the repo root
62
- * (its `temp/` subtree). Used by tests.
63
- *
64
- * Exit codes: 1 on an --assert failure (a new / grown stream file, or a
65
- * missing snapshot baseline); 0 otherwise.
4
+ * Test-temp hygiene guard: fails when the suite pollutes the repo `temp/`
5
+ * telemetry streams (which every retro reads) or leaves a `mandrel-suite-*`
6
+ * root behind in the OS temp root. Pre-existing suite roots are recorded at
7
+ * snapshot time so a concurrent suite in another checkout cannot fail this
8
+ * one. `--lint-globs` is off by default because this script ships in the
9
+ * consumer payload and a consumer's tests are not its business.
66
10
  */
67
11
 
68
12
  import { createHash } from 'node:crypto';
@@ -93,17 +37,12 @@ import {
93
37
  const __dirname = path.dirname(fileURLToPath(import.meta.url));
94
38
  const REPO_ROOT = path.resolve(__dirname, '..', '..');
95
39
 
96
- /**
97
- * Known fixture Epic/Story ids observed polluting the real `temp/` tree
98
- * (Story #4696). `--clean` targets only these by default so real scratch
99
- * (a genuine `run-<id>` from a live delivery) is never swept.
100
- */
40
+ /** Fixture ids `--clean` targets by default, so real `run-<id>` scratch is never swept. */
101
41
  export const KNOWN_FIXTURE_STORY_IDS = Object.freeze([
102
42
  4428, 10, 4242, 5, 42, 100, 555, 2839, 4257, 4258, 4259,
103
43
  ]);
104
44
 
105
45
  /**
106
- * Resolve the `temp/` directory for a given repo root.
107
46
  * @param {string} repoRoot
108
47
  * @returns {string}
109
48
  */
@@ -112,14 +51,9 @@ export function tempDirFor(repoRoot) {
112
51
  }
113
52
 
114
53
  /**
115
- * Default snapshot-baseline path for a repo root — deliberately *outside*
116
- * the protected `temp/` tree (Story #4711). The pre-#4711 baseline lived at
117
- * `temp/.test-temp-hygiene-snapshot.json`, inside the very tree the guard
118
- * protects: a test (or cleanup) that wiped `temp/` destroyed the baseline
119
- * and the post-test `--assert` silently re-baselined the pollution. The
120
- * default now lives under the OS scratch dir, keyed by the resolved repo
121
- * root so parallel checkouts / worktrees never collide.
122
- *
54
+ * Snapshot path outside the protected `temp/` tree (a test wiping `temp/`
55
+ * must not destroy the attestation), keyed by repo root so worktrees never
56
+ * collide.
123
57
  * @param {string} repoRoot
124
58
  * @returns {string}
125
59
  */
@@ -136,10 +70,7 @@ export function defaultBaselinePath(repoRoot) {
136
70
  }
137
71
 
138
72
  /**
139
- * Refuse a baseline path that resolves inside the protected `temp/` tree —
140
- * storing the attestation inside the tree it attests recreates the
141
- * fail-open gap this Story closes.
142
- *
73
+ * Refuse a baseline inside `temp/`: attesting from inside the tree fails open.
143
74
  * @param {string} repoRoot
144
75
  * @param {string} baselinePath
145
76
  * @returns {string} the resolved baseline path
@@ -156,10 +87,7 @@ function checkedBaselinePath(repoRoot, baselinePath) {
156
87
  }
157
88
 
158
89
  /**
159
- * Is `rel` (a path relative to `temp/`, POSIX-normalised) a telemetry stream
160
- * file we guard? Stream files are `*.ndjson` living under a `run-<id>/`
161
- * subtree or the `standalone/stories/` subtree.
162
- *
90
+ * Stream files are `*.ndjson` under `run-<id>/` or `standalone/stories/`.
163
91
  * @param {string} rel
164
92
  * @returns {boolean}
165
93
  */
@@ -171,9 +99,6 @@ export function isStreamFile(rel) {
171
99
  }
172
100
 
173
101
  /**
174
- * Recursively list every stream file under `tempDir`, returned as
175
- * POSIX-normalised paths relative to `tempDir`, sorted for determinism.
176
- *
177
102
  * @param {string} tempDir
178
103
  * @returns {string[]}
179
104
  */
@@ -197,7 +122,6 @@ export function listStreamFiles(tempDir) {
197
122
  }
198
123
 
199
124
  /**
200
- * Fingerprint a single file by byte length + sha256 of its contents.
201
125
  * @param {string} absPath
202
126
  * @returns {{ size: number, sha256: string }}
203
127
  */
@@ -210,8 +134,6 @@ export function fingerprintFile(absPath) {
210
134
  }
211
135
 
212
136
  /**
213
- * Build a `{ [relPath]: fingerprint }` manifest of every stream file under
214
- * `tempDir`.
215
137
  * @param {string} tempDir
216
138
  * @returns {Record<string, { size: number, sha256: string }>}
217
139
  */
@@ -225,11 +147,9 @@ export function buildManifest(tempDir) {
225
147
  }
226
148
 
227
149
  /**
228
- * Persist the current manifest to the baseline path (default: the external
229
- * `defaultBaselinePath` — never inside `temp/`).
230
150
  * @param {string} repoRoot
231
151
  * @param {string} [baselinePath]
232
- * @param {{ tmpDir?: string }} [deps] Injectable OS temp root for tests.
152
+ * @param {{ tmpDir?: string }} [deps]
233
153
  * @returns {{ snapshotPath: string, count: number, suiteRoots: number }}
234
154
  */
235
155
  export function writeSnapshot(repoRoot, baselinePath, { tmpDir } = {}) {
@@ -239,9 +159,7 @@ export function writeSnapshot(repoRoot, baselinePath, { tmpDir } = {}) {
239
159
  );
240
160
  const manifest = buildManifest(tempDirFor(repoRoot));
241
161
  const count = Object.keys(manifest).length;
242
- // Reserved key: stream entries are always `*.ndjson` relative paths, so
243
- // this cannot shadow one, and `diffAgainstSnapshot` only ever looks up
244
- // keys derived from the tree it just walked.
162
+ // Cannot shadow a stream entry: those are always `*.ndjson` paths.
245
163
  manifest[SUITE_ROOTS_KEY] = listSuiteTempRoots(tmpDir ?? os.tmpdir());
246
164
  mkdirSync(path.dirname(snapshotPath), { recursive: true });
247
165
  writeFileSync(snapshotPath, `${JSON.stringify(manifest, null, 2)}\n`, 'utf8');
@@ -253,7 +171,6 @@ export function writeSnapshot(repoRoot, baselinePath, { tmpDir } = {}) {
253
171
  }
254
172
 
255
173
  /**
256
- * Load the persisted manifest, or `null` when no snapshot exists.
257
174
  * @param {string} repoRoot
258
175
  * @param {string} [baselinePath]
259
176
  * @returns {Record<string, { size: number, sha256: string }> | null}
@@ -268,14 +185,7 @@ export function readSnapshot(repoRoot, baselinePath) {
268
185
  }
269
186
 
270
187
  /**
271
- * Diff the current stream tree against a snapshot manifest.
272
- *
273
- * `added` — stream files present now but absent from the snapshot.
274
- * `changed` — stream files whose size or sha256 differs from the snapshot
275
- * (i.e. a test grew or rewrote an existing stream).
276
- *
277
- * A file that shrank or vanished is not a pollution signal, so it is ignored.
278
- *
188
+ * A stream that vanished is not a pollution signal, so it is ignored.
279
189
  * @param {string} tempDir
280
190
  * @param {Record<string, { size: number, sha256: string }>} snapshot
281
191
  * @returns {{ added: string[], changed: string[] }}
@@ -296,12 +206,6 @@ export function diffAgainstSnapshot(tempDir, snapshot) {
296
206
  }
297
207
 
298
208
  /**
299
- * Extract the fixture-matching id from a top-level `temp/` entry name, or
300
- * `null` when the entry is not an id-keyed stream directory.
301
- *
302
- * `run-<id>` maps to `<id>`; the `standalone/stories/story-<id>` shape is
303
- * handled by the caller (it recurses one level deeper).
304
- *
305
209
  * @param {string} name
306
210
  * @returns {number|null}
307
211
  */
@@ -311,11 +215,6 @@ function runDirId(name) {
311
215
  }
312
216
 
313
217
  /**
314
- * Locate stream directories whose Epic/Story id is in `ids`.
315
- *
316
- * Two shapes are swept: `temp/run-<id>/` (Epic-scoped) and
317
- * `temp/standalone/stories/story-<id>/` (standalone Story-scoped).
318
- *
319
218
  * @param {string} tempDir
320
219
  * @param {ReadonlySet<number>} ids
321
220
  * @returns {{ id: number, kind: 'run' | 'standalone-story', rel: string }[]}
@@ -349,12 +248,10 @@ export function findFixtureDirs(tempDir, ids) {
349
248
  }
350
249
 
351
250
  /**
352
- * Report (and optionally delete) fixture-id stream directories.
353
- *
354
251
  * @param {object} opts
355
252
  * @param {string} opts.repoRoot
356
253
  * @param {Iterable<number>} [opts.ids]
357
- * @param {boolean} [opts.apply=false] delete when true; report-only otherwise.
254
+ * @param {boolean} [opts.apply=false]
358
255
  * @returns {{ candidates: { id: number, kind: string, rel: string }[], removed: string[] }}
359
256
  */
360
257
  export function cleanFixtureDirs({
@@ -375,14 +272,9 @@ export function cleanFixtureDirs({
375
272
  }
376
273
 
377
274
  /**
378
- * Every Epic / Story id a stream file's own path attributes it to.
379
- *
380
- * Both canonical layouts are read, and a nested Epic-attached stream yields
381
- * both ids (`run-<eid>/stories/story-<sid>/…`): either half being a fixture id
382
- * makes the stream fixture-owned, and taking only the outer one is how a
383
- * fixture Story under a real run would slip past.
384
- *
385
- * @param {string} rel POSIX-normalised path relative to `temp/`.
275
+ * A nested `run-<eid>/…/story-<sid>/` stream yields both ids, so a fixture
276
+ * Story under a real run cannot slip past.
277
+ * @param {string} rel
386
278
  * @returns {number[]}
387
279
  */
388
280
  function streamOwnerIds(rel) {
@@ -395,21 +287,10 @@ function streamOwnerIds(rel) {
395
287
  }
396
288
 
397
289
  /**
398
- * Stream files under `tempDir` owned by a **reserved test-fixture id**
399
- * (Story #4892).
400
- *
401
- * This is the residual-pollution dimension the snapshot/assert bracket cannot
402
- * cover: the bracket only runs in CI, where `temp/` starts empty, so a local
403
- * run that appends fixture telemetry to the operator's live ledger was only
404
- * ever discovered from the ticket the retro graduator filed off it (issue
405
- * #4870 cited `#999999`, a `--story 999999` CLI spawn from the suite).
406
- *
407
- * Unlike the snapshot diff this needs no baseline and is immune to a
408
- * concurrent delivery in another checkout: a reserved id is reserved *from*
409
- * real work, so nothing but a test can own one of these files.
410
- *
290
+ * Streams owned by a reserved test-fixture id. Covers local runs the CI-only
291
+ * snapshot bracket cannot, and needs no baseline: only a test can own one.
411
292
  * @param {string} tempDir
412
- * @returns {string[]} POSIX-normalised paths relative to `tempDir`, sorted.
293
+ * @returns {string[]}
413
294
  */
414
295
  export function findReservedIdStreamFiles(tempDir) {
415
296
  return listStreamFiles(tempDir).filter((rel) =>
@@ -418,20 +299,13 @@ export function findReservedIdStreamFiles(tempDir) {
418
299
  }
419
300
 
420
301
  /**
421
- * Post-run guard: fail when a test run left a fixture-id telemetry stream in
422
- * the **repository-root** temp tree (Story #4892).
423
- *
424
- * Resolution matters more than it looks: every writer anchors a relative
425
- * `tempRoot` to the *main checkout* (so a Story worktree and its `/mandrel-deliver`
426
- * host converge on one ledger), so a guard that scanned `cwd` would scan an
427
- * empty worktree tree and pass vacuously on the very tree it is meant to
428
- * protect. `resolveRoot` is the injection seam for tests.
429
- *
302
+ * Scans the main checkout's temp tree, not `cwd`: writers anchor relative
303
+ * `tempRoot` there, so scanning a worktree would pass vacuously.
430
304
  * @param {object} [opts]
431
305
  * @param {string} [opts.cwd=process.cwd()]
432
306
  * @param {(line: string) => void} [opts.log]
433
307
  * @param {(cwd: string) => string|null} [opts.resolveRoot]
434
- * @returns {number} exit code (0 clean, 1 polluted).
308
+ * @returns {number}
435
309
  */
436
310
  export function assertNoReservedIdStreams({
437
311
  cwd = process.cwd(),
@@ -453,7 +327,6 @@ export function assertNoReservedIdStreams({
453
327
  }
454
328
 
455
329
  /**
456
- * Parse the CLI argv into a normalised options object.
457
330
  * @param {string[]} argv
458
331
  * @returns {{ mode: 'snapshot'|'assert'|'clean', apply: boolean, ids: number[]|null, repoRoot: string, baseline: string|null, lintGlobs: string[] }}
459
332
  */
@@ -494,13 +367,9 @@ export function parseArgv(argv) {
494
367
  }
495
368
 
496
369
  /**
497
- * Execute the guard for a parsed options object. Returns the process exit
498
- * code (0 = clean / snapshot recorded; 1 = pollution detected under
499
- * --assert). Printing is done via the injectable `log`.
500
- *
501
370
  * @param {ReturnType<typeof parseArgv>} opts
502
371
  * @param {(line: string) => void} [log]
503
- * @param {{ tmpDir?: string }} [deps] Injectable OS temp root for tests.
372
+ * @param {{ tmpDir?: string }} [deps]
504
373
  * @returns {number}
505
374
  */
506
375
  export function runHygiene(
@@ -549,9 +418,7 @@ export function runHygiene(
549
418
  );
550
419
  return 1;
551
420
  }
552
- // Every dimension runs and reports; a failure in one must not hide a
553
- // failure in another, so the exit code is the max rather than an
554
- // early return.
421
+ // Run every dimension so one failure cannot hide another.
555
422
  const codes = [
556
423
  assertStreamTree(repoRoot, snapshot, log),
557
424
  assertNoSurvivingSuiteRoots(snapshot, log, tmpDir),
@@ -561,8 +428,6 @@ export function runHygiene(
561
428
  }
562
429
 
563
430
  /**
564
- * Dimension 1 — the repo's own `temp/` telemetry tree (Story #4696).
565
- *
566
431
  * @param {string} repoRoot
567
432
  * @param {Record<string, unknown>} snapshot
568
433
  * @param {(line: string) => void} log
@@ -589,10 +454,7 @@ function assertStreamTree(repoRoot, snapshot, log) {
589
454
  }
590
455
 
591
456
  /**
592
- * Dimension 2 — the OS temp root (Story #4808). Fails when a suite root
593
- * appeared since the snapshot and is still on disk, which means the run
594
- * created it and never reaped it.
595
- *
457
+ * A suite root that appeared since the snapshot and survived was never reaped.
596
458
  * @param {Record<string, unknown>} snapshot
597
459
  * @param {(line: string) => void} log
598
460
  * @param {string} tmpDir
@@ -618,9 +480,6 @@ function assertNoSurvivingSuiteRoots(snapshot, log, tmpDir) {
618
480
  }
619
481
 
620
482
  /**
621
- * Dimension 3 — the static backstop (Story #4808). Skipped, and reported
622
- * as skipped, unless the caller passed `--lint-globs`.
623
- *
624
483
  * @param {string} repoRoot
625
484
  * @param {string[]} globs
626
485
  * @param {(line: string) => void} log