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
@@ -11,7 +11,7 @@
11
11
  * emits the set of Stories safe to dispatch **on this beat** — a Story
12
12
  * becomes dispatchable the instant its own dependencies are done, under the
13
13
  * same global concurrency cap and the same file-overlap co-dispatch guard
14
- * the Epic path uses. There is no wave barrier: this no longer batches
14
+ * `lib/wave-runner/ready-set.js` applies everywhere. There is no wave barrier: this no longer batches
15
15
  * Stories into fully-draining waves; it selects continuously.
16
16
  *
17
17
  * The previous static wave-batch plan (group N must fully drain before
@@ -50,9 +50,9 @@
50
50
  * `/deliver` uses — `resolveConfig` + `getRunners` reading
51
51
  * `delivery.deliverRunner.concurrencyCap` (default 3) — so a
52
52
  * `.agentrc.local.json` override is honored. A `--concurrency <n>` CLI flag
53
- * overrides the config-resolved value for that run only. This puts both the
54
- * standalone (`/deliver`) and Epic (`/deliver`) delivery paths on one
55
- * deterministic config source **and** one scheduling kernel.
53
+ * overrides the config-resolved value for that run only. This shares one
54
+ * deterministic config source (`delivery.deliverRunner.concurrencyCap`) and
55
+ * one scheduling kernel with every `/deliver` multi-Story invocation.
56
56
  *
57
57
  * On cycle detection, exits with code 2 and sets cycleError in the envelope.
58
58
  */
@@ -74,7 +74,7 @@ Continuous ready-set planner for standalone Story delivery. Consumes a
74
74
  dependency graph of Story IDs plus the live run progress and emits the set
75
75
  of Stories safe to dispatch on this beat — a Story is dispatchable the
76
76
  instant its own dependencies are done — plus the resolved per-beat
77
- concurrency cap and the same file-overlap guard the Epic path uses.
77
+ concurrency cap and the same file-overlap guard as selectReadySet.
78
78
 
79
79
  Input DAG format (JSON array):
80
80
  [{ "id": 101, "dependsOn": [] }, { "id": 102, "dependsOn": [101] }]
@@ -257,7 +257,7 @@ export function parseConcurrencyOverride(raw) {
257
257
  /**
258
258
  * Resolve the per-beat concurrency cap.
259
259
  *
260
- * Mirrors the `/deliver` seam (`epic-deliver-prepare.js`): resolve the
260
+ * Mirrors the `/deliver` multi-Story seam (`helpers/deliver-story.md`): resolve the
261
261
  * project config (which deep-merges `.agentrc.local.json` over `.agentrc.json`)
262
262
  * then read `delivery.deliverRunner.concurrencyCap` via `getRunners` (default
263
263
  * 3). An explicit `override` (the `--concurrency <n>` CLI flag) wins over
@@ -2,33 +2,17 @@
2
2
  /* node:coverage ignore file */
3
3
 
4
4
  /**
5
- * story-plan.js — Local `/plan` wrapper.
5
+ * story-plan.js — QA helper for promote round-trips and `--emit-context`
6
+ * envelope emission.
6
7
  *
7
- * Standalone counterpart to `/plan` for Stories that do **not**
8
- * attach to an Epic. The script is deliberately a thin CLI around the
9
- * pure helpers in `lib/story-plan.js`:
8
+ * Canonical operator planning is `plan-context.js` + `plan-persist.js` (see
9
+ * `.agents/workflows/plan.md`). Use this CLI only for QA promote
10
+ * round-trips (`--body` / `--dry-run`) or test harnesses that need the
11
+ * standalone envelope shape.
10
12
  *
11
- * 1. `--emit-context` mode — given a `--idea`/`--from-notes` seed,
12
- * build the context envelope (seed, refine heuristic, persona,
13
- * body template, duplicate candidates, tech-stack summary, and a
14
- * corpus-aware `corpusContext` — the docs digest plus relevant
15
- * existing-Epic Tech Spec excerpts, Story #4432) and print it as
16
- * JSON on stdout. Logs route to stderr so the envelope is
17
- * byte-clean for `JSON.parse`.
18
- * 2. Persist mode — given a `--body <file>` authored by the host
19
- * LLM after operator confirmation, validate the shape and persist
20
- * via `provider.createIssue` (which also adds the new Story to
21
- * the configured Projects V2 board — Story #3822) with
22
- * `type::story` + the chosen persona label, falling back to
23
- * `gh issue create` when the provider lacks a createIssue
24
- * analogue. Prints `Next: /single-story-deliver <id>`.
25
- * 3. `--dry-run` — same as persist but exits without touching
26
- * GitHub. Echoes the rendered body and the `gh` argv it would
27
- * have run.
28
- *
29
- * Mirrors the `/plan` pattern: deterministic Node I/O wrappers
30
- * with HITL gating handled by the host LLM in chat. No external LLM
31
- * APIs are called from this script.
13
+ * Operator planning:
14
+ * node .agents/scripts/plan-context.js --seed "…" | --seed-file <path> | --tickets <ids>
15
+ * node .agents/scripts/plan-persist.js --stories --risk-verdict
32
16
  */
33
17
 
34
18
  import { readFile } from 'node:fs/promises';
@@ -53,10 +37,10 @@ import {
53
37
 
54
38
  const HELP = `\
55
39
  Usage:
56
- story-plan.js --emit-context (--idea "<seed>" | --from-notes <file>) \\
57
- [--persona <name>] [--refine | --no-refine] [--pretty]
40
+ story-plan.js --emit-context (--seed "<seed>" | --seed-file <file>) \\
41
+ [--refine | --no-refine] [--pretty]
58
42
 
59
- story-plan.js --body <file> [--persona <name>] [--dry-run]
43
+ story-plan.js --body <file> [--dry-run]
60
44
 
61
45
  story-plan.js --help
62
46
 
@@ -66,12 +50,11 @@ Modes:
66
50
  draft body using the envelope and the body template.
67
51
  --body <file> Persist a pre-authored body. Validates shape (required
68
52
  sections, no Epic: ref, AC checklist non-empty) and
69
- calls \`gh issue create\` with type::story + persona.
53
+ calls \`gh issue create\` with type::story.
70
54
  --dry-run With --body: print the body and the gh argv that would
71
55
  be invoked, then exit 0. No GitHub mutations.
72
56
 
73
57
  Options:
74
- --persona <name> Persona label (default: engineer).
75
58
  --refine Force the idea-refinement hint on regardless of seed
76
59
  length. Default heuristic: refine when seed < 200
77
60
  chars.
@@ -80,17 +63,17 @@ Options:
80
63
  `;
81
64
 
82
65
  /**
83
- * Resolve the seed string from --idea or --from-notes. One of the two
66
+ * Resolve the seed string from --seed or --seed-file. One of the two
84
67
  * must be present in --emit-context mode.
85
68
  */
86
- async function resolveSeed({ idea, fromNotes }) {
87
- if (idea && fromNotes) {
88
- throw new Error('Pass either --idea or --from-notes, not both.');
69
+ async function resolveSeed({ seed, seedFile }) {
70
+ if (seed && seedFile) {
71
+ throw new Error('Pass either --seed or --seed-file, not both.');
89
72
  }
90
- if (idea) return idea;
91
- if (fromNotes) return (await readFile(fromNotes, 'utf8')).trim();
73
+ if (seed) return seed;
74
+ if (seedFile) return (await readFile(seedFile, 'utf8')).trim();
92
75
  throw new Error(
93
- '--emit-context requires --idea "<seed>" or --from-notes <file>.',
76
+ '--emit-context requires --seed "<seed>" or --seed-file <file>.',
94
77
  );
95
78
  }
96
79
 
@@ -147,12 +130,11 @@ async function runEmitContext({
147
130
  write = (s) => process.stdout.write(s),
148
131
  }) {
149
132
  const seed = await resolveSeed({
150
- idea: values.idea,
151
- fromNotes: values['from-notes'],
133
+ seed: values.seed,
134
+ seedFile: values['seed-file'],
152
135
  });
153
136
  const override = values.refine ? 'on' : values['no-refine'] ? 'off' : null;
154
137
  const refine = shouldRefine({ seed, override });
155
- const persona = values.persona ?? 'engineer';
156
138
 
157
139
  // Corpus lookup uses the raw (un-defaulted) docsContextFiles list, same
158
140
  // as the `/deliver` per-Epic digest builder: `config.project` fills in
@@ -186,7 +168,6 @@ async function runEmitContext({
186
168
  const envelope = buildContextEnvelope({
187
169
  seed,
188
170
  refine,
189
- persona,
190
171
  bodyTemplate,
191
172
  duplicateCandidates,
192
173
  techStack,
@@ -221,8 +202,7 @@ async function runPersist({
221
202
  }
222
203
 
223
204
  const title = extractTitle(body);
224
- const persona = values.persona ?? 'engineer';
225
- const labels = [TYPE_LABELS.STORY, `persona::${persona}`];
205
+ const labels = [TYPE_LABELS.STORY];
226
206
  const argv = renderGhArgv({ title, bodyPath, labels });
227
207
 
228
208
  if (dryRun) {
@@ -264,7 +244,7 @@ async function runPersist({
264
244
  }
265
245
 
266
246
  write(`${JSON.stringify({ issueNumber, title, labels }, null, 2)}\n`);
267
- Logger.info(`Next: /single-story-deliver ${issueNumber}`);
247
+ Logger.info(`Next: /deliver ${issueNumber}`);
268
248
  }
269
249
 
270
250
  /* node:coverage ignore next */
@@ -272,10 +252,9 @@ async function main() {
272
252
  const { values } = parseArgs({
273
253
  options: {
274
254
  'emit-context': { type: 'boolean', default: false },
275
- idea: { type: 'string' },
276
- 'from-notes': { type: 'string' },
255
+ seed: { type: 'string' },
256
+ 'seed-file': { type: 'string' },
277
257
  body: { type: 'string' },
278
- persona: { type: 'string' },
279
258
  refine: { type: 'boolean', default: false },
280
259
  'no-refine': { type: 'boolean', default: false },
281
260
  pretty: { type: 'boolean', default: false },
@@ -0,0 +1,165 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * Projects .agents/agents/ (and .agents/local/agents/ when present) into a flat
5
+ * `.claude/agents/` tree so Claude Code exposes each role definition as a
6
+ * role-scoped sub-agent (`subagent_type: <name>`). Exact sibling of
7
+ * `sync-claude-commands.js` — same header, same local-shadow policy, same
8
+ * orphan-reap, same prune-exempt handling for the consumer-authored
9
+ * `.agents/local/agents/` source. Two source directories are enumerated in
10
+ * order:
11
+ *
12
+ * 1. PAYLOAD_SRC — `.agents/agents/` (the installed Mandrel payload)
13
+ * 2. LOCAL_SRC — `.agents/local/agents/` (consumer-authored, prune-exempt)
14
+ *
15
+ * The payload directory wins on basename collision: if both sources supply
16
+ * `foo.md`, the payload copy is projected and the local copy is ignored with a
17
+ * `shadowed` warning. Because both sources are unioned into `sourceSet`, local
18
+ * agent defs are also protected from the orphan-reap — they survive
19
+ * `npm install`, `mandrel sync`, and `mandrel update` with no manual re-sync.
20
+ *
21
+ * Only top-level `.md` files project (`.claude/agents/<name>.md`). Unlike the
22
+ * commands sync there is no `loops/` namespace and no plugin tree to reap — the
23
+ * agent surface is flat.
24
+ *
25
+ * A `.claude/agents/<name>.md` runs on its **own** system prompt — it does NOT
26
+ * inherit the `CLAUDE.md` @-import closure — so a spawn routed to a role agent
27
+ * stops re-paying the always-loaded context (issue #4478). The role defs
28
+ * @-import `security-baseline.md` so the inviolable security MUSTs stay
29
+ * single-sourced.
30
+ *
31
+ * Usage: node .agents/scripts/sync-claude-agents.js
32
+ */
33
+
34
+ // cli-opt-out: top-level-await script with no main() function — runAsCli wraps an async main, which doesn't apply here.
35
+ import fs from 'node:fs';
36
+ import path from 'node:path';
37
+
38
+ import { applyHeader } from './lib/command-header.js';
39
+ import { Logger } from './lib/Logger.js';
40
+
41
+ // Resolve the project root from the invocation cwd — the consumer project where
42
+ // `.agents/` is materialized and where Claude Code loads `.claude/agents/`.
43
+ // It MUST NOT use `__dirname/../..`: in an npm-installed consumer this script
44
+ // runs from `node_modules/mandrel/.agents/scripts/`, so that climb lands on the
45
+ // package dir and the defs would be written *inside node_modules* rather than
46
+ // the consumer. Every real invocation runs with cwd at the project root
47
+ // (`npm run sync:agents`, the prepare hook). Tests drive fixture trees via the
48
+ // SYNC_CLAUDE_AGENTS_SRC/DEST overrides below.
49
+ const PROJECT_ROOT = process.cwd();
50
+
51
+ // Env-var overrides exist so the sync logic can be exercised against a fixture
52
+ // agents tree in isolation. When unset, behaviour is unchanged — the script
53
+ // defaults to the real agents / .claude/agents directories. SYNC_CLAUDE_AGENTS_SRC
54
+ // overrides the PAYLOAD source only; LOCAL_SRC is always derived from the project
55
+ // root so fixture tests can isolate the payload source.
56
+ const PAYLOAD_SRC =
57
+ process.env.SYNC_CLAUDE_AGENTS_SRC ??
58
+ path.join(PROJECT_ROOT, '.agents', 'agents');
59
+ const LOCAL_SRC = path.join(PROJECT_ROOT, '.agents', 'local', 'agents');
60
+
61
+ const DEST_DIR =
62
+ process.env.SYNC_CLAUDE_AGENTS_DEST ??
63
+ path.join(PROJECT_ROOT, '.claude', 'agents');
64
+
65
+ export const HEADER =
66
+ '<!-- AUTO-GENERATED — do not edit. Source of truth: .agents/agents/ -->\n<!-- Re-run: npm run sync:agents -->\n\n';
67
+
68
+ export const LOCAL_HEADER =
69
+ '<!-- AUTO-GENERATED from .agents/local/ — do not edit. Source of truth: .agents/local/agents/ -->\n<!-- Re-run: npm run sync:agents -->\n\n';
70
+
71
+ /**
72
+ * Return true when the given directory path exists and is accessible.
73
+ *
74
+ * @param {string} dir
75
+ * @returns {boolean}
76
+ */
77
+ function dirExists(dir) {
78
+ try {
79
+ return fs.statSync(dir).isDirectory();
80
+ } catch {
81
+ return false;
82
+ }
83
+ }
84
+
85
+ fs.mkdirSync(DEST_DIR, { recursive: true });
86
+
87
+ // Top-level .md files project flat. Subdirectories are skipped.
88
+ const isTopLevelAgent = (entry) => entry.isFile() && entry.name.endsWith('.md');
89
+
90
+ // Enumerate sources: payload first, then local (if it exists). Payload wins on
91
+ // basename collision — a consumer must not silently shadow a core role def.
92
+ const SRC_DIRS = [PAYLOAD_SRC, LOCAL_SRC].filter(dirExists);
93
+
94
+ /** @type {Array<{dir: string, name: string}>} */
95
+ const entries = SRC_DIRS.flatMap((dir) =>
96
+ fs
97
+ .readdirSync(dir, { withFileTypes: true })
98
+ .filter(isTopLevelAgent)
99
+ .map((e) => ({ dir, name: e.name })),
100
+ );
101
+
102
+ // Collision policy: payload wins, warn on a shadowed local file.
103
+ const byName = new Map();
104
+ for (const e of entries) {
105
+ if (byName.has(e.name)) {
106
+ Logger.warn(` shadowed ${e.name} (local copy ignored; payload wins)`);
107
+ continue;
108
+ }
109
+ byName.set(e.name, e);
110
+ }
111
+
112
+ // sourceSet drives the orphan-reap: any existing agent def not in this set is
113
+ // removed.
114
+ const sourceSet = new Set(byName.keys());
115
+
116
+ /**
117
+ * List the `.md` agent defs currently on disk in the destination.
118
+ *
119
+ * @returns {string[]}
120
+ */
121
+ function listExistingAgents() {
122
+ try {
123
+ return fs.readdirSync(DEST_DIR).filter((f) => f.endsWith('.md'));
124
+ } catch {
125
+ return [];
126
+ }
127
+ }
128
+
129
+ for (const name of listExistingAgents()) {
130
+ if (!sourceSet.has(name)) {
131
+ fs.unlinkSync(path.join(DEST_DIR, name));
132
+ Logger.info(` removed ${name} (no longer in .agents/agents)`);
133
+ }
134
+ }
135
+
136
+ // Copy each role def, injecting the auto-generated header after any leading
137
+ // frontmatter (so the `---` block stays on line 1 and Claude Code parses the
138
+ // agent's name/description). Use a distinct header comment for local-origin files.
139
+ let synced = 0;
140
+ const resolvedEntries = Array.from(byName.values());
141
+ await Promise.all(
142
+ resolvedEntries.map(async ({ dir, name }) => {
143
+ const isLocal = dir === LOCAL_SRC;
144
+ const header = isLocal ? LOCAL_HEADER : HEADER;
145
+ const content = await fs.promises.readFile(path.join(dir, name), 'utf8');
146
+ const dest = path.join(DEST_DIR, name);
147
+ const target = applyHeader(content, header);
148
+
149
+ // Skip write if content is already identical (avoid noisy git diffs).
150
+ try {
151
+ const existingContent = await fs.promises.readFile(dest, 'utf8');
152
+ if (existingContent === target) return;
153
+ } catch (err) {
154
+ if (err.code !== 'ENOENT') throw err;
155
+ }
156
+
157
+ await fs.promises.writeFile(dest, target, 'utf8');
158
+ synced++;
159
+ Logger.info(` synced ${name}`);
160
+ }),
161
+ );
162
+
163
+ Logger.info(
164
+ `\n✔ ${synced} file(s) synced, ${sourceSet.size} total agents in .claude/agents/`,
165
+ );
@@ -1,18 +1,17 @@
1
1
  /**
2
- * .agents/scripts/update-ticket-state.js — CLI Re-export Shim
3
- *
4
- * Thin backward-compatibility shim. The core logic has been moved to
5
- * `lib/orchestration/ticketing.js` as part of the SDK refactor.
6
- *
7
- * This file preserves backward compatibility for CLI usage and existing
8
- * testing patterns.
9
- *
10
- * Successor to the retired mandrel MCP tools. See ADR 20260424-702a in docs/decisions.md for the migration table.
2
+ * .agents/scripts/update-ticket-state.js — CLI entrypoint for ticket
3
+ * label transitions. Core logic lives in `lib/orchestration/ticketing.js`;
4
+ * this file is the operator-facing command surface (not a compatibility
5
+ * layer).
11
6
  */
12
7
 
13
8
  import { parseArgs } from 'node:util';
14
9
  import { resolveConfig } from './lib/config-resolver.js';
15
10
  import { Logger } from './lib/Logger.js';
11
+ import {
12
+ enqueueLabel,
13
+ outboxPathFor,
14
+ } from './lib/orchestration/bookkeeping-outbox.js';
16
15
  import {
17
16
  cascadeCompletion,
18
17
  STATE_LABELS,
@@ -29,25 +28,23 @@ if (
29
28
  const { values } = parseArgs({
30
29
  args: process.argv.slice(2),
31
30
  options: {
32
- task: { type: 'string' },
33
31
  ticket: { type: 'string' },
34
32
  state: { type: 'string' },
35
33
  'remove-label': { type: 'string' },
34
+ buffer: { type: 'boolean' },
35
+ epic: { type: 'string' },
36
36
  },
37
37
  strict: false,
38
38
  });
39
39
 
40
- // `--ticket` is the v5.9.0 alias for `--task` (labels can apply to any
41
- // ticket type, not just Tasks). Both continue to work.
42
- const idSource = values.ticket ?? values.task;
43
- const ticketId = Number.parseInt(idSource, 10);
40
+ const ticketId = Number.parseInt(values.ticket, 10);
44
41
  const state = values.state;
45
42
  const removeLabel = values['remove-label'];
46
43
 
47
44
  if (Number.isNaN(ticketId) || (!state && !removeLabel)) {
48
45
  throw new Error(
49
46
  'Usage: node update-ticket-state.js ' +
50
- '(--ticket|--task) <id> ' +
47
+ '--ticket <id> ' +
51
48
  '[--state <state> | --remove-label <label>]',
52
49
  );
53
50
  }
@@ -69,6 +66,31 @@ if (
69
66
  return;
70
67
  }
71
68
 
69
+ // Headless buffering (Epic #4476 M5): buffer an intermediate state flip to
70
+ // the per-Epic outbox instead of a live GitHub round-trip; finalize's
71
+ // bookkeeping-reconcile.js drains it once. `agent::blocked` (the HITL gate,
72
+ // §1.J) and `agent::done` (its cascade must run live) ALWAYS surface
73
+ // immediately and are never buffered. Requires --epic to locate the outbox.
74
+ if (
75
+ values.buffer &&
76
+ state !== STATE_LABELS.BLOCKED &&
77
+ state !== STATE_LABELS.DONE
78
+ ) {
79
+ const epicId = Number.parseInt(values.epic ?? '', 10);
80
+ if (!Number.isInteger(epicId) || epicId <= 0) {
81
+ throw new Error('--buffer requires --epic <id>');
82
+ }
83
+ enqueueLabel({
84
+ outboxPath: outboxPathFor(epicId, config),
85
+ ticketId,
86
+ state,
87
+ });
88
+ Logger.info(
89
+ `[State-Sync] Buffered #${ticketId} → ${state} (headless; drained at finalize)`,
90
+ );
91
+ return;
92
+ }
93
+
72
94
  Logger.info(
73
95
  `[State-Sync] Transitioning ticket #${ticketId} to ${state}...`,
74
96
  );
@@ -1,10 +1,10 @@
1
1
  ---
2
2
  name: analyze-execution
3
3
  description: >-
4
- Aggregate per-Story or per-Epic execution signals into a structured
4
+ Aggregate per-Story or per-plan-run execution signals into a structured
5
5
  perf-summary or perf-report and upsert it onto the corresponding GitHub
6
- ticket. Use after a Story closes (Story mode) or as part of
7
- `/deliver` Phase 6 (Epic mode). Reads NDJSON via
6
+ ticket. Use after a Story closes (Story mode) or during run closeout
7
+ (plan-run mode). Reads NDJSON via
8
8
  `lib/signals/read` and writes a single structured comment.
9
9
  allowed_tools:
10
10
  - Read
@@ -16,42 +16,42 @@ allowed_tools:
16
16
  ## Policy Capsule
17
17
 
18
18
  - Invoke via the wrapping CLI `node .agents/scripts/analyze-execution.js`; do not duplicate the read/write logic from this Skill body.
19
- - Resolve mode strictly by flags: `--story <sid> --epic <eid>` → Story mode; `--epic <eid>` alone → Epic mode.
20
- - Read NDJSON signals only through `lib/signals/read` (the async-iterator entry point). Never open `<tempRoot>/epic-<eid>/story-<sid>/signals.ndjson` directly — the reader owns the warn-once malformed-JSON policy.
19
+ - Resolve mode strictly by flags: Story + run id → Story mode; run id alone → plan-run mode. The current CLI still spells the run-id flag as `--epic <id>`; treat that value as the run id and do not add a second executor path here.
20
+ - Read NDJSON signals only through `lib/signals/read` (the async-iterator entry point). Never open `<tempRoot>/run-<id>/stories/story-<sid>/signals.ndjson` directly — the reader owns the warn-once malformed-JSON policy.
21
21
  - Emit a single structured GitHub comment per ticket (`<!-- structured:story-perf-summary -->` or `<!-- structured:epic-perf-report -->`); rely on `upsertStructuredComment` for idempotence — never post duplicates.
22
- - Never rename or alter the structured-marker IDs; the retro composer and Epic dashboard grep them verbatim.
22
+ - Never rename or alter the structured-marker IDs; the retro composer and run dashboard grep them verbatim.
23
23
  - Validate the structured payload against `docs/data-dictionary.md §StoryPerfSummary` or `§EpicPerfReport` before posting. Schema violations exit non-zero.
24
- - Soft-fail (exit 0 with a warning) when NDJSON is missing for a Story or an Epic has no children — observability output MUST NOT block the close pipeline.
24
+ - Soft-fail (exit 0 with a warning) when NDJSON is missing for a Story or a plan-run has no children — observability output MUST NOT block the close pipeline.
25
25
  - Do not write to disk. Persistence is GitHub; the Skill is read-NDJSON + post-comment only.
26
26
 
27
27
  ## Role
28
28
 
29
29
  Observability writer. Composes the structured `story-perf-summary` /
30
30
  `epic-perf-report` comment bodies the retro composer downstream renders
31
- into the Epic dashboard.
31
+ into the run dashboard.
32
32
 
33
33
  ## When to use
34
34
 
35
- - **Story mode** — after `story-close.js` finishes, the post-merge
35
+ - **Story mode** — after `single-story-close.js` finishes, the close
36
36
  pipeline dispatches this Skill (or the wrapping script) to roll up the
37
37
  Story's NDJSON signals into a single `<!-- structured:story-perf-summary -->`
38
38
  marker comment on the Story ticket.
39
- - **Epic mode** — during `/deliver` Phase 6.0 (or the retro
40
- composer), the Skill fans out across every Story under the Epic,
39
+ - **Plan-run mode** — during run closeout (or the retro
40
+ composer), the Skill fans out across every Story under the plan-run,
41
41
  reads each Story's structured perf summary, and posts a single
42
- `<!-- structured:epic-perf-report -->` marker on the Epic ticket.
42
+ `<!-- structured:epic-perf-report -->` marker on the run ticket.
43
43
 
44
44
  ## Inputs
45
45
 
46
46
  The Skill reads (never writes) the NDJSON signal stream at:
47
47
 
48
48
  ```text
49
- <tempRoot>/epic-<eid>/story-<sid>/signals.ndjson
49
+ <tempRoot>/run-<id>/stories/story-<sid>/signals.ndjson
50
50
  ```
51
51
 
52
52
  Use the `lib/signals/read` async-iterator entry point — never open the
53
53
  file directly. Story mode also reads `phase-timings.json` written by
54
- `post-merge-close.js`.
54
+ the close pipeline.
55
55
 
56
56
  ## Outputs
57
57
 
@@ -64,8 +64,8 @@ the new one.
64
64
 
65
65
  ### Step 1 — Resolve mode
66
66
 
67
- If both `--story <sid>` and `--epic <eid>` are supplied → Story mode.
68
- If only `--epic <eid>` is supplied → Epic mode. The script
67
+ If both Story id and run id are supplied → Story mode.
68
+ If only run id is supplied → plan-run mode. The script
69
69
  `analyze-execution.js` is the dispatcher today; this Skill documents the
70
70
  contract the dispatcher implements.
71
71
 
@@ -77,6 +77,9 @@ node .agents/scripts/analyze-execution.js --story <sid> --epic <eid>
77
77
  node .agents/scripts/analyze-execution.js --epic <eid>
78
78
  ```
79
79
 
80
+ `--epic <eid>` is the legacy spelling of the run-id flag in the current
81
+ CLI; treat `<eid>` as the run id for path/layout purposes.
82
+
80
83
  ### Step 3 — Validate the structured payload before posting
81
84
 
82
85
  The payload must conform to `docs/data-dictionary.md §StoryPerfSummary`
@@ -92,7 +95,7 @@ the contract so we never silently emit malformed comments.
92
95
  - Do **not** rename the structured-marker IDs
93
96
  (`<!-- structured:story-perf-summary -->`,
94
97
  `<!-- structured:epic-perf-report -->`); the retro composer and the
95
- Epic dashboard both grep for them verbatim.
98
+ run dashboard both grep for them verbatim.
96
99
  - Soft-failure mode is intentional: missing NDJSON for a Story or no
97
- children for an Epic returns exit 0 with a warning so close pipelines
100
+ children for a plan-run returns exit 0 with a warning so close pipelines
98
101
  never block on observability output.
@@ -19,7 +19,7 @@ description:
19
19
  - Define the contract before implementing — interfaces are the spec; implementation follows.
20
20
  - Validate at system **boundaries** (API routes, form handlers, env-var loaders, third-party responses) using a strict schema. After validation, internal code trusts the types; do not re-validate between internal functions.
21
21
  - Treat third-party API responses as untrusted data — validate shape and content before using them in any decision, render, or logic path.
22
- - Prefer **addition over modification**: extend interfaces with optional fields rather than changing existing types or removing fields; reach for the deprecation playbook (see `deprecation-and-migration`) when removal is unavoidable.
22
+ - Prefer **addition over modification**: extend interfaces with optional fields rather than changing existing types or removing fields. When removal is unavoidable, use an expand–contract migration ship the replacement, migrate consumers, then remove the old surface in a later release.
23
23
  - Follow REST resource conventions (`GET/POST/PATCH/DELETE /resource`, sub-resources at `/resource/:id/child`) and paginate every list endpoint with `page` + `pageSize` query params and a `pagination` envelope.
24
24
  - Security input-validation and test-tier MUSTs come from `.agents/rules/security-baseline.md` and `.agents/rules/testing-standards.md` respectively — apply both, and never put DB/wire-shape assertions outside the contract tier.
25
25
 
@@ -55,8 +55,10 @@ ordering — becomes a de facto contract once users depend on it. Implications:
55
55
  potential commitment.
56
56
  - **Don't leak implementation details.** If users can observe it, they will
57
57
  depend on it.
58
- - **Plan for deprecation at design time.** See `deprecation-and-migration`
59
- for how to safely remove things users depend on.
58
+ - **Plan for deprecation at design time.** Remove things users depend on via
59
+ expand–contract: add the replacement, migrate consumers behind a deprecation
60
+ window, then delete the old surface — never break a published contract in one
61
+ step.
60
62
  - **Tests are not enough.** Even with perfect contract tests, "safe" changes
61
63
  can break real users who depend on undocumented behavior.
62
64