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,35 +1,7 @@
1
1
  /**
2
- * Append-only signals writer (Epic #1030 Story #1041).
3
- *
4
- * Centralizes the per-(epic, story) NDJSON streams under
5
- * `temp/run-<id>/stories/story-<sid>/signals.ndjson`. Every live emitter
6
- * funnels through this writer so the on-disk shape stays under one schema
7
- * and one set of robustness guarantees. The sibling `traces.ndjson` stream
8
- * and its `appendTrace` entry point went in Story #5003 with the tool-trace
9
- * hook that was its only producer.
10
- *
11
- * Robustness contract (Tech Spec #1032 §observability):
12
- * - **Best-effort.** Every entry point swallows fs / JSON failures
13
- * after logging via `Logger.warn`. Observability MUST NOT take down
14
- * the runner — a failed write is a missing signal, not a halted
15
- * wave.
16
- * - **No buffering.** Each `appendSignal` opens the target file, writes
17
- * one newline-terminated JSON line, and closes.
18
- * The Tech Spec explicitly forbids in-process buffering: emitters
19
- * fire from inside per-Story sub-agents that may exit abruptly, and
20
- * a buffered tail would silently disappear on `process.exit`.
21
- * - **Lazy directory creation.** The first write to a fresh Story
22
- * creates `temp/run-<id>/stories/story-<sid>/` via `fs.mkdir(..., { recursive: true })`.
23
- * `epicId` / `storyId` are required positive integers — the
24
- * `temp-paths.js` helpers assert this before we touch the disk.
25
- *
26
- * Reader contract:
27
- * - `forEachLine(epicId, storyId, cb)` streams `signals.ndjson` line
28
- * by line, parses each line as JSON, and invokes `cb(parsed, lineNumber)`.
29
- * Malformed lines are skipped with a `Logger.warn`; a missing file
30
- * returns `{ linesRead: 0, linesParsed: 0, missing: true }` rather
31
- * than throwing. This matches how the analyzer wants to consume
32
- * partial streams from in-flight Stories.
2
+ * Append-only writer and readers for per-Story `signals.ndjson`. Best-effort:
3
+ * failures are logged, never thrown. No buffering — emitters run in
4
+ * sub-agents that may exit abruptly.
33
5
  */
34
6
 
35
7
  import { createReadStream } from 'node:fs';
@@ -49,30 +21,8 @@ import { validateSignal } from './signal-validator.js';
49
21
  import { classifySignalSource } from './source-classifier.js';
50
22
 
51
23
  /**
52
- * Best-effort decoration of a signal record with a `source` field
53
- * (`"framework"` or `"consumer"`) produced by `classifyPathSource`.
54
- *
55
- * Post the Epic #4406 cutover `source` is reserved **exclusively** for
56
- * this framework/consumer classification — a record's originating tool
57
- * lives in `emitter`, never `source`. That freed the classifier to run
58
- * for every friction record (pre-cutover a provenance object under the
59
- * `source` key blocked it via `Object.hasOwn`).
60
- *
61
- * Rules:
62
- * - If the record is not a plain object (string, number, null,
63
- * undefined), return it unchanged.
64
- * - If the caller pre-set `source` to exactly `"framework"` or
65
- * `"consumer"`, preserve it verbatim — some detectors classify
66
- * upstream and we MUST NOT overwrite their intentional tag.
67
- * - Otherwise (absent, or any other value — defense in depth against a
68
- * stray non-canonical `source`), invoke `classifySignalSource` against
69
- * the whole record and inject/overwrite `source` with the result.
70
- *
71
- * Story #4824 moved the field extraction into the classifier. The writer
72
- * used to hand it only `failingPath` / `command`, which meant every
73
- * runtime-emitted record — which populates neither — took the `consumer`
74
- * default and the framework limb of the feedback loop was unreachable. The
75
- * classifier now sees the `category` and `details` it needs to resolve those.
24
+ * `source` means only framework/consumer (the tool lives in `emitter`); a
25
+ * caller-set canonical value is kept, anything else overwritten.
76
26
  *
77
27
  * @param {unknown} signal
78
28
  * @returns {unknown}
@@ -98,15 +48,6 @@ function tagSignalSource(signal) {
98
48
  }
99
49
 
100
50
  /**
101
- * Validate a record against the canonical `signal-event.schema.json`
102
- * before it is appended. On failure the record is **dropped** (never
103
- * appended) and a `Logger.warn` names the violating field. Never throws —
104
- * the writer's best-effort contract is preserved.
105
- *
106
- * Story #5003 removed the persisted per-Epic reject tally this used to
107
- * increment: v2 Stories are standalone (`epicId` is always null), so the
108
- * tally was never written and its only reader could never see one.
109
- *
110
51
  * @param {unknown} record
111
52
  * @param {string} label
112
53
  * @returns {boolean} true when the record is valid (safe to append).
@@ -121,10 +62,6 @@ function validateOrDrop(record, label) {
121
62
  }
122
63
 
123
64
  /**
124
- * Best-effort append of a single record as one newline-terminated JSON
125
- * line. Caller-supplied record must be JSON-serialisable; circular refs
126
- * or BigInt fields are reported via `Logger.warn` and dropped.
127
- *
128
65
  * @param {string} targetPath
129
66
  * @param {unknown} record
130
67
  * @returns {Promise<boolean>} true on success, false on any swallowed failure.
@@ -157,12 +94,6 @@ async function appendOne(targetPath, record) {
157
94
  }
158
95
 
159
96
  /**
160
- * Append one signal record to `temp/run-<id>/stories/story-<sid>/signals.ndjson`.
161
- *
162
- * The `signal` is written verbatim — callers (detectors) own its shape
163
- * (kind, severity, message, etc.). The writer adds nothing. Errors are
164
- * logged via `Logger.warn` and never thrown.
165
- *
166
97
  * @param {{ epicId: number, storyId: number, signal: unknown, config?: object }} args
167
98
  * @returns {Promise<boolean>}
168
99
  */
@@ -185,19 +116,11 @@ export async function appendSignal(args) {
185
116
  }
186
117
 
187
118
  /**
188
- * Stream any NDJSON `target` file line by line, invoking
189
- * `cb(parsed, lineNumber)` for each successfully parsed JSON line.
190
- * `lineNumber` is 1-based to match operator log expectations. Malformed
191
- * lines are skipped with a `Logger.warn`. A missing file resolves with
192
- * `missing: true` rather than throwing.
193
- *
194
- * Shared spine for `forEachLine`
195
- * (per-Epic stream) so the two readers cannot drift in their
196
- * malformed-line / missing-file / cb-throw handling.
119
+ * Shared reader spine; malformed lines and callback throws are skipped.
197
120
  *
198
121
  * @param {string} target
199
122
  * @param {(parsed: unknown, lineNumber: number) => unknown | Promise<unknown>} cb
200
- * @param {string} label Reader name used in warn messages.
123
+ * @param {string} label
201
124
  * @returns {Promise<{ linesRead: number, linesParsed: number, missing: boolean }>}
202
125
  */
203
126
  async function forEachLineIn(target, cb, label) {
@@ -215,7 +138,6 @@ async function forEachLineIn(target, cb, label) {
215
138
  try {
216
139
  for await (const rawLine of rl) {
217
140
  linesRead += 1;
218
- // Skip empty lines (trailing newline at EOF, accidental blanks).
219
141
  if (rawLine.length === 0) continue;
220
142
  let parsed;
221
143
  try {
@@ -251,11 +173,6 @@ async function forEachLineIn(target, cb, label) {
251
173
  }
252
174
 
253
175
  /**
254
- * Stream a per-Story `signals.ndjson` line by line, invoking
255
- * `cb(parsed, lineNumber)` for each successfully parsed JSON line. A
256
- * missing file resolves with `missing: true` rather than throwing — the
257
- * analyzer treats absence as "no signals yet" and keeps walking.
258
- *
259
176
  * @param {number} epicId
260
177
  * @param {number} storyId
261
178
  * @param {(parsed: unknown, lineNumber: number) => unknown | Promise<unknown>} cb
@@ -283,18 +200,11 @@ export async function forEachLine(epicId, storyId, cb, config) {
283
200
  return forEachLineIn(target, cb, 'forEachLine');
284
201
  }
285
202
 
286
- /** Matches an Epic run directory (`run-<eid>`) directly under `tempRoot`. */
287
203
  const RUN_DIR_RE = /^run-\d+$/;
288
204
 
289
- /** Matches a per-Story directory (`story-<sid>`) under a `stories/` parent. */
290
205
  const STORY_DIR_RE = /^story-(\d+)$/;
291
206
 
292
207
  /**
293
- * List directory entries, or `[]` when the directory is absent/unreadable.
294
- * Absence is the common case (a fresh checkout has no temp tree at all) and
295
- * must not throw — the discovery walk feeds a roll-up that may not fail the
296
- * land.
297
- *
298
208
  * @param {string} dir
299
209
  * @returns {Promise<import('node:fs').Dirent[]>}
300
210
  */
@@ -307,18 +217,8 @@ async function readDirEntries(dir) {
307
217
  }
308
218
 
309
219
  /**
310
- * Discover every per-Story `signals.ndjson` surviving under the configured
311
- * temp root (Story #4824).
312
- *
313
- * Both canonical layouts are walked — `<tempRoot>/standalone/stories/story-<sid>/`
314
- * (v2 standalone Stories, where every close writes) and
315
- * `<tempRoot>/run-<eid>/stories/story-<sid>/` (Epic-attached streams). The
316
- * walk is the **recurrence window** the follow-up composer reduces over: a
317
- * defect that fires exactly once per Story is invisible inside a single
318
- * Story's stream and only becomes a recurrence across the surviving ones.
319
- *
320
- * Sorted by absolute path so a given tree always yields the same order and
321
- * the composed proposals stay byte-identical.
220
+ * Every surviving stream (both layouts) — the recurrence window. Sorted so
221
+ * composed proposals are deterministic.
322
222
  *
323
223
  * @param {object} [config]
324
224
  * @returns {Promise<Array<{ storyId: number, file: string }>>}
@@ -361,18 +261,8 @@ async function listStorySignalStreams(config) {
361
261
  }
362
262
 
363
263
  /**
364
- * Stream **every** surviving per-Story `signals.ndjson` under the configured
365
- * temp root, invoking `cb(parsed, context)` per parsed row (Story #4824).
366
- *
367
- * `context` carries `{ storyId, file, lineNumber }` — `storyId` is the
368
- * **stream owner** (from the directory name), used only as the fallback when
369
- * a row carries no `storyId` of its own; `file` + `lineNumber` identify the
370
- * physical row, which is what lets a caller de-duplicate a legacy row that
371
- * predates `eventId`.
372
- *
373
- * Same robustness contract as `forEachLine`: a missing tree, an unreadable
374
- * directory, a malformed line, or a throwing callback each degrade to a
375
- * warning rather than a rejection.
264
+ * `context.storyId` is the stream owner (a fallback only); `file` +
265
+ * `lineNumber` de-duplicate legacy rows without `eventId`.
376
266
  *
377
267
  * @param {(parsed: unknown, context: { storyId: number, file: string, lineNumber: number }) => unknown | Promise<unknown>} cb
378
268
  * @param {object} [config]
@@ -1,48 +1,9 @@
1
1
  /**
2
- * source-classifier.js — pure classifier that tags a friction signal
3
- * record as either `"framework"` (the Mandrel framework itself) or
4
- * `"consumer"` (the host project that consumes the framework via the
5
- * materialized `.agents/` directory).
6
- *
7
- * Used by `signals-writer.js#appendSignal` so every
8
- * record in `temp/run-<id>/stories/story-<sid>/signals.ndjson` carries an
9
- * authoritative `source` field, allowing downstream retro consumers to
10
- * route framework signals back to mandrel and keep consumer signals in
11
- * the host project (Epic #2547 / Story #2553).
12
- *
13
- * Heuristic (Tech Spec #2550):
14
- * - A signal is `"framework"` when its `failingPath` or `command`
15
- * mentions any path under the framework's own surface area:
16
- * - `.agents/`
17
- * - `.agentrc.json`
18
- * - `.claude/`
19
- * - `node .agents/scripts/`
20
- * …or (Story #4916) names one of the CLI entry points shipped at the
21
- * top level of `.agents/scripts/` by **bare basename**, so recognition
22
- * does not depend on how the caller spelled the reference.
23
- * - Anything else (or empty input) defaults to `"consumer"`. The default
24
- * is intentional — most friction comes from consumer code touching
25
- * framework tooling, and we'd rather under-tag than mis-route a
26
- * consumer signal into the framework retro stream.
27
- *
28
- * Story #4824 adds {@link classifySignalSource} alongside it — the
29
- * record-level entry point the writer now calls, which resolves a
30
- * runtime-emitted record (no `failingPath`, no `command`) instead of letting
31
- * the `consumer` default win unconditionally. `classifyPathSource` keeps its
32
- * two-argument signature and behaviour verbatim.
33
- *
34
- * The classifier is pure: no I/O, no logging, no throws on weird input.
35
- * Callers (the writer) are responsible for swallowing classifier-level
36
- * faults — but the only way this function can throw is via a programmer
37
- * error in this file, which would surface during unit testing.
2
+ * source-classifier.js — tag a friction signal `"framework"` or `"consumer"`.
3
+ * Defaults to consumer: under-tagging beats mis-routing. Pure.
38
4
  */
39
5
 
40
- /**
41
- * Framework prefixes, in declaration order. Order is significant only
42
- * for documentation purposes — any one match returns `"framework"`.
43
- *
44
- * @type {readonly string[]}
45
- */
6
+ /** @type {readonly string[]} */
46
7
  const FRAMEWORK_PREFIXES = Object.freeze([
47
8
  '.agents/',
48
9
  '.agentrc.json',
@@ -51,28 +12,9 @@ const FRAMEWORK_PREFIXES = Object.freeze([
51
12
  ]);
52
13
 
53
14
  /**
54
- * Basenames of the CLI entry points shipped at the top level of
55
- * `.agents/scripts/` (Story #4916).
56
- *
57
- * The prefix scan above recognises a framework script only when the caller
58
- * spelled a path — `node .agents/scripts/acceptance-eval.js` classifies
59
- * `framework`, while the same script named bare (`acceptance-eval.js --story
60
- * 4901`) matched no prefix and fell through to `consumer`, so a real framework
61
- * defect was routed as consumer-actionable and discarded. Recognition must not
62
- * depend on how the caller spelled the reference.
63
- *
64
- * Kept as **static data**, not a directory read: `classifySignalSource` is
65
- * called once per signal and MUST stay pure — no filesystem I/O at classify
66
- * time. The sync test in
67
- * `tests/lib/observability/source-classifier.test.js` reads the real directory
68
- * and fails when a script is added, renamed, or removed without this list
69
- * being updated, so the set cannot go stale and silently restore the blind
70
- * spot.
71
- *
72
- * Scoped to the top level deliberately: those are the entry points a command
73
- * line names. Library modules under `.agents/scripts/lib/` carry generic
74
- * basenames (`index.js`, `config.js`) that a consumer command could plausibly
75
- * name, and widening to them would trade one mis-route for another.
15
+ * Top-level `.agents/scripts/` CLIs, so a bare basename classifies like its
16
+ * path. Static (classification is I/O-free); a sync test pins it to the
17
+ * directory. `lib/` basenames are too generic to include.
76
18
  *
77
19
  * @type {readonly string[]}
78
20
  */
@@ -85,33 +27,21 @@ const FRAMEWORK_SCRIPT_BASENAMES = Object.freeze([
85
27
  'audit-to-stories.js',
86
28
  'boot-sweep.js',
87
29
  'bootstrap.js',
88
- 'check-action-pinning.js',
89
30
  'check-arch-cycles.js',
90
- 'check-audit-attribution.js',
91
- 'check-baseline-drift.js',
92
- 'check-baseline-scope.js',
93
31
  'check-baselines.js',
94
32
  'check-context-budget.js',
95
33
  'check-cyclomatic.js',
96
34
  'check-dead-exports.js',
97
35
  'check-doc-links.js',
98
- 'check-generated-validator.js',
99
36
  'check-gherkin-corpus.js',
100
- 'check-knip-entries.js',
101
- 'check-lifecycle-lint.js',
102
- 'check-pinned-override-notes.js',
103
- 'check-schema-references.js',
104
- 'check-test-portability.js',
105
37
  'check-test-temp-hygiene.js',
106
38
  'check-windows-git-perf.js',
107
- 'check-workflow-citations.js',
108
- 'check-workflow-cli-lint.js',
109
- 'check-workflow-timeouts.js',
110
39
  'ceremony-derive.js',
111
40
  'cleanup-repo-test-temp.js',
112
41
  'coverage-capture.js',
113
42
  'deliver-light.js',
114
43
  'deliver-recover.js',
44
+ 'deliver-run.js',
115
45
  'diagnose-friction.js',
116
46
  'diagnose.js',
117
47
  'drain-pending-cleanup.js',
@@ -122,9 +52,7 @@ const FRAMEWORK_SCRIPT_BASENAMES = Object.freeze([
122
52
  'generate-skills-index.js',
123
53
  'generate-workflows-doc.js',
124
54
  'git-cleanup.js',
125
- 'install-matrix-assert.js',
126
55
  'lint-issue-body.js',
127
- 'lint-label-vocabulary.js',
128
56
  'mandrel-update-preflight.js',
129
57
  'merge-baseline.js',
130
58
  'nav-registry-diff.js',
@@ -133,21 +61,14 @@ const FRAMEWORK_SCRIPT_BASENAMES = Object.freeze([
133
61
  'plan-critics.js',
134
62
  'plan-persist.js',
135
63
  'plan-run-epilogue.js',
136
- 'post-structured-comment.js',
137
64
  'pr-watch-with-update.js',
138
- 'provision-git-hooks.js',
139
- 'prune-baseline-orphans.js',
140
65
  'prune-plan-run-labels.js',
141
66
  'quality-preview.js',
142
67
  'quality-watch.js',
143
68
  'resolve-doc-tiers.js',
144
69
  'resolve-stories.js',
145
70
  'resync-status-column.js',
146
- 'run-coverage.js',
147
- 'run-lint.js',
148
- 'run-test-profile.js',
149
71
  'run-tests.js',
150
- 'run-verify.js',
151
72
  'single-story-close.js',
152
73
  'single-story-confirm-merge.js',
153
74
  'single-story-init.js',
@@ -155,38 +76,22 @@ const FRAMEWORK_SCRIPT_BASENAMES = Object.freeze([
155
76
  'sync-agentrc.js',
156
77
  'sync-claude-agents.js',
157
78
  'sync-claude-commands.js',
158
- 'test-isolate.js',
159
79
  'test-wrapper.js',
160
80
  'update-coverage-baseline.js',
161
81
  'update-crap-baseline.js',
162
- 'update-dead-exports-baseline.js',
163
82
  'update-duplication-baseline.js',
164
83
  'update-maintainability-baseline.js',
165
84
  'update-ticket-state.js',
166
85
  'validate-skills.js',
167
86
  ]);
168
87
 
169
- /**
170
- * Membership index over {@link FRAMEWORK_SCRIPT_BASENAMES}, built once at
171
- * module load so the per-signal scan is a hash lookup.
172
- *
173
- * @type {ReadonlySet<string>}
174
- */
88
+ /** @type {ReadonlySet<string>} */
175
89
  const FRAMEWORK_SCRIPT_BASENAME_SET = new Set(FRAMEWORK_SCRIPT_BASENAMES);
176
90
 
177
- /**
178
- * Characters a shell-ish command line can wrap a token in. Stripped from both
179
- * ends before the membership test so `"acceptance-eval.js",` still resolves.
180
- *
181
- * @type {RegExp}
182
- */
91
+ /** @type {RegExp} */
183
92
  const TOKEN_TRIM = /^[\s'"`(,;:]+|[\s'"`),;:]+$/g;
184
93
 
185
94
  /**
186
- * Normalise a value to a string for prefix scanning. Anything that is not
187
- * a string (undefined, null, numbers, objects) becomes the empty string,
188
- * which scans clean against every framework prefix.
189
- *
190
95
  * @param {unknown} value
191
96
  * @returns {string}
192
97
  */
@@ -196,11 +101,7 @@ function toScanString(value) {
196
101
  }
197
102
 
198
103
  /**
199
- * Return true when `haystack` contains any framework prefix as a
200
- * substring. We use `includes` (not `startsWith`) because a command line
201
- * like `node .agents/scripts/single-story-init.js` carries the prefix in the
202
- * middle, and a failing-path like `repo/.agents/foo.js` may carry an
203
- * absolute prefix.
104
+ * Substring match: prefixes appear mid-command and under absolute paths.
204
105
  *
205
106
  * @param {string} haystack
206
107
  * @returns {boolean}
@@ -214,14 +115,7 @@ function containsFrameworkPrefix(haystack) {
214
115
  }
215
116
 
216
117
  /**
217
- * Return true when `haystack` names a top-level framework script by **bare
218
- * basename** — no path segment at all (Story #4916).
219
- *
220
- * Whitespace-tokenised and matched whole: only a token that *equals* a known
221
- * basename counts. A token carrying any path segment is deliberately left to
222
- * {@link containsFrameworkPrefix} — `./tools/notify.js` is the consumer's own
223
- * script and must stay `consumer`, while `.agents/scripts/notify.js` already
224
- * matches a prefix. Likewise `my-notify.js` is not `notify.js`.
118
+ * Exact token match only: `./tools/notify.js` is the consumer's own script.
225
119
  *
226
120
  * @param {string} haystack
227
121
  * @returns {boolean}
@@ -236,13 +130,6 @@ function containsFrameworkScriptBasename(haystack) {
236
130
  }
237
131
 
238
132
  /**
239
- * True when `haystack` names the framework's own surface, by either
240
- * recognition route: a path prefix, or a bare framework-script basename.
241
- *
242
- * Purely additive over {@link containsFrameworkPrefix} — every string that
243
- * matched a prefix still matches here, so widening can only ever move a
244
- * classification from `consumer` to `framework`, never the reverse.
245
- *
246
133
  * @param {string} haystack
247
134
  * @returns {boolean}
248
135
  */
@@ -252,27 +139,10 @@ function namesFrameworkSurface(haystack) {
252
139
  }
253
140
 
254
141
  /**
255
- * Classify a friction signal as `"framework"` or `"consumer"`.
256
- *
257
- * Both arguments are best-effort: pass whatever the detector already has
258
- * (the failing file path, the failing command line, or both). When both
259
- * are empty / non-string, returns `"consumer"` — the safe default for
260
- * routing.
261
- *
262
- * Framework-wins: if either input matches a framework prefix, the result
263
- * is `"framework"` even when the other input looks consumer-shaped. This
264
- * matters for mixed cases like a consumer test invoking
265
- * `node .agents/scripts/single-story-init.js` — that's framework friction even
266
- * though the failing test path lives under the consumer.
267
- *
268
- * Either input matches on a framework path prefix **or** on a bare framework
269
- * script basename (Story #4916), so `single-story-close.js --story 4906` is
270
- * recognised exactly like its fully-pathed spelling.
142
+ * Framework wins if either input names it.
271
143
  *
272
- * @param {unknown} failingPath The path of the file or directory the
273
- * signal blames (e.g. `"tests/foo.test.js"`).
274
- * @param {unknown} command The command line the signal blames
275
- * (e.g. `"node .agents/scripts/single-story-init.js"`).
144
+ * @param {unknown} failingPath
145
+ * @param {unknown} command
276
146
  * @returns {"framework"|"consumer"}
277
147
  */
278
148
  export function classifyPathSource(failingPath, command) {
@@ -284,33 +154,17 @@ export function classifyPathSource(failingPath, command) {
284
154
  }
285
155
 
286
156
  /**
287
- * The one friction category that is definitionally a framework-surface
288
- * failure (Story #4824).
289
- *
290
- * Kept as a local literal rather than imported from
291
- * `RUNTIME_FRICTION_CATEGORIES.TOOL_DEGRADED` because `runtime-friction.js`
292
- * imports `signals-writer.js`, which imports this module — the import would
293
- * close a cycle for a single string. The unit test asserts the two spellings
294
- * agree, so the duplication cannot drift silently.
157
+ * Literal copy of `RUNTIME_FRICTION_CATEGORIES.TOOL_DEGRADED` (importing it
158
+ * would close a cycle); a test pins them together.
295
159
  *
296
160
  * @type {string}
297
161
  */
298
162
  const TOOL_DEGRADED_CATEGORY = 'tool-degraded';
299
163
 
300
- /**
301
- * Detail keys whose free text names the surface a runtime record blames.
302
- * Scanned (step 2 below) because a runtime emitter puts the framework path
303
- * it was executing here, not in `failingPath` / `command`.
304
- *
305
- * @type {readonly string[]}
306
- */
164
+ /** @type {readonly string[]} */
307
165
  const DETAIL_SCAN_KEYS = Object.freeze(['reason', 'surface', 'phase']);
308
166
 
309
167
  /**
310
- * True when `value` is a non-empty string — the test for "the operator (or a
311
- * detector) actually supplied this field", as opposed to a runtime emitter
312
- * that leaves it absent.
313
- *
314
168
  * @param {unknown} value
315
169
  * @returns {boolean}
316
170
  */
@@ -319,8 +173,6 @@ function isSupplied(value) {
319
173
  }
320
174
 
321
175
  /**
322
- * Concatenate the scannable free text out of a record's `details` payload.
323
- *
324
176
  * @param {unknown} details
325
177
  * @returns {string}
326
178
  */
@@ -336,45 +188,12 @@ function detailsScanText(details) {
336
188
  }
337
189
 
338
190
  /**
339
- * Classify a whole signal record as `"framework"` or `"consumer"`
340
- * (Story #4824).
341
- *
342
- * `classifyPathSource` above requires **positive evidence** of a framework
343
- * prefix in an operator-supplied `failingPath` / `command`. Every
344
- * runtime-emitted friction record (`runtime-friction.js`) populates neither
345
- * field, so the `consumer` default always won and the framework limb of the
346
- * feedback loop was unreachable — 78% of real records mis-tagged.
347
- *
348
- * The naive repair — "runtime-emitted means framework" — is measurably
349
- * **wrong**. `close-failed` records from `single-story-close` carry
350
- * consumer-owned failures (a base-sync conflict in the consumer's own source
351
- * tree, a consumer `npm run test:coverage` exiting non-zero); tagging those
352
- * `framework` would flood the framework repo with consumer test failures,
353
- * which is worse than the current silence.
354
- *
355
- * So the discriminator is resolved in four steps, first match wins:
356
- *
357
- * 1. An operator-supplied `failingPath` / `path` / `command` /
358
- * `emitter.command` → the existing {@link classifyPathSource} prefix scan,
359
- * **unchanged**. A consumer command invoked through `diagnose-friction.js`
360
- * stays `consumer`.
361
- * 2. Else the `details` payload's free text (`reason`, `surface`, `phase`)
362
- * naming a framework prefix → `framework`. A runtime emitter blames its
363
- * surface here, not in a `command` field.
364
- * 3. Else `category === "tool-degraded"` → `framework`.
365
- * `RUNTIME_FRICTION_CATEGORIES.TOOL_DEGRADED` is defined as a tool that
366
- * failed to *execute* — an operational degradation, not a code finding.
367
- * The framework's own tooling could not run, which says nothing about
368
- * consumer code.
369
- * 4. Else `consumer` — the existing safe default, unchanged.
370
- *
371
- * Steps 1, 2 and 4 leave every currently-exercised input byte-identical;
372
- * step 3 is the limb that was unreachable. There is deliberately no emitter
373
- * allowlist: nothing to maintain, nothing to rot.
374
- *
375
- * Pure, and never throws — the writer's `tagSignalSource` still guards it.
191
+ * First match wins: a supplied path/command → {@link classifyPathSource};
192
+ * `details` text naming a framework prefix; `tool-degraded`; else consumer.
193
+ * "Runtime-emitted means framework" is wrong — `close-failed` often blames
194
+ * consumer code.
376
195
  *
377
- * @param {unknown} record One signal record (the `appendSignal` payload).
196
+ * @param {unknown} record
378
197
  * @returns {"framework"|"consumer"}
379
198
  */
380
199
  export function classifySignalSource(record) {
@@ -5,34 +5,14 @@ import { orchestrationLogDir } from '../config/temp-paths.js';
5
5
  import { Logger } from '../Logger.js';
6
6
 
7
7
  /**
8
- * Terse hot-path result emission (Story #4685).
9
- *
10
- * The orchestration CLIs an agent invokes on every delivery turn
11
- * (`single-story-init`, `single-story-close`, `single-story-confirm-merge`)
12
- * historically dumped their whole result object to stdout as pretty-printed
13
- * JSON:
14
- *
15
- * --- STORY CLOSE RESULT ---
16
- * { ... every field, 2-space indented ... }
17
- * --- END RESULT ---
18
- *
19
- * That blob stays resident for the rest of the session and is re-read as
20
- * cache every subsequent turn, yet the agent acts on only a handful of its
21
- * fields (the machine contract is the separate terminal envelope). This helper
22
- * routes the full detail to a temp log the agent can read on demand and emits
23
- * a single structured summary line in its place.
24
- *
25
- * The escape hatch `MANDREL_RESULT_DETAIL=inline` restores the old inline
26
- * pretty dump for interactive debugging.
8
+ * Hot-path CLIs log their full result and print one summary line, keeping a
9
+ * pretty JSON blob out of the agent's resident context.
10
+ * `MANDREL_RESULT_DETAIL=inline` restores the inline dump.
27
11
  */
28
12
 
29
- /** Env var that restores the legacy inline pretty dump when set to `inline`. */
30
13
  const RESULT_DETAIL_ENV = 'MANDREL_RESULT_DETAIL';
31
14
 
32
15
  /**
33
- * Turn a human label (`STORY CLOSE RESULT`) into a filesystem-safe log
34
- * basename fragment (`story-close-result`).
35
- *
36
16
  * @param {string} label
37
17
  * @returns {string}
38
18
  */
@@ -46,10 +26,6 @@ function slugify(label) {
46
26
  }
47
27
 
48
28
  /**
49
- * The full detail block, byte-compatible with the legacy dump the hot-path
50
- * scripts used to write to stdout — same markers, same pretty JSON — so a log
51
- * a human opens reads exactly as the old inline dump did.
52
- *
53
29
  * @param {string} label
54
30
  * @param {unknown} result
55
31
  * @returns {string}
@@ -59,24 +35,17 @@ function detailBlock(label, result) {
59
35
  }
60
36
 
61
37
  /**
62
- * Route a verbose result object off the agent's turn-resident stdout: write the
63
- * full pretty detail to a temp log and emit a single-line structured summary in
64
- * its place.
65
- *
66
38
  * @param {object} args
67
- * @param {string} args.label Human label for the result (e.g. `STORY CLOSE RESULT`).
68
- * @param {unknown} args.result The full result object; pretty-printed to the log.
69
- * @param {Record<string, unknown>} [args.summary] The few fields the agent acts
70
- * on; serialized compactly onto the single summary line.
71
- * @param {string|number} [args.scope] Disambiguating suffix for the log name
72
- * (typically the Story id) so concurrent deliveries don't clobber one file.
73
- * @param {string} [args.logDir] Directory for the detail log. Defaults to the
74
- * configured `<tempRoot>/orchestration` (Story #4794 — was a hardcoded
75
- * `<cwd>/temp/orchestration`, which ignored `project.paths.tempRoot`).
76
- * @param {object} [args.config] Resolved config bag, for the default `logDir`.
77
- * @param {typeof nodeFs} [args.fs] Filesystem seam (tests).
78
- * @param {{ info: (m: string) => void }} [args.log] Logger seam (tests).
79
- * @param {NodeJS.ProcessEnv} [args.env] Environment seam (tests).
39
+ * @param {string} args.label
40
+ * @param {unknown} args.result
41
+ * @param {Record<string, unknown>} [args.summary]
42
+ * @param {string|number} [args.scope] Log-name suffix so concurrent
43
+ * deliveries don't clobber one file.
44
+ * @param {string} [args.logDir]
45
+ * @param {object} [args.config]
46
+ * @param {typeof nodeFs} [args.fs]
47
+ * @param {{ info: (m: string) => void }} [args.log]
48
+ * @param {NodeJS.ProcessEnv} [args.env]
80
49
  * @returns {{ logPath: string|null, inline: boolean, error?: string }}
81
50
  */
82
51
  export function emitTerseResult({
@@ -92,7 +61,6 @@ export function emitTerseResult({
92
61
  } = {}) {
93
62
  const body = detailBlock(label, result);
94
63
 
95
- // Escape hatch: restore the full inline pretty dump for interactive debugging.
96
64
  if (String(env[RESULT_DETAIL_ENV] ?? '').toLowerCase() === 'inline') {
97
65
  log.info?.(`\n${body}\n`);
98
66
  return { logPath: null, inline: true };
@@ -110,8 +78,7 @@ export function emitTerseResult({
110
78
  );
111
79
  return { logPath, inline: false };
112
80
  } catch (err) {
113
- // Never lose detail: if the log write fails, fall back to the inline dump
114
- // so the result is still recoverable from the transcript.
81
+ // Never lose detail: fall back to the inline dump.
115
82
  log.info?.(`\n${body}\n`);
116
83
  return { logPath: null, inline: true, error: err?.message ?? String(err) };
117
84
  }