mandrel 2.59.0 → 2.61.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (678) hide show
  1. package/.agents/README.md +21 -19
  2. package/.agents/agents/acceptance-critic.md +24 -43
  3. package/.agents/agents/story-worker.md +20 -21
  4. package/.agents/docs/agentrc-reference.json +5 -84
  5. package/.agents/docs/configuration.md +48 -132
  6. package/.agents/docs/workflows.md +2 -2
  7. package/.agents/instructions.md +5 -8
  8. package/.agents/rules/ci-remediation.md +41 -8
  9. package/.agents/rules/gherkin-standards.md +4 -0
  10. package/.agents/schemas/acceptance-eval-verdict.schema.json +1 -1
  11. package/.agents/schemas/agentrc.schema.json +16 -496
  12. package/.agents/schemas/story-deliver-terminal.schema.json +13 -3
  13. package/.agents/schemas/validation-evidence.schema.json +2 -1
  14. package/.agents/scripts/README.md +23 -13
  15. package/.agents/scripts/acceptance-eval.js +35 -169
  16. package/.agents/scripts/agents-bootstrap-github.js +27 -129
  17. package/.agents/scripts/apply-quality-bootstrap.js +4 -40
  18. package/.agents/scripts/audit-baselines.js +6 -27
  19. package/.agents/scripts/audit-labels-bootstrap.js +5 -29
  20. package/.agents/scripts/audit-to-stories.js +91 -361
  21. package/.agents/scripts/boot-sweep.js +19 -72
  22. package/.agents/scripts/bootstrap.js +74 -395
  23. package/.agents/scripts/ceremony-derive.js +10 -41
  24. package/.agents/scripts/check-arch-cycles.js +14 -64
  25. package/.agents/scripts/check-baselines.js +8 -48
  26. package/.agents/scripts/check-context-budget.js +105 -311
  27. package/.agents/scripts/check-cyclomatic.js +12 -44
  28. package/.agents/scripts/check-dead-exports.js +13 -64
  29. package/.agents/scripts/check-doc-links.js +38 -186
  30. package/.agents/scripts/check-gherkin-corpus.js +24 -127
  31. package/.agents/scripts/check-test-temp-hygiene.js +28 -169
  32. package/.agents/scripts/coverage-capture.js +34 -98
  33. package/.agents/scripts/deliver-light.js +25 -171
  34. package/.agents/scripts/deliver-recover.js +6 -42
  35. package/.agents/scripts/deliver-run.js +534 -0
  36. package/.agents/scripts/diagnose-friction.js +24 -116
  37. package/.agents/scripts/drain-pending-cleanup.js +1 -1
  38. package/.agents/scripts/evidence-gate.js +23 -85
  39. package/.agents/scripts/file-ci-gap.js +57 -49
  40. package/.agents/scripts/generate-config-docs.js +30 -170
  41. package/.agents/scripts/generate-lens-checklists.js +8 -52
  42. package/.agents/scripts/generate-skills-index.js +14 -112
  43. package/.agents/scripts/generate-workflows-doc.js +10 -70
  44. package/.agents/scripts/git-cleanup.js +2 -34
  45. package/.agents/scripts/lib/Graph.js +24 -81
  46. package/.agents/scripts/lib/ITicketingProvider.js +47 -143
  47. package/.agents/scripts/lib/Logger.js +14 -76
  48. package/.agents/scripts/lib/audit-baselines/engine.js +11 -31
  49. package/.agents/scripts/lib/audit-baselines/gate-surface.js +3 -17
  50. package/.agents/scripts/lib/audit-baselines/headroom.js +4 -20
  51. package/.agents/scripts/lib/audit-baselines/hotspots.js +3 -15
  52. package/.agents/scripts/lib/audit-baselines/kinds.js +23 -89
  53. package/.agents/scripts/lib/audit-baselines/outliers.js +6 -23
  54. package/.agents/scripts/lib/audit-baselines/read.js +3 -16
  55. package/.agents/scripts/lib/audit-baselines/staleness.js +7 -26
  56. package/.agents/scripts/lib/audit-baselines/surface-entry.js +7 -28
  57. package/.agents/scripts/lib/audit-baselines/trend.js +7 -20
  58. package/.agents/scripts/lib/audit-baselines/weights.js +9 -37
  59. package/.agents/scripts/lib/audit-suite/audit-rules-reader.js +3 -18
  60. package/.agents/scripts/lib/audit-suite/checklist-threading.js +26 -124
  61. package/.agents/scripts/lib/audit-suite/dispatch-checklist.js +14 -45
  62. package/.agents/scripts/lib/audit-suite/findings.js +12 -52
  63. package/.agents/scripts/lib/audit-suite/frontmatter.js +5 -29
  64. package/.agents/scripts/lib/audit-suite/index.js +1 -15
  65. package/.agents/scripts/lib/audit-suite/lens-checklist.js +10 -45
  66. package/.agents/scripts/lib/audit-suite/lens-diff-floor.js +11 -76
  67. package/.agents/scripts/lib/audit-suite/runner.js +13 -43
  68. package/.agents/scripts/lib/audit-suite/selector.js +49 -349
  69. package/.agents/scripts/lib/audit-suite/substitutions.js +12 -40
  70. package/.agents/scripts/lib/audit-suite/workflow-loader.js +3 -15
  71. package/.agents/scripts/lib/audit-to-stories/audit-label-taxonomy.js +11 -73
  72. package/.agents/scripts/lib/audit-to-stories/audit-lenses.js +8 -37
  73. package/.agents/scripts/lib/audit-to-stories/build-story-body.js +25 -143
  74. package/.agents/scripts/lib/audit-to-stories/dedupe-against-github.js +14 -80
  75. package/.agents/scripts/lib/audit-to-stories/epic-grouping-directive.js +4 -18
  76. package/.agents/scripts/lib/audit-to-stories/finding-adapter.js +7 -40
  77. package/.agents/scripts/lib/audit-to-stories/group-findings.js +9 -39
  78. package/.agents/scripts/lib/audit-to-stories/issue-corpus.js +10 -66
  79. package/.agents/scripts/lib/audit-to-stories/issue-index.js +6 -30
  80. package/.agents/scripts/lib/audit-to-stories/issues-file.js +6 -36
  81. package/.agents/scripts/lib/audit-to-stories/ledger-commit.js +17 -69
  82. package/.agents/scripts/lib/audit-to-stories/ledger-pr.js +17 -85
  83. package/.agents/scripts/lib/audit-to-stories/ledger-record.js +10 -48
  84. package/.agents/scripts/lib/audit-to-stories/parse-audit-md.js +38 -146
  85. package/.agents/scripts/lib/audit-to-stories/seed-from-findings.js +7 -42
  86. package/.agents/scripts/lib/audit-to-stories/wire-dependencies.js +10 -57
  87. package/.agents/scripts/lib/baseline-loader.js +12 -51
  88. package/.agents/scripts/lib/baseline-schema-registry.js +5 -22
  89. package/.agents/scripts/lib/baselines/component-matcher.js +3 -12
  90. package/.agents/scripts/lib/baselines/components.js +10 -61
  91. package/.agents/scripts/lib/baselines/coverage-updater-cli.js +7 -36
  92. package/.agents/scripts/lib/baselines/crap-preview-incremental.js +7 -19
  93. package/.agents/scripts/lib/baselines/crap-preview-scan.js +19 -45
  94. package/.agents/scripts/lib/baselines/crap-updater-cli.js +16 -65
  95. package/.agents/scripts/lib/baselines/diff-scope-cli.js +5 -33
  96. package/.agents/scripts/lib/baselines/duplication-scanner.js +11 -60
  97. package/.agents/scripts/lib/baselines/env-overrides.js +12 -67
  98. package/.agents/scripts/lib/baselines/envelope.js +13 -129
  99. package/.agents/scripts/lib/baselines/exit-codes.js +6 -49
  100. package/.agents/scripts/lib/baselines/git-base.js +23 -142
  101. package/.agents/scripts/lib/baselines/kernel.js +11 -111
  102. package/.agents/scripts/lib/baselines/kinds/_crap-new-method-gate.js +9 -47
  103. package/.agents/scripts/lib/baselines/kinds/_crap-read.js +8 -51
  104. package/.agents/scripts/lib/baselines/kinds/_shared-metric.js +7 -62
  105. package/.agents/scripts/lib/baselines/kinds/bundle-size.js +8 -29
  106. package/.agents/scripts/lib/baselines/kinds/coverage.js +3 -15
  107. package/.agents/scripts/lib/baselines/kinds/crap.js +94 -415
  108. package/.agents/scripts/lib/baselines/kinds/duplication.js +4 -30
  109. package/.agents/scripts/lib/baselines/kinds/kind-factory.js +7 -53
  110. package/.agents/scripts/lib/baselines/kinds/maintainability.js +15 -80
  111. package/.agents/scripts/lib/baselines/kinds/mutation.js +12 -72
  112. package/.agents/scripts/lib/baselines/maintainability-baseline-io.js +4 -11
  113. package/.agents/scripts/lib/baselines/merge-envelopes.js +30 -146
  114. package/.agents/scripts/lib/baselines/path-canon.js +19 -128
  115. package/.agents/scripts/lib/baselines/preview-gates.js +8 -37
  116. package/.agents/scripts/lib/baselines/reader.js +14 -107
  117. package/.agents/scripts/lib/baselines/refresh-service.js +35 -252
  118. package/.agents/scripts/lib/baselines/scope.js +11 -135
  119. package/.agents/scripts/lib/baselines/writer.js +16 -149
  120. package/.agents/scripts/lib/bdd-runner-detect.js +18 -113
  121. package/.agents/scripts/lib/bdd-scenario-budget.js +9 -36
  122. package/.agents/scripts/lib/bdd-scenario-scanner.js +11 -73
  123. package/.agents/scripts/lib/bdd-step-index.js +26 -100
  124. package/.agents/scripts/lib/bootstrap/baseline-merge-driver.js +23 -103
  125. package/.agents/scripts/lib/bootstrap/branch-protection.js +2 -5
  126. package/.agents/scripts/lib/bootstrap/commit-push.js +12 -50
  127. package/.agents/scripts/lib/bootstrap/gh-preflight.js +14 -101
  128. package/.agents/scripts/lib/bootstrap/hitl-confirm.js +5 -30
  129. package/.agents/scripts/lib/bootstrap/install-ledger.js +17 -73
  130. package/.agents/scripts/lib/bootstrap/issue-forms-template.js +17 -121
  131. package/.agents/scripts/lib/bootstrap/manifest.js +15 -86
  132. package/.agents/scripts/lib/bootstrap/merge-methods.js +4 -33
  133. package/.agents/scripts/lib/bootstrap/preflight.js +12 -61
  134. package/.agents/scripts/lib/bootstrap/project-bootstrap.js +34 -235
  135. package/.agents/scripts/lib/bootstrap/prompt.js +21 -129
  136. package/.agents/scripts/lib/bootstrap/quality-bootstrap.js +27 -141
  137. package/.agents/scripts/lib/bootstrap/summary.js +1 -8
  138. package/.agents/scripts/lib/bootstrap/workflow-audit.js +11 -84
  139. package/.agents/scripts/lib/branch-name-guard.js +4 -23
  140. package/.agents/scripts/lib/changed-files.js +39 -121
  141. package/.agents/scripts/lib/checks/core-bare-clean.js +4 -24
  142. package/.agents/scripts/lib/checks/index.js +18 -101
  143. package/.agents/scripts/lib/checks/loop-health.js +11 -53
  144. package/.agents/scripts/lib/checks/state.js +16 -91
  145. package/.agents/scripts/lib/checks/story-init-not-backgrounded.js +10 -61
  146. package/.agents/scripts/lib/checks/subagent-agent-tool-required.js +14 -83
  147. package/.agents/scripts/lib/child-exec.js +39 -108
  148. package/.agents/scripts/lib/cli/standard-args.js +9 -116
  149. package/.agents/scripts/lib/cli-args.js +31 -146
  150. package/.agents/scripts/lib/cli-usage.js +5 -27
  151. package/.agents/scripts/lib/cli-utils.js +2 -12
  152. package/.agents/scripts/lib/close-validation/commands.js +13 -76
  153. package/.agents/scripts/lib/close-validation/gates.js +92 -331
  154. package/.agents/scripts/lib/close-validation/process.js +121 -151
  155. package/.agents/scripts/lib/close-validation/projections/advisories.js +5 -31
  156. package/.agents/scripts/lib/close-validation/projections/crap.js +19 -67
  157. package/.agents/scripts/lib/close-validation/projections/head-sha.js +1 -17
  158. package/.agents/scripts/lib/close-validation/projections/inputs.js +4 -34
  159. package/.agents/scripts/lib/close-validation/projections/maintainability.js +11 -58
  160. package/.agents/scripts/lib/close-validation/runner.js +53 -110
  161. package/.agents/scripts/lib/command-header.js +6 -28
  162. package/.agents/scripts/lib/config/acceptance-eval.js +4 -30
  163. package/.agents/scripts/lib/config/baselines.js +3 -14
  164. package/.agents/scripts/lib/config/ci.js +8 -38
  165. package/.agents/scripts/lib/config/commands.js +1 -15
  166. package/.agents/scripts/lib/config/defaults.js +4 -33
  167. package/.agents/scripts/lib/config/delivery-routing.js +6 -34
  168. package/.agents/scripts/lib/config/explain.js +10 -83
  169. package/.agents/scripts/lib/config/gates/coverage.schema.js +0 -12
  170. package/.agents/scripts/lib/config/gates/crap-incremental-coverage.schema.js +3 -31
  171. package/.agents/scripts/lib/config/gates/crap.schema.js +1 -34
  172. package/.agents/scripts/lib/config/gates/duplication.schema.js +1 -8
  173. package/.agents/scripts/lib/config/gates/index.js +2 -17
  174. package/.agents/scripts/lib/config/gates/maintainability.schema.js +1 -20
  175. package/.agents/scripts/lib/config/gates/mutation.schema.js +1 -7
  176. package/.agents/scripts/lib/config/gates/shared.js +4 -64
  177. package/.agents/scripts/lib/config/github.js +4 -22
  178. package/.agents/scripts/lib/config/limits.js +4 -57
  179. package/.agents/scripts/lib/config/paths.js +2 -21
  180. package/.agents/scripts/lib/config/qa.js +4 -38
  181. package/.agents/scripts/lib/config/quality.js +76 -432
  182. package/.agents/scripts/lib/config/runners.js +12 -56
  183. package/.agents/scripts/lib/config/runtime.js +13 -57
  184. package/.agents/scripts/lib/config/shared.js +2 -16
  185. package/.agents/scripts/lib/config/sync-agentrc.js +9 -50
  186. package/.agents/scripts/lib/config/temp-paths.js +40 -280
  187. package/.agents/scripts/lib/config/validate-orchestration.js +5 -17
  188. package/.agents/scripts/lib/config/worktree-isolation.js +9 -28
  189. package/.agents/scripts/lib/config-resolver.js +11 -52
  190. package/.agents/scripts/lib/config-schema-shared.js +1 -4
  191. package/.agents/scripts/lib/config-settings-schema-delivery.js +16 -291
  192. package/.agents/scripts/lib/config-settings-schema-quality.js +7 -219
  193. package/.agents/scripts/lib/config-settings-schema.js +37 -274
  194. package/.agents/scripts/lib/coverage-baseline.js +20 -110
  195. package/.agents/scripts/lib/coverage-capture-fullscope.js +18 -35
  196. package/.agents/scripts/lib/coverage-capture-incremental.js +15 -45
  197. package/.agents/scripts/lib/coverage-capture-usage.js +8 -25
  198. package/.agents/scripts/lib/coverage-capture.js +99 -224
  199. package/.agents/scripts/lib/coverage-utils.js +14 -79
  200. package/.agents/scripts/lib/cpu-pool.js +17 -123
  201. package/.agents/scripts/lib/crap-baseline-join.js +16 -88
  202. package/.agents/scripts/lib/crap-coordinates.js +6 -25
  203. package/.agents/scripts/lib/crap-engine.js +40 -153
  204. package/.agents/scripts/lib/crap-method-identity.js +16 -78
  205. package/.agents/scripts/lib/crap-utils.js +31 -155
  206. package/.agents/scripts/lib/cyclomatic-ceiling.js +14 -87
  207. package/.agents/scripts/lib/cyclomatic-scope.js +10 -50
  208. package/.agents/scripts/lib/dead-exports-knip.js +18 -56
  209. package/.agents/scripts/lib/dead-exports-mode.js +5 -24
  210. package/.agents/scripts/lib/degraded-mode.js +3 -26
  211. package/.agents/scripts/lib/dependency-parser.js +8 -40
  212. package/.agents/scripts/lib/dependency-version.js +13 -35
  213. package/.agents/scripts/lib/detect-package-manager.js +6 -36
  214. package/.agents/scripts/lib/doc-tiers.js +22 -124
  215. package/.agents/scripts/lib/duplicate-search.js +8 -72
  216. package/.agents/scripts/lib/env-loader.js +5 -27
  217. package/.agents/scripts/lib/error-redactor.js +6 -31
  218. package/.agents/scripts/lib/errors/index.js +2 -22
  219. package/.agents/scripts/lib/escomplex-ast-compat.js +22 -163
  220. package/.agents/scripts/lib/escomplex-kernel.js +21 -123
  221. package/.agents/scripts/lib/feedback-loop/graduator-core.js +94 -419
  222. package/.agents/scripts/lib/feedback-loop/prior-feedback-fetcher.js +20 -98
  223. package/.agents/scripts/lib/feedback-loop/retro-proposals-graduator.js +27 -149
  224. package/.agents/scripts/lib/findings/audit-ledger.js +23 -97
  225. package/.agents/scripts/lib/findings/classify-finding.js +14 -69
  226. package/.agents/scripts/lib/findings/promote-finding.js +14 -112
  227. package/.agents/scripts/lib/findings/provenance-field.js +11 -52
  228. package/.agents/scripts/lib/findings/route-finding.js +37 -255
  229. package/.agents/scripts/lib/findings/semantic-issue-search.js +14 -59
  230. package/.agents/scripts/lib/findings/severity.js +18 -104
  231. package/.agents/scripts/lib/format-generated-json.js +12 -44
  232. package/.agents/scripts/lib/full-suite-lock.js +160 -429
  233. package/.agents/scripts/lib/full-suite-queue.js +213 -0
  234. package/.agents/scripts/lib/gates/baseline-store.js +5 -9
  235. package/.agents/scripts/lib/gates/friction.js +1 -3
  236. package/.agents/scripts/lib/generated/agentrc-validator.js +2 -2
  237. package/.agents/scripts/lib/gh-exec.js +123 -191
  238. package/.agents/scripts/lib/git/cached-fetch.js +9 -52
  239. package/.agents/scripts/lib/git/sync-from-base.js +15 -107
  240. package/.agents/scripts/lib/git-branch-cleanup.js +14 -61
  241. package/.agents/scripts/lib/git-branch-lifecycle.js +16 -87
  242. package/.agents/scripts/lib/git-utils.js +37 -161
  243. package/.agents/scripts/lib/github/framework-repo.js +8 -71
  244. package/.agents/scripts/lib/github-url.js +2 -17
  245. package/.agents/scripts/lib/import-graph.js +11 -38
  246. package/.agents/scripts/lib/install-cmd-parser.js +4 -13
  247. package/.agents/scripts/lib/json-utils.js +3 -18
  248. package/.agents/scripts/lib/label-constants.js +16 -111
  249. package/.agents/scripts/lib/label-taxonomy.js +4 -30
  250. package/.agents/scripts/lib/maintainability-engine.js +12 -80
  251. package/.agents/scripts/lib/maintainability-unscorable.js +5 -25
  252. package/.agents/scripts/lib/maintainability-utils.js +16 -92
  253. package/.agents/scripts/lib/mandrel-catalog.js +12 -70
  254. package/.agents/scripts/lib/notifications/notifier.js +13 -38
  255. package/.agents/scripts/lib/npm-scripts.js +4 -23
  256. package/.agents/scripts/lib/observability/metrics-ledger.js +16 -76
  257. package/.agents/scripts/lib/observability/runtime-friction.js +44 -286
  258. package/.agents/scripts/lib/observability/signal-validator.js +5 -37
  259. package/.agents/scripts/lib/observability/signals-writer.js +11 -121
  260. package/.agents/scripts/lib/observability/source-classifier.js +22 -203
  261. package/.agents/scripts/lib/observability/terse-result.js +14 -47
  262. package/.agents/scripts/lib/onboard/init-tail.js +13 -74
  263. package/.agents/scripts/lib/onboard/scaffold-docs.js +11 -34
  264. package/.agents/scripts/lib/orchestration/acceptance-eval-decision.js +25 -139
  265. package/.agents/scripts/lib/orchestration/auto-merge-cwd.js +11 -66
  266. package/.agents/scripts/lib/orchestration/behind-recovery.js +10 -55
  267. package/.agents/scripts/lib/orchestration/ceremony-routing.js +28 -156
  268. package/.agents/scripts/lib/orchestration/change-set.js +7 -36
  269. package/.agents/scripts/lib/orchestration/check-baselines/phases/compare.js +9 -46
  270. package/.agents/scripts/lib/orchestration/check-baselines/phases/evaluate.js +11 -44
  271. package/.agents/scripts/lib/orchestration/check-baselines/phases/floors.js +5 -24
  272. package/.agents/scripts/lib/orchestration/check-baselines/phases/friction.js +3 -12
  273. package/.agents/scripts/lib/orchestration/check-baselines/phases/parse-args.js +5 -38
  274. package/.agents/scripts/lib/orchestration/check-baselines/phases/pipeline.js +3 -8
  275. package/.agents/scripts/lib/orchestration/check-baselines/phases/refresh-ack.js +28 -136
  276. package/.agents/scripts/lib/orchestration/check-baselines/phases/report.js +3 -13
  277. package/.agents/scripts/lib/orchestration/check-state.js +92 -0
  278. package/.agents/scripts/lib/orchestration/ci-gap-intake.js +37 -144
  279. package/.agents/scripts/lib/orchestration/ci-rerun-guard.js +121 -157
  280. package/.agents/scripts/lib/orchestration/code-review.js +24 -128
  281. package/.agents/scripts/lib/orchestration/column-sync.js +23 -111
  282. package/.agents/scripts/lib/orchestration/complexity-gate.js +118 -462
  283. package/.agents/scripts/lib/orchestration/deliver-recover.js +36 -168
  284. package/.agents/scripts/lib/orchestration/dependency-analyzer.js +4 -35
  285. package/.agents/scripts/lib/orchestration/dependency-candidates.js +9 -41
  286. package/.agents/scripts/lib/orchestration/diff-magnitude.js +25 -115
  287. package/.agents/scripts/lib/orchestration/doc-reader.js +2 -6
  288. package/.agents/scripts/lib/orchestration/docs-digest.js +13 -51
  289. package/.agents/scripts/lib/orchestration/epic-candidates.js +13 -53
  290. package/.agents/scripts/lib/orchestration/epic-checklist.js +9 -33
  291. package/.agents/scripts/lib/orchestration/epic-container.js +41 -167
  292. package/.agents/scripts/lib/orchestration/epic-expansion.js +10 -40
  293. package/.agents/scripts/lib/orchestration/epic-rollup.js +55 -207
  294. package/.agents/scripts/lib/orchestration/file-assumption-enum.js +2 -22
  295. package/.agents/scripts/lib/orchestration/file-assumptions.js +45 -253
  296. package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-detect.js +9 -46
  297. package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-reap.js +7 -57
  298. package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches.js +21 -126
  299. package/.agents/scripts/lib/orchestration/git-cleanup/phases/cli.js +2 -6
  300. package/.agents/scripts/lib/orchestration/git-cleanup/phases/fast-forward.js +1 -4
  301. package/.agents/scripts/lib/orchestration/git-cleanup/phases/filters.js +1 -5
  302. package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes-ff.js +9 -34
  303. package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes.js +41 -190
  304. package/.agents/scripts/lib/orchestration/git-cleanup/phases/merged-tip.js +9 -45
  305. package/.agents/scripts/lib/orchestration/git-cleanup/phases/parse-args.js +1 -4
  306. package/.agents/scripts/lib/orchestration/git-cleanup/phases/phase-drivers.js +19 -85
  307. package/.agents/scripts/lib/orchestration/git-cleanup/phases/prompts.js +3 -17
  308. package/.agents/scripts/lib/orchestration/git-cleanup/phases/prune.js +1 -5
  309. package/.agents/scripts/lib/orchestration/git-cleanup/phases/render.js +16 -100
  310. package/.agents/scripts/lib/orchestration/git-cleanup/phases/stashes.js +1 -4
  311. package/.agents/scripts/lib/orchestration/lease-guard-shared.js +16 -67
  312. package/.agents/scripts/lib/orchestration/lifecycle/emit-ledger-event.js +9 -33
  313. package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-flip-failed.js +8 -29
  314. package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-unlanded.js +15 -68
  315. package/.agents/scripts/lib/orchestration/light-backstop.js +11 -49
  316. package/.agents/scripts/lib/orchestration/light-escalation.js +21 -89
  317. package/.agents/scripts/lib/orchestration/light-suitability.js +37 -307
  318. package/.agents/scripts/lib/orchestration/merge-block-class.js +39 -216
  319. package/.agents/scripts/lib/orchestration/merge-poll.js +104 -377
  320. package/.agents/scripts/lib/orchestration/pinned-identifier-lint.js +17 -57
  321. package/.agents/scripts/lib/orchestration/plan-context.js +55 -318
  322. package/.agents/scripts/lib/orchestration/plan-critic-conditions.js +22 -79
  323. package/.agents/scripts/lib/orchestration/plan-critics-evaluate.js +5 -31
  324. package/.agents/scripts/lib/orchestration/plan-metrics.js +29 -108
  325. package/.agents/scripts/lib/orchestration/plan-navigation.js +8 -27
  326. package/.agents/scripts/lib/orchestration/plan-persist/acceptance-handle-repair.js +12 -49
  327. package/.agents/scripts/lib/orchestration/plan-persist/audit-provenance.js +18 -73
  328. package/.agents/scripts/lib/orchestration/plan-persist/changes-repair.js +16 -78
  329. package/.agents/scripts/lib/orchestration/plan-persist/cross-plan-links.js +6 -30
  330. package/.agents/scripts/lib/orchestration/plan-persist/epic-adoption.js +14 -65
  331. package/.agents/scripts/lib/orchestration/plan-persist/epic-ops.js +21 -76
  332. package/.agents/scripts/lib/orchestration/plan-persist/external-deps.js +6 -43
  333. package/.agents/scripts/lib/orchestration/plan-persist/persist-helpers.js +14 -68
  334. package/.agents/scripts/lib/orchestration/plan-persist/plan-context-source.js +9 -41
  335. package/.agents/scripts/lib/orchestration/plan-persist/run-plan-persist.js +71 -289
  336. package/.agents/scripts/lib/orchestration/plan-persist/soft-findings.js +2 -12
  337. package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +96 -362
  338. package/.agents/scripts/lib/orchestration/plan-persist/summary.js +9 -39
  339. package/.agents/scripts/lib/orchestration/plan-persist/supersede-ops.js +60 -186
  340. package/.agents/scripts/lib/orchestration/plan-persist/wave-collision-gate.js +9 -49
  341. package/.agents/scripts/lib/orchestration/plan-persist/wave-serialisation.js +7 -28
  342. package/.agents/scripts/lib/orchestration/plan-reachability.js +13 -42
  343. package/.agents/scripts/lib/orchestration/plan-run-labels/reap.js +16 -91
  344. package/.agents/scripts/lib/orchestration/plan-runner/worktree-sweep.js +16 -54
  345. package/.agents/scripts/lib/orchestration/plan-text-hygiene.js +10 -52
  346. package/.agents/scripts/lib/orchestration/planning/authoring-context.js +14 -109
  347. package/.agents/scripts/lib/orchestration/planning/memory-pool-advisory.js +11 -83
  348. package/.agents/scripts/lib/orchestration/pr-watch.js +48 -306
  349. package/.agents/scripts/lib/orchestration/project-meta-cache.js +15 -80
  350. package/.agents/scripts/lib/orchestration/project-meta-resolver.js +10 -51
  351. package/.agents/scripts/lib/orchestration/reassert-status-column.js +12 -76
  352. package/.agents/scripts/lib/orchestration/remote-verifier.js +12 -36
  353. package/.agents/scripts/lib/orchestration/resolve-stories.js +33 -164
  354. package/.agents/scripts/lib/orchestration/retro-proposals.js +66 -361
  355. package/.agents/scripts/lib/orchestration/review-base-ref.js +9 -43
  356. package/.agents/scripts/lib/orchestration/review-depth.js +12 -91
  357. package/.agents/scripts/lib/orchestration/review-providers/codex.js +10 -111
  358. package/.agents/scripts/lib/orchestration/review-providers/degraded-gates.js +13 -71
  359. package/.agents/scripts/lib/orchestration/review-providers/findings-renderer.js +7 -51
  360. package/.agents/scripts/lib/orchestration/review-providers/mi-exemptions.js +8 -53
  361. package/.agents/scripts/lib/orchestration/review-providers/native.js +30 -214
  362. package/.agents/scripts/lib/orchestration/review-providers/parse-findings.js +7 -52
  363. package/.agents/scripts/lib/orchestration/review-providers/review-depth.js +4 -33
  364. package/.agents/scripts/lib/orchestration/review-providers/review-provider-factory.js +11 -71
  365. package/.agents/scripts/lib/orchestration/review-providers/scoped-lint.js +19 -131
  366. package/.agents/scripts/lib/orchestration/review-providers/security-review.js +6 -89
  367. package/.agents/scripts/lib/orchestration/review-providers/types.js +26 -56
  368. package/.agents/scripts/lib/orchestration/review-providers/ultrareview.js +3 -46
  369. package/.agents/scripts/lib/orchestration/run-epilogue.js +245 -326
  370. package/.agents/scripts/lib/orchestration/run-scoped-config.js +55 -159
  371. package/.agents/scripts/lib/orchestration/single-story-close/close-note.js +7 -34
  372. package/.agents/scripts/lib/orchestration/single-story-close/failed-terminal.js +16 -89
  373. package/.agents/scripts/lib/orchestration/single-story-close/gate-log.js +18 -109
  374. package/.agents/scripts/lib/orchestration/single-story-close/phases/auto-merge.js +83 -239
  375. package/.agents/scripts/lib/orchestration/single-story-close/phases/base-sync.js +20 -82
  376. package/.agents/scripts/lib/orchestration/single-story-close/phases/close-validation.js +103 -97
  377. package/.agents/scripts/lib/orchestration/single-story-close/phases/code-review.js +8 -64
  378. package/.agents/scripts/lib/orchestration/single-story-close/phases/confirm-merge.js +136 -486
  379. package/.agents/scripts/lib/orchestration/single-story-close/phases/conventional-subject.js +30 -134
  380. package/.agents/scripts/lib/orchestration/single-story-close/phases/graphql-preflight.js +96 -0
  381. package/.agents/scripts/lib/orchestration/single-story-close/phases/lock-wait-pending.js +49 -0
  382. package/.agents/scripts/lib/orchestration/single-story-close/phases/normalize-pr-title.js +13 -86
  383. package/.agents/scripts/lib/orchestration/single-story-close/phases/options.js +20 -95
  384. package/.agents/scripts/lib/orchestration/single-story-close/phases/post-land.js +46 -203
  385. package/.agents/scripts/lib/orchestration/single-story-close/phases/pre-gate-steps.js +8 -50
  386. package/.agents/scripts/lib/orchestration/single-story-close/phases/pull-request.js +12 -83
  387. package/.agents/scripts/lib/orchestration/single-story-close/phases/push.js +6 -39
  388. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-block.js +1 -6
  389. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-outcome.js +4 -28
  390. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-override.js +6 -51
  391. package/.agents/scripts/lib/orchestration/single-story-close/phases/worktree-reap.js +6 -34
  392. package/.agents/scripts/lib/orchestration/single-story-close/phases/wrong-tree-guard.js +23 -121
  393. package/.agents/scripts/lib/orchestration/single-story-close/runner.js +180 -273
  394. package/.agents/scripts/lib/orchestration/single-story-lease-guard.js +15 -69
  395. package/.agents/scripts/lib/orchestration/story-body-gate.js +4 -23
  396. package/.agents/scripts/lib/orchestration/story-close/baseline-upward-writeback.js +50 -179
  397. package/.agents/scripts/lib/orchestration/story-close/context-budget-writeback.js +11 -41
  398. package/.agents/scripts/lib/orchestration/story-close/format-autofix.js +23 -311
  399. package/.agents/scripts/lib/orchestration/story-close/phases/local-lens-review.js +22 -147
  400. package/.agents/scripts/lib/orchestration/story-close/phases/review-core.js +16 -67
  401. package/.agents/scripts/lib/orchestration/story-deliver-terminal-schema.js +12 -68
  402. package/.agents/scripts/lib/orchestration/story-deliver-terminal.js +42 -200
  403. package/.agents/scripts/lib/orchestration/story-follow-ups.js +167 -252
  404. package/.agents/scripts/lib/orchestration/story-init-envelope.js +52 -0
  405. package/.agents/scripts/lib/orchestration/story-init-remote.js +2 -6
  406. package/.agents/scripts/lib/orchestration/story-reachability.js +3 -23
  407. package/.agents/scripts/lib/orchestration/task-body-validator.js +12 -135
  408. package/.agents/scripts/lib/orchestration/ticket-lease.js +28 -131
  409. package/.agents/scripts/lib/orchestration/ticket-validator-conflicts.js +15 -149
  410. package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +5 -33
  411. package/.agents/scripts/lib/orchestration/ticket-validator.js +63 -344
  412. package/.agents/scripts/lib/orchestration/ticketing/bulk.js +51 -244
  413. package/.agents/scripts/lib/orchestration/ticketing/reads.js +39 -261
  414. package/.agents/scripts/lib/orchestration/ticketing/state.js +14 -68
  415. package/.agents/scripts/lib/orchestration/ticketing/transition.js +46 -263
  416. package/.agents/scripts/lib/orchestration/ticketing.js +2 -26
  417. package/.agents/scripts/lib/orchestration/verify-credit.js +18 -79
  418. package/.agents/scripts/lib/orchestration/worktree-dirty.js +5 -30
  419. package/.agents/scripts/lib/path-security.js +3 -6
  420. package/.agents/scripts/lib/plan-phase-cleanup.js +9 -49
  421. package/.agents/scripts/lib/preflight-runner.js +13 -69
  422. package/.agents/scripts/lib/process-group.js +143 -0
  423. package/.agents/scripts/lib/project-root.js +2 -8
  424. package/.agents/scripts/lib/provider-factory.js +2 -25
  425. package/.agents/scripts/lib/qa/console-allowlist.js +10 -59
  426. package/.agents/scripts/lib/qa/qa-session.js +15 -69
  427. package/.agents/scripts/lib/qa/redact-evidence.js +18 -129
  428. package/.agents/scripts/lib/qa/resolve-qa-contract.js +26 -135
  429. package/.agents/scripts/lib/qa/resolve-selection.js +16 -84
  430. package/.agents/scripts/lib/reserved-test-ids.js +9 -47
  431. package/.agents/scripts/lib/runtime-deps/dep-resolution.js +13 -53
  432. package/.agents/scripts/lib/runtime-deps/ensure-installed.js +10 -44
  433. package/.agents/scripts/lib/runtime-deps/manifest.js +10 -30
  434. package/.agents/scripts/lib/runtime-deps/parser-major.js +15 -51
  435. package/.agents/scripts/lib/runtime-deps/preflight.js +4 -22
  436. package/.agents/scripts/lib/runtime-deps/scan-imports.js +11 -55
  437. package/.agents/scripts/lib/signals/detectors/common.js +12 -38
  438. package/.agents/scripts/lib/signals/index.js +2 -19
  439. package/.agents/scripts/lib/signals/schema.js +14 -109
  440. package/.agents/scripts/lib/signals/write.js +2 -11
  441. package/.agents/scripts/lib/single-story/confirm-merge.js +31 -72
  442. package/.agents/scripts/lib/single-story/story-merged-notify.js +8 -49
  443. package/.agents/scripts/lib/single-story-sweep/protection-ctx.js +4 -26
  444. package/.agents/scripts/lib/single-story-sweep/protection.js +13 -100
  445. package/.agents/scripts/lib/single-story-sweep/sweep-lock.js +60 -258
  446. package/.agents/scripts/lib/single-story-sweep.js +14 -97
  447. package/.agents/scripts/lib/skills/parse-skill.js +13 -59
  448. package/.agents/scripts/lib/skills/skills-index.js +8 -29
  449. package/.agents/scripts/lib/skills/walk-skill-files.js +17 -78
  450. package/.agents/scripts/lib/source-extensions.js +11 -42
  451. package/.agents/scripts/lib/source-text/strip-js-comments.js +8 -41
  452. package/.agents/scripts/lib/stdio-flush.js +9 -36
  453. package/.agents/scripts/lib/story-adjacency.js +8 -40
  454. package/.agents/scripts/lib/story-body/body-format-lints.js +51 -66
  455. package/.agents/scripts/lib/story-body/footer-block.js +11 -44
  456. package/.agents/scripts/lib/story-body/story-body.js +123 -344
  457. package/.agents/scripts/lib/temp-retention.js +42 -143
  458. package/.agents/scripts/lib/templates/decomposer-prompts.js +18 -80
  459. package/.agents/scripts/lib/test-env.js +12 -65
  460. package/.agents/scripts/lib/test-run-credit.js +10 -65
  461. package/.agents/scripts/lib/test-runner-contract.js +19 -74
  462. package/.agents/scripts/lib/test-temp.js +38 -184
  463. package/.agents/scripts/lib/test-tiers.js +12 -96
  464. package/.agents/scripts/lib/ticket-body-sections.js +21 -96
  465. package/.agents/scripts/lib/transpile.js +15 -74
  466. package/.agents/scripts/lib/util/concurrent-map.js +6 -25
  467. package/.agents/scripts/lib/util/parse-id-list.js +8 -34
  468. package/.agents/scripts/lib/util/poll-loop.js +8 -28
  469. package/.agents/scripts/lib/util/with-timeout.js +2 -11
  470. package/.agents/scripts/lib/validation-evidence.js +21 -96
  471. package/.agents/scripts/lib/wave-runner/footprint.js +17 -70
  472. package/.agents/scripts/lib/wave-runner/live-probe.js +67 -209
  473. package/.agents/scripts/lib/wave-runner/ready-set.js +72 -301
  474. package/.agents/scripts/lib/workers/crap-worker.js +11 -64
  475. package/.agents/scripts/lib/workers/maintainability-report-worker.js +8 -45
  476. package/.agents/scripts/lib/workers/maintainability-worker.js +5 -21
  477. package/.agents/scripts/lib/workers/serve-worker-messages.js +2 -18
  478. package/.agents/scripts/lib/workflow-closure.js +22 -105
  479. package/.agents/scripts/lib/workspace-provisioner.js +16 -54
  480. package/.agents/scripts/lib/worktree/git-hooks.js +15 -60
  481. package/.agents/scripts/lib/worktree/lifecycle/force-drain.js +20 -60
  482. package/.agents/scripts/lib/worktree/lifecycle/merge-reachability.js +10 -62
  483. package/.agents/scripts/lib/worktree/lifecycle/pending-cleanup.js +22 -86
  484. package/.agents/scripts/lib/worktree/lifecycle/reap.js +24 -126
  485. package/.agents/scripts/lib/worktree/lifecycle-manager.js +2 -20
  486. package/.agents/scripts/lib/worktree/node-modules-strategy.js +46 -180
  487. package/.agents/scripts/lib/worktree-manager.js +15 -40
  488. package/.agents/scripts/lint-issue-body.js +12 -68
  489. package/.agents/scripts/mandrel-update-preflight.js +10 -70
  490. package/.agents/scripts/merge-baseline.js +30 -105
  491. package/.agents/scripts/nav-registry-diff.js +22 -108
  492. package/.agents/scripts/notify.js +12 -69
  493. package/.agents/scripts/plan-context.js +97 -92
  494. package/.agents/scripts/plan-critics.js +12 -66
  495. package/.agents/scripts/plan-persist.js +71 -137
  496. package/.agents/scripts/plan-run-epilogue.js +20 -43
  497. package/.agents/scripts/pr-watch-with-update.js +79 -263
  498. package/.agents/scripts/providers/github/auth.js +3 -8
  499. package/.agents/scripts/providers/github/blocked-by-add.js +14 -61
  500. package/.agents/scripts/providers/github/board-add.js +5 -21
  501. package/.agents/scripts/providers/github/branch-protection.js +11 -43
  502. package/.agents/scripts/providers/github/cache.js +2 -14
  503. package/.agents/scripts/providers/github/comments.js +7 -40
  504. package/.agents/scripts/providers/github/compose.js +3 -19
  505. package/.agents/scripts/providers/github/errors.js +22 -125
  506. package/.agents/scripts/providers/github/issues.js +31 -123
  507. package/.agents/scripts/providers/github/labels.js +24 -124
  508. package/.agents/scripts/providers/github/mappers.js +5 -27
  509. package/.agents/scripts/providers/github/merge-methods.js +3 -22
  510. package/.agents/scripts/providers/github/project-board.js +2 -17
  511. package/.agents/scripts/providers/github/projects-v2-graphql.js +3 -6
  512. package/.agents/scripts/providers/github/request-helpers.js +5 -32
  513. package/.agents/scripts/providers/github/search-budget.js +9 -39
  514. package/.agents/scripts/providers/github/search-query.js +5 -26
  515. package/.agents/scripts/providers/github/sub-issue-add.js +15 -65
  516. package/.agents/scripts/providers/github/sub-issues.js +7 -36
  517. package/.agents/scripts/providers/github/tickets.js +32 -134
  518. package/.agents/scripts/providers/github.js +18 -59
  519. package/.agents/scripts/prune-plan-run-labels.js +12 -46
  520. package/.agents/scripts/quality-preview.js +35 -220
  521. package/.agents/scripts/resolve-doc-tiers.js +3 -26
  522. package/.agents/scripts/resolve-stories.js +16 -67
  523. package/.agents/scripts/resync-status-column.js +6 -25
  524. package/.agents/scripts/run-tests.js +29 -104
  525. package/.agents/scripts/single-story-close.js +23 -135
  526. package/.agents/scripts/single-story-confirm-merge.js +32 -139
  527. package/.agents/scripts/single-story-init.js +47 -259
  528. package/.agents/scripts/stories-wave-tick.js +179 -415
  529. package/.agents/scripts/sync-agentrc.js +3 -21
  530. package/.agents/scripts/sync-claude-agents.js +9 -55
  531. package/.agents/scripts/sync-claude-commands.js +20 -110
  532. package/.agents/scripts/test-wrapper.js +6 -43
  533. package/.agents/scripts/update-coverage-baseline.js +5 -22
  534. package/.agents/scripts/update-crap-baseline.js +7 -30
  535. package/.agents/scripts/update-duplication-baseline.js +16 -92
  536. package/.agents/scripts/update-maintainability-baseline.js +8 -62
  537. package/.agents/scripts/update-ticket-state.js +1 -7
  538. package/.agents/scripts/validate-skills.js +6 -26
  539. package/.agents/skills/core/gates-and-baselines/reference.md +0 -1
  540. package/.agents/skills/skills.index.json +2 -2
  541. package/.agents/skills/stack/qa/playwright/SKILL.md +26 -0
  542. package/.agents/templates/agent-protocol.md +2 -2
  543. package/.agents/templates/docs/audit-sweep-runbook.md +3 -4
  544. package/.agents/workflows/audit-accessibility.md +4 -7
  545. package/.agents/workflows/audit-adrs.md +3 -6
  546. package/.agents/workflows/audit-architecture.md +3 -11
  547. package/.agents/workflows/audit-baselines.md +6 -9
  548. package/.agents/workflows/audit-clean-code.md +8 -12
  549. package/.agents/workflows/audit-data-model.md +3 -7
  550. package/.agents/workflows/audit-dependencies.md +4 -7
  551. package/.agents/workflows/audit-devops.md +4 -8
  552. package/.agents/workflows/audit-documentation.md +1 -4
  553. package/.agents/workflows/audit-mobile.md +4 -7
  554. package/.agents/workflows/audit-navigability.md +3 -6
  555. package/.agents/workflows/audit-performance.md +2 -4
  556. package/.agents/workflows/audit-privacy.md +4 -7
  557. package/.agents/workflows/audit-quality.md +4 -7
  558. package/.agents/workflows/audit-security.md +4 -7
  559. package/.agents/workflows/audit-seo.md +4 -7
  560. package/.agents/workflows/audit-sre.md +4 -7
  561. package/.agents/workflows/audit-to-stories.md +17 -30
  562. package/.agents/workflows/audit-ux-ui.md +4 -7
  563. package/.agents/workflows/helpers/acceptance-self-eval.md +84 -157
  564. package/.agents/workflows/helpers/audit-lens-core.md +1 -1
  565. package/.agents/workflows/helpers/code-quality-guardrails.md +12 -15
  566. package/.agents/workflows/helpers/code-review.md +4 -2
  567. package/.agents/workflows/helpers/deliver-digest.md +37 -28
  568. package/.agents/workflows/helpers/deliver-light.md +92 -101
  569. package/.agents/workflows/helpers/deliver-reference.md +162 -220
  570. package/.agents/workflows/helpers/deliver-story-reference.md +197 -607
  571. package/.agents/workflows/helpers/deliver-story.md +17 -18
  572. package/.agents/workflows/helpers/plan-reference.md +125 -167
  573. package/.agents/workflows/helpers/qa-core.md +12 -0
  574. package/.agents/workflows/mandrel-deliver.md +47 -31
  575. package/.agents/workflows/mandrel-plan.md +22 -21
  576. package/.agents/workflows/mandrel-update.md +36 -21
  577. package/.agents/workflows/memory-consolidate.md +1 -1
  578. package/.agents/workflows/qa-assist.md +27 -71
  579. package/.agents/workflows/qa-explore.md +19 -59
  580. package/.agents/workflows/qa-run.md +11 -33
  581. package/README.md +1 -1
  582. package/bin/mandrel.js +5 -46
  583. package/bin/postinstall.js +18 -107
  584. package/docs/CHANGELOG.md +60 -0
  585. package/lib/cli/doctor.js +11 -71
  586. package/lib/cli/init.js +26 -165
  587. package/lib/cli/migrate.js +5 -64
  588. package/lib/cli/registry.js +84 -467
  589. package/lib/cli/sync-agents.js +4 -64
  590. package/lib/cli/sync-commands.js +11 -64
  591. package/lib/cli/sync.js +34 -213
  592. package/lib/cli/uninstall.js +40 -219
  593. package/lib/cli/update.js +326 -523
  594. package/lib/cli/version-check.js +8 -72
  595. package/lib/cli/version-helpers.js +14 -87
  596. package/lib/migrations/helpers/retire-agentrc-key.js +11 -52
  597. package/lib/migrations/index.js +17 -92
  598. package/lib/migrations/steps/2.1.0-retire-mi-drop-knobs.js +2 -15
  599. package/lib/migrations/steps/2.1.0-retire-verify-concurrency-cap.js +1 -13
  600. package/lib/migrations/steps/2.11.0-retire-max-seed-words.js +2 -15
  601. package/lib/migrations/steps/2.2.0-retire-epic-ac-tags.js +9 -38
  602. package/lib/migrations/steps/2.20.0-retire-codebase-snapshot.js +1 -13
  603. package/lib/migrations/steps/2.32.0-retire-lint-baseline-command.js +2 -27
  604. package/lib/migrations/steps/2.57.0-retire-delivery-limit-knobs.js +2 -23
  605. package/lib/migrations/steps/2.57.0-retire-planning-limit-knobs.js +2 -27
  606. package/lib/migrations/steps/2.60.0-retire-audit-results-autofile.js +21 -0
  607. package/lib/migrations/steps/strip-removed-agentrc-keys.js +333 -0
  608. package/package.json +17 -14
  609. package/.agents/docs/SDLC.md +0 -590
  610. package/.agents/docs/quality-gates.md +0 -1179
  611. package/.agents/rules/known-tooling-behavior.md +0 -150
  612. package/.agents/rules/orchestration-error-handling.md +0 -61
  613. package/.agents/rules/test-seams.md +0 -59
  614. package/.agents/schemas/baselines/lighthouse.schema.json +0 -59
  615. package/.agents/schemas/baselines/lint.schema.json +0 -47
  616. package/.agents/schemas/model-attribution.schema.json +0 -53
  617. package/.agents/scripts/check-action-pinning.js +0 -260
  618. package/.agents/scripts/check-audit-attribution.js +0 -302
  619. package/.agents/scripts/check-baseline-drift.js +0 -211
  620. package/.agents/scripts/check-baseline-scope.js +0 -362
  621. package/.agents/scripts/check-generated-validator.js +0 -202
  622. package/.agents/scripts/check-knip-entries.js +0 -159
  623. package/.agents/scripts/check-lifecycle-lint.js +0 -294
  624. package/.agents/scripts/check-pinned-override-notes.js +0 -102
  625. package/.agents/scripts/check-schema-references.js +0 -366
  626. package/.agents/scripts/check-test-portability.js +0 -512
  627. package/.agents/scripts/check-workflow-citations.js +0 -332
  628. package/.agents/scripts/check-workflow-cli-lint.js +0 -299
  629. package/.agents/scripts/check-workflow-timeouts.js +0 -291
  630. package/.agents/scripts/install-matrix-assert.js +0 -326
  631. package/.agents/scripts/lib/audit-advisories.js +0 -195
  632. package/.agents/scripts/lib/audit-attribution.js +0 -134
  633. package/.agents/scripts/lib/baselines/drift-detector.js +0 -351
  634. package/.agents/scripts/lib/baselines/kinds/lighthouse.js +0 -87
  635. package/.agents/scripts/lib/baselines/kinds/lint.js +0 -184
  636. package/.agents/scripts/lib/baselines/orphan-pruner.js +0 -233
  637. package/.agents/scripts/lib/baselines/scope-assert.js +0 -223
  638. package/.agents/scripts/lib/baselines/scope-inventory.js +0 -314
  639. package/.agents/scripts/lib/c8-cli-path.js +0 -21
  640. package/.agents/scripts/lib/config/gates/lighthouse.schema.js +0 -51
  641. package/.agents/scripts/lib/config/gates/lint.schema.js +0 -18
  642. package/.agents/scripts/lib/dynamic-workflow/architecture-report-contract.js +0 -70
  643. package/.agents/scripts/lib/dynamic-workflow/audit-orchestrator.js +0 -284
  644. package/.agents/scripts/lib/dynamic-workflow/clean-code-report-contract.js +0 -80
  645. package/.agents/scripts/lib/dynamic-workflow/degraded-coverage.js +0 -81
  646. package/.agents/scripts/lib/dynamic-workflow/documentation-report-contract.js +0 -87
  647. package/.agents/scripts/lib/dynamic-workflow/performance-report-contract.js +0 -74
  648. package/.agents/scripts/lib/dynamic-workflow/quality-report-contract.js +0 -90
  649. package/.agents/scripts/lib/dynamic-workflow/report-contract-core.js +0 -43
  650. package/.agents/scripts/lib/dynamic-workflow/security-report-contract.js +0 -83
  651. package/.agents/scripts/lib/fs-walk.js +0 -52
  652. package/.agents/scripts/lib/knip-config-resolver.js +0 -181
  653. package/.agents/scripts/lib/knip-entry-sync.js +0 -452
  654. package/.agents/scripts/lib/orchestration/model-attribution.js +0 -418
  655. package/.agents/scripts/lib/orchestration/story-plan-state.js +0 -33
  656. package/.agents/scripts/lib/orchestration/structured-comment-parser.js +0 -67
  657. package/.agents/scripts/lib/pinned-override-notes.js +0 -88
  658. package/.agents/scripts/lib/pinned-override-resolve.js +0 -212
  659. package/.agents/scripts/lib/test-isolate/cli-options.js +0 -93
  660. package/.agents/scripts/lib/test-isolate/env-snapshot-loader.js +0 -52
  661. package/.agents/scripts/lib/test-isolate/list-files.js +0 -90
  662. package/.agents/scripts/lib/test-isolate/parse-tap.js +0 -75
  663. package/.agents/scripts/lib/test-isolate/progress-log.js +0 -45
  664. package/.agents/scripts/lib/test-isolate/render-report.js +0 -97
  665. package/.agents/scripts/lib/test-isolate/run-isolate.js +0 -87
  666. package/.agents/scripts/lib/test-isolate/runner.js +0 -483
  667. package/.agents/scripts/lib/test-profile/parse-tap.js +0 -136
  668. package/.agents/scripts/lib/test-profile/render-report.js +0 -45
  669. package/.agents/scripts/lint-label-vocabulary.js +0 -214
  670. package/.agents/scripts/post-structured-comment.js +0 -127
  671. package/.agents/scripts/provision-git-hooks.js +0 -85
  672. package/.agents/scripts/prune-baseline-orphans.js +0 -181
  673. package/.agents/scripts/run-coverage.js +0 -197
  674. package/.agents/scripts/run-lint.js +0 -133
  675. package/.agents/scripts/run-test-profile.js +0 -129
  676. package/.agents/scripts/run-verify.js +0 -118
  677. package/.agents/scripts/test-isolate.js +0 -55
  678. package/.agents/scripts/update-dead-exports-baseline.js +0 -321
@@ -1,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
  '',