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,19 +1,16 @@
1
1
  ---
2
2
  description: >-
3
3
  Shared include for the bounded acceptance self-eval loop run during Story
4
- delivery (both Epic-attached `epic-deliver-story` and standalone
5
- `single-story-deliver`). Defines the per-round critic mechanic; each caller
6
- supplies its own gate-decision wrapper (snapshot vs. label transitions).
4
+ delivery (`helpers/deliver-story`). Defines the per-round critic mechanic;
5
+ the caller supplies its gate-decision wrapper (label transitions).
7
6
  ---
8
7
 
9
8
  # Bounded acceptance self-eval loop (shared include)
10
9
 
11
10
  > **Include module.** Not a slash command. Referenced from
12
- > [`epic-deliver-story.md`](epic-deliver-story.md) and
13
- > [`single-story-deliver.md`](single-story-deliver.md) at their respective
14
- > Step 1a. This file is the **single prose home** for the per-round critic
15
- > mechanic; each caller layers only its own wrapper (snapshot transitions vs.
16
- > standalone label transitions, and whether to pass `--epic`).
11
+ > [`deliver-story.md`](deliver-story.md) at Step 1a. This file is the
12
+ > **single prose home** for the per-round critic mechanic; the caller layers
13
+ > only its wrapper (Story label transitions).
17
14
 
18
15
  After the implementation commits land and **before** the Story proceeds to
19
16
  close, run an explicit, **independent** eval pass that scores the working diff
@@ -25,28 +22,52 @@ satisfies *this Story's* acceptance criteria.
25
22
  The loop is **always on** (a hard cutover — there is no flag to disable it) and
26
23
  **bounded** by `delivery.acceptanceEval.maxRounds` (default 2), which the
27
24
  resolver clamps into `[1, hard ceiling]` so the cap can never be switched off or
28
- run unbounded. It is **distinct from** the Epic-level acceptance-spec
29
- reconciliation in `/deliver` Phase 7.1 (which fires once at finalize and
30
- only checks `@ac-*` Gherkin tag presence): this loop is per-Story,
31
- per-criterion, mid-delivery, and evaluates the actual work product.
25
+ run unbounded. It is **distinct from** the per-run `sibling-coherence` epilogue
26
+ step (`planRunEpilogue` for N>1): this loop is per-Story, per-criterion,
27
+ mid-delivery, and evaluates the actual work product.
32
28
 
33
29
  ## Per round
34
30
 
35
31
  1. **Eval pass (fresh context, independent of the author).** Run a **separate
36
- critic pass** — a fresh-context sub-agent (`Agent` tool,
37
- `subagent_type: general-purpose`), *not* a continuation of your implementing
38
- turn — so the evaluator does not grade its own homework.
32
+ critic pass** — a fresh-context sub-agent (`Agent` tool), *not* a
33
+ continuation of your implementing turn so the evaluator does not grade its
34
+ own homework.
39
35
 
40
- > **Inline-critic fallback (nesting-absent harness).** Dispatching the
41
- > critic as a nested `Agent` is the preferred shape — it gives genuine
42
- > fresh-context isolation and works on any harness that carries `Agent`
43
- > into sub-agents (Claude Code ≥ 2.1.202; see
44
- > [#2870](https://github.com/dsj1984/mandrel/issues/2870)). This eval loop
45
- > itself runs inside a Story delivery sub-agent, so the nested critic sits
46
- > at nesting depth 2. If the host does **not** support nested `Agent`
47
- > dispatch at that depth — the tool is absent, or a spawn attempt returns
48
- > an unsupported-capability error — do **not** stall the Story. Fall back
49
- > to authoring the verdict **inline**: in a deliberately scoped,
36
+ > **Sub-agent type + risk-routed ceremony (Epic #4478, M7-B).** When
37
+ > `delivery.routing.roleScopedAgents` is enabled (the **default**), dispatch
38
+ > the critic with `subagent_type: acceptance-critic` it boots on the
39
+ > role-scoped [`acceptance-critic`](../../agents/acceptance-critic.md) context
40
+ > (its own system prompt, no `CLAUDE.md` @-closure) that carries the
41
+ > maker-blind invariant and the verdict schema standalone. When the
42
+ > kill-switch is **off** (`roleScopedAgents: false`), fall back to
43
+ > `subagent_type: general-purpose`.
44
+ >
45
+ > **Whether to spawn fresh at all is risk-routed** (mirrors the risk
46
+ > review-depth and risk → audit-lens routers). Resolve it per cluster with
47
+ > `resolveCeremonyForRisk` from
48
+ > [`ceremony-routing.js`](../../scripts/lib/orchestration/ceremony-routing.js)
49
+ > using the **Story's** `planningRisk.overallLevel` (or folded
50
+ > `risk-verdict`) and `delivery.routing.freshCriticSampleRate`:
51
+ > **`high`/`medium` risk → `fresh`** (spawn the critic); **`low` risk →
52
+ > `inline`** (the contract-identical inline fallback below), **except** the
53
+ > `freshCriticSampleRate` fraction of low-risk clusters the sampling floor
54
+ > forces `fresh` so low risk never means zero independent checking; **missing
55
+ > / unknown risk → `fresh` + full ceremony** (fail-safe). This chooses
56
+ > fresh-vs-inline **per cluster only — it never changes the cluster count**.
57
+ >
58
+ > **Inline-critic path (low-risk-routed OR nesting-absent harness).** The
59
+ > verdict is authored **inline** whenever the risk router above resolves to
60
+ > `inline` (a low-risk cluster not caught by the sampling floor), and also as
61
+ > a **fallback** on any harness that cannot spawn the fresh critic.
62
+ > Dispatching the critic as a nested `Agent` is the fresh-context shape and
63
+ > works on any harness that carries `Agent` into sub-agents (Claude Code ≥
64
+ > 2.1.202; see [#2870](https://github.com/dsj1984/mandrel/issues/2870)). This
65
+ > eval loop itself runs inside a Story delivery sub-agent, so the nested
66
+ > critic sits at nesting depth 2. If the host does **not** support nested
67
+ > `Agent` dispatch at that depth — the tool is absent, or a spawn attempt
68
+ > returns an unsupported-capability error — do **not** stall the Story
69
+ > regardless of the risk verdict. Author the verdict **inline**: in a
70
+ > deliberately scoped,
50
71
  > self-critical pass (re-read only the diff, the `acceptance[]` /
51
72
  > `verify[]` arrays, and the `verify[]` command output — treat the
52
73
  > implementation reasoning as untrusted and score against the criteria
@@ -75,15 +96,9 @@ per-criterion, mid-delivery, and evaluates the actual work product.
75
96
  HEAD-sha key enforces "unchanged HEAD") and pass the exact gate name:
76
97
 
77
98
  ```bash
78
- # Epic-attached Story:
79
99
  node <main-repo>/.agents/scripts/evidence-gate.js \
80
- --epic-id <epicId> --scope-id <storyId> --gate lint \
100
+ --standalone --scope-id <storyId> --gate lint \
81
101
  --worktree <worktree> -- npm run lint
82
-
83
- # Standalone Story (no parent Epic) — use --standalone, omit --epic-id:
84
- node <main-repo>/.agents/scripts/evidence-gate.js \
85
- --standalone --scope-id <storyId> --gate typecheck \
86
- --worktree <worktree> -- <resolved typecheck command>
87
102
  ```
88
103
 
89
104
  Close's `shouldSkip` then short-circuits that gate when HEAD is
@@ -97,13 +112,11 @@ per-criterion, mid-delivery, and evaluates the actual work product.
97
112
  one `{ index, criterion, verdict: met|partial|unmet, evidence,
98
113
  verifyEvidence[] }` record per acceptance item.
99
114
  2. **Decide.** Run the gate against the verdict (the caller's Step 1a names the
100
- exact invocation — standalone omits `--epic`; the Epic-attached path passes
101
- `--epic <epicId>` so the per-criterion signal lands on the Epic-scoped
102
- stream):
115
+ exact invocation — omit `--epic`):
103
116
 
104
117
  ```bash
105
118
  node <main-repo>/.agents/scripts/acceptance-eval.js \
106
- --story <storyId> [--epic <epicId>] --verdict <verdict-path>
119
+ --story <storyId> --verdict <verdict-path>
107
120
  ```
108
121
 
109
122
  The gate validates the verdict against the schema, applies the round cap,
@@ -113,11 +126,10 @@ per-criterion, mid-delivery, and evaluates the actual work product.
113
126
  close.
114
127
  - **`decision: "redraft"`** (some `partial`/`unmet`, rounds remaining) →
115
128
  exit 0. Redraft the flagged criteria (named in `unmetCriteria[]`), commit
116
- the fix, and re-run the eval pass for the next round.
129
+ the fix, and start another round.
117
130
  - **`decision: "block"`** (round cap reached, criteria still unmet) → exit
118
131
  non-zero. **Do not proceed to close.** Take the caller's blocked path
119
- (transition to `agent::blocked` / flip the snapshot to `blocked`) and post
120
- a `friction` comment naming the unmet criteria and their evidence. Never
121
- silently proceed to close.
132
+ (transition to `agent::blocked`) and post a `friction` comment naming the
133
+ unmet criteria and their evidence. Never silently proceed to close.
122
134
 
123
135
  Write the verdict files under `temp/` only — they are scratch artifacts.
@@ -1,50 +1,54 @@
1
1
  ---
2
2
  description: >-
3
- Perform a comprehensive code review of a change set scoped to either a Story
4
- branch or an Epic branch
3
+ Perform a comprehensive code review of a Story change set against main
4
+ before `/deliver` opens or merges the Story PR
5
5
  ---
6
6
 
7
7
  # Code Review (helper)
8
8
 
9
9
  > **Helper module.** Not a slash command. Invoked automatically from
10
- > `/deliver` (Story scope) and `/deliver` Phase 5 (Epic scope).
11
- > To run a review directly, invoke the parent workflow — operators do not
12
- > call this helper by hand.
10
+ > `/deliver` via `single-story-close.js`. To run a review directly, invoke
11
+ > the parent workflow — operators do not call this helper by hand.
13
12
 
14
13
  This helper performs a comprehensive code review of a change set before it
15
- is merged upstream. It runs in two scopes:
14
+ is merged to `main`. The live v2 path is **Story scope only**:
16
15
 
17
- - **Story scope** — reviews the diff between a Story branch and its parent
18
- Epic branch, before `story-close.js` merges the Story into the Epic.
19
- - **Epic scope** reviews the cumulative diff between an Epic branch and
20
- `main`, before `/deliver` opens the integration pull request.
16
+ - **Story scope** — reviews `main...story-<storyId>` (or
17
+ `project.baseBranch...story-<storyId>`) inside `single-story-close.js`
18
+ after the PR opens and before auto-merge. Findings post to the PR;
19
+ critical findings block close (`agent::blocked`).
20
+
21
+ Legacy `scope: epic` / Epic-branch review procedure (including
22
+ `epic-audit-prepare.js` / `epic-audit-recheck.js`) was removed with the
23
+ v2 Story-only cutover.
21
24
 
22
25
  **Invariant — Story-scope review runs outside the maker's LLM context.**
23
- The Story-scope review executes inside the `story-close.js` /
24
- `single-story-close.js` close subprocess, **not** in the delivering
25
- child's (maker agent's) LLM context. The close pipeline invokes it after
26
- the delivering child has exited, so the change set is reviewed by a
27
- process the maker cannot influence. The enforcing code path is
28
- [`.agents/scripts/lib/orchestration/story-close/phases/code-review.js`](../../scripts/lib/orchestration/story-close/phases/code-review.js)
29
- (invoked from `runStoryCloseLocked`; both close entry points reach it
30
- through the shared `runStoryReviewCore` spine). A future refactor MUST
31
- preserve this isolation: do not move Story-scope review into the maker's
32
- context or run it as a step of the delivering child.
26
+ The Story-scope review executes inside the `single-story-close.js` close
27
+ subprocess, **not** in the delivering child's (maker agent's) LLM context.
28
+ The close pipeline invokes it after the delivering child has exited, so
29
+ the change set is reviewed by a process the maker cannot influence. The
30
+ enforcing code path is
31
+ [`runStoryScopeReview`](../../scripts/lib/orchestration/single-story-close/phases/code-review.js)
32
+ shared
33
+ [`runStoryReviewCore`](../../scripts/lib/orchestration/story-close/phases/code-review.js).
34
+ A future refactor MUST preserve this isolation: do not move Story-scope
35
+ review into the maker's context or run it as a step of the delivering
36
+ child.
33
37
 
34
38
  > **Persona**: `architect` · **Skills**: `core/code-review-and-quality`,
35
39
  > `core/security-and-hardening`
36
40
 
37
41
  ## Argument contract
38
42
 
39
- The caller passes the following arguments (Story workflows pass
40
- `scope: story`; Epic workflows pass `scope: epic`):
43
+ The caller passes the following arguments (`/deliver` passes
44
+ `scope: story`):
41
45
 
42
46
  | Argument | Type | Required | Meaning |
43
47
  | ----------- | ------------------------------------- | -------- | ------------------------------------------------------------------------------------------------ |
44
- | `scope` | `"story"` \| `"epic"` | yes | Selects the integration-pillar diff base and the structured-comment target ticket. |
45
- | `ticketId` | integer | yes | GitHub issue number of the Story (when `scope === 'story'`) or Epic (when `scope === 'epic'`). |
46
- | `baseRef` | string (git ref) | yes | The diff base. Story scope: `epic/<epicId>`. Epic scope: `main` (or `project.baseBranch`). |
47
- | `headRef` | string (git ref) | yes | The branch tip under review. Story scope: `story-<storyId>`. Epic scope: `epic/<epicId>`. |
48
+ | `scope` | `"story"` \| `"epic"` | yes | Live path is `"story"`. `"epic"` remains only for legacy cumulative adapters. |
49
+ | `ticketId` | integer | yes | GitHub issue number of the Story (when `scope === 'story'`) or cumulative ticket (legacy `scope === 'epic'`). |
50
+ | `baseRef` | string (git ref) | yes | The diff base. Story scope: `main` (or `project.baseBranch`). Legacy cumulative scope: caller-provided base. |
51
+ | `headRef` | string (git ref) | yes | The branch tip under review. Story scope: `story-<storyId>`. Legacy cumulative scope: caller-provided head. |
48
52
  | `depth` | `"light"` \| `"standard"` \| `"deep"` | no | Risk-derived review thoroughness lever. Absent → `standard`. See **Review depth** below. |
49
53
 
50
54
  All scope-dependent behavior in this helper branches off the first four
@@ -54,18 +58,18 @@ the argument envelope.
54
58
  ### Review depth (`depth`)
55
59
 
56
60
  `depth` is the risk-derived thoroughness lever introduced by Story #3876 and
57
- made a live consumed signal end to end by Story #3937. The Epic caller
58
- (`/deliver` Phase 5) resolves it from the Epic's judged `planningRisk`
59
- envelope via
60
- [`resolveReviewDepthForEpic`](../../scripts/lib/orchestration/code-review.js)
61
- (`high` → `deep`, `low` → `light`, everything else — including a missing
62
- `epic-plan-state` checkpoint — → `standard`) and passes it in this envelope.
61
+ made a live consumed signal end to end by Story #3937. The live `/deliver`
62
+ close path resolves it from the Story's judged `planningRisk` envelope
63
+ (read from the per-Story `story-plan-state` checkpoint via
64
+ [`resolveStoryPlanningRisk`](../../scripts/lib/orchestration/story-plan-state.js);
65
+ `high` → `deep`, `low` → `light`, everything else — including a missing
66
+ checkpoint — → `standard`) and passes it into `runCodeReview`.
63
67
  `runCodeReview` forwards `depth` to every provider's `runReview` input.
64
68
 
65
69
  It is an **input-only** signal: it changes *how thorough* the review is, never
66
70
  the findings envelope (`{ status, severity, posted, report, halted,
67
71
  blockerReason }`) nor the posted `verification-results` structured-comment body. An
68
- absent or malformed `depth` is treated as `standard`, so an Epic that skipped
72
+ absent or malformed `depth` is treated as `standard`, so a Story that skipped
69
73
  `/plan` still gets a passing review with no new failure mode.
70
74
 
71
75
  How each tier changes the review protocol:
@@ -89,17 +93,13 @@ review yourself, honor the `depth` semantics above directly.
89
93
 
90
94
  ## Step 0 — Resolve Context
91
95
 
92
- 1. Resolve `[TICKET_ID]` from `ticketId` (Story or Epic depending on `scope`).
96
+ 1. Resolve `[TICKET_ID]` from `ticketId` (the Story for live `scope: story`).
93
97
  2. Resolve `[BASE_REF]` from `baseRef` and `[HEAD_REF]` from `headRef`.
94
- 3. Fetch the `[TICKET_ID]` ticket and resolve the planning context:
95
- - **Story scope** read the parent Epic from the Story body, then load
96
- the Epic body (including its `## User Stories` section and its folded
97
- Tech Spec sections).
98
- - **Epic scope** read the Epic body directly; its managed sections
99
- carry the Tech Spec.
100
- 4. Read the Epic body fully (including its Tech Spec sections) to
101
- understand the intended
102
- scope, architectural decisions, and acceptance criteria.
98
+ 3. Fetch the Story ticket and resolve the planning context from its own
99
+ body: folded `## Spec` / `## Slicing`, acceptance criteria, and the
100
+ `story-plan-state` / `risk-verdict` structured comments when present.
101
+ 4. Read that Spec fully to understand the intended scope, architectural
102
+ decisions, and acceptance criteria. Do **not** look for a parent Epic.
103
103
 
104
104
  ## Step 1 — Automated Audit (Pre-Review)
105
105
 
@@ -142,57 +142,21 @@ A diff that matches no local lens adds **no** lens work (the roster is empty and
142
142
  or materialization failure degrades to a skipped envelope and never blocks the
143
143
  close.
144
144
 
145
- Both close entry points
146
- [`runStoryCodeReview`](../../scripts/lib/orchestration/story-close/phases/code-review.js)
147
- (Epic-attached) and
145
+ The live close entry point
148
146
  [`runStoryScopeReview`](../../scripts/lib/orchestration/single-story-close/phases/code-review.js)
149
- (standalone) reach this pass through the single `runStoryReviewCore` spine, so
150
- standalone Stories gain local-lens coverage for the first time. Because the pass
151
- lives inside the close subprocess (invoked after the delivering child exits), it
152
- honors the maker-blind invariant above: a maker never runs its own local-lens
153
- review. This step does not apply to `scope: epic`, whose lens roster is the
154
- cumulative + global + risk-routed set resolved at Epic close (Step 1b).
155
-
156
- ### Step 1b — Epic-close lens roster (`scope: epic` only, Epic #4405)
157
-
158
- When `scope === 'epic'`, the cumulative Epic diff is walked **once** at close:
159
- the Epic-close lens roster is executed as **dimensions of this same review
160
- pass**, not as a separate Phase 4 walk (Story #4412 folded the standalone
161
- epic-audit lens walk into this pass). Resolve and walk the roster inline:
162
-
163
- 1. Resolve the roster via [`helpers/epic-audit.md`](epic-audit.md) Step 1 —
164
- run `epic-audit-prepare.js --gate gate3` and take its **`epicCloseLenses`**
165
- field: the slim roster of cumulative + global + risk-routed lenses, with
166
- every local-tier change-set lens excluded (routed off `resolveLensTier` in
167
- [`selectEpicCloseLenses`](../../scripts/lib/orchestration/code-review.js)).
168
- Local-tier concerns are already verified shift-left (write-time checklists +
169
- the Story-scope local-lens pass), so they are **not** re-run here.
170
- 2. Materialize each rostered lens via
171
- [`runAuditSuite`](../../scripts/lib/audit-suite/index.js) at the envelope's
172
- `depth`, applying the `{{changedFiles}}` substitution, and walk each lens's
173
- `.agents/workflows/audit-<lens>.md` procedure over the cumulative
174
- `main..epic/<epicId>` diff. Global lenses (`globalLenses`, e.g.
175
- `audit-navigability`) run against the WHOLE route tree, exempt from the
176
- change-set narrowing.
177
- 3. Fold the lens findings into this pass's severity aggregate **alongside** the
178
- Step 2 review pillars — one walk of the cumulative diff, one aggregate, one
179
- `verification-results` comment (Step 4). An empty `epicCloseLenses` roster
180
- (docs-only, or every selected lens already covered shift-left, and no
181
- risk-routed lens) adds no lens dimension — the pillars still run.
182
-
183
- This step does not apply to `scope: story` (its roster is the local-tier set of
184
- Step 1a) and is skipped when `epic-audit-prepare.js` returns `degraded: true`
185
- (propagate the reason and STOP, per `epic-audit.md`).
147
+ reaches this pass through the shared `runStoryReviewCore` spine. Because
148
+ the pass lives inside the close subprocess (invoked after the delivering
149
+ child exits), it honors the maker-blind invariant above: a maker never runs
150
+ its own local-lens review.
186
151
 
187
152
  ## Step 2 — Review Pillars
188
153
 
189
154
  For each changed file, execute a strict review against four pillars. The
190
155
  second pillar (**Integration Review**) deliberately defers the security /
191
- performance / quality / coverage sweeps to the change-set-scoped lenses — at
192
- `scope: story` those ran shift-left in the Story-scope local-lens pass (Step
193
- 1a); at `scope: epic` they run inline in this same pass as the Epic-close lens
194
- roster (Step 1b). Re-walking those sweeps a second time in this pillar is
195
- duplication, not defense-in-depth.
156
+ performance / quality / coverage sweeps to the change-set-scoped lenses —
157
+ those ran shift-left in the Story-scope local-lens pass (Step 1a).
158
+ Re-walking those sweeps a second time in this pillar is duplication, not
159
+ defense-in-depth.
196
160
 
197
161
  **Apply the `depth` lever** (see **Review depth** above) to how hard you walk
198
162
  these pillars: at `light`, focus on Pillar 1 and reduce Pillars 2–3 to a quick
@@ -206,57 +170,27 @@ never reduced to a scan.
206
170
 
207
171
  ### Pillar 1: Spec Adherence
208
172
 
209
- Does the implementation match the Epic's requirements and Tech Spec architecture?
173
+ Does the implementation match the Story's acceptance criteria and folded Spec?
210
174
 
211
- - Compare each completed Story/Task against its stated acceptance criteria.
175
+ - Compare the completed Story against its stated acceptance criteria.
212
176
  - Flag any undocumented deviations, missing features, or scope creep.
213
- - Verify API contracts, data models, and interface boundaries match the Tech
214
- Spec.
177
+ - Verify API contracts, data models, and interface boundaries match the Spec.
215
178
 
216
179
  ### Pillar 2: Integration Review
217
180
 
218
- The integration view depends on `scope`. The diff under review is always
219
- `baseRef..headRef`, but the **set of upstream audit signals** to integrate
220
- against differs:
221
-
222
- - **`scope: story`** the diff is `epic/<epicId>..story-<storyId>` (i.e.
223
- one Story's contribution to the Epic). The Story-scope local-lens pass
224
- (Step 1a) has already covered the local-tier concerns; the Epic-close lens
225
- roster has not run for this change set (it runs once at Epic close). The
226
- integration view here focuses on cross-Task ripple within the Story and
227
- contract drift against the Epic branch tip. Look for:
228
- - Cross-Task contract drift inside the Story (one Task's API change vs.
229
- another Task's caller in the same branch).
230
- - Shared-module ripple effects from this Story onto siblings already
231
- merged into `epic/<epicId>`.
232
- - Spec deviations that the per-Task commits papered over.
233
-
234
- - **`scope: epic`** — the diff is `main..epic/<epicId>` (the cumulative
235
- Epic change set). The Epic-close lens roster (`epicCloseLenses`) is walked
236
- **inline as part of this pass** (Step 1b) — the cumulative diff is read once,
237
- and the security, privacy, performance, code-quality, and test-coverage
238
- findings the rostered lenses produce feed this pass's aggregate directly.
239
- There is no separate `audit-results` comment to read (Story #4412 retired it);
240
- the lens findings and the pillar findings share the single
241
- `verification-results` comment this pass posts.
242
-
243
- The integration view at epic scope is what the per-lens audits cannot
244
- produce because each lens runs in isolation:
245
-
246
- - Cross-reference 🔴 / 🟠 lens findings against the spec deviations
247
- flagged in Pillar 1 — a finding that traces back to a deliberate
248
- Tech-Spec decision is different from one that traces back to an
249
- oversight.
250
- - Look for cross-cutting concerns no single lens owns: contract drift
251
- between Stories, shared-module ripple effects, boundary changes that
252
- thread security and performance implications together.
253
- - Note any lens finding that the operator's remediation flow should
254
- bundle (e.g. one refactor closes findings from multiple lenses).
255
-
256
- If the Epic-close roster is empty (docs-only Epic, every selected lens
257
- already covered shift-left, or the pass was skipped via
258
- `--skip-epic-audit` / `--skip-code-review`), record that explicitly in the
259
- findings report and proceed — there is no lens dimension to integrate.
181
+ The diff under review is `baseRef..headRef`
182
+ (`main..story-<storyId>`, or the configured base branch to the Story
183
+ branch). The Story-scope local-lens pass (Step 1a) has already covered the
184
+ local-tier concerns. Lens findings and pillar findings share the single
185
+ `verification-results` comment this pass posts (Story #4411). The
186
+ integration view here focuses on cross-cutting ripple within the Story and
187
+ contract drift against the base branch. Look for:
188
+
189
+ - Contract drift inside the Story (one change's API edit vs. another caller
190
+ in the same branch).
191
+ - Shared-module ripple effects from this Story onto code already merged to
192
+ `main`.
193
+ - Spec deviations that individual commits papered over.
260
194
 
261
195
  ### Pillar 3: Documentation Integrity
262
196
 
@@ -333,7 +267,7 @@ prior baseline before merging.
333
267
 
334
268
  Findings are **persisted as a `verification-results` structured comment on
335
269
  the `[TICKET_ID]` issue** by `runCodeReview` (the unified findings contract of
336
- Story #4411; at `scope: epic` this single comment also carries the Step 1b
270
+ Story #4411; this single comment carries the
337
271
  Epic-close lens findings). The target ticket is the Story when
338
272
  `scope === 'story'` and the Epic when `scope === 'epic'`. The comment
339
273
  is idempotent — re-runs replace the prior one — and its body includes
@@ -483,63 +417,6 @@ escalating to the operator. Escalated findings remain on the `code-review`
483
417
  structured comment with their reason recorded, so Step 5 (and downstream
484
418
  consumers) see exactly why each one was not auto-remediated.
485
419
 
486
- ## Step 4.6 — Cross-phase re-check trigger
487
-
488
- After the focused-fix routing in Step 4.5 completes, any host-LLM-applied
489
- fix commits have modified files on `[HEAD_REF]` that the Epic-close lens
490
- roster already walked (Step 1b). Some of those edits may overlap the
491
- `filePatterns` of one or more lenses (e.g. a fix landing in `**/auth/*.js`
492
- overlaps the `audit-security` lens). When that happens, the lens findings in
493
- the `verification-results` comment are **stale for the overlapping lenses
494
- only** — the non-overlapping findings remain authoritative and MUST NOT be
495
- re-derived.
496
-
497
- > **Scope note.** This cross-phase re-check applies only when
498
- > `scope === 'epic'`. Story-scope reviews carry no Epic-close lens roster,
499
- > so there is nothing to invalidate; skip this step entirely for
500
- > `scope === 'story'`.
501
-
502
- Invoke the re-check selector with the cumulative set of paths touched by
503
- the focused-fix commits:
504
-
505
- ```powershell
506
- node .agents/scripts/epic-audit-recheck.js \
507
- --epic [TICKET_ID] --files <comma-separated-touched-paths>
508
- ```
509
-
510
- For large touched-file lists, pass `@<file>` (where `<file>` is a
511
- newline-delimited list written to `temp/`) to avoid shell argument-length
512
- limits. The CLI emits a JSON envelope of the shape
513
- `{ selectedAudits: [...], context: { ... } }` restricted to lenses whose
514
- `filePatterns` overlap the input file list. An empty `selectedAudits`
515
- array means no overlap — there is nothing to re-run and this step is a
516
- no-op.
517
-
518
- When `selectedAudits` is non-empty:
519
-
520
- 1. Re-invoke each listed lens prompt under
521
- [`../audit-*.md`](../) the same way the Step 1b Epic-close walk does —
522
- one lens at a time, against the current `[HEAD_REF]` tip.
523
- 2. **Append** a `## Cross-phase re-check` section to the **existing**
524
- `verification-results` structured comment on the Epic ticket. Do **not**
525
- post a new comment; the comment is idempotent and downstream consumers
526
- (the code-review trim, `/deliver` Pillar 2, the retro helper)
527
- read it once. The append carries the re-checked lens names, the new
528
- findings (if any), and the focused-fix commit SHAs that triggered the
529
- re-run, so reviewers can trace each finding back to the change set
530
- that produced it.
531
- 3. If the re-check surfaces fresh 🔴 / 🟠 findings, route them back
532
- through Step 4.5's focused-fix routing. Findings that already
533
- received a focused-fix attempt in the first pass do not get a fresh
534
- attempt when the cross-phase re-check resurfaces an adjacent one —
535
- leave them on the `verification-results` comment for the operator.
536
-
537
- If `selectedAudits` is empty, skip silently and proceed to Step 5. The
538
- re-check trigger is **read-only signal** — it never mutates the Epic
539
- branch on its own; mutations only happen if the re-invoked lenses
540
- surface findings that the host LLM then converts into commits through
541
- the same focused-fix routing as Step 4.5.
542
-
543
420
  ## Step 5 — Remediation
544
421
 
545
422
  If the operator instructs you to fix any findings:
@@ -576,7 +453,7 @@ to the next phase of the parent workflow.
576
453
  the scope is set by the caller, and reviewing against the wrong base
577
454
  produces either a hollow review (too small a diff) or noise (too large a
578
455
  diff that includes unrelated history).
579
- - **Always** read the Epic body and Tech Spec before reviewing code. Findings without
456
+ - **Always** read the Story body and folded Spec before reviewing code. Findings without
580
457
  spec context are noise.
581
458
  - **Never** implement fixes unless the operator explicitly requests it. The
582
459
  default mode is read-only audit.
@@ -1,18 +1,18 @@
1
1
  ---
2
2
  description: >-
3
- Reference companion to `helpers/single-story-deliver.md` — the lease and
3
+ Reference companion to `helpers/deliver-story.md` — the lease and
4
4
  sweep detail, worktree-scope warnings, CI-recovery procedures, and
5
5
  Status-column reconciliation lifted out of the runtime core so the
6
6
  always-ingested standalone-delivery prose stays lean. Not a slash command;
7
7
  consulted on demand when the core file points here.
8
- caller: helpers/single-story-deliver.md
8
+ caller: helpers/deliver-story.md
9
9
  ---
10
10
 
11
- # helpers/single-story-deliver — reference (lease, recovery, troubleshooting)
11
+ # helpers/deliver-story — reference (lease, recovery, troubleshooting)
12
12
 
13
13
  > **Not a slash command, not the runtime path.** This file is the
14
14
  > reference companion to
15
- > [`single-story-deliver.md`](single-story-deliver.md). The core file
15
+ > [`deliver-story.md`](deliver-story.md). The core file
16
16
  > carries the step flow, commands, gate contracts, and the return contract a
17
17
  > standalone-Story run needs; this file holds the lease/sweep mechanics, the
18
18
  > worktree-scope safety warning, the CI-recovery procedures, and the
@@ -85,7 +85,7 @@ The sweep applies two hardening layers (Story #2011):
85
85
  operator can see what was preserved.
86
86
  - **Cross-session lock.** The sweep acquires a process-scoped lockfile
87
87
  at `<tempRoot>/single-story-sweep.lock` before planning. On
88
- contention (another `/single-story-deliver` already in the sweep
88
+ contention (another `/deliver-story` already in the sweep
89
89
  step), this run's sweep is **skipped** with a warn log; init
90
90
  continues normally. Stale lockfiles (mtime older than the timeout)
91
91
  are treated as expired. The timeout defaults to 60 seconds and is
@@ -121,7 +121,7 @@ The `single-story-close.js` script, in order:
121
121
  1a. **Syncs the Story branch from `origin/<baseBranch>`** before push
122
122
  (Story #2580). Runs `git fetch origin <baseBranch>` followed by
123
123
  `git merge --no-edit origin/<baseBranch>` inside the worktree. This
124
- defends against the parallel-`/single-story-deliver` race: when
124
+ defends against the parallel-`/deliver-story` race: when
125
125
  multiple sessions run in parallel, the Story that auto-merges first
126
126
  bumps `baseBranch`, and without this sync the lagging Stories open
127
127
  PRs that are "behind base" and stall against branch-protection's
@@ -133,7 +133,7 @@ The `single-story-close.js` script, in order:
133
133
  command set), the Story flips to `agent::blocked`, and close
134
134
  throws. Resolve in the worktree (`git merge origin/<base>` + fix
135
135
  conflicts + `git commit --no-edit`) and re-run
136
- `/single-story-deliver`.
136
+ `/deliver-story`.
137
137
  - **Fetch failed** → close throws with the git stderr; no label
138
138
  transition.
139
139
 
@@ -162,13 +162,12 @@ The `single-story-close.js` script, in order:
162
162
  CI, went `BEHIND` base, or was closed without merging. The Story rests
163
163
  at `agent::closing` while the PR is open with auto-merge armed; the
164
164
  `agent::done` flip (which closes the issue) is deferred to Step 5.5's
165
- `single-story-confirm-merge.js`. This brings the standalone path to
166
- parity with the epic path (#2155), where a Story only reaches
167
- `agent::done` once its merge into `epic/<id>` is confirmed.
165
+ `single-story-confirm-merge.js`. A Story only reaches `agent::done` once
166
+ its PR to `main` is confirmed merged.
168
167
  5. Reaps the worktree when `delivery.worktreeIsolation.reapOnSuccess`
169
168
  is enabled.
170
169
  6. **Releases the Story lease** (Story #3483). Clears the Story assignment
171
- that init claimed so the next `/single-story-deliver` run sees an
170
+ that init claimed so the next `/deliver-story` run sees an
172
171
  unclaimed ticket. The release is a no-op when the operator no longer
173
172
  holds the claim (a later run took over via reclaim/steal), so a late
174
173
  close never yanks a live claim away from its current owner. Best-effort:
@@ -348,7 +347,7 @@ GitHub deletes the **remote** branch on auto-merge (via the
348
347
  `--delete-branch` flag `single-story-close.js` passes to `gh pr merge`).
349
348
  The **local** `story-<storyId>` ref, however, lingers in the main
350
349
  checkout until something prunes it — `single-story-init.js` runs a
351
- merged-sweep at the start of every *subsequent* `/single-story-deliver`
350
+ merged-sweep at the start of every *subsequent* `/deliver-story`
352
351
  invocation, but that's next-run cleanup, not end-of-run cleanup. Stale
353
352
  local refs accumulate between sessions, clutter `git branch`, and shadow
354
353
  the lessons the sweep is meant to surface.
@@ -415,8 +414,7 @@ prose hand-off.
415
414
  > with essential terminal state only (mirroring the fields
416
415
  > `single-story-close.js` / `story-phase.js` already emit). Do not narrate the
417
416
  > steps you took, and do not prescribe how the next stage should work. Prose
418
- > process commentary only bloats the hydrated prompt
419
- > (`delivery.maxTokenBudget` elision). When run **interactively** (no parent
417
+ > process commentary only bloats the hydrated prompt. When run **interactively** (no parent
420
418
  > aggregator), this JSON envelope is optional — relay terminal state to the
421
419
  > operator in prose instead — but the **no-park rule still holds**: never end
422
420
  > an interactive turn with an unconfirmed merge either; block on the watch,