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,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,28 +27,15 @@ 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',
@@ -123,9 +52,7 @@ const FRAMEWORK_SCRIPT_BASENAMES = Object.freeze([
123
52
  'generate-skills-index.js',
124
53
  'generate-workflows-doc.js',
125
54
  'git-cleanup.js',
126
- 'install-matrix-assert.js',
127
55
  'lint-issue-body.js',
128
- 'lint-label-vocabulary.js',
129
56
  'mandrel-update-preflight.js',
130
57
  'merge-baseline.js',
131
58
  'nav-registry-diff.js',
@@ -134,21 +61,14 @@ const FRAMEWORK_SCRIPT_BASENAMES = Object.freeze([
134
61
  'plan-critics.js',
135
62
  'plan-persist.js',
136
63
  'plan-run-epilogue.js',
137
- 'post-structured-comment.js',
138
64
  'pr-watch-with-update.js',
139
- 'provision-git-hooks.js',
140
- 'prune-baseline-orphans.js',
141
65
  'prune-plan-run-labels.js',
142
66
  'quality-preview.js',
143
67
  'quality-watch.js',
144
68
  'resolve-doc-tiers.js',
145
69
  'resolve-stories.js',
146
70
  'resync-status-column.js',
147
- 'run-coverage.js',
148
- 'run-lint.js',
149
- 'run-test-profile.js',
150
71
  'run-tests.js',
151
- 'run-verify.js',
152
72
  'single-story-close.js',
153
73
  'single-story-confirm-merge.js',
154
74
  'single-story-init.js',
@@ -156,38 +76,22 @@ const FRAMEWORK_SCRIPT_BASENAMES = Object.freeze([
156
76
  'sync-agentrc.js',
157
77
  'sync-claude-agents.js',
158
78
  'sync-claude-commands.js',
159
- 'test-isolate.js',
160
79
  'test-wrapper.js',
161
80
  'update-coverage-baseline.js',
162
81
  'update-crap-baseline.js',
163
- 'update-dead-exports-baseline.js',
164
82
  'update-duplication-baseline.js',
165
83
  'update-maintainability-baseline.js',
166
84
  'update-ticket-state.js',
167
85
  'validate-skills.js',
168
86
  ]);
169
87
 
170
- /**
171
- * Membership index over {@link FRAMEWORK_SCRIPT_BASENAMES}, built once at
172
- * module load so the per-signal scan is a hash lookup.
173
- *
174
- * @type {ReadonlySet<string>}
175
- */
88
+ /** @type {ReadonlySet<string>} */
176
89
  const FRAMEWORK_SCRIPT_BASENAME_SET = new Set(FRAMEWORK_SCRIPT_BASENAMES);
177
90
 
178
- /**
179
- * Characters a shell-ish command line can wrap a token in. Stripped from both
180
- * ends before the membership test so `"acceptance-eval.js",` still resolves.
181
- *
182
- * @type {RegExp}
183
- */
91
+ /** @type {RegExp} */
184
92
  const TOKEN_TRIM = /^[\s'"`(,;:]+|[\s'"`),;:]+$/g;
185
93
 
186
94
  /**
187
- * Normalise a value to a string for prefix scanning. Anything that is not
188
- * a string (undefined, null, numbers, objects) becomes the empty string,
189
- * which scans clean against every framework prefix.
190
- *
191
95
  * @param {unknown} value
192
96
  * @returns {string}
193
97
  */
@@ -197,11 +101,7 @@ function toScanString(value) {
197
101
  }
198
102
 
199
103
  /**
200
- * Return true when `haystack` contains any framework prefix as a
201
- * substring. We use `includes` (not `startsWith`) because a command line
202
- * like `node .agents/scripts/single-story-init.js` carries the prefix in the
203
- * middle, and a failing-path like `repo/.agents/foo.js` may carry an
204
- * absolute prefix.
104
+ * Substring match: prefixes appear mid-command and under absolute paths.
205
105
  *
206
106
  * @param {string} haystack
207
107
  * @returns {boolean}
@@ -215,14 +115,7 @@ function containsFrameworkPrefix(haystack) {
215
115
  }
216
116
 
217
117
  /**
218
- * Return true when `haystack` names a top-level framework script by **bare
219
- * basename** — no path segment at all (Story #4916).
220
- *
221
- * Whitespace-tokenised and matched whole: only a token that *equals* a known
222
- * basename counts. A token carrying any path segment is deliberately left to
223
- * {@link containsFrameworkPrefix} — `./tools/notify.js` is the consumer's own
224
- * script and must stay `consumer`, while `.agents/scripts/notify.js` already
225
- * 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.
226
119
  *
227
120
  * @param {string} haystack
228
121
  * @returns {boolean}
@@ -237,13 +130,6 @@ function containsFrameworkScriptBasename(haystack) {
237
130
  }
238
131
 
239
132
  /**
240
- * True when `haystack` names the framework's own surface, by either
241
- * recognition route: a path prefix, or a bare framework-script basename.
242
- *
243
- * Purely additive over {@link containsFrameworkPrefix} — every string that
244
- * matched a prefix still matches here, so widening can only ever move a
245
- * classification from `consumer` to `framework`, never the reverse.
246
- *
247
133
  * @param {string} haystack
248
134
  * @returns {boolean}
249
135
  */
@@ -253,27 +139,10 @@ function namesFrameworkSurface(haystack) {
253
139
  }
254
140
 
255
141
  /**
256
- * Classify a friction signal as `"framework"` or `"consumer"`.
257
- *
258
- * Both arguments are best-effort: pass whatever the detector already has
259
- * (the failing file path, the failing command line, or both). When both
260
- * are empty / non-string, returns `"consumer"` — the safe default for
261
- * routing.
262
- *
263
- * Framework-wins: if either input matches a framework prefix, the result
264
- * is `"framework"` even when the other input looks consumer-shaped. This
265
- * matters for mixed cases like a consumer test invoking
266
- * `node .agents/scripts/single-story-init.js` — that's framework friction even
267
- * though the failing test path lives under the consumer.
268
- *
269
- * Either input matches on a framework path prefix **or** on a bare framework
270
- * script basename (Story #4916), so `single-story-close.js --story 4906` is
271
- * recognised exactly like its fully-pathed spelling.
142
+ * Framework wins if either input names it.
272
143
  *
273
- * @param {unknown} failingPath The path of the file or directory the
274
- * signal blames (e.g. `"tests/foo.test.js"`).
275
- * @param {unknown} command The command line the signal blames
276
- * (e.g. `"node .agents/scripts/single-story-init.js"`).
144
+ * @param {unknown} failingPath
145
+ * @param {unknown} command
277
146
  * @returns {"framework"|"consumer"}
278
147
  */
279
148
  export function classifyPathSource(failingPath, command) {
@@ -285,33 +154,17 @@ export function classifyPathSource(failingPath, command) {
285
154
  }
286
155
 
287
156
  /**
288
- * The one friction category that is definitionally a framework-surface
289
- * failure (Story #4824).
290
- *
291
- * Kept as a local literal rather than imported from
292
- * `RUNTIME_FRICTION_CATEGORIES.TOOL_DEGRADED` because `runtime-friction.js`
293
- * imports `signals-writer.js`, which imports this module — the import would
294
- * close a cycle for a single string. The unit test asserts the two spellings
295
- * 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.
296
159
  *
297
160
  * @type {string}
298
161
  */
299
162
  const TOOL_DEGRADED_CATEGORY = 'tool-degraded';
300
163
 
301
- /**
302
- * Detail keys whose free text names the surface a runtime record blames.
303
- * Scanned (step 2 below) because a runtime emitter puts the framework path
304
- * it was executing here, not in `failingPath` / `command`.
305
- *
306
- * @type {readonly string[]}
307
- */
164
+ /** @type {readonly string[]} */
308
165
  const DETAIL_SCAN_KEYS = Object.freeze(['reason', 'surface', 'phase']);
309
166
 
310
167
  /**
311
- * True when `value` is a non-empty string — the test for "the operator (or a
312
- * detector) actually supplied this field", as opposed to a runtime emitter
313
- * that leaves it absent.
314
- *
315
168
  * @param {unknown} value
316
169
  * @returns {boolean}
317
170
  */
@@ -320,8 +173,6 @@ function isSupplied(value) {
320
173
  }
321
174
 
322
175
  /**
323
- * Concatenate the scannable free text out of a record's `details` payload.
324
- *
325
176
  * @param {unknown} details
326
177
  * @returns {string}
327
178
  */
@@ -337,45 +188,12 @@ function detailsScanText(details) {
337
188
  }
338
189
 
339
190
  /**
340
- * Classify a whole signal record as `"framework"` or `"consumer"`
341
- * (Story #4824).
342
- *
343
- * `classifyPathSource` above requires **positive evidence** of a framework
344
- * prefix in an operator-supplied `failingPath` / `command`. Every
345
- * runtime-emitted friction record (`runtime-friction.js`) populates neither
346
- * field, so the `consumer` default always won and the framework limb of the
347
- * feedback loop was unreachable — 78% of real records mis-tagged.
348
- *
349
- * The naive repair — "runtime-emitted means framework" — is measurably
350
- * **wrong**. `close-failed` records from `single-story-close` carry
351
- * consumer-owned failures (a base-sync conflict in the consumer's own source
352
- * tree, a consumer `npm run test:coverage` exiting non-zero); tagging those
353
- * `framework` would flood the framework repo with consumer test failures,
354
- * which is worse than the current silence.
355
- *
356
- * So the discriminator is resolved in four steps, first match wins:
357
- *
358
- * 1. An operator-supplied `failingPath` / `path` / `command` /
359
- * `emitter.command` → the existing {@link classifyPathSource} prefix scan,
360
- * **unchanged**. A consumer command invoked through `diagnose-friction.js`
361
- * stays `consumer`.
362
- * 2. Else the `details` payload's free text (`reason`, `surface`, `phase`)
363
- * naming a framework prefix → `framework`. A runtime emitter blames its
364
- * surface here, not in a `command` field.
365
- * 3. Else `category === "tool-degraded"` → `framework`.
366
- * `RUNTIME_FRICTION_CATEGORIES.TOOL_DEGRADED` is defined as a tool that
367
- * failed to *execute* — an operational degradation, not a code finding.
368
- * The framework's own tooling could not run, which says nothing about
369
- * consumer code.
370
- * 4. Else `consumer` — the existing safe default, unchanged.
371
- *
372
- * Steps 1, 2 and 4 leave every currently-exercised input byte-identical;
373
- * step 3 is the limb that was unreachable. There is deliberately no emitter
374
- * allowlist: nothing to maintain, nothing to rot.
375
- *
376
- * 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.
377
195
  *
378
- * @param {unknown} record One signal record (the `appendSignal` payload).
196
+ * @param {unknown} record
379
197
  * @returns {"framework"|"consumer"}
380
198
  */
381
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
  }