mandrel 1.93.0 → 2.0.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 (463) hide show
  1. package/.agents/README.md +59 -73
  2. package/.agents/agents/acceptance-critic.md +129 -0
  3. package/.agents/agents/story-worker.md +161 -0
  4. package/.agents/docs/SDLC.md +489 -1285
  5. package/.agents/docs/agentrc-reference.json +177 -67
  6. package/.agents/docs/configuration.md +108 -136
  7. package/.agents/docs/execution-reference.md +44 -22
  8. package/.agents/docs/quality-gates.md +13 -19
  9. package/.agents/docs/workflows.md +3 -3
  10. package/.agents/instructions.md +107 -108
  11. package/.agents/rules/ci-remediation.md +8 -12
  12. package/.agents/rules/git-conventions-reference.md +224 -0
  13. package/.agents/rules/git-conventions.md +42 -223
  14. package/.agents/rules/security-baseline.md +5 -0
  15. package/.agents/rules/testing-standards.md +106 -13
  16. package/.agents/schemas/acceptance-eval-verdict.schema.json +1 -1
  17. package/.agents/schemas/agentrc.schema.json +71 -201
  18. package/.agents/schemas/lifecycle/ledger-record.schema.json +1 -1
  19. package/.agents/schemas/lifecycle/retro.end.schema.json +1 -1
  20. package/.agents/schemas/risk-verdict.schema.json +0 -13
  21. package/.agents/scripts/acceptance-eval.js +62 -18
  22. package/.agents/scripts/agents-bootstrap-github.js +1 -1
  23. package/.agents/scripts/analyze-execution.js +1 -1
  24. package/.agents/scripts/audit-to-stories.js +7 -7
  25. package/.agents/scripts/boot-sweep.js +1 -1
  26. package/.agents/scripts/check-context-budget.js +62 -5
  27. package/.agents/scripts/check-lifecycle-lint.js +6 -9
  28. package/.agents/scripts/check-prepush-recovery.js +1 -1
  29. package/.agents/scripts/cleanup-repo-test-temp.js +6 -1
  30. package/.agents/scripts/diagnose-friction.js +0 -6
  31. package/.agents/scripts/lib/Logger.js +6 -10
  32. package/.agents/scripts/lib/audit-suite/runner.js +2 -2
  33. package/.agents/scripts/lib/audit-suite/selector.js +5 -5
  34. package/.agents/scripts/lib/audit-to-stories/{seed-epic-from-findings.js → seed-from-findings.js} +9 -9
  35. package/.agents/scripts/lib/baselines/kernel.js +206 -18
  36. package/.agents/scripts/lib/baselines/kinds/maintainability.js +0 -4
  37. package/.agents/scripts/lib/baselines/reader.js +1 -6
  38. package/.agents/scripts/lib/bdd-runner-detect.js +5 -9
  39. package/.agents/scripts/lib/bootstrap/issue-forms-template.js +32 -33
  40. package/.agents/scripts/lib/bootstrap/project-bootstrap.js +56 -18
  41. package/.agents/scripts/lib/checks/core-bare-clean.js +2 -2
  42. package/.agents/scripts/lib/checks/index.js +2 -1
  43. package/.agents/scripts/lib/checks/story-init-not-backgrounded.js +23 -21
  44. package/.agents/scripts/lib/cli/standard-args.js +13 -22
  45. package/.agents/scripts/lib/cli-args.js +16 -7
  46. package/.agents/scripts/lib/close-validation/gates.js +160 -22
  47. package/.agents/scripts/lib/config/acceptance-eval.js +52 -5
  48. package/.agents/scripts/lib/config/ci.js +6 -31
  49. package/.agents/scripts/lib/config/delivery-routing.js +103 -0
  50. package/.agents/scripts/lib/config/explain.js +57 -36
  51. package/.agents/scripts/lib/config/limits.js +17 -58
  52. package/.agents/scripts/lib/config/paths.js +0 -2
  53. package/.agents/scripts/lib/config/quality.js +1 -1
  54. package/.agents/scripts/lib/config/runners.js +17 -50
  55. package/.agents/scripts/lib/config/temp-paths.js +19 -14
  56. package/.agents/scripts/lib/config/worktree-isolation.js +0 -5
  57. package/.agents/scripts/lib/config-resolver.js +3 -8
  58. package/.agents/scripts/lib/config-settings-schema-delivery.js +46 -136
  59. package/.agents/scripts/lib/config-settings-schema-quality.js +17 -14
  60. package/.agents/scripts/lib/config-settings-schema.js +52 -38
  61. package/.agents/scripts/lib/dependency-parser.js +3 -2
  62. package/.agents/scripts/lib/doc-tiers.js +39 -4
  63. package/.agents/scripts/lib/duplicate-search.js +211 -41
  64. package/.agents/scripts/lib/feedback-loop/retro-proposals-graduator.js +1 -1
  65. package/.agents/scripts/lib/findings/promote-finding.js +5 -5
  66. package/.agents/scripts/lib/framework-version.js +2 -3
  67. package/.agents/scripts/lib/git-branch-cleanup.js +1 -10
  68. package/.agents/scripts/lib/git-branch-lifecycle.js +17 -22
  69. package/.agents/scripts/lib/git-utils.js +32 -6
  70. package/.agents/scripts/lib/github/framework-repo.js +6 -0
  71. package/.agents/scripts/lib/label-constants.js +10 -23
  72. package/.agents/scripts/lib/label-taxonomy.js +9 -43
  73. package/.agents/scripts/lib/observability/active-story-env.js +112 -3
  74. package/.agents/scripts/lib/observability/hook-heartbeat.js +187 -0
  75. package/.agents/scripts/lib/observability/source-classifier.js +3 -3
  76. package/.agents/scripts/lib/observability/tool-trace-hook.js +15 -4
  77. package/.agents/scripts/lib/onboard/init-tail.js +1 -3
  78. package/.agents/scripts/lib/orchestration/acceptance-clusters.js +111 -0
  79. package/.agents/scripts/lib/orchestration/acceptance-eval-decision.js +32 -4
  80. package/.agents/scripts/lib/orchestration/audit-lens-routing.js +128 -0
  81. package/.agents/scripts/lib/orchestration/bookkeeping-outbox.js +273 -0
  82. package/.agents/scripts/lib/orchestration/ceremony-routing.js +204 -0
  83. package/.agents/scripts/lib/orchestration/code-review.js +20 -268
  84. package/.agents/scripts/lib/orchestration/column-sync.js +1 -1
  85. package/.agents/scripts/lib/orchestration/consolidation-precondition.js +1 -1
  86. package/.agents/scripts/lib/orchestration/context-envelope.js +2 -5
  87. package/.agents/scripts/lib/orchestration/docs-digest.js +8 -8
  88. package/.agents/scripts/lib/orchestration/file-assumptions.js +7 -13
  89. package/.agents/scripts/lib/orchestration/git-cleanup/phases/cli.js +1 -1
  90. package/.agents/scripts/lib/orchestration/lifecycle/emit-loop-tick.js +8 -8
  91. package/.agents/scripts/lib/orchestration/lifecycle/emit-story-heartbeat.js +2 -2
  92. package/.agents/scripts/lib/orchestration/lifecycle/ledger-writer.js +6 -3
  93. package/.agents/scripts/lib/orchestration/lifecycle/listeners/README.md +17 -43
  94. package/.agents/scripts/lib/orchestration/lint-baseline-service.js +4 -4
  95. package/.agents/scripts/lib/orchestration/merge-block-class.js +1 -1
  96. package/.agents/scripts/lib/orchestration/phase-runner.js +3 -2
  97. package/.agents/scripts/lib/orchestration/plan-context.js +248 -266
  98. package/.agents/scripts/lib/orchestration/plan-critic-conditions.js +3 -2
  99. package/.agents/scripts/lib/orchestration/plan-critics-evaluate.js +1 -1
  100. package/.agents/scripts/lib/orchestration/plan-navigation.js +92 -0
  101. package/.agents/scripts/lib/orchestration/plan-persist/fan-out-gate.js +61 -0
  102. package/.agents/scripts/lib/orchestration/plan-persist/persist-helpers.js +97 -0
  103. package/.agents/scripts/lib/orchestration/plan-persist/run-plan-persist.js +223 -854
  104. package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +361 -0
  105. package/.agents/scripts/lib/orchestration/plan-persist/summary.js +35 -108
  106. package/.agents/scripts/lib/orchestration/plan-reachability.js +9 -14
  107. package/.agents/scripts/lib/orchestration/plan-runner/worktree-sweep.js +1 -1
  108. package/.agents/scripts/lib/orchestration/{epic-plan-spec/phases → planning}/authoring-context.js +14 -14
  109. package/.agents/scripts/lib/orchestration/planning/decomposer-context.js +27 -0
  110. package/.agents/scripts/lib/orchestration/{epic-plan-spec/phases → planning}/risk-verdict.js +3 -4
  111. package/.agents/scripts/lib/orchestration/post-merge/phases/branch-cleanup.js +2 -2
  112. package/.agents/scripts/lib/orchestration/post-merge/phases/dashboard-refresh.js +8 -20
  113. package/.agents/scripts/lib/orchestration/post-merge/phases/worktree-reap.js +3 -2
  114. package/.agents/scripts/lib/orchestration/pr-base-guard.js +18 -28
  115. package/.agents/scripts/lib/orchestration/preflight-cache.js +5 -5
  116. package/.agents/scripts/lib/orchestration/remote-verifier.js +1 -1
  117. package/.agents/scripts/lib/orchestration/resolve-plan-run.js +155 -0
  118. package/.agents/scripts/lib/orchestration/resolves-token.js +1 -1
  119. package/.agents/scripts/lib/orchestration/retro-perf-heuristics.js +8 -8
  120. package/.agents/scripts/lib/orchestration/retro-proposals.js +140 -79
  121. package/.agents/scripts/lib/orchestration/review-depth.js +26 -12
  122. package/.agents/scripts/lib/orchestration/review-providers/codex.js +2 -2
  123. package/.agents/scripts/lib/orchestration/review-providers/review-provider-factory.js +21 -56
  124. package/.agents/scripts/lib/orchestration/run-epilogue.js +426 -0
  125. package/.agents/scripts/lib/orchestration/single-story-close/phases/auto-merge.js +1 -1
  126. package/.agents/scripts/lib/orchestration/single-story-close/phases/close-validation.js +1 -0
  127. package/.agents/scripts/lib/orchestration/single-story-close/phases/code-review.js +95 -41
  128. package/.agents/scripts/lib/orchestration/single-story-close/phases/options.js +16 -13
  129. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-block.js +40 -0
  130. package/.agents/scripts/lib/orchestration/single-story-close/runner.js +11 -3
  131. package/.agents/scripts/lib/orchestration/spec-freshness.js +14 -205
  132. package/.agents/scripts/lib/orchestration/spec-section-validator.js +4 -5
  133. package/.agents/scripts/lib/orchestration/spec-spill.js +60 -0
  134. package/.agents/scripts/lib/orchestration/split-policy-validator.js +188 -0
  135. package/.agents/scripts/lib/orchestration/story-close/emit-blocked.js +49 -0
  136. package/.agents/scripts/lib/orchestration/story-close/phases/code-review.js +15 -12
  137. package/.agents/scripts/lib/orchestration/story-follow-ups.js +237 -0
  138. package/.agents/scripts/lib/orchestration/story-init-remote.js +47 -0
  139. package/.agents/scripts/lib/orchestration/story-plan-state.js +48 -0
  140. package/.agents/scripts/lib/orchestration/{epic-runner → story-progress}/story-run-progress-writer.js +3 -3
  141. package/.agents/scripts/lib/orchestration/structured-comment-parser.js +1 -1
  142. package/.agents/scripts/lib/orchestration/task-body-validator.js +8 -18
  143. package/.agents/scripts/lib/orchestration/ticket-validator-conflicts.js +11 -61
  144. package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +189 -373
  145. package/.agents/scripts/lib/orchestration/ticket-validator.js +3 -8
  146. package/.agents/scripts/lib/orchestration/ticketing/bulk.js +0 -25
  147. package/.agents/scripts/lib/orchestration/ticketing/reads.js +29 -26
  148. package/.agents/scripts/lib/orchestration/ticketing/transition.js +5 -5
  149. package/.agents/scripts/lib/planning-corpus.js +16 -11
  150. package/.agents/scripts/lib/preflight-runner.js +2 -2
  151. package/.agents/scripts/lib/provider-factory.js +1 -1
  152. package/.agents/scripts/lib/qa/coverage-verdict.js +5 -5
  153. package/.agents/scripts/lib/single-story/confirm-merge-follow-ups.js +36 -0
  154. package/.agents/scripts/lib/single-story-sweep/protection-ctx.js +1 -1
  155. package/.agents/scripts/lib/story-adjacency.js +11 -14
  156. package/.agents/scripts/lib/story-body/story-body.js +124 -70
  157. package/.agents/scripts/lib/story-plan.js +2 -4
  158. package/.agents/scripts/lib/templates/decomposer-prompts.js +46 -45
  159. package/.agents/scripts/lib/templates/spec-author-prompts.js +47 -45
  160. package/.agents/scripts/lib/{epic-body-sections.js → ticket-body-sections.js} +26 -26
  161. package/.agents/scripts/lib/validation-evidence.js +1 -1
  162. package/.agents/scripts/lib/wave-runner/ready-set.js +6 -6
  163. package/.agents/scripts/lib/workspace-provisioner.js +1 -1
  164. package/.agents/scripts/lib/worktree/lifecycle/reap.js +5 -7
  165. package/.agents/scripts/lint-issue-body.js +71 -40
  166. package/.agents/scripts/mandrel-update-preflight.js +1 -1
  167. package/.agents/scripts/notify.js +4 -3
  168. package/.agents/scripts/plan-context.js +64 -74
  169. package/.agents/scripts/plan-persist.js +121 -280
  170. package/.agents/scripts/plan-run-epilogue.js +97 -0
  171. package/.agents/scripts/post-structured-comment.js +38 -0
  172. package/.agents/scripts/providers/github/issues.js +17 -33
  173. package/.agents/scripts/providers/github/mappers.js +0 -12
  174. package/.agents/scripts/providers/github/tickets.js +2 -5
  175. package/.agents/scripts/resolve-plan-run.js +117 -0
  176. package/.agents/scripts/signals-view.js +24 -19
  177. package/.agents/scripts/single-story-close.js +11 -14
  178. package/.agents/scripts/single-story-confirm-merge.js +39 -23
  179. package/.agents/scripts/single-story-init.js +29 -20
  180. package/.agents/scripts/stories-wave-tick.js +6 -6
  181. package/.agents/scripts/story-plan.js +26 -47
  182. package/.agents/scripts/sync-claude-agents.js +165 -0
  183. package/.agents/scripts/update-ticket-state.js +37 -15
  184. package/.agents/skills/core/analyze-execution/SKILL.md +21 -18
  185. package/.agents/skills/core/api-and-interface-design/SKILL.md +5 -3
  186. package/.agents/skills/core/code-review-and-quality/SKILL.md +63 -7
  187. package/.agents/skills/core/debugging-and-error-recovery/SKILL.md +1 -1
  188. package/.agents/skills/core/gates-and-baselines/SKILL.md +149 -0
  189. package/.agents/skills/core/idea-refinement/SKILL.md +8 -14
  190. package/.agents/skills/core/qa-coverage-mapping/SKILL.md +7 -7
  191. package/.agents/skills/core/scope-triage/SKILL.md +28 -172
  192. package/.agents/skills/skills.index.json +8 -418
  193. package/.agents/starter-agentrc.json +0 -5
  194. package/.agents/templates/agent-protocol.md +9 -10
  195. package/.agents/workflows/audit-architecture.md +3 -3
  196. package/.agents/workflows/audit-clean-code.md +3 -3
  197. package/.agents/workflows/audit-dependencies.md +3 -3
  198. package/.agents/workflows/audit-devops.md +3 -3
  199. package/.agents/workflows/audit-documentation.md +5 -5
  200. package/.agents/workflows/audit-lighthouse.md +3 -3
  201. package/.agents/workflows/audit-navigability.md +3 -2
  202. package/.agents/workflows/audit-performance.md +3 -3
  203. package/.agents/workflows/audit-privacy.md +3 -3
  204. package/.agents/workflows/audit-quality.md +3 -3
  205. package/.agents/workflows/audit-security.md +3 -3
  206. package/.agents/workflows/audit-seo.md +3 -3
  207. package/.agents/workflows/audit-sre.md +3 -3
  208. package/.agents/workflows/audit-to-stories.md +20 -20
  209. package/.agents/workflows/audit-ux-ui.md +3 -3
  210. package/.agents/workflows/deliver.md +122 -131
  211. package/.agents/workflows/git-cleanup.md +3 -4
  212. package/.agents/workflows/helpers/_merge-conflict-template.md +1 -1
  213. package/.agents/workflows/helpers/acceptance-self-eval.md +52 -40
  214. package/.agents/workflows/helpers/code-review.md +70 -193
  215. package/.agents/workflows/helpers/{single-story-deliver-reference.md → deliver-story-reference.md} +12 -14
  216. package/.agents/workflows/helpers/{single-story-deliver.md → deliver-story.md} +113 -139
  217. package/.agents/workflows/helpers/diagnose.md +10 -10
  218. package/.agents/workflows/helpers/mandrel-sync-config.md +1 -1
  219. package/.agents/workflows/helpers/parallel-tooling.md +1 -1
  220. package/.agents/workflows/helpers/signals.md +16 -16
  221. package/.agents/workflows/helpers/worktree-lifecycle.md +48 -64
  222. package/.agents/workflows/mandrel-update.md +3 -2
  223. package/.agents/workflows/plan.md +112 -145
  224. package/.agents/workflows/qa-assist.md +24 -30
  225. package/.agents/workflows/qa-explore.md +29 -38
  226. package/.agents/workflows/qa-run.md +2 -2
  227. package/README.md +9 -8
  228. package/docs/CHANGELOG.md +46 -0
  229. package/lib/cli/registry.js +95 -0
  230. package/lib/migrations/index.js +6 -5
  231. package/package.json +5 -3
  232. package/.agents/personas/architect.md +0 -113
  233. package/.agents/personas/devops-engineer.md +0 -38
  234. package/.agents/personas/engineer-mobile.md +0 -120
  235. package/.agents/personas/engineer-web.md +0 -111
  236. package/.agents/personas/engineer.md +0 -119
  237. package/.agents/personas/product.md +0 -94
  238. package/.agents/personas/project-manager.md +0 -114
  239. package/.agents/personas/qa-engineer.md +0 -95
  240. package/.agents/personas/refactorer.md +0 -113
  241. package/.agents/personas/security-engineer.md +0 -112
  242. package/.agents/personas/sre.md +0 -86
  243. package/.agents/personas/technical-writer.md +0 -101
  244. package/.agents/personas/ux-designer.md +0 -95
  245. package/.agents/schemas/dispatch-manifest.json +0 -232
  246. package/.agents/schemas/epic-spec.schema.json +0 -153
  247. package/.agents/scripts/acceptance-spec-reconciler.js +0 -642
  248. package/.agents/scripts/dispatcher.js +0 -295
  249. package/.agents/scripts/epic-audit-prepare.js +0 -497
  250. package/.agents/scripts/epic-audit-recheck.js +0 -274
  251. package/.agents/scripts/epic-deliver-note-intervention.js +0 -192
  252. package/.agents/scripts/epic-deliver-preflight.js +0 -462
  253. package/.agents/scripts/epic-deliver-prepare.js +0 -590
  254. package/.agents/scripts/epic-execute-record-wave.js +0 -449
  255. package/.agents/scripts/epic-plan-clarity.js +0 -211
  256. package/.agents/scripts/epic-plan-decompose.js +0 -54
  257. package/.agents/scripts/epic-plan-healthcheck.js +0 -581
  258. package/.agents/scripts/epic-plan-spec.js +0 -64
  259. package/.agents/scripts/epic-reconcile.js +0 -625
  260. package/.agents/scripts/lib/baseline-snapshot.js +0 -979
  261. package/.agents/scripts/lib/checks/epic-merge-lock-stale.js +0 -54
  262. package/.agents/scripts/lib/checks/stale-origin-epic.js +0 -49
  263. package/.agents/scripts/lib/config/lifecycle.js +0 -40
  264. package/.agents/scripts/lib/config/preflight.js +0 -58
  265. package/.agents/scripts/lib/config/retro.js +0 -77
  266. package/.agents/scripts/lib/epic-merge-lock.js +0 -322
  267. package/.agents/scripts/lib/epic-plan-clarity.js +0 -181
  268. package/.agents/scripts/lib/epic-plan-ideation.js +0 -261
  269. package/.agents/scripts/lib/orchestration/context-hydration-engine.js +0 -660
  270. package/.agents/scripts/lib/orchestration/dispatch-engine.js +0 -134
  271. package/.agents/scripts/lib/orchestration/dispatch-pipeline.js +0 -183
  272. package/.agents/scripts/lib/orchestration/epic-cleanup.js +0 -801
  273. package/.agents/scripts/lib/orchestration/epic-deliver-lease-guard.js +0 -310
  274. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/context.js +0 -163
  275. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/creation.js +0 -140
  276. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/dag.js +0 -64
  277. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/diagnostics.js +0 -72
  278. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/persist-helpers.js +0 -156
  279. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/persist.js +0 -345
  280. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/planning-artifacts.js +0 -41
  281. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/reconcile-spawn.js +0 -86
  282. package/.agents/scripts/lib/orchestration/epic-plan-lease-guard.js +0 -391
  283. package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/drain.js +0 -94
  284. package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/plan-epic.js +0 -236
  285. package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/run-spec-phase.js +0 -307
  286. package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/spec-freshness.js +0 -117
  287. package/.agents/scripts/lib/orchestration/epic-plan-state-store.js +0 -117
  288. package/.agents/scripts/lib/orchestration/epic-run-state-store.js +0 -388
  289. package/.agents/scripts/lib/orchestration/epic-runner/concurrency-gate.js +0 -186
  290. package/.agents/scripts/lib/orchestration/epic-runner/deliver-phases.js +0 -50
  291. package/.agents/scripts/lib/orchestration/epic-runner/phases/build-wave-dag.js +0 -129
  292. package/.agents/scripts/lib/orchestration/epic-runner/phases/snapshot.js +0 -103
  293. package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter/composition.js +0 -267
  294. package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter/signals.js +0 -210
  295. package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter/transport.js +0 -238
  296. package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/_bullet-format.js +0 -32
  297. package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/component-drift.js +0 -203
  298. package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/crap-drift.js +0 -227
  299. package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/maintainability-drift.js +0 -117
  300. package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/stalled-worktree.js +0 -37
  301. package/.agents/scripts/lib/orchestration/epic-runner/story-launcher.js +0 -127
  302. package/.agents/scripts/lib/orchestration/epic-runner/sub-agent-return.js +0 -276
  303. package/.agents/scripts/lib/orchestration/epic-runner/wave-scheduler.js +0 -66
  304. package/.agents/scripts/lib/orchestration/epic-spec-reconciler-apply.js +0 -789
  305. package/.agents/scripts/lib/orchestration/epic-spec-reconciler-diff.js +0 -676
  306. package/.agents/scripts/lib/orchestration/epic-spec-reconciler-discriminator.js +0 -389
  307. package/.agents/scripts/lib/orchestration/epic-spec-reconciler-format.js +0 -230
  308. package/.agents/scripts/lib/orchestration/epic-spec-reconciler-ops.js +0 -361
  309. package/.agents/scripts/lib/orchestration/finalize/open-or-locate-pr.js +0 -306
  310. package/.agents/scripts/lib/orchestration/finalize/post-handoff-comment.js +0 -489
  311. package/.agents/scripts/lib/orchestration/finalize/sanitize-skip-ci.js +0 -88
  312. package/.agents/scripts/lib/orchestration/lifecycle/emit-story-dispatch-end.js +0 -147
  313. package/.agents/scripts/lib/orchestration/lifecycle/listeners/acceptance-reconciler.js +0 -384
  314. package/.agents/scripts/lib/orchestration/lifecycle/listeners/automerge-armer.js +0 -501
  315. package/.agents/scripts/lib/orchestration/lifecycle/listeners/automerge-predicate.js +0 -984
  316. package/.agents/scripts/lib/orchestration/lifecycle/listeners/branch-cleaner.js +0 -264
  317. package/.agents/scripts/lib/orchestration/lifecycle/listeners/checkpoint-pointer-writer.js +0 -278
  318. package/.agents/scripts/lib/orchestration/lifecycle/listeners/cleaner.js +0 -355
  319. package/.agents/scripts/lib/orchestration/lifecycle/listeners/finalizer.js +0 -673
  320. package/.agents/scripts/lib/orchestration/lifecycle/listeners/index.js +0 -378
  321. package/.agents/scripts/lib/orchestration/lifecycle/listeners/intervention-recorder.js +0 -140
  322. package/.agents/scripts/lib/orchestration/lifecycle/listeners/label-transitioner.js +0 -144
  323. package/.agents/scripts/lib/orchestration/lifecycle/listeners/notify-dispatcher.js +0 -174
  324. package/.agents/scripts/lib/orchestration/manifest-builder.js +0 -222
  325. package/.agents/scripts/lib/orchestration/plan-persist/amend.js +0 -359
  326. package/.agents/scripts/lib/orchestration/plan-persist/delivery-mode.js +0 -127
  327. package/.agents/scripts/lib/orchestration/post-merge-pipeline.js +0 -205
  328. package/.agents/scripts/lib/orchestration/recurring-failure-detector.js +0 -152
  329. package/.agents/scripts/lib/orchestration/retro/phases/checks.js +0 -94
  330. package/.agents/scripts/lib/orchestration/retro/phases/compose-body.js +0 -571
  331. package/.agents/scripts/lib/orchestration/retro/phases/gather-signals.js +0 -450
  332. package/.agents/scripts/lib/orchestration/retro/phases/post-and-mirror.js +0 -191
  333. package/.agents/scripts/lib/orchestration/retro-heuristics.js +0 -57
  334. package/.agents/scripts/lib/orchestration/retro-runner.js +0 -197
  335. package/.agents/scripts/lib/orchestration/skill-capsule-loader.js +0 -109
  336. package/.agents/scripts/lib/orchestration/spec-renderer.js +0 -447
  337. package/.agents/scripts/lib/orchestration/story-close/auto-refresh-runner.js +0 -747
  338. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/gate-failure.js +0 -211
  339. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/pre-merge-attribution.js +0 -158
  340. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/refresh-commit.js +0 -446
  341. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/regression-projection.js +0 -297
  342. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/scope-discovery.js +0 -48
  343. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution-wiring.js +0 -67
  344. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution.js +0 -161
  345. package/.agents/scripts/lib/orchestration/story-close/baseline-friction-body.js +0 -117
  346. package/.agents/scripts/lib/orchestration/story-close/cd-out-guard.js +0 -86
  347. package/.agents/scripts/lib/orchestration/story-close/cleanup-reconciler.js +0 -147
  348. package/.agents/scripts/lib/orchestration/story-close/close-inputs.js +0 -142
  349. package/.agents/scripts/lib/orchestration/story-close/comment-bodies.js +0 -62
  350. package/.agents/scripts/lib/orchestration/story-close/merge-runner.js +0 -658
  351. package/.agents/scripts/lib/orchestration/story-close/merge-subject.js +0 -198
  352. package/.agents/scripts/lib/orchestration/story-close/phases/branch-restore.js +0 -105
  353. package/.agents/scripts/lib/orchestration/story-close/phases/close.js +0 -222
  354. package/.agents/scripts/lib/orchestration/story-close/phases/gates.js +0 -292
  355. package/.agents/scripts/lib/orchestration/story-close/phases/locked-pipeline.js +0 -270
  356. package/.agents/scripts/lib/orchestration/story-close/phases/preflight.js +0 -110
  357. package/.agents/scripts/lib/orchestration/story-close/phases/refresh.js +0 -86
  358. package/.agents/scripts/lib/orchestration/story-close/phases/timeout-blocked-emitter.js +0 -112
  359. package/.agents/scripts/lib/orchestration/story-close/phases/timeout-blocked.js +0 -157
  360. package/.agents/scripts/lib/orchestration/story-close/post-merge-close.js +0 -421
  361. package/.agents/scripts/lib/orchestration/story-close/pre-merge-validation.js +0 -301
  362. package/.agents/scripts/lib/orchestration/story-close/shared-checkout-guard.js +0 -163
  363. package/.agents/scripts/lib/orchestration/story-close-recovery.js +0 -690
  364. package/.agents/scripts/lib/orchestration/wave-marker.js +0 -28
  365. package/.agents/scripts/lib/orchestration/wave-record-io.js +0 -218
  366. package/.agents/scripts/lib/orchestration/wave-record-notifications.js +0 -145
  367. package/.agents/scripts/lib/orchestration/wave-record-projection.js +0 -212
  368. package/.agents/scripts/lib/presentation/dispatch-manifest-render.js +0 -111
  369. package/.agents/scripts/lib/presentation/manifest-builder.js +0 -239
  370. package/.agents/scripts/lib/presentation/manifest-formatter.js +0 -242
  371. package/.agents/scripts/lib/presentation/manifest-helpers.js +0 -213
  372. package/.agents/scripts/lib/presentation/manifest-persistence.js +0 -261
  373. package/.agents/scripts/lib/presentation/manifest-procedures.js +0 -55
  374. package/.agents/scripts/lib/presentation/manifest-render-waves.js +0 -306
  375. package/.agents/scripts/lib/presentation/manifest-renderer.js +0 -188
  376. package/.agents/scripts/lib/presentation/manifest-story-views.js +0 -110
  377. package/.agents/scripts/lib/push-epic-retry.js +0 -209
  378. package/.agents/scripts/lib/spec/index.js +0 -36
  379. package/.agents/scripts/lib/spec/loader.js +0 -425
  380. package/.agents/scripts/lib/spec/state.js +0 -208
  381. package/.agents/scripts/lib/story-init/blocker-validator.js +0 -68
  382. package/.agents/scripts/lib/story-init/branch-initializer.js +0 -408
  383. package/.agents/scripts/lib/story-init/context-resolver.js +0 -92
  384. package/.agents/scripts/lib/story-init/donor-precheck.js +0 -207
  385. package/.agents/scripts/lib/story-init/state-transitioner.js +0 -80
  386. package/.agents/scripts/lib/story-init/task-graph-builder.js +0 -124
  387. package/.agents/scripts/lib/story-init/transition-summary.js +0 -34
  388. package/.agents/scripts/lib/test-reserved-epic-temp-ids.js +0 -35
  389. package/.agents/scripts/lib/wave-runner/tick.js +0 -754
  390. package/.agents/scripts/lib/wave-runner/wave-runner-error.js +0 -20
  391. package/.agents/scripts/lifecycle-emit-story-dispatch.js +0 -194
  392. package/.agents/scripts/lifecycle-emit.js +0 -510
  393. package/.agents/scripts/plan-critics.js +0 -199
  394. package/.agents/scripts/retro-run.js +0 -218
  395. package/.agents/scripts/standalone-feedback-rollup.js +0 -188
  396. package/.agents/scripts/story-close.js +0 -294
  397. package/.agents/scripts/story-init.js +0 -599
  398. package/.agents/scripts/story-phase.js +0 -369
  399. package/.agents/scripts/wave-tick.js +0 -335
  400. package/.agents/skills/core/baseline-refresh/SKILL.md +0 -181
  401. package/.agents/skills/core/ci-cd-and-automation/SKILL.md +0 -274
  402. package/.agents/skills/core/ci-cd-and-automation/examples.md +0 -211
  403. package/.agents/skills/core/code-simplification/SKILL.md +0 -389
  404. package/.agents/skills/core/context-engineering/SKILL.md +0 -309
  405. package/.agents/skills/core/context-engineering/examples.md +0 -58
  406. package/.agents/skills/core/deprecation-and-migration/SKILL.md +0 -250
  407. package/.agents/skills/core/epic-plan-consolidate/SKILL.md +0 -172
  408. package/.agents/skills/core/epic-plan-consolidate/examples.md +0 -51
  409. package/.agents/skills/core/epic-plan-decompose-author/SKILL.md +0 -441
  410. package/.agents/skills/core/epic-plan-decompose-author/examples.md +0 -47
  411. package/.agents/skills/core/epic-plan-premortem/SKILL.md +0 -146
  412. package/.agents/skills/core/epic-plan-premortem/examples.md +0 -53
  413. package/.agents/skills/core/epic-plan-spec-author/SKILL.md +0 -413
  414. package/.agents/skills/core/epic-plan-spec-author/examples.md +0 -91
  415. package/.agents/skills/core/frontend-ui-engineering/SKILL.md +0 -357
  416. package/.agents/skills/core/hydrate-context/SKILL.md +0 -123
  417. package/.agents/skills/core/idea-refinement/examples.md +0 -437
  418. package/.agents/skills/core/idea-refinement/frameworks.md +0 -135
  419. package/.agents/skills/core/incremental-implementation/SKILL.md +0 -271
  420. package/.agents/skills/core/introducing-a-baseline-gate/SKILL.md +0 -213
  421. package/.agents/skills/core/knowledge-transfer/SKILL.md +0 -180
  422. package/.agents/skills/core/mutation-survivor-remediation/SKILL.md +0 -117
  423. package/.agents/skills/core/performance-optimization/SKILL.md +0 -314
  424. package/.agents/skills/core/planning-and-task-breakdown/SKILL.md +0 -277
  425. package/.agents/skills/core/property-based-testing/SKILL.md +0 -148
  426. package/.agents/skills/core/refactoring-discipline/SKILL.md +0 -111
  427. package/.agents/skills/core/shipping-and-launch/SKILL.md +0 -328
  428. package/.agents/skills/core/spec-driven-development/SKILL.md +0 -252
  429. package/.agents/skills/core/test-driven-development/SKILL.md +0 -475
  430. package/.agents/skills/core/using-agent-skills/SKILL.md +0 -232
  431. package/.agents/skills/stack/architecture/monorepo-path-strategist/SKILL.md +0 -31
  432. package/.agents/skills/stack/architecture/structured-output-zod/SKILL.md +0 -51
  433. package/.agents/skills/stack/architecture/subagent-orchestration/SKILL.md +0 -76
  434. package/.agents/skills/stack/backend/cloudflare-hono-architect/SKILL.md +0 -31
  435. package/.agents/skills/stack/backend/cloudflare-hono-architect/examples/route-template.ts +0 -33
  436. package/.agents/skills/stack/backend/cloudflare-queue-manager/SKILL.md +0 -31
  437. package/.agents/skills/stack/backend/cloudflare-workers/SKILL.md +0 -51
  438. package/.agents/skills/stack/backend/highlevel-crm/SKILL.md +0 -54
  439. package/.agents/skills/stack/backend/sqlite-drizzle-expert/SKILL.md +0 -29
  440. package/.agents/skills/stack/backend/sqlite-drizzle-expert/examples/schema-template.ts +0 -30
  441. package/.agents/skills/stack/backend/stripe-integration/SKILL.md +0 -57
  442. package/.agents/skills/stack/backend/stripe-integration/scripts/listen-stripe.sh +0 -9
  443. package/.agents/skills/stack/backend/turso-sqlite/SKILL.md +0 -48
  444. package/.agents/skills/stack/frontend/astro/SKILL.md +0 -62
  445. package/.agents/skills/stack/frontend/astro-react-island-strategist/SKILL.md +0 -30
  446. package/.agents/skills/stack/frontend/expo-react-native-developer/SKILL.md +0 -29
  447. package/.agents/skills/stack/frontend/google-analytics-v4/SKILL.md +0 -50
  448. package/.agents/skills/stack/frontend/tailwind-v4/SKILL.md +0 -58
  449. package/.agents/skills/stack/frontend/ui-accessibility-engineer/SKILL.md +0 -34
  450. package/.agents/skills/stack/qa/audit-accessibility/SKILL.md +0 -51
  451. package/.agents/skills/stack/qa/lighthouse-baseline/SKILL.md +0 -199
  452. package/.agents/skills/stack/security/backend-security-patterns/SKILL.md +0 -68
  453. package/.agents/workflows/helpers/deliver-epic-reference.md +0 -534
  454. package/.agents/workflows/helpers/deliver-epic.md +0 -955
  455. package/.agents/workflows/helpers/deliver-stories.md +0 -440
  456. package/.agents/workflows/helpers/epic-audit.md +0 -189
  457. package/.agents/workflows/helpers/epic-deliver-story.md +0 -427
  458. package/.agents/workflows/helpers/epic-testing.md +0 -125
  459. package/.agents/workflows/helpers/plan-epic-reference.md +0 -160
  460. package/.agents/workflows/helpers/plan-epic.md +0 -351
  461. package/.agents/workflows/helpers/plan-story.md +0 -251
  462. package/.agents/workflows/helpers/scope-triage-gate.md +0 -108
  463. /package/.agents/scripts/lib/orchestration/{epic-plan-spec/phases → planning}/spec-authoring-grounding.js +0 -0
@@ -1,32 +1,16 @@
1
1
  /**
2
- * plan-context.js — single planner-context envelope build (Epic #4474, M3
3
- * PR2 — `/plan` collapse step 1).
2
+ * plan-context.js — single planner-context envelope build for `/plan`.
4
3
  *
5
- * Folds the two `--emit-context` halves of the 12-phase pipeline
6
- * (`buildAuthoringContext` from `epic-plan-spec/phases/authoring-context.js`
7
- * and `buildDecompositionContext` from
8
- * `epic-plan-decompose/phases/context.js`) plus the three currently-no-CLI
9
- * library calls (`findSimilarOpenEpics`, clarity scoring, re-plan
10
- * detection) into ONE JSON envelope, so the authoring middle reads a single
11
- * file instead of shim-scripting library imports (the bench measured
12
- * ~12–15 turns of shim-writing for the dup search alone).
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.
13
7
  *
14
- * Three modes (the design's mode matrix + the #4496 seed entry):
15
- * - `epic` the Epic exists. Carries `epic`, `clarity` (the Epic
16
- * Clarity Gate rubric free, same body fetch), `replan`
17
- * (already-planned signals) and `planState`.
18
- * - `one-pager` ideation; the Epic does not exist yet (creation moves
19
- * to the persist half). Carries `onePager` and
20
- * `duplicates[]` (cross-Epic dup search). Clarity is not
21
- * scored — the ideation path is definitionally clear.
22
- * - `seed` — headless ideation entry (#4496 fix 1): the one-pager
23
- * does not exist yet either. The dup search runs off the
24
- * raw seed text, and the envelope additively carries
25
- * `seed`, `scopeTriage` (the scope-triage rubric applied
26
- * CLI-side — no skill Reads on the headless path) and
27
- * `onePagerSpec` (the canonical one-pager sections, so
28
- * the authoring pass writes the one-pager in the SAME
29
- * batched write as the spec artifacts).
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).
30
14
  *
31
15
  * All fields are JSON-serialisable; the module performs no GitHub writes.
32
16
  * The only I/O surfaces are the injected `provider` (reads) and the
@@ -34,28 +18,28 @@
34
18
  */
35
19
 
36
20
  import { readFile } from 'node:fs/promises';
37
- import { getLimits, resolvePreflightCeilings } from '../config-resolver.js';
38
- import { findSimilarOpenEpics } from '../duplicate-search.js';
39
- import { hasEpicSection, hasTechSpecContent } from '../epic-body-sections.js';
40
- import { scoreEpicBody } from '../epic-plan-clarity.js';
21
+ import { getLimits } from '../config-resolver.js';
22
+ import { findSimilarOpenStories } from '../duplicate-search.js';
41
23
  import { Logger } from '../Logger.js';
42
24
  import {
43
25
  renderAcceptanceSpecSystemPrompt,
44
26
  renderTechSpecSystemPrompt,
45
27
  } from '../templates/spec-author-prompts.js';
28
+ import { concurrentMap } from '../util/concurrent-map.js';
46
29
  import { parseDeliverySlicingTable } from './consolidation-precondition.js';
47
30
  import { buildDocsDigest } from './docs-digest.js';
48
- import { buildDecomposerSystemPrompt } from './epic-plan-decompose/phases/context.js';
49
- import { buildAuthoringContext } from './epic-plan-spec/phases/authoring-context.js';
50
- import { read as readPlanState } from './epic-plan-state-store.js';
31
+ import { buildAuthoringContext } from './planning/authoring-context.js';
32
+ import { buildDecomposerSystemPrompt } from './planning/decomposer-context.js';
51
33
 
34
+ /** Bounded concurrency for `--tickets` source-ticket hydration. */
35
+ const SOURCE_TICKET_FETCH_CONCURRENCY = 4;
52
36
  /**
53
37
  * Envelope byte ceiling (regression guard for the design's named PR2 risk:
54
38
  * two envelopes → one bigger one). The folded envelope's bounded parts are:
55
39
  * the `applyBudget`-capped body (`planningContext.maxBytes` = 50 KB), the
56
40
  * tier-capped codebase snapshot (~35 KB skinny on this repo), the three
57
41
  * rendered system prompts (~15 KB), and the digest-first `docsContext`
58
- * (outline-only, pointer in epic mode). Measured folded envelopes on this
42
+ * (outline-only, or inline digest in one-pager/seed mode). Measured folded envelopes on this
59
43
  * repo land at ~42 KB; 256 KB (~64K tokens at the ≈4-chars/token estimate)
60
44
  * gives >2× headroom over a worst-case budgeted body + medium-tier snapshot
61
45
  * while staying an order of magnitude under the session budget. The test
@@ -80,44 +64,17 @@ export const TICKET_SCHEMA_DESCRIPTOR = Object.freeze({
80
64
  body: 'string — serialized Story-body markdown (never a JSON object)',
81
65
  acceptance: 'string[] — top-level testable criteria (not nested in body)',
82
66
  verify: 'string[] — top-level exact commands/test paths with (<tier>)',
83
- labels: "string[] — must include 'type::story' and one 'persona::*'",
67
+ labels: "string[] — must include 'type::story' (no persona::* axis)",
84
68
  depends_on: 'string[]? — sibling Story slugs that block execution',
85
69
  }),
86
70
  validatedBy:
87
71
  'validateAndNormalizeTickets (lib/orchestration/ticket-validator.js) at persist time',
88
72
  });
89
73
 
90
- /**
91
- * Canonical one-pager authoring descriptor for the `seed` envelope
92
- * (#4496 fix 1). The section names are the ones `plan-epic.md`'s ideation
93
- * entry has always named, chosen so the authored headings parse against
94
- * the `SECTION_RE` map in `lib/epic-plan-ideation.js` (which renders the
95
- * Epic body from the one-pager at persist time via
96
- * `.agents/templates/epic-from-idea.md`).
97
- */
98
- export const ONE_PAGER_AUTHORING_SPEC = Object.freeze({
99
- sections: Object.freeze([
100
- 'Problem Statement',
101
- 'Recommended Direction',
102
- 'Key Assumptions',
103
- 'MVP Scope',
104
- 'Not Doing',
105
- ]),
106
- instruction:
107
- 'Author the one-pager markdown (the canonical sections above, as `## ` ' +
108
- 'headings) in the SAME batched write as the other planning artifacts — ' +
109
- 'no separate ideation pass and no idea-refinement skill activation on ' +
110
- 'this path. Every unresolved unknown lands in Key Assumptions instead ' +
111
- 'of a question.',
112
- consumedBy:
113
- 'plan-persist.js --one-pager (ideation Epic creation via ' +
114
- '.agents/templates/epic-from-idea.md)',
115
- });
116
-
117
74
  /**
118
75
  * Count top-level enumerated items (`- `, `* `, `1. `) anywhere in a
119
76
  * free-form seed text. Unlike {@link countScopeItems} this does not require
120
- * a scope-shaped heading — a raw `--idea` seed rarely has one.
77
+ * a scope-shaped heading — a raw `--seed` text rarely has one.
121
78
  *
122
79
  * @param {string} text
123
80
  * @returns {number}
@@ -138,13 +95,13 @@ const DELTA_VERB_RE =
138
95
  /\b(fix(?:es)?|tweak(?:s)?|extend(?:s)?|update(?:s)?|adjust(?:s)?|rename(?:s)?|correct(?:s)?|patch(?:es)?|bug|regression|flaky)\b/i;
139
96
 
140
97
  /**
141
- * Deterministic, CLI-applied scope-triage verdict over a raw `--idea` seed
98
+ * Deterministic, CLI-applied scope-triage verdict over a raw `--seed` text
142
99
  * (#4496 fix 6). Embedding the verdict in the `--seed` envelope removes the
143
100
  * two skill Reads (`core/scope-triage` + the gate fragment's rubric pass)
144
101
  * from the headless path; the attended path keeps the skill-based judgment.
145
102
  *
146
103
  * The heuristics anchor to the same sizing SSOT the skill anchors to —
147
- * `DELIVERABLE_GRANULARITY_GUIDANCE` / `DEFAULT_TASK_SIZING` in
104
+ * `DELIVERABLE_GRANULARITY_GUIDANCE` / `DEFAULT_MODEL_CAPACITY` in
148
105
  * `ticket-validator-sizing.js` (one Story = one coherent capability slice;
149
106
  * multiple independent capabilities = an Epic) — and to the skill's
150
107
  * change-request delta rubric. Like the skill, the verdict is **advisory**:
@@ -223,7 +180,7 @@ function resolveRiskHeuristics(config = {}) {
223
180
  if (Array.isArray(config.planning?.riskHeuristics)) {
224
181
  return config.planning.riskHeuristics;
225
182
  }
226
- return config.agentSettings?.planning?.riskHeuristics || [];
183
+ return [];
227
184
  }
228
185
 
229
186
  /**
@@ -331,43 +288,6 @@ export function buildDeliveryShapeSignal({ body } = {}) {
331
288
  };
332
289
  }
333
290
 
334
- /**
335
- * Re-plan detection signals (folds the workflow's Phase 5 into the
336
- * envelope): the Tech Spec sections alone are the already-planned signal;
337
- * the open-Story count and section presence let the authoring middle (and
338
- * the persist half's `--force` prompt) cite concrete numbers.
339
- *
340
- * `openStoryCount` is best-effort: a provider listing failure degrades to
341
- * `null` rather than aborting the envelope build.
342
- *
343
- * @param {{ epicBody: string, provider: object, epicId: number }} args
344
- * @returns {Promise<{
345
- * alreadyPlanned: boolean,
346
- * planningSections: { techSpec: boolean, acceptanceTable: boolean },
347
- * openStoryCount: number|null,
348
- * }>}
349
- */
350
- export async function buildReplanSignal({ epicBody, provider, epicId }) {
351
- const body = epicBody ?? '';
352
- let openStoryCount = null;
353
- try {
354
- const tickets = await provider.getTickets(epicId, { state: 'open' });
355
- if (Array.isArray(tickets)) openStoryCount = tickets.length;
356
- } catch (err) {
357
- Logger.warn(
358
- `[plan-context] open-children listing skipped: ${err?.message ?? err}`,
359
- );
360
- }
361
- return {
362
- alreadyPlanned: hasTechSpecContent(body),
363
- planningSections: {
364
- techSpec: hasEpicSection(body, 'techSpec'),
365
- acceptanceTable: hasEpicSection(body, 'acceptanceTable'),
366
- },
367
- openStoryCount,
368
- };
369
- }
370
-
371
291
  /**
372
292
  * Render the three authoring system prompts the collapsed pipeline's
373
293
  * single authoring pass consumes. The spec/acceptance prompts render from
@@ -375,89 +295,136 @@ export async function buildReplanSignal({ epicBody, provider, epicId }) {
375
295
  * authoritative from day one); the decompose prompt reuses the existing
376
296
  * Story #4162 carrier including the risk-heuristics suffix.
377
297
  *
378
- * @param {{ heuristics?: string[], maxTickets?: number, maxTokenBudget?: number, epicId?: number|null }} args
298
+ * @param {{ heuristics?: string[], maxTickets?: number, epicId?: number|null }} args
379
299
  * @returns {{ spec: string, acceptance: string, decompose: string }}
380
300
  */
381
301
  export function buildSystemPrompts({
382
302
  heuristics = [],
383
303
  maxTickets,
384
- maxTokenBudget,
385
304
  epicId = null,
386
305
  } = {}) {
306
+ const decompose = buildDecomposerSystemPrompt(heuristics, {
307
+ maxTickets,
308
+ epicId,
309
+ });
387
310
  return {
388
311
  spec: renderTechSpecSystemPrompt(),
389
312
  acceptance: renderAcceptanceSpecSystemPrompt(),
390
- decompose: buildDecomposerSystemPrompt(heuristics, {
391
- maxTickets,
392
- maxTokenBudget,
393
- epicId,
394
- }),
313
+ // v2 Stage 3: default-single author prompt (decompose text + split policy).
314
+ story: `${decompose}
315
+
316
+ #### v2 DEFAULT-SINGLE SPLIT POLICY:
317
+
318
+ Emit **exactly one Story** in \`stories.json\` unless the pieces have
319
+ near-zero overlap or sit across an architectural seam. Coupled work stays
320
+ one Story — put intra-session checkpoints in \`## Slicing\` and fold the
321
+ Tech Spec into \`## Spec\` (inline only; over-budget Specs mean split or
322
+ tighten — never write under \`docs/\`). Do **not** emit \`deliveryShape\`.
323
+ When N>1, every acceptance criterion must belong to exactly one Story,
324
+ and each Story carries its own \`## Spec\` (no shared techspec.md fold).
325
+ `,
326
+ decompose,
395
327
  };
396
328
  }
397
329
 
398
330
  /**
399
- * Read the `epic-plan-state` structured comment, degrading to `null` when
400
- * the comment is missing/unparseable or the provider fetch fails (same
401
- * tolerance the decompose context applies).
331
+ * Run the open-Story duplicate search. Failures degrade to [] — triage
332
+ * signal, not a gate.
402
333
  *
403
- * @param {{ provider: object, epicId: number }} args
404
- * @returns {Promise<object|null>}
334
+ * @param {{
335
+ * seed: string,
336
+ * provider: object,
337
+ * config: object,
338
+ * excludeIds?: Iterable<number|string>,
339
+ * }} args
340
+ * @returns {Promise<Array<object>>}
405
341
  */
406
- async function readPlanStateTolerant({ provider, epicId }) {
342
+ async function searchStoryDuplicates({
343
+ seed,
344
+ provider,
345
+ config,
346
+ excludeIds = [],
347
+ }) {
407
348
  try {
408
- return await readPlanState({ provider, epicId });
409
- } catch (_err) {
410
- return null;
349
+ return await findSimilarOpenStories({
350
+ seed,
351
+ provider,
352
+ owner: config.github?.owner,
353
+ repo: config.github?.repo,
354
+ excludeIds,
355
+ });
356
+ } catch (err) {
357
+ Logger.warn(
358
+ `[plan-context] duplicate search degraded to no candidates: ${err?.message ?? err}`,
359
+ );
360
+ return [];
411
361
  }
412
362
  }
413
363
 
414
364
  /**
415
- * Build the epic-mode envelope. One Epic fetch feeds everything: the
416
- * authoring context (prefetch seam on `buildAuthoringContext`), clarity
417
- * scoring, re-plan detection, and the delivery-shape heuristics the
418
- * fetch-twice shape of the split pipeline is gone.
365
+ * Build the seed-file (ideation) envelope. No parent ticket
366
+ * exists yet creation moves to the persist half — so the open-Story
367
+ * dup search is the mode's gating input. `docsContext` is inline-digest:
368
+ * there is no plan temp directory to anchor a digest file to yet.
419
369
  */
420
- async function buildEpicModeEnvelope({
421
- epicId,
370
+ async function buildSeedFileModeEnvelope({
371
+ seedFilePath,
372
+ seedFileContent,
422
373
  provider,
423
374
  config,
424
375
  settings,
425
376
  fullContext,
426
377
  cwd,
378
+ modeLabel = 'seed-file',
427
379
  }) {
428
- const epic = await provider.getEpic(epicId);
429
- if (!epic) {
430
- throw new Error(`[plan-context] Epic #${epicId} not found.`);
380
+ const content =
381
+ seedFileContent ?? (await readFile(seedFilePath ?? '', 'utf-8'));
382
+ if (typeof content !== 'string' || content.trim().length === 0) {
383
+ throw new Error(
384
+ `[plan-context] seed-file at ${seedFilePath ?? '(inline)'} is empty — nothing to plan from.`,
385
+ );
431
386
  }
432
- const body = epic.body ?? '';
433
387
 
434
- const authoringOpts = {
435
- epic,
436
- fullContext,
437
- github: config.github ?? null,
438
- };
439
- if (cwd) authoringOpts.cwd = cwd;
440
- const authoring = await buildAuthoringContext(
441
- epicId,
388
+ const duplicates = await searchStoryDuplicates({
389
+ seed: content,
442
390
  provider,
443
- settings,
444
- authoringOpts,
391
+ config,
392
+ });
393
+
394
+ // Fold the authoring-context builders grounded in the seed prose.
395
+ // `docsContextFiles` is emptied for this call: the per-plan digest-file
396
+ // path needs a plan id that does not exist yet — the inline digest
397
+ // below replaces it.
398
+ const authoring = await buildAuthoringContext(
399
+ 0,
400
+ /* provider (unused behind the prefetch seam) */ {},
401
+ { ...settings, docsContextFiles: [] },
402
+ {
403
+ epic: { id: 0, title: seedFilePath ?? 'seed', body: content },
404
+ fullContext,
405
+ github: config.github ?? null,
406
+ cwd,
407
+ },
445
408
  );
446
409
 
410
+ const paths = settings?.paths ?? {};
411
+ const inlineDigest = await buildDocsDigest({
412
+ docsContextFiles: settings?.docsContextFiles,
413
+ docsRoot: paths.docsRoot,
414
+ });
415
+ const docsContext =
416
+ inlineDigest == null
417
+ ? null
418
+ : { mode: 'digest-inline', digest: inlineDigest };
419
+
447
420
  const limits = getLimits(config);
448
421
  const heuristics = resolveRiskHeuristics(config);
449
- const clarityScore = scoreEpicBody({ body });
450
- const [replan, planState] = await Promise.all([
451
- buildReplanSignal({ epicBody: body, provider, epicId }),
452
- readPlanStateTolerant({ provider, epicId }),
453
- ]);
454
422
 
455
423
  return {
456
- mode: 'epic',
457
- epic: authoring.epic,
458
- clarity: clarityScore,
459
- replan,
460
- docsContext: authoring.docsContext,
424
+ mode: modeLabel,
425
+ seed: { path: seedFilePath ?? null, content },
426
+ duplicates,
427
+ docsContext,
461
428
  codebaseSnapshot: authoring.codebaseSnapshot,
462
429
  bddRunner: authoring.bddRunner,
463
430
  bddScenarios: authoring.bddScenarios,
@@ -465,84 +432,138 @@ async function buildEpicModeEnvelope({
465
432
  priorFeedback: authoring.priorFeedback,
466
433
  ticketSchema: TICKET_SCHEMA_DESCRIPTOR,
467
434
  maxTickets: limits.maxTickets,
468
- maxTokenBudget: limits.maxTokenBudget,
469
- preflightCeilings: resolvePreflightCeilings(config),
470
435
  riskHeuristics: heuristics,
471
436
  systemPrompts: buildSystemPrompts({
472
437
  heuristics,
473
438
  maxTickets: limits.maxTickets,
474
- maxTokenBudget: limits.maxTokenBudget,
475
- epicId,
439
+ epicId: null,
476
440
  }),
477
- deliveryShapeSignal: buildDeliveryShapeSignal({ body }),
478
- planState,
441
+ planState: null,
442
+ // N=1 default: author one Story; skip Epic-scale decompose ceremony.
443
+ planProfile: 'story-default',
479
444
  };
480
445
  }
481
446
 
482
447
  /**
483
- * Build the one-pager (ideation) envelope. The Epic does not exist yet —
484
- * creation moves to the persist half so there is no clarity score, no
485
- * re-plan signal, and no plan state; the dup search replaces them as the
486
- * mode's gating input. `docsContext` is inline-digest (the standalone
487
- * `story-plan.js --emit-context` convention): there is no per-Epic temp
488
- * directory to anchor a digest file to yet.
448
+ * Build the seed-mode (chat text) envelope. The seed-file does not exist
449
+ * yet: the dup search and the authoring-context fold both run off the raw
450
+ * seed text (N=1 default no Epic-scale decompose).
489
451
  */
490
- async function buildOnePagerModeEnvelope({
491
- onePagerPath,
492
- onePagerContent,
452
+ async function buildSeedModeEnvelope({
453
+ seedText,
493
454
  provider,
494
455
  config,
495
456
  settings,
496
457
  fullContext,
497
458
  cwd,
498
459
  }) {
499
- const content =
500
- onePagerContent ?? (await readFile(onePagerPath ?? '', 'utf-8'));
501
- if (typeof content !== 'string' || content.trim().length === 0) {
460
+ if (typeof seedText !== 'string' || seedText.trim().length === 0) {
461
+ throw new Error(
462
+ '[plan-context] --seed requires non-empty seed text nothing to plan from.',
463
+ );
464
+ }
465
+ const base = await buildSeedFileModeEnvelope({
466
+ seedFilePath: undefined,
467
+ seedFileContent: seedText,
468
+ provider,
469
+ config,
470
+ settings,
471
+ fullContext,
472
+ cwd,
473
+ modeLabel: 'seed',
474
+ });
475
+ const { seed: _seed, ...rest } = base;
476
+ return {
477
+ ...rest,
478
+ mode: 'seed',
479
+ seed: { text: seedText, path: null },
480
+ };
481
+ }
482
+
483
+ /**
484
+ * Fetch source tickets for `--tickets` mode.
485
+ * Hydrates ids concurrently (bounded) while preserving input order.
486
+ *
487
+ * @param {number[]} ticketIds
488
+ * @param {object} provider
489
+ * @returns {Promise<Array<{ id:number, title:string, body:string, labels:string[], url?:string }>>}
490
+ */
491
+ async function fetchSourceTickets(ticketIds, provider) {
492
+ if (!provider || typeof provider.getTicket !== 'function') {
502
493
  throw new Error(
503
- `[plan-context] one-pager at ${onePagerPath} is empty — nothing to plan from.`,
494
+ '[plan-context] tickets mode requires provider.getTicket()',
504
495
  );
505
496
  }
497
+ return concurrentMap(
498
+ ticketIds,
499
+ async (id) => {
500
+ const ticket = await provider.getTicket(id);
501
+ if (!ticket) {
502
+ throw new Error(`[plan-context] ticket #${id} not found`);
503
+ }
504
+ return {
505
+ id: Number(ticket.id ?? ticket.number ?? id),
506
+ title: ticket.title ?? '',
507
+ body: ticket.body ?? '',
508
+ labels: Array.isArray(ticket.labels)
509
+ ? ticket.labels
510
+ .map((l) => (typeof l === 'string' ? l : l?.name))
511
+ .filter(Boolean)
512
+ : [],
513
+ url: ticket.html_url ?? ticket.url ?? undefined,
514
+ state: ticket.state ?? undefined,
515
+ };
516
+ },
517
+ { concurrency: SOURCE_TICKET_FETCH_CONCURRENCY },
518
+ );
519
+ }
506
520
 
507
- let duplicates = [];
508
- try {
509
- duplicates = await findSimilarOpenEpics({
510
- onePager: content,
511
- provider,
512
- owner: config.github?.owner,
513
- repo: config.github?.repo,
514
- });
515
- } catch (err) {
516
- // The dup search is a triage signal, not a gate: a provider listing
517
- // failure must not abort the envelope build. Surface the degradation
518
- // on stderr; the authoring middle sees an empty candidate list.
519
- Logger.warn(
520
- `[plan-context] duplicate search degraded to no candidates: ${err?.message ?? err}`,
521
+ /**
522
+ * Build the tickets-mode envelope — analyze existing issue(s) into proper
523
+ * Stories. Dup search excludes the source ids so a ticket is not reported
524
+ * as a duplicate of itself.
525
+ */
526
+ async function buildTicketsModeEnvelope({
527
+ ticketIds,
528
+ provider,
529
+ config,
530
+ settings,
531
+ fullContext,
532
+ cwd,
533
+ }) {
534
+ if (!Array.isArray(ticketIds) || ticketIds.length === 0) {
535
+ throw new Error(
536
+ '[plan-context] --tickets requires one or more positive issue ids.',
521
537
  );
522
- duplicates = [];
523
538
  }
539
+ const sourceTickets = await fetchSourceTickets(ticketIds, provider);
540
+ const seed = sourceTickets
541
+ .map((t) => `# ${t.title}\n\n${t.body}`)
542
+ .join('\n\n---\n\n');
543
+
544
+ const duplicates = await searchStoryDuplicates({
545
+ seed,
546
+ provider,
547
+ config,
548
+ excludeIds: ticketIds,
549
+ });
524
550
 
525
- // Fold the same authoring-context builders the epic path uses, grounded
526
- // in the one-pager prose instead of an Epic body. Reuse
527
- // `buildAuthoringContext` via the prefetch seam so the fold has exactly
528
- // one implementation of the snapshot/BDD/memory/feedback pipeline to
529
- // drift from. `docsContextFiles` is emptied for this call: the per-Epic
530
- // digest-file path needs an Epic id (and a temp directory) that does not
531
- // exist yet — the inline digest below replaces it.
532
551
  const authoring = await buildAuthoringContext(
533
552
  0,
534
- /* provider (unused behind the prefetch seam) */ {},
553
+ {},
535
554
  { ...settings, docsContextFiles: [] },
536
555
  {
537
- epic: { id: 0, title: onePagerPath ?? 'one-pager', body: content },
556
+ epic: {
557
+ id: 0,
558
+ title: sourceTickets[0]?.title ?? 'tickets',
559
+ body: seed,
560
+ },
538
561
  fullContext,
539
562
  github: config.github ?? null,
540
563
  cwd,
541
564
  },
542
565
  );
543
566
 
544
- // Replace the per-Epic digest-file pointer with an inline digest — the
545
- // Epic (and its temp directory) does not exist yet.
546
567
  const paths = settings?.paths ?? {};
547
568
  const inlineDigest = await buildDocsDigest({
548
569
  docsContextFiles: settings?.docsContextFiles,
@@ -557,8 +578,9 @@ async function buildOnePagerModeEnvelope({
557
578
  const heuristics = resolveRiskHeuristics(config);
558
579
 
559
580
  return {
560
- mode: 'one-pager',
561
- onePager: { path: onePagerPath ?? null, content },
581
+ mode: 'tickets',
582
+ sourceTickets,
583
+ seed: { text: seed, path: null },
562
584
  duplicates,
563
585
  docsContext,
564
586
  codebaseSnapshot: authoring.codebaseSnapshot,
@@ -568,58 +590,20 @@ async function buildOnePagerModeEnvelope({
568
590
  priorFeedback: authoring.priorFeedback,
569
591
  ticketSchema: TICKET_SCHEMA_DESCRIPTOR,
570
592
  maxTickets: limits.maxTickets,
571
- maxTokenBudget: limits.maxTokenBudget,
572
- preflightCeilings: resolvePreflightCeilings(config),
573
593
  riskHeuristics: heuristics,
574
594
  systemPrompts: buildSystemPrompts({
575
595
  heuristics,
576
596
  maxTickets: limits.maxTickets,
577
- maxTokenBudget: limits.maxTokenBudget,
578
597
  epicId: null,
579
598
  }),
580
- deliveryShapeSignal: buildDeliveryShapeSignal({ body: content }),
581
599
  planState: null,
582
- };
583
- }
584
-
585
- /**
586
- * Build the seed-mode (headless ideation) envelope #4496 fix 1. The
587
- * one-pager does not exist yet: the dup search and the authoring-context
588
- * fold both run off the raw seed text (the same builders the one-pager mode
589
- * uses), and the envelope additively carries `seed`, the CLI-applied
590
- * `scopeTriage` verdict (fix 6 — no skill Reads on the headless path), and
591
- * `onePagerSpec` so the one-pager sections are authored in the same batched
592
- * write as the spec artifacts.
593
- */
594
- async function buildSeedModeEnvelope({
595
- seedText,
596
- provider,
597
- config,
598
- settings,
599
- fullContext,
600
- cwd,
601
- }) {
602
- if (typeof seedText !== 'string' || seedText.trim().length === 0) {
603
- throw new Error(
604
- '[plan-context] --seed requires non-empty seed text — nothing to plan from.',
605
- );
606
- }
607
- const base = await buildOnePagerModeEnvelope({
608
- onePagerPath: undefined,
609
- onePagerContent: seedText,
610
- provider,
611
- config,
612
- settings,
613
- fullContext,
614
- cwd,
615
- });
616
- const { onePager: _onePager, ...rest } = base;
617
- return {
618
- ...rest,
619
- mode: 'seed',
620
- seed: { text: seedText },
621
- scopeTriage: buildScopeTriageSignal({ seedText }),
622
- onePagerSpec: ONE_PAGER_AUTHORING_SPEC,
600
+ planProfile:
601
+ ticketIds.length === 1 ? 'story-default' : 'story-from-tickets',
602
+ instruction:
603
+ 'Analyze the source ticket(s) and author proper type::story ' +
604
+ 'ticket(s) under the default-single split policy. Prefer rewriting ' +
605
+ 'the source into one well-formed Story (N=1) unless the split policy ' +
606
+ 'applies. Do not open an Epic.',
623
607
  };
624
608
  }
625
609
 
@@ -627,11 +611,11 @@ async function buildSeedModeEnvelope({
627
611
  * Build the single planner-context envelope.
628
612
  *
629
613
  * @param {{
630
- * mode: 'epic'|'one-pager'|'seed',
631
- * epicId?: number,
632
- * onePagerPath?: string,
633
- * onePagerContent?: string,
614
+ * mode: 'seed-file'|'seed'|'tickets',
615
+ * seedFilePath?: string,
616
+ * seedFileContent?: string,
634
617
  * seedText?: string,
618
+ * ticketIds?: number[],
635
619
  * provider: object,
636
620
  * config: object,
637
621
  * settings: object,
@@ -641,38 +625,36 @@ async function buildSeedModeEnvelope({
641
625
  */
642
626
  export async function buildPlanContext({
643
627
  mode,
644
- epicId,
645
- onePagerPath,
646
- onePagerContent,
628
+ seedFilePath,
629
+ seedFileContent,
647
630
  seedText,
631
+ ticketIds,
648
632
  provider,
649
633
  config = {},
650
634
  settings = {},
651
635
  fullContext = false,
652
636
  cwd,
653
637
  }) {
654
- if (mode === 'epic') {
655
- if (!Number.isInteger(epicId)) {
656
- throw new Error('[plan-context] epic mode requires a numeric epicId.');
638
+ if (mode === 'seed-file') {
639
+ if (!seedFilePath && typeof seedFileContent !== 'string') {
640
+ throw new Error(
641
+ '[plan-context] seed-file mode requires --seed-file <path>.',
642
+ );
657
643
  }
658
- return buildEpicModeEnvelope({
659
- epicId,
644
+ return buildSeedFileModeEnvelope({
645
+ seedFilePath,
646
+ seedFileContent,
660
647
  provider,
661
648
  config,
662
649
  settings,
663
650
  fullContext,
664
651
  cwd,
652
+ modeLabel: 'seed-file',
665
653
  });
666
654
  }
667
- if (mode === 'one-pager') {
668
- if (!onePagerPath && typeof onePagerContent !== 'string') {
669
- throw new Error(
670
- '[plan-context] one-pager mode requires --one-pager <path>.',
671
- );
672
- }
673
- return buildOnePagerModeEnvelope({
674
- onePagerPath,
675
- onePagerContent,
655
+ if (mode === 'seed') {
656
+ return buildSeedModeEnvelope({
657
+ seedText,
676
658
  provider,
677
659
  config,
678
660
  settings,
@@ -680,9 +662,9 @@ export async function buildPlanContext({
680
662
  cwd,
681
663
  });
682
664
  }
683
- if (mode === 'seed') {
684
- return buildSeedModeEnvelope({
685
- seedText,
665
+ if (mode === 'tickets') {
666
+ return buildTicketsModeEnvelope({
667
+ ticketIds,
686
668
  provider,
687
669
  config,
688
670
  settings,
@@ -691,6 +673,6 @@ export async function buildPlanContext({
691
673
  });
692
674
  }
693
675
  throw new Error(
694
- `[plan-context] unknown mode "${mode}" — expected "epic", "one-pager" or "seed".`,
676
+ `[plan-context] unknown mode "${mode}" — expected "seed", "seed-file", or "tickets".`,
695
677
  );
696
678
  }