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
@@ -0,0 +1,103 @@
1
+ /**
2
+ * `delivery.routing` accessor + framework defaults — Epic #4478 (M7-B), the
3
+ * role-scoped-boot-context flip and the maker-checker sampling floor.
4
+ *
5
+ * Stage 6 dropped `delivery.routing.singleDelivery` (the v1 epic
6
+ * single-vs-fan-out kill-switch). v2 has one Story delivery path; routing
7
+ * here is only about spawn boot context and critic sampling.
8
+ *
9
+ * `delivery.routing.roleScopedAgents` is the **kill-switch for the role-scoped
10
+ * boot contexts** (Epic #4478, M7-B). It defaults to `true`: a converted spawn
11
+ * (`story-worker`, `acceptance-critic`) boots on its own
12
+ * `.claude/agents/<role>.md` system prompt instead of re-paying the full
13
+ * `CLAUDE.md` @-import closure, which is the whole payoff of the context diet
14
+ * (≈50KB → ≈8KB per spawn). When set to `false`, every converted spawn falls
15
+ * back to `subagent_type: general-purpose` — the instant, code-rollback-free
16
+ * per-consumer revert, and the universal escape for hosts that ignore
17
+ * `.claude/agents/`. Flipping it off never drops a gate: the fallback is the
18
+ * full-closure agent that ran before M7-B.
19
+ *
20
+ * `delivery.routing.freshCriticSampleRate` is the **maker-checker sampling
21
+ * floor** (Epic #4478, M7-B, Part 2). Risk-routed ceremony sends a low-risk
22
+ * acceptance cluster down the contract-identical *inline* critic path, but a
23
+ * fraction of low-risk clusters are still forced through a *fresh-context*
24
+ * critic so "low risk" never degrades to zero independent checking. The rate is
25
+ * clamped into `[0, 1]`; `0` disables the floor (pure risk routing), `1` forces
26
+ * every cluster fresh. The default is `0.2`. See `resolveCeremonyForRisk` in
27
+ * `lib/orchestration/ceremony-routing.js`.
28
+ *
29
+ * Framework-defaults pattern mirrors `lib/config/ci.js#getCiDelivery`.
30
+ */
31
+
32
+ export const DELIVERY_ROUTING_DEFAULTS = Object.freeze({
33
+ roleScopedAgents: true,
34
+ freshCriticSampleRate: 0.2,
35
+ /** @type {'minimal'|'standard'|'strict'} */
36
+ ceremonyProfile: 'standard',
37
+ /**
38
+ * When true (default), attended `/deliver` lands through merge in one
39
+ * close (`--wait-merge` semantics) instead of stopping at `agent::closing`.
40
+ * Operators opt out per-run with `--no-wait-merge`.
41
+ */
42
+ closeAndLand: true,
43
+ });
44
+
45
+ /**
46
+ * Clamp a candidate sample rate into `[0, 1]`. Non-finite / non-number inputs
47
+ * fall back to the framework default so a degraded config never yields a
48
+ * NaN-driven or out-of-range floor.
49
+ *
50
+ * @param {unknown} value
51
+ * @returns {number}
52
+ */
53
+ function clampSampleRate(value) {
54
+ if (typeof value !== 'number' || !Number.isFinite(value)) {
55
+ return DELIVERY_ROUTING_DEFAULTS.freshCriticSampleRate;
56
+ }
57
+ if (value < 0) return 0;
58
+ if (value > 1) return 1;
59
+ return value;
60
+ }
61
+
62
+ /**
63
+ * Normalize ceremony profile; unknown values → `standard`.
64
+ *
65
+ * @param {unknown} value
66
+ * @returns {'minimal'|'standard'|'strict'}
67
+ */
68
+ function normalizeCeremonyProfile(value) {
69
+ if (value === 'minimal' || value === 'standard' || value === 'strict') {
70
+ return value;
71
+ }
72
+ return DELIVERY_ROUTING_DEFAULTS.ceremonyProfile;
73
+ }
74
+
75
+ /**
76
+ * Read the merged `delivery.routing` block, applying framework defaults for
77
+ * any field the operator omitted. Accepts the full resolved config, the bare
78
+ * `delivery` bag, or the bare `routing` bag — mirroring `getCiDelivery`'s
79
+ * tolerant unwrap so callers can pass whichever shape they hold.
80
+ *
81
+ * @param {object | null | undefined} config
82
+ * @returns {{
83
+ * roleScopedAgents: boolean,
84
+ * freshCriticSampleRate: number,
85
+ * ceremonyProfile: 'minimal'|'standard'|'strict',
86
+ * closeAndLand: boolean,
87
+ * }}
88
+ */
89
+ export function getDeliveryRouting(config) {
90
+ const routing = config?.delivery?.routing ?? config?.routing ?? config ?? {};
91
+ return {
92
+ roleScopedAgents:
93
+ typeof routing.roleScopedAgents === 'boolean'
94
+ ? routing.roleScopedAgents
95
+ : DELIVERY_ROUTING_DEFAULTS.roleScopedAgents,
96
+ freshCriticSampleRate: clampSampleRate(routing.freshCriticSampleRate),
97
+ ceremonyProfile: normalizeCeremonyProfile(routing.ceremonyProfile),
98
+ closeAndLand:
99
+ typeof routing.closeAndLand === 'boolean'
100
+ ? routing.closeAndLand
101
+ : DELIVERY_ROUTING_DEFAULTS.closeAndLand,
102
+ };
103
+ }
@@ -90,6 +90,8 @@ const KEY_MEANINGS = Object.freeze({
90
90
  'github.projectOwner': 'Owner of the GitHub Projects board.',
91
91
  'github.operatorHandle':
92
92
  'GitHub @handle mentioned when a run needs operator attention.',
93
+ 'github.defaultTimeoutMs':
94
+ 'Default timeout (ms) for GitHub CLI / API calls when a caller does not supply one.',
93
95
  'github.branchProtection.enforce':
94
96
  'Whether the framework applies branch-protection rules.',
95
97
  'github.branchProtection.requiredChecks':
@@ -126,28 +128,28 @@ const KEY_MEANINGS = Object.freeze({
126
128
  'How many recent commits the snapshot summarizes.',
127
129
  'planning.riskHeuristics':
128
130
  'Phrases that flag a Story as high-risk for HITL escalation.',
129
- 'planning.taskSizing.softAcceptanceCount':
130
- 'Acceptance-criteria count above which a Story is flagged as large (advisory-only — there is no hard acceptance ceiling).',
131
- 'planning.taskSizing.softFiles':
132
- 'Touched-file count above which a Story is flagged as large.',
133
- 'planning.taskSizing.hardFiles':
134
- 'Touched-file count above which a Story is rejected unless it declares `wide` with a reason.',
135
131
  'planning.failOnSharedEditors':
136
132
  'Whether shared-editor conflict findings are promoted to hard errors.',
137
133
  'planning.requireExplicitCrossStoryDeps':
138
134
  'Whether implicit cross-Story dependencies are promoted to hard errors.',
135
+ 'planning.failOnRegistryConflicts':
136
+ 'Whether cross-cutting registry conflict findings are promoted to hard errors.',
137
+ 'planning.failOnLargeFanOut':
138
+ 'Whether large fan-out findings are promoted to hard errors.',
139
+ 'planning.largeFanOutThreshold':
140
+ 'Story count above which a plan is flagged as a large fan-out.',
141
+ 'planning.crossCuttingRegistries':
142
+ 'Glob patterns naming cross-cutting registry files the planner conflict-checks.',
143
+ 'planning.navigation.routeGlobs':
144
+ 'Glob patterns marking paths that add a user-facing route (plan-time reachability gate).',
145
+ 'planning.navigation.navRegistry':
146
+ 'Tokens identifying the nav-registry SSOT a route-adding Story is expected to reference.',
139
147
 
140
148
  // delivery.*
141
149
  'delivery.execution.timeoutMs':
142
150
  'Per-execution timeout for orchestrated delivery steps.',
143
- 'delivery.maxTokenBudget':
144
- 'Cap on the hydrated task-prompt size handed to an agent.',
145
151
  'delivery.lease.ttlMs':
146
152
  'Time-to-live for the Epic lease before a stale claim is reclaimable.',
147
- 'delivery.ci.skipForStoryPushes':
148
- 'Whether Story-branch pushes carry a [skip ci] trailer.',
149
- 'delivery.ci.earlyPr':
150
- 'Whether /deliver opens the Epic PR early so CI warms during later waves.',
151
153
  'delivery.ci.watch.pollIntervalMs':
152
154
  'Poll cadence (ms) for the merge/CI watch loop.',
153
155
  'delivery.ci.watch.maxPolls':
@@ -156,22 +158,10 @@ const KEY_MEANINGS = Object.freeze({
156
158
  'Maximum times the CI watch may resume after a transient stall.',
157
159
  'delivery.ci.autoMerge':
158
160
  'Merge posture: trust-ci merges on green checks; strict also requires a clean review gate.',
159
- 'delivery.preflight.maxStories':
160
- 'Pre-dispatch ceiling on estimated Story count (no cap when unset).',
161
- 'delivery.preflight.maxWaves':
162
- 'Pre-dispatch ceiling on estimated wave count.',
163
- 'delivery.preflight.maxInstallCostSeconds':
164
- 'Pre-dispatch ceiling on estimated dependency-install seconds.',
165
- 'delivery.preflight.maxGithubApiRequests':
166
- 'Pre-dispatch ceiling on estimated GitHub API request volume.',
167
- 'delivery.preflight.maxClaudeQuotaTokens':
168
- 'Pre-dispatch ceiling on estimated Claude quota-token burn.',
169
161
  'delivery.docsFreshness.paths':
170
162
  'Docs whose freshness is checked at delivery time.',
171
163
  'delivery.deliverRunner.concurrencyCap':
172
164
  'Maximum Stories dispatched in parallel within one wave. Default 3 — conservative by design to keep host-quota consumption predictable. Operators running wide-wave Epics with adequate parallel-agent quota should raise this to reduce wall-clock time proportionally.',
173
- 'delivery.deliverRunner.progressReportIntervalSec':
174
- 'Cadence for delivery progress reporting.',
175
165
  'delivery.deliverRunner.verifyConcurrencyCap':
176
166
  'Maximum verify steps run in parallel.',
177
167
  'delivery.worktreeIsolation.enabled':
@@ -179,17 +169,19 @@ const KEY_MEANINGS = Object.freeze({
179
169
  'delivery.worktreeIsolation.root':
180
170
  'Directory under which per-Story worktrees are created.',
181
171
  'delivery.worktreeIsolation.nodeModulesStrategy':
182
- 'How node_modules is provisioned per worktree.',
172
+ 'How node_modules is provisioned per worktree (default clone on darwin/linux; per-worktree on win32).',
183
173
  'delivery.worktreeIsolation.primeFromPath':
184
174
  'Source path a worktree primes its node_modules from.',
185
175
  'delivery.worktreeIsolation.allowSymlinkOnWindows':
186
176
  'Whether symlink node_modules strategy is allowed on Windows.',
187
177
  'delivery.worktreeIsolation.reapOnSuccess':
188
178
  'Whether a worktree is removed after a Story closes cleanly.',
189
- 'delivery.worktreeIsolation.reapOnCancel':
190
- 'Whether a worktree is removed after a cancelled run.',
191
179
  'delivery.worktreeIsolation.bootstrapFiles':
192
- 'Files copied into each new worktree (e.g. .env, .mcp.json).',
180
+ 'Files copied into each new worktree (e.g. .env, .mcp.json, local overrides).',
181
+ 'delivery.mergeWatch.intervalSeconds':
182
+ 'Poll cadence (seconds) for MergeWatcher after epic.merge.armed.',
183
+ 'delivery.mergeWatch.maxBudgetSeconds':
184
+ 'Wall-clock budget (seconds) before MergeWatcher surfaces budget-exceeded.',
193
185
  'delivery.codeReview.providers':
194
186
  'Ordered provider chain the code-review phase consults.',
195
187
  'delivery.codeReview.maxFixAttempts':
@@ -198,12 +190,34 @@ const KEY_MEANINGS = Object.freeze({
198
190
  'Maximum files an auto-fix may touch in one attempt.',
199
191
  'delivery.codeReview.autoFixSeverity':
200
192
  'Severity threshold for on-branch code-review remediation (medium fixes 🔴/🟠/🟡, high fixes 🔴/🟠 only; default medium).',
201
- 'delivery.epicAudit.autoFixSeverity':
202
- 'Severity threshold for on-branch epic-audit remediation (medium fixes 🔴/🟠/🟡, high fixes 🔴/🟠 only; default medium).',
193
+ 'delivery.routing.roleScopedAgents':
194
+ 'Whether delivery spawns boot on role-scoped .claude/agents/<role>.md contexts.',
195
+ 'delivery.routing.freshCriticSampleRate':
196
+ 'Fraction of low-risk acceptance clusters forced through a fresh-context critic (maker-checker floor).',
197
+ 'delivery.routing.ceremonyProfile':
198
+ 'Acceptance-ceremony depth: minimal (always inline), standard (risk-routed), or strict (always fresh).',
199
+ 'delivery.routing.closeAndLand':
200
+ 'When true, single-story-close lands through merge in one close (opt out with --no-wait-merge).',
201
+ 'delivery.feedbackLoop.auditResultsAutoFile':
202
+ 'When true, auto-file non-blocking audit findings as follow-up issues.',
203
+ 'delivery.feedbackLoop.retroProposals':
204
+ 'When true, auto-file actionable retro proposals as follow-up issues.',
205
+ 'delivery.quality.formatAutofix.timeoutMs':
206
+ 'Bounded timeout (ms) for the close-time format autofix spawn.',
207
+ 'delivery.quality.requireBaselines':
208
+ 'When true, absent baseline artifacts fail close-validation instead of skipping cleanly.',
209
+ 'delivery.quality.navigability.routeGlobs':
210
+ 'Glob patterns marking user-facing routes for the navigability lens / journey gate.',
211
+ 'delivery.quality.navigability.navRegistry':
212
+ 'Tokens identifying the nav-registry SSOT the navigability lens expects.',
213
+ 'delivery.quality.navigability.journeySuite':
214
+ 'Optional journey-suite path the post-wave navigability integration gate runs.',
203
215
  'delivery.refactorStage.enabled':
204
216
  'Whether a dedicated refactor stage runs during delivery.',
205
217
  'delivery.acceptanceEval.maxRounds':
206
218
  'Redraft rounds the per-Story acceptance self-eval loop runs before escalating to agent::blocked (default 2; clamped to a hard ceiling that cannot be disabled).',
219
+ 'delivery.acceptanceEval.clusterCeiling':
220
+ 'Max acceptance criteria one single-delivery acceptance critic scores per fresh-context pass; the Epic ACs are split into ceil(totalACs / clusterCeiling) maker-blind critic clusters (default 4; clamped to [1, 8]).',
207
221
 
208
222
  // qa.*
209
223
  'qa.featureRoot': 'Root directory holding the QA harness .feature files.',
@@ -238,11 +252,19 @@ const PREFIX_MEANINGS = Object.freeze([
238
252
  ],
239
253
  ['delivery.quality', 'Delivery-time quality configuration.'],
240
254
  ['delivery.signals', 'Threshold for a delivery friction/telemetry signal.'],
241
- ['delivery.lifecycle.timeouts', 'Timeout for a lifecycle-bus phase.'],
242
- ['delivery.lifecycle', 'Lifecycle-bus configuration.'],
255
+ ['delivery.mergeWatch', 'MergeWatcher poll cadence and wall-clock budget.'],
243
256
  [
244
- 'planning.taskSizing',
245
- 'Story-sizing threshold for the decompose validator.',
257
+ 'delivery.feedbackLoop',
258
+ 'Opt-out toggles for auto-filing non-blocking findings.',
259
+ ],
260
+ [
261
+ 'delivery.routing',
262
+ 'Delivery-spawn routing and acceptance-ceremony profile.',
263
+ ],
264
+ ['delivery.ci', 'CI-aware delivery namespace (watch, auto-merge).'],
265
+ [
266
+ 'planning.navigation',
267
+ 'Plan-time navigability reachability gate (route globs + nav registry).',
246
268
  ],
247
269
  [
248
270
  'qa.environments',
@@ -261,8 +283,7 @@ const BLOCK_MEANINGS = Object.freeze({
261
283
  project: 'Project identity, paths, and command configuration.',
262
284
  github: 'GitHub provider identity and merge/notification policy.',
263
285
  planning: 'Inputs and guardrails for /epic-plan.',
264
- delivery:
265
- 'Execution, isolation, quality, and lifecycle settings for delivery.',
286
+ delivery: 'Execution, isolation, quality, and CI settings for delivery.',
266
287
  qa: 'Agent-driven QA harness contract.',
267
288
  });
268
289
 
@@ -6,24 +6,18 @@
6
6
  * `planning.*` and `delivery.*`:
7
7
  *
8
8
  * - `planning.context.{maxBytes, summaryMode}` (planning-context budget)
9
- * - `delivery.maxTokenBudget` (task-prompt hydration cap)
10
9
  * - `delivery.execution.timeoutMs` (per-process execution timeout)
11
10
  * - `delivery.lease.ttlMs` (assignee-as-lease staleness window — Story #3480)
12
- * - `delivery.signals.{hotspot, rework, retry}` (performance-signal
13
- * detector thresholds — `churn` and `idle` dropped)
11
+ * - `delivery.signals.{rework, retry}` (performance-signal detector
12
+ * thresholds — `hotspot` retired with Epic #4406; `churn`/`idle` dropped)
14
13
  *
15
- * `maxTickets` (the decomposer reviewability budget) is a **framework
16
- * constant** — Story #4163 collapsed the never-overridden
17
- * `planning.maxTickets` operator knob to `LIMITS_DEFAULTS.maxTickets` and
18
- * removed it from the AJV schema, the published mirror, and the explain
19
- * map. The persist-time over-budget gate (ADR-20260610) still reads the
20
- * constant via `getLimits(config).maxTickets`; `resolveLimits` no longer
21
- * reads `planning.maxTickets`, so setting it in a config is inert.
14
+ * Framework constants (not operator-tunable via `.agentrc.json`):
15
+ * - `maxTickets`decomposer reviewability budget (Story #4163)
22
16
  *
23
- * Dropped entirely: `maxInstructionSteps`, `friction.*` (the LLM
24
- * self-pacing thresholds rewritten as qualitative prose in
25
- * `.agents/instructions.md`), `executionMaxBuffer` (now a framework-internal
26
- * constant in the spawn caller modules), `signals.{churn, idle}`.
17
+ * Dropped entirely: `maxInstructionSteps`, `friction.*`, `executionMaxBuffer`,
18
+ * `signals.{churn, idle}`, `delivery.preflight`, `delivery.maxTokenBudget`
19
+ * (planning no longer sizes against a token-budget envelope; session-mass
20
+ * ceilings are absolute in `DEFAULT_MODEL_CAPACITY`).
27
21
  *
28
22
  * The historic combined accessor `getLimits(config)` is preserved as a
29
23
  * compatibility surface: it returns a wrapper carrying the surviving
@@ -31,14 +25,12 @@
31
25
  * working. New call sites should prefer the specific accessors below.
32
26
  */
33
27
 
34
- import { getPreflight } from './preflight.js';
35
-
36
28
  /**
37
- * Framework defaults for the performance-signal detector thresholds. The two
38
- * dropped detectors (`churn`, `idle`) are omitted entirely.
29
+ * Framework defaults for the performance-signal detector thresholds.
30
+ * `hotspot` was retired with its detector (Epic #4406); `churn` and `idle`
31
+ * were dropped earlier.
39
32
  */
40
33
  export const SIGNALS_DEFAULTS = Object.freeze({
41
- hotspot: Object.freeze({ p95Multiplier: 1.25 }),
42
34
  rework: Object.freeze({ editsPerFile: 5 }),
43
35
  retry: Object.freeze({ repeatCount: 3 }),
44
36
  });
@@ -53,17 +45,10 @@ export const SIGNALS_DEFAULTS = Object.freeze({
53
45
  export const LEASE_TTL_MS_DEFAULT = 900000;
54
46
 
55
47
  /**
56
- * Framework defaults for the surviving limits surface. `executionTimeoutMs`
57
- * bumps from 5 min to 10 min per the Story 1 decisions log.
58
- *
59
- * `maxTokenBudget` is a **single global value** (Story #3875 — raised once
60
- * from 200000 to 300000 so capability-sized Stories are not clipped by
61
- * hydration elision). There is intentionally no per-profile or
62
- * per-complexity budget branch anywhere in the resolver.
48
+ * Framework defaults for the surviving limits surface.
63
49
  */
64
50
  export const LIMITS_DEFAULTS = Object.freeze({
65
51
  maxTickets: 80,
66
- maxTokenBudget: 300000,
67
52
  executionTimeoutMs: 600000,
68
53
  leaseTtlMs: LEASE_TTL_MS_DEFAULT,
69
54
  planningContext: Object.freeze({
@@ -79,7 +64,7 @@ export const LIMITS_DEFAULTS = Object.freeze({
79
64
  * operator can override a single threshold without re-listing the others.
80
65
  *
81
66
  * @param {object|undefined} userSignals
82
- * @returns {{ hotspot: {p95Multiplier: number}, rework: {editsPerFile: number}, retry: {repeatCount: number} }}
67
+ * @returns {{ rework: {editsPerFile: number}, retry: {repeatCount: number} }}
83
68
  */
84
69
  function mergeSignals(userSignals) {
85
70
  const user =
@@ -97,16 +82,14 @@ function mergeSignals(userSignals) {
97
82
 
98
83
  /**
99
84
  * Resolve the surviving limits surface against a `.agentrc.json` shape
100
- * (post-reshape). Accepts the resolved-config wrapper or a partial bag —
101
- * `maxTickets` is the framework constant `LIMITS_DEFAULTS.maxTickets`
102
- * (no longer operator-configurable; Story #4163), pulls `planningContext`
103
- * from `planning.*`, pulls `maxTokenBudget` and `executionTimeoutMs` from
104
- * `delivery.*`, pulls signals from `delivery.signals.*`.
85
+ * (post-reshape). `maxTickets` is a framework constant (never read from
86
+ * config); pulls `planningContext` from `planning.*`, pulls
87
+ * `executionTimeoutMs` from `delivery.*`, pulls signals from
88
+ * `delivery.signals.*`.
105
89
  *
106
90
  * @param {object|undefined} config
107
91
  * @returns {{
108
92
  * maxTickets: number,
109
- * maxTokenBudget: number,
110
93
  * executionTimeoutMs: number,
111
94
  * leaseTtlMs: number,
112
95
  * planningContext: { maxBytes: number, summaryMode: string },
@@ -133,11 +116,7 @@ export function resolveLimits(config) {
133
116
  const lease =
134
117
  delivery.lease && typeof delivery.lease === 'object' ? delivery.lease : {};
135
118
  return {
136
- // `maxTickets` is a framework constant (Story #4163) — never read from
137
- // `planning.maxTickets`. The persist-time over-budget gate still reads
138
- // this value via getLimits().maxTickets.
139
119
  maxTickets: LIMITS_DEFAULTS.maxTickets,
140
- maxTokenBudget: delivery.maxTokenBudget ?? LIMITS_DEFAULTS.maxTokenBudget,
141
120
  executionTimeoutMs:
142
121
  execution.timeoutMs ?? LIMITS_DEFAULTS.executionTimeoutMs,
143
122
  leaseTtlMs: lease.ttlMs ?? LIMITS_DEFAULTS.leaseTtlMs,
@@ -173,26 +152,6 @@ export function getSignals(config) {
173
152
  return getLimits(config).signals;
174
153
  }
175
154
 
176
- /**
177
- * Resolve the configured `delivery.preflight.max*` ceilings as a plain
178
- * object holding **only** the keys the operator actually configured
179
- * (Story #3875 — plan-time/delivery-time reconciliation). Unconfigured
180
- * ceilings (`null` floors, meaning "no cap") are omitted entirely so the
181
- * decomposition context can thread a compact, non-null envelope to the
182
- * planner. An Epic on a zero-config project yields `{}` — never `null`.
183
- *
184
- * @param {object | null | undefined} config
185
- * @returns {Record<string, number>}
186
- */
187
- export function resolvePreflightCeilings(config) {
188
- const resolved = getPreflight(config);
189
- const ceilings = {};
190
- for (const [key, value] of Object.entries(resolved)) {
191
- if (value !== null) ceilings[key] = value;
192
- }
193
- return ceilings;
194
- }
195
-
196
155
  /**
197
156
  * Resolve the assignee-as-lease TTL in milliseconds (Story #3480). Standalone
198
157
  * accessor so the `ticket-lease` module can import it without dragging the
@@ -32,7 +32,6 @@ export const PATHS_DEFAULTS = Object.freeze({
32
32
  * auditOutputDir: string,
33
33
  * scriptsRoot: string,
34
34
  * workflowsRoot: string,
35
- * personasRoot: string,
36
35
  * schemasRoot: string,
37
36
  * skillsRoot: string,
38
37
  * templatesRoot: string,
@@ -53,7 +52,6 @@ export function resolvePaths(userPaths) {
53
52
  auditOutputDir: `${tempRoot}/audits`,
54
53
  scriptsRoot: `${agentRoot}/scripts`,
55
54
  workflowsRoot: `${agentRoot}/workflows`,
56
- personasRoot: `${agentRoot}/personas`,
57
55
  schemasRoot: `${agentRoot}/schemas`,
58
56
  skillsRoot: `${agentRoot}/skills`,
59
57
  templatesRoot: `${agentRoot}/templates`,
@@ -57,7 +57,7 @@ const DEFAULT_COVERAGE_FLOORS = Object.freeze({
57
57
  '*': Object.freeze({ lines: 90, branches: 85, functions: 90 }),
58
58
  });
59
59
  const DEFAULT_CRAP_FLOORS = Object.freeze({
60
- '*': Object.freeze({ crap: 20 }),
60
+ '*': Object.freeze({ max: 30, p95: 20, methodsAbove20: 50 }),
61
61
  });
62
62
  /**
63
63
  * Story #2193 — maintainability rollups expose the `min` / `p50` / `p95`
@@ -1,10 +1,12 @@
1
1
  /**
2
2
  * Runner accessor (Epic #1720 Story #1739 — top-level reshape).
3
3
  *
4
- * Post-reshape, only `delivery.deliverRunner`, `delivery.epicAudit`, and
5
- * `delivery.codeReview` are configurable; everything else lives in
6
- * framework-internal constants exported alongside (`DEFAULT_STORY_MERGE_RETRY`,
7
- * `DEFAULT_DECOMPOSER`).
4
+ * Post-reshape, only `delivery.deliverRunner` and `delivery.codeReview` are
5
+ * configurable via this accessor; everything else lives in framework-internal
6
+ * constants exported alongside (`DEFAULT_STORY_MERGE_RETRY`,
7
+ * `DEFAULT_DECOMPOSER`). `delivery.epicAudit` was removed on v2 (Story-only
8
+ * delivery — no epic-audit runner; remediation policy lives on
9
+ * `delivery.codeReview`).
8
10
  */
9
11
 
10
12
  /** Hardcoded story-merge retry policy (was `orchestration.runners.storyMergeRetry`). */
@@ -23,14 +25,13 @@ export const DEFAULT_DECOMPOSER = Object.freeze({
23
25
  * `delivery.deliverRunner.*` in `.agentrc.json`.
24
26
  *
25
27
  * **Throughput tradeoff — `concurrencyCap`.**
26
- * The default of 3 is intentionally conservative: it keeps host-quota
27
- * consumption low for Epics with small waves and avoids saturating the
28
- * GitHub API with concurrent label writes. For wide-wave Epics where the
29
- * host has adequate parallel-agent quota, operators should raise
30
- * `delivery.deliverRunner.concurrencyCap` wall-clock time falls
31
- * proportionally to the extra concurrency. The safe default is a tuning
32
- * knob, not a performance ceiling. See `helpers/deliver-epic.md` § Phase 2b and
33
- * `agentrc-reference.json` `delivery.deliverRunner.concurrencyCap` for details.
28
+ * The default of 3 is intentionally moderate: it keeps host-quota
29
+ * consumption predictable for multi-Story plan-runs and avoids saturating
30
+ * the GitHub API with concurrent label writes, while still allowing a
31
+ * small ready-set fan-out. Operators who want strictly sequential delivery
32
+ * should set `delivery.deliverRunner.concurrencyCap: 1`. Raising the cap
33
+ * reduces wall-clock time where dependencies allow. See `deliver.md` and
34
+ * `agentrc-reference.json` `delivery.deliverRunner.concurrencyCap`.
34
35
  *
35
36
  * **`verifyConcurrencyCap`** (Epic #3019 Tech Spec §1.4 / Story #3024) is a
36
37
  * separate knob that bounds the `verifyWaveResults` loop independently of
@@ -39,35 +40,14 @@ export const DEFAULT_DECOMPOSER = Object.freeze({
39
40
  */
40
41
  const DEFAULT_DELIVER_RUNNER = Object.freeze({
41
42
  concurrencyCap: 3,
42
- progressReportIntervalSec: 120,
43
43
  verifyConcurrencyCap: 4,
44
44
  });
45
45
 
46
46
  /**
47
- * Default auto-fix loop ceilings for /deliver Phase 4 (epic-audit)
48
- * and Phase 5 (code-review). Operators override via
49
- * `delivery.epicAudit.*` and `delivery.codeReview.*` in `.agentrc.json`
50
- * (Story #2611, Epic #2586).
51
- *
52
- * `autoFixSeverity` is **tier-aware** (Story #4412, Epic #4405). The
53
- * Epic-close audit tier (`DEFAULT_EPIC_AUDIT`) defaults to `'high'` —
54
- * remediating only 🔴 Critical + 🟠 High findings on-branch while 🟡 Medium
55
- * and 🟢 Suggestion findings graduate to follow-up issues. This is the
56
- * three-tier model's slim outermost tier: 🟡 Medium code-quality concerns are
57
- * already routed into on-branch remediation shift-left (the write-time
58
- * checklist threading of Story #4410 and the Story-scope local-lens pass of
59
- * Story #4409), so the Epic-close tier stops paying to re-remediate them where
60
- * a fix is most expensive. The code-review tier (`DEFAULT_CODE_REVIEW`) keeps
61
- * the `'medium'` default introduced by Story #4399. Both are hard cutovers per
62
- * `rules/git-conventions.md` — no back-compat flag; an operator opts back into
63
- * the wider routing by setting `delivery.epicAudit.autoFixSeverity: 'medium'`.
47
+ * Default auto-fix loop ceilings for /deliver code-review. Operators
48
+ * override via `delivery.codeReview.*` in `.agentrc.json` (Story #2611,
49
+ * Epic #2586; `autoFixSeverity` default `'medium'` per Story #4399).
64
50
  */
65
- export const DEFAULT_EPIC_AUDIT = Object.freeze({
66
- maxFixAttempts: 3,
67
- maxFixScopeFiles: 5,
68
- autoFixSeverity: 'high',
69
- });
70
-
71
51
  export const DEFAULT_CODE_REVIEW = Object.freeze({
72
52
  maxFixAttempts: 3,
73
53
  maxFixScopeFiles: 5,
@@ -79,8 +59,7 @@ export const DEFAULT_CODE_REVIEW = Object.freeze({
79
59
  *
80
60
  * @param {object | null | undefined} config
81
61
  * @returns {{
82
- * deliverRunner: { concurrencyCap: number, progressReportIntervalSec: number, verifyConcurrencyCap: number },
83
- * epicAudit: { maxFixAttempts: number, maxFixScopeFiles: number, autoFixSeverity: 'high'|'medium' },
62
+ * deliverRunner: { concurrencyCap: number, verifyConcurrencyCap: number },
84
63
  * codeReview: { maxFixAttempts: number, maxFixScopeFiles: number, autoFixSeverity: 'high'|'medium' },
85
64
  * storyMergeRetry: { maxAttempts: number, backoffMs: readonly number[] },
86
65
  * decomposer: { concurrencyCap: number },
@@ -88,28 +67,16 @@ export const DEFAULT_CODE_REVIEW = Object.freeze({
88
67
  */
89
68
  export function getRunners(config) {
90
69
  const deliverRunnerUser = config?.delivery?.deliverRunner ?? {};
91
- const epicAuditUser = config?.delivery?.epicAudit ?? {};
92
70
  const codeReviewUser = config?.delivery?.codeReview ?? {};
93
71
  return {
94
72
  deliverRunner: {
95
73
  concurrencyCap:
96
74
  deliverRunnerUser.concurrencyCap ??
97
75
  DEFAULT_DELIVER_RUNNER.concurrencyCap,
98
- progressReportIntervalSec:
99
- deliverRunnerUser.progressReportIntervalSec ??
100
- DEFAULT_DELIVER_RUNNER.progressReportIntervalSec,
101
76
  verifyConcurrencyCap:
102
77
  deliverRunnerUser.verifyConcurrencyCap ??
103
78
  DEFAULT_DELIVER_RUNNER.verifyConcurrencyCap,
104
79
  },
105
- epicAudit: {
106
- maxFixAttempts:
107
- epicAuditUser.maxFixAttempts ?? DEFAULT_EPIC_AUDIT.maxFixAttempts,
108
- maxFixScopeFiles:
109
- epicAuditUser.maxFixScopeFiles ?? DEFAULT_EPIC_AUDIT.maxFixScopeFiles,
110
- autoFixSeverity:
111
- epicAuditUser.autoFixSeverity ?? DEFAULT_EPIC_AUDIT.autoFixSeverity,
112
- },
113
80
  codeReview: {
114
81
  maxFixAttempts:
115
82
  codeReviewUser.maxFixAttempts ?? DEFAULT_CODE_REVIEW.maxFixAttempts,
@@ -1,21 +1,21 @@
1
1
  /**
2
- * `temp/epic-<id>/` path-resolution helper (Epic #1030 Story #1039).
2
+ * `temp/run-<id>/` path-resolution helper (Epic #1030 Story #1039).
3
3
  *
4
4
  * Single source of truth for every artifact path that lives under
5
5
  * `project.paths.tempRoot`. Every script that previously hand-rolled
6
- * a flat `temp/<artifact>-epic-<id>.<ext>` path migrates to call one of
6
+ * a flat `temp/<artifact>-run-<id>.<ext>` path migrates to call one of
7
7
  * these helpers. The Tech Spec (#1032) names this module as the cutover
8
8
  * grep target — `temp/.*-epic-` should be empty across `.agents/scripts`
9
9
  * once the migration Stories land.
10
10
  *
11
11
  * Layout:
12
- * temp/epic-<eid>/
12
+ * temp/run-<eid>/
13
13
  * ├─ techspec.md
14
14
  * ├─ manifest.md (dispatch manifest)
15
15
  * ├─ retro.md (mirror of GitHub retro at Epic close)
16
16
  * ├─ perf-report.md (analyzer output, Epic-level)
17
17
  * ├─ lifecycle.ndjson (lifecycle bus ledger)
18
- * ├─ checkpoints/... (epic-runner state store)
18
+ * ├─ checkpoints/... (pre-v2 epic-runner state store; retained layout)
19
19
  * ├─ <name> (epicArtifactPath escape hatch)
20
20
  * └─ stories/
21
21
  * └─ story-<sid>/
@@ -43,7 +43,7 @@
43
43
  * parent of `git rev-parse --git-common-dir`) rather than `process.cwd()`.
44
44
  * Without this, a story child that `cd`s into `.worktrees/story-<id>/` before
45
45
  * calling `story-phase.js` would append `story.heartbeat` records to
46
- * `<worktree>/temp/epic-N/lifecycle.ndjson`, while the `/deliver` host
46
+ * `<worktree>/temp/run-N/lifecycle.ndjson`, while the `/deliver` host
47
47
  * (running from the main checkout) reads the main-checkout copy — so the
48
48
  * idle-watchdog never sees heartbeats and the Epic-lease guard silently
49
49
  * reclaims live foreign claims (the audit-#3513 bug class). Anchoring the
@@ -206,18 +206,23 @@ const artifactName = (name) => {
206
206
  };
207
207
 
208
208
  /**
209
- * `temp/epic-<eid>/` — every Epic-scoped artifact lives under here.
209
+ * `temp/run-<eid>/` — every Epic-scoped artifact lives under here.
210
210
  *
211
211
  * @param {number} eid
212
212
  * @param {object} [config]
213
213
  * @returns {string}
214
214
  */
215
+ export function runTempDir(rid, config) {
216
+ return path.join(anchorTempRoot(tempRootFrom(config)), `run-${epicId(rid)}`);
217
+ }
218
+
219
+ /** @deprecated Use {@link runTempDir}. */
215
220
  export function epicTempDir(eid, config) {
216
- return path.join(anchorTempRoot(tempRootFrom(config)), `epic-${epicId(eid)}`);
221
+ return runTempDir(eid, config);
217
222
  }
218
223
 
219
224
  /**
220
- * `temp/epic-<eid>/stories/story-<sid>/` — every Story-scoped artifact
225
+ * `temp/run-<eid>/stories/story-<sid>/` — every Story-scoped artifact
221
226
  * lives under here.
222
227
  *
223
228
  * Story #2874: accepts `eid === null` for standalone Stories (no
@@ -246,7 +251,7 @@ export function storyTempDir(eid, sid, config) {
246
251
  }
247
252
 
248
253
  /**
249
- * `temp/epic-<eid>/stories/story-<sid>/signals.ndjson` — append-only
254
+ * `temp/run-<eid>/stories/story-<sid>/signals.ndjson` — append-only
250
255
  * signal stream consumed by the analyzer (Epic #1030 AC1).
251
256
  *
252
257
  * @param {number} eid
@@ -259,18 +264,18 @@ export function signalsFile(eid, sid, config) {
259
264
  }
260
265
 
261
266
  /**
262
- * `temp/epic-<eid>/stories/story-<sid>/lifecycle.ndjson` — the story-scope
267
+ * `temp/run-<eid>/stories/story-<sid>/lifecycle.ndjson` — the story-scope
263
268
  * ledger destination for lifecycle events emitted directly by a Story
264
269
  * (rather than routed through the Epic-scoped bus ledger). Story #4426
265
270
  * (Epic #4425) introduces the first consumer: a standalone
266
271
  * `single-story-close` run (no parent Epic) emitting `merge.unlanded`
267
- * needs an on-disk home even though there is no `epic-<id>/` directory to
272
+ * needs an on-disk home even though there is no `run-<id>/` directory to
268
273
  * anchor the event to.
269
274
  *
270
275
  * Mirrors `epicLedgerPath` exactly, one level down: `eid === null` routes
271
276
  * through `storyTempDir`'s standalone branch to
272
277
  * `<tempRoot>/standalone/stories/story-<sid>/lifecycle.ndjson`; a real
273
- * `eid` routes to `<tempRoot>/epic-<eid>/stories/story-<sid>/lifecycle.ndjson`,
278
+ * `eid` routes to `<tempRoot>/run-<eid>/stories/story-<sid>/lifecycle.ndjson`,
274
279
  * so an Epic-attached Story's story-scope ledger sits alongside its
275
280
  * `signals.ndjson` sibling.
276
281
  *
@@ -324,7 +329,7 @@ export const epicPerfReportPath = (eid, config) =>
324
329
  epicArtifactPath(eid, 'perf-report.md', config);
325
330
 
326
331
  /**
327
- * `temp/epic-<eid>/epic-perf-report.json` — canonical JSON snapshot of
332
+ * `temp/run-<eid>/epic-perf-report.json` — canonical JSON snapshot of
328
333
  * the `epic-perf-report` payload persisted at /deliver close
329
334
  * (Epic #3019 / Story #3029 / Task #3040). When present alongside the
330
335
  * `epic-perf-report` structured comment, the report is discoverable
@@ -340,7 +345,7 @@ export const epicPerfReportJsonPath = (eid, config) =>
340
345
  epicArtifactPath(eid, 'epic-perf-report.json', config);
341
346
 
342
347
  /**
343
- * `temp/epic-<eid>/lifecycle.ndjson` — append-only lifecycle bus ledger
348
+ * `temp/run-<eid>/lifecycle.ndjson` — append-only lifecycle bus ledger
344
349
  * (Story #2510). The LedgerWriter persists every emitted/completed/failed
345
350
  * record here; the TraceLogger renders the companion markdown from it.
346
351
  *