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,36 +1,16 @@
1
1
  /**
2
- * lib/audit-suite/substitutions.js — `{{key}}` template substitution helpers.
3
- *
4
- * Extracted from `.agents/scripts/run-audit-suite.js` (Story #963, Epic #946).
5
- *
6
- * Three concerns live here:
7
- * 1. `applySubstitutions` — pure string templating used on each workflow body.
8
- * 2. `parseSubstitutionPairs` / `applyImplicitSubstitutions` — CLI-side glue
9
- * that turns `--substitution key=value` pairs and `--ticket` / `--base-branch`
10
- * flags into the substitutions map the runner consumes.
11
- * 3. `computeAllowedKeys` — the per-run allow-list (built-ins ∪ rule-declared
12
- * keys) used by the runner to reject unknown caller substitutions before
13
- * any workflow is loaded.
14
- *
15
- * No filesystem, no provider, no validation throws beyond `parseSubstitutionPairs`
16
- * (which is defensive against malformed CLI input).
2
+ * `{{key}}` substitution for audit workflow bodies, plus the CLI glue and the
3
+ * per-run allowed-key set.
17
4
  */
18
5
 
19
6
  import { ValidationError } from '../errors/index.js';
20
7
 
21
- /**
22
- * Built-in substitution keys that are always available regardless of which
23
- * audits are requested. `auditOutputDir` is sourced from the resolved paths;
24
- * `ticketId` and `baseBranch` are populated from CLI flags or caller args.
25
- */
26
8
  export const BUILT_IN_SUBSTITUTION_KEYS = Object.freeze([
27
9
  'auditOutputDir',
28
10
  'ticketId',
29
11
  'baseBranch',
30
- // Newline-joined change-set file list, populated by Epic-mode callers
31
- // (e.g. `epic-audit`) from `selectAudits().context.changedFiles`.
32
- // Absent in manual `/audit-*` invocations — lens templates handle the
33
- // unsubstituted literal as "no scope filter".
12
+ // Newline-joined change set; when unsubstituted, lens templates read the
13
+ // literal as "no scope filter".
34
14
  'changedFiles',
35
15
  ]);
36
16
 
@@ -39,10 +19,7 @@ function escapeRegExp(str) {
39
19
  }
40
20
 
41
21
  /**
42
- * Pure: replace every occurrence of `{{key}}` in `content` with the matching
43
- * value from `substitutions`. Keys are escaped for regex safety. Unrecognised
44
- * placeholders are left intact — validation of the substitution map happens
45
- * upstream in {@link computeAllowedKeys}.
22
+ * Unrecognised placeholders are left intact; keys are validated upstream.
46
23
  *
47
24
  * @param {string} content
48
25
  * @param {Record<string, string>} substitutions
@@ -60,8 +37,7 @@ export function applySubstitutions(content, substitutions) {
60
37
  }
61
38
 
62
39
  /**
63
- * Parse repeated `--substitution key=value` CLI pairs into a flat object.
64
- * Throws {@link ValidationError} on malformed entries (missing `=` or empty key).
40
+ * Throws {@link ValidationError} on a missing `=` or empty key.
65
41
  *
66
42
  * @param {string[]} [pairs]
67
43
  * @returns {Record<string, string>}
@@ -84,13 +60,11 @@ export function parseSubstitutionPairs(pairs = []) {
84
60
  }
85
61
 
86
62
  /**
87
- * Mutate `substitutions` in place to fold in CLI-derived defaults that should
88
- * only override when the operator hasn't already supplied them via
89
- * `--substitution`. Pulled out of `main` so the precedence rules can be
90
- * unit-tested without the CLI layer.
63
+ * Fill `ticketId`/`baseBranch` from flags in place, unless an explicit
64
+ * `--substitution` already set them.
91
65
  *
92
- * @param {Record<string, unknown>} values parsed CLI values
93
- * @param {Record<string, string|undefined>} substitutions mutable map
66
+ * @param {Record<string, unknown>} values
67
+ * @param {Record<string, string|undefined>} substitutions
94
68
  */
95
69
  export function applyImplicitSubstitutions(values, substitutions) {
96
70
  if (values.ticket && substitutions.ticketId === undefined) {
@@ -102,10 +76,8 @@ export function applyImplicitSubstitutions(values, substitutions) {
102
76
  }
103
77
 
104
78
  /**
105
- * Aggregate the allowed substitution key set for a run: built-ins plus
106
- * per-audit declared keys across the requested auditWorkflows. Audits that
107
- * are not registered in rules are ignored here — the runner rejects them with
108
- * a findings entry before substitution matters.
79
+ * Built-ins plus each requested audit's declared keys; unregistered audits
80
+ * are rejected elsewhere.
109
81
  *
110
82
  * @param {{ audits?: Record<string, { substitutionKeys?: string[] }> }} rules
111
83
  * @param {string[]} auditWorkflows
@@ -1,21 +1,13 @@
1
1
  /**
2
- * lib/audit-suite/workflow-loader.js — Filesystem IO for audit workflows.
3
- *
4
- * Extracted from `.agents/scripts/run-audit-suite.js` (Story #963, Epic #946).
5
- *
6
- * The runner injects either {@link loadWorkflow} (production) or a stub (tests)
7
- * via `injectedLoadWorkflow`. Same for {@link defaultWriteArtifact} and
8
- * `injectedWriteArtifact`. Keeping the IO bound here lets the runner module
9
- * stay free of `node:fs` imports and stay easy to unit-test.
2
+ * Filesystem IO for audit workflows, kept out of the runner so tests can
3
+ * inject stubs.
10
4
  */
11
5
 
12
6
  import fs from 'node:fs/promises';
13
7
  import path from 'node:path';
14
8
 
15
9
  /**
16
- * Read an audit workflow markdown file. Returns `null` when the file is
17
- * missing — the runner converts that into a `low`-severity finding rather
18
- * than throwing, so a missing workflow doesn't fail the suite.
10
+ * `null` when missing; the runner records a finding rather than failing.
19
11
  *
20
12
  * @param {string} auditName
21
13
  * @param {string} workflowsDir absolute path to the workflows root
@@ -32,10 +24,6 @@ export async function loadWorkflow(auditName, workflowsDir) {
32
24
  }
33
25
 
34
26
  /**
35
- * Default artifact writer used when the caller passes a `--run-id` /
36
- * `artifactPrefix`. Creates the artifacts dir on demand and returns the
37
- * absolute path of the file written.
38
- *
39
27
  * @param {string} artifactsDir
40
28
  * @param {string} fileName
41
29
  * @param {string} content
@@ -1,29 +1,7 @@
1
1
  /**
2
- * lib/audit-to-stories/audit-label-taxonomy.js — the closed set of GitHub
3
- * labels an audit sweep may create or generate (Story #4877).
4
- *
5
- * There are two sides to a label axis and they used to be written down in
6
- * different places, which is how they drifted:
7
- *
8
- * - the **creator** — `audit-labels-bootstrap.js`, which ran `gh label create`
9
- * over the `audit::<lens>` list and nothing else;
10
- * - the **generator** — `audit-to-stories/build-story-body.js`, which emitted
11
- * `type::story`, `audit::<lens>` and — as a bare string literal —
12
- * `risk::high`.
13
- *
14
- * `risk::high` was therefore generated by the filer and defined by **no**
15
- * taxonomy: not `LABEL_TAXONOMY` (the repo-wide bootstrap), not the audit
16
- * bootstrap. A generated label the repository has never created is the exact
17
- * failure shape that made every `gh issue create` in the feedback loop fail in
18
- * Story #4828. This module is the one list both sides read, so the creator
19
- * cannot fall behind the generator again.
20
- *
21
- * It lives under `lib/` rather than inside the bootstrap CLI so the generator
22
- * can import it without a lib → top-level-script edge (and without dragging the
23
- * CLI's config/`gh` dependencies into a pure body builder).
24
- *
25
- * Label *names* come from `lib/label-constants.js` — the repo-wide SSOT for
26
- * label spelling — so a rename still lands in one place.
2
+ * The closed set of labels an audit sweep may create or generate — the one
3
+ * list both the bootstrap (creator) and the Story-body builder (generator)
4
+ * read, so the creator cannot fall behind the generator.
27
5
  */
28
6
 
29
7
  import { auditLabelFooter } from '../findings/route-finding.js';
@@ -35,12 +13,7 @@ import {
35
13
  } from '../label-constants.js';
36
14
  import { AUDIT_LENSES, auditLabelsForFindings } from './audit-lenses.js';
37
15
 
38
- /**
39
- * Per-lens label presentation, keyed by canonical lens name. A lens absent from
40
- * this map falls back to {@link DEFAULT_LENS_META}, so adding an `audit-*`
41
- * workflow to `AUDIT_LENSES` still yields a label without registering
42
- * colour/description here first.
43
- */
16
+ /** A lens absent here falls back to {@link DEFAULT_LENS_META}. */
44
17
  const LENS_META = Object.freeze({
45
18
  accessibility: {
46
19
  color: 'c5def5',
@@ -110,11 +83,7 @@ function hex(color) {
110
83
  return String(color).replace('#', '');
111
84
  }
112
85
 
113
- /**
114
- * The `audit::<lens>` half of the taxonomy, one per `/audit-<lens>` workflow.
115
- * Derived from the same `AUDIT_LENSES` SSOT that `build-story-body.js` derives
116
- * its labels from, so the creator and the deriver cannot drift (Story #4195).
117
- */
86
+ /** Derived from the same `AUDIT_LENSES` SSOT the generator uses. */
118
87
  const AUDIT_LENS_LABELS = Object.freeze(
119
88
  AUDIT_LENSES.map((name) => ({
120
89
  name: `audit::${name}`,
@@ -123,13 +92,8 @@ const AUDIT_LENS_LABELS = Object.freeze(
123
92
  );
124
93
 
125
94
  /**
126
- * The story-axis labels an audit-generated Story carries alongside its
127
- * `audit::<lens>` labels.
128
- *
129
- * The `type::` / `agent::` entries are also in `LABEL_TAXONOMY` (the repo-wide
130
- * bootstrap). Creating a label twice is a no-op, so the overlap costs nothing
131
- * and means an audit sweep does not silently depend on the repo-wide bootstrap
132
- * having run first.
95
+ * Overlaps the repo-wide taxonomy on purpose (re-creating is a no-op), so an
96
+ * audit sweep does not depend on the repo-wide bootstrap having run.
133
97
  */
134
98
  const AUDIT_STORY_AXIS_LABELS = Object.freeze([
135
99
  {
@@ -137,14 +101,8 @@ const AUDIT_STORY_AXIS_LABELS = Object.freeze([
137
101
  color: hex(LABEL_COLORS.TYPE),
138
102
  description: 'Story work item',
139
103
  },
140
- // Created, never generated — the one deliberate asymmetry in this module.
141
- // The filer emits no `agent::` state (see `STATIC_LABELS` in
142
- // build-story-body.js): a freshly-filed audit Story is not delivery-ready,
143
- // and `/mandrel-plan` stamps this label as its terminal flip after
144
- // enrichment. The bootstrap still creates it so that flip has a label to
145
- // apply on a repo where only the audit bootstrap has been run. The drift
146
- // this module guards runs the other way — a generator inventing names the
147
- // creator never made — so a creator-only entry is safe (Story #5229).
104
+ // Created, never generated: `/mandrel-plan` applies it after enrichment.
105
+ // A creator-only entry is safe; the guarded drift is generator-only names.
148
106
  {
149
107
  name: AGENT_LABELS.READY,
150
108
  color: hex(LABEL_COLORS.AGENT),
@@ -159,10 +117,6 @@ const AUDIT_STORY_AXIS_LABELS = Object.freeze([
159
117
  },
160
118
  ]);
161
119
 
162
- /**
163
- * Every label the audit sweep defines — the closed set the bootstrap creates
164
- * and {@link definesAuditLabel} answers against.
165
- */
166
120
  export const AUDIT_LABEL_TAXONOMY = Object.freeze([
167
121
  ...AUDIT_LENS_LABELS,
168
122
  ...AUDIT_STORY_AXIS_LABELS,
@@ -171,13 +125,6 @@ export const AUDIT_LABEL_TAXONOMY = Object.freeze([
171
125
  const DEFINED_NAMES = new Set(AUDIT_LABEL_TAXONOMY.map((l) => l.name));
172
126
 
173
127
  /**
174
- * True when `name` is a label this taxonomy defines.
175
- *
176
- * The enforcement point is the label **generator** (`build-story-body.js`),
177
- * which routes every label it derives through this predicate and refuses to
178
- * emit one the taxonomy does not define — closing the drift in the direction it
179
- * actually happened: a generator inventing names the bootstrap never created.
180
- *
181
128
  * @param {unknown} name
182
129
  * @returns {boolean}
183
130
  */
@@ -186,18 +133,9 @@ export function definesAuditLabel(name) {
186
133
  }
187
134
 
188
135
  /**
189
- * Render the `audit-labels` footer for a group of findings.
190
- *
191
136
  * The dedup corpus is listed by `audit::*` label, so a Story filed without one
192
- * is absent from the pool an indexed run matches against — and with an index in
193
- * play the exact lookup is answered locally and never reaches the provider, so
194
- * a fingerprint footer alone cannot rescue it. Carrying the labels through the
195
- * seed is what lets the chained planning path stamp them without the authoring
196
- * agent being asked to notice them (Story #5307).
197
- *
198
- * Lives here rather than beside {@link auditLabelsForFindings} because it needs
199
- * {@link definesAuditLabel}, and the taxonomy already depends on the lens list —
200
- * the reverse edge would be a cycle.
137
+ * is invisible to an indexed run; the seed carries the labels so the planning
138
+ * path stamps them. Lives here (not in audit-lenses) to avoid an import cycle.
201
139
  *
202
140
  * @param {Array<object>} findings
203
141
  * @returns {string} the footer, or '' when no finding resolves to a label.
@@ -1,26 +1,12 @@
1
1
  /**
2
- * lib/audit-to-stories/audit-lenses.js — SSOT for the canonical audit lens
3
- * taxonomy.
4
- *
5
- * The `/audit-<lens>` workflows each emit a report named
6
- * `audit-<lens>-results.md`. The `audit::<lens>` GitHub label set is keyed off
7
- * exactly these lens names — never off a finding's fine-grained `dimension`
8
- * text. `build-story-body.js` derives a group's `audit::<lens>` labels from
9
- * each finding's `sourceReport` basename via {@link lensFromSourceReport}, and
10
- * `audit-labels-bootstrap.js` creates one `audit::<lens>` label per entry in
11
- * {@link AUDIT_LENSES}. Centralising the list here keeps the label producer
12
- * (bootstrap) and the label deriver (story-body) from drifting apart.
13
- *
14
- * Pure: no I/O.
15
- *
16
- * @see Story #4195 — junk `audit::<dimension>` label derivation.
2
+ * SSOT for the audit lens names. `audit::<lens>` labels key off these (via
3
+ * each finding's report basename), never off a finding's `dimension` text.
4
+ * Pure.
17
5
  */
18
6
 
19
7
  /**
20
- * The canonical lens names, one per `/audit-<lens>` workflow under
21
- * `.agents/workflows/` (excluding the `audit-to-stories` and `audit-fan-out`
22
- * meta-workflows, which produce no `audit-<lens>-results.md` of their own).
23
- * Adding a new `audit-*` workflow MUST add its lens name here.
8
+ * One per `/audit-<lens>` workflow that emits `audit-<lens>-results.md`; a
9
+ * new `audit-*` lens workflow MUST be added here.
24
10
  *
25
11
  * @type {ReadonlyArray<string>}
26
12
  */
@@ -44,7 +30,6 @@ export const AUDIT_LENSES = Object.freeze([
44
30
  'ux-ui',
45
31
  ]);
46
32
 
47
- /** O(1) membership set for {@link isCanonicalLens}. */
48
33
  const LENS_SET = new Set(AUDIT_LENSES);
49
34
 
50
35
  /**
@@ -56,16 +41,8 @@ export function isCanonicalLens(lens) {
56
41
  }
57
42
 
58
43
  /**
59
- * Derive the canonical lens name from an `audit-<lens>-results.md` source
60
- * report path. The derivation is basename-only (the directory — typically
61
- * `temp/audits/` — is irrelevant) and matches the exact
62
- * `audit-<lens>-results.md` shape the audit workflows emit. Backslash and
63
- * forward-slash separators are both handled so a Windows-authored path
64
- * resolves identically.
65
- *
66
- * Returns `null` when the path does not match the expected shape or the
67
- * extracted lens is not one of the canonical {@link AUDIT_LENSES} — callers
68
- * drop a `null` so a stray report name can never mint a junk `audit::*` label.
44
+ * Basename-only, either separator. `null` for a non-matching or non-canonical
45
+ * name, so a stray report can never mint a junk label.
69
46
  *
70
47
  * @param {unknown} sourceReport — e.g. `temp/audits/audit-clean-code-results.md`.
71
48
  * @returns {string|null} the canonical lens (`clean-code`) or `null`.
@@ -83,14 +60,8 @@ export function lensFromSourceReport(sourceReport) {
83
60
  }
84
61
 
85
62
  /**
86
- * Derive the deduped, sorted set of canonical `audit::<lens>` labels for a
87
- * collection of findings, keyed off each finding's `sourceReport` basename.
88
- * Findings whose `sourceReport` does not resolve to a canonical lens
89
- * contribute no label (never a junk one). Multi-lens groups (findings from
90
- * more than one report) yield one label per distinct lens.
91
- *
92
63
  * @param {Array<{ sourceReport?: unknown }>} findings
93
- * @returns {string[]} sorted `audit::<lens>` labels.
64
+ * @returns {string[]} sorted, deduped `audit::<lens>` labels.
94
65
  */
95
66
  export function auditLabelsForFindings(findings) {
96
67
  const lenses = new Set();
@@ -1,25 +1,6 @@
1
1
  /**
2
- * lib/audit-to-stories/build-story-body.js
3
- *
4
- * Render the canonical Story body for the standalone grouping mode so a
5
- * generated audit Story clears the same inline-contract bar the decomposer
6
- * enforces (`assertEveryStoryHasInlineContract`): a clean goal, observable
7
- * `acceptance[]`, a populated `changes[]` footprint, and a non-empty,
8
- * tier-tagged `verify[]` (Story #4270).
9
- *
10
- * Pure: returns { title, body, labels }. Labels carry one canonical
11
- * `audit::<lens>` per distinct source report represented in the merge
12
- * (derived from each finding's `sourceReport` basename, NEVER from the
13
- * fine-grained `dimension` text — see Story #4195), plus `type::story` and
14
- * (when any finding is Critical) `risk::high`. Deliberately **no `agent::`
15
- * state label** — see {@link STATIC_LABELS}.
16
- *
17
- * The body is serialized via the canonical story-body serializer
18
- * (`.agents/scripts/lib/story-body/story-body.js`) so the output round-trips
19
- * through `parse()` / `serialize()`. Audit-specific content (agent prompts,
20
- * context links, fingerprint footer) is appended after the canonical sections
21
- * as extended markdown — it is informational only and is not part of the
22
- * structured contract.
2
+ * Render a standalone audit Story body that clears the inline-contract bar,
3
+ * with audit extras appended as informational markdown. Pure.
23
4
  */
24
5
 
25
6
  import path from 'node:path';
@@ -32,32 +13,11 @@ import {
32
13
  renderSemanticKeyFooter,
33
14
  } from './finding-adapter.js';
34
15
 
35
- // The story-axis labels every generated audit Story carries, and the one it
36
- // deliberately does NOT: an `agent::` state.
37
- //
38
- // This used to be `[TYPE_LABELS.STORY, AGENT_LABELS.READY]`, which put every
39
- // Story the sweep filed one step from execution. `agent::ready` is precisely
40
- // what `/mandrel-deliver` reads as "available for pickup", and the bodies
41
- // reaching this function are audit prose — a synthesized acceptance line per
42
- // finding and an Agent Prompts section that is empty whenever the lens
43
- // captured no `agentPrompt`. Filing them ready contradicted the sweep's own
44
- // shipped runbook, whose enrich-before-you-deliver step says not to point
45
- // `/mandrel-deliver` at a freshly-filed audit Story; the label said the
46
- // opposite of the prose, and the label is the half a machine reads.
47
- //
48
- // The state axis therefore belongs to whoever enriches the finding:
49
- // `/mandrel-plan` stamps `agent::ready` as its terminal flip once the Story
50
- // has a `## Spec`, real acceptance criteria and runnable verify lines. An
51
- // absent `agent::` label is a legal initial state — `isValidTransition`
52
- // treats a null from-state as the initial-entry edge and permits any target —
53
- // so nothing downstream has to special-case the gap (Story #5229).
16
+ // Deliberately no `agent::` state label: audit prose is not ready for pickup.
17
+ // `/mandrel-plan` stamps `agent::ready` once enriched; an absent state is a
18
+ // legal initial state for `isValidTransition`.
54
19
  const STATIC_LABELS = Object.freeze([TYPE_LABELS.STORY]);
55
20
 
56
- // The verify[] contract every generated audit Story carries. These commands
57
- // exist in this repo's harness (package.json scripts) so the Story satisfies
58
- // the inline-contract bar with runnable, tier-tagged gates rather than
59
- // placeholder prose. Kept as a frozen constant so the same contract is
60
- // asserted by the unit suite.
61
21
  const DEFAULT_VERIFY = Object.freeze([
62
22
  'npm run lint (validate)',
63
23
  'npm test (unit)',
@@ -68,11 +28,7 @@ function uniq(items) {
68
28
  }
69
29
 
70
30
  /**
71
- * The goal is the group intent only — the synthesized `group.title`. It
72
- * carries no leading ordinal (`1.`/`2.`) and no `[SEVERITY]` / `(dimension)`
73
- * prefix (the polluted shape Story #4270 replaced); those signals live in the
74
- * per-finding fingerprint footer and the extended Agent Prompts section, not
75
- * in the goal.
31
+ * The group intent only — no ordinal or `[SEVERITY]`/`(dimension)` prefix.
76
32
  *
77
33
  * @param {object} group
78
34
  * @returns {string}
@@ -82,14 +38,6 @@ function goalFromGroup(group) {
82
38
  }
83
39
 
84
40
  /**
85
- * Map every distinct file mentioned across the merge onto a canonical
86
- * `changes[]` PathEntry (`{ path, assumption }`). Audit findings remediate
87
- * code that already exists, so the assumption is `refactors-existing`.
88
- *
89
- * `group.files` is an array post-`groupFindings`; fall back to scanning the
90
- * findings' own `files[]` when an upstream caller hands a group whose `files`
91
- * aggregate was not materialized.
92
- *
93
41
  * @param {object} group
94
42
  * @returns {Array<{ path: string, assumption: string }>}
95
43
  */
@@ -107,15 +55,8 @@ function changesFromGroup(group) {
107
55
  }
108
56
 
109
57
  /**
110
- * Build an observable acceptance item from a single finding: a checkable
111
- * end-state a reviewer can confirm, NOT the verbatim recommendation
112
- * paragraph. The recommendation prose is preserved verbatim in the Agent
113
- * Prompts / fingerprint footer for the implementer; the acceptance line is
114
- * the binding, confirmable outcome.
115
- *
116
- * Shape: `<title> is remediated in <primary file>: the recommended end-state
117
- * holds and the finding is no longer reproducible.` — anchored on the finding
118
- * title and primary file so the reviewer knows exactly what to check.
58
+ * A checkable end-state anchored on title and primary file, not the verbatim
59
+ * recommendation (which stays in the prompts/footer).
119
60
  *
120
61
  * @param {object} finding
121
62
  * @returns {string}
@@ -135,9 +76,6 @@ function acceptanceCriteriaFromGroup(group) {
135
76
  }
136
77
 
137
78
  /**
138
- * Resolve the `edges[]` sequencing anchored on this group. Each edge whose
139
- * `fromGroupKey` matches this group's key contributes its `toGroupKey`.
140
- *
141
79
  * @param {object} group
142
80
  * @param {Array<{ fromGroupKey: string, toGroupKey: string }>} edges
143
81
  * @returns {string[]}
@@ -152,27 +90,10 @@ function sequencingDepsForGroup(group, edges) {
152
90
  }
153
91
 
154
92
  /**
155
- * Resolve this group's sequencing to canonical `#N` issue refs, or `[]` when
156
- * the caller has no issue numbers yet (Story #5044).
157
- *
158
- * Group keys are the only identifier that exists at *emit* time — the issues
159
- * are not numbered — which is why this used to render as a prose
160
- * `## Sequencing` block that nothing could act on. Standalone audit Stories
161
- * therefore hardcoded `depends_on: []`, and their only actual serializer was
162
- * an accident: their shared provenance footers collided under the delivery
163
- * footprint guard. Narrowing that scrape removes the accident, so the ordering
164
- * has to become real in the same change.
165
- *
166
- * The resolution is the two-pass shape `plan-persist` already uses: create every
167
- * issue first, then re-render each body with the now-known numbers and mirror
168
- * the same edges as native `blocked_by` relations. An edge whose target was not
169
- * created (deduped against an existing Issue, suppressed by the ledger) simply
170
- * drops — a `blocked by #undefined` would be worse than an absent edge.
171
- *
172
- * A **plain object**, deliberately, not a `Map`: the same map is handed to
173
- * `applyBlockedByDependencies`, which indexes it with property access, so a
174
- * `Map` there would silently resolve every lookup to `undefined`, skip every
175
- * edge, and report success having written nothing. One shape, both halves.
93
+ * Group keys → `#N` refs, or `[]` before issues are numbered (first pass).
94
+ * Edges whose target was not created drop. `issueByGroupKey` must be a plain
95
+ * object: `applyBlockedByDependencies` indexes the same map by property, so a
96
+ * `Map` would silently skip every edge.
176
97
  *
177
98
  * @param {string[]} deps Group keys this group depends on.
178
99
  * @param {Record<string, number>|null} issueByGroupKey
@@ -196,16 +117,8 @@ function agentPromptsSection(group) {
196
117
  }
197
118
 
198
119
  /**
199
- * Link each source audit report **once**.
200
- *
201
- * This used to render `- [\`path\`](path)` — the same
202
- * `temp/audits/audit-<lens>-results.md` in the link text and again in the URL,
203
- * byte-identical across every Story of a same-lens sweep. That doubled a token
204
- * the delivery footprint guard scraped as edit intent, so a lens's whole cohort
205
- * serialized on a report none of them would ever write to (Story #5044). The
206
- * guard now ignores markdown-link URLs and temp-root paths, but rendering the
207
- * path twice was never useful to a reader either: the file name is the label,
208
- * the path is the target.
120
+ * Link each source report once (basename label, path target); repeating the
121
+ * path is a token the footprint guard can scrape as edit intent.
209
122
  *
210
123
  * @param {object} group
211
124
  * @returns {string}
@@ -217,21 +130,14 @@ function contextLinksFromGroup(group) {
217
130
  .filter((s) => typeof s === 'string'),
218
131
  );
219
132
  if (reports.length === 0) return '_(no source audit reports captured)_';
220
- // `path.basename` rather than `split('/')`: on win32 it splits on both
221
- // separators, so an absolute Windows path yields the file name instead of
222
- // the whole path — which would render the path twice in one link and
223
- // re-create the very duplication this function exists to remove.
133
+ // `path.basename` splits on both separators on win32; `split('/')` would
134
+ // leave a Windows path whole and render it twice.
224
135
  return reports.map((r) => `- [${path.basename(r)}](${r})`).join('\n');
225
136
  }
226
137
 
227
138
  function labelsForGroup(group) {
228
- // Derive `audit::<lens>` from each finding's `sourceReport` basename
229
- // (`audit-<lens>-results.md` → `audit::<lens>`), NOT from the finding's
230
- // fine-grained `dimension` text. The dimension is free-form prose
231
- // ("stale-description", "dry", "efficiency (cpu)") and minting
232
- // `audit::<dimension>` from it produced non-existent labels; only the 14
233
- // canonical lens labels are valid. Multi-lens groups carry one label per
234
- // distinct source report. See Story #4195.
139
+ // `audit::<lens>` comes from each `sourceReport` basename, never from the
140
+ // free-form `dimension` text, which mints non-existent labels.
235
141
  const auditLabels = auditLabelsForFindings(group.findings ?? []);
236
142
  const labels = [...STATIC_LABELS, ...auditLabels];
237
143
  const hasCritical = (group.findings ?? []).some(
@@ -242,17 +148,8 @@ function labelsForGroup(group) {
242
148
  }
243
149
 
244
150
  /**
245
- * Refuse to generate a label the audit bootstrap taxonomy does not define
246
- * (Story #4877).
247
- *
248
- * Story #4195 fixed half of this: `audit::<dimension>` labels minted from
249
- * free-form dimension prose ("stale-description", "dry") named labels that did
250
- * not exist, so derivation moved to the closed lens list. The other half stayed
251
- * open — `risk::high` was a bare string literal here, defined by no taxonomy —
252
- * and nothing checked the generated set against anything at all. Throwing is
253
- * deliberate: a label the repo has never created is dropped or fails the create
254
- * outright, and a filer that silently loses `risk::high` on a Critical merge is
255
- * worse than a loud failure at the point of generation.
151
+ * Throws rather than emit a label the repo lacks: a create would drop or fail
152
+ * on it, and silently losing `risk::high` on a Critical is worse.
256
153
  *
257
154
  * @param {string[]} labels
258
155
  * @returns {string[]} the same labels, when every one is defined.
@@ -272,20 +169,13 @@ function assertLabelsInTaxonomy(labels) {
272
169
  }
273
170
 
274
171
  /**
172
+ * Second pass passes `issueByGroupKey` so edges render as `blocked by #N`.
173
+ *
275
174
  * @param {object} params
276
175
  * @param {object} params.group — output of `groupFindings` (one entry).
277
176
  * @param {Array<{ fromGroupKey: string, toGroupKey: string }>} [params.edges]
278
- * — the dependency `edges[]` emitted by `groupFindings`. Edges anchored on
279
- * this group are carried through to `depends_on[]`; omit when no sequencing
280
- * is known.
281
- * @param {Record<string, number>|null} [params.issueByGroupKey]
282
- * — group key → opened issue number. Supplied on the **second** pass, once
283
- * the issues exist, so this group's edges render as canonical
284
- * `blocked by #N` footers (Story #5044). Omit on the first pass.
177
+ * @param {Record<string, number>|null} [params.issueByGroupKey] Second pass only.
285
178
  * @returns {{ title: string, body: string, labels: string[], groupKey: string, dependsOn: string[] }}
286
- * `groupKey` and `dependsOn` are the caller's handle on the second pass:
287
- * they name this Story and the groups it must follow, so the caller can map
288
- * both onto issue numbers without re-deriving the grouping.
289
179
  */
290
180
  export function buildStoryBody({ group, edges = [], issueByGroupKey = null }) {
291
181
  if (!group || !Array.isArray(group.findings)) {
@@ -294,11 +184,6 @@ export function buildStoryBody({ group, edges = [], issueByGroupKey = null }) {
294
184
  const title = group.title;
295
185
  const dependsOn = sequencingDepsForGroup(group, edges);
296
186
 
297
- // Build the canonical StoryBody object from the audit group data. The
298
- // acceptance + verify arrays are populated so the body clears the
299
- // inline-contract bar; changes[] carries the file footprint. `depends_on`
300
- // is empty on the first pass (the blockers have no issue numbers yet) and
301
- // carries real `#N` refs on the second — see dependencyRefs.
302
187
  const storyBody = {
303
188
  goal: goalFromGroup(group),
304
189
  changes: changesFromGroup(group),
@@ -310,15 +195,12 @@ export function buildStoryBody({ group, edges = [], issueByGroupKey = null }) {
310
195
  depends_on: dependencyRefs(dependsOn, issueByGroupKey),
311
196
  };
312
197
 
313
- // The `---` / `blocked by #N` footer is the canonical serializer's own, so
314
- // the body round-trips through `parse()` and `/mandrel-deliver`'s resolver reads the
315
- // ordering from the same place it reads every other Story's.
198
+ // The serializer's own footer, so `/mandrel-deliver` reads the ordering
199
+ // where it reads every other Story's.
316
200
  const canonicalSections = serialize(storyBody, {
317
201
  includeFooter: storyBody.depends_on.length > 0,
318
202
  });
319
203
 
320
- // Append audit-specific extended sections (agent prompts, context links,
321
- // provenance footers) that are not part of the canonical shape.
322
204
  const body = [
323
205
  canonicalSections,
324
206
  '',