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,45 +1,10 @@
1
1
  /**
2
- * lib/orchestration/complexity-gate.js — shape-derived Story routing for the
3
- * deliver side (Story #4722; plan-side lite claim deleted by Story #5312).
4
- *
5
- * Three surfaces survive, all read at delivery time:
6
- *
7
- * 1. **Seed signals ({@link buildComplexitySignals}).** `/mandrel-plan`'s
8
- * context envelope carries the paths a seed predicts, their repo state
9
- * (existing paths predict refactors; missing ones predict creates) and
10
- * the `audit-rules.json` sensitive-path classes the footprint intersects.
11
- * They ground the authoring template's `changes[]` skeleton and the
12
- * `/prototype` offer; they route nothing.
13
- * 2. **Story shape ({@link deriveStoryShape}).** The light path
14
- * (`deliver-light`) reads a predicted footprint's effort and risk —
15
- * distinct change kinds, declared magnitude, uncertainty,
16
- * deployable/migration span, sensitive-path classes — against
17
- * {@link STORY_SHAPE_CEILINGS} to decide whether a prompt may skip the
18
- * Story-authoring ceremony. Artifact cardinality is deliberately not an
19
- * axis (Story #4764).
20
- * 3. **Dispatch mode ({@link resolveStoryDispatchMode}).** `/mandrel-deliver`
21
- * answers a different question from the route: may the engine run in the
22
- * router's own session? Only a **single-Story run** may (Story #4736).
23
- *
24
- * Story #5312 deleted the plan-side half: the planner's authored lite claim
25
- * (`--route-downgrade-reason`), the persist-time shape backstop that
26
- * validated it, the `route::lite` hint label, and the
27
- * `planning.complexityGate` knobs. Persist no longer routes; every Story
28
- * lands through the same engine and the same close gates, and the shape
29
- * ceilings below are read only where a shape is actually decided on.
30
- *
31
- * The shape taxonomy is deliberately the one `review-depth.js` already
32
- * applies to the landed diff at close (`deriveChangeLevel` over the
33
- * `audit-rules.json` sensitive-path classes): **predicted shape at dispatch,
34
- * actual diff at close** — one taxonomy, two read points. Sensitivity always
35
- * wins: a small change whose footprint intersects a sensitive-path class
36
- * routes `full`, which keeps its fresh acceptance critic.
37
- *
38
- * {@link LITE_PATH_INVARIANTS} is the machine-readable contract that the
39
- * light path still produces a Story ticket, still lands via a PR to `main`,
40
- * still runs every repo quality gate, and still honours
41
- * `rules/security-baseline.md`. Those gates run in `single-story-close.js`
42
- * regardless of route; the router cannot and does not switch them off.
2
+ * lib/orchestration/complexity-gate.js — deliver-side Story routing: seed
3
+ * signals for `/mandrel-plan`, footprint risk for the light path, and
4
+ * inline-vs-subagent dispatch. Risk uses the same sensitive-path taxonomy
5
+ * `review-depth.js` applies to the landed diff at close (predicted footprint
6
+ * at dispatch, actual diff at close); sensitivity always wins. Close gates
7
+ * run regardless of route — the router cannot switch them off.
43
8
  *
44
9
  * @typedef {'lite'|'full'} ComplexityRoute
45
10
  */
@@ -49,152 +14,17 @@ import path from 'node:path';
49
14
  import { extractChangePaths } from '../story-body/story-body.js';
50
15
  import { deriveChangeLevel } from './review-depth.js';
51
16
 
52
- /**
53
- * Effort/risk ceilings a Story's work must fit for the `lite` route
54
- * ({@link deriveStoryShape}). Framework constants, not operator knobs — a
55
- * ceiling an operator can widen past what the inline path can safely absorb is
56
- * a ceiling that fails silently.
57
- *
58
- * ## Effort and risk, never artifact cardinality (Story #4764)
59
- *
60
- * These ceilings used to count the declared footprint (`maxChanges: 2`,
61
- * `maxAcceptance: 3`, `maxNonCreateChanges: 1`). Cardinality is the wrong axis
62
- * in both directions: three identical one-line edits across three files is
63
- * trivial work with a high count, while a 200-line rewrite of one module is a
64
- * single change. And the count was read off a footprint the model **declares
65
- * before doing the work** — a guess, and a gameable one — so counting it
66
- * rejected genuinely small work (mandrel-bench's hello-world scenario is a
67
- * server create plus a `package.json` edit plus a test create, structurally
68
- * over the old ceilings) while admitting whatever an optimistic declaration
69
- * under-counted.
70
- *
71
- * So the axes are effort, risk, and uncertainty, and the **prediction** gate
72
- * they form is deliberately **coarse**: it rejects clearly-epic work only.
73
- * Real enforcement belongs to the diff-derived backstop, which sees ground
74
- * truth instead of a declaration
75
- * ({@link module:lib/orchestration/light-suitability.checkLightDiffBackstop}).
76
- *
77
- * - `maxChangeKinds` — distinct change KINDS, not files. N instances of one
78
- * mechanical edit is one kind at N sites; enumerating
79
- * more kinds than this is a multi-capability scope.
80
- * - `maxMagnitude` — coarse magnitude bucket, declared alongside the
81
- * footprint: `trivial` < `moderate` < `substantial`.
82
- * - `maxUncertainty` — is the shape determined by the request
83
- * (`determined`), or does it still need the design
84
- * decisions `/mandrel-plan` exists to resolve
85
- * (`needs-design`)?
86
- * - `maxDeployables` — named deployable roots (`apps/<x>`, `packages/<x>`, …)
87
- * the footprint spans; more than one is epic by
88
- * construction.
89
- *
90
- * Two rules ride beside the ceilings and are not tunable at all: a footprint
91
- * pairing a migration with its consumers is epic scope, and a footprint
92
- * intersecting a sensitive-path class routes `full` however small or mechanical
93
- * it is — the hard gate, unchanged.
94
- *
95
- * Exposed as the `ceilings` field on every {@link deriveStoryShape} decision
96
- * and exported directly (Story #4740) so the light path's suitability gate
97
- * ({@link module:lib/orchestration/light-suitability}) judges a prompt's
98
- * predicted footprint against the **same** axes the plan-time shape backstop
99
- * applies — one source, so the light entry point and the plan path can never
100
- * disagree about what work is trivial.
101
- */
102
- export const STORY_SHAPE_CEILINGS = Object.freeze({
103
- maxChangeKinds: 2,
104
- maxMagnitude: 'moderate',
105
- maxUncertainty: 'determined',
106
- maxDeployables: 1,
107
- });
108
-
109
- /** Coarse effort buckets, ascending. Anything past `maxMagnitude` routes full. */
110
- const MAGNITUDE_SCALE = Object.freeze(['trivial', 'moderate', 'substantial']);
111
-
112
- /** Coarse uncertainty buckets, ascending. */
113
- const UNCERTAINTY_SCALE = Object.freeze(['determined', 'needs-design']);
114
-
115
- /**
116
- * Directory roots whose immediate child is a separately-deployable unit. A
117
- * footprint spanning two of them is the "multiple deployables" epic signal.
118
- */
119
- const DEPLOYABLE_ROOTS = Object.freeze([
120
- 'apps',
121
- 'packages',
122
- 'services',
123
- 'functions',
124
- 'workers',
125
- ]);
17
+ // No predicted-size ceilings: a size the caller declares about itself is not
18
+ // a measurement. Size is bounded only by the diff backstop
19
+ // (`light-suitability.checkLightDiffBackstop`); the rules here read paths.
126
20
 
127
21
  /** Paths that are schema migrations rather than ordinary source. */
128
22
  const MIGRATION_PATH_RE =
129
23
  /(?:^|\/)(?:migrations?|migrate)(?:\/|$)|\.sql$|(?:^|\/)schema\.(?:prisma|rb)$/i;
130
24
 
131
25
  /**
132
- * Place a declared bucket on an ordered scale. **Absent** means "not declared"
133
- * — no signal, so the coarse gate reads the supplied default rather than
134
- * rejecting. **Present but unrecognized** is a malformed claim, which cannot be
135
- * verified as small and therefore fails closed to the worst bucket on the
136
- * scale.
137
- *
138
- * @param {unknown} value
139
- * @param {readonly string[]} scale Ascending buckets.
140
- * @param {string} whenAbsent Bucket to assume when nothing was declared.
141
- * @returns {string}
142
- */
143
- function normalizeBucket(value, scale, whenAbsent) {
144
- if (value === undefined || value === null || value === '') return whenAbsent;
145
- const key = typeof value === 'string' ? value.trim().toLowerCase() : '';
146
- return scale.includes(key) ? key : scale[scale.length - 1];
147
- }
148
-
149
- /**
150
- * Resolve the distinct change KINDS in a footprint. An explicit `kinds[]`
151
- * declaration wins; absent one, each entry's `assumption` is its kind — which
152
- * is exactly the "N instances of one mechanical edit is one kind at N sites"
153
- * reading, since N same-assumption entries collapse to one kind.
154
- *
155
- * @param {{ changes?: unknown, kinds?: unknown }} args
156
- * @returns {string[]} Distinct kinds, in order of first appearance.
157
- */
158
- function resolveChangeKinds({ changes, kinds }) {
159
- const clean = (list) =>
160
- list
161
- .filter((k) => typeof k === 'string' && k.trim() !== '')
162
- .map((k) => k.trim().toLowerCase());
163
- const declared = clean(Array.isArray(kinds) ? kinds : []);
164
- if (declared.length > 0) return [...new Set(declared)];
165
- const derived = (Array.isArray(changes) ? changes : []).map((entry) =>
166
- entry && typeof entry === 'object' && typeof entry.assumption === 'string'
167
- ? entry.assumption.trim().toLowerCase() || 'unspecified'
168
- : 'unspecified',
169
- );
170
- return [...new Set(derived)];
171
- }
172
-
173
- /**
174
- * Named deployable roots a footprint spans (`apps/web`, `packages/core`, …).
175
- * The repository root itself is deliberately **not** counted: a change to one
176
- * app plus a root-level README is one deployable, not two.
177
- *
178
- * @param {string[]} paths
179
- * @returns {string[]}
180
- */
181
- function resolveDeployables(paths) {
182
- const ids = new Set();
183
- for (const p of paths) {
184
- const segments = String(p)
185
- .split('/')
186
- .filter((s) => s !== '');
187
- if (segments.length >= 3 && DEPLOYABLE_ROOTS.includes(segments[0])) {
188
- ids.add(`${segments[0]}/${segments[1]}`);
189
- }
190
- }
191
- return [...ids];
192
- }
193
-
194
- /**
195
- * Does the footprint pair a schema migration with its consumers? A migration
196
- * plus the code that reads through it is epic scope: the two have to land
197
- * together and the ordering is the design work.
26
+ * A migration plus the code that reads through it is epic scope: the
27
+ * ordering is the design work.
198
28
  *
199
29
  * @param {string[]} paths
200
30
  * @returns {boolean}
@@ -205,83 +35,30 @@ function spansMigrationAndConsumers(paths) {
205
35
  }
206
36
 
207
37
  /**
208
- * Stable machine-readable identifiers for every reason a shape routes `full` —
209
- * the `code` field on a {@link deriveStoryShape} decision (Story #4815).
210
- *
211
- * The prose in `reasons[]` is written for a human reading a gate envelope and
212
- * is free to be re-worded; a caller that must **branch** on *which* rule
213
- * objected reads this code instead. That distinction is load-bearing for the
214
- * light path's operator override
215
- * ({@link module:lib/orchestration/light-suitability.OVERRIDABLE_SHAPE_CODES}),
216
- * which may waive a size *prediction* but never a risk rule: keying that
217
- * decision off reason text would make a copy-edit a security change.
218
- *
219
- * Split three ways, and the grouping is the contract:
220
- *
221
- * - **Ceiling rules** — `change-kinds`, `magnitude`, `uncertainty`,
222
- * `deployable-span`. Coarse predictions about size, enforced for real
223
- * against ground truth by the diff backstop.
224
- * - **Absolute rules** — `migration-span`, `sensitive-path`. Risk, not size.
225
- * - **Unknown-footprint rejections** — `no-changes`, `unreadable-changes`,
226
- * `glob-footprint`, `no-acceptance`, `classification-unavailable`.
227
- * Nothing was judged, so there is nothing to waive.
228
- *
229
- * A `lite` route carries `code: null`.
38
+ * Stable codes for why a footprint routes `full`; callers branch on these,
39
+ * never on `reasons[]` prose. Absolute risk rules (`migration-span`,
40
+ * `sensitive-path`) no re-slicing satisfies; the rest are unknown-footprint
41
+ * rejections. `lite` carries `code: null`.
230
42
  */
231
43
  export const SHAPE_CODES = Object.freeze({
232
- CHANGE_KINDS: 'change-kinds',
233
- MAGNITUDE: 'magnitude',
234
- UNCERTAINTY: 'uncertainty',
235
- DEPLOYABLE_SPAN: 'deployable-span',
236
44
  MIGRATION_SPAN: 'migration-span',
237
45
  SENSITIVE_PATH: 'sensitive-path',
238
46
  NO_CHANGES: 'no-changes',
239
47
  UNREADABLE_CHANGES: 'unreadable-changes',
240
48
  GLOB_FOOTPRINT: 'glob-footprint',
241
- NO_ACCEPTANCE: 'no-acceptance',
242
49
  CLASSIFICATION_UNAVAILABLE: 'classification-unavailable',
243
50
  });
244
51
 
245
52
  /**
246
- * Ordered effort/risk rules, evaluated in order; the first hit is the recorded
247
- * reason for a `full` route. Every rule names an effort, risk, or uncertainty
248
- * property of the work — none counts artifacts.
53
+ * Absolute risk rules, in order; the first hit is the `full` reason.
249
54
  *
250
55
  * @type {ReadonlyArray<{
251
56
  * code: string,
252
- * when: (shape: object, ceilings: typeof STORY_SHAPE_CEILINGS) => boolean,
253
- * reason: (shape: object, ceilings: typeof STORY_SHAPE_CEILINGS) => string,
57
+ * when: (shape: object) => boolean,
58
+ * reason: (shape: object) => string,
254
59
  * }>}
255
60
  */
256
- const EFFORT_RULES = Object.freeze([
257
- {
258
- code: SHAPE_CODES.CHANGE_KINDS,
259
- when: (s, c) => s.kindCount > c.maxChangeKinds,
260
- reason: (s, c) =>
261
- `${s.kindCount} distinct change kinds (${s.changeKinds.join(', ')}) > maxChangeKinds ${c.maxChangeKinds} — an explicit multi-capability enumeration, not one capability; full route`,
262
- },
263
- {
264
- code: SHAPE_CODES.MAGNITUDE,
265
- when: (s, c) =>
266
- MAGNITUDE_SCALE.indexOf(s.magnitude) >
267
- MAGNITUDE_SCALE.indexOf(c.maxMagnitude),
268
- reason: (s, c) =>
269
- `declared magnitude "${s.magnitude}" > maxMagnitude "${c.maxMagnitude}" — a substantial rewrite is effort a single inline pass should not absorb, however few files it touches; full route`,
270
- },
271
- {
272
- code: SHAPE_CODES.UNCERTAINTY,
273
- when: (s, c) =>
274
- UNCERTAINTY_SCALE.indexOf(s.uncertainty) >
275
- UNCERTAINTY_SCALE.indexOf(c.maxUncertainty),
276
- reason: (s) =>
277
- `the shape is not determined by the request (uncertainty "${s.uncertainty}") — the design decisions /mandrel-plan exists to resolve are still open; full route`,
278
- },
279
- {
280
- code: SHAPE_CODES.DEPLOYABLE_SPAN,
281
- when: (s, c) => s.deployables.length > c.maxDeployables,
282
- reason: (s, c) =>
283
- `footprint spans ${s.deployables.length} deployables (${s.deployables.join(', ')}) > maxDeployables ${c.maxDeployables} — clearly-epic scope; full route`,
284
- },
61
+ const RISK_RULES = Object.freeze([
285
62
  {
286
63
  code: SHAPE_CODES.MIGRATION_SPAN,
287
64
  when: (s) => s.migrationSpan,
@@ -292,44 +69,25 @@ const EFFORT_RULES = Object.freeze([
292
69
  code: SHAPE_CODES.SENSITIVE_PATH,
293
70
  when: (s) => s.sensitiveClasses.length > 0,
294
71
  reason: (s) =>
295
- `footprint intersects sensitive-path class(es) ${s.sensitiveClasses.join(', ')} — sensitivity wins over a small shape; full route (fresh acceptance critic retained)`,
72
+ `footprint intersects sensitive-path class(es) ${s.sensitiveClasses.join(', ')} — sensitivity wins over a small footprint; full route (deep review retained)`,
296
73
  },
297
74
  ]);
298
75
 
299
76
  /**
300
- * First effort/risk rule the shape violates as a `{ code, reason }` pair, or
301
- * `null` when it clears them all.
302
- *
303
77
  * @param {object} shape
304
- * @param {typeof STORY_SHAPE_CEILINGS} ceilings
305
78
  * @returns {{ code: string, reason: string }|null}
306
79
  */
307
- function firstEffortViolation(shape, ceilings) {
308
- for (const rule of EFFORT_RULES) {
309
- if (rule.when(shape, ceilings)) {
310
- return { code: rule.code, reason: rule.reason(shape, ceilings) };
80
+ function firstRiskViolation(shape) {
81
+ for (const rule of RISK_RULES) {
82
+ if (rule.when(shape)) {
83
+ return { code: rule.code, reason: rule.reason(shape) };
311
84
  }
312
85
  }
313
86
  return null;
314
87
  }
315
88
 
316
89
  /**
317
- * The non-negotiables the ceremony-lite path preserves (Story #4683 AC-2):
318
- * collapsing ceremony never means dropping the Story ticket, the PR-to-`main`
319
- * landing, the repo quality gates, or the security baseline. Attached
320
- * verbatim to every route decision's `preserves` field so a downstream reader
321
- * (or contract test) can assert the invariants held on either route.
322
- */
323
- const LITE_PATH_INVARIANTS = Object.freeze({
324
- storyTicket: true,
325
- prToMain: true,
326
- repoGates: true,
327
- securityBaseline: true,
328
- });
329
-
330
- /**
331
- * Count top-level enumerated items (`- `, `* `, `1. `) in a free-form seed —
332
- * each enumerated line is one predicted artifact.
90
+ * Count enumerated lines (`- `, `* `, `1. `) in a seed.
333
91
  *
334
92
  * @param {string} text
335
93
  * @returns {number}
@@ -345,9 +103,7 @@ function countSeedArtifacts(text) {
345
103
  const MAX_PREDICTED_PATHS = 50;
346
104
 
347
105
  /**
348
- * Extract path-like tokens (at least one `/` plus a dotted extension) from a
349
- * free-form seed — the predicted footprint the sensitive-path and repo-state
350
- * signals classify.
106
+ * Path-like tokens (a `/` plus a dotted extension) in a seed.
351
107
  *
352
108
  * @param {string} text
353
109
  * @returns {string[]} Deduplicated, in order of first appearance.
@@ -365,25 +121,10 @@ function extractPredictedPaths(text) {
365
121
  }
366
122
 
367
123
  /**
368
- * Build the advisory complexity **signals** for a planning seed. Signals,
369
- * not routing: the result carries `routingAuthority: false` and no `route`
370
- * field — they ground the authoring template's pre-resolved `changes[]` and
371
- * the `/prototype` offer, nothing else (Story #5312 deleted the risk-heuristic
372
- * hits and the `planning.complexityGate` echo that used to ride alongside).
373
- *
374
- * - `artifactCount` — enumerated items in the seed, a rough width
375
- * signal for the operator's eye only.
376
- * - `predictedPaths` — path-like tokens the seed names, in order of
377
- * first appearance (capped).
378
- * - `repoState` — which predicted paths exist in the repo (existing
379
- * paths predict refactors; missing predict
380
- * creates).
381
- * - `sensitivePathClasses` — `audit-rules.json` sensitive-path classes the
382
- * predicted footprint intersects (the same
383
- * taxonomy close applies to the landed diff).
384
- *
385
- * Total: never throws; a failed classification degrades to an empty class
386
- * list (the honest "no signal", never a verdict).
124
+ * Advisory signals for a planning seed — they ground the authoring
125
+ * template's `changes[]` and the `/prototype` offer and route nothing.
126
+ * Existing paths predict refactors, missing ones creates. Never throws; a
127
+ * failed classification yields an empty class list.
387
128
  *
388
129
  * @param {{
389
130
  * seedText?: string,
@@ -441,143 +182,112 @@ export function buildComplexitySignals({
441
182
  }
442
183
 
443
184
  /**
444
- * Assemble the effort/risk shape of a footprint — the evidence
445
- * {@link deriveStoryShape} decides on and carries on its result.
185
+ * @param {'lite'|'full'} route
186
+ * @param {string|null} code
187
+ * @param {string} reason
188
+ * @param {object|null} [shape]
189
+ * @returns {object}
190
+ */
191
+ function decide(route, code, reason, shape = null) {
192
+ return { route, reasons: [reason], code, shape };
193
+ }
194
+
195
+ /**
196
+ * Read the footprint into path entries, or a shape-less rejection when it
197
+ * cannot be read.
446
198
  *
199
+ * @param {unknown} changes
200
+ * @returns {{ entries: Array<{ path: string, isGlob?: boolean }>|null, rejection: object|null }}
201
+ */
202
+ function readFootprintEntries(changes) {
203
+ if (!Array.isArray(changes) || changes.length === 0) {
204
+ return {
205
+ entries: null,
206
+ rejection: decide(
207
+ 'full',
208
+ SHAPE_CODES.NO_CHANGES,
209
+ 'no changes[] declared — the footprint is unknown, so the work cannot be judged trivial; conservative full route',
210
+ ),
211
+ };
212
+ }
213
+ try {
214
+ return { entries: extractChangePaths(changes), rejection: null };
215
+ } catch (err) {
216
+ return {
217
+ entries: null,
218
+ rejection: decide(
219
+ 'full',
220
+ SHAPE_CODES.UNREADABLE_CHANGES,
221
+ `changes[] could not be read (${err?.message ?? err}) — unknown footprint; conservative full route`,
222
+ ),
223
+ };
224
+ }
225
+ }
226
+
227
+ /**
228
+ * A glob footprint has unknowable width; `null` when judgeable.
229
+ *
230
+ * @param {Array<{ isGlob?: boolean }>} entries
231
+ * @param {object} shape
232
+ * @returns {object|null}
233
+ */
234
+ function unjudgeableFootprintRejection(entries, shape) {
235
+ if (entries.some((e) => e.isGlob)) {
236
+ return decide(
237
+ 'full',
238
+ SHAPE_CODES.GLOB_FOOTPRINT,
239
+ 'changes[] contains a glob path — unknown footprint width; conservative full route',
240
+ shape,
241
+ );
242
+ }
243
+ return null;
244
+ }
245
+
246
+ /**
447
247
  * @param {{
448
- * changes: unknown[],
449
248
  * paths: string[],
450
- * acceptance?: unknown,
451
- * kinds?: unknown,
452
- * magnitude?: unknown,
453
- * uncertainty?: unknown,
454
249
  * sensitiveClasses: string[],
455
250
  * }} args
456
251
  * @returns {{
457
252
  * siteCount: number,
458
- * changeKinds: string[],
459
- * kindCount: number,
460
- * magnitude: string,
461
- * uncertainty: string,
462
- * acceptanceCount: number,
463
- * deployables: string[],
464
253
  * migrationSpan: boolean,
465
254
  * sensitiveClasses: string[],
466
255
  * }}
467
256
  */
468
- function buildEffortShape({
469
- changes,
470
- paths,
471
- acceptance,
472
- kinds,
473
- magnitude,
474
- uncertainty,
475
- sensitiveClasses,
476
- }) {
477
- const changeKinds = resolveChangeKinds({ changes, kinds });
257
+ function buildRiskShape({ paths, sensitiveClasses }) {
478
258
  return {
479
259
  siteCount: paths.length,
480
- changeKinds,
481
- kindCount: changeKinds.length,
482
- magnitude: normalizeBucket(magnitude, MAGNITUDE_SCALE, 'moderate'),
483
- uncertainty: normalizeBucket(uncertainty, UNCERTAINTY_SCALE, 'determined'),
484
- acceptanceCount: Array.isArray(acceptance) ? acceptance.length : 0,
485
- deployables: resolveDeployables(paths),
486
260
  migrationSpan: spansMigrationAndConsumers(paths),
487
261
  sensitiveClasses,
488
262
  };
489
263
  }
490
264
 
491
265
  /**
492
- * Derive the complexity route from an authored Story's **effort and risk**
493
- * (Story #4722 AC-3/AC-4; re-anchored off artifact cardinality by Story #4764)
494
- * — the single shape function persist's backstop and `/mandrel-deliver`'s dispatch
495
- * derivation both read, so the two can never disagree about the same body.
496
- *
497
- * `lite` requires **every** signal to agree, against
498
- * {@link STORY_SHAPE_CEILINGS}:
499
- *
500
- * - a declared, parseable, glob-free `changes[]` footprint — width is not
501
- * counted, but an unknown width cannot be judged;
502
- * - at least one acceptance criterion (a Story with no contract cannot be
503
- * judged trivial). The criteria are **not** capped: criterion count is
504
- * contract detail, not effort;
505
- * - at most `maxChangeKinds` distinct change kinds, magnitude no worse than
506
- * `maxMagnitude`, uncertainty no worse than `maxUncertainty`, and at most
507
- * `maxDeployables` deployable roots — plus no migration-with-consumers
508
- * span. These are the clearly-epic rejections, and nothing finer: the
509
- * declared footprint is a guess, so the diff-derived backstop does the real
510
- * enforcement (see {@link STORY_SHAPE_CEILINGS});
511
- * - a footprint intersecting **no** sensitive-path class
512
- * (`deriveChangeLevel`, the taxonomy close applies to the landed diff).
513
- * Sensitivity always wins (AC-6): a sensitive footprint routes `full`
514
- * however small or mechanical, which keeps the fresh acceptance critic via
515
- * `ceremony-routing.js`.
516
- *
517
- * Everything else — an unknown/undeclared footprint, a malformed magnitude or
518
- * uncertainty claim, or an unreadable sensitive-path manifest — fails toward
519
- * `full`. Total: never throws.
266
+ * Route a footprint by risk. `lite` requires a declared, parseable,
267
+ * glob-free `changes[]`, no migration-with-consumers span, and no
268
+ * sensitive-path class (a sensitive footprint keeps deep code review however
269
+ * small). Anything unknown or unclassifiable fails toward `full`. Never
270
+ * throws.
520
271
  *
521
272
  * @param {{
522
273
  * changes?: unknown,
523
- * acceptance?: unknown,
524
- * kinds?: unknown,
525
- * magnitude?: unknown,
526
- * uncertainty?: unknown,
527
274
  * injectedRules?: object,
528
275
  * selectSensitivePathClassesFn?: Function,
529
- * }} [args] `kinds` declares the distinct change kinds explicitly (absent, each
530
- * entry's `assumption` is its kind); `magnitude` and `uncertainty` are the
531
- * declared coarse buckets.
276
+ * }} [args]
532
277
  * @returns {{
533
278
  * route: ComplexityRoute,
534
279
  * reasons: string[],
535
280
  * code: string|null,
536
- * shape: ReturnType<typeof buildEffortShape>|null,
537
- * ceilings: typeof STORY_SHAPE_CEILINGS,
538
- * preserves: typeof LITE_PATH_INVARIANTS,
539
- * }} `code` is the stable {@link SHAPE_CODES} identifier for the rule that
540
- * rejected the shape (`null` on `lite`) — the field a caller branches on,
541
- * since `reasons[]` is human prose and free to be re-worded.
281
+ * shape: ReturnType<typeof buildRiskShape>|null,
282
+ * }}
542
283
  */
543
284
  export function deriveStoryShape({
544
285
  changes,
545
- acceptance,
546
- kinds,
547
- magnitude,
548
- uncertainty,
549
286
  injectedRules,
550
287
  selectSensitivePathClassesFn,
551
288
  } = {}) {
552
- const ceilings = STORY_SHAPE_CEILINGS;
553
- const preserves = LITE_PATH_INVARIANTS;
554
- const decide = (route, code, reason, shape = null) => ({
555
- route,
556
- reasons: [reason],
557
- code,
558
- shape,
559
- ceilings,
560
- preserves,
561
- });
562
-
563
- if (!Array.isArray(changes) || changes.length === 0) {
564
- return decide(
565
- 'full',
566
- SHAPE_CODES.NO_CHANGES,
567
- 'no changes[] declared — the footprint is unknown, so the work cannot be judged trivial; conservative full route',
568
- );
569
- }
570
-
571
- let entries;
572
- try {
573
- entries = extractChangePaths(changes);
574
- } catch (err) {
575
- return decide(
576
- 'full',
577
- SHAPE_CODES.UNREADABLE_CHANGES,
578
- `changes[] could not be read (${err?.message ?? err}) — unknown footprint; conservative full route`,
579
- );
580
- }
289
+ const { entries, rejection } = readFootprintEntries(changes);
290
+ if (rejection !== null) return rejection;
581
291
 
582
292
  const paths = entries.map((e) => e.path);
583
293
  const { level, classes } = deriveChangeLevel({
@@ -585,42 +295,18 @@ export function deriveStoryShape({
585
295
  injectedRules,
586
296
  selectSensitivePathClassesFn,
587
297
  });
588
- const shape = buildEffortShape({
589
- changes,
590
- paths,
591
- acceptance,
592
- kinds,
593
- magnitude,
594
- uncertainty,
595
- sensitiveClasses: classes,
596
- });
298
+ const shape = buildRiskShape({ paths, sensitiveClasses: classes });
597
299
 
598
- if (entries.some((e) => e.isGlob)) {
599
- return decide(
600
- 'full',
601
- SHAPE_CODES.GLOB_FOOTPRINT,
602
- 'changes[] contains a glob path — unknown footprint width; conservative full route',
603
- shape,
604
- );
605
- }
606
- if (shape.acceptanceCount === 0) {
607
- return decide(
608
- 'full',
609
- SHAPE_CODES.NO_ACCEPTANCE,
610
- 'no acceptance criteria — the contract cannot be judged trivial; conservative full route',
611
- shape,
612
- );
613
- }
300
+ const unjudgeable = unjudgeableFootprintRejection(entries, shape);
301
+ if (unjudgeable !== null) return unjudgeable;
614
302
 
615
- const violation = firstEffortViolation(shape, ceilings);
303
+ const violation = firstRiskViolation(shape);
616
304
  if (violation !== null) {
617
305
  return decide('full', violation.code, violation.reason, shape);
618
306
  }
619
307
 
620
308
  if (level !== 'low') {
621
- // `deriveChangeLevel` degraded to its null fail-safe (unreadable
622
- // manifest / failed selector): there is no evidence the footprint is
623
- // non-sensitive, and a classification failure must never buy lite.
309
+ // Classification failed; that must never buy lite.
624
310
  return decide(
625
311
  'full',
626
312
  SHAPE_CODES.CLASSIFICATION_UNAVAILABLE,
@@ -632,55 +318,25 @@ export function deriveStoryShape({
632
318
  return decide(
633
319
  'lite',
634
320
  null,
635
- `trivial shape: ${shape.kindCount} change kind(s) (${shape.changeKinds.join(', ')}) ≤ ${ceilings.maxChangeKinds} across ${shape.siteCount} site(s), magnitude ${shape.magnitude} ≤ ${ceilings.maxMagnitude}, shape ${shape.uncertainty}, no epic-scope span, no sensitive-path class — inline-eligible; non-negotiables preserved`,
321
+ `no absolute risk rule fires across ${shape.siteCount} predicted path(s): no migration-with-consumers span, no sensitive-path class — inline-eligible; size is bounded by the diff backstop`,
636
322
  shape,
637
323
  );
638
324
  }
639
325
 
640
326
  /**
641
- * Decide how `/mandrel-deliver` executes a Story: **run topology, and nothing else.**
642
- *
643
- * **`inline` names one indivisible resource: the router's own session.** Two
644
- * Stories cannot both own it, so exactly one premise can grant it —
645
- * **run topology (Story #4736)**: a run resolving a *single* Story executes
646
- * inline whatever its shape, because sub-agent isolation is load-bearing only
647
- * for CONCURRENT dispatch (two workers sharing a checkout race on worktrees and
648
- * branch refs) and a one-Story run has no sibling to race. It therefore pays
649
- * the spawn premium (a boot is a cache WRITE at full rate, where an inline
650
- * continuation is a cache read at ~10%; ~$1.43/M vs ~$1.07/M on comparable
651
- * bench work) for nothing.
652
- *
653
- * **Shape cannot grant it (Story #4829).** The shape read used to return
654
- * `inline` for any lite-shaped body in a multi-Story run, inheriting no
655
- * topology guard. Measured twice on 2026-07-29: a two-Story and a three-Story
656
- * run came back `inline` for *every* Story while `stories-wave-tick.js`
657
- * reported the whole set ready under a concurrency cap of five — a router
658
- * following both signals literally runs several engines over one session and
659
- * one checkout, the precise hazard the sub-agent path exists to prevent.
660
- *
661
- * **So this function reads only `storyCount` (Story #5006).** #4829 left the
662
- * body parse, the shape derivation, the `route::lite` hint note and the
663
- * `planning.complexityGate.enabled` branch in place to populate a `route`
664
- * field for reporting — but the sole consumer, `resolve-stories.js`, reads
665
- * `.mode` and discards the rest, so every one of those inputs was a parse
666
- * whose result nothing could act on. A caller that wants the shape calls
667
- * {@link deriveStoryShape} directly, as the light path and plan-persist do.
668
- *
669
- * Inline execution removes model-side fan-out only — it changes **where** the
670
- * engine runs, never **what** runs. Every deterministic
671
- * `single-story-close.js` gate, the PR to `main`, and the
672
- * `story-deliver-terminal` envelope are identical in both modes; see the
673
- * module header's non-negotiables.
674
- *
675
- * @param {{ storyCount?: unknown }} [args] `storyCount` is the number of
676
- * Stories the invoking `/mandrel-deliver` run resolved. Omitted (or not exactly 1)
677
- * means the run cannot be shown sibling-free and therefore dispatches as a
678
- * sub-agent — never an assumed 1.
327
+ * Decide where `/mandrel-deliver` runs a Story, from run topology only.
328
+ * `inline` claims the router's own session, which only one Story can own:
329
+ * sub-agent isolation matters only for concurrent dispatch (siblings race
330
+ * worktrees and branch refs), so a single-Story run goes inline to skip the
331
+ * spawn's cache-write premium. Shape must never grant inline — a multi-Story
332
+ * run would put several engines on one session and checkout. Only *where*
333
+ * changes; close gates, PR and terminal envelope are identical.
334
+ *
335
+ * @param {{ storyCount?: unknown }} [args] Anything but exactly 1 dispatches
336
+ * as a sub-agent.
679
337
  * @returns {{ mode: 'inline'|'subagent', reasons: string[] }}
680
338
  */
681
339
  export function resolveStoryDispatchMode({ storyCount } = {}) {
682
- // The ONLY `inline` exit in this function, and the guard is the whole
683
- // contract: an inline verdict must mean the engine can actually run inline.
684
340
  if (storyCount === 1) {
685
341
  return {
686
342
  mode: 'inline',