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,20 +1,7 @@
1
1
  /**
2
- * plan-context.js — single planner-context envelope build for `/mandrel-plan`.
3
- *
4
- * Folds the authoring-context builders plus the cross-Story dup search into
5
- * ONE JSON envelope, so the authoring middle reads a single file instead of
6
- * shim-scripting library imports.
7
- *
8
- * Two operator modes (v2 Story-only):
9
- * - `seed` / `seed-file` — freeform text (chat or on-disk). Carries
10
- * `seed` plus `duplicates[]` (open-Story dup search).
11
- * - `tickets` — one or more existing issue ids to analyze into proper
12
- * Stories. Carries `sourceTickets[]` plus `duplicates[]` (excluding
13
- * the source ids themselves).
14
- *
15
- * All fields are JSON-serialisable; the module performs no GitHub writes.
16
- * The only I/O surfaces are the injected `provider` (reads) and the
17
- * best-effort local scans the folded builders already perform.
2
+ * plan-context.js — builds the single JSON planner-context envelope for
3
+ * `/mandrel-plan` (modes: seed, seed-file, tickets, amends). No GitHub
4
+ * writes; I/O is the injected provider's reads plus best-effort local scans.
18
5
  */
19
6
 
20
7
  import { readFile } from 'node:fs/promises';
@@ -39,43 +26,17 @@ import { findOpenEpicCandidates } from './epic-candidates.js';
39
26
  import { buildAuthoringContext } from './planning/authoring-context.js';
40
27
 
41
28
  /**
42
- * Envelope byte ceiling (regression guard for the design's named PR2 risk:
43
- * two envelopes → one bigger one). This is the **only** live bound on
44
- * envelope size: Story #4541 removed the `applyBudget` pass from
45
- * `buildAuthoringContext`, because both builders below discard that budgeted
46
- * body and ship the raw seed on `seed.content` instead — the budget bounded
47
- * a field that never left the function.
48
- *
49
- * A measured seed-mode envelope on this repo (a thin `.feature` corpus) is
50
- * ~120 KB, dominated by the digest-first `docsContext` (~63 KB inline
51
- * digest) and the rendered `systemPrompts` (~54 KB); every other field is
52
- * under 1 KB. Story #4811 retired the tier-capped codebase snapshot that
53
- * used to sit alongside them (~35 KB skinny here). This measurement is
54
- * **not** representative of every consumer, though: Story #4977 found
55
- * `bddScenarios` at 118 KB on a consumer with a mature Gherkin corpus —
56
- * larger than `docsContext` and `systemPrompts` combined, consuming nearly
57
- * all of the ceiling's headroom on its own, because the scanner applied no
58
- * cap. `bddScenarios` is now truncated to `BDD_SCENARIOS_BYTE_BUDGET`
59
- * (`lib/bdd-scenario-budget.js`, ≤24 KB) before it reaches this envelope,
60
- * so the seed remains the only field this ceiling leaves genuinely
61
- * unbounded. 256 KB (~64K tokens at the ≈4-chars/token estimate) leaves
62
- * roughly 2× headroom over the fixed-floor measurement above while staying
63
- * well under the session budget. An envelope over it is truncated with a
64
- * `truncated` note rather than refused (Story #5312) — raise the ceiling
65
- * only with a measured justification.
29
+ * The only bound on envelope size: ~2× a measured ~120 KB seed-mode envelope.
30
+ * Raise only with a measured justification.
66
31
  */
67
32
  export const PLAN_CONTEXT_ENVELOPE_BYTE_CEILING = 256_000;
68
33
 
69
- /** Marker appended to a string field the cap had to cut. */
70
34
  const TRUNCATION_MARKER =
71
35
  '\n\n[… truncated by plan-context: PLAN_CONTEXT_ENVELOPE_BYTE_CEILING …]';
72
36
 
73
- /** Bounded number of cap rounds — each round cuts the current largest field. */
74
37
  const MAX_TRUNCATION_ROUNDS = 8;
75
38
 
76
39
  /**
77
- * Byte length of a JSON-serialised value.
78
- *
79
40
  * @param {unknown} value
80
41
  * @returns {number}
81
42
  */
@@ -84,9 +45,6 @@ function jsonBytes(value) {
84
45
  }
85
46
 
86
47
  /**
87
- * Cut a string to fit `excess` fewer bytes, keeping a leading prefix and
88
- * appending the truncation marker.
89
- *
90
48
  * @param {string} text
91
49
  * @param {number} excess
92
50
  * @returns {string}
@@ -104,11 +62,8 @@ function truncateString(text, excess) {
104
62
  }
105
63
 
106
64
  /**
107
- * Cut one envelope field down by roughly `excess` bytes. Three shapes are
108
- * cuttable: a string (cut to a prefix), an array (drop tail entries until it
109
- * fits), and an object whose largest string property is cut in place — which
110
- * covers `seed.content`, `docsContext.digest` and every list field. Returns
111
- * `null` for a shape nothing here can shrink.
65
+ * Cut one field by ~`excess` bytes: a string to a prefix, an array by tail
66
+ * entries, an object by its largest string property. `null` if uncuttable.
112
67
  *
113
68
  * @param {unknown} value
114
69
  * @param {number} excess
@@ -149,28 +104,12 @@ function truncateField(value, excess) {
149
104
  }
150
105
 
151
106
  /**
152
- * Fit an assembled envelope under {@link PLAN_CONTEXT_ENVELOPE_BYTE_CEILING}
153
- * by truncating its largest fields, recording every cut on a `truncated`
154
- * field so the planner can see what it did not get.
155
- *
156
- * Until Story #5312 this refused the envelope outright and exited non-zero
157
- * naming what to trim. That was the wrong direction for a bound whose only
158
- * job is to keep the planner's context readable: an oversize seed or
159
- * `--tickets` body is an operator's real input, and refusing to plan from it
160
- * cost a re-run for a ceiling the operator had no way to act on (the seed is
161
- * carried verbatim by design). A truncated envelope with a note is a plan
162
- * that runs on the part that fits and says so; a refusal is no plan at all.
163
- * The bound itself stays a fixed framework constant — a cap the operator can
164
- * raise past what the model can read fails silently again.
165
- *
166
- * Deliberately **not** exported: its only external caller would be a test, and
167
- * a test-only export is a production-dead one. It is reachable end to end
168
- * through {@link buildPlanContext}, which is where the behaviour matters.
107
+ * Truncate the largest fields to fit, rather than refuse: an oversize seed is
108
+ * the operator's real input, and a partial plan that says so beats none.
169
109
  *
170
110
  * @param {object} envelope
171
111
  * @param {{ ceiling?: number }} [opts]
172
- * @returns {object} `envelope` unchanged when it fits; otherwise a truncated
173
- * copy carrying `truncated: Array<{ field, originalBytes, keptBytes, note }>`.
112
+ * @returns {object} unchanged when it fits, else a copy with `truncated[]`.
174
113
  */
175
114
  function capPlanContextEnvelope(envelope, opts = {}) {
176
115
  const ceiling = opts.ceiling ?? PLAN_CONTEXT_ENVELOPE_BYTE_CEILING;
@@ -181,13 +120,9 @@ function capPlanContextEnvelope(envelope, opts = {}) {
181
120
  for (let round = 0; round < MAX_TRUNCATION_ROUNDS; round += 1) {
182
121
  const total = jsonBytes({ ...next, truncated });
183
122
  if (total <= ceiling) break;
184
- // JSON escaping of the marker and the note itself cost a few bytes the
185
- // raw cut cannot see; over-cut by a small margin so the dominant field
186
- // absorbs the whole excess rather than a residual spilling onto the next
187
- // largest one (which is the planner's own prompt).
123
+ // Over-cut slightly (JSON escaping of marker/note) so the dominant field
124
+ // absorbs the whole excess instead of spilling onto the system prompts.
188
125
  const excess = total - ceiling + 128;
189
- // The largest field that can be cut — re-cut on a later round rather than
190
- // moving on to a smaller field it never had to touch.
191
126
  const candidates = Object.entries(next)
192
127
  .map(([field, value]) => [field, jsonBytes(value)])
193
128
  .sort((a, b) => b[1] - a[1]);
@@ -222,13 +157,7 @@ function capPlanContextEnvelope(envelope, opts = {}) {
222
157
  return { ...next, truncated };
223
158
  }
224
159
 
225
- /**
226
- * Compact, machine-readable descriptor of the `tickets.json` array the
227
- * authoring pass writes and `validateAndNormalizeTickets` gates at persist
228
- * time. A descriptor, not a validator: the deterministic gate stays in the
229
- * persist half (design § 1 step 3); this field exists so the authoring
230
- * middle knows the shape without re-reading the decomposer prompt prose.
231
- */
160
+ /** Shape descriptor only; persist's validator is the gate. */
232
161
  export const TICKET_SCHEMA_DESCRIPTOR = Object.freeze({
233
162
  shape: 'array',
234
163
  itemFields: Object.freeze({
@@ -248,26 +177,14 @@ export const TICKET_SCHEMA_DESCRIPTOR = Object.freeze({
248
177
  'validateAndNormalizeTickets (lib/orchestration/ticket-validator.js) at persist time',
249
178
  });
250
179
 
251
- /**
252
- * Filename of the ready-to-fill Story authoring template `plan-context.js`
253
- * writes next to the captured envelope (Story #4707).
254
- */
255
180
  export const STORIES_TEMPLATE_FILENAME = 'stories.template.json';
256
181
 
257
182
  /**
258
- * Build the template's `changes[]` entries from the envelope's advisory
259
- * complexity signals (Story #4723). Each seed-predicted path is
260
- * pre-resolved to its creates-vs-refactors assumption against the repo
261
- * snapshot the signals already probed: a path present in the repo is a
262
- * `refactors-existing`, a missing one is a `creates`. Order follows
263
- * `predictedPaths` (first appearance in the seed). Falls back to the
264
- * single instructive placeholder entry when the seed predicted no paths.
183
+ * Template `changes[]`: the seed-predicted paths as bare strings (persist
184
+ * derives each assumption against the base branch), or one placeholder.
265
185
  *
266
- * @param {{
267
- * predictedPaths?: string[],
268
- * repoState?: { existingPaths?: string[], missingPaths?: string[] },
269
- * }|null|undefined} complexitySignals
270
- * @returns {Array<{ path: string, assumption: string }>}
186
+ * @param {{ predictedPaths?: string[] }|null|undefined} complexitySignals
187
+ * @returns {string[]}
271
188
  */
272
189
  function buildTemplateChanges(complexitySignals) {
273
190
  const predicted = Array.isArray(complexitySignals?.predictedPaths)
@@ -275,46 +192,14 @@ function buildTemplateChanges(complexitySignals) {
275
192
  (p) => typeof p === 'string' && p.length > 0,
276
193
  )
277
194
  : [];
278
- if (predicted.length === 0) {
279
- return [{ path: 'path/to/file.ext', assumption: 'refactors-existing' }];
280
- }
281
- const existing = new Set(
282
- Array.isArray(complexitySignals?.repoState?.existingPaths)
283
- ? complexitySignals.repoState.existingPaths
284
- : [],
285
- );
286
- return predicted.map((path) => ({
287
- path,
288
- assumption: existing.has(path) ? 'refactors-existing' : 'creates',
289
- }));
195
+ return predicted.length === 0 ? ['path/to/file.ext'] : predicted;
290
196
  }
291
197
 
292
198
  /**
293
- * Render the ready-to-fill `stories.json` authoring template (Story #4707).
294
- *
295
- * One-shot authoring: the planner copies this file to `stories.json`, fills
296
- * the placeholder values, and runs persist — no step requires reading
297
- * `story-body.js` source or re-poking the envelope for format discovery
298
- * (bench: ~7 of 17 plan turns were format discovery). The template uses the
299
- * **structured-object body** shape, which persist parses and serializes to
300
- * the canonical markdown itself (`parse` accepts an object;
301
- * `assembleOnePlanStory` re-serializes canonically), so the serializer
302
- * contract never has to be reverse-engineered by the author. `acceptance[]`
303
- * / `verify[]` live at the ticket's top level — the machine contract persist
304
- * syncs into the body.
305
- *
306
- * Correct-by-construction skeleton (Story #4723): when the envelope's
307
- * `complexitySignals` predicted a footprint the `changes[]` entries arrive
308
- * pre-resolved to creates-vs-refactors against the repo snapshot — a
309
- * faithfully-filled skeleton passes the persist ticket validators without a
310
- * mechanical round-trip. The persist gates stay
311
- * authoritative (they probe the base branch ref, not the working tree).
199
+ * Ready-to-fill `stories.json` template. Uses the structured-object body
200
+ * persist serializes itself, so authors never reverse-engineer the markdown.
312
201
  *
313
- * Pure and deterministic; the output is valid JSON (parseable as-is), with
314
- * instructive placeholder values rather than comments.
315
- *
316
- * @param {{ complexitySignals?: object|null }} [opts] Envelope signals to
317
- * pre-resolve the skeleton against; omit for the bare placeholder shape.
202
+ * @param {{ complexitySignals?: object|null }} [opts]
318
203
  * @returns {string} Pretty-printed JSON template content.
319
204
  */
320
205
  export function renderStoriesTemplate({ complexitySignals = null } = {}) {
@@ -325,12 +210,8 @@ export function renderStoriesTemplate({ complexitySignals = null } = {}) {
325
210
  title: 'Fill: short descriptive title',
326
211
  body: {
327
212
  goal: 'Fill: one sentence stating why this Story exists.',
328
- // A filled, multi-checkpoint example rather than a placeholder
329
- // (Story #5332): `## Slicing` is how one cohesive sweep stays one
330
- // Story, so the skeleton has to show an author what a checkpoint
331
- // list looks like. Each line is a stage of the work — a commit
332
- // boundary inside one session — never a restatement of an
333
- // acceptance item, which states what is true once the Story lands.
213
+ // A filled example: each line is a commit-boundary stage of the
214
+ // work, never a restated acceptance item.
334
215
  slicing:
335
216
  '1. Re-anchor the shared constant and its consumers.\n' +
336
217
  '2. Move the gate ahead of the first write and arm the refusal.\n' +
@@ -359,9 +240,7 @@ export function renderStoriesTemplate({ complexitySignals = null } = {}) {
359
240
  }
360
241
 
361
242
  /**
362
- * Count top-level enumerated items (`- `, `* `, `1. `) anywhere in a
363
- * free-form seed text. Unlike {@link countScopeItems} this does not require
364
- * a scope-shaped heading — a raw `--seed` text rarely has one.
243
+ * Count enumerated lines (`- `, `* `, `1. `) anywhere — no heading required.
365
244
  *
366
245
  * @param {string} text
367
246
  * @returns {number}
@@ -373,24 +252,13 @@ function countEnumeratedItems(text) {
373
252
  .filter((line) => /^\s*(?:[-*]|\d+\.)\s+\S/.test(line)).length;
374
253
  }
375
254
 
376
- /**
377
- * Delta-shaped change-request verbs — a change request naming one of these
378
- * stays a Story by default when the footprint stays inside Story width.
379
- */
255
+ /** Change-request verbs: such a seed stays a Story within Story width. */
380
256
  const DELTA_VERB_RE =
381
257
  /\b(fix(?:es)?|tweak(?:s)?|extend(?:s)?|update(?:s)?|adjust(?:s)?|rename(?:s)?|correct(?:s)?|patch(?:es)?|bug|regression|flaky)\b/i;
382
258
 
383
259
  /**
384
- * Deterministic, CLI-applied scope signal over a raw `--seed` text
385
- * (#4496 fix 6). Embedding it in the `--seed` envelope keeps the headless
386
- * path from needing a judgment pass of its own.
387
- *
388
- * The heuristics anchor to the granularity SSOT —
389
- * `DELIVERABLE_GRANULARITY_GUIDANCE` in `ticket-validator-sizing.js` (one
390
- * Story = one coherent capability slice; multiple independent capabilities =
391
- * an Epic) — and to the change-request delta rubric above. The verdict is
392
- * **advisory**: being wrong in the `epic` direction is cheap, and
393
- * `borderline` is a first-class output, not a forced call.
260
+ * Advisory scope signal over raw seed text (one capability = one Story).
261
+ * Erring toward `epic` is cheap; `borderline` is a real verdict.
394
262
  *
395
263
  * @param {{ seedText?: string }} args
396
264
  * @returns {{ verdict: 'epic'|'story'|'borderline', reasons: string[], advisory: true, appliedBy: 'cli' }}
@@ -452,27 +320,17 @@ export function buildScopeTriageSignal({ seedText = '' } = {}) {
452
320
  };
453
321
  }
454
322
 
455
- /**
456
- * The `audit-rules.json` lens `target` value marking a lens applicable only to
457
- * a project with a rendered frontend.
458
- */
459
323
  const WEB_LENS_TARGET = 'web';
460
324
 
461
325
  /**
462
- * How many matched UI paths the `uiSurface` signal carries. The signal rides the
463
- * `--out` stdout digest, which has a ~2KB contract, and a seed can predict up to
464
- * `MAX_PREDICTED_PATHS` paths — enumerating all of them would let one UI-heavy
465
- * seed blow that budget. The full count travels beside the sample as
466
- * `matchedPathCount`, so nothing is silently lost.
326
+ * Sample size of matched UI paths: the signal rides the ~2KB `--out` stdout
327
+ * digest; `matchedPathCount` carries the full total.
467
328
  */
468
329
  const UI_MATCHED_PATH_SAMPLE = 5;
469
330
 
470
331
  /**
471
- * Union of the `triggers.filePatterns` globs every `target: "web"` lens
472
- * registers in `audit-rules.json` — the framework's shipped declaration of
473
- * "this path is part of a rendered UI surface". Read from the manifest rather
474
- * than re-listed here: a second copy of the glob set would be a second thing to
475
- * keep in sync, and the manifest is already the place an operator extends it.
332
+ * Union of every `target: "web"` lens's `triggers.filePatterns` — read from
333
+ * the manifest, never re-listed, so there is one glob set to extend.
476
334
  *
477
335
  * @param {{ audits?: Record<string, object> }} rules
478
336
  * @returns {string[]} Deduplicated globs, in manifest order.
@@ -489,12 +347,8 @@ function resolveWebFilePatterns(rules) {
489
347
  }
490
348
 
491
349
  /**
492
- * Which predicted paths sit on a UI surface, per the web lens globs.
493
- *
494
- * An unreadable manifest is **indeterminate**, not "no match": the signal fails
495
- * OPEN in the same direction {@link hasWebSurface} does, because a spurious
496
- * mention of an operator-invoked command costs nothing while a missed one costs
497
- * the whole point of the offer.
350
+ * Predicted paths on a UI surface. An unreadable manifest is indeterminate and
351
+ * fails OPEN: a spurious offer costs nothing, a missed one defeats it.
498
352
  *
499
353
  * @param {string[]} predictedPaths
500
354
  * @returns {{ matchedPaths: string[], indeterminate: boolean }}
@@ -515,9 +369,6 @@ function resolveWebFootprintMatch(predictedPaths) {
515
369
  }
516
370
 
517
371
  /**
518
- * The one sentence a `uiSurface` signal carries — why the offer fires, or why it
519
- * does not. Kept in one place so the fired and unfired shapes stay one object.
520
- *
521
372
  * @param {{
522
373
  * detected: boolean,
523
374
  * webSurface: boolean,
@@ -549,22 +400,8 @@ function uiSurfaceReason({
549
400
  }
550
401
 
551
402
  /**
552
- * Derive the advisory **UI-surface** signal from a seed's predicted footprint.
553
- *
554
- * Two observables, both already shipped, ANDed together:
555
- *
556
- * 1. the project is web-capable at all (`hasWebSurface` — the same
557
- * applicability predicate the `target: "web"` audit lenses gate on), and
558
- * 2. at least one predicted path matches a web lens `filePattern`.
559
- *
560
- * No new detection surface and no new `.agentrc.json` key: both halves are
561
- * derived from the consumer's own checkout, so a frontend-less project — this
562
- * repository included — resolves falsey and the offer never fires.
563
- *
564
- * The signal carries **no routing authority** (`automatic: false`): `/mandrel-plan`
565
- * may say that a plan touches UI and that `/prototype` exists, and must never
566
- * invoke it. Pure over its inputs and total — a malformed signal bag or an
567
- * unreadable manifest degrades, never throws.
403
+ * Advisory: web-capable project AND a predicted path matches a web lens glob.
404
+ * The planner may mention `/prototype`, never invoke it. Never throws.
568
405
  *
569
406
  * @param {{
570
407
  * complexitySignals?: object|null,
@@ -579,8 +416,7 @@ function uiSurfaceReason({
579
416
  * matchedPaths: string[],
580
417
  * matchedPathCount: number,
581
418
  * reasons: string[],
582
- * }} `matchedPaths` is a bounded sample
583
- * ({@link UI_MATCHED_PATH_SAMPLE}); `matchedPathCount` is the full total.
419
+ * }}
584
420
  */
585
421
  function buildUiSurfaceSignal({ complexitySignals, config, cwd } = {}) {
586
422
  const predictedPaths = Array.isArray(complexitySignals?.predictedPaths)
@@ -621,10 +457,8 @@ function buildUiSurfaceSignal({ complexitySignals, config, cwd } = {}) {
621
457
  }
622
458
 
623
459
  /**
624
- * Attach the advisory routing/offer signals to a complexity-signals bag as
625
- * **nested** fields (Story #4741). Nesting — rather than new top-level envelope
626
- * keys — keeps every existing per-mode envelope key set byte-stable: both are
627
- * derived from the signals they ride on.
460
+ * Nest the advisory signals inside `complexitySignals` so the per-mode
461
+ * top-level envelope key sets stay stable.
628
462
  *
629
463
  * @param {object} complexitySignals
630
464
  * @param {{ config?: object, cwd?: string }} [context]
@@ -638,21 +472,8 @@ function withAdvisorySignals(complexitySignals, { config, cwd } = {}) {
638
472
  }
639
473
 
640
474
  /**
641
- * Render the authoring system prompts the collapsed pipeline's single
642
- * authoring pass consumes: the N=1 core from
643
- * `lib/templates/decomposer-prompts.js`, with the schedule rules and the
644
- * collision refusal a planner reads only when the default-single split policy
645
- * clears carried separately as `storySplitRules` (Story #5312).
646
- *
647
- * Story #5332 deleted the `spec` / `acceptance` fields with the module that
648
- * rendered them: nothing read either, and both contradicted the current
649
- * contract — one asserting Spec budgets that no longer exist, the other
650
- * demanding the verify tier suffixes tickets mode now strips.
651
- *
652
- * `storyTicketsRules` is the one mode-conditional field (Story #5323): it
653
- * only means anything when the seed is an existing ticket, and an envelope
654
- * that carries it in every mode teaches the author to look for a source
655
- * ticket that a `--seed` run does not have.
475
+ * `storyTicketsRules` only in tickets mode: a `--seed` run has no source
476
+ * ticket to look for.
656
477
  *
657
478
  * @param {{ mode?: string }} [args]
658
479
  * @returns {{ story: string, storySplitRules: string, storyTicketsRules?: string }}
@@ -666,8 +487,7 @@ export function buildSystemPrompts({ mode } = {}) {
666
487
  }
667
488
 
668
489
  /**
669
- * Run the open-Story duplicate search. Failures degrade to [] — triage
670
- * signal, not a gate.
490
+ * Open-Story duplicate search; failures degrade to [] (triage, not a gate).
671
491
  *
672
492
  * @param {{
673
493
  * seed: string,
@@ -700,20 +520,9 @@ async function searchStoryDuplicates({
700
520
  }
701
521
 
702
522
  /**
703
- * Gather the independent envelope inputs — the open-Story duplicate search,
704
- * the folded authoring context, the inline docs digest, and (Story #5155) the
705
- * open-Epic and cross-plan-dependency candidate lists — under bounded
706
- * concurrency (Story #4952).
707
- *
708
- * None of them reads a value the others produce, so the result is a pure
709
- * function of `seed` and the injected config: the assembled envelope is
710
- * **byte-identical** to the serial build for the same inputs, whichever order
711
- * the three happen to settle in. `concurrentMap` preserves input order, so the
712
- * destructuring below is positional and stable.
713
- *
714
- * `docsContextFiles` is emptied for the `buildAuthoringContext` call: the
715
- * per-plan digest-file path needs a plan id that does not exist yet — the
716
- * inline digest gathered alongside it replaces that pointer.
523
+ * Gather independent envelope inputs concurrently; order-preserving, so the
524
+ * result matches a serial build. `docsContextFiles` is emptied because no
525
+ * plan id exists yet for a digest file — the inline digest replaces it.
717
526
  *
718
527
  * @param {{
719
528
  * seed: string,
@@ -761,10 +570,6 @@ async function gatherEnvelopeInputs({
761
570
  epic: { id: 0, title: epicTitle, body: seed },
762
571
  github: config.github ?? null,
763
572
  cwd,
764
- // Story #5182 — the memory-hygiene advisory's two thresholds.
765
- // They live on `planning`, not the `project` block `settings`
766
- // carries, so they ride the opts bag rather than that legacy one.
767
- memoryPool: config.planning?.memoryPool ?? null,
768
573
  },
769
574
  ),
770
575
  () =>
@@ -772,10 +577,6 @@ async function gatherEnvelopeInputs({
772
577
  docsContextFiles: settings?.docsContextFiles,
773
578
  docsRoot: paths.docsRoot,
774
579
  }),
775
- // Story #5155 — the two cross-plan lookups. Both are advisory triage
776
- // lists offered at Gate #3, independent of every other gather and of
777
- // each other, so they join the same bounded fan-out rather than adding
778
- // two more serial round-trips to the operator's wait.
779
580
  () =>
780
581
  findOpenEpicCandidates({
781
582
  seed,
@@ -793,10 +594,6 @@ async function gatherEnvelopeInputs({
793
594
  }),
794
595
  ],
795
596
  (gather) => gather(),
796
- // The per-mode envelope gathers (Story #4952): the duplicate search, the
797
- // authoring-context fold and the docs digest have no data dependency on
798
- // one another, so their serialization was incidental and `/mandrel-plan` paid it
799
- // with the operator waiting at Gate #1.
800
597
  { concurrency: FANOUT_CONCURRENCY },
801
598
  );
802
599
 
@@ -812,12 +609,7 @@ async function gatherEnvelopeInputs({
812
609
  };
813
610
  }
814
611
 
815
- /**
816
- * Build the seed-file (ideation) envelope. No parent ticket
817
- * exists yet — creation moves to the persist half — so the open-Story
818
- * dup search is the mode's gating input. `docsContext` is inline-digest:
819
- * there is no plan temp directory to anchor a digest file to yet.
820
- */
612
+ /** Seed-file envelope; also the base for seed mode. */
821
613
  async function buildSeedFileModeEnvelope({
822
614
  seedFilePath,
823
615
  seedFileContent,
@@ -835,18 +627,12 @@ async function buildSeedFileModeEnvelope({
835
627
  );
836
628
  }
837
629
 
838
- // Hoisted above the gather (Story #5155): the dependency-candidate lookup
839
- // intersects against `predictedPaths`, so the signals have to exist before
840
- // the fan-out starts. `buildComplexitySignals` is synchronous and reads
841
- // nothing the gather produces, so hoisting it changes cost, not output.
630
+ // Before the gather: dependency candidates intersect `predictedPaths`.
842
631
  const complexitySignals = withAdvisorySignals(
843
632
  buildComplexitySignals({ seedText: content, cwd }),
844
633
  { config, cwd },
845
634
  );
846
635
 
847
- // Dup search, the authoring-context fold grounded in the seed prose, the
848
- // inline docs digest and the two cross-plan candidate lists are independent
849
- // — gathered concurrently (Story #4952, Story #5155).
850
636
  const {
851
637
  duplicates,
852
638
  authoring,
@@ -866,9 +652,7 @@ async function buildSeedFileModeEnvelope({
866
652
  return {
867
653
  mode: modeLabel,
868
654
  seed: { path: seedFilePath ?? null, content },
869
- // Advisory complexity signals only: no route, no routing authority. The
870
- // nested `uiSurface` is the advisory /prototype offer — never an
871
- // automatic reroute.
655
+ // Advisory only — no routing authority.
872
656
  complexitySignals,
873
657
  duplicates,
874
658
  epicCandidates,
@@ -881,16 +665,11 @@ async function buildSeedFileModeEnvelope({
881
665
  ticketSchema: TICKET_SCHEMA_DESCRIPTOR,
882
666
  systemPrompts: buildSystemPrompts(),
883
667
  planState: null,
884
- // N=1 default: author one Story; skip Epic-scale decompose ceremony.
885
668
  planProfile: 'story-default',
886
669
  };
887
670
  }
888
671
 
889
- /**
890
- * Build the seed-mode (chat text) envelope. The seed-file does not exist
891
- * yet: the dup search and the authoring-context fold both run off the raw
892
- * seed text (N=1 default — no Epic-scale decompose).
893
- */
672
+ /** Seed-mode (chat text) envelope. */
894
673
  async function buildSeedModeEnvelope({
895
674
  seedText,
896
675
  provider,
@@ -921,9 +700,6 @@ async function buildSeedModeEnvelope({
921
700
  }
922
701
 
923
702
  /**
924
- * Fetch source tickets for `--tickets` mode.
925
- * Hydrates ids concurrently (bounded) while preserving input order.
926
- *
927
703
  * @param {number[]} ticketIds
928
704
  * @param {object} provider
929
705
  * @returns {Promise<Array<{ id:number, title:string, body:string, labels:string[], url?:string }>>}
@@ -954,16 +730,11 @@ async function fetchSourceTickets(ticketIds, provider) {
954
730
  state: ticket.state ?? undefined,
955
731
  };
956
732
  },
957
- // `--tickets` source-ticket hydration: one independent read per id.
958
733
  { concurrency: FANOUT_CONCURRENCY },
959
734
  );
960
735
  }
961
736
 
962
- /**
963
- * Build the tickets-mode envelope — analyze existing issue(s) into proper
964
- * Stories. Dup search excludes the source ids so a ticket is not reported
965
- * as a duplicate of itself.
966
- */
737
+ /** Dup search excludes the source ids: a ticket is not its own duplicate. */
967
738
  async function buildTicketsModeEnvelope({
968
739
  ticketIds,
969
740
  provider,
@@ -981,15 +752,11 @@ async function buildTicketsModeEnvelope({
981
752
  .map((t) => `# ${t.title}\n\n${t.body}`)
982
753
  .join('\n\n---\n\n');
983
754
 
984
- // Hoisted for the same reason as seed-file mode (Story #5155).
985
755
  const complexitySignals = withAdvisorySignals(
986
756
  buildComplexitySignals({ seedText: seed, cwd }),
987
757
  { config, cwd },
988
758
  );
989
759
 
990
- // Same independent gathers as seed-file mode, concurrent under the same
991
- // bound (Story #4952); only the source-ticket hydration above is a genuine
992
- // data dependency, because `seed` is derived from it.
993
760
  const {
994
761
  duplicates,
995
762
  authoring,
@@ -1034,9 +801,8 @@ async function buildTicketsModeEnvelope({
1034
801
  }
1035
802
 
1036
803
  /**
1037
- * Parse a prior Story body into its acceptance criteria and delivered file
1038
- * map. Total: an unparseable body degrades to empty lists (a delta envelope
1039
- * grounded on whatever survived), never a throw.
804
+ * Prior Story's acceptance and delivered files; an unparseable body degrades
805
+ * to empty lists, never a throw.
1040
806
  *
1041
807
  * @param {string} priorBody
1042
808
  * @returns {{ priorAcceptance: string[], deliveredFiles: string[] }}
@@ -1060,20 +826,8 @@ function extractPriorArtifacts(priorBody) {
1060
826
  }
1061
827
 
1062
828
  /**
1063
- * Build the amendment (delta) envelope — `plan-context --amends #<id>`
1064
- * (Story #4741 AC-4, R3-A). The heavy-amendment counterpart to routing a
1065
- * light amendment through the light path: instead of re-interrogating the
1066
- * repo from scratch (`buildAuthoringContext`'s codebase snapshot and the BDD /
1067
- * memory / feedback probes), the envelope composes a DELTA from what already
1068
- * exists — the prior Story's body, its acceptance criteria (the real
1069
- * contract), and its delivered file map — so a follow-up change plans from the
1070
- * shape already shipped.
1071
- *
1072
- * The semantic steps that reach the ticket are preserved: the open-Story
1073
- * duplicate search (excluding the amended Story itself) and the authoring
1074
- * system prompts still ride the envelope. What is
1075
- * dropped is only the from-scratch repo interrogation the prior artifacts
1076
- * already stand in for — that is the round-trip diet, not an amputation.
829
+ * `--amends` envelope: a delta grounded on the prior Story instead of a
830
+ * from-scratch repo interrogation.
1077
831
  *
1078
832
  * @param {{
1079
833
  * amendsId: number,
@@ -1105,12 +859,7 @@ async function buildAmendmentModeEnvelope({
1105
859
  const priorBody = typeof prior.body === 'string' ? prior.body : '';
1106
860
  const { priorAcceptance, deliveredFiles } = extractPriorArtifacts(priorBody);
1107
861
 
1108
- // Story #4952 — this builder's independent-gather set has exactly one
1109
- // member. `provider.getTicket` above is a hard data dependency (the prior
1110
- // body IS the seed), and the mode deliberately carries no authoring-context
1111
- // fold and no docs digest — the prior artifacts are the grounding. It still
1112
- // goes through the same bounded gather as the other two builders so one file
1113
- // does not carry two ways of gathering independent envelope inputs.
862
+ // A one-member gather, kept on the same path as the other builders.
1114
863
  const [duplicates] = await concurrentMap(
1115
864
  [
1116
865
  () =>
@@ -1122,7 +871,6 @@ async function buildAmendmentModeEnvelope({
1122
871
  }),
1123
872
  ],
1124
873
  (gather) => gather(),
1125
- // Same independent-gather fan-out as the seed-mode envelope above.
1126
874
  { concurrency: FANOUT_CONCURRENCY },
1127
875
  );
1128
876
 
@@ -1135,15 +883,12 @@ async function buildAmendmentModeEnvelope({
1135
883
  priorAcceptance,
1136
884
  deliveredFiles,
1137
885
  },
1138
- // The prior body is the seed the delta is authored against.
1139
886
  seed: { text: priorBody, path: null },
1140
887
  complexitySignals: withAdvisorySignals(
1141
888
  buildComplexitySignals({ seedText: priorBody, cwd }),
1142
889
  { config, cwd },
1143
890
  ),
1144
891
  duplicates,
1145
- // No plan temp dir and no from-scratch repo interrogation — the prior
1146
- // artifacts are the grounding, so there is no docs digest to anchor.
1147
892
  docsContext: null,
1148
893
  ticketSchema: TICKET_SCHEMA_DESCRIPTOR,
1149
894
  systemPrompts: buildSystemPrompts(),
@@ -1153,11 +898,7 @@ async function buildAmendmentModeEnvelope({
1153
898
  }
1154
899
 
1155
900
  /**
1156
- * Build the single planner-context envelope.
1157
- *
1158
- * Every mode returns through here, which makes this the one place the
1159
- * envelope's total size is decided — and therefore the only honest place to
1160
- * bound it (see {@link capPlanContextEnvelope}).
901
+ * Build the planner-context envelope — the one place every mode is capped.
1161
902
  *
1162
903
  * @param {{
1163
904
  * mode: 'seed-file'|'seed'|'tickets'|'amends',
@@ -1201,10 +942,6 @@ export async function buildPlanContext({
1201
942
  );
1202
943
  }
1203
944
 
1204
- /**
1205
- * Mode dispatch for {@link buildPlanContext}. Split out so the ceiling cap
1206
- * wraps every mode exactly once.
1207
- */
1208
945
  async function buildPlanContextEnvelope({
1209
946
  mode,
1210
947
  seedFilePath,