mandrel 2.60.0 → 2.61.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (661) hide show
  1. package/.agents/README.md +10 -10
  2. package/.agents/agents/story-worker.md +1 -1
  3. package/.agents/docs/agentrc-reference.json +4 -82
  4. package/.agents/docs/configuration.md +20 -87
  5. package/.agents/docs/workflows.md +1 -1
  6. package/.agents/instructions.md +1 -3
  7. package/.agents/rules/gherkin-standards.md +4 -0
  8. package/.agents/schemas/agentrc.schema.json +11 -486
  9. package/.agents/schemas/story-deliver-terminal.schema.json +10 -0
  10. package/.agents/schemas/validation-evidence.schema.json +2 -1
  11. package/.agents/scripts/README.md +14 -14
  12. package/.agents/scripts/acceptance-eval.js +32 -164
  13. package/.agents/scripts/agents-bootstrap-github.js +27 -129
  14. package/.agents/scripts/apply-quality-bootstrap.js +4 -40
  15. package/.agents/scripts/audit-baselines.js +6 -27
  16. package/.agents/scripts/audit-labels-bootstrap.js +5 -29
  17. package/.agents/scripts/audit-to-stories.js +91 -361
  18. package/.agents/scripts/boot-sweep.js +19 -72
  19. package/.agents/scripts/bootstrap.js +74 -395
  20. package/.agents/scripts/ceremony-derive.js +9 -45
  21. package/.agents/scripts/check-arch-cycles.js +14 -64
  22. package/.agents/scripts/check-baselines.js +8 -48
  23. package/.agents/scripts/check-context-budget.js +46 -172
  24. package/.agents/scripts/check-cyclomatic.js +12 -44
  25. package/.agents/scripts/check-dead-exports.js +13 -64
  26. package/.agents/scripts/check-doc-links.js +38 -186
  27. package/.agents/scripts/check-gherkin-corpus.js +24 -127
  28. package/.agents/scripts/check-test-temp-hygiene.js +28 -169
  29. package/.agents/scripts/coverage-capture.js +32 -99
  30. package/.agents/scripts/deliver-light.js +14 -101
  31. package/.agents/scripts/deliver-recover.js +6 -42
  32. package/.agents/scripts/deliver-run.js +36 -133
  33. package/.agents/scripts/diagnose-friction.js +24 -116
  34. package/.agents/scripts/drain-pending-cleanup.js +1 -1
  35. package/.agents/scripts/evidence-gate.js +23 -85
  36. package/.agents/scripts/file-ci-gap.js +10 -50
  37. package/.agents/scripts/generate-config-docs.js +30 -170
  38. package/.agents/scripts/generate-lens-checklists.js +8 -52
  39. package/.agents/scripts/generate-skills-index.js +14 -112
  40. package/.agents/scripts/generate-workflows-doc.js +10 -70
  41. package/.agents/scripts/git-cleanup.js +2 -34
  42. package/.agents/scripts/lib/Graph.js +24 -81
  43. package/.agents/scripts/lib/ITicketingProvider.js +47 -143
  44. package/.agents/scripts/lib/Logger.js +14 -76
  45. package/.agents/scripts/lib/audit-baselines/engine.js +11 -31
  46. package/.agents/scripts/lib/audit-baselines/gate-surface.js +3 -17
  47. package/.agents/scripts/lib/audit-baselines/headroom.js +4 -20
  48. package/.agents/scripts/lib/audit-baselines/hotspots.js +3 -15
  49. package/.agents/scripts/lib/audit-baselines/kinds.js +23 -89
  50. package/.agents/scripts/lib/audit-baselines/outliers.js +6 -23
  51. package/.agents/scripts/lib/audit-baselines/read.js +3 -16
  52. package/.agents/scripts/lib/audit-baselines/staleness.js +7 -26
  53. package/.agents/scripts/lib/audit-baselines/surface-entry.js +7 -28
  54. package/.agents/scripts/lib/audit-baselines/trend.js +7 -20
  55. package/.agents/scripts/lib/audit-baselines/weights.js +9 -37
  56. package/.agents/scripts/lib/audit-suite/audit-rules-reader.js +3 -18
  57. package/.agents/scripts/lib/audit-suite/checklist-threading.js +26 -124
  58. package/.agents/scripts/lib/audit-suite/dispatch-checklist.js +14 -45
  59. package/.agents/scripts/lib/audit-suite/findings.js +12 -52
  60. package/.agents/scripts/lib/audit-suite/frontmatter.js +5 -29
  61. package/.agents/scripts/lib/audit-suite/index.js +1 -15
  62. package/.agents/scripts/lib/audit-suite/lens-checklist.js +10 -45
  63. package/.agents/scripts/lib/audit-suite/lens-diff-floor.js +11 -76
  64. package/.agents/scripts/lib/audit-suite/runner.js +13 -43
  65. package/.agents/scripts/lib/audit-suite/selector.js +49 -349
  66. package/.agents/scripts/lib/audit-suite/substitutions.js +12 -40
  67. package/.agents/scripts/lib/audit-suite/workflow-loader.js +3 -15
  68. package/.agents/scripts/lib/audit-to-stories/audit-label-taxonomy.js +11 -73
  69. package/.agents/scripts/lib/audit-to-stories/audit-lenses.js +8 -37
  70. package/.agents/scripts/lib/audit-to-stories/build-story-body.js +25 -143
  71. package/.agents/scripts/lib/audit-to-stories/dedupe-against-github.js +14 -80
  72. package/.agents/scripts/lib/audit-to-stories/epic-grouping-directive.js +4 -18
  73. package/.agents/scripts/lib/audit-to-stories/finding-adapter.js +7 -40
  74. package/.agents/scripts/lib/audit-to-stories/group-findings.js +9 -39
  75. package/.agents/scripts/lib/audit-to-stories/issue-corpus.js +10 -66
  76. package/.agents/scripts/lib/audit-to-stories/issue-index.js +6 -30
  77. package/.agents/scripts/lib/audit-to-stories/issues-file.js +6 -36
  78. package/.agents/scripts/lib/audit-to-stories/ledger-commit.js +17 -69
  79. package/.agents/scripts/lib/audit-to-stories/ledger-pr.js +17 -85
  80. package/.agents/scripts/lib/audit-to-stories/ledger-record.js +10 -48
  81. package/.agents/scripts/lib/audit-to-stories/parse-audit-md.js +38 -146
  82. package/.agents/scripts/lib/audit-to-stories/seed-from-findings.js +7 -42
  83. package/.agents/scripts/lib/audit-to-stories/wire-dependencies.js +10 -57
  84. package/.agents/scripts/lib/baseline-loader.js +12 -51
  85. package/.agents/scripts/lib/baseline-schema-registry.js +5 -22
  86. package/.agents/scripts/lib/baselines/component-matcher.js +3 -12
  87. package/.agents/scripts/lib/baselines/components.js +10 -61
  88. package/.agents/scripts/lib/baselines/coverage-updater-cli.js +7 -36
  89. package/.agents/scripts/lib/baselines/crap-preview-incremental.js +5 -21
  90. package/.agents/scripts/lib/baselines/crap-preview-scan.js +19 -45
  91. package/.agents/scripts/lib/baselines/crap-updater-cli.js +16 -65
  92. package/.agents/scripts/lib/baselines/diff-scope-cli.js +5 -33
  93. package/.agents/scripts/lib/baselines/duplication-scanner.js +11 -60
  94. package/.agents/scripts/lib/baselines/env-overrides.js +12 -67
  95. package/.agents/scripts/lib/baselines/envelope.js +13 -129
  96. package/.agents/scripts/lib/baselines/exit-codes.js +6 -49
  97. package/.agents/scripts/lib/baselines/git-base.js +23 -142
  98. package/.agents/scripts/lib/baselines/kernel.js +11 -111
  99. package/.agents/scripts/lib/baselines/kinds/_crap-new-method-gate.js +9 -47
  100. package/.agents/scripts/lib/baselines/kinds/_crap-read.js +8 -51
  101. package/.agents/scripts/lib/baselines/kinds/_shared-metric.js +7 -62
  102. package/.agents/scripts/lib/baselines/kinds/bundle-size.js +8 -29
  103. package/.agents/scripts/lib/baselines/kinds/coverage.js +3 -15
  104. package/.agents/scripts/lib/baselines/kinds/crap.js +94 -415
  105. package/.agents/scripts/lib/baselines/kinds/duplication.js +4 -30
  106. package/.agents/scripts/lib/baselines/kinds/kind-factory.js +7 -53
  107. package/.agents/scripts/lib/baselines/kinds/maintainability.js +15 -80
  108. package/.agents/scripts/lib/baselines/kinds/mutation.js +12 -72
  109. package/.agents/scripts/lib/baselines/maintainability-baseline-io.js +4 -11
  110. package/.agents/scripts/lib/baselines/merge-envelopes.js +30 -146
  111. package/.agents/scripts/lib/baselines/path-canon.js +19 -128
  112. package/.agents/scripts/lib/baselines/preview-gates.js +8 -37
  113. package/.agents/scripts/lib/baselines/reader.js +14 -107
  114. package/.agents/scripts/lib/baselines/refresh-service.js +35 -252
  115. package/.agents/scripts/lib/baselines/scope.js +11 -135
  116. package/.agents/scripts/lib/baselines/writer.js +16 -149
  117. package/.agents/scripts/lib/bdd-runner-detect.js +18 -113
  118. package/.agents/scripts/lib/bdd-scenario-budget.js +9 -36
  119. package/.agents/scripts/lib/bdd-scenario-scanner.js +11 -73
  120. package/.agents/scripts/lib/bdd-step-index.js +26 -100
  121. package/.agents/scripts/lib/bootstrap/baseline-merge-driver.js +23 -103
  122. package/.agents/scripts/lib/bootstrap/branch-protection.js +2 -5
  123. package/.agents/scripts/lib/bootstrap/commit-push.js +12 -50
  124. package/.agents/scripts/lib/bootstrap/gh-preflight.js +14 -101
  125. package/.agents/scripts/lib/bootstrap/hitl-confirm.js +5 -30
  126. package/.agents/scripts/lib/bootstrap/install-ledger.js +17 -73
  127. package/.agents/scripts/lib/bootstrap/issue-forms-template.js +17 -121
  128. package/.agents/scripts/lib/bootstrap/manifest.js +15 -86
  129. package/.agents/scripts/lib/bootstrap/merge-methods.js +4 -33
  130. package/.agents/scripts/lib/bootstrap/preflight.js +12 -61
  131. package/.agents/scripts/lib/bootstrap/project-bootstrap.js +34 -235
  132. package/.agents/scripts/lib/bootstrap/prompt.js +21 -129
  133. package/.agents/scripts/lib/bootstrap/quality-bootstrap.js +27 -141
  134. package/.agents/scripts/lib/bootstrap/summary.js +1 -8
  135. package/.agents/scripts/lib/bootstrap/workflow-audit.js +11 -84
  136. package/.agents/scripts/lib/branch-name-guard.js +4 -23
  137. package/.agents/scripts/lib/changed-files.js +31 -143
  138. package/.agents/scripts/lib/checks/core-bare-clean.js +4 -24
  139. package/.agents/scripts/lib/checks/index.js +18 -101
  140. package/.agents/scripts/lib/checks/loop-health.js +11 -53
  141. package/.agents/scripts/lib/checks/state.js +16 -91
  142. package/.agents/scripts/lib/checks/story-init-not-backgrounded.js +10 -61
  143. package/.agents/scripts/lib/checks/subagent-agent-tool-required.js +14 -83
  144. package/.agents/scripts/lib/child-exec.js +39 -108
  145. package/.agents/scripts/lib/cli/standard-args.js +9 -116
  146. package/.agents/scripts/lib/cli-args.js +31 -146
  147. package/.agents/scripts/lib/cli-usage.js +5 -27
  148. package/.agents/scripts/lib/cli-utils.js +2 -12
  149. package/.agents/scripts/lib/close-validation/commands.js +13 -76
  150. package/.agents/scripts/lib/close-validation/gates.js +92 -331
  151. package/.agents/scripts/lib/close-validation/process.js +121 -151
  152. package/.agents/scripts/lib/close-validation/projections/advisories.js +5 -31
  153. package/.agents/scripts/lib/close-validation/projections/crap.js +19 -67
  154. package/.agents/scripts/lib/close-validation/projections/head-sha.js +1 -17
  155. package/.agents/scripts/lib/close-validation/projections/inputs.js +4 -34
  156. package/.agents/scripts/lib/close-validation/projections/maintainability.js +11 -58
  157. package/.agents/scripts/lib/close-validation/runner.js +53 -110
  158. package/.agents/scripts/lib/command-header.js +6 -28
  159. package/.agents/scripts/lib/config/acceptance-eval.js +4 -30
  160. package/.agents/scripts/lib/config/baselines.js +3 -14
  161. package/.agents/scripts/lib/config/ci.js +8 -38
  162. package/.agents/scripts/lib/config/commands.js +1 -15
  163. package/.agents/scripts/lib/config/defaults.js +4 -33
  164. package/.agents/scripts/lib/config/delivery-routing.js +6 -35
  165. package/.agents/scripts/lib/config/explain.js +9 -80
  166. package/.agents/scripts/lib/config/gates/coverage.schema.js +0 -12
  167. package/.agents/scripts/lib/config/gates/crap-incremental-coverage.schema.js +2 -30
  168. package/.agents/scripts/lib/config/gates/crap.schema.js +1 -34
  169. package/.agents/scripts/lib/config/gates/duplication.schema.js +1 -8
  170. package/.agents/scripts/lib/config/gates/index.js +2 -17
  171. package/.agents/scripts/lib/config/gates/maintainability.schema.js +1 -20
  172. package/.agents/scripts/lib/config/gates/mutation.schema.js +1 -7
  173. package/.agents/scripts/lib/config/gates/shared.js +4 -64
  174. package/.agents/scripts/lib/config/github.js +4 -22
  175. package/.agents/scripts/lib/config/limits.js +4 -57
  176. package/.agents/scripts/lib/config/paths.js +2 -21
  177. package/.agents/scripts/lib/config/qa.js +4 -38
  178. package/.agents/scripts/lib/config/quality.js +76 -432
  179. package/.agents/scripts/lib/config/runners.js +12 -56
  180. package/.agents/scripts/lib/config/runtime.js +13 -57
  181. package/.agents/scripts/lib/config/shared.js +2 -16
  182. package/.agents/scripts/lib/config/sync-agentrc.js +9 -50
  183. package/.agents/scripts/lib/config/temp-paths.js +40 -280
  184. package/.agents/scripts/lib/config/validate-orchestration.js +5 -17
  185. package/.agents/scripts/lib/config/worktree-isolation.js +9 -28
  186. package/.agents/scripts/lib/config-resolver.js +10 -52
  187. package/.agents/scripts/lib/config-schema-shared.js +1 -4
  188. package/.agents/scripts/lib/config-settings-schema-delivery.js +12 -294
  189. package/.agents/scripts/lib/config-settings-schema-quality.js +7 -219
  190. package/.agents/scripts/lib/config-settings-schema.js +37 -274
  191. package/.agents/scripts/lib/coverage-baseline.js +20 -110
  192. package/.agents/scripts/lib/coverage-capture-fullscope.js +12 -37
  193. package/.agents/scripts/lib/coverage-capture-incremental.js +12 -43
  194. package/.agents/scripts/lib/coverage-capture-usage.js +4 -24
  195. package/.agents/scripts/lib/coverage-capture.js +99 -224
  196. package/.agents/scripts/lib/coverage-utils.js +14 -79
  197. package/.agents/scripts/lib/cpu-pool.js +17 -123
  198. package/.agents/scripts/lib/crap-baseline-join.js +16 -88
  199. package/.agents/scripts/lib/crap-coordinates.js +6 -25
  200. package/.agents/scripts/lib/crap-engine.js +40 -153
  201. package/.agents/scripts/lib/crap-method-identity.js +16 -78
  202. package/.agents/scripts/lib/crap-utils.js +31 -155
  203. package/.agents/scripts/lib/cyclomatic-ceiling.js +14 -87
  204. package/.agents/scripts/lib/cyclomatic-scope.js +10 -50
  205. package/.agents/scripts/lib/dead-exports-knip.js +18 -56
  206. package/.agents/scripts/lib/dead-exports-mode.js +5 -24
  207. package/.agents/scripts/lib/degraded-mode.js +3 -26
  208. package/.agents/scripts/lib/dependency-parser.js +8 -40
  209. package/.agents/scripts/lib/dependency-version.js +13 -35
  210. package/.agents/scripts/lib/detect-package-manager.js +6 -36
  211. package/.agents/scripts/lib/doc-tiers.js +22 -126
  212. package/.agents/scripts/lib/duplicate-search.js +8 -72
  213. package/.agents/scripts/lib/env-loader.js +5 -27
  214. package/.agents/scripts/lib/error-redactor.js +6 -31
  215. package/.agents/scripts/lib/errors/index.js +2 -22
  216. package/.agents/scripts/lib/escomplex-ast-compat.js +22 -163
  217. package/.agents/scripts/lib/escomplex-kernel.js +21 -123
  218. package/.agents/scripts/lib/feedback-loop/graduator-core.js +93 -419
  219. package/.agents/scripts/lib/feedback-loop/prior-feedback-fetcher.js +20 -98
  220. package/.agents/scripts/lib/feedback-loop/retro-proposals-graduator.js +27 -151
  221. package/.agents/scripts/lib/findings/audit-ledger.js +23 -97
  222. package/.agents/scripts/lib/findings/classify-finding.js +14 -69
  223. package/.agents/scripts/lib/findings/promote-finding.js +14 -112
  224. package/.agents/scripts/lib/findings/provenance-field.js +11 -52
  225. package/.agents/scripts/lib/findings/route-finding.js +37 -255
  226. package/.agents/scripts/lib/findings/semantic-issue-search.js +14 -59
  227. package/.agents/scripts/lib/findings/severity.js +18 -104
  228. package/.agents/scripts/lib/format-generated-json.js +12 -44
  229. package/.agents/scripts/lib/full-suite-lock.js +160 -429
  230. package/.agents/scripts/lib/full-suite-queue.js +213 -0
  231. package/.agents/scripts/lib/gates/baseline-store.js +5 -9
  232. package/.agents/scripts/lib/gates/friction.js +1 -3
  233. package/.agents/scripts/lib/generated/agentrc-validator.js +2 -2
  234. package/.agents/scripts/lib/gh-exec.js +31 -259
  235. package/.agents/scripts/lib/git/cached-fetch.js +9 -52
  236. package/.agents/scripts/lib/git/sync-from-base.js +15 -107
  237. package/.agents/scripts/lib/git-branch-cleanup.js +14 -61
  238. package/.agents/scripts/lib/git-branch-lifecycle.js +16 -87
  239. package/.agents/scripts/lib/git-utils.js +37 -161
  240. package/.agents/scripts/lib/github/framework-repo.js +8 -71
  241. package/.agents/scripts/lib/github-url.js +2 -17
  242. package/.agents/scripts/lib/import-graph.js +11 -38
  243. package/.agents/scripts/lib/install-cmd-parser.js +4 -13
  244. package/.agents/scripts/lib/json-utils.js +3 -18
  245. package/.agents/scripts/lib/label-constants.js +16 -111
  246. package/.agents/scripts/lib/label-taxonomy.js +4 -30
  247. package/.agents/scripts/lib/maintainability-engine.js +12 -80
  248. package/.agents/scripts/lib/maintainability-unscorable.js +5 -25
  249. package/.agents/scripts/lib/maintainability-utils.js +16 -92
  250. package/.agents/scripts/lib/mandrel-catalog.js +12 -70
  251. package/.agents/scripts/lib/notifications/notifier.js +13 -38
  252. package/.agents/scripts/lib/npm-scripts.js +4 -23
  253. package/.agents/scripts/lib/observability/metrics-ledger.js +16 -76
  254. package/.agents/scripts/lib/observability/runtime-friction.js +44 -286
  255. package/.agents/scripts/lib/observability/signal-validator.js +5 -37
  256. package/.agents/scripts/lib/observability/signals-writer.js +11 -121
  257. package/.agents/scripts/lib/observability/source-classifier.js +21 -203
  258. package/.agents/scripts/lib/observability/terse-result.js +14 -47
  259. package/.agents/scripts/lib/onboard/init-tail.js +13 -74
  260. package/.agents/scripts/lib/onboard/scaffold-docs.js +11 -34
  261. package/.agents/scripts/lib/orchestration/acceptance-eval-decision.js +25 -139
  262. package/.agents/scripts/lib/orchestration/auto-merge-cwd.js +11 -66
  263. package/.agents/scripts/lib/orchestration/behind-recovery.js +10 -55
  264. package/.agents/scripts/lib/orchestration/ceremony-routing.js +5 -75
  265. package/.agents/scripts/lib/orchestration/change-set.js +7 -36
  266. package/.agents/scripts/lib/orchestration/check-baselines/phases/compare.js +9 -46
  267. package/.agents/scripts/lib/orchestration/check-baselines/phases/evaluate.js +11 -44
  268. package/.agents/scripts/lib/orchestration/check-baselines/phases/floors.js +5 -24
  269. package/.agents/scripts/lib/orchestration/check-baselines/phases/friction.js +3 -12
  270. package/.agents/scripts/lib/orchestration/check-baselines/phases/parse-args.js +5 -38
  271. package/.agents/scripts/lib/orchestration/check-baselines/phases/pipeline.js +3 -8
  272. package/.agents/scripts/lib/orchestration/check-baselines/phases/refresh-ack.js +28 -136
  273. package/.agents/scripts/lib/orchestration/check-baselines/phases/report.js +3 -13
  274. package/.agents/scripts/lib/orchestration/check-state.js +92 -0
  275. package/.agents/scripts/lib/orchestration/ci-gap-intake.js +37 -144
  276. package/.agents/scripts/lib/orchestration/ci-rerun-guard.js +42 -189
  277. package/.agents/scripts/lib/orchestration/code-review.js +24 -128
  278. package/.agents/scripts/lib/orchestration/column-sync.js +23 -111
  279. package/.agents/scripts/lib/orchestration/complexity-gate.js +42 -214
  280. package/.agents/scripts/lib/orchestration/deliver-recover.js +36 -168
  281. package/.agents/scripts/lib/orchestration/dependency-analyzer.js +4 -35
  282. package/.agents/scripts/lib/orchestration/dependency-candidates.js +9 -41
  283. package/.agents/scripts/lib/orchestration/diff-magnitude.js +25 -115
  284. package/.agents/scripts/lib/orchestration/doc-reader.js +2 -6
  285. package/.agents/scripts/lib/orchestration/docs-digest.js +13 -51
  286. package/.agents/scripts/lib/orchestration/epic-candidates.js +13 -53
  287. package/.agents/scripts/lib/orchestration/epic-checklist.js +9 -33
  288. package/.agents/scripts/lib/orchestration/epic-container.js +41 -167
  289. package/.agents/scripts/lib/orchestration/epic-expansion.js +10 -40
  290. package/.agents/scripts/lib/orchestration/epic-rollup.js +55 -207
  291. package/.agents/scripts/lib/orchestration/file-assumption-enum.js +2 -22
  292. package/.agents/scripts/lib/orchestration/file-assumptions.js +45 -253
  293. package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-detect.js +9 -46
  294. package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-reap.js +7 -57
  295. package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches.js +21 -126
  296. package/.agents/scripts/lib/orchestration/git-cleanup/phases/cli.js +2 -6
  297. package/.agents/scripts/lib/orchestration/git-cleanup/phases/fast-forward.js +1 -4
  298. package/.agents/scripts/lib/orchestration/git-cleanup/phases/filters.js +1 -5
  299. package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes-ff.js +9 -34
  300. package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes.js +41 -190
  301. package/.agents/scripts/lib/orchestration/git-cleanup/phases/merged-tip.js +9 -45
  302. package/.agents/scripts/lib/orchestration/git-cleanup/phases/parse-args.js +1 -4
  303. package/.agents/scripts/lib/orchestration/git-cleanup/phases/phase-drivers.js +19 -85
  304. package/.agents/scripts/lib/orchestration/git-cleanup/phases/prompts.js +3 -17
  305. package/.agents/scripts/lib/orchestration/git-cleanup/phases/prune.js +1 -5
  306. package/.agents/scripts/lib/orchestration/git-cleanup/phases/render.js +16 -100
  307. package/.agents/scripts/lib/orchestration/git-cleanup/phases/stashes.js +1 -4
  308. package/.agents/scripts/lib/orchestration/lease-guard-shared.js +16 -67
  309. package/.agents/scripts/lib/orchestration/lifecycle/emit-ledger-event.js +9 -33
  310. package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-flip-failed.js +8 -29
  311. package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-unlanded.js +15 -68
  312. package/.agents/scripts/lib/orchestration/light-backstop.js +11 -49
  313. package/.agents/scripts/lib/orchestration/light-escalation.js +21 -89
  314. package/.agents/scripts/lib/orchestration/light-suitability.js +26 -231
  315. package/.agents/scripts/lib/orchestration/merge-block-class.js +39 -216
  316. package/.agents/scripts/lib/orchestration/merge-poll.js +104 -377
  317. package/.agents/scripts/lib/orchestration/pinned-identifier-lint.js +17 -57
  318. package/.agents/scripts/lib/orchestration/plan-context.js +52 -303
  319. package/.agents/scripts/lib/orchestration/plan-critic-conditions.js +22 -79
  320. package/.agents/scripts/lib/orchestration/plan-critics-evaluate.js +5 -31
  321. package/.agents/scripts/lib/orchestration/plan-metrics.js +29 -108
  322. package/.agents/scripts/lib/orchestration/plan-navigation.js +8 -27
  323. package/.agents/scripts/lib/orchestration/plan-persist/acceptance-handle-repair.js +12 -49
  324. package/.agents/scripts/lib/orchestration/plan-persist/audit-provenance.js +18 -73
  325. package/.agents/scripts/lib/orchestration/plan-persist/changes-repair.js +14 -78
  326. package/.agents/scripts/lib/orchestration/plan-persist/cross-plan-links.js +6 -30
  327. package/.agents/scripts/lib/orchestration/plan-persist/epic-adoption.js +14 -65
  328. package/.agents/scripts/lib/orchestration/plan-persist/epic-ops.js +21 -76
  329. package/.agents/scripts/lib/orchestration/plan-persist/external-deps.js +6 -43
  330. package/.agents/scripts/lib/orchestration/plan-persist/persist-helpers.js +14 -68
  331. package/.agents/scripts/lib/orchestration/plan-persist/plan-context-source.js +9 -41
  332. package/.agents/scripts/lib/orchestration/plan-persist/run-plan-persist.js +49 -248
  333. package/.agents/scripts/lib/orchestration/plan-persist/soft-findings.js +2 -12
  334. package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +85 -368
  335. package/.agents/scripts/lib/orchestration/plan-persist/summary.js +8 -38
  336. package/.agents/scripts/lib/orchestration/plan-persist/supersede-ops.js +30 -190
  337. package/.agents/scripts/lib/orchestration/plan-persist/wave-collision-gate.js +9 -49
  338. package/.agents/scripts/lib/orchestration/plan-persist/wave-serialisation.js +7 -28
  339. package/.agents/scripts/lib/orchestration/plan-reachability.js +13 -42
  340. package/.agents/scripts/lib/orchestration/plan-run-labels/reap.js +16 -91
  341. package/.agents/scripts/lib/orchestration/plan-runner/worktree-sweep.js +16 -54
  342. package/.agents/scripts/lib/orchestration/plan-text-hygiene.js +10 -52
  343. package/.agents/scripts/lib/orchestration/planning/authoring-context.js +14 -109
  344. package/.agents/scripts/lib/orchestration/planning/memory-pool-advisory.js +11 -83
  345. package/.agents/scripts/lib/orchestration/pr-watch.js +48 -306
  346. package/.agents/scripts/lib/orchestration/project-meta-cache.js +15 -80
  347. package/.agents/scripts/lib/orchestration/project-meta-resolver.js +10 -51
  348. package/.agents/scripts/lib/orchestration/reassert-status-column.js +12 -76
  349. package/.agents/scripts/lib/orchestration/remote-verifier.js +12 -36
  350. package/.agents/scripts/lib/orchestration/resolve-stories.js +33 -164
  351. package/.agents/scripts/lib/orchestration/retro-proposals.js +66 -361
  352. package/.agents/scripts/lib/orchestration/review-base-ref.js +9 -43
  353. package/.agents/scripts/lib/orchestration/review-depth.js +12 -94
  354. package/.agents/scripts/lib/orchestration/review-providers/codex.js +10 -111
  355. package/.agents/scripts/lib/orchestration/review-providers/degraded-gates.js +13 -71
  356. package/.agents/scripts/lib/orchestration/review-providers/findings-renderer.js +7 -51
  357. package/.agents/scripts/lib/orchestration/review-providers/mi-exemptions.js +8 -53
  358. package/.agents/scripts/lib/orchestration/review-providers/native.js +30 -214
  359. package/.agents/scripts/lib/orchestration/review-providers/parse-findings.js +7 -52
  360. package/.agents/scripts/lib/orchestration/review-providers/review-depth.js +4 -33
  361. package/.agents/scripts/lib/orchestration/review-providers/review-provider-factory.js +11 -71
  362. package/.agents/scripts/lib/orchestration/review-providers/scoped-lint.js +19 -131
  363. package/.agents/scripts/lib/orchestration/review-providers/security-review.js +6 -89
  364. package/.agents/scripts/lib/orchestration/review-providers/types.js +26 -56
  365. package/.agents/scripts/lib/orchestration/review-providers/ultrareview.js +3 -46
  366. package/.agents/scripts/lib/orchestration/run-epilogue.js +40 -199
  367. package/.agents/scripts/lib/orchestration/run-scoped-config.js +13 -81
  368. package/.agents/scripts/lib/orchestration/single-story-close/close-note.js +7 -34
  369. package/.agents/scripts/lib/orchestration/single-story-close/failed-terminal.js +16 -89
  370. package/.agents/scripts/lib/orchestration/single-story-close/gate-log.js +18 -109
  371. package/.agents/scripts/lib/orchestration/single-story-close/phases/auto-merge.js +83 -239
  372. package/.agents/scripts/lib/orchestration/single-story-close/phases/base-sync.js +18 -80
  373. package/.agents/scripts/lib/orchestration/single-story-close/phases/close-validation.js +103 -97
  374. package/.agents/scripts/lib/orchestration/single-story-close/phases/code-review.js +8 -64
  375. package/.agents/scripts/lib/orchestration/single-story-close/phases/confirm-merge.js +136 -486
  376. package/.agents/scripts/lib/orchestration/single-story-close/phases/conventional-subject.js +30 -134
  377. package/.agents/scripts/lib/orchestration/single-story-close/phases/graphql-preflight.js +9 -50
  378. package/.agents/scripts/lib/orchestration/single-story-close/phases/lock-wait-pending.js +49 -0
  379. package/.agents/scripts/lib/orchestration/single-story-close/phases/normalize-pr-title.js +13 -86
  380. package/.agents/scripts/lib/orchestration/single-story-close/phases/options.js +20 -95
  381. package/.agents/scripts/lib/orchestration/single-story-close/phases/post-land.js +46 -203
  382. package/.agents/scripts/lib/orchestration/single-story-close/phases/pre-gate-steps.js +8 -50
  383. package/.agents/scripts/lib/orchestration/single-story-close/phases/pull-request.js +12 -83
  384. package/.agents/scripts/lib/orchestration/single-story-close/phases/push.js +6 -39
  385. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-block.js +1 -6
  386. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-outcome.js +4 -28
  387. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-override.js +6 -51
  388. package/.agents/scripts/lib/orchestration/single-story-close/phases/worktree-reap.js +6 -34
  389. package/.agents/scripts/lib/orchestration/single-story-close/phases/wrong-tree-guard.js +23 -121
  390. package/.agents/scripts/lib/orchestration/single-story-close/runner.js +110 -290
  391. package/.agents/scripts/lib/orchestration/single-story-lease-guard.js +15 -69
  392. package/.agents/scripts/lib/orchestration/story-body-gate.js +4 -23
  393. package/.agents/scripts/lib/orchestration/story-close/baseline-upward-writeback.js +50 -179
  394. package/.agents/scripts/lib/orchestration/story-close/context-budget-writeback.js +11 -41
  395. package/.agents/scripts/lib/orchestration/story-close/format-autofix.js +23 -311
  396. package/.agents/scripts/lib/orchestration/story-close/phases/local-lens-review.js +22 -147
  397. package/.agents/scripts/lib/orchestration/story-close/phases/review-core.js +16 -67
  398. package/.agents/scripts/lib/orchestration/story-deliver-terminal-schema.js +12 -68
  399. package/.agents/scripts/lib/orchestration/story-deliver-terminal.js +42 -201
  400. package/.agents/scripts/lib/orchestration/story-follow-ups.js +43 -245
  401. package/.agents/scripts/lib/orchestration/story-init-envelope.js +4 -23
  402. package/.agents/scripts/lib/orchestration/story-init-remote.js +2 -6
  403. package/.agents/scripts/lib/orchestration/story-reachability.js +3 -23
  404. package/.agents/scripts/lib/orchestration/task-body-validator.js +12 -126
  405. package/.agents/scripts/lib/orchestration/ticket-lease.js +28 -131
  406. package/.agents/scripts/lib/orchestration/ticket-validator-conflicts.js +15 -149
  407. package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +5 -33
  408. package/.agents/scripts/lib/orchestration/ticket-validator.js +39 -181
  409. package/.agents/scripts/lib/orchestration/ticketing/bulk.js +51 -244
  410. package/.agents/scripts/lib/orchestration/ticketing/reads.js +39 -250
  411. package/.agents/scripts/lib/orchestration/ticketing/state.js +14 -68
  412. package/.agents/scripts/lib/orchestration/ticketing/transition.js +46 -263
  413. package/.agents/scripts/lib/orchestration/ticketing.js +2 -26
  414. package/.agents/scripts/lib/orchestration/verify-credit.js +18 -79
  415. package/.agents/scripts/lib/orchestration/worktree-dirty.js +5 -30
  416. package/.agents/scripts/lib/path-security.js +3 -6
  417. package/.agents/scripts/lib/plan-phase-cleanup.js +9 -49
  418. package/.agents/scripts/lib/preflight-runner.js +13 -69
  419. package/.agents/scripts/lib/process-group.js +143 -0
  420. package/.agents/scripts/lib/project-root.js +2 -8
  421. package/.agents/scripts/lib/provider-factory.js +2 -25
  422. package/.agents/scripts/lib/qa/console-allowlist.js +10 -59
  423. package/.agents/scripts/lib/qa/qa-session.js +15 -69
  424. package/.agents/scripts/lib/qa/redact-evidence.js +18 -129
  425. package/.agents/scripts/lib/qa/resolve-qa-contract.js +26 -135
  426. package/.agents/scripts/lib/qa/resolve-selection.js +16 -84
  427. package/.agents/scripts/lib/reserved-test-ids.js +9 -47
  428. package/.agents/scripts/lib/runtime-deps/dep-resolution.js +13 -53
  429. package/.agents/scripts/lib/runtime-deps/ensure-installed.js +10 -44
  430. package/.agents/scripts/lib/runtime-deps/manifest.js +10 -30
  431. package/.agents/scripts/lib/runtime-deps/parser-major.js +15 -51
  432. package/.agents/scripts/lib/runtime-deps/preflight.js +4 -22
  433. package/.agents/scripts/lib/runtime-deps/scan-imports.js +11 -55
  434. package/.agents/scripts/lib/signals/detectors/common.js +12 -38
  435. package/.agents/scripts/lib/signals/index.js +2 -19
  436. package/.agents/scripts/lib/signals/schema.js +14 -109
  437. package/.agents/scripts/lib/signals/write.js +2 -11
  438. package/.agents/scripts/lib/single-story/confirm-merge.js +31 -72
  439. package/.agents/scripts/lib/single-story/story-merged-notify.js +8 -49
  440. package/.agents/scripts/lib/single-story-sweep/protection-ctx.js +4 -26
  441. package/.agents/scripts/lib/single-story-sweep/protection.js +13 -100
  442. package/.agents/scripts/lib/single-story-sweep/sweep-lock.js +60 -258
  443. package/.agents/scripts/lib/single-story-sweep.js +14 -97
  444. package/.agents/scripts/lib/skills/parse-skill.js +13 -59
  445. package/.agents/scripts/lib/skills/skills-index.js +8 -29
  446. package/.agents/scripts/lib/skills/walk-skill-files.js +17 -78
  447. package/.agents/scripts/lib/source-extensions.js +11 -42
  448. package/.agents/scripts/lib/source-text/strip-js-comments.js +8 -41
  449. package/.agents/scripts/lib/stdio-flush.js +9 -36
  450. package/.agents/scripts/lib/story-adjacency.js +8 -40
  451. package/.agents/scripts/lib/story-body/body-format-lints.js +22 -83
  452. package/.agents/scripts/lib/story-body/footer-block.js +11 -44
  453. package/.agents/scripts/lib/story-body/story-body.js +83 -358
  454. package/.agents/scripts/lib/temp-retention.js +42 -143
  455. package/.agents/scripts/lib/templates/decomposer-prompts.js +11 -65
  456. package/.agents/scripts/lib/test-env.js +12 -65
  457. package/.agents/scripts/lib/test-run-credit.js +10 -65
  458. package/.agents/scripts/lib/test-runner-contract.js +19 -74
  459. package/.agents/scripts/lib/test-temp.js +38 -184
  460. package/.agents/scripts/lib/test-tiers.js +12 -96
  461. package/.agents/scripts/lib/ticket-body-sections.js +21 -96
  462. package/.agents/scripts/lib/transpile.js +15 -74
  463. package/.agents/scripts/lib/util/concurrent-map.js +6 -25
  464. package/.agents/scripts/lib/util/parse-id-list.js +8 -34
  465. package/.agents/scripts/lib/util/poll-loop.js +8 -28
  466. package/.agents/scripts/lib/util/with-timeout.js +2 -11
  467. package/.agents/scripts/lib/validation-evidence.js +21 -96
  468. package/.agents/scripts/lib/wave-runner/footprint.js +17 -70
  469. package/.agents/scripts/lib/wave-runner/live-probe.js +53 -221
  470. package/.agents/scripts/lib/wave-runner/ready-set.js +72 -301
  471. package/.agents/scripts/lib/workers/crap-worker.js +11 -64
  472. package/.agents/scripts/lib/workers/maintainability-report-worker.js +8 -45
  473. package/.agents/scripts/lib/workers/maintainability-worker.js +5 -21
  474. package/.agents/scripts/lib/workers/serve-worker-messages.js +2 -18
  475. package/.agents/scripts/lib/workflow-closure.js +22 -105
  476. package/.agents/scripts/lib/workspace-provisioner.js +16 -54
  477. package/.agents/scripts/lib/worktree/git-hooks.js +15 -60
  478. package/.agents/scripts/lib/worktree/lifecycle/force-drain.js +20 -60
  479. package/.agents/scripts/lib/worktree/lifecycle/merge-reachability.js +10 -62
  480. package/.agents/scripts/lib/worktree/lifecycle/pending-cleanup.js +22 -86
  481. package/.agents/scripts/lib/worktree/lifecycle/reap.js +24 -126
  482. package/.agents/scripts/lib/worktree/lifecycle-manager.js +2 -20
  483. package/.agents/scripts/lib/worktree/node-modules-strategy.js +46 -180
  484. package/.agents/scripts/lib/worktree-manager.js +15 -40
  485. package/.agents/scripts/lint-issue-body.js +12 -68
  486. package/.agents/scripts/mandrel-update-preflight.js +10 -70
  487. package/.agents/scripts/merge-baseline.js +30 -104
  488. package/.agents/scripts/nav-registry-diff.js +22 -108
  489. package/.agents/scripts/notify.js +12 -69
  490. package/.agents/scripts/plan-context.js +27 -111
  491. package/.agents/scripts/plan-critics.js +12 -66
  492. package/.agents/scripts/plan-persist.js +31 -148
  493. package/.agents/scripts/plan-run-epilogue.js +11 -37
  494. package/.agents/scripts/pr-watch-with-update.js +76 -267
  495. package/.agents/scripts/providers/github/auth.js +3 -8
  496. package/.agents/scripts/providers/github/blocked-by-add.js +14 -61
  497. package/.agents/scripts/providers/github/board-add.js +5 -21
  498. package/.agents/scripts/providers/github/branch-protection.js +11 -43
  499. package/.agents/scripts/providers/github/cache.js +2 -14
  500. package/.agents/scripts/providers/github/comments.js +7 -40
  501. package/.agents/scripts/providers/github/compose.js +3 -19
  502. package/.agents/scripts/providers/github/errors.js +22 -125
  503. package/.agents/scripts/providers/github/issues.js +31 -123
  504. package/.agents/scripts/providers/github/labels.js +24 -124
  505. package/.agents/scripts/providers/github/mappers.js +5 -27
  506. package/.agents/scripts/providers/github/merge-methods.js +3 -22
  507. package/.agents/scripts/providers/github/project-board.js +2 -17
  508. package/.agents/scripts/providers/github/projects-v2-graphql.js +3 -6
  509. package/.agents/scripts/providers/github/request-helpers.js +5 -32
  510. package/.agents/scripts/providers/github/search-budget.js +9 -39
  511. package/.agents/scripts/providers/github/search-query.js +5 -26
  512. package/.agents/scripts/providers/github/sub-issue-add.js +15 -65
  513. package/.agents/scripts/providers/github/sub-issues.js +7 -36
  514. package/.agents/scripts/providers/github/tickets.js +32 -134
  515. package/.agents/scripts/providers/github.js +18 -59
  516. package/.agents/scripts/prune-plan-run-labels.js +12 -46
  517. package/.agents/scripts/quality-preview.js +35 -220
  518. package/.agents/scripts/resolve-doc-tiers.js +3 -26
  519. package/.agents/scripts/resolve-stories.js +16 -67
  520. package/.agents/scripts/resync-status-column.js +6 -25
  521. package/.agents/scripts/run-tests.js +29 -104
  522. package/.agents/scripts/single-story-close.js +23 -135
  523. package/.agents/scripts/single-story-confirm-merge.js +32 -139
  524. package/.agents/scripts/single-story-init.js +47 -209
  525. package/.agents/scripts/stories-wave-tick.js +102 -472
  526. package/.agents/scripts/sync-agentrc.js +3 -21
  527. package/.agents/scripts/sync-claude-agents.js +9 -55
  528. package/.agents/scripts/sync-claude-commands.js +20 -110
  529. package/.agents/scripts/test-wrapper.js +6 -43
  530. package/.agents/scripts/update-coverage-baseline.js +5 -22
  531. package/.agents/scripts/update-crap-baseline.js +7 -30
  532. package/.agents/scripts/update-duplication-baseline.js +16 -92
  533. package/.agents/scripts/update-maintainability-baseline.js +8 -62
  534. package/.agents/scripts/update-ticket-state.js +1 -7
  535. package/.agents/scripts/validate-skills.js +6 -26
  536. package/.agents/templates/agent-protocol.md +2 -2
  537. package/.agents/templates/docs/audit-sweep-runbook.md +3 -4
  538. package/.agents/workflows/audit-accessibility.md +4 -7
  539. package/.agents/workflows/audit-adrs.md +3 -6
  540. package/.agents/workflows/audit-architecture.md +3 -11
  541. package/.agents/workflows/audit-baselines.md +6 -9
  542. package/.agents/workflows/audit-clean-code.md +8 -12
  543. package/.agents/workflows/audit-data-model.md +3 -7
  544. package/.agents/workflows/audit-dependencies.md +4 -7
  545. package/.agents/workflows/audit-devops.md +4 -8
  546. package/.agents/workflows/audit-documentation.md +1 -4
  547. package/.agents/workflows/audit-mobile.md +4 -7
  548. package/.agents/workflows/audit-navigability.md +3 -6
  549. package/.agents/workflows/audit-performance.md +2 -4
  550. package/.agents/workflows/audit-privacy.md +4 -7
  551. package/.agents/workflows/audit-quality.md +4 -7
  552. package/.agents/workflows/audit-security.md +4 -7
  553. package/.agents/workflows/audit-seo.md +4 -7
  554. package/.agents/workflows/audit-sre.md +4 -7
  555. package/.agents/workflows/audit-to-stories.md +17 -30
  556. package/.agents/workflows/audit-ux-ui.md +4 -7
  557. package/.agents/workflows/helpers/audit-lens-core.md +1 -1
  558. package/.agents/workflows/helpers/code-quality-guardrails.md +12 -15
  559. package/.agents/workflows/helpers/deliver-digest.md +6 -4
  560. package/.agents/workflows/helpers/deliver-reference.md +114 -188
  561. package/.agents/workflows/helpers/deliver-story-reference.md +189 -533
  562. package/.agents/workflows/helpers/plan-reference.md +86 -139
  563. package/.agents/workflows/helpers/qa-core.md +12 -0
  564. package/.agents/workflows/memory-consolidate.md +1 -1
  565. package/.agents/workflows/qa-assist.md +27 -71
  566. package/.agents/workflows/qa-explore.md +19 -59
  567. package/.agents/workflows/qa-run.md +11 -33
  568. package/README.md +1 -1
  569. package/bin/mandrel.js +5 -46
  570. package/bin/postinstall.js +18 -107
  571. package/docs/CHANGELOG.md +25 -0
  572. package/lib/cli/doctor.js +11 -71
  573. package/lib/cli/init.js +26 -165
  574. package/lib/cli/migrate.js +5 -64
  575. package/lib/cli/registry.js +84 -467
  576. package/lib/cli/sync-agents.js +4 -64
  577. package/lib/cli/sync-commands.js +11 -64
  578. package/lib/cli/sync.js +34 -213
  579. package/lib/cli/uninstall.js +40 -219
  580. package/lib/cli/update.js +105 -661
  581. package/lib/cli/version-check.js +8 -72
  582. package/lib/cli/version-helpers.js +14 -87
  583. package/lib/migrations/helpers/retire-agentrc-key.js +11 -52
  584. package/lib/migrations/index.js +15 -92
  585. package/lib/migrations/steps/2.1.0-retire-mi-drop-knobs.js +2 -15
  586. package/lib/migrations/steps/2.1.0-retire-verify-concurrency-cap.js +1 -13
  587. package/lib/migrations/steps/2.11.0-retire-max-seed-words.js +2 -15
  588. package/lib/migrations/steps/2.2.0-retire-epic-ac-tags.js +9 -38
  589. package/lib/migrations/steps/2.20.0-retire-codebase-snapshot.js +1 -13
  590. package/lib/migrations/steps/2.32.0-retire-lint-baseline-command.js +2 -27
  591. package/lib/migrations/steps/2.57.0-retire-delivery-limit-knobs.js +2 -23
  592. package/lib/migrations/steps/2.57.0-retire-planning-limit-knobs.js +2 -27
  593. package/lib/migrations/steps/2.60.0-retire-audit-results-autofile.js +2 -21
  594. package/lib/migrations/steps/strip-removed-agentrc-keys.js +333 -0
  595. package/package.json +16 -14
  596. package/.agents/docs/SDLC.md +0 -590
  597. package/.agents/docs/quality-gates.md +0 -1183
  598. package/.agents/rules/known-tooling-behavior.md +0 -200
  599. package/.agents/rules/orchestration-error-handling.md +0 -61
  600. package/.agents/rules/test-seams.md +0 -59
  601. package/.agents/schemas/baselines/lighthouse.schema.json +0 -59
  602. package/.agents/schemas/baselines/lint.schema.json +0 -47
  603. package/.agents/scripts/check-action-pinning.js +0 -260
  604. package/.agents/scripts/check-audit-attribution.js +0 -302
  605. package/.agents/scripts/check-baseline-drift.js +0 -211
  606. package/.agents/scripts/check-baseline-scope.js +0 -362
  607. package/.agents/scripts/check-generated-validator.js +0 -202
  608. package/.agents/scripts/check-knip-entries.js +0 -159
  609. package/.agents/scripts/check-lifecycle-lint.js +0 -294
  610. package/.agents/scripts/check-pinned-override-notes.js +0 -102
  611. package/.agents/scripts/check-schema-references.js +0 -368
  612. package/.agents/scripts/check-test-portability.js +0 -512
  613. package/.agents/scripts/check-workflow-citations.js +0 -218
  614. package/.agents/scripts/check-workflow-cli-lint.js +0 -299
  615. package/.agents/scripts/check-workflow-timeouts.js +0 -291
  616. package/.agents/scripts/install-matrix-assert.js +0 -326
  617. package/.agents/scripts/lib/audit-advisories.js +0 -195
  618. package/.agents/scripts/lib/audit-attribution.js +0 -134
  619. package/.agents/scripts/lib/baselines/drift-detector.js +0 -351
  620. package/.agents/scripts/lib/baselines/kinds/lighthouse.js +0 -87
  621. package/.agents/scripts/lib/baselines/kinds/lint.js +0 -184
  622. package/.agents/scripts/lib/baselines/orphan-pruner.js +0 -233
  623. package/.agents/scripts/lib/baselines/scope-assert.js +0 -223
  624. package/.agents/scripts/lib/baselines/scope-inventory.js +0 -314
  625. package/.agents/scripts/lib/c8-cli-path.js +0 -21
  626. package/.agents/scripts/lib/config/gates/lighthouse.schema.js +0 -51
  627. package/.agents/scripts/lib/config/gates/lint.schema.js +0 -18
  628. package/.agents/scripts/lib/dynamic-workflow/architecture-report-contract.js +0 -70
  629. package/.agents/scripts/lib/dynamic-workflow/audit-orchestrator.js +0 -284
  630. package/.agents/scripts/lib/dynamic-workflow/clean-code-report-contract.js +0 -80
  631. package/.agents/scripts/lib/dynamic-workflow/degraded-coverage.js +0 -81
  632. package/.agents/scripts/lib/dynamic-workflow/documentation-report-contract.js +0 -87
  633. package/.agents/scripts/lib/dynamic-workflow/performance-report-contract.js +0 -74
  634. package/.agents/scripts/lib/dynamic-workflow/quality-report-contract.js +0 -90
  635. package/.agents/scripts/lib/dynamic-workflow/report-contract-core.js +0 -43
  636. package/.agents/scripts/lib/dynamic-workflow/security-report-contract.js +0 -83
  637. package/.agents/scripts/lib/fs-walk.js +0 -52
  638. package/.agents/scripts/lib/knip-config-resolver.js +0 -181
  639. package/.agents/scripts/lib/knip-entry-sync.js +0 -452
  640. package/.agents/scripts/lib/pinned-override-notes.js +0 -88
  641. package/.agents/scripts/lib/pinned-override-resolve.js +0 -212
  642. package/.agents/scripts/lib/test-isolate/cli-options.js +0 -93
  643. package/.agents/scripts/lib/test-isolate/env-snapshot-loader.js +0 -52
  644. package/.agents/scripts/lib/test-isolate/list-files.js +0 -90
  645. package/.agents/scripts/lib/test-isolate/parse-tap.js +0 -75
  646. package/.agents/scripts/lib/test-isolate/progress-log.js +0 -45
  647. package/.agents/scripts/lib/test-isolate/render-report.js +0 -97
  648. package/.agents/scripts/lib/test-isolate/run-isolate.js +0 -87
  649. package/.agents/scripts/lib/test-isolate/runner.js +0 -483
  650. package/.agents/scripts/lib/test-profile/parse-tap.js +0 -136
  651. package/.agents/scripts/lib/test-profile/render-report.js +0 -45
  652. package/.agents/scripts/lint-label-vocabulary.js +0 -214
  653. package/.agents/scripts/post-structured-comment.js +0 -127
  654. package/.agents/scripts/provision-git-hooks.js +0 -85
  655. package/.agents/scripts/prune-baseline-orphans.js +0 -181
  656. package/.agents/scripts/run-coverage.js +0 -197
  657. package/.agents/scripts/run-lint.js +0 -133
  658. package/.agents/scripts/run-test-profile.js +0 -129
  659. package/.agents/scripts/run-verify.js +0 -125
  660. package/.agents/scripts/test-isolate.js +0 -55
  661. package/.agents/scripts/update-dead-exports-baseline.js +0 -321
@@ -1,47 +1,11 @@
1
1
  #!/usr/bin/env node
2
2
 
3
3
  /**
4
- * deliver-run.js — one beat of a multi-Story `/mandrel-deliver` run
5
- * (Story #5345).
6
- *
7
- * The multi-Story path used to be a hand-driven protocol: loop
8
- * `stories-wave-tick.js`, keep an append-only `--dispatched` list across
9
- * beats, paste a `node --input-type=module -e` block to build each worker's
10
- * checklist, and remember to add `--merge-watch-mode async` to every close
11
- * because close cannot see run topology. Four pieces of bookkeeping, all of
12
- * them carried in the session's head, each of them silently wrong when
13
- * forgotten — a dropped `--dispatched` id joins a second worker to a live
14
- * branch, and a forgotten async flag serializes the run's merge waits.
15
- *
16
- * This CLI is that bookkeeping, scripted. One beat per invocation:
17
- *
18
- * 1. Tick with `--probe-live`, seeding `dispatched` from the **run ledger**
19
- * rather than from the caller (`<tempRoot>/run-<id>/ledger.json`).
20
- * 2. Write one dispatch prompt per ready Story — id, `workCwd` conventions,
21
- * docs digest path, checklist path, change-set discipline — so the
22
- * session's spawn is "use this file as the prompt" and nothing else.
23
- * 3. Print the exact `single-story-close.js` command for every hand-off,
24
- * with `--merge-watch-mode async` decided from run topology here, where
25
- * the topology is known.
26
- *
27
- * Stdout is one compact JSON envelope (`kind: "deliver-run-beat"`). The
28
- * tick's exit-code contract is preserved byte for byte — 0 ok · 1 input
29
- * error · 2 cycle · 3 wedged · 4 blocked — because the loop's stopping rules
30
- * are the tick's and this script must not invent a second dialect of them.
31
- *
32
- * The ledger is append-only on purpose, which is also its one sharp edge: an
33
- * id whose spawn never reached `single-story-init.js` stays in it, is withheld
34
- * as in flight on every later beat, and the run reads as "waiting" forever.
35
- * The beat therefore reports every ledgered id live state still calls
36
- * `agent::ready` in `stalledDispatch[]` with the recovery in
37
- * `stalledDispatchReason`. It never auto-releases one: a slow init and a dead
38
- * spawn are indistinguishable at this altitude, and releasing the first joins
39
- * a second worker to a live branch (Story #5363).
40
- *
41
- * Scheduling itself is untouched: the ready set, the concurrency cap, the
42
- * footprint guard and the foreign-lease withholding all come from
43
- * `stories-wave-tick.js#runProbedStoriesWaveTick`. This is a ledger, a
44
- * prompt writer and a command renderer around that one beat.
4
+ * One beat of a multi-Story `/mandrel-deliver` run: tick from live state with
5
+ * the run ledger as the dispatched list, write a dispatch prompt per ready
6
+ * Story, and render each hand-off's close command. Scheduling is entirely the
7
+ * tick's, and so is the exit-code contract — the loop's stopping rules must
8
+ * not get a second dialect.
45
9
  */
46
10
 
47
11
  import { createHash } from 'node:crypto';
@@ -92,15 +56,10 @@ const USAGE = {
92
56
  };
93
57
 
94
58
  /**
95
- * Derive the run's stable identity from its Story id set.
96
- *
97
- * The identity must be the same on every beat of one run (so the ledger is
98
- * found again) and different across runs (so two concurrent deliveries do not
99
- * share a dispatched list). The sorted id set is the only thing that satisfies
100
- * both — a timestamp fails the first, and a single id fails the second.
101
- *
59
+ * Stable across beats of one run, distinct across concurrent runs — only the
60
+ * sorted id set satisfies both.
102
61
  * @param {number[]} ids
103
- * @returns {string} an 8-hex-character digest
62
+ * @returns {string}
104
63
  */
105
64
  export function deriveRunId(ids) {
106
65
  const key = [...new Set(ids)].sort((a, b) => a - b).join(',');
@@ -108,13 +67,8 @@ export function deriveRunId(ids) {
108
67
  }
109
68
 
110
69
  /**
111
- * Read the run ledger's dispatched ids, tolerating absence and corruption.
112
- *
113
- * A ledger that cannot be read is treated as empty rather than fatal: the
114
- * consequence is one extra beat of the init window (which `--dispatched`
115
- * existed to close), whereas refusing the beat would strand a live run on a
116
- * bookkeeping artifact.
117
- *
70
+ * An unreadable ledger is empty, not fatal: refusing the beat would strand a
71
+ * live run on a bookkeeping artifact.
118
72
  * @param {string} ledgerPath
119
73
  * @param {{ readFileFn?: (p: string, enc: string) => string }} [deps]
120
74
  * @returns {number[]}
@@ -139,18 +93,15 @@ export function readLedgerDispatched(
139
93
  }
140
94
 
141
95
  /**
142
- * Persist the union of the previously-ledgered ids and the ids handed out on
143
- * this beat. Append-only by construction: nothing here removes an id, so the
144
- * caller cannot get the "forgot to re-list one" failure `--dispatched` had.
145
- *
96
+ * Append-only: nothing removes an id, so none can be forgotten.
146
97
  * @param {object} args
147
98
  * @param {string} args.ledgerPath
148
99
  * @param {string} args.runId
149
100
  * @param {number[]} args.stories
150
- * @param {number[]} args.dispatched ids already ledgered
151
- * @param {number[]} args.ready ids handed out this beat
101
+ * @param {number[]} args.dispatched
102
+ * @param {number[]} args.ready
152
103
  * @param {{ writeFileFn?: (p: string, c: string, enc: string) => void }} [deps]
153
- * @returns {number[]} the persisted dispatched set
104
+ * @returns {number[]}
154
105
  */
155
106
  function writeLedger(
156
107
  { ledgerPath, runId, stories, dispatched, ready },
@@ -169,16 +120,8 @@ function writeLedger(
169
120
  }
170
121
 
171
122
  /**
172
- * Render the close command for one hand-off.
173
- *
174
- * `--merge-watch-mode async` is a **run-topology** decision, which is why it
175
- * is made here: the close process sees one Story and cannot tell whether a
176
- * sibling is queued behind its merge wait. On a multi-Story run the serialized
177
- * close tail is the dominant cost, and each synchronous close holds the
178
- * foreground for its full merge wait before the next may start; on a run of
179
- * one there is no sibling to unblock and the sync default reaches `landed`
180
- * fastest.
181
- *
123
+ * `--merge-watch-mode async` is a run-topology call close cannot make: with
124
+ * siblings, sync closes serialize every merge wait; alone, sync lands fastest.
182
125
  * @param {{ storyId: number, mainRepo: string, storyCount: number }} args
183
126
  * @returns {string}
184
127
  */
@@ -194,15 +137,13 @@ export function renderCloseCommand({ storyId, mainRepo, storyCount }) {
194
137
  }
195
138
 
196
139
  /**
197
- * Render one ready Story's dispatch prompt — the whole spawn payload, so the
198
- * session's `Agent` call is this file and nothing else.
199
- *
140
+ * The whole spawn payload for one ready Story.
200
141
  * @param {object} args
201
142
  * @param {number} args.storyId
202
143
  * @param {string} args.mainRepo
203
144
  * @param {string|null} args.docsDigestPath
204
145
  * @param {string|null} args.checklistPath
205
- * @returns {string} markdown
146
+ * @returns {string}
206
147
  */
207
148
  export function renderDispatchPrompt({
208
149
  storyId,
@@ -266,11 +207,9 @@ export function renderDispatchPrompt({
266
207
  }
267
208
 
268
209
  /**
269
- * Build one ready Story's dispatch prompt file and return its entry.
270
- *
271
210
  * @param {object} args
272
211
  * @param {number} args.storyId
273
- * @param {string} args.body the Story body the probe already fetched
212
+ * @param {string} args.body
274
213
  * @param {string} args.runTempDir
275
214
  * @param {string} args.mainRepo
276
215
  * @param {string|null} args.docsDigestPath
@@ -287,17 +226,12 @@ function buildDispatchEntry(
287
226
  let changes = [];
288
227
  let references = [];
289
228
  try {
290
- // `parse` returns `{ body, warnings, info }` — the path entries live on
291
- // `.body`, not at the top level. The retired `node -e` snippet in
292
- // `helpers/deliver-reference.md` destructured the top level and so built
293
- // every checklist from an empty footprint.
229
+ // Path entries live on `.body`, not at the top level of the parse result.
294
230
  const { body: parsed } = parseStoryBody(body ?? '');
295
231
  changes = parsed?.changes ?? [];
296
232
  references = parsed?.references ?? [];
297
233
  } catch {
298
- // An unparseable body costs a footprint-matched checklist, never the
299
- // dispatch: the worker reads the real Story body itself, and close-scope
300
- // lens coverage runs maker-blind regardless.
234
+ // Costs the checklist, never the dispatch: the worker reads the body itself.
301
235
  changes = [];
302
236
  references = [];
303
237
  }
@@ -322,10 +256,7 @@ function buildDispatchEntry(
322
256
  }
323
257
 
324
258
  /**
325
- * Flatten the two withhold reports the tick emits into one list, so an
326
- * unfilled dispatch slot is explained in a single place.
327
- *
328
- * @param {object} envelope the tick envelope
259
+ * @param {object} envelope
329
260
  * @returns {Array<{id: number, blockedBy: number, reason: string, paths: string[]}>}
330
261
  */
331
262
  function collectWithheld(envelope) {
@@ -348,21 +279,11 @@ function collectWithheld(envelope) {
348
279
  }
349
280
 
350
281
  /**
351
- * Render the operator-facing reason for the ledgered ids live state still
352
- * reports as `agent::ready`.
353
- *
354
- * **Report, do not release.** A slow `single-story-init.js` and a spawn that
355
- * died before reaching one look identical from here, and releasing the first
356
- * re-dispatches a live Story onto its own branch — the exact failure the
357
- * ledger exists to prevent. So the beat names the id and hands the operator
358
- * the two things the call needs: where the ledger lives, and the flag that
359
- * pins the run directory once they have edited it. Neither is derivable from
360
- * the envelope's other fields, which is why both are spelled out here rather
361
- * than left to a reader of the source.
362
- *
282
+ * Report, never release: a slow init and a dead spawn look identical here,
283
+ * and releasing the first re-dispatches a live Story onto its own branch.
363
284
  * @param {number[]} ids
364
285
  * @param {{ ledgerPath: string, runId: string }} run
365
- * @returns {string|null} null when nothing is stalled
286
+ * @returns {string|null}
366
287
  */
367
288
  export function renderStalledDispatchReason(ids, { ledgerPath, runId }) {
368
289
  if (!Array.isArray(ids) || ids.length === 0) return null;
@@ -381,9 +302,7 @@ export function renderStalledDispatchReason(ids, { ledgerPath, runId }) {
381
302
  }
382
303
 
383
304
  /**
384
- * The input-error result, shaped like a beat envelope so a caller branching on
385
- * `kind` never has to special-case the failure.
386
- *
305
+ * Shaped like a beat envelope so callers branching on `kind` need no special case.
387
306
  * @param {string} message
388
307
  * @returns {{ envelope: object, exitCode: 1 }}
389
308
  */
@@ -395,8 +314,6 @@ function inputError(message) {
395
314
  }
396
315
 
397
316
  /**
398
- * Resolve the ids for `--stories` and `--handoff`, or the error to report.
399
- *
400
317
  * @param {{ stories?: string, handoff?: string[] }} args
401
318
  * @returns {{ ids: number[]|null, handoffIds: number[], error: string|null }}
402
319
  */
@@ -431,21 +348,15 @@ export function resolveRunIds({ stories, handoff }) {
431
348
  }
432
349
 
433
350
  /**
434
- * Run one beat: tick, write the dispatch prompts, persist the ledger, render
435
- * the close commands, and shape the envelope.
436
- *
437
- * Every collaborator is injectable so the beat is testable without a provider,
438
- * a network call or the repository's own temp root.
439
- *
440
351
  * @param {object} args
441
- * @param {string} args.stories raw `--stories` value
442
- * @param {string[]} [args.handoff] raw `--handoff` values
443
- * @param {string} [args.concurrency] raw `--concurrency` value
444
- * @param {string} [args.runId] explicit run id
445
- * @param {string} [args.cwd] main checkout
446
- * @param {object} [args.config] pre-resolved config (test injection)
447
- * @param {Function} [args.probe] tick probe seam (test injection)
448
- * @param {Function} [args.context] tick provider-context seam
352
+ * @param {string} args.stories
353
+ * @param {string[]} [args.handoff]
354
+ * @param {string} [args.concurrency]
355
+ * @param {string} [args.runId]
356
+ * @param {string} [args.cwd]
357
+ * @param {object} [args.config]
358
+ * @param {Function} [args.probe]
359
+ * @param {Function} [args.context]
449
360
  * @param {object} [deps]
450
361
  * @returns {Promise<{ envelope: object, exitCode: number }>}
451
362
  */
@@ -492,10 +403,7 @@ export async function runDeliverRunBeat(
492
403
  } = await tickFn({
493
404
  stories,
494
405
  concurrency,
495
- // The ledger IS the dispatched list. It is additive, never authoritative:
496
- // the probe unions it into the label-derived in-flight set and then
497
- // filters it against live state, so an id that has since gone done is
498
- // dropped rather than pinned in flight forever.
406
+ // Additive, never authoritative: the probe filters it against live state.
499
407
  dispatched: ledgered.join(','),
500
408
  cwd: mainRepo,
501
409
  ...(config ? { config } : {}),
@@ -563,10 +471,7 @@ export async function runDeliverRunBeat(
563
471
  blocked: tick.blocked ?? [],
564
472
  blockedReason: tick.blockedReason ?? null,
565
473
  foreignHeld: tick.foreignHeld ?? [],
566
- // Its own reason, deliberately beside `withheld[]` rather than inside
567
- // it: a footprint withhold names a blocking peer Story and its colliding
568
- // paths, and a stalled dispatch has neither — it names a recovery the
569
- // operator owns.
474
+ // Not in `withheld[]`: it has no blocking peer, only an operator recovery.
570
475
  stalledDispatch,
571
476
  stalledDispatchReason: renderStalledDispatchReason(stalledDispatch, {
572
477
  ledgerPath,
@@ -579,8 +484,6 @@ export async function runDeliverRunBeat(
579
484
  }
580
485
 
581
486
  /**
582
- * Parse argv into the beat's inputs.
583
- *
584
487
  * @param {string[]} argv
585
488
  * @returns {{ stories?: string, handoff: string[], concurrency?: string, runId?: string, cwd?: string }}
586
489
  */
@@ -2,36 +2,10 @@
2
2
  /* node:coverage ignore file */
3
3
 
4
4
  /**
5
- * diagnose-friction.js — v5 Diagnostic Interceptor & Friction Signal Detector
6
- *
7
- * Wraps a shell command with telemetry capture. On failure:
8
- * 1. Prints static diagnostic suggestions to stdout.
9
- * 2. Appends a structured `friction` record to the per-Story
10
- * `signals.ndjson` stream via `signals-writer.appendSignal` (when
11
- * both `--story` and `--epic` can be resolved).
12
- *
13
- * In v5 (Epic #1030), friction is a **local NDJSON signal**, not a GitHub
14
- * comment. The detector posts no comments; the analyzer reads the NDJSON
15
- * stream out-of-band. See Tech Spec #1032 §observability.
16
- *
17
- * Usage:
18
- * node diagnose-friction.js [--story <STORY_ID>] \
19
- * [--epic <EPIC_ID>] --cmd <cmd> <args...>
20
- *
21
- * `--cmd` consumes the remaining argv as separate words and spawns them with
22
- * no shell. Quoting the whole command as one string is a usage error, not
23
- * friction — it is refused loudly and writes no ledger row.
24
- *
25
- * Story/Epic resolution order:
26
- * 1. CLI flags (--story, --epic).
27
- * 2. Environment vars (STORY_ID, EPIC_ID / SPRINT_ID).
28
- *
29
- * If neither story nor epic can be resolved, the script still prints
30
- * diagnostic suggestions but skips the signal write (a missing signal is
31
- * preferable to a halted runner — see signals-writer best-effort contract).
32
- *
33
- * @see docs/v5-implementation-plan.md Sprint 3E
34
- * @see .agents/scripts/lib/observability/signals-writer.js
5
+ * Diagnostic interceptor: runs a command (argv words, no shell) and on
6
+ * failure prints remediation and appends a local `friction` NDJSON signal —
7
+ * never a ticket comment. With no resolvable Story the write is skipped: a
8
+ * missing signal beats a halted runner.
35
9
  */
36
10
  import { spawnSync } from 'node:child_process';
37
11
  import crypto from 'node:crypto';
@@ -41,10 +15,6 @@ import { getLimits, resolveConfig } from './lib/config-resolver.js';
41
15
  import { Logger } from './lib/Logger.js';
42
16
  import { appendSignal } from './lib/observability/signals-writer.js';
43
17
 
44
- // ---------------------------------------------------------------------------
45
- // Helpers
46
- // ---------------------------------------------------------------------------
47
-
48
18
  function parseArguments(args) {
49
19
  let storyId = null;
50
20
  let epicId = null;
@@ -63,10 +33,7 @@ function parseArguments(args) {
63
33
  }
64
34
 
65
35
  /**
66
- * Ordered classification rules. The first rule whose `markers` are found
67
- * (any-match) wins. Table-driven so adding a new pattern doesn't grow the
68
- * cyclomatic complexity of `classifyFrictionCategory`.
69
- *
36
+ * First rule with any matching marker wins.
70
37
  * @type {ReadonlyArray<{markers: string[], category: string, remediation: string}>}
71
38
  */
72
39
  const FRICTION_RULES = [
@@ -104,51 +71,28 @@ function classifyFrictionCategory(errorOutput) {
104
71
  }
105
72
 
106
73
  /**
107
- * `spawnSync`'s own `timeout` option kills the child with `SIGTERM`, so a
108
- * SIGTERM observed here almost always means the interceptor's configured
109
- * `executionTimeoutMs` bound fired. Any other signal — a `SIGKILL` from the
110
- * OOM killer, an operator `kill -9` — originated outside this process.
111
- *
74
+ * `spawnSync`'s timeout kills with SIGTERM; any other signal came from outside.
112
75
  * @type {string}
113
76
  */
114
77
  const INTERCEPTOR_TIMEOUT_SIGNAL = 'SIGTERM';
115
78
 
116
79
  /**
117
- * A `maxBuffer` overflow presents identically to a timeout — `status: null`,
118
- * `signal: 'SIGTERM'` — because Node kills the child the same way. The only
119
- * discriminator is `result.error.code`, so a SIGTERM carrying this code is a
120
- * buffer overflow and must never be reported as a timeout (Story #4915).
121
- *
80
+ * A maxBuffer overflow is also a SIGTERM; only this error code tells it
81
+ * apart from a timeout.
122
82
  * @type {string}
123
83
  */
124
84
  const OVERFLOW_ERROR_CODE = 'ENOBUFS';
125
85
 
126
- /** Shell convention for "the process died by signal N": exit `128 + N`. */
127
86
  const SIGNAL_EXIT_BASE = 128;
128
87
 
129
88
  /**
130
- * Describe a child that never exited normally — `status === null`, Node's
131
- * documented representation of "did not exit normally". The raw status must
132
- * never reach `process.exit`, because `process.exit(null)` exits **0**: the
133
- * interceptor would report success for a command it just watched get killed
134
- * (Story #4851).
135
- *
136
- * Which signal fired is the diagnostic value: SIGTERM points at one of the
137
- * interceptor's own bounds, anything else at the host. A SIGTERM splits again
138
- * on `error.code`: `ENOBUFS` means the output blew past `executionMaxBuffer`,
139
- * anything else means `executionTimeoutMs` fired. Recording that plus the
140
- * bound itself is what makes the row actionable to a consumer who cannot edit
141
- * the materialized framework tree.
142
- *
143
- * Deliberately module-local and pure — exporting it for tests would fail the
144
- * `--production` dead-exports ratchet, and folding it into `main` would spend
145
- * the file's per-file maintainability-delta headroom. The CLI contract is the
146
- * seam the unit tests drive.
147
- *
89
+ * For a `null` status, which must never reach `process.exit` (null exits 0).
90
+ * SIGTERM + ENOBUFS = buffer overflow, SIGTERM otherwise = timeout, any other
91
+ * signal = the host. Kept module-local: exporting it for tests would trip the
92
+ * `--production` dead-exports gate.
148
93
  * @param {{signal: (string|null), error?: {message?: string, code?: string}}}
149
- * result A `spawnSync` result whose `status` is `null`.
150
- * @param {{executionTimeoutMs: number, executionMaxBuffer: number}} bounds The
151
- * resolved interceptor bounds — the timeout in ms, the buffer in bytes.
94
+ * result
95
+ * @param {{executionTimeoutMs: number, executionMaxBuffer: number}} bounds
152
96
  * @returns {{category: string, remediation: string, details: object,
153
97
  * preview: string, exitCode: number}}
154
98
  */
@@ -244,14 +188,10 @@ function buildFrictionSignal({
244
188
  ts: new Date().toISOString(),
245
189
  epicId: epicId ?? null,
246
190
  storyId: storyId ?? null,
247
- // 2-tier hierarchy (Epic #3163): no Task tier, so friction signals
248
- // carry no Task id. The field is retained for schema compatibility
249
- // and always null.
191
+ // No Task tier; kept for schema compatibility.
250
192
  taskId: null,
251
193
  category,
252
- // `emitter.command` is what `classifySignalSource` step 1 scans, so the
253
- // command-scan stays authoritative for `source`: a consumer command killed
254
- // by its own host remains consumer-actionable (Story #4851).
194
+ // `classifySignalSource` scans `emitter.command` first to attribute source.
255
195
  emitter: {
256
196
  tool: 'diagnose-friction.js',
257
197
  command: commandStr,
@@ -260,10 +200,6 @@ function buildFrictionSignal({
260
200
  };
261
201
  }
262
202
 
263
- // ---------------------------------------------------------------------------
264
- // Main Execution
265
- // ---------------------------------------------------------------------------
266
-
267
203
  export async function main(args = process.argv.slice(2)) {
268
204
  const { storyId, epicId, cmdArgs } = parseArguments(args);
269
205
 
@@ -273,16 +209,9 @@ export async function main(args = process.argv.slice(2)) {
273
209
  );
274
210
  }
275
211
 
276
- // Story #4915 — the interceptor spawns `cmdArgs[0]` directly, with no shell.
277
- // A single argument containing whitespace therefore names an executable that
278
- // cannot exist, and the resulting ENOENT is a usage error in the
279
- // interceptor's OWN invocation, not friction in the wrapped command. It must
280
- // be reported as one and MUST NOT reach the ledger — otherwise the real
281
- // friction is discarded and the roll-up eventually auto-files a framework-gap
282
- // ticket about the framework's own instrumentation being misused. The
283
- // discriminator is this argv shape, never the ENOENT result: a correctly
284
- // split command whose binary is genuinely absent yields the identical
285
- // `spawnSync` result and stays real friction.
212
+ // No shell, so one whitespace-bearing arg is a usage error that must not
213
+ // reach the ledger. Discriminate on argv shape, not ENOENT: a genuinely
214
+ // absent binary yields the same spawn result and is real friction.
286
215
  if (cmdArgs.length === 1 && /\s/.test(cmdArgs[0])) {
287
216
  throw new Error(
288
217
  `Usage: --cmd takes the command as separate argv words, not one quoted string. Received a single quoted argument: "${cmdArgs[0]}". Drop the quotes so each word is its own argv entry — \`--cmd ${cmdArgs[0]}\`. No friction signal was recorded.`,
@@ -290,13 +219,9 @@ export async function main(args = process.argv.slice(2)) {
290
219
  }
291
220
 
292
221
  const config = resolveConfig();
293
- const limits = getLimits(config);
294
- const executionTimeoutMs = limits.executionTimeoutMs;
295
- // The interceptor's bound is deliberately *below* the framework-wide
296
- // `MAX_BUFFER_BYTES` ceiling: it is a reported policy bound whose value the
297
- // emitted friction row carries (`details.executionMaxBuffer`), not an
298
- // overflow guard. Story #5009 moved its definition to the shared
299
- // child-process surface so it is no longer a hand-copied literal here.
222
+ const { executionTimeoutMs } = getLimits();
223
+ // Deliberately below `MAX_BUFFER_BYTES`: a reported policy bound, not an
224
+ // overflow guard.
300
225
  const executionMaxBuffer = INTERCEPTOR_MAX_BUFFER_BYTES;
301
226
 
302
227
  const commandStr = cmdArgs.join(' ');
@@ -313,8 +238,6 @@ export async function main(args = process.argv.slice(2)) {
313
238
  if (result.stderr) process.stderr.write(result.stderr);
314
239
 
315
240
  if (result.status !== 0) {
316
- // A `null` status means the child never exited normally; the cause lives in
317
- // `result.signal`, not in the status.
318
241
  const abnormal =
319
242
  result.status === null
320
243
  ? describeAbnormalExit(result, {
@@ -322,9 +245,6 @@ export async function main(args = process.argv.slice(2)) {
322
245
  executionMaxBuffer,
323
246
  })
324
247
  : null;
325
- // With both streams empty an abnormal termination names its signal; the
326
- // `Unknown exit code` fallback is therefore reachable only with a real
327
- // numeric status, never as `Unknown exit code null`.
328
248
  const noOutputFallback = abnormal
329
249
  ? abnormal.preview
330
250
  : `Unknown exit code ${result.status}`;
@@ -340,9 +260,7 @@ export async function main(args = process.argv.slice(2)) {
340
260
  'Command failed. Appending friction signal to NDJSON stream...',
341
261
  );
342
262
 
343
- // An abnormal termination classifies itself: the marker scan reads output
344
- // the kill may have truncated (or never produced), so it cannot name the
345
- // signal.
263
+ // A killed command's output may be truncated, so it classifies itself.
346
264
  const classified = classifyFrictionCategory(errorOutput);
347
265
  const category = abnormal?.category ?? classified.category;
348
266
  const remediation = abnormal?.remediation ?? classified.remediation;
@@ -359,11 +277,7 @@ export async function main(args = process.argv.slice(2)) {
359
277
  terminationDetails: abnormal?.details ?? null,
360
278
  });
361
279
 
362
- // Story #2874 — accept story-only context (no parent Epic). When
363
- // only the story is resolved, write to the standalone signals
364
- // stream at `<tempRoot>/standalone/stories/story-<sid>/signals.ndjson`
365
- // by passing `epicId: null` through to the writer. The only case
366
- // we still skip is fully-no-context (story unresolved).
280
+ // A null epicId routes to the standalone Story stream.
367
281
  if (resolvedStoryId != null) {
368
282
  try {
369
283
  const ok = await appendSignal({
@@ -394,18 +308,12 @@ export async function main(args = process.argv.slice(2)) {
394
308
  Logger.error(remediation);
395
309
  Logger.error('----------------------------------------\n');
396
310
 
397
- // Never `process.exit(result.status)` on a null status — that exits 0 and
398
- // reports success for a killed command.
399
311
  process.exit(abnormal?.exitCode ?? result.status);
400
312
  } else {
401
313
  process.exit(0);
402
314
  }
403
315
  }
404
316
 
405
- // ---------------------------------------------------------------------------
406
- // Call main if run directly
407
- // ---------------------------------------------------------------------------
408
-
409
317
  import { runAsCli } from './lib/cli-utils.js';
410
318
 
411
319
  runAsCli(import.meta.url, main, {
@@ -57,7 +57,7 @@ const escalateFrom = (value) => value !== false && value !== 'false';
57
57
  * without a real worktree ledger or a real process kill.
58
58
  *
59
59
  * Every seam on the optional final `deps` parameter defaults to the real
60
- * implementation (`.agents/rules/test-seams.md` rules 1-2, 4), so `main` and
60
+ * implementation (`docs/contributing/test-seams.md` rules 1-2, 4), so `main` and
61
61
  * every production caller are unchanged.
62
62
  *
63
63
  * @param {string[]} [argv]