mandrel 2.60.0 → 2.61.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (661) hide show
  1. package/.agents/README.md +10 -10
  2. package/.agents/agents/story-worker.md +1 -1
  3. package/.agents/docs/agentrc-reference.json +4 -82
  4. package/.agents/docs/configuration.md +20 -87
  5. package/.agents/docs/workflows.md +1 -1
  6. package/.agents/instructions.md +1 -3
  7. package/.agents/rules/gherkin-standards.md +4 -0
  8. package/.agents/schemas/agentrc.schema.json +11 -486
  9. package/.agents/schemas/story-deliver-terminal.schema.json +10 -0
  10. package/.agents/schemas/validation-evidence.schema.json +2 -1
  11. package/.agents/scripts/README.md +14 -14
  12. package/.agents/scripts/acceptance-eval.js +32 -164
  13. package/.agents/scripts/agents-bootstrap-github.js +27 -129
  14. package/.agents/scripts/apply-quality-bootstrap.js +4 -40
  15. package/.agents/scripts/audit-baselines.js +6 -27
  16. package/.agents/scripts/audit-labels-bootstrap.js +5 -29
  17. package/.agents/scripts/audit-to-stories.js +91 -361
  18. package/.agents/scripts/boot-sweep.js +19 -72
  19. package/.agents/scripts/bootstrap.js +74 -395
  20. package/.agents/scripts/ceremony-derive.js +9 -45
  21. package/.agents/scripts/check-arch-cycles.js +14 -64
  22. package/.agents/scripts/check-baselines.js +8 -48
  23. package/.agents/scripts/check-context-budget.js +46 -172
  24. package/.agents/scripts/check-cyclomatic.js +12 -44
  25. package/.agents/scripts/check-dead-exports.js +13 -64
  26. package/.agents/scripts/check-doc-links.js +38 -186
  27. package/.agents/scripts/check-gherkin-corpus.js +24 -127
  28. package/.agents/scripts/check-test-temp-hygiene.js +28 -169
  29. package/.agents/scripts/coverage-capture.js +32 -99
  30. package/.agents/scripts/deliver-light.js +14 -101
  31. package/.agents/scripts/deliver-recover.js +6 -42
  32. package/.agents/scripts/deliver-run.js +36 -133
  33. package/.agents/scripts/diagnose-friction.js +24 -116
  34. package/.agents/scripts/drain-pending-cleanup.js +1 -1
  35. package/.agents/scripts/evidence-gate.js +23 -85
  36. package/.agents/scripts/file-ci-gap.js +10 -50
  37. package/.agents/scripts/generate-config-docs.js +30 -170
  38. package/.agents/scripts/generate-lens-checklists.js +8 -52
  39. package/.agents/scripts/generate-skills-index.js +14 -112
  40. package/.agents/scripts/generate-workflows-doc.js +10 -70
  41. package/.agents/scripts/git-cleanup.js +2 -34
  42. package/.agents/scripts/lib/Graph.js +24 -81
  43. package/.agents/scripts/lib/ITicketingProvider.js +47 -143
  44. package/.agents/scripts/lib/Logger.js +14 -76
  45. package/.agents/scripts/lib/audit-baselines/engine.js +11 -31
  46. package/.agents/scripts/lib/audit-baselines/gate-surface.js +3 -17
  47. package/.agents/scripts/lib/audit-baselines/headroom.js +4 -20
  48. package/.agents/scripts/lib/audit-baselines/hotspots.js +3 -15
  49. package/.agents/scripts/lib/audit-baselines/kinds.js +23 -89
  50. package/.agents/scripts/lib/audit-baselines/outliers.js +6 -23
  51. package/.agents/scripts/lib/audit-baselines/read.js +3 -16
  52. package/.agents/scripts/lib/audit-baselines/staleness.js +7 -26
  53. package/.agents/scripts/lib/audit-baselines/surface-entry.js +7 -28
  54. package/.agents/scripts/lib/audit-baselines/trend.js +7 -20
  55. package/.agents/scripts/lib/audit-baselines/weights.js +9 -37
  56. package/.agents/scripts/lib/audit-suite/audit-rules-reader.js +3 -18
  57. package/.agents/scripts/lib/audit-suite/checklist-threading.js +26 -124
  58. package/.agents/scripts/lib/audit-suite/dispatch-checklist.js +14 -45
  59. package/.agents/scripts/lib/audit-suite/findings.js +12 -52
  60. package/.agents/scripts/lib/audit-suite/frontmatter.js +5 -29
  61. package/.agents/scripts/lib/audit-suite/index.js +1 -15
  62. package/.agents/scripts/lib/audit-suite/lens-checklist.js +10 -45
  63. package/.agents/scripts/lib/audit-suite/lens-diff-floor.js +11 -76
  64. package/.agents/scripts/lib/audit-suite/runner.js +13 -43
  65. package/.agents/scripts/lib/audit-suite/selector.js +49 -349
  66. package/.agents/scripts/lib/audit-suite/substitutions.js +12 -40
  67. package/.agents/scripts/lib/audit-suite/workflow-loader.js +3 -15
  68. package/.agents/scripts/lib/audit-to-stories/audit-label-taxonomy.js +11 -73
  69. package/.agents/scripts/lib/audit-to-stories/audit-lenses.js +8 -37
  70. package/.agents/scripts/lib/audit-to-stories/build-story-body.js +25 -143
  71. package/.agents/scripts/lib/audit-to-stories/dedupe-against-github.js +14 -80
  72. package/.agents/scripts/lib/audit-to-stories/epic-grouping-directive.js +4 -18
  73. package/.agents/scripts/lib/audit-to-stories/finding-adapter.js +7 -40
  74. package/.agents/scripts/lib/audit-to-stories/group-findings.js +9 -39
  75. package/.agents/scripts/lib/audit-to-stories/issue-corpus.js +10 -66
  76. package/.agents/scripts/lib/audit-to-stories/issue-index.js +6 -30
  77. package/.agents/scripts/lib/audit-to-stories/issues-file.js +6 -36
  78. package/.agents/scripts/lib/audit-to-stories/ledger-commit.js +17 -69
  79. package/.agents/scripts/lib/audit-to-stories/ledger-pr.js +17 -85
  80. package/.agents/scripts/lib/audit-to-stories/ledger-record.js +10 -48
  81. package/.agents/scripts/lib/audit-to-stories/parse-audit-md.js +38 -146
  82. package/.agents/scripts/lib/audit-to-stories/seed-from-findings.js +7 -42
  83. package/.agents/scripts/lib/audit-to-stories/wire-dependencies.js +10 -57
  84. package/.agents/scripts/lib/baseline-loader.js +12 -51
  85. package/.agents/scripts/lib/baseline-schema-registry.js +5 -22
  86. package/.agents/scripts/lib/baselines/component-matcher.js +3 -12
  87. package/.agents/scripts/lib/baselines/components.js +10 -61
  88. package/.agents/scripts/lib/baselines/coverage-updater-cli.js +7 -36
  89. package/.agents/scripts/lib/baselines/crap-preview-incremental.js +5 -21
  90. package/.agents/scripts/lib/baselines/crap-preview-scan.js +19 -45
  91. package/.agents/scripts/lib/baselines/crap-updater-cli.js +16 -65
  92. package/.agents/scripts/lib/baselines/diff-scope-cli.js +5 -33
  93. package/.agents/scripts/lib/baselines/duplication-scanner.js +11 -60
  94. package/.agents/scripts/lib/baselines/env-overrides.js +12 -67
  95. package/.agents/scripts/lib/baselines/envelope.js +13 -129
  96. package/.agents/scripts/lib/baselines/exit-codes.js +6 -49
  97. package/.agents/scripts/lib/baselines/git-base.js +23 -142
  98. package/.agents/scripts/lib/baselines/kernel.js +11 -111
  99. package/.agents/scripts/lib/baselines/kinds/_crap-new-method-gate.js +9 -47
  100. package/.agents/scripts/lib/baselines/kinds/_crap-read.js +8 -51
  101. package/.agents/scripts/lib/baselines/kinds/_shared-metric.js +7 -62
  102. package/.agents/scripts/lib/baselines/kinds/bundle-size.js +8 -29
  103. package/.agents/scripts/lib/baselines/kinds/coverage.js +3 -15
  104. package/.agents/scripts/lib/baselines/kinds/crap.js +94 -415
  105. package/.agents/scripts/lib/baselines/kinds/duplication.js +4 -30
  106. package/.agents/scripts/lib/baselines/kinds/kind-factory.js +7 -53
  107. package/.agents/scripts/lib/baselines/kinds/maintainability.js +15 -80
  108. package/.agents/scripts/lib/baselines/kinds/mutation.js +12 -72
  109. package/.agents/scripts/lib/baselines/maintainability-baseline-io.js +4 -11
  110. package/.agents/scripts/lib/baselines/merge-envelopes.js +30 -146
  111. package/.agents/scripts/lib/baselines/path-canon.js +19 -128
  112. package/.agents/scripts/lib/baselines/preview-gates.js +8 -37
  113. package/.agents/scripts/lib/baselines/reader.js +14 -107
  114. package/.agents/scripts/lib/baselines/refresh-service.js +35 -252
  115. package/.agents/scripts/lib/baselines/scope.js +11 -135
  116. package/.agents/scripts/lib/baselines/writer.js +16 -149
  117. package/.agents/scripts/lib/bdd-runner-detect.js +18 -113
  118. package/.agents/scripts/lib/bdd-scenario-budget.js +9 -36
  119. package/.agents/scripts/lib/bdd-scenario-scanner.js +11 -73
  120. package/.agents/scripts/lib/bdd-step-index.js +26 -100
  121. package/.agents/scripts/lib/bootstrap/baseline-merge-driver.js +23 -103
  122. package/.agents/scripts/lib/bootstrap/branch-protection.js +2 -5
  123. package/.agents/scripts/lib/bootstrap/commit-push.js +12 -50
  124. package/.agents/scripts/lib/bootstrap/gh-preflight.js +14 -101
  125. package/.agents/scripts/lib/bootstrap/hitl-confirm.js +5 -30
  126. package/.agents/scripts/lib/bootstrap/install-ledger.js +17 -73
  127. package/.agents/scripts/lib/bootstrap/issue-forms-template.js +17 -121
  128. package/.agents/scripts/lib/bootstrap/manifest.js +15 -86
  129. package/.agents/scripts/lib/bootstrap/merge-methods.js +4 -33
  130. package/.agents/scripts/lib/bootstrap/preflight.js +12 -61
  131. package/.agents/scripts/lib/bootstrap/project-bootstrap.js +34 -235
  132. package/.agents/scripts/lib/bootstrap/prompt.js +21 -129
  133. package/.agents/scripts/lib/bootstrap/quality-bootstrap.js +27 -141
  134. package/.agents/scripts/lib/bootstrap/summary.js +1 -8
  135. package/.agents/scripts/lib/bootstrap/workflow-audit.js +11 -84
  136. package/.agents/scripts/lib/branch-name-guard.js +4 -23
  137. package/.agents/scripts/lib/changed-files.js +31 -143
  138. package/.agents/scripts/lib/checks/core-bare-clean.js +4 -24
  139. package/.agents/scripts/lib/checks/index.js +18 -101
  140. package/.agents/scripts/lib/checks/loop-health.js +11 -53
  141. package/.agents/scripts/lib/checks/state.js +16 -91
  142. package/.agents/scripts/lib/checks/story-init-not-backgrounded.js +10 -61
  143. package/.agents/scripts/lib/checks/subagent-agent-tool-required.js +14 -83
  144. package/.agents/scripts/lib/child-exec.js +39 -108
  145. package/.agents/scripts/lib/cli/standard-args.js +9 -116
  146. package/.agents/scripts/lib/cli-args.js +31 -146
  147. package/.agents/scripts/lib/cli-usage.js +5 -27
  148. package/.agents/scripts/lib/cli-utils.js +2 -12
  149. package/.agents/scripts/lib/close-validation/commands.js +13 -76
  150. package/.agents/scripts/lib/close-validation/gates.js +92 -331
  151. package/.agents/scripts/lib/close-validation/process.js +121 -151
  152. package/.agents/scripts/lib/close-validation/projections/advisories.js +5 -31
  153. package/.agents/scripts/lib/close-validation/projections/crap.js +19 -67
  154. package/.agents/scripts/lib/close-validation/projections/head-sha.js +1 -17
  155. package/.agents/scripts/lib/close-validation/projections/inputs.js +4 -34
  156. package/.agents/scripts/lib/close-validation/projections/maintainability.js +11 -58
  157. package/.agents/scripts/lib/close-validation/runner.js +53 -110
  158. package/.agents/scripts/lib/command-header.js +6 -28
  159. package/.agents/scripts/lib/config/acceptance-eval.js +4 -30
  160. package/.agents/scripts/lib/config/baselines.js +3 -14
  161. package/.agents/scripts/lib/config/ci.js +8 -38
  162. package/.agents/scripts/lib/config/commands.js +1 -15
  163. package/.agents/scripts/lib/config/defaults.js +4 -33
  164. package/.agents/scripts/lib/config/delivery-routing.js +6 -35
  165. package/.agents/scripts/lib/config/explain.js +9 -80
  166. package/.agents/scripts/lib/config/gates/coverage.schema.js +0 -12
  167. package/.agents/scripts/lib/config/gates/crap-incremental-coverage.schema.js +2 -30
  168. package/.agents/scripts/lib/config/gates/crap.schema.js +1 -34
  169. package/.agents/scripts/lib/config/gates/duplication.schema.js +1 -8
  170. package/.agents/scripts/lib/config/gates/index.js +2 -17
  171. package/.agents/scripts/lib/config/gates/maintainability.schema.js +1 -20
  172. package/.agents/scripts/lib/config/gates/mutation.schema.js +1 -7
  173. package/.agents/scripts/lib/config/gates/shared.js +4 -64
  174. package/.agents/scripts/lib/config/github.js +4 -22
  175. package/.agents/scripts/lib/config/limits.js +4 -57
  176. package/.agents/scripts/lib/config/paths.js +2 -21
  177. package/.agents/scripts/lib/config/qa.js +4 -38
  178. package/.agents/scripts/lib/config/quality.js +76 -432
  179. package/.agents/scripts/lib/config/runners.js +12 -56
  180. package/.agents/scripts/lib/config/runtime.js +13 -57
  181. package/.agents/scripts/lib/config/shared.js +2 -16
  182. package/.agents/scripts/lib/config/sync-agentrc.js +9 -50
  183. package/.agents/scripts/lib/config/temp-paths.js +40 -280
  184. package/.agents/scripts/lib/config/validate-orchestration.js +5 -17
  185. package/.agents/scripts/lib/config/worktree-isolation.js +9 -28
  186. package/.agents/scripts/lib/config-resolver.js +10 -52
  187. package/.agents/scripts/lib/config-schema-shared.js +1 -4
  188. package/.agents/scripts/lib/config-settings-schema-delivery.js +12 -294
  189. package/.agents/scripts/lib/config-settings-schema-quality.js +7 -219
  190. package/.agents/scripts/lib/config-settings-schema.js +37 -274
  191. package/.agents/scripts/lib/coverage-baseline.js +20 -110
  192. package/.agents/scripts/lib/coverage-capture-fullscope.js +12 -37
  193. package/.agents/scripts/lib/coverage-capture-incremental.js +12 -43
  194. package/.agents/scripts/lib/coverage-capture-usage.js +4 -24
  195. package/.agents/scripts/lib/coverage-capture.js +99 -224
  196. package/.agents/scripts/lib/coverage-utils.js +14 -79
  197. package/.agents/scripts/lib/cpu-pool.js +17 -123
  198. package/.agents/scripts/lib/crap-baseline-join.js +16 -88
  199. package/.agents/scripts/lib/crap-coordinates.js +6 -25
  200. package/.agents/scripts/lib/crap-engine.js +40 -153
  201. package/.agents/scripts/lib/crap-method-identity.js +16 -78
  202. package/.agents/scripts/lib/crap-utils.js +31 -155
  203. package/.agents/scripts/lib/cyclomatic-ceiling.js +14 -87
  204. package/.agents/scripts/lib/cyclomatic-scope.js +10 -50
  205. package/.agents/scripts/lib/dead-exports-knip.js +18 -56
  206. package/.agents/scripts/lib/dead-exports-mode.js +5 -24
  207. package/.agents/scripts/lib/degraded-mode.js +3 -26
  208. package/.agents/scripts/lib/dependency-parser.js +8 -40
  209. package/.agents/scripts/lib/dependency-version.js +13 -35
  210. package/.agents/scripts/lib/detect-package-manager.js +6 -36
  211. package/.agents/scripts/lib/doc-tiers.js +22 -126
  212. package/.agents/scripts/lib/duplicate-search.js +8 -72
  213. package/.agents/scripts/lib/env-loader.js +5 -27
  214. package/.agents/scripts/lib/error-redactor.js +6 -31
  215. package/.agents/scripts/lib/errors/index.js +2 -22
  216. package/.agents/scripts/lib/escomplex-ast-compat.js +22 -163
  217. package/.agents/scripts/lib/escomplex-kernel.js +21 -123
  218. package/.agents/scripts/lib/feedback-loop/graduator-core.js +93 -419
  219. package/.agents/scripts/lib/feedback-loop/prior-feedback-fetcher.js +20 -98
  220. package/.agents/scripts/lib/feedback-loop/retro-proposals-graduator.js +27 -151
  221. package/.agents/scripts/lib/findings/audit-ledger.js +23 -97
  222. package/.agents/scripts/lib/findings/classify-finding.js +14 -69
  223. package/.agents/scripts/lib/findings/promote-finding.js +14 -112
  224. package/.agents/scripts/lib/findings/provenance-field.js +11 -52
  225. package/.agents/scripts/lib/findings/route-finding.js +37 -255
  226. package/.agents/scripts/lib/findings/semantic-issue-search.js +14 -59
  227. package/.agents/scripts/lib/findings/severity.js +18 -104
  228. package/.agents/scripts/lib/format-generated-json.js +12 -44
  229. package/.agents/scripts/lib/full-suite-lock.js +160 -429
  230. package/.agents/scripts/lib/full-suite-queue.js +213 -0
  231. package/.agents/scripts/lib/gates/baseline-store.js +5 -9
  232. package/.agents/scripts/lib/gates/friction.js +1 -3
  233. package/.agents/scripts/lib/generated/agentrc-validator.js +2 -2
  234. package/.agents/scripts/lib/gh-exec.js +31 -259
  235. package/.agents/scripts/lib/git/cached-fetch.js +9 -52
  236. package/.agents/scripts/lib/git/sync-from-base.js +15 -107
  237. package/.agents/scripts/lib/git-branch-cleanup.js +14 -61
  238. package/.agents/scripts/lib/git-branch-lifecycle.js +16 -87
  239. package/.agents/scripts/lib/git-utils.js +37 -161
  240. package/.agents/scripts/lib/github/framework-repo.js +8 -71
  241. package/.agents/scripts/lib/github-url.js +2 -17
  242. package/.agents/scripts/lib/import-graph.js +11 -38
  243. package/.agents/scripts/lib/install-cmd-parser.js +4 -13
  244. package/.agents/scripts/lib/json-utils.js +3 -18
  245. package/.agents/scripts/lib/label-constants.js +16 -111
  246. package/.agents/scripts/lib/label-taxonomy.js +4 -30
  247. package/.agents/scripts/lib/maintainability-engine.js +12 -80
  248. package/.agents/scripts/lib/maintainability-unscorable.js +5 -25
  249. package/.agents/scripts/lib/maintainability-utils.js +16 -92
  250. package/.agents/scripts/lib/mandrel-catalog.js +12 -70
  251. package/.agents/scripts/lib/notifications/notifier.js +13 -38
  252. package/.agents/scripts/lib/npm-scripts.js +4 -23
  253. package/.agents/scripts/lib/observability/metrics-ledger.js +16 -76
  254. package/.agents/scripts/lib/observability/runtime-friction.js +44 -286
  255. package/.agents/scripts/lib/observability/signal-validator.js +5 -37
  256. package/.agents/scripts/lib/observability/signals-writer.js +11 -121
  257. package/.agents/scripts/lib/observability/source-classifier.js +21 -203
  258. package/.agents/scripts/lib/observability/terse-result.js +14 -47
  259. package/.agents/scripts/lib/onboard/init-tail.js +13 -74
  260. package/.agents/scripts/lib/onboard/scaffold-docs.js +11 -34
  261. package/.agents/scripts/lib/orchestration/acceptance-eval-decision.js +25 -139
  262. package/.agents/scripts/lib/orchestration/auto-merge-cwd.js +11 -66
  263. package/.agents/scripts/lib/orchestration/behind-recovery.js +10 -55
  264. package/.agents/scripts/lib/orchestration/ceremony-routing.js +5 -75
  265. package/.agents/scripts/lib/orchestration/change-set.js +7 -36
  266. package/.agents/scripts/lib/orchestration/check-baselines/phases/compare.js +9 -46
  267. package/.agents/scripts/lib/orchestration/check-baselines/phases/evaluate.js +11 -44
  268. package/.agents/scripts/lib/orchestration/check-baselines/phases/floors.js +5 -24
  269. package/.agents/scripts/lib/orchestration/check-baselines/phases/friction.js +3 -12
  270. package/.agents/scripts/lib/orchestration/check-baselines/phases/parse-args.js +5 -38
  271. package/.agents/scripts/lib/orchestration/check-baselines/phases/pipeline.js +3 -8
  272. package/.agents/scripts/lib/orchestration/check-baselines/phases/refresh-ack.js +28 -136
  273. package/.agents/scripts/lib/orchestration/check-baselines/phases/report.js +3 -13
  274. package/.agents/scripts/lib/orchestration/check-state.js +92 -0
  275. package/.agents/scripts/lib/orchestration/ci-gap-intake.js +37 -144
  276. package/.agents/scripts/lib/orchestration/ci-rerun-guard.js +42 -189
  277. package/.agents/scripts/lib/orchestration/code-review.js +24 -128
  278. package/.agents/scripts/lib/orchestration/column-sync.js +23 -111
  279. package/.agents/scripts/lib/orchestration/complexity-gate.js +42 -214
  280. package/.agents/scripts/lib/orchestration/deliver-recover.js +36 -168
  281. package/.agents/scripts/lib/orchestration/dependency-analyzer.js +4 -35
  282. package/.agents/scripts/lib/orchestration/dependency-candidates.js +9 -41
  283. package/.agents/scripts/lib/orchestration/diff-magnitude.js +25 -115
  284. package/.agents/scripts/lib/orchestration/doc-reader.js +2 -6
  285. package/.agents/scripts/lib/orchestration/docs-digest.js +13 -51
  286. package/.agents/scripts/lib/orchestration/epic-candidates.js +13 -53
  287. package/.agents/scripts/lib/orchestration/epic-checklist.js +9 -33
  288. package/.agents/scripts/lib/orchestration/epic-container.js +41 -167
  289. package/.agents/scripts/lib/orchestration/epic-expansion.js +10 -40
  290. package/.agents/scripts/lib/orchestration/epic-rollup.js +55 -207
  291. package/.agents/scripts/lib/orchestration/file-assumption-enum.js +2 -22
  292. package/.agents/scripts/lib/orchestration/file-assumptions.js +45 -253
  293. package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-detect.js +9 -46
  294. package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches-reap.js +7 -57
  295. package/.agents/scripts/lib/orchestration/git-cleanup/phases/branches.js +21 -126
  296. package/.agents/scripts/lib/orchestration/git-cleanup/phases/cli.js +2 -6
  297. package/.agents/scripts/lib/orchestration/git-cleanup/phases/fast-forward.js +1 -4
  298. package/.agents/scripts/lib/orchestration/git-cleanup/phases/filters.js +1 -5
  299. package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes-ff.js +9 -34
  300. package/.agents/scripts/lib/orchestration/git-cleanup/phases/git-probes.js +41 -190
  301. package/.agents/scripts/lib/orchestration/git-cleanup/phases/merged-tip.js +9 -45
  302. package/.agents/scripts/lib/orchestration/git-cleanup/phases/parse-args.js +1 -4
  303. package/.agents/scripts/lib/orchestration/git-cleanup/phases/phase-drivers.js +19 -85
  304. package/.agents/scripts/lib/orchestration/git-cleanup/phases/prompts.js +3 -17
  305. package/.agents/scripts/lib/orchestration/git-cleanup/phases/prune.js +1 -5
  306. package/.agents/scripts/lib/orchestration/git-cleanup/phases/render.js +16 -100
  307. package/.agents/scripts/lib/orchestration/git-cleanup/phases/stashes.js +1 -4
  308. package/.agents/scripts/lib/orchestration/lease-guard-shared.js +16 -67
  309. package/.agents/scripts/lib/orchestration/lifecycle/emit-ledger-event.js +9 -33
  310. package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-flip-failed.js +8 -29
  311. package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-unlanded.js +15 -68
  312. package/.agents/scripts/lib/orchestration/light-backstop.js +11 -49
  313. package/.agents/scripts/lib/orchestration/light-escalation.js +21 -89
  314. package/.agents/scripts/lib/orchestration/light-suitability.js +26 -231
  315. package/.agents/scripts/lib/orchestration/merge-block-class.js +39 -216
  316. package/.agents/scripts/lib/orchestration/merge-poll.js +104 -377
  317. package/.agents/scripts/lib/orchestration/pinned-identifier-lint.js +17 -57
  318. package/.agents/scripts/lib/orchestration/plan-context.js +52 -303
  319. package/.agents/scripts/lib/orchestration/plan-critic-conditions.js +22 -79
  320. package/.agents/scripts/lib/orchestration/plan-critics-evaluate.js +5 -31
  321. package/.agents/scripts/lib/orchestration/plan-metrics.js +29 -108
  322. package/.agents/scripts/lib/orchestration/plan-navigation.js +8 -27
  323. package/.agents/scripts/lib/orchestration/plan-persist/acceptance-handle-repair.js +12 -49
  324. package/.agents/scripts/lib/orchestration/plan-persist/audit-provenance.js +18 -73
  325. package/.agents/scripts/lib/orchestration/plan-persist/changes-repair.js +14 -78
  326. package/.agents/scripts/lib/orchestration/plan-persist/cross-plan-links.js +6 -30
  327. package/.agents/scripts/lib/orchestration/plan-persist/epic-adoption.js +14 -65
  328. package/.agents/scripts/lib/orchestration/plan-persist/epic-ops.js +21 -76
  329. package/.agents/scripts/lib/orchestration/plan-persist/external-deps.js +6 -43
  330. package/.agents/scripts/lib/orchestration/plan-persist/persist-helpers.js +14 -68
  331. package/.agents/scripts/lib/orchestration/plan-persist/plan-context-source.js +9 -41
  332. package/.agents/scripts/lib/orchestration/plan-persist/run-plan-persist.js +49 -248
  333. package/.agents/scripts/lib/orchestration/plan-persist/soft-findings.js +2 -12
  334. package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +85 -368
  335. package/.agents/scripts/lib/orchestration/plan-persist/summary.js +8 -38
  336. package/.agents/scripts/lib/orchestration/plan-persist/supersede-ops.js +30 -190
  337. package/.agents/scripts/lib/orchestration/plan-persist/wave-collision-gate.js +9 -49
  338. package/.agents/scripts/lib/orchestration/plan-persist/wave-serialisation.js +7 -28
  339. package/.agents/scripts/lib/orchestration/plan-reachability.js +13 -42
  340. package/.agents/scripts/lib/orchestration/plan-run-labels/reap.js +16 -91
  341. package/.agents/scripts/lib/orchestration/plan-runner/worktree-sweep.js +16 -54
  342. package/.agents/scripts/lib/orchestration/plan-text-hygiene.js +10 -52
  343. package/.agents/scripts/lib/orchestration/planning/authoring-context.js +14 -109
  344. package/.agents/scripts/lib/orchestration/planning/memory-pool-advisory.js +11 -83
  345. package/.agents/scripts/lib/orchestration/pr-watch.js +48 -306
  346. package/.agents/scripts/lib/orchestration/project-meta-cache.js +15 -80
  347. package/.agents/scripts/lib/orchestration/project-meta-resolver.js +10 -51
  348. package/.agents/scripts/lib/orchestration/reassert-status-column.js +12 -76
  349. package/.agents/scripts/lib/orchestration/remote-verifier.js +12 -36
  350. package/.agents/scripts/lib/orchestration/resolve-stories.js +33 -164
  351. package/.agents/scripts/lib/orchestration/retro-proposals.js +66 -361
  352. package/.agents/scripts/lib/orchestration/review-base-ref.js +9 -43
  353. package/.agents/scripts/lib/orchestration/review-depth.js +12 -94
  354. package/.agents/scripts/lib/orchestration/review-providers/codex.js +10 -111
  355. package/.agents/scripts/lib/orchestration/review-providers/degraded-gates.js +13 -71
  356. package/.agents/scripts/lib/orchestration/review-providers/findings-renderer.js +7 -51
  357. package/.agents/scripts/lib/orchestration/review-providers/mi-exemptions.js +8 -53
  358. package/.agents/scripts/lib/orchestration/review-providers/native.js +30 -214
  359. package/.agents/scripts/lib/orchestration/review-providers/parse-findings.js +7 -52
  360. package/.agents/scripts/lib/orchestration/review-providers/review-depth.js +4 -33
  361. package/.agents/scripts/lib/orchestration/review-providers/review-provider-factory.js +11 -71
  362. package/.agents/scripts/lib/orchestration/review-providers/scoped-lint.js +19 -131
  363. package/.agents/scripts/lib/orchestration/review-providers/security-review.js +6 -89
  364. package/.agents/scripts/lib/orchestration/review-providers/types.js +26 -56
  365. package/.agents/scripts/lib/orchestration/review-providers/ultrareview.js +3 -46
  366. package/.agents/scripts/lib/orchestration/run-epilogue.js +40 -199
  367. package/.agents/scripts/lib/orchestration/run-scoped-config.js +13 -81
  368. package/.agents/scripts/lib/orchestration/single-story-close/close-note.js +7 -34
  369. package/.agents/scripts/lib/orchestration/single-story-close/failed-terminal.js +16 -89
  370. package/.agents/scripts/lib/orchestration/single-story-close/gate-log.js +18 -109
  371. package/.agents/scripts/lib/orchestration/single-story-close/phases/auto-merge.js +83 -239
  372. package/.agents/scripts/lib/orchestration/single-story-close/phases/base-sync.js +18 -80
  373. package/.agents/scripts/lib/orchestration/single-story-close/phases/close-validation.js +103 -97
  374. package/.agents/scripts/lib/orchestration/single-story-close/phases/code-review.js +8 -64
  375. package/.agents/scripts/lib/orchestration/single-story-close/phases/confirm-merge.js +136 -486
  376. package/.agents/scripts/lib/orchestration/single-story-close/phases/conventional-subject.js +30 -134
  377. package/.agents/scripts/lib/orchestration/single-story-close/phases/graphql-preflight.js +9 -50
  378. package/.agents/scripts/lib/orchestration/single-story-close/phases/lock-wait-pending.js +49 -0
  379. package/.agents/scripts/lib/orchestration/single-story-close/phases/normalize-pr-title.js +13 -86
  380. package/.agents/scripts/lib/orchestration/single-story-close/phases/options.js +20 -95
  381. package/.agents/scripts/lib/orchestration/single-story-close/phases/post-land.js +46 -203
  382. package/.agents/scripts/lib/orchestration/single-story-close/phases/pre-gate-steps.js +8 -50
  383. package/.agents/scripts/lib/orchestration/single-story-close/phases/pull-request.js +12 -83
  384. package/.agents/scripts/lib/orchestration/single-story-close/phases/push.js +6 -39
  385. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-block.js +1 -6
  386. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-outcome.js +4 -28
  387. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-override.js +6 -51
  388. package/.agents/scripts/lib/orchestration/single-story-close/phases/worktree-reap.js +6 -34
  389. package/.agents/scripts/lib/orchestration/single-story-close/phases/wrong-tree-guard.js +23 -121
  390. package/.agents/scripts/lib/orchestration/single-story-close/runner.js +110 -290
  391. package/.agents/scripts/lib/orchestration/single-story-lease-guard.js +15 -69
  392. package/.agents/scripts/lib/orchestration/story-body-gate.js +4 -23
  393. package/.agents/scripts/lib/orchestration/story-close/baseline-upward-writeback.js +50 -179
  394. package/.agents/scripts/lib/orchestration/story-close/context-budget-writeback.js +11 -41
  395. package/.agents/scripts/lib/orchestration/story-close/format-autofix.js +23 -311
  396. package/.agents/scripts/lib/orchestration/story-close/phases/local-lens-review.js +22 -147
  397. package/.agents/scripts/lib/orchestration/story-close/phases/review-core.js +16 -67
  398. package/.agents/scripts/lib/orchestration/story-deliver-terminal-schema.js +12 -68
  399. package/.agents/scripts/lib/orchestration/story-deliver-terminal.js +42 -201
  400. package/.agents/scripts/lib/orchestration/story-follow-ups.js +43 -245
  401. package/.agents/scripts/lib/orchestration/story-init-envelope.js +4 -23
  402. package/.agents/scripts/lib/orchestration/story-init-remote.js +2 -6
  403. package/.agents/scripts/lib/orchestration/story-reachability.js +3 -23
  404. package/.agents/scripts/lib/orchestration/task-body-validator.js +12 -126
  405. package/.agents/scripts/lib/orchestration/ticket-lease.js +28 -131
  406. package/.agents/scripts/lib/orchestration/ticket-validator-conflicts.js +15 -149
  407. package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +5 -33
  408. package/.agents/scripts/lib/orchestration/ticket-validator.js +39 -181
  409. package/.agents/scripts/lib/orchestration/ticketing/bulk.js +51 -244
  410. package/.agents/scripts/lib/orchestration/ticketing/reads.js +39 -250
  411. package/.agents/scripts/lib/orchestration/ticketing/state.js +14 -68
  412. package/.agents/scripts/lib/orchestration/ticketing/transition.js +46 -263
  413. package/.agents/scripts/lib/orchestration/ticketing.js +2 -26
  414. package/.agents/scripts/lib/orchestration/verify-credit.js +18 -79
  415. package/.agents/scripts/lib/orchestration/worktree-dirty.js +5 -30
  416. package/.agents/scripts/lib/path-security.js +3 -6
  417. package/.agents/scripts/lib/plan-phase-cleanup.js +9 -49
  418. package/.agents/scripts/lib/preflight-runner.js +13 -69
  419. package/.agents/scripts/lib/process-group.js +143 -0
  420. package/.agents/scripts/lib/project-root.js +2 -8
  421. package/.agents/scripts/lib/provider-factory.js +2 -25
  422. package/.agents/scripts/lib/qa/console-allowlist.js +10 -59
  423. package/.agents/scripts/lib/qa/qa-session.js +15 -69
  424. package/.agents/scripts/lib/qa/redact-evidence.js +18 -129
  425. package/.agents/scripts/lib/qa/resolve-qa-contract.js +26 -135
  426. package/.agents/scripts/lib/qa/resolve-selection.js +16 -84
  427. package/.agents/scripts/lib/reserved-test-ids.js +9 -47
  428. package/.agents/scripts/lib/runtime-deps/dep-resolution.js +13 -53
  429. package/.agents/scripts/lib/runtime-deps/ensure-installed.js +10 -44
  430. package/.agents/scripts/lib/runtime-deps/manifest.js +10 -30
  431. package/.agents/scripts/lib/runtime-deps/parser-major.js +15 -51
  432. package/.agents/scripts/lib/runtime-deps/preflight.js +4 -22
  433. package/.agents/scripts/lib/runtime-deps/scan-imports.js +11 -55
  434. package/.agents/scripts/lib/signals/detectors/common.js +12 -38
  435. package/.agents/scripts/lib/signals/index.js +2 -19
  436. package/.agents/scripts/lib/signals/schema.js +14 -109
  437. package/.agents/scripts/lib/signals/write.js +2 -11
  438. package/.agents/scripts/lib/single-story/confirm-merge.js +31 -72
  439. package/.agents/scripts/lib/single-story/story-merged-notify.js +8 -49
  440. package/.agents/scripts/lib/single-story-sweep/protection-ctx.js +4 -26
  441. package/.agents/scripts/lib/single-story-sweep/protection.js +13 -100
  442. package/.agents/scripts/lib/single-story-sweep/sweep-lock.js +60 -258
  443. package/.agents/scripts/lib/single-story-sweep.js +14 -97
  444. package/.agents/scripts/lib/skills/parse-skill.js +13 -59
  445. package/.agents/scripts/lib/skills/skills-index.js +8 -29
  446. package/.agents/scripts/lib/skills/walk-skill-files.js +17 -78
  447. package/.agents/scripts/lib/source-extensions.js +11 -42
  448. package/.agents/scripts/lib/source-text/strip-js-comments.js +8 -41
  449. package/.agents/scripts/lib/stdio-flush.js +9 -36
  450. package/.agents/scripts/lib/story-adjacency.js +8 -40
  451. package/.agents/scripts/lib/story-body/body-format-lints.js +22 -83
  452. package/.agents/scripts/lib/story-body/footer-block.js +11 -44
  453. package/.agents/scripts/lib/story-body/story-body.js +83 -358
  454. package/.agents/scripts/lib/temp-retention.js +42 -143
  455. package/.agents/scripts/lib/templates/decomposer-prompts.js +11 -65
  456. package/.agents/scripts/lib/test-env.js +12 -65
  457. package/.agents/scripts/lib/test-run-credit.js +10 -65
  458. package/.agents/scripts/lib/test-runner-contract.js +19 -74
  459. package/.agents/scripts/lib/test-temp.js +38 -184
  460. package/.agents/scripts/lib/test-tiers.js +12 -96
  461. package/.agents/scripts/lib/ticket-body-sections.js +21 -96
  462. package/.agents/scripts/lib/transpile.js +15 -74
  463. package/.agents/scripts/lib/util/concurrent-map.js +6 -25
  464. package/.agents/scripts/lib/util/parse-id-list.js +8 -34
  465. package/.agents/scripts/lib/util/poll-loop.js +8 -28
  466. package/.agents/scripts/lib/util/with-timeout.js +2 -11
  467. package/.agents/scripts/lib/validation-evidence.js +21 -96
  468. package/.agents/scripts/lib/wave-runner/footprint.js +17 -70
  469. package/.agents/scripts/lib/wave-runner/live-probe.js +53 -221
  470. package/.agents/scripts/lib/wave-runner/ready-set.js +72 -301
  471. package/.agents/scripts/lib/workers/crap-worker.js +11 -64
  472. package/.agents/scripts/lib/workers/maintainability-report-worker.js +8 -45
  473. package/.agents/scripts/lib/workers/maintainability-worker.js +5 -21
  474. package/.agents/scripts/lib/workers/serve-worker-messages.js +2 -18
  475. package/.agents/scripts/lib/workflow-closure.js +22 -105
  476. package/.agents/scripts/lib/workspace-provisioner.js +16 -54
  477. package/.agents/scripts/lib/worktree/git-hooks.js +15 -60
  478. package/.agents/scripts/lib/worktree/lifecycle/force-drain.js +20 -60
  479. package/.agents/scripts/lib/worktree/lifecycle/merge-reachability.js +10 -62
  480. package/.agents/scripts/lib/worktree/lifecycle/pending-cleanup.js +22 -86
  481. package/.agents/scripts/lib/worktree/lifecycle/reap.js +24 -126
  482. package/.agents/scripts/lib/worktree/lifecycle-manager.js +2 -20
  483. package/.agents/scripts/lib/worktree/node-modules-strategy.js +46 -180
  484. package/.agents/scripts/lib/worktree-manager.js +15 -40
  485. package/.agents/scripts/lint-issue-body.js +12 -68
  486. package/.agents/scripts/mandrel-update-preflight.js +10 -70
  487. package/.agents/scripts/merge-baseline.js +30 -104
  488. package/.agents/scripts/nav-registry-diff.js +22 -108
  489. package/.agents/scripts/notify.js +12 -69
  490. package/.agents/scripts/plan-context.js +27 -111
  491. package/.agents/scripts/plan-critics.js +12 -66
  492. package/.agents/scripts/plan-persist.js +31 -148
  493. package/.agents/scripts/plan-run-epilogue.js +11 -37
  494. package/.agents/scripts/pr-watch-with-update.js +76 -267
  495. package/.agents/scripts/providers/github/auth.js +3 -8
  496. package/.agents/scripts/providers/github/blocked-by-add.js +14 -61
  497. package/.agents/scripts/providers/github/board-add.js +5 -21
  498. package/.agents/scripts/providers/github/branch-protection.js +11 -43
  499. package/.agents/scripts/providers/github/cache.js +2 -14
  500. package/.agents/scripts/providers/github/comments.js +7 -40
  501. package/.agents/scripts/providers/github/compose.js +3 -19
  502. package/.agents/scripts/providers/github/errors.js +22 -125
  503. package/.agents/scripts/providers/github/issues.js +31 -123
  504. package/.agents/scripts/providers/github/labels.js +24 -124
  505. package/.agents/scripts/providers/github/mappers.js +5 -27
  506. package/.agents/scripts/providers/github/merge-methods.js +3 -22
  507. package/.agents/scripts/providers/github/project-board.js +2 -17
  508. package/.agents/scripts/providers/github/projects-v2-graphql.js +3 -6
  509. package/.agents/scripts/providers/github/request-helpers.js +5 -32
  510. package/.agents/scripts/providers/github/search-budget.js +9 -39
  511. package/.agents/scripts/providers/github/search-query.js +5 -26
  512. package/.agents/scripts/providers/github/sub-issue-add.js +15 -65
  513. package/.agents/scripts/providers/github/sub-issues.js +7 -36
  514. package/.agents/scripts/providers/github/tickets.js +32 -134
  515. package/.agents/scripts/providers/github.js +18 -59
  516. package/.agents/scripts/prune-plan-run-labels.js +12 -46
  517. package/.agents/scripts/quality-preview.js +35 -220
  518. package/.agents/scripts/resolve-doc-tiers.js +3 -26
  519. package/.agents/scripts/resolve-stories.js +16 -67
  520. package/.agents/scripts/resync-status-column.js +6 -25
  521. package/.agents/scripts/run-tests.js +29 -104
  522. package/.agents/scripts/single-story-close.js +23 -135
  523. package/.agents/scripts/single-story-confirm-merge.js +32 -139
  524. package/.agents/scripts/single-story-init.js +47 -209
  525. package/.agents/scripts/stories-wave-tick.js +102 -472
  526. package/.agents/scripts/sync-agentrc.js +3 -21
  527. package/.agents/scripts/sync-claude-agents.js +9 -55
  528. package/.agents/scripts/sync-claude-commands.js +20 -110
  529. package/.agents/scripts/test-wrapper.js +6 -43
  530. package/.agents/scripts/update-coverage-baseline.js +5 -22
  531. package/.agents/scripts/update-crap-baseline.js +7 -30
  532. package/.agents/scripts/update-duplication-baseline.js +16 -92
  533. package/.agents/scripts/update-maintainability-baseline.js +8 -62
  534. package/.agents/scripts/update-ticket-state.js +1 -7
  535. package/.agents/scripts/validate-skills.js +6 -26
  536. package/.agents/templates/agent-protocol.md +2 -2
  537. package/.agents/templates/docs/audit-sweep-runbook.md +3 -4
  538. package/.agents/workflows/audit-accessibility.md +4 -7
  539. package/.agents/workflows/audit-adrs.md +3 -6
  540. package/.agents/workflows/audit-architecture.md +3 -11
  541. package/.agents/workflows/audit-baselines.md +6 -9
  542. package/.agents/workflows/audit-clean-code.md +8 -12
  543. package/.agents/workflows/audit-data-model.md +3 -7
  544. package/.agents/workflows/audit-dependencies.md +4 -7
  545. package/.agents/workflows/audit-devops.md +4 -8
  546. package/.agents/workflows/audit-documentation.md +1 -4
  547. package/.agents/workflows/audit-mobile.md +4 -7
  548. package/.agents/workflows/audit-navigability.md +3 -6
  549. package/.agents/workflows/audit-performance.md +2 -4
  550. package/.agents/workflows/audit-privacy.md +4 -7
  551. package/.agents/workflows/audit-quality.md +4 -7
  552. package/.agents/workflows/audit-security.md +4 -7
  553. package/.agents/workflows/audit-seo.md +4 -7
  554. package/.agents/workflows/audit-sre.md +4 -7
  555. package/.agents/workflows/audit-to-stories.md +17 -30
  556. package/.agents/workflows/audit-ux-ui.md +4 -7
  557. package/.agents/workflows/helpers/audit-lens-core.md +1 -1
  558. package/.agents/workflows/helpers/code-quality-guardrails.md +12 -15
  559. package/.agents/workflows/helpers/deliver-digest.md +6 -4
  560. package/.agents/workflows/helpers/deliver-reference.md +114 -188
  561. package/.agents/workflows/helpers/deliver-story-reference.md +189 -533
  562. package/.agents/workflows/helpers/plan-reference.md +86 -139
  563. package/.agents/workflows/helpers/qa-core.md +12 -0
  564. package/.agents/workflows/memory-consolidate.md +1 -1
  565. package/.agents/workflows/qa-assist.md +27 -71
  566. package/.agents/workflows/qa-explore.md +19 -59
  567. package/.agents/workflows/qa-run.md +11 -33
  568. package/README.md +1 -1
  569. package/bin/mandrel.js +5 -46
  570. package/bin/postinstall.js +18 -107
  571. package/docs/CHANGELOG.md +25 -0
  572. package/lib/cli/doctor.js +11 -71
  573. package/lib/cli/init.js +26 -165
  574. package/lib/cli/migrate.js +5 -64
  575. package/lib/cli/registry.js +84 -467
  576. package/lib/cli/sync-agents.js +4 -64
  577. package/lib/cli/sync-commands.js +11 -64
  578. package/lib/cli/sync.js +34 -213
  579. package/lib/cli/uninstall.js +40 -219
  580. package/lib/cli/update.js +105 -661
  581. package/lib/cli/version-check.js +8 -72
  582. package/lib/cli/version-helpers.js +14 -87
  583. package/lib/migrations/helpers/retire-agentrc-key.js +11 -52
  584. package/lib/migrations/index.js +15 -92
  585. package/lib/migrations/steps/2.1.0-retire-mi-drop-knobs.js +2 -15
  586. package/lib/migrations/steps/2.1.0-retire-verify-concurrency-cap.js +1 -13
  587. package/lib/migrations/steps/2.11.0-retire-max-seed-words.js +2 -15
  588. package/lib/migrations/steps/2.2.0-retire-epic-ac-tags.js +9 -38
  589. package/lib/migrations/steps/2.20.0-retire-codebase-snapshot.js +1 -13
  590. package/lib/migrations/steps/2.32.0-retire-lint-baseline-command.js +2 -27
  591. package/lib/migrations/steps/2.57.0-retire-delivery-limit-knobs.js +2 -23
  592. package/lib/migrations/steps/2.57.0-retire-planning-limit-knobs.js +2 -27
  593. package/lib/migrations/steps/2.60.0-retire-audit-results-autofile.js +2 -21
  594. package/lib/migrations/steps/strip-removed-agentrc-keys.js +333 -0
  595. package/package.json +16 -14
  596. package/.agents/docs/SDLC.md +0 -590
  597. package/.agents/docs/quality-gates.md +0 -1183
  598. package/.agents/rules/known-tooling-behavior.md +0 -200
  599. package/.agents/rules/orchestration-error-handling.md +0 -61
  600. package/.agents/rules/test-seams.md +0 -59
  601. package/.agents/schemas/baselines/lighthouse.schema.json +0 -59
  602. package/.agents/schemas/baselines/lint.schema.json +0 -47
  603. package/.agents/scripts/check-action-pinning.js +0 -260
  604. package/.agents/scripts/check-audit-attribution.js +0 -302
  605. package/.agents/scripts/check-baseline-drift.js +0 -211
  606. package/.agents/scripts/check-baseline-scope.js +0 -362
  607. package/.agents/scripts/check-generated-validator.js +0 -202
  608. package/.agents/scripts/check-knip-entries.js +0 -159
  609. package/.agents/scripts/check-lifecycle-lint.js +0 -294
  610. package/.agents/scripts/check-pinned-override-notes.js +0 -102
  611. package/.agents/scripts/check-schema-references.js +0 -368
  612. package/.agents/scripts/check-test-portability.js +0 -512
  613. package/.agents/scripts/check-workflow-citations.js +0 -218
  614. package/.agents/scripts/check-workflow-cli-lint.js +0 -299
  615. package/.agents/scripts/check-workflow-timeouts.js +0 -291
  616. package/.agents/scripts/install-matrix-assert.js +0 -326
  617. package/.agents/scripts/lib/audit-advisories.js +0 -195
  618. package/.agents/scripts/lib/audit-attribution.js +0 -134
  619. package/.agents/scripts/lib/baselines/drift-detector.js +0 -351
  620. package/.agents/scripts/lib/baselines/kinds/lighthouse.js +0 -87
  621. package/.agents/scripts/lib/baselines/kinds/lint.js +0 -184
  622. package/.agents/scripts/lib/baselines/orphan-pruner.js +0 -233
  623. package/.agents/scripts/lib/baselines/scope-assert.js +0 -223
  624. package/.agents/scripts/lib/baselines/scope-inventory.js +0 -314
  625. package/.agents/scripts/lib/c8-cli-path.js +0 -21
  626. package/.agents/scripts/lib/config/gates/lighthouse.schema.js +0 -51
  627. package/.agents/scripts/lib/config/gates/lint.schema.js +0 -18
  628. package/.agents/scripts/lib/dynamic-workflow/architecture-report-contract.js +0 -70
  629. package/.agents/scripts/lib/dynamic-workflow/audit-orchestrator.js +0 -284
  630. package/.agents/scripts/lib/dynamic-workflow/clean-code-report-contract.js +0 -80
  631. package/.agents/scripts/lib/dynamic-workflow/degraded-coverage.js +0 -81
  632. package/.agents/scripts/lib/dynamic-workflow/documentation-report-contract.js +0 -87
  633. package/.agents/scripts/lib/dynamic-workflow/performance-report-contract.js +0 -74
  634. package/.agents/scripts/lib/dynamic-workflow/quality-report-contract.js +0 -90
  635. package/.agents/scripts/lib/dynamic-workflow/report-contract-core.js +0 -43
  636. package/.agents/scripts/lib/dynamic-workflow/security-report-contract.js +0 -83
  637. package/.agents/scripts/lib/fs-walk.js +0 -52
  638. package/.agents/scripts/lib/knip-config-resolver.js +0 -181
  639. package/.agents/scripts/lib/knip-entry-sync.js +0 -452
  640. package/.agents/scripts/lib/pinned-override-notes.js +0 -88
  641. package/.agents/scripts/lib/pinned-override-resolve.js +0 -212
  642. package/.agents/scripts/lib/test-isolate/cli-options.js +0 -93
  643. package/.agents/scripts/lib/test-isolate/env-snapshot-loader.js +0 -52
  644. package/.agents/scripts/lib/test-isolate/list-files.js +0 -90
  645. package/.agents/scripts/lib/test-isolate/parse-tap.js +0 -75
  646. package/.agents/scripts/lib/test-isolate/progress-log.js +0 -45
  647. package/.agents/scripts/lib/test-isolate/render-report.js +0 -97
  648. package/.agents/scripts/lib/test-isolate/run-isolate.js +0 -87
  649. package/.agents/scripts/lib/test-isolate/runner.js +0 -483
  650. package/.agents/scripts/lib/test-profile/parse-tap.js +0 -136
  651. package/.agents/scripts/lib/test-profile/render-report.js +0 -45
  652. package/.agents/scripts/lint-label-vocabulary.js +0 -214
  653. package/.agents/scripts/post-structured-comment.js +0 -127
  654. package/.agents/scripts/provision-git-hooks.js +0 -85
  655. package/.agents/scripts/prune-baseline-orphans.js +0 -181
  656. package/.agents/scripts/run-coverage.js +0 -197
  657. package/.agents/scripts/run-lint.js +0 -133
  658. package/.agents/scripts/run-test-profile.js +0 -129
  659. package/.agents/scripts/run-verify.js +0 -125
  660. package/.agents/scripts/test-isolate.js +0 -55
  661. package/.agents/scripts/update-dead-exports-baseline.js +0 -321
@@ -1,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,22 +177,11 @@ 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 emitted as a
260
- * **bare path string** — the default authored form since Story #5342. The
261
- * template used to pre-resolve each one to a creates-vs-refactors assumption
262
- * against the repo snapshot; persist re-derives it against the base-branch
263
- * ref, which is the authoritative probe, so the skeleton no longer carries a
264
- * second answer for the author to keep in sync. Order follows
265
- * `predictedPaths` (first appearance in the seed). Falls back to the
266
- * 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.
267
185
  *
268
186
  * @param {{ predictedPaths?: string[] }|null|undefined} complexitySignals
269
187
  * @returns {string[]}
@@ -278,31 +196,10 @@ function buildTemplateChanges(complexitySignals) {
278
196
  }
279
197
 
280
198
  /**
281
- * Render the ready-to-fill `stories.json` authoring template (Story #4707).
282
- *
283
- * One-shot authoring: the planner copies this file to `stories.json`, fills
284
- * the placeholder values, and runs persist — no step requires reading
285
- * `story-body.js` source or re-poking the envelope for format discovery
286
- * (bench: ~7 of 17 plan turns were format discovery). The template uses the
287
- * **structured-object body** shape, which persist parses and serializes to
288
- * the canonical markdown itself (`parse` accepts an object;
289
- * `assembleOnePlanStory` re-serializes canonically), so the serializer
290
- * contract never has to be reverse-engineered by the author. `acceptance[]`
291
- * / `verify[]` live at the ticket's top level — the machine contract persist
292
- * syncs into the body.
293
- *
294
- * Correct-by-construction skeleton (Story #4723): when the envelope's
295
- * `complexitySignals` predicted a footprint the `changes[]` entries arrive
296
- * already filled in, as the bare paths Story #5342 made the default form —
297
- * a faithfully-filled skeleton passes the persist ticket validators without a
298
- * mechanical round-trip. Persist derives each assumption by probing the base
299
- * branch ref and reports the derivation.
199
+ * Ready-to-fill `stories.json` template. Uses the structured-object body
200
+ * persist serializes itself, so authors never reverse-engineer the markdown.
300
201
  *
301
- * Pure and deterministic; the output is valid JSON (parseable as-is), with
302
- * instructive placeholder values rather than comments.
303
- *
304
- * @param {{ complexitySignals?: object|null }} [opts] Envelope signals to
305
- * pre-resolve the skeleton against; omit for the bare placeholder shape.
202
+ * @param {{ complexitySignals?: object|null }} [opts]
306
203
  * @returns {string} Pretty-printed JSON template content.
307
204
  */
308
205
  export function renderStoriesTemplate({ complexitySignals = null } = {}) {
@@ -313,12 +210,8 @@ export function renderStoriesTemplate({ complexitySignals = null } = {}) {
313
210
  title: 'Fill: short descriptive title',
314
211
  body: {
315
212
  goal: 'Fill: one sentence stating why this Story exists.',
316
- // A filled, multi-checkpoint example rather than a placeholder
317
- // (Story #5332): `## Slicing` is how one cohesive sweep stays one
318
- // Story, so the skeleton has to show an author what a checkpoint
319
- // list looks like. Each line is a stage of the work — a commit
320
- // boundary inside one session — never a restatement of an
321
- // 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.
322
215
  slicing:
323
216
  '1. Re-anchor the shared constant and its consumers.\n' +
324
217
  '2. Move the gate ahead of the first write and arm the refusal.\n' +
@@ -347,9 +240,7 @@ export function renderStoriesTemplate({ complexitySignals = null } = {}) {
347
240
  }
348
241
 
349
242
  /**
350
- * Count top-level enumerated items (`- `, `* `, `1. `) anywhere in a
351
- * free-form seed text. Unlike {@link countScopeItems} this does not require
352
- * a scope-shaped heading — a raw `--seed` text rarely has one.
243
+ * Count enumerated lines (`- `, `* `, `1. `) anywhere — no heading required.
353
244
  *
354
245
  * @param {string} text
355
246
  * @returns {number}
@@ -361,24 +252,13 @@ function countEnumeratedItems(text) {
361
252
  .filter((line) => /^\s*(?:[-*]|\d+\.)\s+\S/.test(line)).length;
362
253
  }
363
254
 
364
- /**
365
- * Delta-shaped change-request verbs — a change request naming one of these
366
- * stays a Story by default when the footprint stays inside Story width.
367
- */
255
+ /** Change-request verbs: such a seed stays a Story within Story width. */
368
256
  const DELTA_VERB_RE =
369
257
  /\b(fix(?:es)?|tweak(?:s)?|extend(?:s)?|update(?:s)?|adjust(?:s)?|rename(?:s)?|correct(?:s)?|patch(?:es)?|bug|regression|flaky)\b/i;
370
258
 
371
259
  /**
372
- * Deterministic, CLI-applied scope signal over a raw `--seed` text
373
- * (#4496 fix 6). Embedding it in the `--seed` envelope keeps the headless
374
- * path from needing a judgment pass of its own.
375
- *
376
- * The heuristics anchor to the granularity SSOT —
377
- * `DELIVERABLE_GRANULARITY_GUIDANCE` in `ticket-validator-sizing.js` (one
378
- * Story = one coherent capability slice; multiple independent capabilities =
379
- * an Epic) — and to the change-request delta rubric above. The verdict is
380
- * **advisory**: being wrong in the `epic` direction is cheap, and
381
- * `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.
382
262
  *
383
263
  * @param {{ seedText?: string }} args
384
264
  * @returns {{ verdict: 'epic'|'story'|'borderline', reasons: string[], advisory: true, appliedBy: 'cli' }}
@@ -440,27 +320,17 @@ export function buildScopeTriageSignal({ seedText = '' } = {}) {
440
320
  };
441
321
  }
442
322
 
443
- /**
444
- * The `audit-rules.json` lens `target` value marking a lens applicable only to
445
- * a project with a rendered frontend.
446
- */
447
323
  const WEB_LENS_TARGET = 'web';
448
324
 
449
325
  /**
450
- * How many matched UI paths the `uiSurface` signal carries. The signal rides the
451
- * `--out` stdout digest, which has a ~2KB contract, and a seed can predict up to
452
- * `MAX_PREDICTED_PATHS` paths — enumerating all of them would let one UI-heavy
453
- * seed blow that budget. The full count travels beside the sample as
454
- * `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.
455
328
  */
456
329
  const UI_MATCHED_PATH_SAMPLE = 5;
457
330
 
458
331
  /**
459
- * Union of the `triggers.filePatterns` globs every `target: "web"` lens
460
- * registers in `audit-rules.json` — the framework's shipped declaration of
461
- * "this path is part of a rendered UI surface". Read from the manifest rather
462
- * than re-listed here: a second copy of the glob set would be a second thing to
463
- * 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.
464
334
  *
465
335
  * @param {{ audits?: Record<string, object> }} rules
466
336
  * @returns {string[]} Deduplicated globs, in manifest order.
@@ -477,12 +347,8 @@ function resolveWebFilePatterns(rules) {
477
347
  }
478
348
 
479
349
  /**
480
- * Which predicted paths sit on a UI surface, per the web lens globs.
481
- *
482
- * An unreadable manifest is **indeterminate**, not "no match": the signal fails
483
- * OPEN in the same direction {@link hasWebSurface} does, because a spurious
484
- * mention of an operator-invoked command costs nothing while a missed one costs
485
- * 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.
486
352
  *
487
353
  * @param {string[]} predictedPaths
488
354
  * @returns {{ matchedPaths: string[], indeterminate: boolean }}
@@ -503,9 +369,6 @@ function resolveWebFootprintMatch(predictedPaths) {
503
369
  }
504
370
 
505
371
  /**
506
- * The one sentence a `uiSurface` signal carries — why the offer fires, or why it
507
- * does not. Kept in one place so the fired and unfired shapes stay one object.
508
- *
509
372
  * @param {{
510
373
  * detected: boolean,
511
374
  * webSurface: boolean,
@@ -537,22 +400,8 @@ function uiSurfaceReason({
537
400
  }
538
401
 
539
402
  /**
540
- * Derive the advisory **UI-surface** signal from a seed's predicted footprint.
541
- *
542
- * Two observables, both already shipped, ANDed together:
543
- *
544
- * 1. the project is web-capable at all (`hasWebSurface` — the same
545
- * applicability predicate the `target: "web"` audit lenses gate on), and
546
- * 2. at least one predicted path matches a web lens `filePattern`.
547
- *
548
- * No new detection surface and no new `.agentrc.json` key: both halves are
549
- * derived from the consumer's own checkout, so a frontend-less project — this
550
- * repository included — resolves falsey and the offer never fires.
551
- *
552
- * The signal carries **no routing authority** (`automatic: false`): `/mandrel-plan`
553
- * may say that a plan touches UI and that `/prototype` exists, and must never
554
- * invoke it. Pure over its inputs and total — a malformed signal bag or an
555
- * 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.
556
405
  *
557
406
  * @param {{
558
407
  * complexitySignals?: object|null,
@@ -567,8 +416,7 @@ function uiSurfaceReason({
567
416
  * matchedPaths: string[],
568
417
  * matchedPathCount: number,
569
418
  * reasons: string[],
570
- * }} `matchedPaths` is a bounded sample
571
- * ({@link UI_MATCHED_PATH_SAMPLE}); `matchedPathCount` is the full total.
419
+ * }}
572
420
  */
573
421
  function buildUiSurfaceSignal({ complexitySignals, config, cwd } = {}) {
574
422
  const predictedPaths = Array.isArray(complexitySignals?.predictedPaths)
@@ -609,10 +457,8 @@ function buildUiSurfaceSignal({ complexitySignals, config, cwd } = {}) {
609
457
  }
610
458
 
611
459
  /**
612
- * Attach the advisory routing/offer signals to a complexity-signals bag as
613
- * **nested** fields (Story #4741). Nesting — rather than new top-level envelope
614
- * keys — keeps every existing per-mode envelope key set byte-stable: both are
615
- * 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.
616
462
  *
617
463
  * @param {object} complexitySignals
618
464
  * @param {{ config?: object, cwd?: string }} [context]
@@ -626,21 +472,8 @@ function withAdvisorySignals(complexitySignals, { config, cwd } = {}) {
626
472
  }
627
473
 
628
474
  /**
629
- * Render the authoring system prompts the collapsed pipeline's single
630
- * authoring pass consumes: the N=1 core from
631
- * `lib/templates/decomposer-prompts.js`, with the schedule rules and the
632
- * collision refusal a planner reads only when the default-single split policy
633
- * clears carried separately as `storySplitRules` (Story #5312).
634
- *
635
- * Story #5332 deleted the `spec` / `acceptance` fields with the module that
636
- * rendered them: nothing read either, and both contradicted the current
637
- * contract — one asserting Spec budgets that no longer exist, the other
638
- * demanding the verify tier suffixes tickets mode now strips.
639
- *
640
- * `storyTicketsRules` is the one mode-conditional field (Story #5323): it
641
- * only means anything when the seed is an existing ticket, and an envelope
642
- * that carries it in every mode teaches the author to look for a source
643
- * 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.
644
477
  *
645
478
  * @param {{ mode?: string }} [args]
646
479
  * @returns {{ story: string, storySplitRules: string, storyTicketsRules?: string }}
@@ -654,8 +487,7 @@ export function buildSystemPrompts({ mode } = {}) {
654
487
  }
655
488
 
656
489
  /**
657
- * Run the open-Story duplicate search. Failures degrade to [] — triage
658
- * signal, not a gate.
490
+ * Open-Story duplicate search; failures degrade to [] (triage, not a gate).
659
491
  *
660
492
  * @param {{
661
493
  * seed: string,
@@ -688,20 +520,9 @@ async function searchStoryDuplicates({
688
520
  }
689
521
 
690
522
  /**
691
- * Gather the independent envelope inputs — the open-Story duplicate search,
692
- * the folded authoring context, the inline docs digest, and (Story #5155) the
693
- * open-Epic and cross-plan-dependency candidate lists — under bounded
694
- * concurrency (Story #4952).
695
- *
696
- * None of them reads a value the others produce, so the result is a pure
697
- * function of `seed` and the injected config: the assembled envelope is
698
- * **byte-identical** to the serial build for the same inputs, whichever order
699
- * the three happen to settle in. `concurrentMap` preserves input order, so the
700
- * destructuring below is positional and stable.
701
- *
702
- * `docsContextFiles` is emptied for the `buildAuthoringContext` call: the
703
- * per-plan digest-file path needs a plan id that does not exist yet — the
704
- * 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.
705
526
  *
706
527
  * @param {{
707
528
  * seed: string,
@@ -749,10 +570,6 @@ async function gatherEnvelopeInputs({
749
570
  epic: { id: 0, title: epicTitle, body: seed },
750
571
  github: config.github ?? null,
751
572
  cwd,
752
- // Story #5182 — the memory-hygiene advisory's two thresholds.
753
- // They live on `planning`, not the `project` block `settings`
754
- // carries, so they ride the opts bag rather than that legacy one.
755
- memoryPool: config.planning?.memoryPool ?? null,
756
573
  },
757
574
  ),
758
575
  () =>
@@ -760,10 +577,6 @@ async function gatherEnvelopeInputs({
760
577
  docsContextFiles: settings?.docsContextFiles,
761
578
  docsRoot: paths.docsRoot,
762
579
  }),
763
- // Story #5155 — the two cross-plan lookups. Both are advisory triage
764
- // lists offered at Gate #3, independent of every other gather and of
765
- // each other, so they join the same bounded fan-out rather than adding
766
- // two more serial round-trips to the operator's wait.
767
580
  () =>
768
581
  findOpenEpicCandidates({
769
582
  seed,
@@ -781,10 +594,6 @@ async function gatherEnvelopeInputs({
781
594
  }),
782
595
  ],
783
596
  (gather) => gather(),
784
- // The per-mode envelope gathers (Story #4952): the duplicate search, the
785
- // authoring-context fold and the docs digest have no data dependency on
786
- // one another, so their serialization was incidental and `/mandrel-plan` paid it
787
- // with the operator waiting at Gate #1.
788
597
  { concurrency: FANOUT_CONCURRENCY },
789
598
  );
790
599
 
@@ -800,12 +609,7 @@ async function gatherEnvelopeInputs({
800
609
  };
801
610
  }
802
611
 
803
- /**
804
- * Build the seed-file (ideation) envelope. No parent ticket
805
- * exists yet — creation moves to the persist half — so the open-Story
806
- * dup search is the mode's gating input. `docsContext` is inline-digest:
807
- * there is no plan temp directory to anchor a digest file to yet.
808
- */
612
+ /** Seed-file envelope; also the base for seed mode. */
809
613
  async function buildSeedFileModeEnvelope({
810
614
  seedFilePath,
811
615
  seedFileContent,
@@ -823,18 +627,12 @@ async function buildSeedFileModeEnvelope({
823
627
  );
824
628
  }
825
629
 
826
- // Hoisted above the gather (Story #5155): the dependency-candidate lookup
827
- // intersects against `predictedPaths`, so the signals have to exist before
828
- // the fan-out starts. `buildComplexitySignals` is synchronous and reads
829
- // nothing the gather produces, so hoisting it changes cost, not output.
630
+ // Before the gather: dependency candidates intersect `predictedPaths`.
830
631
  const complexitySignals = withAdvisorySignals(
831
632
  buildComplexitySignals({ seedText: content, cwd }),
832
633
  { config, cwd },
833
634
  );
834
635
 
835
- // Dup search, the authoring-context fold grounded in the seed prose, the
836
- // inline docs digest and the two cross-plan candidate lists are independent
837
- // — gathered concurrently (Story #4952, Story #5155).
838
636
  const {
839
637
  duplicates,
840
638
  authoring,
@@ -854,9 +652,7 @@ async function buildSeedFileModeEnvelope({
854
652
  return {
855
653
  mode: modeLabel,
856
654
  seed: { path: seedFilePath ?? null, content },
857
- // Advisory complexity signals only: no route, no routing authority. The
858
- // nested `uiSurface` is the advisory /prototype offer — never an
859
- // automatic reroute.
655
+ // Advisory only — no routing authority.
860
656
  complexitySignals,
861
657
  duplicates,
862
658
  epicCandidates,
@@ -869,16 +665,11 @@ async function buildSeedFileModeEnvelope({
869
665
  ticketSchema: TICKET_SCHEMA_DESCRIPTOR,
870
666
  systemPrompts: buildSystemPrompts(),
871
667
  planState: null,
872
- // N=1 default: author one Story; skip Epic-scale decompose ceremony.
873
668
  planProfile: 'story-default',
874
669
  };
875
670
  }
876
671
 
877
- /**
878
- * Build the seed-mode (chat text) envelope. The seed-file does not exist
879
- * yet: the dup search and the authoring-context fold both run off the raw
880
- * seed text (N=1 default — no Epic-scale decompose).
881
- */
672
+ /** Seed-mode (chat text) envelope. */
882
673
  async function buildSeedModeEnvelope({
883
674
  seedText,
884
675
  provider,
@@ -909,9 +700,6 @@ async function buildSeedModeEnvelope({
909
700
  }
910
701
 
911
702
  /**
912
- * Fetch source tickets for `--tickets` mode.
913
- * Hydrates ids concurrently (bounded) while preserving input order.
914
- *
915
703
  * @param {number[]} ticketIds
916
704
  * @param {object} provider
917
705
  * @returns {Promise<Array<{ id:number, title:string, body:string, labels:string[], url?:string }>>}
@@ -942,16 +730,11 @@ async function fetchSourceTickets(ticketIds, provider) {
942
730
  state: ticket.state ?? undefined,
943
731
  };
944
732
  },
945
- // `--tickets` source-ticket hydration: one independent read per id.
946
733
  { concurrency: FANOUT_CONCURRENCY },
947
734
  );
948
735
  }
949
736
 
950
- /**
951
- * Build the tickets-mode envelope — analyze existing issue(s) into proper
952
- * Stories. Dup search excludes the source ids so a ticket is not reported
953
- * as a duplicate of itself.
954
- */
737
+ /** Dup search excludes the source ids: a ticket is not its own duplicate. */
955
738
  async function buildTicketsModeEnvelope({
956
739
  ticketIds,
957
740
  provider,
@@ -969,15 +752,11 @@ async function buildTicketsModeEnvelope({
969
752
  .map((t) => `# ${t.title}\n\n${t.body}`)
970
753
  .join('\n\n---\n\n');
971
754
 
972
- // Hoisted for the same reason as seed-file mode (Story #5155).
973
755
  const complexitySignals = withAdvisorySignals(
974
756
  buildComplexitySignals({ seedText: seed, cwd }),
975
757
  { config, cwd },
976
758
  );
977
759
 
978
- // Same independent gathers as seed-file mode, concurrent under the same
979
- // bound (Story #4952); only the source-ticket hydration above is a genuine
980
- // data dependency, because `seed` is derived from it.
981
760
  const {
982
761
  duplicates,
983
762
  authoring,
@@ -1022,9 +801,8 @@ async function buildTicketsModeEnvelope({
1022
801
  }
1023
802
 
1024
803
  /**
1025
- * Parse a prior Story body into its acceptance criteria and delivered file
1026
- * map. Total: an unparseable body degrades to empty lists (a delta envelope
1027
- * 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.
1028
806
  *
1029
807
  * @param {string} priorBody
1030
808
  * @returns {{ priorAcceptance: string[], deliveredFiles: string[] }}
@@ -1048,20 +826,8 @@ function extractPriorArtifacts(priorBody) {
1048
826
  }
1049
827
 
1050
828
  /**
1051
- * Build the amendment (delta) envelope — `plan-context --amends #<id>`
1052
- * (Story #4741 AC-4, R3-A). The heavy-amendment counterpart to routing a
1053
- * light amendment through the light path: instead of re-interrogating the
1054
- * repo from scratch (`buildAuthoringContext`'s codebase snapshot and the BDD /
1055
- * memory / feedback probes), the envelope composes a DELTA from what already
1056
- * exists — the prior Story's body, its acceptance criteria (the real
1057
- * contract), and its delivered file map — so a follow-up change plans from the
1058
- * shape already shipped.
1059
- *
1060
- * The semantic steps that reach the ticket are preserved: the open-Story
1061
- * duplicate search (excluding the amended Story itself) and the authoring
1062
- * system prompts still ride the envelope. What is
1063
- * dropped is only the from-scratch repo interrogation the prior artifacts
1064
- * 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.
1065
831
  *
1066
832
  * @param {{
1067
833
  * amendsId: number,
@@ -1093,12 +859,7 @@ async function buildAmendmentModeEnvelope({
1093
859
  const priorBody = typeof prior.body === 'string' ? prior.body : '';
1094
860
  const { priorAcceptance, deliveredFiles } = extractPriorArtifacts(priorBody);
1095
861
 
1096
- // Story #4952 — this builder's independent-gather set has exactly one
1097
- // member. `provider.getTicket` above is a hard data dependency (the prior
1098
- // body IS the seed), and the mode deliberately carries no authoring-context
1099
- // fold and no docs digest — the prior artifacts are the grounding. It still
1100
- // goes through the same bounded gather as the other two builders so one file
1101
- // does not carry two ways of gathering independent envelope inputs.
862
+ // A one-member gather, kept on the same path as the other builders.
1102
863
  const [duplicates] = await concurrentMap(
1103
864
  [
1104
865
  () =>
@@ -1110,7 +871,6 @@ async function buildAmendmentModeEnvelope({
1110
871
  }),
1111
872
  ],
1112
873
  (gather) => gather(),
1113
- // Same independent-gather fan-out as the seed-mode envelope above.
1114
874
  { concurrency: FANOUT_CONCURRENCY },
1115
875
  );
1116
876
 
@@ -1123,15 +883,12 @@ async function buildAmendmentModeEnvelope({
1123
883
  priorAcceptance,
1124
884
  deliveredFiles,
1125
885
  },
1126
- // The prior body is the seed the delta is authored against.
1127
886
  seed: { text: priorBody, path: null },
1128
887
  complexitySignals: withAdvisorySignals(
1129
888
  buildComplexitySignals({ seedText: priorBody, cwd }),
1130
889
  { config, cwd },
1131
890
  ),
1132
891
  duplicates,
1133
- // No plan temp dir and no from-scratch repo interrogation — the prior
1134
- // artifacts are the grounding, so there is no docs digest to anchor.
1135
892
  docsContext: null,
1136
893
  ticketSchema: TICKET_SCHEMA_DESCRIPTOR,
1137
894
  systemPrompts: buildSystemPrompts(),
@@ -1141,11 +898,7 @@ async function buildAmendmentModeEnvelope({
1141
898
  }
1142
899
 
1143
900
  /**
1144
- * Build the single planner-context envelope.
1145
- *
1146
- * Every mode returns through here, which makes this the one place the
1147
- * envelope's total size is decided — and therefore the only honest place to
1148
- * bound it (see {@link capPlanContextEnvelope}).
901
+ * Build the planner-context envelope — the one place every mode is capped.
1149
902
  *
1150
903
  * @param {{
1151
904
  * mode: 'seed-file'|'seed'|'tickets'|'amends',
@@ -1189,10 +942,6 @@ export async function buildPlanContext({
1189
942
  );
1190
943
  }
1191
944
 
1192
- /**
1193
- * Mode dispatch for {@link buildPlanContext}. Split out so the ceiling cap
1194
- * wraps every mode exactly once.
1195
- */
1196
945
  async function buildPlanContextEnvelope({
1197
946
  mode,
1198
947
  seedFilePath,