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
@@ -3,7 +3,6 @@ import { normalizeOwnedProvenance } from '../findings/provenance-field.js';
3
3
  import { detectCycle } from '../Graph.js';
4
4
  import { gitSpawn } from '../git-utils.js';
5
5
 
6
- import { Logger } from '../Logger.js';
7
6
  import { validateStoryFileAssumptions } from './file-assumptions.js';
8
7
  import { isExternalDependencyRef } from './plan-persist/external-deps.js';
9
8
  import {
@@ -13,27 +12,18 @@ import {
13
12
  import { computeConflictFindings } from './ticket-validator-conflicts.js';
14
13
 
15
14
  /**
16
- * Regex matching code-asset paths the freshness gate cares about. The three
17
- * roots — `.agents/scripts`, `lib`, and `tests` — cover the executable surface
18
- * the decomposer's tasks legitimately reference. Anchoring on the leading dot
19
- * for `.agents` and a word boundary for `lib`/`tests` keeps URLs, image paths,
20
- * and unrelated prose ("library", "testimonial", "established") from being
21
- * scanned as fictitious file references.
22
- *
23
- * The regex is intentionally global + multi-match per body string so a single
24
- * Task naming several files surfaces every miss in one error.
15
+ * Code-asset paths under `.agents/scripts`, `lib`, `tests`. The leading
16
+ * delimiter keeps URLs and prose ("library") out. Global: every miss surfaces.
25
17
  */
26
18
  const FRESHNESS_PATH_RE =
27
19
  /(?:^|[\s`([<])(\.agents\/scripts|lib|tests)\/[\w./-]+\.js\b/g;
28
20
 
29
21
  function collectPathsFromText(text, paths) {
30
22
  if (!text || typeof text !== 'string') return;
31
- // Reset lastIndex on the shared regex literal between calls.
32
23
  FRESHNESS_PATH_RE.lastIndex = 0;
33
24
  let match = FRESHNESS_PATH_RE.exec(text);
34
25
  while (match !== null) {
35
- // Capture group 1 is the root; full match index 0 includes the leading
36
- // delimiter — slice it off so the path is a clean repo-relative reference.
26
+ // Slice off the leading delimiter the match includes.
37
27
  const captured = match[0];
38
28
  const rootStart = captured.indexOf(match[1]);
39
29
  paths.add(captured.slice(rootStart));
@@ -41,38 +31,6 @@ function collectPathsFromText(text, paths) {
41
31
  }
42
32
  }
43
33
 
44
- /**
45
- * Resolve every acceptance line a Story declares, across both authoring
46
- * shapes (Story #4541).
47
- *
48
- * The canonical shape is a **serialized string body** with the criteria at
49
- * the ticket's **top level** — the machine contract persist syncs into the
50
- * body. `validateAcceptanceSubjectPrefix` used to read `body.acceptance` on
51
- * an object body only, so on every real plan it scanned nothing and the gate
52
- * silently passed. Union both sources (deduplicated) so the gate fires on
53
- * whichever surface the author used.
54
- *
55
- * @param {object} story
56
- * @returns {string[]}
57
- */
58
- function resolveAcceptanceLines(story) {
59
- const lines = new Set();
60
- if (Array.isArray(story?.acceptance)) {
61
- for (const item of story.acceptance) lines.add(String(item ?? ''));
62
- }
63
- const body = story?.body;
64
- let bodyAcceptance = null;
65
- if (typeof body === 'string' && body.trim().length > 0) {
66
- bodyAcceptance = parseStoryBodyOrThrow(story).acceptance;
67
- } else if (body !== null && typeof body === 'object') {
68
- bodyAcceptance = body.acceptance;
69
- }
70
- if (Array.isArray(bodyAcceptance)) {
71
- for (const item of bodyAcceptance) lines.add(String(item ?? ''));
72
- }
73
- return [...lines];
74
- }
75
-
76
34
  function collectTaskPathReferences(task) {
77
35
  const paths = new Set();
78
36
  const body = task.body;
@@ -85,8 +43,7 @@ function collectTaskPathReferences(task) {
85
43
  for (const item of arr) collectPathsFromText(String(item ?? ''), paths);
86
44
  }
87
45
  }
88
- // Some planner shapes carry a top-level `acceptance` array even on string
89
- // bodies — scan it defensively.
46
+ // Some planner shapes carry top-level `acceptance` even on string bodies.
90
47
  if (Array.isArray(task.acceptance)) {
91
48
  for (const item of task.acceptance) {
92
49
  collectPathsFromText(String(item ?? ''), paths);
@@ -96,48 +53,17 @@ function collectTaskPathReferences(task) {
96
53
  }
97
54
 
98
55
  /**
99
- * Collect every code-asset path a Task declares it will *create or modify*
100
- * via its `body.changes` array. These paths are net-new (or about to be
101
- * touched) from the planner's perspective, so the freshness gate must
102
- * accept them even when they're absent from `baseBranchRef`.
103
- *
104
- * Three shapes are accepted:
105
- *
106
- * 1. **Canonical string body** — the body is a markdown string produced by
107
- * `serialize()` from `story-body.js`. Parsed via `parse()` to extract
108
- * the structured `changes[]` and `references[]` arrays. This is the
109
- * shape emitted by the decomposer after Story #3302.
110
- * 2. **Legacy string bullets** — `"<path>: <verb> <object>"` inside an
111
- * object body's `changes[]`. The regex `FRESHNESS_PATH_RE` picks the
112
- * path out of the prose.
113
- * 3. **Object form** — `{ path: "<path>", assumption: "creates" | ... }`,
114
- * introduced by Story #2636 as the canonical declaration shape and
115
- * documented in `lib/templates/decomposer-prompts.js`. The path is
116
- * trusted verbatim.
117
- *
118
- * Only `body.changes` (and `body.references`) is consulted —
119
- * `body.goal`, `body.acceptance`, and `body.verify` are deliberately
120
- * excluded so the gate continues to flag a planner that hallucinates a
121
- * fictitious file in narrative copy without declaring it in the
122
- * changes/references contract.
56
+ * Paths a Story declares in `changes[]` / `references[]` — exempt from the
57
+ * freshness probe since they may be net-new. Accepts a serialized markdown
58
+ * body, string bullets, or `{ path, assumption }` objects. Goal / acceptance
59
+ * / verify are deliberately excluded so undeclared narrative paths still flag.
123
60
  */
124
61
  function collectTaskChangesPaths(task) {
125
62
  const paths = new Set();
126
63
  const body = task.body;
127
64
 
128
- // Story #3302: when the body is a markdown string (canonical serialized
129
- // form), parse it to extract the structured changes[] / references[]
130
- // arrays before scanning. Without this, a string body causes the
131
- // object-form branch below to fall through on every item, leaving the
132
- // freshness gate blind to declared paths.
133
- //
134
- // Story #4541: a parse failure is NOT swallowed here. Swallowing it
135
- // returned an empty whitelist, so a single malformed `## Changes` entry
136
- // surfaced downstream as "files do not exist at main" naming the very
137
- // paths the Story *had* declared — a misdiagnosis that cost two authoring
138
- // round-trips. `assertStoryBodiesParse` runs before the freshness gate and
139
- // owns that failure with a named error; the throw here is the same error
140
- // for any caller that drives `validateAcFreshness` directly.
65
+ // A parse failure throws rather than yielding an empty whitelist, which
66
+ // would misreport every declared path as missing.
141
67
  if (typeof body === 'string' && body.trim().length > 0) {
142
68
  const parsed = parseStoryBodyOrThrow(task);
143
69
  for (const arrName of ['changes', 'references']) {
@@ -179,14 +105,6 @@ function collectTaskChangesPaths(task) {
179
105
  return paths;
180
106
  }
181
107
 
182
- /**
183
- * Default git probe: returns true when `path` exists at `ref` in the cwd repo.
184
- * Uses `git cat-file -e <ref>:<path>` which is the standard low-cost existence
185
- * check (no blob materialisation, no tree walk in node).
186
- *
187
- * Callers may inject their own runner with the same `(ref, path) => boolean`
188
- * signature for unit tests.
189
- */
190
108
  function defaultGitRunner({ baseBranchRef, path, cwd }) {
191
109
  const result = gitSpawn(
192
110
  cwd ?? process.cwd(),
@@ -198,13 +116,9 @@ function defaultGitRunner({ baseBranchRef, path, cwd }) {
198
116
  }
199
117
 
200
118
  /**
201
- * Wrap a `(ref, path) → boolean` git runner in a memoizing closure keyed by
202
- * `"${baseBranchRef}:${path}"`. The wrapper is created once per
203
- * `validateAndNormalizeTickets` call and threaded into both
204
- * `validateAcFreshness` and `validateStoryFileAssumptions` so the two gates
205
- * share a single probe cache rather than maintaining independent ones.
119
+ * One cache shared by the freshness and file-assumption gates.
206
120
  *
207
- * @param {Function} runner - The underlying `({ baseBranchRef, path, cwd }) => boolean` probe.
121
+ * @param {Function} runner - `({ baseBranchRef, path, cwd }) => boolean`.
208
122
  * @returns {Function} A memoized probe with the same signature.
209
123
  */
210
124
  function makeMemoizedGitRunner(runner) {
@@ -221,22 +135,14 @@ function makeMemoizedGitRunner(runner) {
221
135
  }
222
136
 
223
137
  /**
224
- * Check that every code-asset path referenced by a Story body or AC exists at
225
- * `baseBranchRef`, and report the ones that do not. A missing path usually
226
- * means the planner named a file it is about to create without declaring it,
227
- * or a stale reference — worth saying, not worth refusing on: Story #5312
228
- * demoted this gate from a throw to the **warning list** the dry-run prints,
229
- * because the paths a goal or acceptance line names are prose the deliverer
230
- * reads against the real tree, never a contract the validator can hold it to.
231
- *
232
- * Only Stories are scanned — they are the implementation unit; the Epic
233
- * carries narrative copy, not implementation paths.
138
+ * Warn (never refuse) on Story-referenced code paths absent at the base:
139
+ * narrative paths are prose, not a contract the validator can enforce.
234
140
  *
235
141
  * @param {object} opts
236
- * @param {object[]} opts.tickets - Validated ticket hierarchy.
237
- * @param {string} opts.baseBranchRef - Ref to probe (e.g. 'main' or 'origin/main').
238
- * @param {Function} [opts.gitRunner] - Probe override (testing seam).
239
- * @param {string} [opts.cwd] - Repo cwd (forwarded to default runner).
142
+ * @param {object[]} opts.tickets
143
+ * @param {string} opts.baseBranchRef
144
+ * @param {Function} [opts.gitRunner]
145
+ * @param {string} [opts.cwd]
240
146
  * @returns {string[]} One warning line per missing reference, empty when clean.
241
147
  */
242
148
  export function validateAcFreshness({
@@ -251,11 +157,7 @@ export function validateAcFreshness({
251
157
  );
252
158
  }
253
159
  const stories = (tickets ?? []).filter((t) => t.type === 'story');
254
- // Union every Story's `body.changes` paths into an expected-new set. Any
255
- // path the planner has declared in `changes` is considered intentional
256
- // (net-new or about-to-be-modified) and the git probe is skipped for it
257
- // — otherwise the freshness gate would reject the very test/source file
258
- // a Story is meant to create, even when the Story is well-formed.
160
+ // Declared paths (any Story) are intentional and skip the probe.
259
161
  const expectedNewPaths = new Set();
260
162
  for (const story of stories) {
261
163
  for (const path of collectTaskChangesPaths(story)) {
@@ -263,8 +165,6 @@ export function validateAcFreshness({
263
165
  }
264
166
  }
265
167
  const misses = [];
266
- // Cache per-path probe results — sibling Stories frequently cite the same
267
- // helper module; avoid re-spawning git for each repeat.
268
168
  const probeCache = new Map();
269
169
  for (const story of stories) {
270
170
  const refs = collectTaskPathReferences(story);
@@ -283,155 +183,24 @@ export function validateAcFreshness({
283
183
  return misses.map((m) => renderMissLine(m, baseBranchRef));
284
184
  }
285
185
 
286
- /**
287
- * Allowed leading Conventional-Commits types. Mirrors the `changelog-sections`
288
- * keys in `release-please-config.json` and the `type-enum` list in
289
- * `commitlint.config.js`. When a planner LLM prescribes a commit subject in a
290
- * Task acceptance item via the "Commit subject begins with '<prefix>:'" form,
291
- * the captured prefix must reduce to one of these types (optionally followed
292
- * by a `(scope)` qualifier) — anything else fails commitlint locally and
293
- * release-please's changelog parser on `main`, so the decompose is rejected
294
- * before the Story branch is ever cut.
295
- *
296
- * Epic #2501 introduced this guard after the legacy `baseline-refresh`
297
- * leading-token prescription created a wave of commit-msg hook failures
298
- * across story-deliver sub-agents. See
299
- * `.agents/skills/core/gates-and-baselines/SKILL.md` for the canonical refresh
300
- * shape (Conventional-Commits subject + `baseline-refresh: true` body
301
- * trailer).
302
- */
303
- const ALLOWED_COMMIT_TYPES = new Set([
304
- 'feat',
305
- 'fix',
306
- 'chore',
307
- 'refactor',
308
- 'perf',
309
- 'docs',
310
- 'style',
311
- 'test',
312
- 'build',
313
- 'ci',
314
- 'revert',
315
- ]);
316
-
317
- /**
318
- * Regex matching the canonical "Commit subject begins with '<prefix>:'"
319
- * prescription shape the planner emits in `body.acceptance[]` entries.
320
- * The leading quote is captured loosely (single, double, or backtick) so the
321
- * three quoting styles the decomposer LLM has historically emitted all
322
- * match. The captured group is the prefix token *without* the trailing
323
- * colon — callers normalize by stripping an optional `(scope)` qualifier
324
- * before comparing against the allowed-types set.
325
- */
326
- const SUBJECT_PREFIX_RE = /Commit subject begins with ['"`]([^'"`]+):['"`]/g;
327
-
328
- /**
329
- * Scan every Story's `body.acceptance[]` for "Commit subject begins with
330
- * '<prefix>:'" prescriptions and reject the decompose when any captured
331
- * prefix is not a valid Conventional-Commits type.
332
- *
333
- * A captured prefix of the form `chore(baselines)` is accepted — the
334
- * leading `chore` is in the allowed-types set, and the `(scope)` qualifier
335
- * is the standard Conventional-Commits scope shape. A captured prefix of
336
- * the form `baseline-refresh` is rejected because no Conventional-Commits
337
- * type starts with that token.
338
- *
339
- * Only acceptance criteria are scanned; `body.goal` / `body.verify` /
340
- * `body.changes` are not commit-subject prescriptions by convention and
341
- * scanning them would surface false positives from prose that happens to
342
- * quote a forbidden prefix while explaining why it's forbidden.
343
- *
344
- * Both authoring shapes are covered (Story #4541): the canonical top-level
345
- * `acceptance[]` on a serialized string body, and the pre-serialize
346
- * `body.acceptance[]` object shape. Scanning only the latter made the gate
347
- * inert on every real plan.
348
- *
349
- * @param {object} opts
350
- * @param {object[]} opts.tickets - Validated ticket hierarchy.
351
- * @throws {ValidationError} when one or more Story acceptance items
352
- * prescribe a forbidden subject prefix. The error carries
353
- * `code: 'forbidden-subject-prefix'` and a `violations[]` payload
354
- * listing each `{ slug, prefix, line }` so the decompose loop can
355
- * surface the exact offending text to the operator.
356
- */
357
- export function validateAcceptanceSubjectPrefix({ tickets }) {
358
- const violations = [];
359
- const stories = (tickets ?? []).filter((t) => t.type === 'story');
360
- for (const story of stories) {
361
- for (const line of resolveAcceptanceLines(story)) {
362
- // Reset the global regex between iterations.
363
- SUBJECT_PREFIX_RE.lastIndex = 0;
364
- let match = SUBJECT_PREFIX_RE.exec(line);
365
- while (match !== null) {
366
- const rawPrefix = match[1];
367
- // Strip an optional `(scope)` qualifier — `chore(baselines)` reduces
368
- // to `chore` for the allowed-types check.
369
- const type = rawPrefix.replace(/\(.*\)$/, '').trim();
370
- if (!ALLOWED_COMMIT_TYPES.has(type)) {
371
- violations.push({
372
- slug: story.slug ?? '<unknown>',
373
- prefix: rawPrefix,
374
- line,
375
- });
376
- }
377
- match = SUBJECT_PREFIX_RE.exec(line);
378
- }
379
- }
380
- }
381
- if (violations.length === 0) return;
382
- const allowed = [...ALLOWED_COMMIT_TYPES].join('|');
383
- const lines = violations
384
- .map(
385
- (v) =>
386
- ` - "${v.slug}" → forbidden subject prefix "${v.prefix}:" in acceptance item: ${v.line}`,
387
- )
388
- .join('\n');
389
- const err = new ValidationError(
390
- `Cross-Validation Failed: ${violations.length} Story acceptance item(s) prescribe a non-Conventional-Commits subject prefix:\n${lines}\n\nAllowed leading types: ${allowed}. Use a Conventional-Commits subject (e.g. "chore(baselines): refresh ...") and a body trailer (e.g. "baseline-refresh: true") for machine-readable markers. See Epic #2501.`,
391
- { violations },
392
- );
393
- err.code = 'forbidden-subject-prefix';
394
- throw err;
395
- }
396
-
397
- /**
398
- * Render one missing-path warning with a remediation hint pointing at the
399
- * Story's `changes[]`. For `tests/**` paths we suggest the explicit
400
- * "add the test file" verb; for everything else we emit a generic hint
401
- * since the planner knows whether the path is net-new or a typo.
402
- */
403
186
  function renderMissLine({ slug, path }, baseBranchRef) {
404
187
  const verb = path.startsWith('tests/') ? 'add test file' : 'create';
405
188
  return `Story "${slug}" references ${path}, which does not exist at ${baseBranchRef} — if net-new, declare {"path":"${path}","assumption":"creates"} in changes[] (${verb}); otherwise fix the typo or stale reference.`;
406
189
  }
407
190
 
408
191
  /**
409
- * Validates the generated ticket hierarchy and handles lifting cross-story dependencies.
192
+ * Hierarchy, cycle and parse checks throw. The returned array also carries
193
+ * non-enumerable `findings` (advisory conflicts), `errors` (a `deletes` of a
194
+ * path absent at base), `warnings` (demoted footprint probes) and
195
+ * `normalizations` (`refactors-existing`→`creates` rewrites).
410
196
  *
411
- * The returned tickets array carries extra non-array properties:
412
- * - `findings` — the advisory cross-Story conflict findings.
413
- * - `errors` — human-readable strings, one per hard refusal: a `deletes`
414
- * naming a path absent at base (prefixed `File assumption mismatch:`).
415
- * The hierarchy/cycle/parse checks continue to throw.
416
- * - `warnings` — the demoted footprint probes (Story #5312): a `creates`
417
- * or `refactors-existing` mismatch, a goal/acceptance/verify path absent
418
- * at base. Listed by the dry-run; the persist proceeds.
419
- * - `normalizations` — the `refactors-existing`→`creates` rewrites applied.
420
- *
421
- * @param {object[]} tickets - Array of ticket objects parsed from LLM output.
197
+ * @param {object[]} tickets
422
198
  * @param {object} [opts]
423
- * @param {string} [opts.baseBranchRef] - When set, runs the base-branch probes against this ref.
424
- * @param {Function} [opts.gitRunner] - Optional git probe override.
425
- * @param {string} [opts.cwd] - Repo cwd (forwarded to the probes).
199
+ * @param {string} [opts.baseBranchRef] - Enables the base-branch probes.
200
+ * @param {Function} [opts.gitRunner]
201
+ * @param {string} [opts.cwd]
426
202
  * @returns {object[] & { findings: object[], errors: string[], warnings: string[], normalizations: object[] }}
427
203
  */
428
- /**
429
- * Internal helpers extracted from `validateAndNormalizeTickets` so each
430
- * stage can be unit-tested in isolation and the orchestration method stays
431
- * at a low cyclomatic complexity. Exported via the `_internal` bundle at
432
- * the bottom of the module for tests; production callers should keep
433
- * using `validateAndNormalizeTickets`.
434
- */
435
204
 
436
205
  function indexTicketsBySlug(tickets) {
437
206
  const ticketBySlug = new Map();
@@ -446,9 +215,7 @@ function indexTicketsBySlug(tickets) {
446
215
  }
447
216
  ticketBySlug.set(t.slug, t);
448
217
  }
449
- // External `#<id>` refs (Story #5155) name issues already on the tracker,
450
- // not nodes in this run's graph — they cannot close a cycle back into a
451
- // Story that does not exist yet, so they are not edges here.
218
+ // External `#<id>` refs are tracker issues, not graph nodes — no cycle.
452
219
  slugAdjacency.set(
453
220
  t.slug,
454
221
  (t.depends_on ?? []).filter((d) => !isExternalDependencyRef(d)),
@@ -458,12 +225,7 @@ function indexTicketsBySlug(tickets) {
458
225
  return { ticketBySlug, stories, slugAdjacency };
459
226
  }
460
227
 
461
- /**
462
- * 2-tier invariant (Story #4041): the decomposer emits Stories only — every
463
- * ticket in the backlog must be `type: "story"` and at least one must be
464
- * present. Any other type (the retired `feature`/`task` tiers, or planner
465
- * hallucinations) HARD-rejects the decomposition.
466
- */
228
+ /** Every ticket must be `type: "story"`, and at least one must exist. */
467
229
  function assertAllTicketsAreStories({ tickets, stories }) {
468
230
  const nonStories = (tickets ?? []).filter((t) => t.type !== 'story');
469
231
  if (nonStories.length > 0) {
@@ -482,57 +244,43 @@ function assertAllTicketsAreStories({ tickets, stories }) {
482
244
  }
483
245
 
484
246
  /**
485
- * Return true when a Story object carries inline acceptance + verify
486
- * arrays — the inline-contract shape (Epic #3078) where the Story is itself the
487
- * implementation unit and acceptance / verify live on the Story body
488
- * rather than in child Task tickets.
489
- *
490
- * Both arrays must be present, be actual arrays, and contain at least
491
- * one entry. Either alone is insufficient — a Story with only
492
- * `acceptance[]` (no `verify[]`) cannot be implemented without a
493
- * verification handle, and a Story with only `verify[]` (no
494
- * `acceptance[]`) carries no observable criterion. Requiring both is the
495
- * inline-contract invariant every Story must satisfy.
247
+ * Only `acceptance[]` is required: a Story with no criterion is
248
+ * unimplementable, while an empty `verify[]` is merely a warning.
496
249
  */
497
- function hasInlineAcceptanceAndVerify(story) {
250
+ function hasInlineAcceptance(story) {
498
251
  if (story === null || typeof story !== 'object') return false;
499
- const { acceptance, verify } = story;
500
- return (
501
- Array.isArray(acceptance) &&
502
- acceptance.length > 0 &&
503
- Array.isArray(verify) &&
504
- verify.length > 0
505
- );
252
+ const { acceptance } = story;
253
+ return Array.isArray(acceptance) && acceptance.length > 0;
506
254
  }
507
255
 
508
256
  function assertEveryStoryHasInlineContract({ stories }) {
509
- // Every Story is its own implementation
510
- // unit and MUST carry a non-empty inline contract — top-level
511
- // `acceptance[]` AND `verify[]`. A Story missing either is the legacy
512
- // 4-tier shape that expected child Tasks; there is no Task tier any
513
- // more, so such a Story is unimplementable and the decompose is
514
- // rejected outright.
515
- const missing = stories.filter((s) => !hasInlineAcceptanceAndVerify(s));
257
+ const missing = stories.filter((s) => !hasInlineAcceptance(s));
516
258
  if (missing.length === 0) return;
517
259
  const list = missing.map((s) => `"${s.title}" (${s.slug})`).join(', ');
518
260
  throw new Error(
519
- `Cross-Validation Failed: ${missing.length} Story/Stories lack an inline acceptance + verify contract: ${list}. Every Story must carry non-empty top-level acceptance[] and verify[].`,
261
+ `Cross-Validation Failed: ${missing.length} Story/Stories lack an inline acceptance contract: ${list}. Every Story must carry a non-empty top-level acceptance[] — the outcomes a PR reviewer confirms once it lands.`,
520
262
  );
521
263
  }
522
264
 
523
265
  /**
524
- * Shape-check the optional per-Story `provenance` field (Story #5045).
525
- *
526
- * The field decides which audit identities persist stamps into a Story body,
527
- * so a malformed entry has to fail at the validator rather than at the
528
- * stamper: by the time assembly runs, an unnoticed drop is indistinguishable
529
- * from a Story that legitimately owns nothing — and the cost lands a whole
530
- * sweep later, when the next audit re-files work this plan already tracked.
531
- *
532
- * Absence is valid and common: a Story with no `provenance` inherits the
533
- * whole-seed union carry, which is the recall-safe default.
534
- *
535
- * Errors are batched across the backlog so one pass names every offender.
266
+ * @param {object[]} stories
267
+ * @returns {string[]}
268
+ */
269
+ function collectMissingVerifyWarnings(stories) {
270
+ return (stories ?? [])
271
+ .filter((s) => !Array.isArray(s?.verify) || s.verify.length === 0)
272
+ .map(
273
+ (s) =>
274
+ `Story "${s.slug ?? s.title ?? '<unknown>'}" lists no verify[] entry — ` +
275
+ 'the deliverer and the acceptance critic have no mechanical check to ' +
276
+ 'read as evidence. Add the exact command or test path unless the ' +
277
+ 'Story genuinely has none.',
278
+ );
279
+ }
280
+
281
+ /**
282
+ * Fail malformed `provenance` here: at the stamper a silent drop looks like a
283
+ * Story owning nothing. Absent is valid (inherits the seed-wide union).
536
284
  *
537
285
  * @param {{ stories: object[] }} args
538
286
  * @throws {Error} naming each malformed field.
@@ -559,8 +307,7 @@ function assertNoUnknownDeps({ tickets, ticketBySlug }) {
559
307
  const unknownDeps = [];
560
308
  for (const t of tickets) {
561
309
  for (const depSlug of t.depends_on ?? []) {
562
- // An external `#<id>` ref is resolved against the tracker at persist
563
- // (`assertExternalDependenciesResolvable`), never against this backlog.
310
+ // External refs resolve against the tracker at persist.
564
311
  if (isExternalDependencyRef(depSlug)) continue;
565
312
  if (!ticketBySlug.has(depSlug)) {
566
313
  unknownDeps.push({ slug: t.slug, title: t.title, dep: depSlug });
@@ -593,10 +340,6 @@ function attachFindingsAndErrors(
593
340
  ['findings', findings],
594
341
  ['errors', errors],
595
342
  ['warnings', warnings],
596
- // Story #5265: the auto-normalizations the assumption gate applied. They
597
- // used to end at a `Logger.warn` and die with the process, so persist's
598
- // emitted result reported a plan whose declarations it had silently
599
- // rewritten as if nothing had been rewritten.
600
343
  ['normalizations', normalizations],
601
344
  ]) {
602
345
  Object.defineProperty(tickets, key, {
@@ -618,36 +361,16 @@ export function validateAndNormalizeTickets(tickets, opts = {}) {
618
361
 
619
362
  assertAcyclic(slugAdjacency);
620
363
 
621
- // Story #4541 — refuse an unparseable Story body up front, with a named
622
- // error pointing at the offending section + entry. Must precede both the
623
- // subject-prefix scan and the freshness gate: each parses the body, and
624
- // the freshness gate's net-new whitelist comes from `body.changes`, so a
625
- // malformed body used to surface as a stale-path miss naming the paths the
626
- // Story had legitimately declared.
364
+ // Must precede the freshness gate, whose whitelist comes from the parsed
365
+ // body — a malformed body would otherwise read as stale paths.
627
366
  assertStoryBodiesParse({ tickets });
628
367
 
629
- // Reject any Task acceptance item that prescribes a non-Conventional-Commits
630
- // subject prefix (e.g. legacy "Commit subject begins with 'baseline-refresh:'"
631
- // from pre-Epic-#2501 planner output). Runs before the freshness gate so
632
- // the failure mode is reported up-front rather than after a git probe.
633
- validateAcceptanceSubjectPrefix({ tickets });
634
-
635
- // Hoist a single memoized (ref, path) → boolean probe shared across both
636
- // git-probe gates below. Without this, `validateAcFreshness` and
637
- // `validateStoryFileAssumptions` each maintain an independent cache, so a
638
- // path that appears in both the AC-freshness scan and the file-assumption
639
- // scan spawns two `git cat-file` processes. The memoizing wrapper captures
640
- // results by `"${baseBranchRef}:${path}"` key so the second gate reuses
641
- // the first's results without any additional git I/O.
642
368
  const sharedGitRunner = opts.baseBranchRef
643
369
  ? makeMemoizedGitRunner(opts.gitRunner ?? defaultGitRunner)
644
370
  : null;
645
371
 
646
- const warnings = [];
647
- // Story #5312: a goal / acceptance / verify path absent at base is a
648
- // warning the dry-run lists, not a refusal. Skipped when the caller omits
649
- // `baseBranchRef` so unit tests keep their semantics; production
650
- // call-sites always pass it.
372
+ const warnings = [...collectMissingVerifyWarnings(stories)];
373
+ // Base probes run only with `baseBranchRef` (production always passes it).
651
374
  if (opts.baseBranchRef) {
652
375
  warnings.push(
653
376
  ...validateAcFreshness({
@@ -659,10 +382,7 @@ export function validateAndNormalizeTickets(tickets, opts = {}) {
659
382
  );
660
383
  }
661
384
 
662
- // Story #2636 — Phase 8 path-assumption gate. Cross-check every Story's
663
- // declared `{ path, assumption }` against the actual state of the base
664
- // branch. A `deletes` on an absent path batches into the validator's
665
- // errors envelope; every other mismatch is a warning (Story #5312).
385
+ // Only a `deletes` of an absent path is an error; other mismatches warn.
666
386
  let assumptionErrors = [];
667
387
  let assumptionNormalizations = [];
668
388
  if (opts.baseBranchRef) {
@@ -677,9 +397,7 @@ export function validateAndNormalizeTickets(tickets, opts = {}) {
677
397
  assumptionNormalizations = assumptionReport.normalizations ?? [];
678
398
  }
679
399
 
680
- // Cross-Story path-conflict pass observes the story-level depends_on
681
- // graph. Every finding is advisory; the persist surfaces them and the
682
- // plan summary renders the shared-editor class beside the wave table.
400
+ // Conflict findings are advisory.
683
401
  const findings = computeConflictFindings({ stories });
684
402
  const errors = assumptionErrors.map((e) => `File assumption mismatch: ${e}`);
685
403
 
@@ -702,5 +420,6 @@ export const _internal = {
702
420
  assertNoUnknownDeps,
703
421
  assertAcyclic,
704
422
  attachFindingsAndErrors,
705
- hasInlineAcceptanceAndVerify,
423
+ hasInlineAcceptance,
424
+ collectMissingVerifyWarnings,
706
425
  };