mandrel 2.59.0 → 2.61.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (678) hide show
  1. package/.agents/README.md +21 -19
  2. package/.agents/agents/acceptance-critic.md +24 -43
  3. package/.agents/agents/story-worker.md +20 -21
  4. package/.agents/docs/agentrc-reference.json +5 -84
  5. package/.agents/docs/configuration.md +48 -132
  6. package/.agents/docs/workflows.md +2 -2
  7. package/.agents/instructions.md +5 -8
  8. package/.agents/rules/ci-remediation.md +41 -8
  9. package/.agents/rules/gherkin-standards.md +4 -0
  10. package/.agents/schemas/acceptance-eval-verdict.schema.json +1 -1
  11. package/.agents/schemas/agentrc.schema.json +16 -496
  12. package/.agents/schemas/story-deliver-terminal.schema.json +13 -3
  13. package/.agents/schemas/validation-evidence.schema.json +2 -1
  14. package/.agents/scripts/README.md +23 -13
  15. package/.agents/scripts/acceptance-eval.js +35 -169
  16. package/.agents/scripts/agents-bootstrap-github.js +27 -129
  17. package/.agents/scripts/apply-quality-bootstrap.js +4 -40
  18. package/.agents/scripts/audit-baselines.js +6 -27
  19. package/.agents/scripts/audit-labels-bootstrap.js +5 -29
  20. package/.agents/scripts/audit-to-stories.js +91 -361
  21. package/.agents/scripts/boot-sweep.js +19 -72
  22. package/.agents/scripts/bootstrap.js +74 -395
  23. package/.agents/scripts/ceremony-derive.js +10 -41
  24. package/.agents/scripts/check-arch-cycles.js +14 -64
  25. package/.agents/scripts/check-baselines.js +8 -48
  26. package/.agents/scripts/check-context-budget.js +105 -311
  27. package/.agents/scripts/check-cyclomatic.js +12 -44
  28. package/.agents/scripts/check-dead-exports.js +13 -64
  29. package/.agents/scripts/check-doc-links.js +38 -186
  30. package/.agents/scripts/check-gherkin-corpus.js +24 -127
  31. package/.agents/scripts/check-test-temp-hygiene.js +28 -169
  32. package/.agents/scripts/coverage-capture.js +34 -98
  33. package/.agents/scripts/deliver-light.js +25 -171
  34. package/.agents/scripts/deliver-recover.js +6 -42
  35. package/.agents/scripts/deliver-run.js +534 -0
  36. package/.agents/scripts/diagnose-friction.js +24 -116
  37. package/.agents/scripts/drain-pending-cleanup.js +1 -1
  38. package/.agents/scripts/evidence-gate.js +23 -85
  39. package/.agents/scripts/file-ci-gap.js +57 -49
  40. package/.agents/scripts/generate-config-docs.js +30 -170
  41. package/.agents/scripts/generate-lens-checklists.js +8 -52
  42. package/.agents/scripts/generate-skills-index.js +14 -112
  43. package/.agents/scripts/generate-workflows-doc.js +10 -70
  44. package/.agents/scripts/git-cleanup.js +2 -34
  45. package/.agents/scripts/lib/Graph.js +24 -81
  46. package/.agents/scripts/lib/ITicketingProvider.js +47 -143
  47. package/.agents/scripts/lib/Logger.js +14 -76
  48. package/.agents/scripts/lib/audit-baselines/engine.js +11 -31
  49. package/.agents/scripts/lib/audit-baselines/gate-surface.js +3 -17
  50. package/.agents/scripts/lib/audit-baselines/headroom.js +4 -20
  51. package/.agents/scripts/lib/audit-baselines/hotspots.js +3 -15
  52. package/.agents/scripts/lib/audit-baselines/kinds.js +23 -89
  53. package/.agents/scripts/lib/audit-baselines/outliers.js +6 -23
  54. package/.agents/scripts/lib/audit-baselines/read.js +3 -16
  55. package/.agents/scripts/lib/audit-baselines/staleness.js +7 -26
  56. package/.agents/scripts/lib/audit-baselines/surface-entry.js +7 -28
  57. package/.agents/scripts/lib/audit-baselines/trend.js +7 -20
  58. package/.agents/scripts/lib/audit-baselines/weights.js +9 -37
  59. package/.agents/scripts/lib/audit-suite/audit-rules-reader.js +3 -18
  60. package/.agents/scripts/lib/audit-suite/checklist-threading.js +26 -124
  61. package/.agents/scripts/lib/audit-suite/dispatch-checklist.js +14 -45
  62. package/.agents/scripts/lib/audit-suite/findings.js +12 -52
  63. package/.agents/scripts/lib/audit-suite/frontmatter.js +5 -29
  64. package/.agents/scripts/lib/audit-suite/index.js +1 -15
  65. package/.agents/scripts/lib/audit-suite/lens-checklist.js +10 -45
  66. package/.agents/scripts/lib/audit-suite/lens-diff-floor.js +11 -76
  67. package/.agents/scripts/lib/audit-suite/runner.js +13 -43
  68. package/.agents/scripts/lib/audit-suite/selector.js +49 -349
  69. package/.agents/scripts/lib/audit-suite/substitutions.js +12 -40
  70. package/.agents/scripts/lib/audit-suite/workflow-loader.js +3 -15
  71. package/.agents/scripts/lib/audit-to-stories/audit-label-taxonomy.js +11 -73
  72. package/.agents/scripts/lib/audit-to-stories/audit-lenses.js +8 -37
  73. package/.agents/scripts/lib/audit-to-stories/build-story-body.js +25 -143
  74. package/.agents/scripts/lib/audit-to-stories/dedupe-against-github.js +14 -80
  75. package/.agents/scripts/lib/audit-to-stories/epic-grouping-directive.js +4 -18
  76. package/.agents/scripts/lib/audit-to-stories/finding-adapter.js +7 -40
  77. package/.agents/scripts/lib/audit-to-stories/group-findings.js +9 -39
  78. package/.agents/scripts/lib/audit-to-stories/issue-corpus.js +10 -66
  79. package/.agents/scripts/lib/audit-to-stories/issue-index.js +6 -30
  80. package/.agents/scripts/lib/audit-to-stories/issues-file.js +6 -36
  81. package/.agents/scripts/lib/audit-to-stories/ledger-commit.js +17 -69
  82. package/.agents/scripts/lib/audit-to-stories/ledger-pr.js +17 -85
  83. package/.agents/scripts/lib/audit-to-stories/ledger-record.js +10 -48
  84. package/.agents/scripts/lib/audit-to-stories/parse-audit-md.js +38 -146
  85. package/.agents/scripts/lib/audit-to-stories/seed-from-findings.js +7 -42
  86. package/.agents/scripts/lib/audit-to-stories/wire-dependencies.js +10 -57
  87. package/.agents/scripts/lib/baseline-loader.js +12 -51
  88. package/.agents/scripts/lib/baseline-schema-registry.js +5 -22
  89. package/.agents/scripts/lib/baselines/component-matcher.js +3 -12
  90. package/.agents/scripts/lib/baselines/components.js +10 -61
  91. package/.agents/scripts/lib/baselines/coverage-updater-cli.js +7 -36
  92. package/.agents/scripts/lib/baselines/crap-preview-incremental.js +7 -19
  93. package/.agents/scripts/lib/baselines/crap-preview-scan.js +19 -45
  94. package/.agents/scripts/lib/baselines/crap-updater-cli.js +16 -65
  95. package/.agents/scripts/lib/baselines/diff-scope-cli.js +5 -33
  96. package/.agents/scripts/lib/baselines/duplication-scanner.js +11 -60
  97. package/.agents/scripts/lib/baselines/env-overrides.js +12 -67
  98. package/.agents/scripts/lib/baselines/envelope.js +13 -129
  99. package/.agents/scripts/lib/baselines/exit-codes.js +6 -49
  100. package/.agents/scripts/lib/baselines/git-base.js +23 -142
  101. package/.agents/scripts/lib/baselines/kernel.js +11 -111
  102. package/.agents/scripts/lib/baselines/kinds/_crap-new-method-gate.js +9 -47
  103. package/.agents/scripts/lib/baselines/kinds/_crap-read.js +8 -51
  104. package/.agents/scripts/lib/baselines/kinds/_shared-metric.js +7 -62
  105. package/.agents/scripts/lib/baselines/kinds/bundle-size.js +8 -29
  106. package/.agents/scripts/lib/baselines/kinds/coverage.js +3 -15
  107. package/.agents/scripts/lib/baselines/kinds/crap.js +94 -415
  108. package/.agents/scripts/lib/baselines/kinds/duplication.js +4 -30
  109. package/.agents/scripts/lib/baselines/kinds/kind-factory.js +7 -53
  110. package/.agents/scripts/lib/baselines/kinds/maintainability.js +15 -80
  111. package/.agents/scripts/lib/baselines/kinds/mutation.js +12 -72
  112. package/.agents/scripts/lib/baselines/maintainability-baseline-io.js +4 -11
  113. package/.agents/scripts/lib/baselines/merge-envelopes.js +30 -146
  114. package/.agents/scripts/lib/baselines/path-canon.js +19 -128
  115. package/.agents/scripts/lib/baselines/preview-gates.js +8 -37
  116. package/.agents/scripts/lib/baselines/reader.js +14 -107
  117. package/.agents/scripts/lib/baselines/refresh-service.js +35 -252
  118. package/.agents/scripts/lib/baselines/scope.js +11 -135
  119. package/.agents/scripts/lib/baselines/writer.js +16 -149
  120. package/.agents/scripts/lib/bdd-runner-detect.js +18 -113
  121. package/.agents/scripts/lib/bdd-scenario-budget.js +9 -36
  122. package/.agents/scripts/lib/bdd-scenario-scanner.js +11 -73
  123. package/.agents/scripts/lib/bdd-step-index.js +26 -100
  124. package/.agents/scripts/lib/bootstrap/baseline-merge-driver.js +23 -103
  125. package/.agents/scripts/lib/bootstrap/branch-protection.js +2 -5
  126. package/.agents/scripts/lib/bootstrap/commit-push.js +12 -50
  127. package/.agents/scripts/lib/bootstrap/gh-preflight.js +14 -101
  128. package/.agents/scripts/lib/bootstrap/hitl-confirm.js +5 -30
  129. package/.agents/scripts/lib/bootstrap/install-ledger.js +17 -73
  130. package/.agents/scripts/lib/bootstrap/issue-forms-template.js +17 -121
  131. package/.agents/scripts/lib/bootstrap/manifest.js +15 -86
  132. package/.agents/scripts/lib/bootstrap/merge-methods.js +4 -33
  133. package/.agents/scripts/lib/bootstrap/preflight.js +12 -61
  134. package/.agents/scripts/lib/bootstrap/project-bootstrap.js +34 -235
  135. package/.agents/scripts/lib/bootstrap/prompt.js +21 -129
  136. package/.agents/scripts/lib/bootstrap/quality-bootstrap.js +27 -141
  137. package/.agents/scripts/lib/bootstrap/summary.js +1 -8
  138. package/.agents/scripts/lib/bootstrap/workflow-audit.js +11 -84
  139. package/.agents/scripts/lib/branch-name-guard.js +4 -23
  140. package/.agents/scripts/lib/changed-files.js +39 -121
  141. package/.agents/scripts/lib/checks/core-bare-clean.js +4 -24
  142. package/.agents/scripts/lib/checks/index.js +18 -101
  143. package/.agents/scripts/lib/checks/loop-health.js +11 -53
  144. package/.agents/scripts/lib/checks/state.js +16 -91
  145. package/.agents/scripts/lib/checks/story-init-not-backgrounded.js +10 -61
  146. package/.agents/scripts/lib/checks/subagent-agent-tool-required.js +14 -83
  147. package/.agents/scripts/lib/child-exec.js +39 -108
  148. package/.agents/scripts/lib/cli/standard-args.js +9 -116
  149. package/.agents/scripts/lib/cli-args.js +31 -146
  150. package/.agents/scripts/lib/cli-usage.js +5 -27
  151. package/.agents/scripts/lib/cli-utils.js +2 -12
  152. package/.agents/scripts/lib/close-validation/commands.js +13 -76
  153. package/.agents/scripts/lib/close-validation/gates.js +92 -331
  154. package/.agents/scripts/lib/close-validation/process.js +121 -151
  155. package/.agents/scripts/lib/close-validation/projections/advisories.js +5 -31
  156. package/.agents/scripts/lib/close-validation/projections/crap.js +19 -67
  157. package/.agents/scripts/lib/close-validation/projections/head-sha.js +1 -17
  158. package/.agents/scripts/lib/close-validation/projections/inputs.js +4 -34
  159. package/.agents/scripts/lib/close-validation/projections/maintainability.js +11 -58
  160. package/.agents/scripts/lib/close-validation/runner.js +53 -110
  161. package/.agents/scripts/lib/command-header.js +6 -28
  162. package/.agents/scripts/lib/config/acceptance-eval.js +4 -30
  163. package/.agents/scripts/lib/config/baselines.js +3 -14
  164. package/.agents/scripts/lib/config/ci.js +8 -38
  165. package/.agents/scripts/lib/config/commands.js +1 -15
  166. package/.agents/scripts/lib/config/defaults.js +4 -33
  167. package/.agents/scripts/lib/config/delivery-routing.js +6 -34
  168. package/.agents/scripts/lib/config/explain.js +10 -83
  169. package/.agents/scripts/lib/config/gates/coverage.schema.js +0 -12
  170. package/.agents/scripts/lib/config/gates/crap-incremental-coverage.schema.js +3 -31
  171. package/.agents/scripts/lib/config/gates/crap.schema.js +1 -34
  172. package/.agents/scripts/lib/config/gates/duplication.schema.js +1 -8
  173. package/.agents/scripts/lib/config/gates/index.js +2 -17
  174. package/.agents/scripts/lib/config/gates/maintainability.schema.js +1 -20
  175. package/.agents/scripts/lib/config/gates/mutation.schema.js +1 -7
  176. package/.agents/scripts/lib/config/gates/shared.js +4 -64
  177. package/.agents/scripts/lib/config/github.js +4 -22
  178. package/.agents/scripts/lib/config/limits.js +4 -57
  179. package/.agents/scripts/lib/config/paths.js +2 -21
  180. package/.agents/scripts/lib/config/qa.js +4 -38
  181. package/.agents/scripts/lib/config/quality.js +76 -432
  182. package/.agents/scripts/lib/config/runners.js +12 -56
  183. package/.agents/scripts/lib/config/runtime.js +13 -57
  184. package/.agents/scripts/lib/config/shared.js +2 -16
  185. package/.agents/scripts/lib/config/sync-agentrc.js +9 -50
  186. package/.agents/scripts/lib/config/temp-paths.js +40 -280
  187. package/.agents/scripts/lib/config/validate-orchestration.js +5 -17
  188. package/.agents/scripts/lib/config/worktree-isolation.js +9 -28
  189. package/.agents/scripts/lib/config-resolver.js +11 -52
  190. package/.agents/scripts/lib/config-schema-shared.js +1 -4
  191. package/.agents/scripts/lib/config-settings-schema-delivery.js +16 -291
  192. package/.agents/scripts/lib/config-settings-schema-quality.js +7 -219
  193. package/.agents/scripts/lib/config-settings-schema.js +37 -274
  194. package/.agents/scripts/lib/coverage-baseline.js +20 -110
  195. package/.agents/scripts/lib/coverage-capture-fullscope.js +18 -35
  196. package/.agents/scripts/lib/coverage-capture-incremental.js +15 -45
  197. package/.agents/scripts/lib/coverage-capture-usage.js +8 -25
  198. package/.agents/scripts/lib/coverage-capture.js +99 -224
  199. package/.agents/scripts/lib/coverage-utils.js +14 -79
  200. package/.agents/scripts/lib/cpu-pool.js +17 -123
  201. package/.agents/scripts/lib/crap-baseline-join.js +16 -88
  202. package/.agents/scripts/lib/crap-coordinates.js +6 -25
  203. package/.agents/scripts/lib/crap-engine.js +40 -153
  204. package/.agents/scripts/lib/crap-method-identity.js +16 -78
  205. package/.agents/scripts/lib/crap-utils.js +31 -155
  206. package/.agents/scripts/lib/cyclomatic-ceiling.js +14 -87
  207. package/.agents/scripts/lib/cyclomatic-scope.js +10 -50
  208. package/.agents/scripts/lib/dead-exports-knip.js +18 -56
  209. package/.agents/scripts/lib/dead-exports-mode.js +5 -24
  210. package/.agents/scripts/lib/degraded-mode.js +3 -26
  211. package/.agents/scripts/lib/dependency-parser.js +8 -40
  212. package/.agents/scripts/lib/dependency-version.js +13 -35
  213. package/.agents/scripts/lib/detect-package-manager.js +6 -36
  214. package/.agents/scripts/lib/doc-tiers.js +22 -124
  215. package/.agents/scripts/lib/duplicate-search.js +8 -72
  216. package/.agents/scripts/lib/env-loader.js +5 -27
  217. package/.agents/scripts/lib/error-redactor.js +6 -31
  218. package/.agents/scripts/lib/errors/index.js +2 -22
  219. package/.agents/scripts/lib/escomplex-ast-compat.js +22 -163
  220. package/.agents/scripts/lib/escomplex-kernel.js +21 -123
  221. package/.agents/scripts/lib/feedback-loop/graduator-core.js +94 -419
  222. package/.agents/scripts/lib/feedback-loop/prior-feedback-fetcher.js +20 -98
  223. package/.agents/scripts/lib/feedback-loop/retro-proposals-graduator.js +27 -149
  224. package/.agents/scripts/lib/findings/audit-ledger.js +23 -97
  225. package/.agents/scripts/lib/findings/classify-finding.js +14 -69
  226. package/.agents/scripts/lib/findings/promote-finding.js +14 -112
  227. package/.agents/scripts/lib/findings/provenance-field.js +11 -52
  228. package/.agents/scripts/lib/findings/route-finding.js +37 -255
  229. package/.agents/scripts/lib/findings/semantic-issue-search.js +14 -59
  230. package/.agents/scripts/lib/findings/severity.js +18 -104
  231. package/.agents/scripts/lib/format-generated-json.js +12 -44
  232. package/.agents/scripts/lib/full-suite-lock.js +160 -429
  233. package/.agents/scripts/lib/full-suite-queue.js +213 -0
  234. package/.agents/scripts/lib/gates/baseline-store.js +5 -9
  235. package/.agents/scripts/lib/gates/friction.js +1 -3
  236. package/.agents/scripts/lib/generated/agentrc-validator.js +2 -2
  237. package/.agents/scripts/lib/gh-exec.js +123 -191
  238. package/.agents/scripts/lib/git/cached-fetch.js +9 -52
  239. package/.agents/scripts/lib/git/sync-from-base.js +15 -107
  240. package/.agents/scripts/lib/git-branch-cleanup.js +14 -61
  241. package/.agents/scripts/lib/git-branch-lifecycle.js +16 -87
  242. package/.agents/scripts/lib/git-utils.js +37 -161
  243. package/.agents/scripts/lib/github/framework-repo.js +8 -71
  244. package/.agents/scripts/lib/github-url.js +2 -17
  245. package/.agents/scripts/lib/import-graph.js +11 -38
  246. package/.agents/scripts/lib/install-cmd-parser.js +4 -13
  247. package/.agents/scripts/lib/json-utils.js +3 -18
  248. package/.agents/scripts/lib/label-constants.js +16 -111
  249. package/.agents/scripts/lib/label-taxonomy.js +4 -30
  250. package/.agents/scripts/lib/maintainability-engine.js +12 -80
  251. package/.agents/scripts/lib/maintainability-unscorable.js +5 -25
  252. package/.agents/scripts/lib/maintainability-utils.js +16 -92
  253. package/.agents/scripts/lib/mandrel-catalog.js +12 -70
  254. package/.agents/scripts/lib/notifications/notifier.js +13 -38
  255. package/.agents/scripts/lib/npm-scripts.js +4 -23
  256. package/.agents/scripts/lib/observability/metrics-ledger.js +16 -76
  257. package/.agents/scripts/lib/observability/runtime-friction.js +44 -286
  258. package/.agents/scripts/lib/observability/signal-validator.js +5 -37
  259. package/.agents/scripts/lib/observability/signals-writer.js +11 -121
  260. package/.agents/scripts/lib/observability/source-classifier.js +22 -203
  261. package/.agents/scripts/lib/observability/terse-result.js +14 -47
  262. package/.agents/scripts/lib/onboard/init-tail.js +13 -74
  263. package/.agents/scripts/lib/onboard/scaffold-docs.js +11 -34
  264. package/.agents/scripts/lib/orchestration/acceptance-eval-decision.js +25 -139
  265. package/.agents/scripts/lib/orchestration/auto-merge-cwd.js +11 -66
  266. package/.agents/scripts/lib/orchestration/behind-recovery.js +10 -55
  267. package/.agents/scripts/lib/orchestration/ceremony-routing.js +28 -156
  268. package/.agents/scripts/lib/orchestration/change-set.js +7 -36
  269. package/.agents/scripts/lib/orchestration/check-baselines/phases/compare.js +9 -46
  270. package/.agents/scripts/lib/orchestration/check-baselines/phases/evaluate.js +11 -44
  271. package/.agents/scripts/lib/orchestration/check-baselines/phases/floors.js +5 -24
  272. package/.agents/scripts/lib/orchestration/check-baselines/phases/friction.js +3 -12
  273. package/.agents/scripts/lib/orchestration/check-baselines/phases/parse-args.js +5 -38
  274. package/.agents/scripts/lib/orchestration/check-baselines/phases/pipeline.js +3 -8
  275. package/.agents/scripts/lib/orchestration/check-baselines/phases/refresh-ack.js +28 -136
  276. package/.agents/scripts/lib/orchestration/check-baselines/phases/report.js +3 -13
  277. package/.agents/scripts/lib/orchestration/check-state.js +92 -0
  278. package/.agents/scripts/lib/orchestration/ci-gap-intake.js +37 -144
  279. package/.agents/scripts/lib/orchestration/ci-rerun-guard.js +121 -157
  280. package/.agents/scripts/lib/orchestration/code-review.js +24 -128
  281. package/.agents/scripts/lib/orchestration/column-sync.js +23 -111
  282. package/.agents/scripts/lib/orchestration/complexity-gate.js +118 -462
  283. package/.agents/scripts/lib/orchestration/deliver-recover.js +36 -168
  284. package/.agents/scripts/lib/orchestration/dependency-analyzer.js +4 -35
  285. package/.agents/scripts/lib/orchestration/dependency-candidates.js +9 -41
  286. package/.agents/scripts/lib/orchestration/diff-magnitude.js +25 -115
  287. package/.agents/scripts/lib/orchestration/doc-reader.js +2 -6
  288. package/.agents/scripts/lib/orchestration/docs-digest.js +13 -51
  289. package/.agents/scripts/lib/orchestration/epic-candidates.js +13 -53
  290. package/.agents/scripts/lib/orchestration/epic-checklist.js +9 -33
  291. package/.agents/scripts/lib/orchestration/epic-container.js +41 -167
  292. package/.agents/scripts/lib/orchestration/epic-expansion.js +10 -40
  293. package/.agents/scripts/lib/orchestration/epic-rollup.js +55 -207
  294. package/.agents/scripts/lib/orchestration/file-assumption-enum.js +2 -22
  295. package/.agents/scripts/lib/orchestration/file-assumptions.js +45 -253
  296. package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-detect.js +9 -46
  297. package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-reap.js +7 -57
  298. package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches.js +21 -126
  299. package/.agents/scripts/lib/orchestration/git-cleanup/phases/cli.js +2 -6
  300. package/.agents/scripts/lib/orchestration/git-cleanup/phases/fast-forward.js +1 -4
  301. package/.agents/scripts/lib/orchestration/git-cleanup/phases/filters.js +1 -5
  302. package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes-ff.js +9 -34
  303. package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes.js +41 -190
  304. package/.agents/scripts/lib/orchestration/git-cleanup/phases/merged-tip.js +9 -45
  305. package/.agents/scripts/lib/orchestration/git-cleanup/phases/parse-args.js +1 -4
  306. package/.agents/scripts/lib/orchestration/git-cleanup/phases/phase-drivers.js +19 -85
  307. package/.agents/scripts/lib/orchestration/git-cleanup/phases/prompts.js +3 -17
  308. package/.agents/scripts/lib/orchestration/git-cleanup/phases/prune.js +1 -5
  309. package/.agents/scripts/lib/orchestration/git-cleanup/phases/render.js +16 -100
  310. package/.agents/scripts/lib/orchestration/git-cleanup/phases/stashes.js +1 -4
  311. package/.agents/scripts/lib/orchestration/lease-guard-shared.js +16 -67
  312. package/.agents/scripts/lib/orchestration/lifecycle/emit-ledger-event.js +9 -33
  313. package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-flip-failed.js +8 -29
  314. package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-unlanded.js +15 -68
  315. package/.agents/scripts/lib/orchestration/light-backstop.js +11 -49
  316. package/.agents/scripts/lib/orchestration/light-escalation.js +21 -89
  317. package/.agents/scripts/lib/orchestration/light-suitability.js +37 -307
  318. package/.agents/scripts/lib/orchestration/merge-block-class.js +39 -216
  319. package/.agents/scripts/lib/orchestration/merge-poll.js +104 -377
  320. package/.agents/scripts/lib/orchestration/pinned-identifier-lint.js +17 -57
  321. package/.agents/scripts/lib/orchestration/plan-context.js +55 -318
  322. package/.agents/scripts/lib/orchestration/plan-critic-conditions.js +22 -79
  323. package/.agents/scripts/lib/orchestration/plan-critics-evaluate.js +5 -31
  324. package/.agents/scripts/lib/orchestration/plan-metrics.js +29 -108
  325. package/.agents/scripts/lib/orchestration/plan-navigation.js +8 -27
  326. package/.agents/scripts/lib/orchestration/plan-persist/acceptance-handle-repair.js +12 -49
  327. package/.agents/scripts/lib/orchestration/plan-persist/audit-provenance.js +18 -73
  328. package/.agents/scripts/lib/orchestration/plan-persist/changes-repair.js +16 -78
  329. package/.agents/scripts/lib/orchestration/plan-persist/cross-plan-links.js +6 -30
  330. package/.agents/scripts/lib/orchestration/plan-persist/epic-adoption.js +14 -65
  331. package/.agents/scripts/lib/orchestration/plan-persist/epic-ops.js +21 -76
  332. package/.agents/scripts/lib/orchestration/plan-persist/external-deps.js +6 -43
  333. package/.agents/scripts/lib/orchestration/plan-persist/persist-helpers.js +14 -68
  334. package/.agents/scripts/lib/orchestration/plan-persist/plan-context-source.js +9 -41
  335. package/.agents/scripts/lib/orchestration/plan-persist/run-plan-persist.js +71 -289
  336. package/.agents/scripts/lib/orchestration/plan-persist/soft-findings.js +2 -12
  337. package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +96 -362
  338. package/.agents/scripts/lib/orchestration/plan-persist/summary.js +9 -39
  339. package/.agents/scripts/lib/orchestration/plan-persist/supersede-ops.js +60 -186
  340. package/.agents/scripts/lib/orchestration/plan-persist/wave-collision-gate.js +9 -49
  341. package/.agents/scripts/lib/orchestration/plan-persist/wave-serialisation.js +7 -28
  342. package/.agents/scripts/lib/orchestration/plan-reachability.js +13 -42
  343. package/.agents/scripts/lib/orchestration/plan-run-labels/reap.js +16 -91
  344. package/.agents/scripts/lib/orchestration/plan-runner/worktree-sweep.js +16 -54
  345. package/.agents/scripts/lib/orchestration/plan-text-hygiene.js +10 -52
  346. package/.agents/scripts/lib/orchestration/planning/authoring-context.js +14 -109
  347. package/.agents/scripts/lib/orchestration/planning/memory-pool-advisory.js +11 -83
  348. package/.agents/scripts/lib/orchestration/pr-watch.js +48 -306
  349. package/.agents/scripts/lib/orchestration/project-meta-cache.js +15 -80
  350. package/.agents/scripts/lib/orchestration/project-meta-resolver.js +10 -51
  351. package/.agents/scripts/lib/orchestration/reassert-status-column.js +12 -76
  352. package/.agents/scripts/lib/orchestration/remote-verifier.js +12 -36
  353. package/.agents/scripts/lib/orchestration/resolve-stories.js +33 -164
  354. package/.agents/scripts/lib/orchestration/retro-proposals.js +66 -361
  355. package/.agents/scripts/lib/orchestration/review-base-ref.js +9 -43
  356. package/.agents/scripts/lib/orchestration/review-depth.js +12 -91
  357. package/.agents/scripts/lib/orchestration/review-providers/codex.js +10 -111
  358. package/.agents/scripts/lib/orchestration/review-providers/degraded-gates.js +13 -71
  359. package/.agents/scripts/lib/orchestration/review-providers/findings-renderer.js +7 -51
  360. package/.agents/scripts/lib/orchestration/review-providers/mi-exemptions.js +8 -53
  361. package/.agents/scripts/lib/orchestration/review-providers/native.js +30 -214
  362. package/.agents/scripts/lib/orchestration/review-providers/parse-findings.js +7 -52
  363. package/.agents/scripts/lib/orchestration/review-providers/review-depth.js +4 -33
  364. package/.agents/scripts/lib/orchestration/review-providers/review-provider-factory.js +11 -71
  365. package/.agents/scripts/lib/orchestration/review-providers/scoped-lint.js +19 -131
  366. package/.agents/scripts/lib/orchestration/review-providers/security-review.js +6 -89
  367. package/.agents/scripts/lib/orchestration/review-providers/types.js +26 -56
  368. package/.agents/scripts/lib/orchestration/review-providers/ultrareview.js +3 -46
  369. package/.agents/scripts/lib/orchestration/run-epilogue.js +245 -326
  370. package/.agents/scripts/lib/orchestration/run-scoped-config.js +55 -159
  371. package/.agents/scripts/lib/orchestration/single-story-close/close-note.js +7 -34
  372. package/.agents/scripts/lib/orchestration/single-story-close/failed-terminal.js +16 -89
  373. package/.agents/scripts/lib/orchestration/single-story-close/gate-log.js +18 -109
  374. package/.agents/scripts/lib/orchestration/single-story-close/phases/auto-merge.js +83 -239
  375. package/.agents/scripts/lib/orchestration/single-story-close/phases/base-sync.js +20 -82
  376. package/.agents/scripts/lib/orchestration/single-story-close/phases/close-validation.js +103 -97
  377. package/.agents/scripts/lib/orchestration/single-story-close/phases/code-review.js +8 -64
  378. package/.agents/scripts/lib/orchestration/single-story-close/phases/confirm-merge.js +136 -486
  379. package/.agents/scripts/lib/orchestration/single-story-close/phases/conventional-subject.js +30 -134
  380. package/.agents/scripts/lib/orchestration/single-story-close/phases/graphql-preflight.js +96 -0
  381. package/.agents/scripts/lib/orchestration/single-story-close/phases/lock-wait-pending.js +49 -0
  382. package/.agents/scripts/lib/orchestration/single-story-close/phases/normalize-pr-title.js +13 -86
  383. package/.agents/scripts/lib/orchestration/single-story-close/phases/options.js +20 -95
  384. package/.agents/scripts/lib/orchestration/single-story-close/phases/post-land.js +46 -203
  385. package/.agents/scripts/lib/orchestration/single-story-close/phases/pre-gate-steps.js +8 -50
  386. package/.agents/scripts/lib/orchestration/single-story-close/phases/pull-request.js +12 -83
  387. package/.agents/scripts/lib/orchestration/single-story-close/phases/push.js +6 -39
  388. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-block.js +1 -6
  389. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-outcome.js +4 -28
  390. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-override.js +6 -51
  391. package/.agents/scripts/lib/orchestration/single-story-close/phases/worktree-reap.js +6 -34
  392. package/.agents/scripts/lib/orchestration/single-story-close/phases/wrong-tree-guard.js +23 -121
  393. package/.agents/scripts/lib/orchestration/single-story-close/runner.js +180 -273
  394. package/.agents/scripts/lib/orchestration/single-story-lease-guard.js +15 -69
  395. package/.agents/scripts/lib/orchestration/story-body-gate.js +4 -23
  396. package/.agents/scripts/lib/orchestration/story-close/baseline-upward-writeback.js +50 -179
  397. package/.agents/scripts/lib/orchestration/story-close/context-budget-writeback.js +11 -41
  398. package/.agents/scripts/lib/orchestration/story-close/format-autofix.js +23 -311
  399. package/.agents/scripts/lib/orchestration/story-close/phases/local-lens-review.js +22 -147
  400. package/.agents/scripts/lib/orchestration/story-close/phases/review-core.js +16 -67
  401. package/.agents/scripts/lib/orchestration/story-deliver-terminal-schema.js +12 -68
  402. package/.agents/scripts/lib/orchestration/story-deliver-terminal.js +42 -200
  403. package/.agents/scripts/lib/orchestration/story-follow-ups.js +167 -252
  404. package/.agents/scripts/lib/orchestration/story-init-envelope.js +52 -0
  405. package/.agents/scripts/lib/orchestration/story-init-remote.js +2 -6
  406. package/.agents/scripts/lib/orchestration/story-reachability.js +3 -23
  407. package/.agents/scripts/lib/orchestration/task-body-validator.js +12 -135
  408. package/.agents/scripts/lib/orchestration/ticket-lease.js +28 -131
  409. package/.agents/scripts/lib/orchestration/ticket-validator-conflicts.js +15 -149
  410. package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +5 -33
  411. package/.agents/scripts/lib/orchestration/ticket-validator.js +63 -344
  412. package/.agents/scripts/lib/orchestration/ticketing/bulk.js +51 -244
  413. package/.agents/scripts/lib/orchestration/ticketing/reads.js +39 -261
  414. package/.agents/scripts/lib/orchestration/ticketing/state.js +14 -68
  415. package/.agents/scripts/lib/orchestration/ticketing/transition.js +46 -263
  416. package/.agents/scripts/lib/orchestration/ticketing.js +2 -26
  417. package/.agents/scripts/lib/orchestration/verify-credit.js +18 -79
  418. package/.agents/scripts/lib/orchestration/worktree-dirty.js +5 -30
  419. package/.agents/scripts/lib/path-security.js +3 -6
  420. package/.agents/scripts/lib/plan-phase-cleanup.js +9 -49
  421. package/.agents/scripts/lib/preflight-runner.js +13 -69
  422. package/.agents/scripts/lib/process-group.js +143 -0
  423. package/.agents/scripts/lib/project-root.js +2 -8
  424. package/.agents/scripts/lib/provider-factory.js +2 -25
  425. package/.agents/scripts/lib/qa/console-allowlist.js +10 -59
  426. package/.agents/scripts/lib/qa/qa-session.js +15 -69
  427. package/.agents/scripts/lib/qa/redact-evidence.js +18 -129
  428. package/.agents/scripts/lib/qa/resolve-qa-contract.js +26 -135
  429. package/.agents/scripts/lib/qa/resolve-selection.js +16 -84
  430. package/.agents/scripts/lib/reserved-test-ids.js +9 -47
  431. package/.agents/scripts/lib/runtime-deps/dep-resolution.js +13 -53
  432. package/.agents/scripts/lib/runtime-deps/ensure-installed.js +10 -44
  433. package/.agents/scripts/lib/runtime-deps/manifest.js +10 -30
  434. package/.agents/scripts/lib/runtime-deps/parser-major.js +15 -51
  435. package/.agents/scripts/lib/runtime-deps/preflight.js +4 -22
  436. package/.agents/scripts/lib/runtime-deps/scan-imports.js +11 -55
  437. package/.agents/scripts/lib/signals/detectors/common.js +12 -38
  438. package/.agents/scripts/lib/signals/index.js +2 -19
  439. package/.agents/scripts/lib/signals/schema.js +14 -109
  440. package/.agents/scripts/lib/signals/write.js +2 -11
  441. package/.agents/scripts/lib/single-story/confirm-merge.js +31 -72
  442. package/.agents/scripts/lib/single-story/story-merged-notify.js +8 -49
  443. package/.agents/scripts/lib/single-story-sweep/protection-ctx.js +4 -26
  444. package/.agents/scripts/lib/single-story-sweep/protection.js +13 -100
  445. package/.agents/scripts/lib/single-story-sweep/sweep-lock.js +60 -258
  446. package/.agents/scripts/lib/single-story-sweep.js +14 -97
  447. package/.agents/scripts/lib/skills/parse-skill.js +13 -59
  448. package/.agents/scripts/lib/skills/skills-index.js +8 -29
  449. package/.agents/scripts/lib/skills/walk-skill-files.js +17 -78
  450. package/.agents/scripts/lib/source-extensions.js +11 -42
  451. package/.agents/scripts/lib/source-text/strip-js-comments.js +8 -41
  452. package/.agents/scripts/lib/stdio-flush.js +9 -36
  453. package/.agents/scripts/lib/story-adjacency.js +8 -40
  454. package/.agents/scripts/lib/story-body/body-format-lints.js +51 -66
  455. package/.agents/scripts/lib/story-body/footer-block.js +11 -44
  456. package/.agents/scripts/lib/story-body/story-body.js +123 -344
  457. package/.agents/scripts/lib/temp-retention.js +42 -143
  458. package/.agents/scripts/lib/templates/decomposer-prompts.js +18 -80
  459. package/.agents/scripts/lib/test-env.js +12 -65
  460. package/.agents/scripts/lib/test-run-credit.js +10 -65
  461. package/.agents/scripts/lib/test-runner-contract.js +19 -74
  462. package/.agents/scripts/lib/test-temp.js +38 -184
  463. package/.agents/scripts/lib/test-tiers.js +12 -96
  464. package/.agents/scripts/lib/ticket-body-sections.js +21 -96
  465. package/.agents/scripts/lib/transpile.js +15 -74
  466. package/.agents/scripts/lib/util/concurrent-map.js +6 -25
  467. package/.agents/scripts/lib/util/parse-id-list.js +8 -34
  468. package/.agents/scripts/lib/util/poll-loop.js +8 -28
  469. package/.agents/scripts/lib/util/with-timeout.js +2 -11
  470. package/.agents/scripts/lib/validation-evidence.js +21 -96
  471. package/.agents/scripts/lib/wave-runner/footprint.js +17 -70
  472. package/.agents/scripts/lib/wave-runner/live-probe.js +67 -209
  473. package/.agents/scripts/lib/wave-runner/ready-set.js +72 -301
  474. package/.agents/scripts/lib/workers/crap-worker.js +11 -64
  475. package/.agents/scripts/lib/workers/maintainability-report-worker.js +8 -45
  476. package/.agents/scripts/lib/workers/maintainability-worker.js +5 -21
  477. package/.agents/scripts/lib/workers/serve-worker-messages.js +2 -18
  478. package/.agents/scripts/lib/workflow-closure.js +22 -105
  479. package/.agents/scripts/lib/workspace-provisioner.js +16 -54
  480. package/.agents/scripts/lib/worktree/git-hooks.js +15 -60
  481. package/.agents/scripts/lib/worktree/lifecycle/force-drain.js +20 -60
  482. package/.agents/scripts/lib/worktree/lifecycle/merge-reachability.js +10 -62
  483. package/.agents/scripts/lib/worktree/lifecycle/pending-cleanup.js +22 -86
  484. package/.agents/scripts/lib/worktree/lifecycle/reap.js +24 -126
  485. package/.agents/scripts/lib/worktree/lifecycle-manager.js +2 -20
  486. package/.agents/scripts/lib/worktree/node-modules-strategy.js +46 -180
  487. package/.agents/scripts/lib/worktree-manager.js +15 -40
  488. package/.agents/scripts/lint-issue-body.js +12 -68
  489. package/.agents/scripts/mandrel-update-preflight.js +10 -70
  490. package/.agents/scripts/merge-baseline.js +30 -105
  491. package/.agents/scripts/nav-registry-diff.js +22 -108
  492. package/.agents/scripts/notify.js +12 -69
  493. package/.agents/scripts/plan-context.js +97 -92
  494. package/.agents/scripts/plan-critics.js +12 -66
  495. package/.agents/scripts/plan-persist.js +71 -137
  496. package/.agents/scripts/plan-run-epilogue.js +20 -43
  497. package/.agents/scripts/pr-watch-with-update.js +79 -263
  498. package/.agents/scripts/providers/github/auth.js +3 -8
  499. package/.agents/scripts/providers/github/blocked-by-add.js +14 -61
  500. package/.agents/scripts/providers/github/board-add.js +5 -21
  501. package/.agents/scripts/providers/github/branch-protection.js +11 -43
  502. package/.agents/scripts/providers/github/cache.js +2 -14
  503. package/.agents/scripts/providers/github/comments.js +7 -40
  504. package/.agents/scripts/providers/github/compose.js +3 -19
  505. package/.agents/scripts/providers/github/errors.js +22 -125
  506. package/.agents/scripts/providers/github/issues.js +31 -123
  507. package/.agents/scripts/providers/github/labels.js +24 -124
  508. package/.agents/scripts/providers/github/mappers.js +5 -27
  509. package/.agents/scripts/providers/github/merge-methods.js +3 -22
  510. package/.agents/scripts/providers/github/project-board.js +2 -17
  511. package/.agents/scripts/providers/github/projects-v2-graphql.js +3 -6
  512. package/.agents/scripts/providers/github/request-helpers.js +5 -32
  513. package/.agents/scripts/providers/github/search-budget.js +9 -39
  514. package/.agents/scripts/providers/github/search-query.js +5 -26
  515. package/.agents/scripts/providers/github/sub-issue-add.js +15 -65
  516. package/.agents/scripts/providers/github/sub-issues.js +7 -36
  517. package/.agents/scripts/providers/github/tickets.js +32 -134
  518. package/.agents/scripts/providers/github.js +18 -59
  519. package/.agents/scripts/prune-plan-run-labels.js +12 -46
  520. package/.agents/scripts/quality-preview.js +35 -220
  521. package/.agents/scripts/resolve-doc-tiers.js +3 -26
  522. package/.agents/scripts/resolve-stories.js +16 -67
  523. package/.agents/scripts/resync-status-column.js +6 -25
  524. package/.agents/scripts/run-tests.js +29 -104
  525. package/.agents/scripts/single-story-close.js +23 -135
  526. package/.agents/scripts/single-story-confirm-merge.js +32 -139
  527. package/.agents/scripts/single-story-init.js +47 -259
  528. package/.agents/scripts/stories-wave-tick.js +179 -415
  529. package/.agents/scripts/sync-agentrc.js +3 -21
  530. package/.agents/scripts/sync-claude-agents.js +9 -55
  531. package/.agents/scripts/sync-claude-commands.js +20 -110
  532. package/.agents/scripts/test-wrapper.js +6 -43
  533. package/.agents/scripts/update-coverage-baseline.js +5 -22
  534. package/.agents/scripts/update-crap-baseline.js +7 -30
  535. package/.agents/scripts/update-duplication-baseline.js +16 -92
  536. package/.agents/scripts/update-maintainability-baseline.js +8 -62
  537. package/.agents/scripts/update-ticket-state.js +1 -7
  538. package/.agents/scripts/validate-skills.js +6 -26
  539. package/.agents/skills/core/gates-and-baselines/reference.md +0 -1
  540. package/.agents/skills/skills.index.json +2 -2
  541. package/.agents/skills/stack/qa/playwright/SKILL.md +26 -0
  542. package/.agents/templates/agent-protocol.md +2 -2
  543. package/.agents/templates/docs/audit-sweep-runbook.md +3 -4
  544. package/.agents/workflows/audit-accessibility.md +4 -7
  545. package/.agents/workflows/audit-adrs.md +3 -6
  546. package/.agents/workflows/audit-architecture.md +3 -11
  547. package/.agents/workflows/audit-baselines.md +6 -9
  548. package/.agents/workflows/audit-clean-code.md +8 -12
  549. package/.agents/workflows/audit-data-model.md +3 -7
  550. package/.agents/workflows/audit-dependencies.md +4 -7
  551. package/.agents/workflows/audit-devops.md +4 -8
  552. package/.agents/workflows/audit-documentation.md +1 -4
  553. package/.agents/workflows/audit-mobile.md +4 -7
  554. package/.agents/workflows/audit-navigability.md +3 -6
  555. package/.agents/workflows/audit-performance.md +2 -4
  556. package/.agents/workflows/audit-privacy.md +4 -7
  557. package/.agents/workflows/audit-quality.md +4 -7
  558. package/.agents/workflows/audit-security.md +4 -7
  559. package/.agents/workflows/audit-seo.md +4 -7
  560. package/.agents/workflows/audit-sre.md +4 -7
  561. package/.agents/workflows/audit-to-stories.md +17 -30
  562. package/.agents/workflows/audit-ux-ui.md +4 -7
  563. package/.agents/workflows/helpers/acceptance-self-eval.md +84 -157
  564. package/.agents/workflows/helpers/audit-lens-core.md +1 -1
  565. package/.agents/workflows/helpers/code-quality-guardrails.md +12 -15
  566. package/.agents/workflows/helpers/code-review.md +4 -2
  567. package/.agents/workflows/helpers/deliver-digest.md +37 -28
  568. package/.agents/workflows/helpers/deliver-light.md +92 -101
  569. package/.agents/workflows/helpers/deliver-reference.md +162 -220
  570. package/.agents/workflows/helpers/deliver-story-reference.md +197 -607
  571. package/.agents/workflows/helpers/deliver-story.md +17 -18
  572. package/.agents/workflows/helpers/plan-reference.md +125 -167
  573. package/.agents/workflows/helpers/qa-core.md +12 -0
  574. package/.agents/workflows/mandrel-deliver.md +47 -31
  575. package/.agents/workflows/mandrel-plan.md +22 -21
  576. package/.agents/workflows/mandrel-update.md +36 -21
  577. package/.agents/workflows/memory-consolidate.md +1 -1
  578. package/.agents/workflows/qa-assist.md +27 -71
  579. package/.agents/workflows/qa-explore.md +19 -59
  580. package/.agents/workflows/qa-run.md +11 -33
  581. package/README.md +1 -1
  582. package/bin/mandrel.js +5 -46
  583. package/bin/postinstall.js +18 -107
  584. package/docs/CHANGELOG.md +60 -0
  585. package/lib/cli/doctor.js +11 -71
  586. package/lib/cli/init.js +26 -165
  587. package/lib/cli/migrate.js +5 -64
  588. package/lib/cli/registry.js +84 -467
  589. package/lib/cli/sync-agents.js +4 -64
  590. package/lib/cli/sync-commands.js +11 -64
  591. package/lib/cli/sync.js +34 -213
  592. package/lib/cli/uninstall.js +40 -219
  593. package/lib/cli/update.js +326 -523
  594. package/lib/cli/version-check.js +8 -72
  595. package/lib/cli/version-helpers.js +14 -87
  596. package/lib/migrations/helpers/retire-agentrc-key.js +11 -52
  597. package/lib/migrations/index.js +17 -92
  598. package/lib/migrations/steps/2.1.0-retire-mi-drop-knobs.js +2 -15
  599. package/lib/migrations/steps/2.1.0-retire-verify-concurrency-cap.js +1 -13
  600. package/lib/migrations/steps/2.11.0-retire-max-seed-words.js +2 -15
  601. package/lib/migrations/steps/2.2.0-retire-epic-ac-tags.js +9 -38
  602. package/lib/migrations/steps/2.20.0-retire-codebase-snapshot.js +1 -13
  603. package/lib/migrations/steps/2.32.0-retire-lint-baseline-command.js +2 -27
  604. package/lib/migrations/steps/2.57.0-retire-delivery-limit-knobs.js +2 -23
  605. package/lib/migrations/steps/2.57.0-retire-planning-limit-knobs.js +2 -27
  606. package/lib/migrations/steps/2.60.0-retire-audit-results-autofile.js +21 -0
  607. package/lib/migrations/steps/strip-removed-agentrc-keys.js +333 -0
  608. package/package.json +17 -14
  609. package/.agents/docs/SDLC.md +0 -590
  610. package/.agents/docs/quality-gates.md +0 -1179
  611. package/.agents/rules/known-tooling-behavior.md +0 -150
  612. package/.agents/rules/orchestration-error-handling.md +0 -61
  613. package/.agents/rules/test-seams.md +0 -59
  614. package/.agents/schemas/baselines/lighthouse.schema.json +0 -59
  615. package/.agents/schemas/baselines/lint.schema.json +0 -47
  616. package/.agents/schemas/model-attribution.schema.json +0 -53
  617. package/.agents/scripts/check-action-pinning.js +0 -260
  618. package/.agents/scripts/check-audit-attribution.js +0 -302
  619. package/.agents/scripts/check-baseline-drift.js +0 -211
  620. package/.agents/scripts/check-baseline-scope.js +0 -362
  621. package/.agents/scripts/check-generated-validator.js +0 -202
  622. package/.agents/scripts/check-knip-entries.js +0 -159
  623. package/.agents/scripts/check-lifecycle-lint.js +0 -294
  624. package/.agents/scripts/check-pinned-override-notes.js +0 -102
  625. package/.agents/scripts/check-schema-references.js +0 -366
  626. package/.agents/scripts/check-test-portability.js +0 -512
  627. package/.agents/scripts/check-workflow-citations.js +0 -332
  628. package/.agents/scripts/check-workflow-cli-lint.js +0 -299
  629. package/.agents/scripts/check-workflow-timeouts.js +0 -291
  630. package/.agents/scripts/install-matrix-assert.js +0 -326
  631. package/.agents/scripts/lib/audit-advisories.js +0 -195
  632. package/.agents/scripts/lib/audit-attribution.js +0 -134
  633. package/.agents/scripts/lib/baselines/drift-detector.js +0 -351
  634. package/.agents/scripts/lib/baselines/kinds/lighthouse.js +0 -87
  635. package/.agents/scripts/lib/baselines/kinds/lint.js +0 -184
  636. package/.agents/scripts/lib/baselines/orphan-pruner.js +0 -233
  637. package/.agents/scripts/lib/baselines/scope-assert.js +0 -223
  638. package/.agents/scripts/lib/baselines/scope-inventory.js +0 -314
  639. package/.agents/scripts/lib/c8-cli-path.js +0 -21
  640. package/.agents/scripts/lib/config/gates/lighthouse.schema.js +0 -51
  641. package/.agents/scripts/lib/config/gates/lint.schema.js +0 -18
  642. package/.agents/scripts/lib/dynamic-workflow/architecture-report-contract.js +0 -70
  643. package/.agents/scripts/lib/dynamic-workflow/audit-orchestrator.js +0 -284
  644. package/.agents/scripts/lib/dynamic-workflow/clean-code-report-contract.js +0 -80
  645. package/.agents/scripts/lib/dynamic-workflow/degraded-coverage.js +0 -81
  646. package/.agents/scripts/lib/dynamic-workflow/documentation-report-contract.js +0 -87
  647. package/.agents/scripts/lib/dynamic-workflow/performance-report-contract.js +0 -74
  648. package/.agents/scripts/lib/dynamic-workflow/quality-report-contract.js +0 -90
  649. package/.agents/scripts/lib/dynamic-workflow/report-contract-core.js +0 -43
  650. package/.agents/scripts/lib/dynamic-workflow/security-report-contract.js +0 -83
  651. package/.agents/scripts/lib/fs-walk.js +0 -52
  652. package/.agents/scripts/lib/knip-config-resolver.js +0 -181
  653. package/.agents/scripts/lib/knip-entry-sync.js +0 -452
  654. package/.agents/scripts/lib/orchestration/model-attribution.js +0 -418
  655. package/.agents/scripts/lib/orchestration/story-plan-state.js +0 -33
  656. package/.agents/scripts/lib/orchestration/structured-comment-parser.js +0 -67
  657. package/.agents/scripts/lib/pinned-override-notes.js +0 -88
  658. package/.agents/scripts/lib/pinned-override-resolve.js +0 -212
  659. package/.agents/scripts/lib/test-isolate/cli-options.js +0 -93
  660. package/.agents/scripts/lib/test-isolate/env-snapshot-loader.js +0 -52
  661. package/.agents/scripts/lib/test-isolate/list-files.js +0 -90
  662. package/.agents/scripts/lib/test-isolate/parse-tap.js +0 -75
  663. package/.agents/scripts/lib/test-isolate/progress-log.js +0 -45
  664. package/.agents/scripts/lib/test-isolate/render-report.js +0 -97
  665. package/.agents/scripts/lib/test-isolate/run-isolate.js +0 -87
  666. package/.agents/scripts/lib/test-isolate/runner.js +0 -483
  667. package/.agents/scripts/lib/test-profile/parse-tap.js +0 -136
  668. package/.agents/scripts/lib/test-profile/render-report.js +0 -45
  669. package/.agents/scripts/lint-label-vocabulary.js +0 -214
  670. package/.agents/scripts/post-structured-comment.js +0 -127
  671. package/.agents/scripts/provision-git-hooks.js +0 -85
  672. package/.agents/scripts/prune-baseline-orphans.js +0 -181
  673. package/.agents/scripts/run-coverage.js +0 -197
  674. package/.agents/scripts/run-lint.js +0 -133
  675. package/.agents/scripts/run-test-profile.js +0 -129
  676. package/.agents/scripts/run-verify.js +0 -118
  677. package/.agents/scripts/test-isolate.js +0 -55
  678. package/.agents/scripts/update-dead-exports-baseline.js +0 -321
@@ -1,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