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,43 +1,8 @@
1
1
  /**
2
- * runtime-friction.js — derive friction signals from observables the
3
- * runtime already has (Story #4578).
4
- *
5
- * ## Why this exists
6
- *
7
- * Friction telemetry was **opt-in**: a `friction` record existed only when
8
- * an agent volunteered a `diagnose-friction.js --story <id> --cmd <...>`
9
- * call. `plan-run-epilogue.js`'s `follow-up-rollup` then read an empty
10
- * `signals.ndjson` and truthfully reported "No friction signals — nothing
11
- * to follow up". A 7-Story run containing a mid-run git outage, a parked
12
- * worker needing an operator resume, and a four-round acceptance critic
13
- * produced a **zero-signal retro** — because the stream is least likely to
14
- * fill exactly when a run is going badly and the agent is busy.
15
- *
16
- * This module closes that gap from the other side: the runtime emits
17
- * friction from what it *already knows*, at the point it already knows it.
18
- * No agent cooperation required.
19
- *
20
- * ## Not a second channel
21
- *
22
- * These records go through the **existing** `appendSignal` path, carry the
23
- * **existing** `kind: 'friction'` shape, and land in the **same**
24
- * `signals.ndjson` stream `diagnose-friction.js` writes and the roll-up
25
- * reads. The only thing that is new is *who* decides to write.
26
- *
27
- * Deliberately distinct from {@link ../gates/friction.js}'s
28
- * `emitFrictionSignal`, which early-returns unless **both** `storyId` and
29
- * `epicId` are truthy. Every v2 Story is standalone (`epicId: null` — see
30
- * `temp-paths.storyTempDir`'s standalone branch), and the roll-up reads the
31
- * standalone stream via `forEachLine(null, sid, ...)`. Routing runtime
32
- * friction through the gate helper would drop **every** record on the floor,
33
- * silently, which is the bug this Story exists to fix.
34
- *
35
- * ## Robustness contract
36
- *
37
- * Observability MUST NOT halt the runner (`signals-writer.js`; the
38
- * `docs/patterns.md` friction pattern). Every export here is best-effort:
39
- * it swallows its own failures after a `Logger.warn` and resolves `false`.
40
- * A missing signal is strictly preferable to a broken close.
2
+ * runtime-friction.js — emit friction signals from what the runtime already
3
+ * knows. Not via `gates/friction.js`, which drops records without an
4
+ * `epicId` (every v2 Story has none). Best-effort: failures log and resolve
5
+ * `false`.
41
6
  *
42
7
  * @module lib/observability/runtime-friction
43
8
  */
@@ -48,75 +13,24 @@ import { Logger } from '../Logger.js';
48
13
  import { appendSignal, forEachLine } from './signals-writer.js';
49
14
 
50
15
  /**
51
- * The friction categories this module emits.
52
- *
53
- * Values are plain strings by design: `signal-event.schema.json` types
54
- * `category` as a free-form `{ type: 'string', minLength: 1 }`, so no schema
55
- * change is required to add one. They are frozen here so the emitters and
56
- * their tests name the same literal instead of spreading it.
57
- *
58
- * Category choice is load-bearing for the retro: `retro-proposals.js`
59
- * aggregates **by exact category string**, so these are deliberately coarse
60
- * — one bucket per failure mode — rather than per-incident. Two Stories that
61
- * hit the same wall in one run aggregate to `occurrences: 2` and route as a
62
- * real proposal instead of being discarded as two unrelated singletons.
16
+ * The retro aggregates by exact category string, so each is one coarse
17
+ * bucket per failure mode.
63
18
  */
64
19
  export const RUNTIME_FRICTION_CATEGORIES = Object.freeze({
65
- /** A Story was parked at `agent::blocked` — the HITL pause (§ 1.J). */
66
20
  STORY_BLOCKED: 'story-blocked',
67
- /** A close run ended on a `failed` terminal (non-zero exit). */
68
21
  CLOSE_FAILED: 'close-failed',
69
- /** A bounded merge wait expired with the PR still in flight. */
70
22
  MERGE_WAIT_EXHAUSTED: 'merge-wait-exhausted',
71
- /**
72
- * A review/lens tool failed to *execute* (binary missing, unparseable
73
- * output, materialization crash) — an operational degradation, not a code
74
- * finding. Story #4699 routes these here so findings severity tiers
75
- * reflect code findings only.
76
- */
23
+ /** A tool failed to execute — kept out of code-finding severity tiers. */
77
24
  TOOL_DEGRADED: 'tool-degraded',
78
- /**
79
- * The light delivery path refused a scope — a suitability-gate escalation
80
- * or a blocked diff backstop. Story #4856 added it because neither rejection
81
- * emitted anything, so an over-tight ceiling could only reach the framework
82
- * as anecdote; the roll-up aggregating these by category is what makes the
83
- * ceilings recalibratable from recorded evidence.
84
- */
85
25
  LIGHT_SCOPE_REJECTED: 'light-scope-rejected',
86
- /**
87
- * An operator overrode a Story-scope code-review critical blocker with
88
- * `--override-review-block <reason>`. Deliberately its own
89
- * bucket: this is the one signal that says a gate's verdict was rejected by
90
- * a human who then shipped anyway, so a rising `occurrences` count is direct
91
- * evidence the gate is miscalibrated rather than the code being bad. It is
92
- * *not* `TOOL_DEGRADED` — the tool ran fine and produced a verdict; what
93
- * failed was the verdict's usefulness.
94
- */
26
+ /** A human shipped over a review blocker; a rising count means miscalibration. */
95
27
  REVIEW_BLOCK_OVERRIDDEN: 'review-block-overridden',
96
28
  });
97
29
 
98
30
  /**
99
- * The friction category one light-path refusal files under.
100
- *
101
- * `LIGHT_SCOPE_REJECTED` alone used to be the category for every refusal, and
102
- * the retro composer aggregates, de-duplicates and labels on the category
103
- * string ALONE — so an empty-diff refusal and a `public-api` sensitive-path
104
- * refusal landed in one bucket and filed one "recurred 2 times across 2
105
- * Stories" follow-up whose two occurrences had nothing in common but the
106
- * category (issue #5237; consumer Beestera/swarm-os#2408). The roll-up's shape
107
- * fingerprint could not separate them either: it hashes detail KEYS, and every
108
- * refusal carries an identical key set.
109
- *
110
- * Encoding the refusal class in the category is what splits them, and it
111
- * splits them in every consumer at once — bucket aggregation, the graduator's
112
- * idempotency marker and the `friction::<category>` label all read this one
113
- * string. N refusals of the SAME class still coalesce, which is the recurrence
114
- * evidence the light ceilings are recalibrated from. New categories need no
115
- * seeding: the graduator mints missing `friction::*` labels before filing.
116
- *
117
- * A class-less refusal keeps the bare category unchanged — that is the
118
- * suitability gate, which refuses a prompt before any diff exists and so has
119
- * no diff-derived class to carry.
31
+ * The refusal class rides in the category because aggregation, graduator
32
+ * idempotency and the `friction::*` label all key on it; a class-less
33
+ * refusal keeps the bare category.
120
34
  *
121
35
  * @param {string|null} [refusalClass] A
122
36
  * {@link module:lib/orchestration/light-suitability.LIGHT_REFUSAL_CLASSES}
@@ -150,19 +64,15 @@ function positiveIntOrNull(value) {
150
64
  }
151
65
 
152
66
  /**
153
- * Append one runtime-derived `friction` record to the Story's signals
154
- * stream. Best-effort: never throws, never rejects.
155
- *
156
- * `epicId` defaults to `null` (the standalone-Story stream) because that is
157
- * where v2 Stories live and where the roll-up reads.
67
+ * Append one `friction` record. Never throws.
158
68
  *
159
69
  * @param {object} args
160
70
  * @param {number} args.storyId
161
71
  * @param {number|null} [args.epicId]
162
- * @param {string} args.category One of {@link RUNTIME_FRICTION_CATEGORIES}.
163
- * @param {string} args.tool Emitting surface, for `emitter.tool`.
164
- * @param {object} [args.details] Kind-specific payload (always an object).
165
- * @param {object} [args.config] Resolved config (for `tempRoot`).
72
+ * @param {string} args.category
73
+ * @param {string} args.tool
74
+ * @param {object} [args.details]
75
+ * @param {object} [args.config]
166
76
  * @returns {Promise<boolean>} true when a record was appended.
167
77
  */
168
78
  export async function emitRuntimeFriction({
@@ -175,8 +85,6 @@ export async function emitRuntimeFriction({
175
85
  } = {}) {
176
86
  const sid = positiveIntOrNull(storyId);
177
87
  if (sid === null) {
178
- // No Story context → no stream to write to. Not an error: some close
179
- // paths (a usage error before the id is parsed) genuinely have none.
180
88
  return false;
181
89
  }
182
90
  if (typeof category !== 'string' || category.trim() === '') {
@@ -190,8 +98,6 @@ export async function emitRuntimeFriction({
190
98
  ts: new Date().toISOString(),
191
99
  epicId: positiveIntOrNull(epicId),
192
100
  storyId: sid,
193
- // 2-tier hierarchy (Epic #3163): no Task tier. Retained for schema
194
- // compatibility and always null — mirrors diagnose-friction.js.
195
101
  taskId: null,
196
102
  category: category.trim(),
197
103
  emitter: { tool: tool || 'runtime-friction' },
@@ -206,9 +112,6 @@ export async function emitRuntimeFriction({
206
112
  config,
207
113
  });
208
114
  } catch (err) {
209
- // `appendSignal` already swallows its own I/O failures; this catch is
210
- // defense in depth so a surprise (a poisoned config, a throwing
211
- // validator) still cannot take down the path being observed.
212
115
  Logger.warn(
213
116
  `[runtime-friction] append failed for Story #${sid} (${category}): ${
214
117
  err instanceof Error ? err.message : String(err)
@@ -219,25 +122,13 @@ export async function emitRuntimeFriction({
219
122
  }
220
123
 
221
124
  /**
222
- * Emit the recovery counterpart of a `story-blocked` record when a Story
223
- * leaves `agent::blocked` for an active state (Story #4622).
224
- *
225
- * A transient block that self-resolves — lease contention or a stale label
226
- * read under concurrent shared-checkout pressure (swarm-os friction #581) —
227
- * still fired a `story-blocked` record at the block flip, which the retro
228
- * composer counts toward the `story-blocked` recurrence total exactly like a
229
- * terminal block. This emits a companion `story-blocked` record carrying the
230
- * `details.recovered: true` discriminator, so the composer can net the whole
231
- * incident out (see `retro-proposals.js`). The category is deliberately kept
232
- * as `story-blocked` rather than a new bucket: a distinct category would
233
- * itself aggregate into a routable proposal, re-introducing the noise.
234
- *
235
- * Best-effort; never throws.
125
+ * A `recovered: true` `story-blocked` record on leaving `agent::blocked`, so
126
+ * the retro nets the block out (same category, or it would aggregate itself).
236
127
  *
237
128
  * @param {object} args
238
129
  * @param {number} args.storyId
239
- * @param {string} [args.fromState] The state parked at (`agent::blocked`).
240
- * @param {string} [args.toState] The active state recovered into.
130
+ * @param {string} [args.fromState]
131
+ * @param {string} [args.toState]
241
132
  * @param {object} [args.config]
242
133
  * @returns {Promise<boolean>} true when a record was appended.
243
134
  */
@@ -261,56 +152,16 @@ export async function emitBlockRecoveredFriction({
261
152
  }
262
153
 
263
154
  /**
264
- * Emit the recovery counterpart of an earlier friction record in `category`
265
- * when a Story ultimately lands, netting a transient incident out of the
266
- * retro (generalized from the `close-failed`-only emitter of Story #4649 by
267
- * Story #4654).
268
- *
269
- * An incident that fires once — a transient block, a CI/lease/GitHub fault at
270
- * close, a merge wait that outran one window — but is provably resolved by the
271
- * time the Story lands still left an un-netted record on the stream, which the
272
- * composer counts exactly like an incident that never recovered. This appends
273
- * the companion record carrying the `recovered: true` discriminator in the
274
- * **same** `category` (a distinct bucket would itself aggregate into a routable
275
- * proposal, re-introducing the noise), so `netOutRecoveredIncidents` /
276
- * `deriveUnresolvedBlockedEvents` in `retro-proposals.js` can cancel the whole
277
- * `(category, storyId)` incident out.
278
- *
279
- * **Why this is not emitted from `frictionForTerminal`.** A `landed` terminal
280
- * envelope is emitted at the very END of close — *after* the post-land tail
281
- * has already gathered the signal stream and filed its follow-ups. A marker
282
- * written there would arrive too late to net anything out of the run that
283
- * produced it. So the emit hangs off `runPostLandTail`, which is the single
284
- * shared land point (reached from both the in-close land and the standalone
285
- * `single-story-confirm-merge.js` resume) and runs BEFORE follow-up capture.
286
- * The tail runs *because* the PR merged, so every incident on the stream is
287
- * provably resolved at that point.
288
- *
289
- * **Conditional on an actual incident.** The marker is appended only when the
290
- * Story's stream already carries an un-recovered record in `category`. Emitting
291
- * unconditionally on every land would write a category-mislabelled row for
292
- * Stories that never had the incident — and, because the netting is per
293
- * `(category, storyId)` over the cumulative stream, that spurious marker would
294
- * suppress the Story's whole bucket for `category`, making it un-routable at
295
- * story scope for a Story that never hit the incident at all.
296
- *
297
- * What this guard does NOT do is bound the netting once a *legitimate* marker
298
- * exists. The netting inherits the Story #4622 coarsening — per
299
- * `(category, storyId)` across the whole stream, not 1:1 pairing — so a
300
- * later, genuinely un-landed record in `category` for a Story that already
301
- * recovered once is still netted away, and does not even reach `discarded`.
302
- * Reaching that needs a re-close after a land (a confirm-merge resume, or a
303
- * close after a revert). Deliberate, inherited, and called out here rather
304
- * than papered over: an aggregate is a routing heuristic, not an incident
305
- * ledger.
306
- *
307
- * Best-effort; never throws. A read failure yields no marker (the incident
308
- * stays counted) rather than a speculative write.
155
+ * On land, emit a `recovered: true` marker in `category` so the retro nets
156
+ * the `(category, storyId)` incident out. Hung off `runPostLandTail` because
157
+ * the `landed` envelope arrives after follow-ups are already filed. Only
158
+ * emitted over an existing un-recovered record — otherwise it would suppress
159
+ * a bucket the Story never hit. A read failure emits nothing.
309
160
  *
310
161
  * @param {object} args
311
162
  * @param {number} args.storyId
312
- * @param {string} args.category One of {@link RUNTIME_FRICTION_CATEGORIES}.
313
- * @param {string} [args.tool] Emitting surface (default `runPostLandTail`).
163
+ * @param {string} args.category
164
+ * @param {string} [args.tool]
314
165
  * @param {object} [args.config]
315
166
  * @returns {Promise<boolean>} true when a record was appended.
316
167
  */
@@ -352,7 +203,6 @@ export async function emitRecoveredFrictionMarker({
352
203
  );
353
204
  return false;
354
205
  }
355
- // Nothing to cancel, or already cancelled — a second marker would be noise.
356
206
  if (!incident || recovered) return false;
357
207
 
358
208
  return emitRuntimeFriction({
@@ -365,12 +215,6 @@ export async function emitRecoveredFrictionMarker({
365
215
  }
366
216
 
367
217
  /**
368
- * Emit the recovery counterpart of a `close-failed` record when a Story's
369
- * close ultimately lands (Story #4649). Thin wrapper over
370
- * {@link emitRecoveredFrictionMarker} bound to the `close-failed` category —
371
- * retained as its own export so the post-land seam that injects it stays
372
- * stable.
373
- *
374
218
  * @param {object} args
375
219
  * @param {number} args.storyId
376
220
  * @param {object} [args.config]
@@ -385,39 +229,12 @@ export async function emitCloseRecoveredFriction({ storyId, config } = {}) {
385
229
  }
386
230
 
387
231
  /**
388
- * Normalize one raw signals-stream row into the shape the retro composer
389
- * consumes, or `null` when the row carries no usable category.
390
- *
391
- * Single-homed because BOTH production gathers need it identically —
392
- * `gatherStoryFrictionSignals` (story scope) and `executeFollowUpRollup`
393
- * (run scope) — and the bug this exists to prevent is precisely the two of
394
- * them drifting: they each independently flattened rows to
395
- * `{ category, source }`, dropping the `storyId` / `details` the composer's
396
- * recovery-netting keys on, which left that netting unreachable on real data
397
- * while its unit tests stayed green (Story #4649).
398
- *
399
- * The row's own `storyId` wins over `fallbackStoryId` so a stream carrying
400
- * foreign rows attributes each one correctly; the fallback covers records
401
- * written before the field existed.
232
+ * One raw row → the retro composer's shape (`null` without a category).
233
+ * Shared by both gathers so they cannot drift; dropping `storyId`/`details`
234
+ * silently breaks recovery netting. `tool` is descriptive, never a routing key.
402
235
  *
403
- * `tool` (from `emitter.tool`) joined the shape in Story #4824. `category`
404
- * remains the routing and de-duplication unit — it is what titles and
405
- * de-duplicates a filed issue — but a roll-up that discards a candidate has
406
- * to be able to *name* it, and a bare category cannot distinguish a
407
- * `tool-degraded` from the scoped-lint runner from one out of lens
408
- * materialization. It is descriptive, never a routing key.
409
- *
410
- * `ts` joined the shape in Story #4850, and it joined it **here** rather than
411
- * in a second read beside the run-scope gather. The composer had no notion of
412
- * *when* its corpus happened, so it borrowed the triggering run as the window
413
- * and titled every proposal with a claim the evidence block below it already
414
- * contradicted. Carrying the timestamp through the one shared normalizer is
415
- * what lets the recurrence window be both bounded and describable; re-reading
416
- * it beside one of the two gathers is precisely the drift that made the
417
- * recovery-netting unreachable in Story #4649.
418
- *
419
- * @param {unknown} parsed One parsed NDJSON row.
420
- * @param {number} fallbackStoryId Stream owner, used when the row has none.
236
+ * @param {unknown} parsed
237
+ * @param {number} fallbackStoryId Used when the row has no `storyId`.
421
238
  * @returns {{ category: string, source: 'framework'|'consumer', storyId: number, tool: string, ts: string|null, details: object }|null}
422
239
  */
423
240
  export function normalizeGatheredSignal(parsed, fallbackStoryId) {
@@ -444,13 +261,8 @@ export function normalizeGatheredSignal(parsed, fallbackStoryId) {
444
261
  }
445
262
 
446
263
  /**
447
- * The row's `ts` when it is a string a `Date` can read, else `null`.
448
- *
449
- * `signal-event.schema.json` requires `ts`, and both producers stamp
450
- * `new Date().toISOString()` — but the gathers read whatever survives on disk,
451
- * including rows a truncated write left half-formed. Resolving to `null`
452
- * rather than guessing a time is what lets the recurrence window exclude an
453
- * undateable row explicitly instead of aging it in as "recent".
264
+ * `null` for an unreadable `ts`, so the row is excluded from the recurrence
265
+ * window rather than aged in as recent.
454
266
  *
455
267
  * @param {unknown} value
456
268
  * @returns {string|null}
@@ -462,16 +274,8 @@ function parsableTimestamp(value) {
462
274
  }
463
275
 
464
276
  /**
465
- * Pure predicate: is this signal a recovery marker for its own category?
466
- * Shared with the retro composer so the "recovered" discriminator is read
467
- * from one place.
468
- *
469
- * **Category-agnostic by design (Story #4649).** The predicate used to hard-
470
- * code `story-blocked`, which meant every new category needing recovery
471
- * semantics had to re-implement the netting. A record is a recovery marker
472
- * when it carries a usable `category` and `details.recovered === true`; the
473
- * composer nets per `(category, storyId)`, so a marker can only ever cancel
474
- * records in its OWN bucket.
277
+ * Category-agnostic recovery-marker test; a marker only cancels its own
278
+ * `(category, storyId)` bucket.
475
279
  *
476
280
  * @param {object} signal
477
281
  * @returns {boolean}
@@ -489,41 +293,11 @@ export function isRecoveredSignal(signal) {
489
293
  }
490
294
 
491
295
  /**
492
- * Decide whether a `story-deliver-terminal` envelope is worth a friction
493
- * record, and describe it. **Pure** — no I/O — so the (interesting) policy
494
- * is unit-testable without touching disk.
495
- *
496
- * The partition is deliberate; each observable is emitted from exactly ONE
497
- * place, so one incident never double-counts into `occurrences: 2` and
498
- * fabricates a filed proposal out of a single event:
499
- *
500
- * - `blocked` → **null here.** Every blocked terminal flips the Story to
501
- * `agent::blocked` (`confirm-merge.js`, both the `merge.unlanded` and
502
- * `merge.flip-failed` paths), and that transition is instrumented at the
503
- * canonical mutator (`ticketing/transition.js`). Emitting here as well
504
- * would count the same block twice.
505
- * - `landed` → null. Nothing happened worth a retro.
506
- * - `failed` → friction. A close that ended non-zero.
507
- * - `pending` → friction **only when the cumulative wait budget is provably
508
- * exhausted** (`waitBudget.cumulativeSeconds >= waitBudget.maxBudgetSeconds`).
509
- * A `pending` return is reached at the per-invocation `maxWaitSeconds`
510
- * bound (`phases/confirm-merge.js`); genuine cumulative exhaustion returns
511
- * earlier as a **blocked** terminal via `blockOnUnlanded` (Story #4654).
512
- * So a routine long-CI window rollover under budget is NOT exhaustion and
513
- * emits nothing — its category name would otherwise assert an exhaustion
514
- * that did not occur. Only the residual case the merge-wait guard cannot
515
- * suppress — a merge that genuinely spends its whole budget and lands on a
516
- * later resume — reaches here. A missing or non-numeric `cumulativeSeconds`
517
- * / `maxBudgetSeconds` means exhaustion cannot be proven → emit nothing. A
518
- * `pending` with **no** `waitBudget` is the `--no-wait-merge` /
519
- * operator-merge path, where the human deliberately owns the land and
520
- * nothing is broken — flagging it would train operators to ignore the
521
- * channel.
522
- *
523
- * Deliberately **not exported**: it is this module's internal policy, and
524
- * `emitTerminalFriction` is the contract callers (and tests) exercise. An
525
- * export solely for testability would be production-dead code — the
526
- * `--production` dead-exports ratchet exists to catch exactly that.
296
+ * The friction a terminal envelope implies; each incident is emitted from one
297
+ * place only. `blocked` → null (the transition mutator emits it); `failed` →
298
+ * `close-failed`; `pending` → `merge-wait-exhausted` only when the cumulative
299
+ * budget is provably spent — a routine window rollover or an operator-merge
300
+ * `pending` (no `waitBudget`) emits nothing.
527
301
  *
528
302
  * @param {object} envelope A `story-deliver-terminal` envelope.
529
303
  * @returns {{ category: string, details: object }|null}
@@ -543,12 +317,6 @@ function frictionForTerminal(envelope) {
543
317
  }
544
318
 
545
319
  if (status === 'pending' && waitBudget) {
546
- // Only a PROVEN cumulative-budget exhaustion is friction. The `pending`
547
- // return is reached at the per-invocation `maxWaitSeconds` bound, not at
548
- // the cumulative `maxBudgetSeconds` (that returns a blocked terminal
549
- // earlier), so a routine window rollover carries `cumulativeSeconds`
550
- // still under budget — emit nothing. A missing/non-numeric field means
551
- // exhaustion cannot be proven, which is likewise not a record.
552
320
  const cumulativeSeconds = Number(waitBudget.cumulativeSeconds);
553
321
  const maxBudgetSeconds = Number(waitBudget.maxBudgetSeconds);
554
322
  if (
@@ -575,22 +343,12 @@ function frictionForTerminal(envelope) {
575
343
  }
576
344
 
577
345
  /**
578
- * Emit the friction record (if any) implied by a terminal envelope.
579
- * Best-effort; never throws.
580
- *
581
- * `tool` is the CALLER's name, threaded in rather than assumed: TWO CLIs emit
582
- * terminal envelopes — `single-story-close.js` (plus its runner) and
583
- * `single-story-confirm-merge.js` — and `retro-proposals.js` reads
584
- * `emitter.tool` (via {@link normalizeGatheredSignal}) to name the surface a
585
- * candidate came from, so hard-coding the close name here attributed every
586
- * confirm-merge record to a CLI that never ran and misdirected the follow-up.
587
- * Both callers already declare their name once via `runAsCli({ source })`;
588
- * pass that same string. The default keeps the close paths — the original
589
- * callers, which pass none — emitting exactly what they always did.
346
+ * `tool` must be the calling CLI's name: two CLIs emit terminal envelopes and
347
+ * the retro attributes by `emitter.tool`.
590
348
  *
591
349
  * @param {object} args
592
350
  * @param {object} args.envelope
593
- * @param {string} [args.tool] Emitting surface (default `single-story-close`).
351
+ * @param {string} [args.tool]
594
352
  * @param {object} [args.config]
595
353
  * @returns {Promise<boolean>} true when a record was appended.
596
354
  */
@@ -1,27 +1,7 @@
1
1
  /**
2
- * signal-validator.js — write-time validation of NDJSON signal records
3
- * against the canonical `signal-event.schema.json` (Epic #4406 /
4
- * Story #4413).
5
- *
6
- * The signals writer calls {@link validateSignal} before appending a
7
- * record so a schema-invalid line is dropped with a `Logger.warn` naming
8
- * the violating field rather than polluting the stream (and defeating the
9
- * downstream consumers that assume the canonical shape). Validation is
10
- * best-effort: the writer contract (Tech Spec #1032) is preserved —
11
- * observability MUST NOT throw into the runner, so every helper here
12
- * swallows its own faults and degrades to "treat as valid" only when the
13
- * validator itself cannot be constructed.
14
- *
15
- * The AJV instance compiles the on-disk schema **once** at module load so
16
- * the writer and the contract test validate against the exact same
17
- * document (no hand-rolled drift). `strict: false` matches the repo's
18
- * other draft-07 validators (see `tests/schemas/signal-schemas.test.js`).
19
- *
20
- * Story #5003 deleted the persisted per-Epic reject tally
21
- * (`temp/run-<eid>/signal-rejects.json`) and its `readSignalRejectCount`
22
- * reader: the tally was keyed on a positive `epicId`, and v2 Stories are
23
- * standalone, so nothing ever wrote a row and nothing could ever read one.
24
- * Write-time validation itself is untouched.
2
+ * signal-validator.js — write-time validation of signal records against the
3
+ * on-disk `signal-event.schema.json`, compiled once so the writer and the
4
+ * contract test validate against the same document. Never throws.
25
5
  */
26
6
 
27
7
  import { readFileSync } from 'node:fs';
@@ -44,10 +24,8 @@ const SCHEMA_PATH = path.resolve(
44
24
  );
45
25
 
46
26
  /**
47
- * Compile the signal-event schema once. Returns `null` when the schema
48
- * cannot be read or compiled — the caller then treats every record as
49
- * valid (fail-open) so a packaging error never silently drops all
50
- * signals.
27
+ * `null` when the schema cannot be compiled: validation then fails open so a
28
+ * packaging error never drops every signal.
51
29
  *
52
30
  * @returns {import('ajv').ValidateFunction | null}
53
31
  */
@@ -70,10 +48,6 @@ function buildValidator() {
70
48
  const _validate = buildValidator();
71
49
 
72
50
  /**
73
- * Derive a human-readable "violating field" label from the first AJV
74
- * error. Prefers the missing property name (required errors) or the
75
- * instance path, falling back to the raw message.
76
- *
77
51
  * @param {import('ajv').ErrorObject[] | null | undefined} errors
78
52
  * @returns {string}
79
53
  */
@@ -96,12 +70,6 @@ function violatingFieldOf(errors) {
96
70
  }
97
71
 
98
72
  /**
99
- * Validate a signal record against the canonical schema.
100
- *
101
- * Fail-open: when the validator could not be compiled the record is
102
- * reported valid (the writer keeps working). A non-object record is
103
- * reported invalid without invoking AJV.
104
- *
105
73
  * @param {unknown} record
106
74
  * @returns {{ valid: boolean, violatingField: string|null, message: string|null }}
107
75
  */