mandrel 1.94.0 → 2.1.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 (560) hide show
  1. package/.agents/README.md +116 -99
  2. package/.agents/agents/acceptance-critic.md +9 -7
  3. package/.agents/agents/story-worker.md +45 -51
  4. package/.agents/audit-checklists/performance.md +1 -1
  5. package/.agents/docs/SDLC.md +498 -1287
  6. package/.agents/docs/agentrc-reference.json +185 -80
  7. package/.agents/docs/configuration.md +132 -190
  8. package/.agents/docs/execution-reference.md +51 -25
  9. package/.agents/docs/quality-gates.md +25 -33
  10. package/.agents/docs/workflows.md +8 -8
  11. package/.agents/instructions.md +113 -139
  12. package/.agents/rules/ci-remediation.md +11 -15
  13. package/.agents/rules/git-conventions-reference.md +48 -58
  14. package/.agents/rules/git-conventions.md +16 -22
  15. package/.agents/schemas/acceptance-eval-verdict.schema.json +1 -1
  16. package/.agents/schemas/agentrc.schema.json +83 -254
  17. package/.agents/schemas/audit-rules.json +59 -1
  18. package/.agents/schemas/audit-rules.schema.json +33 -1
  19. package/.agents/schemas/lifecycle/README.md +1 -2
  20. package/.agents/schemas/lifecycle/ledger-record.schema.json +1 -1
  21. package/.agents/schemas/lifecycle/merge.flip-failed.schema.json +33 -0
  22. package/.agents/schemas/lifecycle/merge.unlanded.schema.json +1 -0
  23. package/.agents/schemas/lifecycle/retro.end.schema.json +1 -1
  24. package/.agents/schemas/lifecycle/story.merged.schema.json +1 -1
  25. package/.agents/schemas/signal-event.schema.json +3 -3
  26. package/.agents/schemas/story-deliver-terminal.schema.json +152 -0
  27. package/.agents/schemas/validation-evidence.schema.json +1 -1
  28. package/.agents/scripts/acceptance-eval.js +22 -66
  29. package/.agents/scripts/agents-bootstrap-github.js +1 -1
  30. package/.agents/scripts/audit-to-stories.js +7 -7
  31. package/.agents/scripts/boot-sweep.js +1 -1
  32. package/.agents/scripts/bootstrap.js +3 -3
  33. package/.agents/scripts/check-dead-exports.js +43 -104
  34. package/.agents/scripts/check-doc-links.js +2 -2
  35. package/.agents/scripts/check-lifecycle-lint.js +7 -10
  36. package/.agents/scripts/check-workflow-cli-lint.js +91 -0
  37. package/.agents/scripts/cleanup-repo-test-temp.js +6 -1
  38. package/.agents/scripts/deliver-recover.js +122 -0
  39. package/.agents/scripts/drain-pending-cleanup.js +1 -1
  40. package/.agents/scripts/evidence-gate.js +20 -50
  41. package/.agents/scripts/generate-skills-index.js +17 -1
  42. package/.agents/scripts/generate-workflows-doc.js +4 -4
  43. package/.agents/scripts/lib/ITicketingProvider.js +1 -19
  44. package/.agents/scripts/lib/Logger.js +6 -10
  45. package/.agents/scripts/lib/audit-suite/runner.js +2 -2
  46. package/.agents/scripts/lib/audit-suite/selector.js +328 -28
  47. package/.agents/scripts/lib/audit-to-stories/{seed-epic-from-findings.js → seed-from-findings.js} +9 -9
  48. package/.agents/scripts/lib/baselines/kernel.js +206 -18
  49. package/.agents/scripts/lib/baselines/kinds/maintainability.js +0 -15
  50. package/.agents/scripts/lib/baselines/reader.js +1 -6
  51. package/.agents/scripts/lib/bdd-runner-detect.js +5 -9
  52. package/.agents/scripts/lib/bootstrap/ci-workflow-template.js +28 -33
  53. package/.agents/scripts/lib/bootstrap/issue-forms-template.js +32 -33
  54. package/.agents/scripts/lib/bootstrap/manifest.js +8 -11
  55. package/.agents/scripts/lib/bootstrap/project-bootstrap.js +30 -53
  56. package/.agents/scripts/lib/bootstrap/quality-bootstrap.js +0 -2
  57. package/.agents/scripts/lib/checks/core-bare-clean.js +6 -3
  58. package/.agents/scripts/lib/checks/index.js +3 -2
  59. package/.agents/scripts/lib/checks/loop-health.js +12 -11
  60. package/.agents/scripts/lib/checks/state.js +17 -248
  61. package/.agents/scripts/lib/checks/story-init-not-backgrounded.js +26 -24
  62. package/.agents/scripts/lib/checks/subagent-agent-tool-required.js +3 -4
  63. package/.agents/scripts/lib/checks/worktree-bootstrap-env.js +2 -2
  64. package/.agents/scripts/lib/checks/worktree-residue-biome.js +3 -3
  65. package/.agents/scripts/lib/cli/standard-args.js +13 -22
  66. package/.agents/scripts/lib/cli-args.js +39 -9
  67. package/.agents/scripts/lib/close-validation/gates.js +15 -15
  68. package/.agents/scripts/lib/close-validation/projections/inputs.js +7 -7
  69. package/.agents/scripts/lib/close-validation/projections/maintainability.js +12 -12
  70. package/.agents/scripts/lib/close-validation/runner.js +13 -21
  71. package/.agents/scripts/lib/close-validation/telemetry.js +17 -8
  72. package/.agents/scripts/lib/config/ci.js +6 -31
  73. package/.agents/scripts/lib/config/delivery-routing.js +52 -35
  74. package/.agents/scripts/lib/config/explain.js +61 -48
  75. package/.agents/scripts/lib/config/github.js +7 -5
  76. package/.agents/scripts/lib/config/limits.js +29 -80
  77. package/.agents/scripts/lib/config/paths.js +0 -2
  78. package/.agents/scripts/lib/config/quality.js +12 -15
  79. package/.agents/scripts/lib/config/runners.js +20 -66
  80. package/.agents/scripts/lib/config/temp-paths.js +30 -63
  81. package/.agents/scripts/lib/config/worktree-isolation.js +0 -5
  82. package/.agents/scripts/lib/config-resolver.js +2 -7
  83. package/.agents/scripts/lib/config-settings-schema-delivery.js +55 -161
  84. package/.agents/scripts/lib/config-settings-schema-quality.js +17 -16
  85. package/.agents/scripts/lib/config-settings-schema.js +100 -60
  86. package/.agents/scripts/lib/dead-exports-knip.js +105 -0
  87. package/.agents/scripts/lib/dead-exports-mode.js +51 -0
  88. package/.agents/scripts/lib/dependency-parser.js +3 -2
  89. package/.agents/scripts/lib/doc-tiers.js +2 -2
  90. package/.agents/scripts/lib/duplicate-search.js +242 -41
  91. package/.agents/scripts/lib/feedback-loop/retro-proposals-graduator.js +1 -1
  92. package/.agents/scripts/lib/findings/promote-finding.js +23 -14
  93. package/.agents/scripts/lib/format-generated-json.js +97 -0
  94. package/.agents/scripts/lib/framework-version.js +19 -190
  95. package/.agents/scripts/lib/gh-exec.js +8 -0
  96. package/.agents/scripts/lib/git-branch-cleanup.js +1 -10
  97. package/.agents/scripts/lib/git-branch-lifecycle.js +17 -180
  98. package/.agents/scripts/lib/git-utils.js +32 -20
  99. package/.agents/scripts/lib/github/framework-repo.js +6 -0
  100. package/.agents/scripts/lib/json-utils.js +1 -2
  101. package/.agents/scripts/lib/label-constants.js +10 -38
  102. package/.agents/scripts/lib/label-taxonomy.js +10 -55
  103. package/.agents/scripts/lib/observability/active-story-env.js +44 -165
  104. package/.agents/scripts/lib/observability/runtime-friction.js +243 -0
  105. package/.agents/scripts/lib/observability/signal-validator.js +4 -4
  106. package/.agents/scripts/lib/observability/signals-writer.js +6 -82
  107. package/.agents/scripts/lib/observability/source-classifier.js +5 -5
  108. package/.agents/scripts/lib/observability/tool-trace-hook.js +2 -12
  109. package/.agents/scripts/lib/onboard/init-tail.js +1 -3
  110. package/.agents/scripts/lib/orchestration/acceptance-clusters.js +1 -1
  111. package/.agents/scripts/lib/orchestration/acceptance-eval-decision.js +2 -2
  112. package/.agents/scripts/lib/orchestration/ceremony-routing.js +105 -44
  113. package/.agents/scripts/lib/orchestration/code-review.js +78 -436
  114. package/.agents/scripts/lib/orchestration/column-sync.js +1 -1
  115. package/.agents/scripts/lib/orchestration/consolidation-precondition.js +4 -4
  116. package/.agents/scripts/lib/orchestration/context-envelope.js +2 -5
  117. package/.agents/scripts/lib/orchestration/deliver-recover.js +328 -0
  118. package/.agents/scripts/lib/orchestration/detectors-phase.js +12 -6
  119. package/.agents/scripts/lib/orchestration/docs-digest.js +8 -8
  120. package/.agents/scripts/lib/orchestration/file-assumptions.js +7 -13
  121. package/.agents/scripts/lib/orchestration/git-cleanup/phases/cli.js +1 -1
  122. package/.agents/scripts/lib/orchestration/git-cleanup/phases/fast-forward.js +34 -0
  123. package/.agents/scripts/lib/orchestration/lease-guard-shared.js +3 -2
  124. package/.agents/scripts/lib/orchestration/lifecycle/emit-ledger-event.js +142 -0
  125. package/.agents/scripts/lib/orchestration/lifecycle/emit-loop-tick.js +17 -19
  126. package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-flip-failed.js +86 -0
  127. package/.agents/scripts/lib/orchestration/lifecycle/emit-merge-unlanded.js +37 -103
  128. package/.agents/scripts/lib/orchestration/lifecycle/ledger-writer.js +6 -3
  129. package/.agents/scripts/lib/orchestration/lifecycle/listeners/README.md +21 -43
  130. package/.agents/scripts/lib/orchestration/lifecycle/listeners/watcher.js +50 -85
  131. package/.agents/scripts/lib/orchestration/lifecycle/trace-logger.js +3 -14
  132. package/.agents/scripts/lib/orchestration/lint-baseline-service.js +4 -4
  133. package/.agents/scripts/lib/orchestration/merge-block-class.js +77 -21
  134. package/.agents/scripts/lib/orchestration/merge-poll.js +104 -0
  135. package/.agents/scripts/lib/orchestration/phase-runner.js +3 -2
  136. package/.agents/scripts/lib/orchestration/plan-context.js +354 -282
  137. package/.agents/scripts/lib/orchestration/plan-critic-conditions.js +11 -22
  138. package/.agents/scripts/lib/orchestration/plan-critics-evaluate.js +4 -8
  139. package/.agents/scripts/lib/orchestration/plan-metrics.js +38 -6
  140. package/.agents/scripts/lib/orchestration/plan-navigation.js +92 -0
  141. package/.agents/scripts/lib/orchestration/plan-persist/fan-out-gate.js +71 -0
  142. package/.agents/scripts/lib/orchestration/plan-persist/persist-helpers.js +245 -0
  143. package/.agents/scripts/lib/orchestration/plan-persist/plan-context-source.js +116 -0
  144. package/.agents/scripts/lib/orchestration/plan-persist/run-plan-persist.js +432 -858
  145. package/.agents/scripts/lib/orchestration/plan-persist/story-ops.js +778 -0
  146. package/.agents/scripts/lib/orchestration/plan-persist/summary.js +47 -115
  147. package/.agents/scripts/lib/orchestration/plan-persist/supersede-ops.js +509 -0
  148. package/.agents/scripts/lib/orchestration/plan-reachability.js +9 -14
  149. package/.agents/scripts/lib/orchestration/plan-runner/worktree-sweep.js +1 -1
  150. package/.agents/scripts/lib/orchestration/{epic-plan-spec/phases → planning}/authoring-context.js +52 -51
  151. package/.agents/scripts/lib/orchestration/planning/decomposer-context.js +27 -0
  152. package/.agents/scripts/lib/orchestration/{epic-plan-spec/phases → planning}/spec-authoring-grounding.js +1 -1
  153. package/.agents/scripts/lib/orchestration/pr-base-guard.js +18 -28
  154. package/.agents/scripts/lib/orchestration/remote-verifier.js +1 -1
  155. package/.agents/scripts/lib/orchestration/resolve-stories.js +344 -0
  156. package/.agents/scripts/lib/orchestration/resolves-token.js +1 -1
  157. package/.agents/scripts/lib/orchestration/retro-proposals.js +140 -79
  158. package/.agents/scripts/lib/orchestration/review-depth.js +126 -47
  159. package/.agents/scripts/lib/orchestration/review-providers/codex.js +2 -2
  160. package/.agents/scripts/lib/orchestration/review-providers/findings-renderer.js +3 -13
  161. package/.agents/scripts/lib/orchestration/review-providers/native.js +1 -154
  162. package/.agents/scripts/lib/orchestration/review-providers/review-depth.js +3 -2
  163. package/.agents/scripts/lib/orchestration/review-providers/review-provider-factory.js +21 -56
  164. package/.agents/scripts/lib/orchestration/review-providers/security-review.js +1 -1
  165. package/.agents/scripts/lib/orchestration/review-providers/types.js +5 -4
  166. package/.agents/scripts/lib/orchestration/review-providers/ultrareview.js +1 -1
  167. package/.agents/scripts/lib/orchestration/run-epilogue.js +784 -0
  168. package/.agents/scripts/lib/orchestration/single-story-close/phases/auto-merge.js +25 -1
  169. package/.agents/scripts/lib/orchestration/single-story-close/phases/base-sync.js +11 -9
  170. package/.agents/scripts/lib/orchestration/single-story-close/phases/close-validation.js +4 -4
  171. package/.agents/scripts/lib/orchestration/single-story-close/phases/code-review.js +86 -41
  172. package/.agents/scripts/lib/orchestration/single-story-close/phases/confirm-merge.js +608 -152
  173. package/.agents/scripts/lib/orchestration/single-story-close/phases/options.js +77 -32
  174. package/.agents/scripts/lib/orchestration/single-story-close/phases/post-land.js +305 -0
  175. package/.agents/scripts/lib/orchestration/single-story-close/phases/pull-request.js +1 -1
  176. package/.agents/scripts/lib/orchestration/single-story-close/phases/review-block.js +44 -0
  177. package/.agents/scripts/lib/orchestration/single-story-close/phases/worktree-reap.js +37 -4
  178. package/.agents/scripts/lib/orchestration/single-story-close/phases/wrong-tree-guard.js +2 -2
  179. package/.agents/scripts/lib/orchestration/single-story-close/runner.js +275 -46
  180. package/.agents/scripts/lib/orchestration/single-story-lease-guard.js +1 -1
  181. package/.agents/scripts/lib/orchestration/spec-freshness.js +14 -205
  182. package/.agents/scripts/lib/orchestration/spec-section-validator.js +4 -5
  183. package/.agents/scripts/lib/orchestration/spec-spill.js +60 -0
  184. package/.agents/scripts/lib/orchestration/split-policy-validator.js +188 -0
  185. package/.agents/scripts/lib/orchestration/story-close/emit-blocked.js +49 -0
  186. package/.agents/scripts/lib/orchestration/story-close/format-autofix.js +10 -10
  187. package/.agents/scripts/lib/orchestration/story-close/phases/code-review.js +28 -42
  188. package/.agents/scripts/lib/orchestration/story-deliver-terminal.js +360 -0
  189. package/.agents/scripts/lib/orchestration/story-follow-ups.js +298 -0
  190. package/.agents/scripts/lib/orchestration/story-init-remote.js +51 -0
  191. package/.agents/scripts/lib/orchestration/story-plan-state.js +33 -0
  192. package/.agents/scripts/lib/orchestration/structured-comment-parser.js +1 -1
  193. package/.agents/scripts/lib/orchestration/task-body-validator.js +60 -25
  194. package/.agents/scripts/lib/orchestration/ticket-lease.js +27 -74
  195. package/.agents/scripts/lib/orchestration/ticket-validator-conflicts.js +130 -75
  196. package/.agents/scripts/lib/orchestration/ticket-validator-sizing.js +192 -377
  197. package/.agents/scripts/lib/orchestration/ticket-validator.js +123 -25
  198. package/.agents/scripts/lib/orchestration/ticketing/bulk.js +14 -72
  199. package/.agents/scripts/lib/orchestration/ticketing/reads.js +45 -55
  200. package/.agents/scripts/lib/orchestration/ticketing/transition.js +66 -6
  201. package/.agents/scripts/lib/orchestration/ticketing.js +0 -1
  202. package/.agents/scripts/lib/plan-phase-cleanup.js +12 -14
  203. package/.agents/scripts/lib/planning-corpus.js +12 -281
  204. package/.agents/scripts/lib/preflight-runner.js +4 -4
  205. package/.agents/scripts/lib/qa/coverage-verdict.js +5 -5
  206. package/.agents/scripts/lib/qa/qa-context-hydrator.js +5 -5
  207. package/.agents/scripts/lib/signals/index.js +4 -17
  208. package/.agents/scripts/lib/signals/read.js +35 -35
  209. package/.agents/scripts/lib/signals/schema.js +8 -11
  210. package/.agents/scripts/lib/signals/span-tree.js +7 -7
  211. package/.agents/scripts/lib/signals/write.js +0 -1
  212. package/.agents/scripts/lib/single-story/story-merged-notify.js +13 -2
  213. package/.agents/scripts/lib/single-story-sweep/protection-ctx.js +1 -1
  214. package/.agents/scripts/lib/skills/parse-skill.js +16 -3
  215. package/.agents/scripts/lib/story-adjacency.js +17 -19
  216. package/.agents/scripts/lib/story-body/story-body.js +130 -75
  217. package/.agents/scripts/lib/story-plan.js +2 -4
  218. package/.agents/scripts/lib/templates/decomposer-prompts.js +51 -46
  219. package/.agents/scripts/lib/templates/spec-author-prompts.js +47 -45
  220. package/.agents/scripts/lib/test-env.js +14 -1
  221. package/.agents/scripts/lib/test-tiers.js +0 -3
  222. package/.agents/scripts/lib/{epic-body-sections.js → ticket-body-sections.js} +25 -39
  223. package/.agents/scripts/lib/validation-evidence.js +32 -60
  224. package/.agents/scripts/lib/wave-runner/ready-set.js +38 -12
  225. package/.agents/scripts/lib/workspace-provisioner.js +1 -1
  226. package/.agents/scripts/lib/worktree/lifecycle/pending-cleanup.js +1 -1
  227. package/.agents/scripts/lib/worktree/lifecycle/reap.js +72 -25
  228. package/.agents/scripts/lib/worktree/lifecycle-manager.js +1 -2
  229. package/.agents/scripts/lint-issue-body.js +71 -40
  230. package/.agents/scripts/mandrel-update-preflight.js +1 -1
  231. package/.agents/scripts/notify.js +4 -3
  232. package/.agents/scripts/plan-context.js +102 -80
  233. package/.agents/scripts/plan-persist.js +230 -279
  234. package/.agents/scripts/plan-run-epilogue.js +142 -0
  235. package/.agents/scripts/post-structured-comment.js +0 -38
  236. package/.agents/scripts/pr-watch-with-update.js +43 -22
  237. package/.agents/scripts/providers/github/compose.js +0 -1
  238. package/.agents/scripts/providers/github/errors.js +0 -19
  239. package/.agents/scripts/providers/github/issues.js +13 -39
  240. package/.agents/scripts/providers/github/mappers.js +5 -12
  241. package/.agents/scripts/providers/github/sub-issues.js +0 -47
  242. package/.agents/scripts/providers/github/tickets.js +33 -156
  243. package/.agents/scripts/providers/github.js +17 -6
  244. package/.agents/scripts/resolve-stories.js +236 -0
  245. package/.agents/scripts/run-coverage.js +4 -1
  246. package/.agents/scripts/run-lint.js +2 -2
  247. package/.agents/scripts/run-verify.js +31 -2
  248. package/.agents/scripts/signals-view.js +25 -21
  249. package/.agents/scripts/single-story-close.js +178 -26
  250. package/.agents/scripts/single-story-confirm-merge.js +313 -24
  251. package/.agents/scripts/single-story-init.js +35 -30
  252. package/.agents/scripts/stories-wave-tick.js +85 -10
  253. package/.agents/scripts/story-plan.js +28 -49
  254. package/.agents/scripts/update-ticket-state.js +14 -65
  255. package/.agents/skills/core/code-review-and-quality/SKILL.md +28 -450
  256. package/.agents/skills/core/code-review-and-quality/reference.md +458 -0
  257. package/.agents/skills/core/debugging-and-error-recovery/SKILL.md +22 -315
  258. package/.agents/skills/core/debugging-and-error-recovery/reference.md +323 -0
  259. package/.agents/skills/core/diagnose-friction/SKILL.md +14 -18
  260. package/.agents/skills/core/documentation-and-adrs/SKILL.md +25 -397
  261. package/.agents/skills/core/documentation-and-adrs/reference.md +403 -0
  262. package/.agents/skills/core/gates-and-baselines/SKILL.md +12 -12
  263. package/.agents/skills/core/idea-refinement/SKILL.md +9 -9
  264. package/.agents/skills/core/scope-triage/SKILL.md +31 -172
  265. package/.agents/skills/core/security-and-hardening/SKILL.md +22 -367
  266. package/.agents/skills/core/security-and-hardening/reference.md +375 -0
  267. package/.agents/skills/skills.index.json +3 -53
  268. package/.agents/skills/stack/qa/playwright-bdd/SKILL.md +2 -4
  269. package/.agents/skills/stack/qa/qa-explore-driving/SKILL.md +1 -1
  270. package/.agents/skills/stack/qa/qa-harness/SKILL.md +1 -3
  271. package/.agents/starter-agentrc.json +0 -5
  272. package/.agents/templates/agent-protocol.md +9 -10
  273. package/.agents/workflows/audit-architecture.md +6 -7
  274. package/.agents/workflows/audit-clean-code.md +7 -7
  275. package/.agents/workflows/audit-dependencies.md +3 -3
  276. package/.agents/workflows/audit-devops.md +3 -3
  277. package/.agents/workflows/audit-documentation.md +9 -10
  278. package/.agents/workflows/audit-lighthouse.md +11 -3
  279. package/.agents/workflows/audit-navigability.md +13 -2
  280. package/.agents/workflows/audit-performance.md +5 -6
  281. package/.agents/workflows/audit-privacy.md +3 -3
  282. package/.agents/workflows/audit-quality.md +11 -12
  283. package/.agents/workflows/audit-security.md +4 -5
  284. package/.agents/workflows/audit-seo.md +13 -3
  285. package/.agents/workflows/audit-sre.md +3 -3
  286. package/.agents/workflows/audit-to-stories.md +20 -20
  287. package/.agents/workflows/audit-ux-ui.md +10 -3
  288. package/.agents/workflows/deliver.md +177 -176
  289. package/.agents/workflows/git-cleanup.md +5 -6
  290. package/.agents/workflows/git-deliver.md +1 -1
  291. package/.agents/workflows/helpers/_merge-conflict-template.md +1 -1
  292. package/.agents/workflows/helpers/acceptance-self-eval.md +35 -40
  293. package/.agents/workflows/helpers/code-quality-guardrails.md +7 -7
  294. package/.agents/workflows/helpers/code-review.md +75 -196
  295. package/.agents/workflows/helpers/{single-story-deliver-reference.md → deliver-story-reference.md} +83 -44
  296. package/.agents/workflows/helpers/deliver-story.md +606 -0
  297. package/.agents/workflows/helpers/diagnose.md +10 -10
  298. package/.agents/workflows/helpers/parallel-tooling.md +3 -3
  299. package/.agents/workflows/helpers/signals.md +16 -16
  300. package/.agents/workflows/helpers/worktree-lifecycle.md +66 -86
  301. package/.agents/workflows/mandrel-update.md +2 -1
  302. package/.agents/workflows/plan.md +277 -145
  303. package/.agents/workflows/qa-assist.md +27 -33
  304. package/.agents/workflows/qa-explore.md +29 -38
  305. package/.agents/workflows/qa-run.md +2 -6
  306. package/README.md +9 -8
  307. package/bin/mandrel.js +12 -1
  308. package/docs/CHANGELOG.md +70 -0
  309. package/lib/cli/registry.js +262 -19
  310. package/lib/cli/sync-agents.js +157 -0
  311. package/lib/cli/sync-commands.js +115 -6
  312. package/lib/cli/sync.js +168 -6
  313. package/lib/cli/update.js +105 -8
  314. package/lib/cli/version-helpers.js +131 -0
  315. package/lib/migrations/README.md +7 -5
  316. package/lib/migrations/index.js +12 -8
  317. package/lib/migrations/steps/2.1.0-retire-mi-drop-knobs.js +100 -0
  318. package/lib/migrations/steps/2.1.0-retire-verify-concurrency-cap.js +101 -0
  319. package/package.json +2 -2
  320. package/.agents/agents/retro.md +0 -42
  321. package/.agents/personas/architect.md +0 -113
  322. package/.agents/personas/devops-engineer.md +0 -38
  323. package/.agents/personas/engineer.md +0 -33
  324. package/.agents/personas/project-manager.md +0 -114
  325. package/.agents/personas/qa-engineer.md +0 -95
  326. package/.agents/personas/security-engineer.md +0 -111
  327. package/.agents/personas/technical-writer.md +0 -101
  328. package/.agents/schemas/dispatch-manifest.json +0 -232
  329. package/.agents/schemas/epic-perf-report.schema.json +0 -89
  330. package/.agents/schemas/epic-spec.schema.json +0 -153
  331. package/.agents/schemas/lifecycle/acceptance.reconcile.failed.schema.json +0 -13
  332. package/.agents/schemas/lifecycle/acceptance.reconcile.ok.schema.json +0 -13
  333. package/.agents/schemas/lifecycle/acceptance.reconcile.skipped.schema.json +0 -13
  334. package/.agents/schemas/lifecycle/acceptance.reconcile.start.schema.json +0 -12
  335. package/.agents/schemas/lifecycle/acceptance.reconcile.waived.schema.json +0 -13
  336. package/.agents/schemas/lifecycle/epic.automerge.end.schema.json +0 -15
  337. package/.agents/schemas/lifecycle/epic.automerge.start.schema.json +0 -13
  338. package/.agents/schemas/lifecycle/epic.blocked.schema.json +0 -13
  339. package/.agents/schemas/lifecycle/epic.cleanup.end.schema.json +0 -12
  340. package/.agents/schemas/lifecycle/epic.cleanup.start.schema.json +0 -12
  341. package/.agents/schemas/lifecycle/epic.close.end.schema.json +0 -12
  342. package/.agents/schemas/lifecycle/epic.complete.schema.json +0 -13
  343. package/.agents/schemas/lifecycle/epic.finalize.end.schema.json +0 -13
  344. package/.agents/schemas/lifecycle/epic.finalize.start.schema.json +0 -12
  345. package/.agents/schemas/lifecycle/epic.merge.armed.schema.json +0 -13
  346. package/.agents/schemas/lifecycle/epic.merge.blocked.schema.json +0 -14
  347. package/.agents/schemas/lifecycle/epic.merge.confirmed.schema.json +0 -17
  348. package/.agents/schemas/lifecycle/epic.merge.ready.schema.json +0 -15
  349. package/.agents/schemas/lifecycle/epic.plan.end.schema.json +0 -18
  350. package/.agents/schemas/lifecycle/epic.plan.start.schema.json +0 -12
  351. package/.agents/schemas/lifecycle/epic.snapshot.end.schema.json +0 -16
  352. package/.agents/schemas/lifecycle/epic.snapshot.start.schema.json +0 -12
  353. package/.agents/schemas/lifecycle/epic.watch.end.schema.json +0 -29
  354. package/.agents/schemas/lifecycle/epic.watch.start.schema.json +0 -16
  355. package/.agents/schemas/lifecycle/slice.end.schema.json +0 -21
  356. package/.agents/schemas/lifecycle/slice.heartbeat.schema.json +0 -20
  357. package/.agents/schemas/lifecycle/slice.start.schema.json +0 -17
  358. package/.agents/schemas/lifecycle/story.heartbeat.schema.json +0 -20
  359. package/.agents/schemas/risk-verdict.schema.json +0 -66
  360. package/.agents/schemas/story-perf-summary.schema.json +0 -73
  361. package/.agents/scripts/acceptance-spec-reconciler.js +0 -642
  362. package/.agents/scripts/analyze-execution.js +0 -444
  363. package/.agents/scripts/bookkeeping-reconcile.js +0 -117
  364. package/.agents/scripts/check-prepush-recovery.js +0 -90
  365. package/.agents/scripts/dispatcher.js +0 -295
  366. package/.agents/scripts/epic-audit-prepare.js +0 -497
  367. package/.agents/scripts/epic-audit-recheck.js +0 -274
  368. package/.agents/scripts/epic-deliver-note-intervention.js +0 -192
  369. package/.agents/scripts/epic-deliver-preflight.js +0 -462
  370. package/.agents/scripts/epic-deliver-prepare.js +0 -852
  371. package/.agents/scripts/epic-execute-record-wave.js +0 -449
  372. package/.agents/scripts/epic-plan-clarity.js +0 -211
  373. package/.agents/scripts/epic-plan-healthcheck.js +0 -581
  374. package/.agents/scripts/epic-reconcile.js +0 -625
  375. package/.agents/scripts/lib/baseline-snapshot.js +0 -979
  376. package/.agents/scripts/lib/checks/epic-merge-lock-stale.js +0 -54
  377. package/.agents/scripts/lib/checks/stale-origin-epic.js +0 -49
  378. package/.agents/scripts/lib/config/lifecycle.js +0 -40
  379. package/.agents/scripts/lib/config/preflight.js +0 -58
  380. package/.agents/scripts/lib/config/retro.js +0 -77
  381. package/.agents/scripts/lib/epic-merge-lock.js +0 -322
  382. package/.agents/scripts/lib/epic-plan-clarity.js +0 -181
  383. package/.agents/scripts/lib/epic-plan-ideation.js +0 -261
  384. package/.agents/scripts/lib/git-merge-orchestrator.js +0 -261
  385. package/.agents/scripts/lib/observability/baseline-refresh-rate.js +0 -221
  386. package/.agents/scripts/lib/observability/hook-heartbeat.js +0 -219
  387. package/.agents/scripts/lib/observability/perf-aggregator.js +0 -813
  388. package/.agents/scripts/lib/observability/perf-report-readers.js +0 -328
  389. package/.agents/scripts/lib/observability/perf-report-render.js +0 -182
  390. package/.agents/scripts/lib/orchestration/bookkeeping-outbox.js +0 -270
  391. package/.agents/scripts/lib/orchestration/context-hydration-engine.js +0 -539
  392. package/.agents/scripts/lib/orchestration/deliver-route.js +0 -173
  393. package/.agents/scripts/lib/orchestration/dispatch-engine.js +0 -134
  394. package/.agents/scripts/lib/orchestration/dispatch-pipeline.js +0 -183
  395. package/.agents/scripts/lib/orchestration/epic-cleanup.js +0 -801
  396. package/.agents/scripts/lib/orchestration/epic-deliver-lease-guard.js +0 -310
  397. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/context.js +0 -163
  398. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/creation.js +0 -140
  399. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/dag.js +0 -64
  400. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/diagnostics.js +0 -72
  401. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/persist-helpers.js +0 -156
  402. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/persist.js +0 -345
  403. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/planning-artifacts.js +0 -41
  404. package/.agents/scripts/lib/orchestration/epic-plan-decompose/phases/reconcile-spawn.js +0 -86
  405. package/.agents/scripts/lib/orchestration/epic-plan-lease-guard.js +0 -391
  406. package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/drain.js +0 -94
  407. package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/plan-epic.js +0 -236
  408. package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/risk-verdict.js +0 -105
  409. package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/run-spec-phase.js +0 -307
  410. package/.agents/scripts/lib/orchestration/epic-plan-spec/phases/spec-freshness.js +0 -117
  411. package/.agents/scripts/lib/orchestration/epic-plan-state-store.js +0 -117
  412. package/.agents/scripts/lib/orchestration/epic-run-state-store.js +0 -621
  413. package/.agents/scripts/lib/orchestration/epic-runner/concurrency-gate.js +0 -186
  414. package/.agents/scripts/lib/orchestration/epic-runner/deliver-phases.js +0 -50
  415. package/.agents/scripts/lib/orchestration/epic-runner/phases/build-wave-dag.js +0 -129
  416. package/.agents/scripts/lib/orchestration/epic-runner/phases/snapshot.js +0 -103
  417. package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter/composition.js +0 -267
  418. package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter/signals.js +0 -210
  419. package/.agents/scripts/lib/orchestration/epic-runner/progress-reporter/transport.js +0 -238
  420. package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/_bullet-format.js +0 -32
  421. package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/component-drift.js +0 -203
  422. package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/crap-drift.js +0 -227
  423. package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/maintainability-drift.js +0 -117
  424. package/.agents/scripts/lib/orchestration/epic-runner/progress-signals/stalled-worktree.js +0 -37
  425. package/.agents/scripts/lib/orchestration/epic-runner/story-launcher.js +0 -127
  426. package/.agents/scripts/lib/orchestration/epic-runner/story-run-progress-writer.js +0 -400
  427. package/.agents/scripts/lib/orchestration/epic-runner/sub-agent-return.js +0 -276
  428. package/.agents/scripts/lib/orchestration/epic-runner/wave-scheduler.js +0 -66
  429. package/.agents/scripts/lib/orchestration/epic-spec-reconciler-apply.js +0 -789
  430. package/.agents/scripts/lib/orchestration/epic-spec-reconciler-diff.js +0 -676
  431. package/.agents/scripts/lib/orchestration/epic-spec-reconciler-discriminator.js +0 -389
  432. package/.agents/scripts/lib/orchestration/epic-spec-reconciler-format.js +0 -230
  433. package/.agents/scripts/lib/orchestration/epic-spec-reconciler-ops.js +0 -361
  434. package/.agents/scripts/lib/orchestration/error-journal.js +0 -139
  435. package/.agents/scripts/lib/orchestration/finalize/open-or-locate-pr.js +0 -306
  436. package/.agents/scripts/lib/orchestration/finalize/post-handoff-comment.js +0 -489
  437. package/.agents/scripts/lib/orchestration/finalize/sanitize-skip-ci.js +0 -88
  438. package/.agents/scripts/lib/orchestration/lifecycle/emit-slice-lifecycle.js +0 -270
  439. package/.agents/scripts/lib/orchestration/lifecycle/emit-story-dispatch-end.js +0 -147
  440. package/.agents/scripts/lib/orchestration/lifecycle/emit-story-heartbeat.js +0 -155
  441. package/.agents/scripts/lib/orchestration/lifecycle/ledger-diff.js +0 -140
  442. package/.agents/scripts/lib/orchestration/lifecycle/listeners/acceptance-reconciler.js +0 -465
  443. package/.agents/scripts/lib/orchestration/lifecycle/listeners/automerge-armer.js +0 -501
  444. package/.agents/scripts/lib/orchestration/lifecycle/listeners/automerge-predicate.js +0 -984
  445. package/.agents/scripts/lib/orchestration/lifecycle/listeners/branch-cleaner.js +0 -264
  446. package/.agents/scripts/lib/orchestration/lifecycle/listeners/checkpoint-pointer-writer.js +0 -284
  447. package/.agents/scripts/lib/orchestration/lifecycle/listeners/cleaner.js +0 -355
  448. package/.agents/scripts/lib/orchestration/lifecycle/listeners/finalizer.js +0 -673
  449. package/.agents/scripts/lib/orchestration/lifecycle/listeners/index.js +0 -378
  450. package/.agents/scripts/lib/orchestration/lifecycle/listeners/intervention-recorder.js +0 -140
  451. package/.agents/scripts/lib/orchestration/lifecycle/listeners/label-transitioner.js +0 -144
  452. package/.agents/scripts/lib/orchestration/lifecycle/listeners/merge-watcher.js +0 -665
  453. package/.agents/scripts/lib/orchestration/lifecycle/listeners/notify-dispatcher.js +0 -174
  454. package/.agents/scripts/lib/orchestration/manifest-builder.js +0 -222
  455. package/.agents/scripts/lib/orchestration/plan-persist/amend.js +0 -359
  456. package/.agents/scripts/lib/orchestration/plan-persist/delivery-mode.js +0 -127
  457. package/.agents/scripts/lib/orchestration/plan-review-routing.js +0 -63
  458. package/.agents/scripts/lib/orchestration/planning-context-budget.js +0 -213
  459. package/.agents/scripts/lib/orchestration/planning-risk.js +0 -194
  460. package/.agents/scripts/lib/orchestration/post-merge/phases/branch-cleanup.js +0 -56
  461. package/.agents/scripts/lib/orchestration/post-merge/phases/dashboard-refresh.js +0 -33
  462. package/.agents/scripts/lib/orchestration/post-merge/phases/notification.js +0 -78
  463. package/.agents/scripts/lib/orchestration/post-merge/phases/temp-cleanup.js +0 -68
  464. package/.agents/scripts/lib/orchestration/post-merge/phases/ticket-closure.js +0 -118
  465. package/.agents/scripts/lib/orchestration/post-merge/phases/worktree-reap.js +0 -396
  466. package/.agents/scripts/lib/orchestration/post-merge-pipeline.js +0 -205
  467. package/.agents/scripts/lib/orchestration/preflight-cache.js +0 -187
  468. package/.agents/scripts/lib/orchestration/recurring-failure-detector.js +0 -152
  469. package/.agents/scripts/lib/orchestration/retro/phases/checks.js +0 -94
  470. package/.agents/scripts/lib/orchestration/retro/phases/compose-body.js +0 -571
  471. package/.agents/scripts/lib/orchestration/retro/phases/gather-signals.js +0 -450
  472. package/.agents/scripts/lib/orchestration/retro/phases/post-and-mirror.js +0 -191
  473. package/.agents/scripts/lib/orchestration/retro-heuristics.js +0 -57
  474. package/.agents/scripts/lib/orchestration/retro-perf-heuristics.js +0 -275
  475. package/.agents/scripts/lib/orchestration/retro-runner.js +0 -197
  476. package/.agents/scripts/lib/orchestration/spec-renderer.js +0 -447
  477. package/.agents/scripts/lib/orchestration/story-close/auto-refresh-runner.js +0 -747
  478. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/gate-failure.js +0 -211
  479. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/pre-merge-attribution.js +0 -158
  480. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/refresh-commit.js +0 -446
  481. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/regression-projection.js +0 -297
  482. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution/phases/scope-discovery.js +0 -48
  483. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution-wiring.js +0 -67
  484. package/.agents/scripts/lib/orchestration/story-close/baseline-attribution.js +0 -161
  485. package/.agents/scripts/lib/orchestration/story-close/baseline-friction-body.js +0 -117
  486. package/.agents/scripts/lib/orchestration/story-close/cd-out-guard.js +0 -86
  487. package/.agents/scripts/lib/orchestration/story-close/cleanup-reconciler.js +0 -147
  488. package/.agents/scripts/lib/orchestration/story-close/close-inputs.js +0 -142
  489. package/.agents/scripts/lib/orchestration/story-close/comment-bodies.js +0 -62
  490. package/.agents/scripts/lib/orchestration/story-close/merge-runner.js +0 -658
  491. package/.agents/scripts/lib/orchestration/story-close/merge-subject.js +0 -198
  492. package/.agents/scripts/lib/orchestration/story-close/phases/branch-restore.js +0 -105
  493. package/.agents/scripts/lib/orchestration/story-close/phases/close.js +0 -222
  494. package/.agents/scripts/lib/orchestration/story-close/phases/gates.js +0 -292
  495. package/.agents/scripts/lib/orchestration/story-close/phases/locked-pipeline.js +0 -270
  496. package/.agents/scripts/lib/orchestration/story-close/phases/preflight.js +0 -110
  497. package/.agents/scripts/lib/orchestration/story-close/phases/refresh.js +0 -86
  498. package/.agents/scripts/lib/orchestration/story-close/phases/timeout-blocked-emitter.js +0 -112
  499. package/.agents/scripts/lib/orchestration/story-close/phases/timeout-blocked.js +0 -157
  500. package/.agents/scripts/lib/orchestration/story-close/post-merge-close.js +0 -421
  501. package/.agents/scripts/lib/orchestration/story-close/pre-merge-validation.js +0 -302
  502. package/.agents/scripts/lib/orchestration/story-close/shared-checkout-guard.js +0 -163
  503. package/.agents/scripts/lib/orchestration/story-close-recovery.js +0 -690
  504. package/.agents/scripts/lib/orchestration/wave-marker.js +0 -28
  505. package/.agents/scripts/lib/orchestration/wave-record-io.js +0 -218
  506. package/.agents/scripts/lib/orchestration/wave-record-notifications.js +0 -145
  507. package/.agents/scripts/lib/orchestration/wave-record-projection.js +0 -212
  508. package/.agents/scripts/lib/presentation/dispatch-manifest-render.js +0 -111
  509. package/.agents/scripts/lib/presentation/manifest-builder.js +0 -239
  510. package/.agents/scripts/lib/presentation/manifest-formatter.js +0 -242
  511. package/.agents/scripts/lib/presentation/manifest-helpers.js +0 -213
  512. package/.agents/scripts/lib/presentation/manifest-persistence.js +0 -261
  513. package/.agents/scripts/lib/presentation/manifest-procedures.js +0 -55
  514. package/.agents/scripts/lib/presentation/manifest-render-waves.js +0 -306
  515. package/.agents/scripts/lib/presentation/manifest-renderer.js +0 -188
  516. package/.agents/scripts/lib/presentation/manifest-story-views.js +0 -110
  517. package/.agents/scripts/lib/push-epic-retry.js +0 -209
  518. package/.agents/scripts/lib/spec/index.js +0 -36
  519. package/.agents/scripts/lib/spec/loader.js +0 -425
  520. package/.agents/scripts/lib/spec/state.js +0 -208
  521. package/.agents/scripts/lib/story-init/blocker-validator.js +0 -68
  522. package/.agents/scripts/lib/story-init/branch-initializer.js +0 -408
  523. package/.agents/scripts/lib/story-init/context-resolver.js +0 -92
  524. package/.agents/scripts/lib/story-init/donor-precheck.js +0 -207
  525. package/.agents/scripts/lib/story-init/state-transitioner.js +0 -80
  526. package/.agents/scripts/lib/story-init/task-graph-builder.js +0 -124
  527. package/.agents/scripts/lib/story-init/transition-summary.js +0 -34
  528. package/.agents/scripts/lib/test-reserved-epic-temp-ids.js +0 -35
  529. package/.agents/scripts/lib/wave-runner/tick.js +0 -754
  530. package/.agents/scripts/lib/wave-runner/wave-runner-error.js +0 -20
  531. package/.agents/scripts/lifecycle-emit-story-dispatch.js +0 -194
  532. package/.agents/scripts/lifecycle-emit.js +0 -510
  533. package/.agents/scripts/retro-run.js +0 -218
  534. package/.agents/scripts/slice-phase.js +0 -361
  535. package/.agents/scripts/standalone-feedback-rollup.js +0 -188
  536. package/.agents/scripts/story-close.js +0 -294
  537. package/.agents/scripts/story-init.js +0 -599
  538. package/.agents/scripts/story-phase.js +0 -369
  539. package/.agents/scripts/wave-tick.js +0 -464
  540. package/.agents/skills/core/analyze-execution/SKILL.md +0 -98
  541. package/.agents/skills/core/epic-plan-consolidate/SKILL.md +0 -172
  542. package/.agents/skills/core/epic-plan-consolidate/examples.md +0 -51
  543. package/.agents/skills/core/epic-plan-decompose-author/SKILL.md +0 -441
  544. package/.agents/skills/core/epic-plan-decompose-author/examples.md +0 -47
  545. package/.agents/skills/core/epic-plan-premortem/SKILL.md +0 -146
  546. package/.agents/skills/core/epic-plan-premortem/examples.md +0 -53
  547. package/.agents/skills/core/epic-plan-spec-author/SKILL.md +0 -383
  548. package/.agents/skills/core/epic-plan-spec-author/examples.md +0 -91
  549. package/.agents/workflows/helpers/deliver-epic-reference.md +0 -547
  550. package/.agents/workflows/helpers/deliver-epic-single.md +0 -331
  551. package/.agents/workflows/helpers/deliver-epic.md +0 -998
  552. package/.agents/workflows/helpers/deliver-stories.md +0 -450
  553. package/.agents/workflows/helpers/epic-audit.md +0 -189
  554. package/.agents/workflows/helpers/epic-deliver-story.md +0 -436
  555. package/.agents/workflows/helpers/epic-testing.md +0 -125
  556. package/.agents/workflows/helpers/plan-epic-reference.md +0 -160
  557. package/.agents/workflows/helpers/plan-epic.md +0 -353
  558. package/.agents/workflows/helpers/plan-story.md +0 -251
  559. package/.agents/workflows/helpers/scope-triage-gate.md +0 -108
  560. package/.agents/workflows/helpers/single-story-deliver.md +0 -557
@@ -8,15 +8,17 @@ set. You MUST strictly adhere to the following rules:
8
8
 
9
9
  ## 1. System Guardrails & Initialization
10
10
 
11
- ### A. Persona Routing & Execution
11
+ ### A. Role Framing (no persona packs)
12
12
 
13
- When a task carries a `persona::<role>` label, or a user explicitly instructs
14
- "Act as [Role/Persona]" in chat, retrieve and strictly adopt the rules in
15
- `.agents/personas/[role].md`. Personas are advisory role framing, not a runtime
16
- injection read the file when the label or the instruction points you at one.
13
+ v2 has **no** `.agents/personas/` packs and **no** `persona::*` GitHub labels.
14
+ Behavioral constraints come from this file, always-on / on-demand rules, and
15
+ skills. Role-scoped spawn contexts (when used) live under `.agents/agents/`
16
+ via `delivery.routing.roleScopedAgents`. QA auth identities (`qa.personas`)
17
+ are a separate fixture concept — not agent behavior packs.
17
18
 
18
- - **Fallback:** If no persona is indicated, or the named file is missing,
19
- default to `.agents/personas/engineer.md`.
19
+ If a user says "act as [role]" in chat, apply the matching skill / workflow
20
+ guidance (e.g. QA skills for verification work, security skill for threat
21
+ modeling) rather than looking for a persona file.
20
22
 
21
23
  ### B. Skill Activation
22
24
 
@@ -36,9 +38,14 @@ The skill library uses a **two-tier architecture**:
36
38
 
37
39
  When a task involves a specific domain or technology, you MUST read the
38
40
  corresponding `.agents/skills/[tier]/[category]/[skill-name]/SKILL.md` file and
39
- apply its constraints. Review the skill's `examples/` directory or
40
- `examples.md` sibling **when present and relevant** to the taskmost skills
41
- do not ship one, so do not probe blindly. When uncertain which skill applies,
41
+ apply its constraints. A `SKILL.md` leads with its **Policy Capsule** — the
42
+ contract, and the whole cost of activating the skillfollowed by pointers
43
+ into an on-demand `reference.md` sibling holding the long-form material
44
+ (patterns, worked examples, checklists). This is the same split the always-on
45
+ rules use (§ 1.F): read the capsule on activation, and open a `reference.md`
46
+ section only when the task actually engages it. Review the skill's `examples/`
47
+ directory or `examples.md` sibling **when present and relevant** to the task —
48
+ most skills do not ship one, so do not probe blindly. When uncertain which skill applies,
42
49
  match the task against the one-line `description` in each skill's frontmatter
43
50
  (catalogued in `.agents/skills/skills.index.json`). Skills compose: a complete
44
51
  feature typically flows `idea-refinement` → the `/plan` workflow →
@@ -155,18 +162,17 @@ technology context is intentionally kept out of `.agentrc.json`.
155
162
 
156
163
  You MUST log telemetry about operational difficulty or automation
157
164
  opportunities you hit. Friction is a **local NDJSON signal**:
158
- `diagnose-friction.js` appends one `kind: friction` record to the per-Epic/
165
+ `diagnose-friction.js` appends one `kind: friction` record to the per-run/
159
166
  per-Story `signals.ndjson` stream on local disk — not posted to the ticket at
160
167
  capture time; the retro phase surfaces the aggregate as routed proposals.
161
168
 
162
169
  - **Command**:
163
170
  `node .agents/scripts/diagnose-friction.js --story [STORY_ID] --cmd [FAILED_COMMAND]`
164
- (add `--epic [EPIC_ID]` under an Epic).
165
171
  - **When to fire**: after repeated tool-validation errors, an unrecoverable
166
172
  command failure, ambiguity needing self-correction, or repetitive
167
173
  boilerplate steps a workflow/skill could simplify.
168
174
 
169
- The schema validation, the standalone (no-Epic) stream path, and the
175
+ The schema validation, the standalone stream path, and the
170
176
  never-silently-dropped guarantee are reference detail — see
171
177
  [`docs/execution-reference.md` § Friction telemetry](docs/execution-reference.md#friction-telemetry).
172
178
 
@@ -201,19 +207,11 @@ recurred, and what assumption you would test next, then either Re-Plan or
201
207
  hand back to the operator. Do not paper over the loop with another
202
208
  just-in-case retry.
203
209
 
204
- This protocol is not soft-prompt-only it has a runtime substrate. While
205
- executing as a Story delivery sub-agent (via `helpers/epic-deliver-story`
206
- or `helpers/single-story-deliver`), you MUST emit a `story.heartbeat`
207
- lifecycle event on every Task transition (or whenever you stall on a
208
- long-running step) so the parent `/deliver` idle watchdog (§ 2e of
209
- `.agents/workflows/helpers/deliver-epic.md`, re-ticked every 30 minutes via
210
- `wave-tick.js --check-idle 30`) can distinguish a child still making
211
- progress from a dead one. If you genuinely cannot proceed, transition to
212
- `agent::blocked` and exit non-zero — never fall silent. A child with no
213
- recent `story.heartbeat`, no commit on its `story-<id>` branch, and no
214
- `agent::blocked` label is exactly the failure mode the idle watchdog is
215
- built to catch, and the watchdog will re-dispatch (or escalate) the Story
216
- without your participation.
210
+ While executing as a Story delivery sub-agent (via `helpers/deliver-story`),
211
+ if you genuinely cannot proceed you MUST transition to `agent::blocked` and
212
+ exit non-zero **never fall silent**. A stalled child that reports nothing
213
+ is indistinguishable from a dead one, and the parent `/deliver` run can only
214
+ escalate what you surface.
217
215
 
218
216
  ### J. HITL Blocker Escalation (Safe Execution)
219
217
 
@@ -243,8 +241,7 @@ resolve by this **total ordering** (higher wins):
243
241
  (§ 1.E).
244
242
  2. **This file** — `.agents/instructions.md`.
245
243
  3. **Global rules** — `.agents/rules/*.md` (§ 1.F).
246
- 4. **The active persona** — `.agents/personas/[role].md` (§ 1.A).
247
- 5. **Skills** — `.agents/skills/**/SKILL.md` (§ 1.B).
244
+ 4. **Skills** — `.agents/skills/**/SKILL.md` (§ 1.B).
248
245
 
249
246
  Two carve-outs refine the ordering:
250
247
 
@@ -252,23 +249,25 @@ Two carve-outs refine the ordering:
252
249
  tier overlap, the narrower, more-specific statement governs the broader one
253
250
  (e.g. a stack-specific skill refines a general core skill; a per-rule
254
251
  statement refines a cross-rule one).
255
- - **`rules/security-baseline.md` is inviolable.** No persona, skill, or local
256
- override may relax a security MUST. A security constraint that conflicts
257
- with any lower-tier guidance — or with a local override — always wins,
258
- regardless of its tier position above.
252
+ - **`rules/security-baseline.md` is inviolable.** No skill or local override
253
+ may relax a security MUST. A security constraint that conflicts with any
254
+ lower-tier guidance — or with a local override — always wins, regardless of
255
+ its tier position above.
259
256
 
260
257
  ---
261
258
 
262
259
  ## 2. FinOps & Token Budgeting (Economic Guardrails)
263
260
 
264
- Mandrel does **not** enforce live LLM spend from response metadata. It caps
265
- **hydrated prompt size** (`delivery.maxTokenBudget`, section-aware elision) and
266
- runs optional **pre-dispatch estimates** (`delivery.preflight.*`); your host
267
- runtime owns session quota and hard stops. The config keys, the ≈4-char/token
268
- estimate, and the elision behaviour are reference detail see
261
+ Mandrel does **not** enforce live LLM spend from response metadata, and it has
262
+ no operator-tunable context budget. What it does bound are fixed framework
263
+ ceilings the `/plan` context envelope and plan-time Story sizing and they
264
+ **fail closed** with a message naming what to trim, rather than silently
265
+ handing the model a truncated context. Your host runtime owns session quota and
266
+ hard stops. The constants, the ≈4-char/token estimate, and the trim options are
267
+ reference detail — see
269
268
  [`docs/execution-reference.md` § FinOps & token budgeting](docs/execution-reference.md#finops--token-budgeting-economic-guardrails).
270
- Consult it when a task prompt was elided or `/deliver` refused a fan-out on
271
- budget grounds.
269
+ Consult it when `/plan` refused an over-ceiling envelope or an over-budget
270
+ Story count.
272
271
 
273
272
  ---
274
273
 
@@ -276,76 +275,51 @@ budget grounds.
276
275
 
277
276
  1. **Context First:** Before proposing any solution, understand the
278
277
  repository's tech stack, historical context, and structure.
279
- - **Digest-first Reading (planning & interactive tasks, Story #4433)**:
280
- For planning (`/plan`) and interactive tasks, read the project's **docs
281
- digest** before reading any full doc file do not read every file
282
- listed in `project.docsContextFiles` up front. The epic planning path
283
- ensures (generates or reuses) a per-Epic docs digest a single compact
284
- outline (path, byte size, heading outline with line numbers, and the
285
- first paragraph under each `##`) built from `project.docsContextFiles`
286
- at `temp/epic-<epicId>/docs-digest.md` (`plan-context.js`, via the
287
- shared generator in
288
- `.agents/scripts/lib/orchestration/docs-digest.js`; the same file the
289
- `/deliver` story sub-agents below already consume). Use the digest to
290
- decide which docs bear on the task at hand, then **pull the full file
291
- on demand** (jump to the section at the line number the digest names)
292
- when a section actually bears on the decision. The decisions log
293
- (`decisions.md`) may be either a single-file dated-entry log or an
294
- **index** into a `decisions/` ADR directory — both are first-class
295
- layouts (see
278
+ - **Digest-first Reading (Story #4433)** stated once here; it governs
279
+ every call site. **Never ingest the whole `project.docsContextFiles` set
280
+ up front.** Read the **docs digest**a compact outline (path, byte
281
+ size, heading outline with line numbers, and the first paragraph under
282
+ each `##`) built from those files — decide which docs bear on the task at
283
+ hand, then **pull the full file on demand**, jumping to the section at
284
+ the line number the digest names. This is a hard cutover: no
285
+ read-every-file branch is retained on any path.
286
+
287
+ The call sites differ only in how the digest reaches you — the
288
+ discipline above is identical for all of them:
289
+ - `/plan` and interactive tasks a file at `temp/run-<id>/docs-digest.md`
290
+ (`plan-context.js`, via the shared generator in
291
+ `.agents/scripts/lib/orchestration/docs-digest.js`).
292
+ - `/deliver` Story sub-agents (`helpers/deliver-story`) the
293
+ `docsDigestPath` the caller threads.
294
+ - Standalone-Story planning (`story-plan.js --emit-context`) — inline as
295
+ `corpusContext.docsDigest` (no per-run directory to anchor a
296
+ file), alongside `corpusContext.relevantSections`.
297
+
298
+ When no digest exists for the task at hand — an ad hoc task outside
299
+ `/deliver`, `project.docsContextFiles` unset, or a null `docsDigestPath` —
300
+ there is **no mandatory docs read**: read a full doc only when the task's
301
+ own context points you at one.
302
+
303
+ The decisions log (`decisions.md`) may be either a single-file
304
+ dated-entry log or an **index** into a `decisions/` ADR directory — both
305
+ are first-class layouts (see
296
306
  [`skills/core/documentation-and-adrs`](skills/core/documentation-and-adrs/SKILL.md)).
297
- When it is an index, treat the index like any other digested doc
298
- link-follow the per-ADR bodies under `decisions/` on demand, not
299
- auto-loaded into every task's context. When no digest exists yet for
300
- the task at hand (an ad hoc interactive task with no Epic in scope, or
301
- `project.docsContextFiles` unset) there is no mandatory docs read —
302
- read a full doc only when the task itself points you at one. This is a
303
- hard cutover: there is no read-every-`docsContextFiles`-file branch
304
- retained.
305
- - **Digest-first Reading (`/deliver` story sub-agents)**: A `/deliver`
306
- Story delivery sub-agent (dispatched via `helpers/epic-deliver-story` or
307
- `helpers/single-story-deliver`) does **not** re-read the full
308
- `project.docsContextFiles` set per Story. Instead it reads the **per-Epic
309
- docs digest** — the same file and shape described above — that
310
- `epic-deliver-prepare.js` writes to
311
- `temp/epic-<epicId>/docs-digest.md` and the parent threads into the
312
- child prompt as `docsDigestPath`. Use the digest to decide which docs are
313
- relevant to the Story at hand, then **pull the full file on demand**
314
- (reading the section at the line number the digest names) when a section
315
- bears on the change. When `docsDigestPath` is null (the project has no
316
- `project.docsContextFiles` configured) there is no digest to read and no
317
- per-Story docs mandate — read a full doc only if the Story's own context
318
- points you at one. This is the hard cutover from the former
319
- read-every-file-per-Story rule: delivery children no longer ingest the
320
- whole docs set up front.
321
- - **Standalone-Story planning path (`story-plan.js --emit-context`)**:
322
- The standalone counterpart to `/plan` for Stories that do not attach
323
- to an Epic does not write a `docs-digest.md` file at all — there is
324
- no per-Epic directory to anchor one. Instead `buildCorpusContext`
325
- (`.agents/scripts/lib/planning-corpus.js`) builds the same compact
326
- digest shape in memory and threads it inline as
327
- `corpusContext.docsDigest` on the `--emit-context` envelope, next to
328
- `corpusContext.relevantSections` (ranked excerpts from existing
329
- Epics' Tech Spec sections). Treat `corpusContext.docsDigest` exactly
330
- like the file-based digest above — decide relevance from the outline,
331
- then pull the full file on demand — the only difference is the
332
- delivery mechanism (inline JSON field vs. a temp file path), not the
333
- content or the digest-first discipline.
307
+ Treat an index like any other digested doc: link-follow the per-ADR
308
+ bodies on demand rather than auto-loading them.
334
309
  - **Conditional Reads**: When the task touches UI copy, layout, or
335
310
  routing and the corresponding file is present in the project, also
336
311
  read `docs/style-guide.md` and `docs/web-routes.md`. Skip both when
337
312
  absent or unrelated to the task — they are not part of the universal
338
313
  mandatory set.
339
- - **Epic Context**: Additionally, read the current Epic's body — the
340
- single planning document (ideation sections plus the folded Tech
341
- Spec sections; Story #4324 retired the separate context tickets) —
342
- and the task-specific instructions.
314
+ - **Story Context**: Additionally, read the current Story's body — the
315
+ inline `## Spec` plus its `acceptance[]` / `verify[]` entries — and
316
+ the task-specific instructions.
343
317
  - **Optimization**: For large projects, prioritize targeted retrieval
344
318
  (semantic code search or focused text search) to isolate specific
345
319
  schemas or decisions before reading broad files.
346
320
  2. **Plan First:** For non-trivial tasks (3+ steps or architectural
347
- decisions), enter **Plan Mode**. Update the Epic body's Tech Spec
348
- sections (via `/plan`) or create a new Technical Specification document
321
+ decisions), enter **Plan Mode**. Update the Story's `## Spec`
322
+ (via `/plan`) or create a new Technical Specification document
349
323
  in the `docs/` root (if not already handled by a ticket) before
350
324
  touching code.
351
325
  3. **Artifacts over Chat:** Create log files for test results, build
@@ -396,24 +370,23 @@ budget grounds.
396
370
 
397
371
  ---
398
372
 
399
- ## 5. Git & Epic Protocol (Strict Standards)
373
+ ## 5. Git & Story Protocol (Strict Standards)
400
374
 
401
375
  To maintain a clean and readable repository history, you MUST follow these
402
- strict conventions for all epic-related Git operations. See
376
+ strict conventions for all Story-related Git operations. See
403
377
  [`.agents/rules/git-conventions.md`](rules/git-conventions.md) for the full
404
378
  canonical reference.
405
379
 
406
380
  ### A. Branch Naming (Canonical)
407
381
 
408
- Epic execution uses two branch shapes. The runtime creates and maintains
409
- them automatically; agents commit on the execution branch only.
382
+ v2 delivery uses one branch shape. The runtime creates and maintains it
383
+ via `single-story-init.js`; agents commit on that branch only.
410
384
 
411
- | Purpose | Format | Owner | Notes |
412
- | ---------------- | ---------------------------- | ---------------------- | --------------------------------------------------------------------------------------------- |
413
- | Story execution | `story-<storyId>` | `story-init.js` | Per-Story worktree at `.worktrees/story-<storyId>/`. All Story implementation commits land here. |
414
- | Epic integration | `epic/<epicId>` | `/deliver` slash command | Story branches merge into this branch with `--no-ff`. Pushed per wave. |
385
+ | Purpose | Format | Owner | Notes |
386
+ | --------------- | ----------------- | ----------------------- | --------------------------------------------------------------------- |
387
+ | Story execution | `story-<storyId>` | `single-story-init.js` | Per-Story worktree at `.worktrees/story-<storyId>/`. PR target is `main` (squash + required checks). There is no `epic/<id>` integration branch and no `--no-ff` wave merge. |
415
388
 
416
- - **Verification**: After `story-init.js` returns, confirm
389
+ - **Verification**: After `single-story-init.js` returns, confirm
417
390
  `git branch --show-current` reports `story-<storyId>` before making any
418
391
  commits. If it does not, **STOP** and re-init.
419
392
 
@@ -429,31 +402,32 @@ prompted.
429
402
 
430
403
  ### C. History Hygiene
431
404
 
432
- Prioritize a clean `epic/[EPIC_ID]` branch. Story branches are merged into
433
- the Epic branch automatically by `helpers/epic-deliver-story` (via
434
- `story-close.js`); the Epic branch reaches `main` via the pull request that
435
- `/deliver` opens at the end of its run — the operator merges through
436
- the GitHub UI. There is no in-script merge to `main`.
437
-
438
- ### D. Ticket hierarchy (2-tier)
439
-
440
- Mandrel uses a **2-tier ticket hierarchy** (Epic Story).
441
- Acceptance criteria and verification steps live inline on the Story
442
- body (`acceptance[]` / `verify[]`); there is no Feature tier and no
443
- `type::task` ticket layer. Thematic grouping lives as prose in the
444
- Epic body (which also carries the folded Tech Spec sections).
445
-
446
- - The decomposer emits only `type::epic` and `type::story` issues;
447
- Stories attach directly to the Epic.
448
- - Each Story-implementation phase is executed by
449
- `helpers/epic-deliver-story` (Epic-attached) or
450
- `helpers/single-story-deliver` (standalone). There is no per-Task
451
- sub-loop; the agent authors commit subjects directly per
452
- [`rules/git-conventions.md`](rules/git-conventions.md) and references
453
- the parent Story via `(refs #<storyId>)`.
454
- - Story branches, the Epic-branch integration target, the wave-loop
455
- fan-out, and the `epic/<id>` `main` PR merge model are the same
456
- as Section 5.A.
405
+ Every Story reaches `main` via its own PR (`story-<id>` → squash + required
406
+ checks). `helpers/deliver-story` / `single-story-close.js` open that PR;
407
+ there is no Epic integration branch and no in-script push to `main`.
408
+
409
+ ### D. Ticket hierarchy (Story-only)
410
+
411
+ v2 collapses the ticket model to **Story**. Acceptance criteria and
412
+ verification steps live inline on the Story body (`acceptance[]` /
413
+ `verify[]`); the folded Tech Spec lives inline in `## Spec` (over-budget
414
+ Specs fail closed split or tighten; never write under `docs/`). Optional
415
+ `depends_on` edges order rare multi-Story runs and, because `/deliver`
416
+ resolves them from live state, they order Stories **across plan runs and
417
+ over time**, not just within one batch.
418
+
419
+ - `/plan` emits one or more `type::story` issues (default N=1). There is no
420
+ batch label: `/deliver` takes ids and discovers the graph.
421
+ - Each Story is executed by `helpers/deliver-story` (invoked from
422
+ [`/deliver`](workflows/deliver.md)). There is no per-Task sub-loop; the
423
+ agent authors commit subjects directly per
424
+ [`rules/git-conventions.md`](rules/git-conventions.md) and references the
425
+ Story via `(refs #<storyId>)`.
426
+ - Branch model matches Section 5.A (`story-<id>` → PR → `main`).
427
+ - There is no `type::epic` / `type::task` label and no Epic issue form. An
428
+ Epic is at most an optional untyped human umbrella issue outside
429
+ orchestration; `/deliver` refuses tickets that still carry an
430
+ `Epic: #N` footer.
457
431
 
458
432
  ---
459
433
 
@@ -471,12 +445,12 @@ To keep the repository clean and avoid polluting the Git history:
471
445
 
472
446
  ## 7. Complexity-Aware Execution
473
447
 
474
- The dispatcher automatically calculates the execution plan for an Epic. A
475
- Story is a **capability slice a frontier model delivers and self-verifies in
476
- one pass** a broad footprint is normal when the change is cohesive. The
477
- numeric sizing backstop lives in one place: `DEFAULT_TASK_SIZING` in
478
- `.agents/scripts/lib/orchestration/ticket-validator-sizing.js` (operator
479
- override via `planning.taskSizing`). Do not re-slice a capability-sized
448
+ `/plan` sizes each Story as a **capability slice a frontier model delivers
449
+ and self-verifies in one pass** a broad footprint is normal when the
450
+ change is cohesive. The session-capacity backstop lives in one place:
451
+ `DEFAULT_MODEL_CAPACITY` in
452
+ `.agents/scripts/lib/orchestration/ticket-validator-sizing.js` (framework
453
+ constant not operator-tunable). Do not re-slice a capability-sized
480
454
  Story into per-module fragments just because it touches many files.
481
455
 
482
456
  ### A. When You See `⚠️ COMPLEXITY WARNING`
@@ -1,12 +1,11 @@
1
1
  # CI Failure Triage & Remediation
2
2
 
3
3
  This rule applies when a delivery path is watching a pull request's CI checks
4
- and a required check is red (or repeatedly slow) — the Epic Phase 8
5
- watch-and-iterate loop
6
- ([`deliver-epic.md`](../workflows/helpers/deliver-epic.md)) and the standalone
4
+ and a required check is red (or repeatedly slow) — the `/deliver` router
5
+ ([`deliver.md`](../workflows/deliver.md)) runs each Story through the
7
6
  single-Story Step 4 CI watch + fix loop
8
- ([`single-story-deliver.md`](../workflows/helpers/single-story-deliver.md))
9
- both hand off to it. It is the single triage brain those mechanisms defer to:
7
+ ([`deliver-story.md`](../workflows/helpers/deliver-story.md)), which hands off
8
+ to it. It is the single triage brain that mechanism defers to:
10
9
  the watcher (`pr-watch-with-update.js`) surfaces the failing check, the run
11
10
  link, and the failure signature; this rule decides what to do next.
12
11
 
@@ -27,8 +26,8 @@ guess.
27
26
 
28
27
  Fetch the failing job log and record the failure signature (the failing check
29
28
  name, the run id / run link, and the first distinctive error line). The
30
- watcher already writes this to `temp/epic-<epicId>-ci-digest.{json,md}` (Epic
31
- path) or surfaces it inline (standalone path) — start from that digest.
29
+ watcher already writes this to `temp/story-<id>-ci-digest.{json,md}` — start
30
+ from that digest.
32
31
 
33
32
  ### 2. Classify the failure
34
33
 
@@ -50,18 +49,15 @@ path) or surfaces it inline (standalone path) — start from that digest.
50
49
  A deterministic failure caused by the diff is remediated at source. Use the
51
50
  existing per-check fix table — do **not** duplicate it here:
52
51
 
53
- - **Epic Phase 8**:
54
- [`deliver-epic-reference.md` § Phase 8Watch-and-iterate remediation](../workflows/helpers/deliver-epic-reference.md#phase-8--watch-and-iterate-remediation)
55
- (§ 8.1 Remediation).
56
- - **Standalone Step 4**:
57
- [`single-story-deliver-reference.md` § Step 4 — CI watch + fix recovery](../workflows/helpers/single-story-deliver-reference.md#step-4--ci-watch--fix-recovery).
52
+ - **Story Step 4**:
53
+ [`deliver-story-reference.md` § Step 4CI watch + fix recovery](../workflows/helpers/deliver-story-reference.md#step-4--ci-watch--fix-recovery).
58
54
 
59
55
  In short: lint/format → `npm run lint` + biome apply; maintainability/crap
60
56
  baseline drift → re-run the ratcheted script and fix at source (refresh a
61
57
  baseline only when the diff demonstrably can't be covered); test failure →
62
58
  reproduce with `npm test`, fix source or test; coverage threshold → add tests.
63
- Commit the fix on the delivery branch (`epic/<epicId>` or `story-<storyId>`),
64
- push, and re-run the watcher. Auto-merge stays armed across retries.
59
+ Commit the fix on the delivery branch (`story-<storyId>`), push, and re-run the
60
+ watcher. Auto-merge stays armed across retries.
65
61
 
66
62
  ## Infra, transient, and flaky failures ARE root-cause defects
67
63
 
@@ -75,7 +71,7 @@ get to wave it off because "CI was flaky."
75
71
  genuine attempt, that itself is a finding — record it in the issue you file
76
72
  in step 4.
77
73
  2. **Check whether it also fails on `main`.** Run the same check against an
78
- unmodified `main` (or the Epic base branch) checkout. If it fails on `main`
74
+ unmodified `main` checkout. If it fails on `main`
79
75
  too, the defect is **pre-existing** — it is not caused by the diff under
80
76
  review, and the fix belongs in a separate change, not silently folded into
81
77
  this delivery.
@@ -37,8 +37,10 @@ which deleted the existing compatibility shim layer across
37
37
  `wave-session.js`, `IExecutionAdapter` / `ManualDispatchAdapter`, lifecycle
38
38
  emit shims, and duplicate progress/comment writers in one pass. The
39
39
  per-finding closing references (audit Findings #10, #11, #13, #17) live in
40
- the merged PRs and the Epic #2646 history; the standing forward-looking
41
- audit lives at [`docs/roadmap.md`](../../docs/roadmap.md) (Part 1 Model-Evolution Audit).
40
+ the merged PRs and the Epic #2646 history; the Part 1 — Model-Evolution
41
+ Audit analysis this section grew out of is preserved at
42
+ `docs/roadmap.md` @ tag `mandrel-v1.94.0` (see the Historical-anchors
43
+ table in the live [`docs/roadmap.md`](../../docs/roadmap.md)).
42
44
 
43
45
  Practical guidance when authoring a contract change:
44
46
 
@@ -79,15 +81,14 @@ checkout — reaping its own merged refs and fast-forwarding the base branch.
79
81
  `/git-cleanup` is a recovery tool, not a routine chore.** The mechanics behind
80
82
  that invariant:
81
83
 
82
- Every flow that lands work — `/deliver` (Epic and standalone-Story paths),
83
- `/git-deliver` — is responsible for leaving the local checkout tidy without
84
+ Every flow that lands work — `/deliver` and `/git-deliver` — is responsible
85
+ for leaving the local checkout tidy without
84
86
  operator intervention:
85
87
 
86
- - **Fast-forwarding the base branch is owned by the flow.** The standalone
87
- multi-Story path fast-forwards `main` itself in its summary phase (via
88
- `git-cleanup.js --fast-forward-main --execute --yes`); the Epic path
89
- fast-forwards `epic/<id>` / `main` on its merge-and-reap beat. No workflow
90
- ends by telling the operator to "run `/git-cleanup` afterwards to catch up".
88
+ - **Fast-forwarding the base branch is owned by the flow.** `/deliver`
89
+ fast-forwards `main` itself in its cleanup phase (via
90
+ `git-cleanup.js --fast-forward-main --execute --yes`). No workflow ends by
91
+ telling the operator to "run `/git-cleanup` afterwards to catch up".
91
92
  - **Reaping merged local refs is owned by the flow's next boot.** `/plan` and
92
93
  `/git-deliver` open with a **protected boot sweep**
93
94
  (`boot-sweep.js`) that fast-forwards `main`, prunes stale remote-tracking
@@ -118,55 +119,44 @@ operator intervention:
118
119
  owning flow's hygiene step regressed — fix the flow, do not codify the manual
119
120
  sweep.
120
121
 
121
- ### Shared-checkout contention (Story #4460)
122
-
123
- `story-close.js`'s merge phase runs `git checkout <epic-branch>` directly in
124
- the **shared main repo checkout** (`close-inputs.js` resolves `mainCwd` to
125
- `PROJECT_ROOT`), not an isolated worktree. `lib/epic-merge-lock.js` guards
126
- that checkout with a **per-Epic** filesystem lock
127
- (`epic-<epicId>.merge.lock`) so two `story-close.js` runs for the **same**
128
- Epic serialize against each otherbut nothing stops a **different**
129
- Epic's concurrently-running `story-close.js` from treating the same shared
130
- checkout as scratch space at the same time.
131
-
132
- - **Recognition signature**: a `git checkout`/`git switch` failure during
133
- the merge phase whose message is `error: Your local changes ... would be
134
- overwritten by checkout`, where the shared checkout is parked on a
135
- **different** epic's branch (e.g. `epic/4405`) than the one the current
136
- `story-close.js` run is trying to merge (e.g. `epic/4425`), with
137
- uncommitted edits that belong to that other Epic's delivery. This was
138
- observed live during Epic #4425 delivery (Stories #4427/#4428) colliding
139
- with a concurrently-running Epic #4405 session, and had to be worked
140
- around by hand via `git stash push -u`.
141
- - **The fix `assertSharedCheckoutAvailable`**
142
- (`lib/orchestration/story-close/shared-checkout-guard.js`), called from
143
- `runFinalizeMerge` in `lib/orchestration/story-close/merge-runner.js`
144
- immediately before the merge-phase `git checkout <epicBranch>`. It
145
- **composes with, not replaces,** the per-Epic lock:
146
- - It first checks the shared common `.git/` dir for a **foreign**
147
- (different-epic) `epic-*.merge.lock` file whose recorded PID is still
148
- alive (`findForeignActiveEpicLock` in `lib/epic-merge-lock.js`). If
149
- found, the merge phase fails fast with a diagnostic naming the holding
150
- epic id, its lock-file path, and its PID/acquired-at timestamp
151
- instead of surfacing the raw git checkout error.
152
- - It then checks whether the shared checkout is simply dirty (via `git
153
- status --porcelain`), regardless of whose branch is checked out, and
154
- reports the dirty file list plus the currently-checked-out branch in
155
- the failure diagnostic.
156
- - It never inspects the **caller's own** epic-id lock namespace, so
157
- same-epic concurrent `story-close.js` runs continue to serialize
158
- solely through `withEpicMergeLock` (the existing per-Epic lock) before
159
- this guard ever executes — this guard only ever refuses on a truly
160
- _foreign_ epic's live lock or unrelated dirt.
161
- - **Not fixed by this guard**: the guard reports the contention early and
162
- actionably; it does not redesign the merge phase to use an isolated
163
- worktree, and it does not change `restoreStartingBranch`'s existing
164
- dirty-tree refusal behavior (`phases/branch-restore.js`) — both remain
165
- out of scope. Resolution of an actual collision is still manual: wait for
166
- the other Epic's story-close run to finish, or — only once you have
167
- independently confirmed that process is no longer running — remove the
168
- stale lock file and resolve the dirty tree by hand (stash/commit/reset;
169
- never `git reset --hard` or `git checkout --force`).
122
+ ### Shared-checkout contention (Stories #4460, #4424, #4545)
123
+
124
+ **One delivery per checkout is the model.** v2 has no Epic integration branch
125
+ and no merge phase that parks the shared checkout on someone else's branch:
126
+ each Story works in its own worktree (`.worktrees/story-<id>/`) and lands by
127
+ pushing `story-<id>` and opening a PR. The Epic-era collision this section used
128
+ to describe `story-close.js` running `git checkout <epic-branch>` in the
129
+ shared main checkout under a per-Epic `epic-*.merge.lock` is gone with the
130
+ machinery that caused it (Story #4545 deleted the last of that prose; the six
131
+ modules it named had already been removed in the v2.0.0 cutover).
132
+
133
+ Two guards remain, and they cover different hazards:
134
+
135
+ - **Per-Story lease** (`lib/orchestration/single-story-lease-guard.js`). The
136
+ standalone path has no Epic-scoped dispatch manifest to serialize two
137
+ operators driving the **same** Story, so `single-story-init.js` takes an
138
+ exclusive, time-bounded lease on the Story ticket (assignee-as-lease) and
139
+ clears it at close. It **fails closed** on a foreign assignee — there is no
140
+ heartbeat ledger to judge staleness from so a foreign holder always blocks
141
+ unless you pass `--steal`, which you should do only after independently
142
+ confirming the other run is dead.
143
+
144
+ - **Wrong-tree guard** (`lib/orchestration/single-story-close/phases/wrong-tree-guard.js`,
145
+ Stories #3364 / #4424). `cd <workCwd>` steers the Bash tool's cwd but does
146
+ **not** scope path-based Edit/Write tools, which resolve absolute paths and
147
+ ignore cwd. An agent whose shell is correctly inside the worktree can still
148
+ edit the main checkout; close then gates a clean worktree and opens a
149
+ silent empty-diff PR. The guard inspects
150
+ `git -C <mainCheckout> status --porcelain` and intersects stray **tracked**
151
+ paths with the Story's own diff-path set, so a concurrent session's unrelated
152
+ dirt does not false-positive (framework-gap #4420). Untracked files are
153
+ ignored as scratch.
154
+
155
+ - **Recognition signature**: close aborts naming stray files in the main
156
+ checkout that intersect the Story's diff. **Resolution**: relocate those
157
+ edits under the worktree, restore the main checkout
158
+ (`git -C <main-repo> checkout -- <files>`), then re-run `/deliver <storyId>`.
159
+ Never `git reset --hard` or `git checkout --force` to clear the way.
170
160
 
171
161
  ## Documentation Freshness Gate
172
162
 
@@ -12,28 +12,22 @@ live in the on-demand
12
12
  **before** doing the matching work; the core below is sufficient for every
13
13
  routine commit, branch, and PR.
14
14
 
15
- ## Canonical Branching (v5 Orchestration)
16
-
17
- ### Epic Base Branch
18
-
19
- Each Epic operates on a dedicated **Epic base branch** named `epic/[EPIC_ID]`
20
- (e.g., `epic/98`). This branch is created from the project's base branch
21
- (`main` by default) and serves as the integration target for all Stories
22
- within that Epic.
23
-
24
- ### Story-Level Branching
25
-
26
- All tasks within a Story MUST be committed to a shared **Story branch**:
27
- `story-<storyId>` (e.g., `story-104`). The runtime owns Story branch
28
- creation via `story-init.js`; agents commit on the active Story branch only.
29
-
30
- > **Commit subjects.** Under the 2-tier hierarchy
31
- > (Epic → Story), Stories have no child tickets. Commits
32
- > land on `story-<storyId>` directly from the agent and the
33
- > Conventional Commit subject references the parent Story via
34
- > `(refs #<storyId>)`. See
35
- > [`.agents/instructions.md` § 5.D](../instructions.md) for the
36
- > full hierarchy contract.
15
+ ## Canonical Branching (v2)
16
+
17
+ ### Story branch → PR → main
18
+
19
+ Every Story lands on a dedicated **Story branch** named `story-<storyId>`
20
+ (e.g., `story-104`), seeded from `project.baseBranch` (`main` by default).
21
+ The runtime owns branch creation via `single-story-init.js`; agents commit
22
+ on that branch only. Close opens a PR against `main` (squash + required
23
+ checks). There is **no** `epic/<id>` integration branch and no `--no-ff`
24
+ wave merge.
25
+
26
+ > **Commit subjects.** Stories have no child tickets. Commits land on
27
+ > `story-<storyId>` directly from the agent and the Conventional Commit
28
+ > subject references the Story via `(refs #<storyId>)`. See
29
+ > [`.agents/instructions.md` § 5.D](../instructions.md) for the hierarchy
30
+ > contract.
37
31
 
38
32
  ## Conventional Commits
39
33