@desplega.ai/agent-swarm 2.6.0 → 2.7.1

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 (324) hide show
  1. package/README.md +2 -0
  2. package/dist/{acp-adapter-dgfakfpw.js → acp-adapter-8dn5tq56.js} +6 -6
  3. package/dist/{actions-fbqma8aa.js → actions-3r6gw7dy.js} +18 -18
  4. package/dist/{amp-adapter-en0jy6hs.js → amp-adapter-wjtq413p.js} +3 -3
  5. package/dist/{anthropic-messages-txs190dd.js → anthropic-messages-n4cby1rz.js} +4 -4
  6. package/dist/{app-k8a5cgpp.js → app-d53yhykk.js} +3 -3
  7. package/dist/{assistant-a16433gr.js → assistant-ksrawj3k.js} +20 -20
  8. package/dist/{boot-reembed-6c1sjfnr.js → boot-reembed-fxfw17m2.js} +11 -3
  9. package/dist/{boot-reembed-f4nn561n.js → boot-reembed-k5y5xbj0.js} +15 -8
  10. package/dist/{boot-scrub-sweep-d4w9gajf.js → boot-scrub-sweep-se41j9fd.js} +3 -3
  11. package/dist/{boot-seeds-9bmkspyw.js → boot-seeds-r3kwwv8b.js} +4 -4
  12. package/dist/{claude-adapter-nys1kjxa.js → claude-adapter-ahmyf231.js} +8 -8
  13. package/dist/{claude-managed-adapter-55207973.js → claude-managed-adapter-5knamegc.js} +3 -3
  14. package/dist/{claude-managed-setup-3cm35gey.js → claude-managed-setup-mdc7dy6b.js} +3 -3
  15. package/dist/{claude-sdk-session-nw5yd8cp.js → claude-sdk-session-n5wen9zk.js} +8729 -8600
  16. package/dist/{cli-683y0b3a.js → cli-0dqtv2jg.js} +2 -2
  17. package/dist/{cli-a34pr3w1.js → cli-0tww7dnz.js} +2 -2
  18. package/dist/{cli-w2656ka1.js → cli-0w4e4v58.js} +7 -7
  19. package/dist/{cli-5sckpqcx.js → cli-2sjm3t4r.js} +1 -1
  20. package/dist/{cli-gf2850q7.js → cli-3cywb44q.js} +18 -1
  21. package/dist/{cli-8wkb09q5.js → cli-3k9jej0c.js} +2 -2
  22. package/dist/{cli-3aqd4jaa.js → cli-3v2cyqb8.js} +3 -3
  23. package/dist/{cli-emhjcj2y.js → cli-5qt9vzmq.js} +89 -20
  24. package/dist/{cli-abkm71vr.js → cli-5rp1w4cr.js} +1 -1
  25. package/dist/{cli-gf95q3bm.js → cli-6vwjsetx.js} +4 -4
  26. package/dist/{cli-k21gx5ht.js → cli-6w2yrrc0.js} +10 -10
  27. package/dist/{cli-m70bajzr.js → cli-75tdydgv.js} +1 -1
  28. package/dist/{cli-5rj83bam.js → cli-8feswf2v.js} +47 -36
  29. package/dist/{cli-sxgtf5fw.js → cli-8wd3mbyj.js} +1 -1
  30. package/dist/{cli-ca6banwz.js → cli-9csfthbw.js} +10 -8
  31. package/dist/{cli-dqygeeh5.js → cli-b41p764a.js} +31 -3
  32. package/dist/{cli-m5a9m0ak.js → cli-c1t533hh.js} +3 -3
  33. package/dist/{cli-2sjhpsns.js → cli-c28jxpcv.js} +1 -1
  34. package/dist/{cli-bqztfyve.js → cli-cb50g9cd.js} +1 -1
  35. package/dist/{cli-ag2yrnt5.js → cli-d8gaphtr.js} +2 -2
  36. package/dist/{cli-9abdgn5t.js → cli-dgtfysne.js} +3 -3
  37. package/dist/{cli-nq677csy.js → cli-dscnhn18.js} +1 -1
  38. package/dist/{cli-3fwqy71j.js → cli-dv11pgpv.js} +39 -32
  39. package/dist/{cli-v49fkghp.js → cli-ekptgk2m.js} +6 -6
  40. package/dist/{cli-c2habvsf.js → cli-f3mzy662.js} +17 -17
  41. package/dist/{cli-zqne1qcj.js → cli-fk7k8s9x.js} +2 -2
  42. package/dist/{cli-1tem6ns9.js → cli-gt4h8cxw.js} +3 -2
  43. package/dist/{cli-vbhgkw9h.js → cli-h3e7bhvn.js} +3 -3
  44. package/dist/{cli-ffvsj2qw.js → cli-hkxqdmnb.js} +3 -3
  45. package/dist/{cli-a2rr0fmg.js → cli-hpkvgdad.js} +7 -4
  46. package/dist/{cli-art7c1zh.js → cli-hq2v4rr5.js} +37 -9
  47. package/dist/{cli-sqma6vw1.js → cli-k1zb7raw.js} +5 -5
  48. package/dist/{cli-4rvr7zfx.js → cli-k4awgvzm.js} +5 -0
  49. package/dist/{cli-3ndmpxxv.js → cli-k7d3hvya.js} +2 -2
  50. package/dist/{cli-3gfvmzht.js → cli-kbtdftbw.js} +74 -26
  51. package/dist/{cli-hfeb68z4.js → cli-kj69b9tw.js} +34 -6
  52. package/dist/{cli-az25fn5f.js → cli-kk9jy4nm.js} +2 -2
  53. package/dist/{cli-39aet655.js → cli-m52t4cta.js} +1 -1
  54. package/dist/{cli-cz37jqss.js → cli-mdadewqp.js} +5 -5
  55. package/dist/{cli-esakngh8.js → cli-nf6k60sn.js} +1 -1
  56. package/dist/{cli-j6rktc91.js → cli-nzdf09js.js} +1 -1
  57. package/dist/{cli-rr7zx19j.js → cli-prcyzecg.js} +12 -12
  58. package/dist/{cli-4hxrf0p4.js → cli-pzafyqtk.js} +393 -62
  59. package/dist/{cli-g8ka5j4j.js → cli-qvaa1gjp.js} +173 -52
  60. package/dist/{cli-d2dpf95n.js → cli-rg4b2g6j.js} +1 -1
  61. package/dist/{cli-kf4jree9.js → cli-rm66vqdz.js} +1 -1
  62. package/dist/{cli-4rf0f5vg.js → cli-s504c3w7.js} +5 -3
  63. package/dist/{cli-nn6vx2mq.js → cli-swkx9jm2.js} +7 -5
  64. package/dist/{cli-g20jjwt4.js → cli-thsaq4pd.js} +16 -16
  65. package/dist/{cli-aj8djyqt.js → cli-twjnyvs8.js} +2 -2
  66. package/dist/{cli-03gg9pd1.js → cli-typdpe8g.js} +4 -4
  67. package/dist/{cli-mtnj4fwa.js → cli-vg8pwmsd.js} +6 -6
  68. package/dist/{cli-gnsb1zxa.js → cli-vhpckzvp.js} +1 -1
  69. package/dist/{cli-7enjwya9.js → cli-vz78s5wm.js} +1 -1
  70. package/dist/{cli-dv97kdzv.js → cli-wdxgsdz5.js} +2 -2
  71. package/dist/{cli-7a6p4e65.js → cli-wtjg6je3.js} +1 -1
  72. package/dist/{cli-6y51ryva.js → cli-x3cngb1h.js} +44 -12
  73. package/dist/{cli-n7asmce6.js → cli-xbz6mcg4.js} +3 -3
  74. package/dist/{cli-24j1jeeb.js → cli-y4tdxsqb.js} +3 -3
  75. package/dist/{cli-mvjz5an3.js → cli-yqrsp3ny.js} +7 -7
  76. package/dist/cli.js +31 -21
  77. package/dist/{codex-adapter-d95q4qsn.js → codex-adapter-7wepzq15.js} +6 -6
  78. package/dist/{codex-hook-brpnycn5.js → codex-hook-pbdh4xhx.js} +2 -2
  79. package/dist/{codex-session-runner-gdwd8h0c.js → codex-session-runner-02sb49e4.js} +6 -6
  80. package/dist/{commands-jqmgk54b.js → commands-3rcspxct.js} +2 -2
  81. package/dist/{controller-z3jq589f.js → controller-8ar4avd6.js} +3 -3
  82. package/dist/{controllers-connect-r2za39ef.js → controllers-connect-ajvh9h0v.js} +19 -19
  83. package/dist/{cursor-adapter-4mr4jgkw.js → cursor-adapter-gd0sa7bh.js} +1 -1
  84. package/dist/{db-w36wwb5g.js → db-dv9j7ts5.js} +2 -2
  85. package/dist/{db-ppv2tze7.js → db-z26vgdvj.js} +3 -3
  86. package/dist/{dispatcher-pv5h77vf.js → dispatcher-8m0htjq8.js} +17 -17
  87. package/dist/{dsh-adapter-d4pdpb3r.js → dsh-adapter-y8gyk130.js} +1 -1
  88. package/dist/{e2b-fn3zacvt.js → e2b-74vg9b7e.js} +1 -1
  89. package/dist/{e2b-222hsajc.js → e2b-jyay8wzn.js} +1 -1
  90. package/dist/{easter-egg-3d-4sp4dvmc.js → easter-egg-3d-28f880xx.js} +1 -1
  91. package/dist/{execute-jev839y1.js → execute-9seb79vh.js} +1 -1
  92. package/dist/{external-channel-y6nkzhnn.js → external-channel-smz7jyth.js} +2 -2
  93. package/dist/{getMachineId-bsd-brn0xym3.js → getMachineId-bsd-whfre6gr.js} +3 -3
  94. package/dist/{getMachineId-darwin-t339sfxm.js → getMachineId-darwin-5zjynb19.js} +3 -3
  95. package/dist/{getMachineId-linux-5eq95d8b.js → getMachineId-linux-8mksrrsq.js} +3 -3
  96. package/dist/{getMachineId-unsupported-qavrtc7j.js → getMachineId-unsupported-fxtqsdt2.js} +3 -3
  97. package/dist/{getMachineId-win-q7fe1wx7.js → getMachineId-win-nzfmz857.js} +3 -3
  98. package/dist/{grok-adapter-t08b9ntm.js → grok-adapter-z0nnvtbn.js} +7 -7
  99. package/dist/handlers-pspryh6g.js +41 -0
  100. package/dist/{heartbeat-vn31xwdk.js → heartbeat-f928aqyp.js} +20 -20
  101. package/dist/{hook-cpjs8q51.js → hook-d7c605r4.js} +7 -7
  102. package/dist/{hook-6d0zbvvt.js → hook-q9hv5xf9.js} +5 -5
  103. package/dist/{http-9c6medda.js → http-q6j4k989.js} +1000 -251
  104. package/dist/{index-k0yt1tvq.js → index-5nb266jr.js} +17 -17
  105. package/dist/{index-ysd45kgc.js → index-8fxt5eah.js} +10 -10
  106. package/dist/{index-zgvqzjsw.js → index-cekzwhez.js} +5 -5
  107. package/dist/{index-38t35h0n.js → index-ch0c1xff.js} +17 -17
  108. package/dist/{index-pkma1yf8.js → index-ebnjhxh1.js} +1 -1
  109. package/dist/{index-yqgbfgaj.js → index-ed8dy8rn.js} +20 -20
  110. package/dist/{index-qhjf2htm.js → index-ejqdkkqx.js} +262 -96
  111. package/dist/{index-dr94zbnh.js → index-farm1zsn.js} +32661 -29443
  112. package/dist/{index-g6k9tctj.js → index-yn1yxg85.js} +1 -1
  113. package/dist/{keepalive-em0117bp.js → keepalive-zzc3hks1.js} +3 -3
  114. package/dist/lead-c0pjcaw4.js +79 -0
  115. package/dist/{maintenance-kbme3qy9.js → maintenance-kqsxzpzx.js} +1 -1
  116. package/dist/{oauth-refresh-sweep-xysj4yse.js → oauth-refresh-sweep-7qt0g55z.js} +8 -3
  117. package/dist/{onboard-p6q0vz97.js → onboard-k7x13fqg.js} +121 -8
  118. package/dist/{opencode-adapter-esv3k9yn.js → opencode-adapter-tqvrtter.js} +5 -5
  119. package/dist/{otel-impl-54qhqh1z.js → otel-impl-sqkf6k3b.js} +97 -97
  120. package/dist/{pi-mono-adapter-mymbwhj0.js → pi-mono-adapter-m2qnafxm.js} +89 -14
  121. package/dist/{pricing-refresh-yb75wv33.js → pricing-refresh-wkpwhgvs.js} +3 -3
  122. package/dist/{rbac-roles-dexhc9x8.js → rbac-roles-dpn0c0wj.js} +7 -4
  123. package/dist/{rbac-roles-1vp2mw4p.js → rbac-roles-wk7xd6a6.js} +2 -2
  124. package/dist/{render-v2-tjay5hhf.js → render-v2-ex2m4g2k.js} +3 -3
  125. package/dist/{resume-8ayf37g5.js → resume-725g9b0b.js} +7 -7
  126. package/dist/{runtime-hqe5cqcd.js → runtime-kajas15g.js} +1 -1
  127. package/dist/{session-access-fdhp987s.js → session-access-0j2ezjje.js} +8 -4
  128. package/dist/{session-source-backfill-qgtc86z1.js → session-source-backfill-62202awe.js} +2 -2
  129. package/dist/{setup-4rrmqcq3.js → setup-9sj11ax6.js} +1 -1
  130. package/dist/{virtual-modules-52km00d6.js → virtual-modules-c6fcq6zr.js} +2 -2
  131. package/dist/{work-objects-p28fgd70.js → work-objects-0y07495y.js} +20 -20
  132. package/dist/worker-d4q9sqbc.js +79 -0
  133. package/openapi.json +1536 -407
  134. package/package.json +7 -5
  135. package/src/be/automation-preflight.ts +2 -0
  136. package/src/be/connector-codes.ts +65 -22
  137. package/src/be/db/api-keys.ts +9 -0
  138. package/src/be/db/workflow-runs.ts +36 -5
  139. package/src/be/db.ts +80 -22
  140. package/src/be/memory/boot-reembed.ts +4 -1
  141. package/src/be/memory/constants.ts +6 -0
  142. package/src/be/memory/embedding-recovery.ts +48 -0
  143. package/src/be/memory/index-content.ts +5 -2
  144. package/src/be/memory/providers/openai-embedding.ts +65 -14
  145. package/src/be/memory/task-learning.ts +257 -0
  146. package/src/be/memory/types.ts +13 -2
  147. package/src/be/migrations/245_script_executor.sql +3 -0
  148. package/src/be/migrations/246_connector_code_kind.sql +11 -0
  149. package/src/be/oauth-refresh-sweep.ts +2 -1
  150. package/src/be/onboarding.ts +125 -15
  151. package/src/be/rbac-roles.ts +4 -1
  152. package/src/be/scripts/boot-reembed.ts +2 -0
  153. package/src/be/scripts/db.ts +14 -4
  154. package/src/be/scripts/embeddings.ts +4 -2
  155. package/src/be/scripts/run-saved.ts +1 -0
  156. package/src/be/scripts/typecheck.ts +9 -3
  157. package/src/be/seed/agent-fs-provision.ts +75 -14
  158. package/src/be/seed-skills/index.ts +7 -0
  159. package/src/be/swarm-config-guard.ts +3 -0
  160. package/src/cli.tsx +9 -0
  161. package/src/comb/config.ts +6 -1
  162. package/src/commands/onboard/agent-fs-version.ts +5 -0
  163. package/src/commands/onboard/compose-generator.ts +117 -4
  164. package/src/commands/onboard/env-generator.ts +9 -0
  165. package/src/commands/onboard/tei-image.ts +12 -0
  166. package/src/commands/onboard/types.ts +7 -0
  167. package/src/commands/onboard.tsx +11 -1
  168. package/src/commands/provider-credentials.ts +2 -1
  169. package/src/commands/runner.ts +14 -1
  170. package/src/heartbeat/heartbeat.ts +14 -1
  171. package/src/heartbeat/script-runner-probe.ts +47 -0
  172. package/src/http/agentfs-proxy.ts +369 -0
  173. package/src/http/all-routes.ts +1 -0
  174. package/src/http/api-keys.ts +24 -9
  175. package/src/http/codex-oauth-device.ts +8 -1
  176. package/src/http/fs.ts +64 -10
  177. package/src/http/idempotency-key.ts +1 -1
  178. package/src/http/inbox-state.ts +27 -1
  179. package/src/http/index.ts +7 -4
  180. package/src/http/memory.ts +7 -4
  181. package/src/http/onboarding.ts +139 -11
  182. package/src/http/pages-public.ts +38 -5
  183. package/src/http/scripts.ts +27 -0
  184. package/src/http/session-access.ts +24 -0
  185. package/src/http/sessions.ts +10 -6
  186. package/src/http/tasks.ts +85 -11
  187. package/src/http/telemetry-ui.ts +1 -1
  188. package/src/http/user-roles.ts +4 -1
  189. package/src/http/users.ts +272 -3
  190. package/src/http/utils.ts +22 -3
  191. package/src/http/workflows.ts +10 -0
  192. package/src/http/x.ts +5 -0
  193. package/src/prompts/base-prompt.ts +45 -10
  194. package/src/prompts/session-templates.ts +43 -5
  195. package/src/providers/amp-adapter.ts +1 -1
  196. package/src/providers/codex-adapter.ts +6 -1
  197. package/src/providers/cursor-adapter.ts +1 -1
  198. package/src/providers/dsh-adapter.ts +1 -1
  199. package/src/providers/pi-mono-adapter.ts +99 -14
  200. package/src/rbac/legacy-policy.ts +1 -0
  201. package/src/rbac/permissions.ts +4 -0
  202. package/src/scheduler/scheduler.ts +2 -1
  203. package/src/scripts-runtime/eval-harness.ts +8 -1
  204. package/src/scripts-runtime/executors/native.ts +22 -16
  205. package/src/scripts-runtime/executors/quickjs-prelude.ts +103 -1
  206. package/src/scripts-runtime/executors/quickjs-runner.ts +2 -1
  207. package/src/scripts-runtime/executors/quickjs.ts +7 -0
  208. package/src/scripts-runtime/executors/registry.ts +32 -0
  209. package/src/scripts-runtime/executors/types.ts +7 -0
  210. package/src/scripts-runtime/host-validated-args.ts +133 -0
  211. package/src/scripts-runtime/loader.ts +30 -3
  212. package/src/scripts-runtime/swarm-sdk.ts +9 -2
  213. package/src/scripts-runtime/types/stdlib.d.ts +9 -1
  214. package/src/scripts-runtime/types/swarm-sdk.d.ts +9 -1
  215. package/src/tests/agent-fs-provision-seeder.test.ts +261 -92
  216. package/src/tests/agentfs-proxy.test.ts +1106 -0
  217. package/src/tests/api-key-status-by-suffix.test.ts +242 -0
  218. package/src/tests/base-prompt.test.ts +139 -4
  219. package/src/tests/codex-adapter.test.ts +46 -8
  220. package/src/tests/codex-oauth-device.test.ts +12 -1
  221. package/src/tests/comb-config-guard.test.ts +20 -0
  222. package/src/tests/comb-links.test.ts +79 -1
  223. package/src/tests/comb-status.test.ts +44 -0
  224. package/src/tests/community-linear-delivery-loop.test.ts +2099 -0
  225. package/src/tests/credential-check.test.ts +4 -2
  226. package/src/tests/docs-index-footprint.test.js +3 -3
  227. package/src/tests/docs-index.test.ts +135 -0
  228. package/src/tests/dsh-adapter.test.ts +1 -1
  229. package/src/tests/fetch-resolved-env.test.ts +16 -2
  230. package/src/tests/fixtures/onboard/baseline-states.ts +68 -0
  231. package/src/tests/fixtures/onboard/content.compose.yml.txt +190 -0
  232. package/src/tests/fixtures/onboard/content.env.txt +29 -0
  233. package/src/tests/fixtures/onboard/dev.compose.yml.txt +155 -0
  234. package/src/tests/fixtures/onboard/dev.env.txt +28 -0
  235. package/src/tests/fixtures/onboard/full-all.compose.yml.txt +582 -0
  236. package/src/tests/fixtures/onboard/full-all.env.txt +59 -0
  237. package/src/tests/fixtures/onboard/full.compose.yml.txt +435 -0
  238. package/src/tests/fixtures/onboard/full.env.txt +36 -0
  239. package/src/tests/fixtures/onboard/research.compose.yml.txt +155 -0
  240. package/src/tests/fixtures/onboard/research.env.txt +28 -0
  241. package/src/tests/fixtures/onboard/solo.compose.yml.txt +85 -0
  242. package/src/tests/fixtures/onboard/solo.env.txt +26 -0
  243. package/src/tests/heartbeat-checklist.test.ts +89 -0
  244. package/src/tests/heartbeat-script-runner-probe.test.ts +83 -0
  245. package/src/tests/http-log-scrubbing.test.ts +34 -1
  246. package/src/tests/http-task-write-ownership.test.ts +5 -1
  247. package/src/tests/invites-http.test.ts +464 -0
  248. package/src/tests/memory-embedding-input-cap.test.ts +122 -1
  249. package/src/tests/memory-embedding-recovery.test.ts +137 -0
  250. package/src/tests/oauth-refresh-sweep.test.ts +34 -1
  251. package/src/tests/onboard-compose.test.ts +162 -0
  252. package/src/tests/onboard-env.test.ts +24 -0
  253. package/src/tests/onboard-non-interactive.test.ts +29 -0
  254. package/src/tests/onboard-tei-image.test.ts +36 -0
  255. package/src/tests/onboarding.test.ts +451 -4
  256. package/src/tests/openai-embedding-provider.test.ts +105 -2
  257. package/src/tests/opencode-adapter.test.ts +2 -1
  258. package/src/tests/pages-frame-ancestors.test.ts +162 -0
  259. package/src/tests/pi-codemode.test.ts +2 -1
  260. package/src/tests/pi-mono-adapter.test.ts +54 -0
  261. package/src/tests/pi-mono-session-cost-on-abort.test.ts +270 -0
  262. package/src/tests/pi-native-mcp.test.ts +13 -1
  263. package/src/tests/pi-tool-exposure.test.ts +8 -8
  264. package/src/tests/preload-env.test.ts +4 -0
  265. package/src/tests/preload.ts +4 -0
  266. package/src/tests/probe-tool-schema-tokens.test.ts +144 -0
  267. package/src/tests/prompt-template-session.test.ts +20 -3
  268. package/src/tests/rbac-admission-e2e.test.ts +22 -6
  269. package/src/tests/rbac-admission.test.ts +342 -4
  270. package/src/tests/rbac-engine.test.ts +1 -0
  271. package/src/tests/rbac-roles.test.ts +9 -1
  272. package/src/tests/request-composition-derive.test.ts +329 -0
  273. package/src/tests/script-connections.test.ts +2 -0
  274. package/src/tests/script-executor-conformance.test.ts +36 -1
  275. package/src/tests/script-executor-quickjs-pool.test.ts +50 -0
  276. package/src/tests/script-executor-quickjs.test.ts +140 -0
  277. package/src/tests/script-host-validated-args-native.test.ts +196 -0
  278. package/src/tests/script-per-script-executor.test.ts +415 -0
  279. package/src/tests/scripts-external-api.test.ts +45 -0
  280. package/src/tests/sdk-allowlist.test.ts +3 -2
  281. package/src/tests/self-improvement.test.ts +4 -4
  282. package/src/tests/send-task-requester-gate.test.ts +64 -3
  283. package/src/tests/sessions-move.test.ts +39 -1
  284. package/src/tests/store-progress-learning.test.ts +381 -0
  285. package/src/tests/ui-logs-parser.test.ts +180 -0
  286. package/src/tests/whoami-route.test.ts +41 -0
  287. package/src/tests/workflow-engine-v2.test.ts +116 -1
  288. package/src/tests/workflow-mcp-trigger-schema.test.ts +209 -0
  289. package/src/tests/workflow-run-finished-event.test.ts +263 -0
  290. package/src/tests/workflow-swarm-script.test.ts +34 -0
  291. package/src/tools/inject-learning.ts +1 -1
  292. package/src/tools/memory-edit.ts +1 -1
  293. package/src/tools/memory-search.ts +1 -1
  294. package/src/tools/script-common.ts +1 -0
  295. package/src/tools/script-run.ts +7 -0
  296. package/src/tools/script-upsert.ts +7 -0
  297. package/src/tools/store-progress.ts +71 -1
  298. package/src/tools/utils.ts +12 -1
  299. package/src/tools/workflows/trigger-workflow.ts +104 -10
  300. package/src/types.ts +12 -1
  301. package/src/utils/constants.ts +39 -0
  302. package/src/utils/credentials.ts +5 -2
  303. package/src/utils/task-attachment-links.ts +15 -3
  304. package/src/workflows/engine.ts +18 -16
  305. package/src/workflows/executors/swarm-script.ts +5 -0
  306. package/src/workflows/foreach-driver.ts +5 -11
  307. package/src/workflows/node-timeout.ts +30 -0
  308. package/templates/community/linear-delivery-loop/PLAYBOOK.md +323 -0
  309. package/templates/community/linear-delivery-loop/README.md +38 -0
  310. package/templates/community/linear-delivery-loop/config.example.json +31 -0
  311. package/templates/community/linear-delivery-loop/lead-prompt.md +34 -0
  312. package/templates/community/linear-delivery-loop/schedule.json +10 -0
  313. package/templates/community/linear-delivery-loop/scripts/linear-delivery-setup.ts +148 -0
  314. package/templates/community/linear-delivery-loop/scripts/linear-delivery-tick.ts +1781 -0
  315. package/templates/skills/swarm-docs/config.json +14 -0
  316. package/templates/skills/swarm-docs/content.md +144 -0
  317. package/dist/handlers-eqsnmv95.js +0 -41
  318. package/dist/lead-23e7z59t.js +0 -79
  319. package/dist/worker-e3w7vye1.js +0 -79
  320. package/dist/{azure-openai-responses-9kfwhmn7.js → azure-openai-responses-43asa23s.js} +0 -0
  321. package/dist/{node-vxx896fa.js → node-t28cc56b.js} +0 -0
  322. package/dist/{openai-codex-responses-79s8xnbh.js → openai-codex-responses-jhr3sjtm.js} +3 -3
  323. package/dist/{openai-completions-tdbyts0x.js → openai-completions-gs6yn37k.js} +3 -3
  324. /package/dist/{openai-responses-dm3t5vqp.js → openai-responses-jqm9vwwk.js} +0 -0
@@ -5,7 +5,7 @@ import {
5
5
  extractArgsJsonSchema,
6
6
  typecheckScript,
7
7
  parseSkillContent
8
- } from "./cli-3gfvmzht.js";
8
+ } from "./cli-kbtdftbw.js";
9
9
  import {
10
10
  getDbClient2,
11
11
  computeContentHash2,
@@ -26,19 +26,20 @@ import {
26
26
  deleteSkill2,
27
27
  getSkillByName2,
28
28
  init_db3
29
- } from "./cli-g8ka5j4j.js";
30
- import"./cli-kf4jree9.js";
29
+ } from "./cli-qvaa1gjp.js";
30
+ import"./cli-rm66vqdz.js";
31
31
  import"./cli-3ggwdtb0.js";
32
+ import"./cli-hpkvgdad.js";
32
33
  import {
33
34
  agentFsProvisionSeeder
34
- } from "./cli-6y51ryva.js";
35
+ } from "./cli-x3cngb1h.js";
35
36
  import"./cli-e8xyjvfc.js";
36
37
  import {
37
38
  validateDefinition
38
- } from "./cli-3fwqy71j.js";
39
- import"./cli-g20jjwt4.js";
40
- import"./cli-gnsb1zxa.js";
41
- import"./cli-v49fkghp.js";
39
+ } from "./cli-dv11pgpv.js";
40
+ import"./cli-thsaq4pd.js";
41
+ import"./cli-vhpckzvp.js";
42
+ import"./cli-ekptgk2m.js";
42
43
  import"./cli-2nf3b08t.js";
43
44
  import"./cli-kvzgak7c.js";
44
45
  import"./cli-445c1vp7.js";
@@ -48,7 +49,7 @@ import {
48
49
  } from "./cli-691vz9mk.js";
49
50
  import"./cli-13p25grh.js";
50
51
  import"./cli-0adyhvq2.js";
51
- import"./cli-esakngh8.js";
52
+ import"./cli-nf6k60sn.js";
52
53
  import"./cli-rycdaj0a.js";
53
54
  import {
54
55
  __toESM
@@ -11056,8 +11057,172 @@ var config_default42 = `{
11056
11057
  // templates/skills/step-running/content.md
11057
11058
  var content_default42 = "# Step Running\n\nYou execute a single step of a DAG plan as an atomic background sub-agent. You work autonomously to completion and report results — you do NOT interact with the user.\n\nThis is the DAG sibling of `phase-running`. The execution model and atomicity contract are identical; the differences are:\n- You receive a **step file path** (`step-<n>.md`), not a plan path + phase number.\n- You **claim the step atomically** via the step's frontmatter `status` field before doing work, and release it on completion / failure. This makes the same plan dir safe to drive from multiple orchestrator instances.\n\n## Execution Model\n\nThis skill runs inside a background `Agent` (sub-agent). v-implementing (or a user invoking `/run-step`) spawns it via the Agent tool with `run_in_background: true`.\n\nThe step agent receives:\n- **Step path**: full path to `step-<n>.md`\n- **Plan dir**: full path to the parent plan directory (read `root.md` from here for plan-level context)\n- **Agent ID**: unique identifier for this sub-agent (e.g. orchestrator session ID + step ID + timestamp). Used for atomic claim + stale-claim detection.\n- **Relevant context**: any extra context from the caller\n\n## Concurrency: Atomic Claim\n\nBefore doing any work, claim the step:\n\n1. Read the step file's frontmatter.\n2. **If `status: done`** — report `Status: skipped` and exit. The step is already finished.\n3. **If `status: claimed`** and `assignee` differs from your agent ID:\n - Fresh claim (`claimed_at` within last hour): report `Status: blocked` (reason: `claimed by <other-id>`) and exit.\n - Stale claim (>1h): proceed and overwrite — the previous worker likely died.\n4. **Otherwise** (`status: ready`, or stale `claimed`): rewrite the frontmatter block in a single `Edit` so the write is atomic-enough for filesystem-based coordination. Set:\n - `status: claimed`\n - `assignee: <your-agent-id>`\n - `claimed_at: <ISO timestamp UTC>`\n5. Re-read the file. If `assignee` is not yours, another worker raced you — report `Status: blocked` (reason: `lost claim race`) and exit.\n\nOn terminal transitions, set frontmatter:\n- **Completed**: `status: done`, clear `assignee` and `claimed_at`.\n- **Blocked or failed (retry-able)**: `status: ready`, clear `assignee` and `claimed_at`. The orchestrator (or another worker) can retry.\n- **Failed (non-retry-able)**: leave `status: claimed` so the orchestrator can investigate; include the reason in the report.\n\nFor true cross-machine atomicity (NFS, etc.), the caller is responsible for rendezvous (e.g. a shared lock service). The single-Edit pattern is good-enough for local filesystem and well-behaved network filesystems.\n\n## Autonomy\n\nStep agents always run as **Autopilot** within the sub-agent. The calling context controls outer autonomy and human checkpoints.\n\n**CRITICAL**: Step agents do NOT use AskUserQuestion. If something is ambiguous, report `Status: blocked` with details. The caller handles all user interaction.\n\n## Process Steps\n\n### Step 1: Load Context\n\n1. **Claim the step** (see \"Concurrency: Atomic Claim\"). Stop here on any non-claim outcome.\n2. Read the full step file.\n3. Read `root.md` from the plan dir for plan-level context: Overview, Current State, Desired End State, Implementation Approach, Global Verification.\n4. Read all files mentioned in the step's \"Changes Required\" section.\n\n### Step 2: Pre-flight Check\n\n| Check | Action if failed |\n|-------|-----------------|\n| All `depends_on` steps have `status: done` | Scheduler bug — release claim, report `blocked` |\n| No merge conflicts in target files | Release claim, report `blocked` |\n| Files/dirs from depended-on steps exist | Release claim, report `blocked` |\n\n### Step 3: Execute Step\n\nImplement the changes described in the step's \"Changes Required\" section. Adapt to minor mismatches; report `blocked` for significant ones.\n\n### Step 4: Run Verification\n\nSame three-bucket pattern as `phase-running`:\n1. **Automated Verification** (runnable commands): run each, record pass/fail. On failure, attempt one fix-and-retry.\n2. **Automated QA** (agent-driven scenarios — browser-use, screenshot diff, CLI walkthrough): execute, record pass/fail per item.\n3. **Manual Verification**: leave unchecked. Caller handles with the user.\n4. **QA Spec (linked doc)**: if present, report `QA Doc: <path>`. Do not execute scenarios inline.\n\n### Step 5: Update Step File\n\n- Check off (`- [x]`) Automated Verification + Automated QA items that passed.\n- Do NOT check off Manual Verification items.\n- Update frontmatter `status` per \"Concurrency: Atomic Claim\" terminal-transition rules.\n- Update `last_updated` / `last_updated_by` frontmatter fields if present.\n\n### Step 6: Report Results\n\n**Completed:**\n```\nStatus: completed\nStep: step-N - <Name>\nFinal frontmatter status: done\nFiles changed: [list]\nAutomated Verification: N/M passed\n- [x] [Check 1] — passed\nAutomated QA: N/M passed\n- [x] [Scenario 1] — passed\nQA Doc: <path> | n/a\nManual verification needed:\n- [ ] [Manual check 1]\n```\n\n**Blocked / failed:** mirror `phase-running`'s shape, plus a `Final frontmatter status:` line so the orchestrator knows whether the step is released for retry (`ready`) or held for investigation (`claimed`).\n\n## Atomicity Contract\n\n- No interactive questions.\n- No partial states left unexplained.\n- Frontmatter `status` always reflects the final state at exit.\n- Report includes enough detail for the caller to decide next steps.\n\n## Context Handoff Pattern\n\n| Direction | Data |\n|-----------|------|\n| **Caller → Step Agent** | Step path + plan dir + agent ID + autonomy mode |\n| **Step Agent reads** | Step file + root.md + files in Changes Required |\n| **Step Agent writes** | Frontmatter status transitions + checkboxes + code changes |\n| **Step Agent → Caller** | Status + changed files + verification results + final frontmatter status |\n| **Caller handles** | Manual verification, cross-step coordination, QA doc execution, human checkpoints |\n";
11058
11059
 
11059
- // templates/skills/swarm-extensions/config.json
11060
+ // templates/skills/swarm-docs/config.json
11060
11061
  var config_default43 = `{
11062
+ "kind": "skill",
11063
+ "name": "swarm-docs",
11064
+ "displayName": "Swarm Docs",
11065
+ "slug": "swarm-docs",
11066
+ "title": "Swarm Docs",
11067
+ "description": "docs.agent-swarm.dev index: general docs, guides and playbooks, when to offer a playbook or guide to a person, and how to fetch a page. Load on demand: when no existing skill, workflow, schedule or memory covers a person's request, or they ask where something is documented.",
11068
+ "version": "1.0.0",
11069
+ "category": "skills",
11070
+ "placeholders": [],
11071
+ "runAllSeedersCandidate": true,
11072
+ "systemDefault": true,
11073
+ "tags": ["docs", "playbooks", "guides", "lead"]
11074
+ }
11075
+ `;
11076
+
11077
+ // templates/skills/swarm-docs/content.md
11078
+ var content_default43 = `# Swarm docs
11079
+
11080
+ docs.agent-swarm.dev documents Agent Swarm: general docs, guides, and playbooks. A playbook is a tested way to run the swarm for one job (on-call, PR review, DORA metrics). Its page lists the agents, workflows, schedules and scripts to set up. The index below is generated from the docs frontmatter and ships with this release, so you can read it offline.
11081
+
11082
+ ## When to load this skill
11083
+
11084
+ Load it on demand. Load it when a person asks for something that no skill, workflow, schedule or memory of yours covers, or asks where something is documented. When you already know how to handle the ask, handle it and leave the docs out.
11085
+
11086
+ ## Offer a page (lead)
11087
+
11088
+ Follow these rules when you reply to a person.
11089
+
11090
+ 1. Offer only in a reply to a person's request (Slack, DM, dashboard, email). Never offer in a heartbeat, schedule, workflow step, worker follow-up, or task output.
11091
+ 2. Offer only on a clear match with an entry's \`when\` line, and never on a \`not when\` match. With two candidates, offer the better one. Never offer a list.
11092
+ 3. Make at most one offer per reply. Offer a page at most once per thread, and never again after a no.
11093
+ 4. Skip the offer when the setup is already in place (\`list-workflows\` or the schedules list shows it), when one of your skills already covers the ask, or when the person already chose an approach.
11094
+ 5. Put the offer in one sentence at the end, with the title and the link: "This matches the [Open Oncall playbook](https://docs.agent-swarm.dev/docs/playbooks/open-oncall). Want me to set it up that way?" For a setup request, wait for the answer before you build. For a question, answer it and add the link without asking.
11095
+ 6. On yes, delegate to a worker: "Follow <page URL>. Read the page with the \`swarm-docs\` skill." Name the template when the entry has one.
11096
+
11097
+ Entries marked "reference" are never offered. Read them when a task touches their topic.
11098
+
11099
+ ## Read a page (any agent)
11100
+
11101
+ Fetch the page as markdown: \`curl -fsSL https://docs.agent-swarm.dev/llms.mdx/docs/<slug>\`, where \`<slug>\` is the path after \`/docs/\` in the index link. Follow the page; it names the agents, templates, schedules and scripts to create.
11102
+
11103
+ - A 404 means the slug changed after this release. Fetch \`https://docs.agent-swarm.dev/llms.txt\` and find the page by title.
11104
+ - When the site is unreachable (an offline or air-gapped install), say so in one line, give the page URL, and ask the requester to attach the page. An operator can host \`docs-site/\` from the agent-swarm repo as a mirror and edit this skill to point at it; the edit survives reseed.
11105
+ - A \`template\` entry names a template that ships with the swarm (\`templates/<id>\` in the agent-swarm repo). Prefer it over writing the setup from scratch.
11106
+
11107
+ <!-- docs-index:start -->
11108
+ <!-- Generated by \`bun run build:docs-index\` from the docs frontmatter. Do not edit by hand. -->
11109
+
11110
+ ## Playbooks
11111
+
11112
+ - [Playbooks](https://docs.agent-swarm.dev/docs/playbooks). Reference.
11113
+ - [The rulebook our lead agent wrote for itself](https://docs.agent-swarm.dev/docs/playbooks/lead-agent-rulebook). Reference.
11114
+ - [Feature Development](https://docs.agent-swarm.dev/docs/playbooks/feature-development). When: Someone wants feature requests from Slack or Linear turned into reviewed pull requests end to end.
11115
+ - [Lead Prospecting](https://docs.agent-swarm.dev/docs/playbooks/lead-prospecting). When: Someone wants prospects found and outreach drafted on a schedule, with a person approving before anything sends.
11116
+ - [Content Generation](https://docs.agent-swarm.dev/docs/playbooks/content-generation). When: Someone wants blog posts, social posts, comparison pages or release notes written on a regular cadence.
11117
+ - [UX Command Center](https://docs.agent-swarm.dev/docs/playbooks/ux-command-center). When: Someone wants regular UX audits of their product and proposals for usability fixes.
11118
+ - [Proactive Customer Support](https://docs.agent-swarm.dev/docs/playbooks/proactive-customer-support). When: Someone wants an agent per key customer that remembers the account and prepares briefings or value reports.
11119
+ - [Observability Alert Management](https://docs.agent-swarm.dev/docs/playbooks/code-health-alert-management). When: Someone wants Datadog, Sentry, New Relic or SigNoz alerts filtered for noise, plus recurring production health audits. Not when: Alerts that page a person and should be investigated and fixed as they fire; offer Open Oncall instead.
11120
+ - [Code Health](https://docs.agent-swarm.dev/docs/playbooks/code-health-reports). When: Someone wants a recurring report on code hotspots, churn or technical debt in a repository. Template: \`community/code-health-reports\`.
11121
+ - [DORA Metrics](https://docs.agent-swarm.dev/docs/playbooks/dora-metrics). When: Someone wants deploy frequency, lead time or other DORA metrics reported on a schedule. Template: \`community/dora-metrics\`.
11122
+ - [Reports from Multiple Sources](https://docs.agent-swarm.dev/docs/playbooks/reports-multiple-sources). When: Someone wants business questions answered across their warehouse, analytics, billing and other data, with charts.
11123
+ - [Self-Documenting & Release Reports](https://docs.agent-swarm.dev/docs/playbooks/self-documenting-release-reports). When: Someone wants docs kept current, release notes written from commits, or release videos made.
11124
+ - [Open-Prompt Showreel Videos](https://docs.agent-swarm.dev/docs/playbooks/open-prompt-showreel). When: Someone wants a motion-graphics or showreel video made from a prompt. Template: \`community/open-prompt-showreel\`.
11125
+ - [Email Domain Health](https://docs.agent-swarm.dev/docs/playbooks/email-domain-health). When: Someone wants the domains they send email from watched for SPF, DKIM, DMARC or blocklist problems.
11126
+ - [Open Oncall](https://docs.agent-swarm.dev/docs/playbooks/open-oncall). When: Someone wants alerts from PagerDuty, Datadog, Sentry or a webhook investigated and fixed, with a person approving each fix. Not when: A one-off question about a single incident.
11127
+ - [PR Review](https://docs.agent-swarm.dev/docs/playbooks/pr-review). When: Someone wants every pull request reviewed automatically before a person looks at it.
11128
+ - [Linear Delivery Loop](https://docs.agent-swarm.dev/docs/playbooks/linear-delivery-loop). When: Someone wants agents to take Linear issues through implementation, CI and review to merged pull requests, with a person approving each one. Template: \`community/linear-delivery-loop\`.
11129
+ - [Hot Patterns](https://docs.agent-swarm.dev/docs/playbooks/patterns). Reference.
11130
+ - [Pattern: Litmus Tests (LLM-as-Judge Quality Gates)](https://docs.agent-swarm.dev/docs/playbooks/patterns/litmus-tests). When: Someone wants one agent to check another agent's output against a rubric before it ships.
11131
+ - [Pattern: Drain Loops (Stacked PRs + Merge Loop)](https://docs.agent-swarm.dev/docs/playbooks/patterns/drain-loops). When: Someone wants a large change split into small stacked pull requests and merged in order.
11132
+ - [Pattern: HITL Gates (Human-in-the-Loop Approval)](https://docs.agent-swarm.dev/docs/playbooks/patterns/hitl-gates). When: Someone wants a workflow to wait for a person's approval before it sends, merges, deletes or posts.
11133
+ - [Pattern: Per-Customer Working Directories](https://docs.agent-swarm.dev/docs/playbooks/patterns/per-customer-working-directories). When: Someone wants agents to keep long-lived notes per customer or account.
11134
+ - [Pattern: No-op When Nothing Changed](https://docs.agent-swarm.dev/docs/playbooks/patterns/no-op-workflows). When: Someone wants a scheduled job that stays silent when nothing changed.
11135
+
11136
+ ## Guides
11137
+
11138
+ - [Deployment Guide](https://docs.agent-swarm.dev/docs/guides/deployment). When: Someone wants to run Agent Swarm on their own server with Docker Compose.
11139
+ - [Kubernetes and Helm](https://docs.agent-swarm.dev/docs/guides/kubernetes). When: Someone wants to install Agent Swarm on Kubernetes.
11140
+ - [Rootless Podman](https://docs.agent-swarm.dev/docs/guides/podman-rootless). When: Someone wants to run Agent Swarm under rootless Podman.
11141
+ - [Published Artifacts](https://docs.agent-swarm.dev/docs/guides/published-artifacts). Reference.
11142
+ - [Asset Namespaces](https://docs.agent-swarm.dev/docs/guides/asset-namespaces). Reference.
11143
+ - [agent-fs Co-deployment](https://docs.agent-swarm.dev/docs/guides/agent-fs-co-deployment). When: Someone wants shared persistent files for agents on a self-hosted swarm.
11144
+ - [Self-Hosted SSO](https://docs.agent-swarm.dev/docs/guides/self-hosted-sso). When: Someone wants their self-hosted swarm dashboard behind single sign-on.
11145
+ - [E2B Provider Smoke Tests](https://docs.agent-swarm.dev/docs/guides/e2b-provider-smoke-tests). Reference.
11146
+ - [Evals Harness](https://docs.agent-swarm.dev/docs/guides/evals-harness). Reference.
11147
+ - [Personalization & Status](https://docs.agent-swarm.dev/docs/guides/personalization). Reference.
11148
+ - [Secrets Encryption](https://docs.agent-swarm.dev/docs/guides/secrets-encryption). When: Someone asks how swarm secrets are stored, encrypted or backed up.
11149
+ - [Harness Configuration](https://docs.agent-swarm.dev/docs/guides/harness-configuration). When: Someone wants agents to run on a different AI provider or coding CLI.
11150
+ - [Provider Capability Matrix](https://docs.agent-swarm.dev/docs/guides/provider-capability-matrix). Reference.
11151
+ - [Adding a Harness Provider](https://docs.agent-swarm.dev/docs/guides/harness-providers). Reference.
11152
+ - [Steer a Running Task](https://docs.agent-swarm.dev/docs/guides/task-steering). Reference.
11153
+ - [Claude Code Mod](https://docs.agent-swarm.dev/docs/guides/claude-code-mod). Reference.
11154
+ - [Observability with OpenTelemetry](https://docs.agent-swarm.dev/docs/guides/observability-opentelemetry). When: Someone wants swarm traces and metrics in SigNoz or another OpenTelemetry backend.
11155
+ - [Host Requirements & Disk Cleanup](https://docs.agent-swarm.dev/docs/guides/host-requirements). When: Someone asks how big a host their self-hosted swarm needs, or their disk is filling up with Docker images.
11156
+ - [Performance & Resource Sizing](https://docs.agent-swarm.dev/docs/guides/performance-resource-sizing). Reference.
11157
+ - [Cost & context computation](https://docs.agent-swarm.dev/docs/guides/cost-and-context-computation). Reference.
11158
+ - [Extensions](https://docs.agent-swarm.dev/docs/guides/extensions). Reference.
11159
+ - [Scripts runtime](https://docs.agent-swarm.dev/docs/guides/scripts-runtime). Reference.
11160
+ - [Agent capabilities and tool allowlist](https://docs.agent-swarm.dev/docs/guides/agent-capabilities). Reference.
11161
+ - [Scripts-only mode (code-mode)](https://docs.agent-swarm.dev/docs/guides/scripts-only-mode). Reference.
11162
+ - [Script connections](https://docs.agent-swarm.dev/docs/guides/script-connections). When: Someone wants the swarm to call an external API, with credentials kept out of the code.
11163
+ - [OAuth callback migration](https://docs.agent-swarm.dev/docs/guides/oauth-callback-migration). Reference.
11164
+ - [Scripts as external APIs](https://docs.agent-swarm.dev/docs/guides/scripts-external-apis). When: Someone wants a swarm script exposed as a public HTTP endpoint or webhook receiver.
11165
+ - [Scripts credential broker](https://docs.agent-swarm.dev/docs/guides/scripts-credential-broker). Reference.
11166
+ - [One-off Script Workflow Runs](https://docs.agent-swarm.dev/docs/guides/script-workflow-runs). Reference.
11167
+ - [Claude Bridge](https://docs.agent-swarm.dev/docs/guides/claude-bridge-experimental). Reference.
11168
+ - [Worker Credential Recovery](https://docs.agent-swarm.dev/docs/guides/worker-credential-recovery). Reference.
11169
+ - [Model Gateways](https://docs.agent-swarm.dev/docs/guides/provider-auth/model-gateways). Reference.
11170
+ - [Codex OAuth](https://docs.agent-swarm.dev/docs/guides/provider-auth/codex-oauth). Reference.
11171
+ - [Cursor](https://docs.agent-swarm.dev/docs/guides/provider-auth/cursor). Reference.
11172
+ - [Amp](https://docs.agent-swarm.dev/docs/guides/provider-auth/amp). Reference.
11173
+ - [Grok](https://docs.agent-swarm.dev/docs/guides/provider-auth/grok). Reference.
11174
+ - [DeepSeek Harness (dsh)](https://docs.agent-swarm.dev/docs/guides/provider-auth/dsh). Reference.
11175
+ - [x402 Payments](https://docs.agent-swarm.dev/docs/guides/x402-payments). Reference.
11176
+ - [Multi-runtime agents](https://docs.agent-swarm.dev/docs/guides/multi-runtime-agents). Reference.
11177
+ - [Runtime pools (beta)](https://docs.agent-swarm.dev/docs/guides/runtime-pools). Reference.
11178
+
11179
+ ## Other docs
11180
+
11181
+ - [Introduction](https://docs.agent-swarm.dev/docs)
11182
+ - [Getting Started](https://docs.agent-swarm.dev/docs/getting-started)
11183
+ - [Architecture Overview](https://docs.agent-swarm.dev/docs/architecture/overview)
11184
+ - [Agent Identity & Configuration](https://docs.agent-swarm.dev/docs/architecture/agents)
11185
+ - [Memory System](https://docs.agent-swarm.dev/docs/architecture/memory)
11186
+ - [Hook System](https://docs.agent-swarm.dev/docs/architecture/hooks)
11187
+ - [Task Lifecycle](https://docs.agent-swarm.dev/docs/concepts/task-lifecycle)
11188
+ - [Scheduled Tasks](https://docs.agent-swarm.dev/docs/concepts/scheduling)
11189
+ - [Workflows](https://docs.agent-swarm.dev/docs/concepts/workflows)
11190
+ - [Team Collaboration](https://docs.agent-swarm.dev/docs/features/team-collaboration)
11191
+ - [Apps](https://docs.agent-swarm.dev/docs/apps)
11192
+ - [App concepts](https://docs.agent-swarm.dev/docs/apps/concepts)
11193
+ - [Build an App](https://docs.agent-swarm.dev/docs/apps/build-an-app)
11194
+ - [App recipes](https://docs.agent-swarm.dev/docs/apps/recipes)
11195
+ - [Overview](https://docs.agent-swarm.dev/docs/ui)
11196
+ - [Sessions](https://docs.agent-swarm.dev/docs/ui/sessions)
11197
+ - [Configuration](https://docs.agent-swarm.dev/docs/ui/configuration)
11198
+ - [Comb](https://docs.agent-swarm.dev/docs/ui/comb)
11199
+ - [Integrations](https://docs.agent-swarm.dev/docs/integrations)
11200
+ - [Slack Integration](https://docs.agent-swarm.dev/docs/integrations/slack)
11201
+ - [GitHub App Integration](https://docs.agent-swarm.dev/docs/integrations/github)
11202
+ - [GitLab Integration](https://docs.agent-swarm.dev/docs/integrations/gitlab)
11203
+ - [Azure DevOps Integration](https://docs.agent-swarm.dev/docs/integrations/azure-devops)
11204
+ - [Bitbucket Integration](https://docs.agent-swarm.dev/docs/integrations/bitbucket)
11205
+ - [Linear](https://docs.agent-swarm.dev/docs/integrations/linear)
11206
+ - [Jira Integration](https://docs.agent-swarm.dev/docs/integrations/jira)
11207
+ - [Sentry Integration](https://docs.agent-swarm.dev/docs/integrations/sentry)
11208
+ - [AgentMail Integration](https://docs.agent-swarm.dev/docs/integrations/agentmail)
11209
+ - [Kapso (WhatsApp)](https://docs.agent-swarm.dev/docs/integrations/kapso)
11210
+ - [Chat SDK](https://docs.agent-swarm.dev/docs/integrations/chat-sdk)
11211
+ - [Composio](https://docs.agent-swarm.dev/docs/integrations/composio)
11212
+ - [Salesforce](https://docs.agent-swarm.dev/docs/integrations/salesforce)
11213
+ - [Microsoft Graph](https://docs.agent-swarm.dev/docs/integrations/microsoft-graph)
11214
+ - [Serply Search](https://docs.agent-swarm.dev/docs/integrations/serply)
11215
+ - [MCP Tools Reference](https://docs.agent-swarm.dev/docs/reference/mcp-tools)
11216
+ - [Environment Variables](https://docs.agent-swarm.dev/docs/reference/environment-variables)
11217
+ - [CLI Reference](https://docs.agent-swarm.dev/docs/reference/cli)
11218
+ - [The \`x\` command](https://docs.agent-swarm.dev/docs/reference/x-command)
11219
+ - [Telemetry](https://docs.agent-swarm.dev/docs/reference/telemetry)
11220
+ - [Contributing](https://docs.agent-swarm.dev/docs/contributing)
11221
+ <!-- docs-index:end -->
11222
+ `;
11223
+
11224
+ // templates/skills/swarm-extensions/config.json
11225
+ var config_default44 = `{
11061
11226
  "kind": "skill",
11062
11227
  "name": "swarm-extensions",
11063
11228
  "displayName": "Swarm Extensions",
@@ -11074,7 +11239,7 @@ var config_default43 = `{
11074
11239
  `;
11075
11240
 
11076
11241
  // templates/skills/swarm-extensions/content.md
11077
- var content_default43 = `# Swarm Extensions
11242
+ var content_default44 = `# Swarm Extensions
11078
11243
 
11079
11244
  An extension is a trusted TypeScript hook bundle that runs inside the swarm API server. Use one when a rule must apply to the whole swarm: block or rewrite new tasks, route Slack channels, suppress follow-ups, change stalled-task remediation, guard tool calls, or react after a task or tool call finishes.
11080
11245
 
@@ -11255,10 +11420,10 @@ export default extension;
11255
11420
  `;
11256
11421
 
11257
11422
  // templates/skills/swarm-scripts/config.json
11258
- var config_default44 = '{\n "kind": "skill",\n "name": "swarm-scripts",\n "displayName": "Swarm Scripts",\n "slug": "swarm-scripts",\n "title": "Swarm Scripts",\n "description": "Bulk, repeat, fan-out, or data-heavy work: write and run swarm scripts (inline `script-run`, named `script-upsert`, durable `launch-script-run`). Covers the script-vs-tool rubric, the authoring contract (`args` first, `ctx` second), the seed catalog, connections and secrets, files and bash over the agent-fs drive (`ctx.fs`, `ctx.sh`), `db_query`, and exposing a script as an API.",\n "version": "1.3.0",\n "category": "skills",\n "placeholders": [],\n "runAllSeedersCandidate": true,\n "systemDefault": true,\n "tags": ["scripts", "automation", "context"]\n}\n';
11423
+ var config_default45 = '{\n "kind": "skill",\n "name": "swarm-scripts",\n "displayName": "Swarm Scripts",\n "slug": "swarm-scripts",\n "title": "Swarm Scripts",\n "description": "Bulk, repeat, fan-out, or data-heavy work: write and run swarm scripts (inline `script-run`, named `script-upsert`, durable `launch-script-run`). Covers the script-vs-tool rubric, the authoring contract (`args` first, `ctx` second), the seed catalog, connections and secrets, files and bash over the agent-fs drive (`ctx.fs`, `ctx.sh`), `db_query`, and exposing a script as an API.",\n "version": "1.3.0",\n "category": "skills",\n "placeholders": [],\n "runAllSeedersCandidate": true,\n "systemDefault": true,\n "tags": ["scripts", "automation", "context"]\n}\n';
11259
11424
 
11260
11425
  // templates/skills/swarm-scripts/content.md
11261
- var content_default44 = `# Swarm Scripts
11426
+ var content_default45 = `# Swarm Scripts
11262
11427
 
11263
11428
  A swarm script is TypeScript that runs out of process with a typed Swarm SDK. Only its return value enters your context. Use one when direct tool calls would repeat, flood your context, or need deterministic processing over many records.
11264
11429
 
@@ -11453,7 +11618,7 @@ A named script can serve \`POST /api/x/script/<id>\` for callers outside the swa
11453
11618
  `;
11454
11619
 
11455
11620
  // templates/skills/tackle-gh-comments/config.json
11456
- var config_default45 = `{
11621
+ var config_default46 = `{
11457
11622
  "category": "skills",
11458
11623
  "description": "Work through every review comment on a GitHub PR — fetch the threads, verify each claim against the code, fix what is real, then reply and mark each thread resolved before pushing. Use when the user says \\"tackle the PR comments\\", \\"address the review\\", \\"handle the bot comments\\", \\"check the comments on the PR\\", \\"resolve the review threads\\", or invokes /tackle-gh-comments. Project-agnostic; works in any repo with a GitHub remote.",
11459
11624
  "displayName": "Tackle GH Comments",
@@ -11474,7 +11639,7 @@ var config_default45 = `{
11474
11639
  `;
11475
11640
 
11476
11641
  // templates/skills/tackle-gh-comments/content.md
11477
- var content_default45 = `# Tackle GitHub PR comments
11642
+ var content_default46 = `# Tackle GitHub PR comments
11478
11643
 
11479
11644
  Review threads and their resolved state live **only in GraphQL**. The REST API
11480
11645
  cannot read \`isResolved\` and cannot resolve a thread, and \`gh pr view --comments\`
@@ -11593,7 +11758,7 @@ committed, and the branch is pushed.
11593
11758
  `;
11594
11759
 
11595
11760
  // templates/skills/taste-minimalist-skill/config.json
11596
- var config_default46 = `{
11761
+ var config_default47 = `{
11597
11762
  "kind": "skill",
11598
11763
  "name": "taste-minimalist-skill",
11599
11764
  "displayName": "Taste Minimalist Skill",
@@ -11615,7 +11780,7 @@ var config_default46 = `{
11615
11780
  `;
11616
11781
 
11617
11782
  // templates/skills/taste-minimalist-skill/content.md
11618
- var content_default46 = `> Vendored from [taste-skill](https://github.com/Leonxlnx/taste-skill) / [tasteskill.dev](https://www.tasteskill.dev/) at commit 06d6028b5c623016c59ce8536f578e5a1127b499.
11783
+ var content_default47 = `> Vendored from [taste-skill](https://github.com/Leonxlnx/taste-skill) / [tasteskill.dev](https://www.tasteskill.dev/) at commit 06d6028b5c623016c59ce8536f578e5a1127b499.
11619
11784
  > Upstream license: MIT, Copyright (c) 2026 Leonxlnx. See ../TASTE-SKILL-LICENSE.
11620
11785
 
11621
11786
  # Protocol: Premium Utilitarian Minimalism UI Architect
@@ -11701,7 +11866,7 @@ When tasked with writing frontend code (HTML, React, Tailwind, Vue) or designing
11701
11866
  `;
11702
11867
 
11703
11868
  // templates/skills/tdd-planning/config.json
11704
- var config_default47 = `{
11869
+ var config_default48 = `{
11705
11870
  "category": "skills",
11706
11871
  "description": "TDD-focused implementation planning. Creates plans with strict Red-Green-Commit/Rollback cycles for each step.",
11707
11872
  "displayName": "TDD Planning",
@@ -11722,7 +11887,7 @@ var config_default47 = `{
11722
11887
  `;
11723
11888
 
11724
11889
  // templates/skills/tdd-planning/content.md
11725
- var content_default47 = `# TDD Planning
11890
+ var content_default48 = `# TDD Planning
11726
11891
 
11727
11892
  You are creating implementation plans that follow a strict Test-Driven Development approach. Every implementation step follows the TDD cycle: **RED → GREEN → COMMIT/ROLLBACK**.
11728
11893
 
@@ -11984,7 +12149,7 @@ Before finalizing any TDD plan, verify:
11984
12149
  `;
11985
12150
 
11986
12151
  // templates/skills/v-implementing/config.json
11987
- var config_default48 = `{
12152
+ var config_default49 = `{
11988
12153
  "category": "skills",
11989
12154
  "description": "Parallel DAG-plan implementation skill. Reads a v-planning plan directory (root.md + step-<n>.md files), topologically schedules ready steps, and fans them out as parallel sub-agents. Use whenever the user invokes /v-implement, points at a plan directory produced by /v-plan, or asks to \\"run the parallel plan\\", \\"implement the DAG\\", or \\"fan out the steps\\" — even without those exact words. For linear plans (single .md file), use \`implementing\` instead.",
11990
12155
  "displayName": "V-Implementing",
@@ -12005,10 +12170,10 @@ var config_default48 = `{
12005
12170
  `;
12006
12171
 
12007
12172
  // templates/skills/v-implementing/content.md
12008
- var content_default48 = "# v-implementing\n\nYou are implementing an approved DAG-structured plan produced by `v-planning`. The plan is a directory with `root.md` + one `step-<n>.md` per node. Your job is to act as a **topological scheduler**: at each tick, find steps whose dependencies are all done, fan them out as parallel sub-agents (one per ready step), wait, repeat — until the DAG is drained. Then run Global Verification.\n\nThis is the parallel sibling of `implementing`. The orchestration model is the same (sub-agents do the work, main session coordinates), only the scheduler is different.\n\n## Working Agreement\n\n**All user-facing questions go through `AskUserQuestion`** — see `desplega:ask-user` for conventions. Never ask in chat as plain bullets.\n\n**All read/research/validation work goes through sub-agents** — keep raw tool output out of the main session. Default to `run_in_background: true`. The fan-out scheduler below is built on this.\n\nThe autonomy mode (below) controls how often you check in. AskUserQuestion is always the mechanism.\n\nFile-review is on by default — when significant changes land in a step (or wave), invoke `/file-review:file-review <path>` for inline feedback (skip only if Autopilot).\n\n## Autonomy Mode\n\n| Mode | Behavior |\n|------|----------|\n| **Autopilot** | Drain the DAG without pausing. Only stop on blocker / failed step. |\n| **Critical** (Default) | Pause when each *wave* of parallel steps completes; wait for manual verification before unlocking the next wave. |\n| **Verbose** | Pause after each individual step (even within a wave). |\n\n## Initial Setup Questions\n\nAfter understanding the plan and before the scheduler loop starts, gather implementation-specific details (skip in Autopilot):\n\n### 1. Branch / Worktree Setup\n\nCheck the current branch: `git branch --show-current`. Then check if the `wts` plugin is installed (look for `wts:wts` in available skills).\n\n**If wts is installed**, use **AskUserQuestion**:\n\n| Question | Options |\n|----------|---------|\n| \"You're on `<current-branch>`. Where would you like to implement?\" | 1. Continue on current branch, 2. Create a new branch, 3. Create a wts worktree |\n\n**If wts is not installed**, drop the worktree option.\n\n### 2. Commit Strategy\n\nUse **AskUserQuestion**:\n\n| Question | Options |\n|----------|---------|\n| \"How would you like to handle commits during parallel implementation?\" | 1. Commit after each step completes (Recommended), 2. Commit at the end (single commit), 3. Let me decide as I go |\n\nIf \"Commit after each step\" is selected, after a step's manual verification passes, create a commit: `[step-N] <step name>`.\n\n### 3. Orchestration Mode (only if the `Workflow` tool is available)\n\n| Question | Options |\n|----------|---------|\n| \"Run the DAG waves as Workflow scripts? (deterministic scheduling, parallel steps as agent() calls)\" | 1. Yes — Workflow waves, 2. No — Agent fan-out (Default) |\n\nA \"yes\" is the explicit opt-in the Workflow tool requires. If opted in, each wave of the scheduler loop below runs as one Workflow script — a `parallel()` of `agent()` calls, one per ready step, with `model`/`effort` per `desplega:delegate-work`. Everything else is unchanged: step agents still follow the `step-running` contract (atomic frontmatter claim, three-bucket verification), and autonomy-mode pause points sit **between** Workflow invocations, never inside one. In Autopilot these questions are skipped, so there is no opt-in — use Agent fan-out unless the user pre-authorized workflows.\n\n### 4. Code Review Mode\n\n| Question | Options |\n|----------|---------|\n| \"Run an automatic code review after each wave?\" | 1. Automatic two-axis review per wave (Recommended), 2. Only at the end (single review after the DAG drains), 3. Off — I'll review myself |\n\nIn **Autopilot**, skip the question and default to automatic per-wave review.\n\n## Getting Started\n\nGiven a plan directory path:\n\n1. **Read `root.md` fully** (no `limit`/`offset`). Capture: Overview, Current State, Desired End State, Implementation Approach, Global Verification.\n2. **Read every `step-<n>.md`'s frontmatter** to build the dependency graph (`id`, `depends_on`). You don't need to read step bodies up front — the sub-agents will do that.\n3. **Validate the DAG:**\n - No cycles\n - Every `depends_on` ID exists as a step file\n - At least one step has `depends_on: []` (otherwise nothing can start)\n4. **Set `root.md` frontmatter `status: in-progress`.**\n5. **Build a TodoWrite list** with one entry per step, marked `pending`.\n6. **Resume support:** if any step's body has `- [x]` boxes already (or its frontmatter says `status: completed` if the user added it), trust them and treat that step as `done`.\n\nIf no path given, ask via AskUserQuestion.\n\n## The Scheduler Loop\n\nThe scheduler reads each step's frontmatter `status` (`ready` | `claimed` | `done`) and `depends_on`. The frontmatter `status` field is the **single source of truth** — multiple orchestrator instances on the same plan dir coordinate through it (each `desplega:step-running` sub-agent atomically claims its step before doing work).\n\n```\nwhile any step has status != done:\n ready = [step for step in steps\n if step.status == \"ready\"\n and all(dep.status == \"done\" for dep in step.depends_on)]\n if not ready:\n # DAG drained, OR every remaining undone step is claimed by another worker\n if any step has status == claimed: wait for in-flight claims to resolve\n else: report stuck (likely cycle or unrecoverable failure)\n continue\n fan out each step in `ready` as a parallel `desplega:step-running` sub-agent\n wait for the wave to complete\n review reports; step-running has already updated frontmatter\n (status: done on success, status: ready on retry-able failure, status: claimed if held for investigation)\n if Critical mode: pause for manual verification of newly-completed steps\n if any failed: stop and ask user how to proceed\n```\n\n### Spawning a Step Sub-agent\n\nUse the `Agent` tool with `run_in_background: true`, invoking `desplega:step-running`. Pass:\n\n- **Step path**: full path to `step-<n>.md`\n- **Plan dir**: full path to the parent plan directory\n- **Agent ID**: unique ID for this sub-agent (e.g. orchestrator session ID + step ID + timestamp). step-running uses this for atomic claim + stale-claim detection.\n- **Plan-level context** (optional): a quick brief from `root.md`. step-running re-reads `root.md` itself, so this is just to reduce round-trips.\n\n`step-running` owns:\n- Atomic claim (rewrite frontmatter `status: ready` → `status: claimed, assignee: <agent-id>, claimed_at: <ts>`)\n- Three-bucket verification (Automated Verification, Automated QA, QA Doc identification)\n- Terminal status transition (`status: done` on success, `status: ready` on retry-able failure)\n- Reporting back\n\nThe orchestrator does NOT do step work itself — it delegates. See `desplega:step-running` for the full sub-agent contract.\n\n**Executor routing**: if the `desplega:delegate-work` skill is available, pick each step's executor per its routing matrix instead of defaulting to a `step-running` sub-agent — a step may route to a Codex variant (one worktree per parallel slice) or a specific Claude model tier. Only the executor choice changes; the scheduler, frontmatter claim protocol, and all other semantics here stay unchanged. When a step routes to Codex, the orchestrator owns the frontmatter bookkeeping that `step-running` would normally do (Codex must not edit plan files).\n\n### Wave Completion\n\nWhen a wave finishes:\n1. **Review each agent's report.** Mark steps `done` only if `completed` was reported.\n2. **Run the wave code review** (unless review mode is Off) — invoke `desplega:code-reviewing` on the wave's combined diff: Standards + Spec axes as parallel background sub-agents (routed per `desplega:delegate-work`), spec source = the completed steps' bodies and Success Criteria. Critical findings block those steps' commits — fix and re-verify first. If \"Only at the end\" was selected, run one review over the full diff after the DAG drains instead.\n3. **Handle `QA Doc: <path>`** — for each step that reported a QA doc, invoke `desplega:qa` against that path. The Automated QA bucket inside the step is already handled by the sub-agent; only the linked doc needs separate orchestration here. (`QA: n/a` → proceed normally.)\n4. **Manual verification (if not Autopilot)** — present manual verification items from each completed step's body. Wait for user confirmation. Don't tick manual boxes until confirmed.\n5. **Commits (if commit-per-step was selected)** — after a step's manual verification passes, create a commit: `[step-N] <step name>`.\n6. **Loop** — recompute `ready` and start the next wave.\n\n## Handling Failures and Mismatches\n\nIf a sub-agent reports `failed` or `blocked`, or you spot a mismatch between plan and reality:\n\n| Question | Options |\n|----------|---------|\n| \"[step-N] [issue]. How should I proceed?\" | 1. Adapt step (edit step-N.md and retry), 2. Retry as-is, 3. Skip and continue (mark step blocked), 4. Stop the run |\n\nIn Autopilot mode, use best judgment, document the decision in the step file, and continue if non-fatal.\n\n## After the DAG Drains\n\nWhen every step is `done`:\n\n1. Run **Global Verification** from `root.md`. Tick automated checks; surface manual checks to the user.\n2. Set `root.md` frontmatter `status: completed`.\n3. Offer post-implementation auditing: \"Would you like me to run `/verify-plan` and `/review` on the plan directory?\"\n4. If commit-per-step was off, offer to create a single bundled commit now.\n5. If the work ships as a GitHub PR: once review comments land, address them with `desplega:tackle-gh-comments` (fetch threads, verify each claim, fix, reply, resolve — push last).\n\n## Important Guidelines\n\n1. **One step = one sub-agent.** Don't bundle steps into a single agent even if they're in the same wave — fan-out is the whole point.\n2. **Plan-level context goes to every sub-agent.** Sibling step bodies do not.\n3. **The DAG is canonical via step frontmatter** — if `root.md`'s table is out of sync, trust the frontmatter.\n4. **Resume works step-granular.** If the user re-runs `/v-implement` mid-DAG, completed steps stay completed; only undone ones rerun.\n5. **Don't tick manual checkboxes** until the user confirms — automated boxes can be ticked by the sub-agent or the orchestrator.\n\n## Review Integration\n\nIf `file-review` is available and the user opted in:\n- After each step's significant code changes, invoke `/file-review:file-review <changed-file>`.\n- Process feedback with `file-review:process-review` before treating the step as done.\n- Skip in Autopilot.\n";
12173
+ var content_default49 = "# v-implementing\n\nYou are implementing an approved DAG-structured plan produced by `v-planning`. The plan is a directory with `root.md` + one `step-<n>.md` per node. Your job is to act as a **topological scheduler**: at each tick, find steps whose dependencies are all done, fan them out as parallel sub-agents (one per ready step), wait, repeat — until the DAG is drained. Then run Global Verification.\n\nThis is the parallel sibling of `implementing`. The orchestration model is the same (sub-agents do the work, main session coordinates), only the scheduler is different.\n\n## Working Agreement\n\n**All user-facing questions go through `AskUserQuestion`** — see `desplega:ask-user` for conventions. Never ask in chat as plain bullets.\n\n**All read/research/validation work goes through sub-agents** — keep raw tool output out of the main session. Default to `run_in_background: true`. The fan-out scheduler below is built on this.\n\nThe autonomy mode (below) controls how often you check in. AskUserQuestion is always the mechanism.\n\nFile-review is on by default — when significant changes land in a step (or wave), invoke `/file-review:file-review <path>` for inline feedback (skip only if Autopilot).\n\n## Autonomy Mode\n\n| Mode | Behavior |\n|------|----------|\n| **Autopilot** | Drain the DAG without pausing. Only stop on blocker / failed step. |\n| **Critical** (Default) | Pause when each *wave* of parallel steps completes; wait for manual verification before unlocking the next wave. |\n| **Verbose** | Pause after each individual step (even within a wave). |\n\n## Initial Setup Questions\n\nAfter understanding the plan and before the scheduler loop starts, gather implementation-specific details (skip in Autopilot):\n\n### 1. Branch / Worktree Setup\n\nCheck the current branch: `git branch --show-current`. Then check if the `wts` plugin is installed (look for `wts:wts` in available skills).\n\n**If wts is installed**, use **AskUserQuestion**:\n\n| Question | Options |\n|----------|---------|\n| \"You're on `<current-branch>`. Where would you like to implement?\" | 1. Continue on current branch, 2. Create a new branch, 3. Create a wts worktree |\n\n**If wts is not installed**, drop the worktree option.\n\n### 2. Commit Strategy\n\nUse **AskUserQuestion**:\n\n| Question | Options |\n|----------|---------|\n| \"How would you like to handle commits during parallel implementation?\" | 1. Commit after each step completes (Recommended), 2. Commit at the end (single commit), 3. Let me decide as I go |\n\nIf \"Commit after each step\" is selected, after a step's manual verification passes, create a commit: `[step-N] <step name>`.\n\n### 3. Orchestration Mode (only if the `Workflow` tool is available)\n\n| Question | Options |\n|----------|---------|\n| \"Run the DAG waves as Workflow scripts? (deterministic scheduling, parallel steps as agent() calls)\" | 1. Yes — Workflow waves, 2. No — Agent fan-out (Default) |\n\nA \"yes\" is the explicit opt-in the Workflow tool requires. If opted in, each wave of the scheduler loop below runs as one Workflow script — a `parallel()` of `agent()` calls, one per ready step, with `model`/`effort` per `desplega:delegate-work`. Everything else is unchanged: step agents still follow the `step-running` contract (atomic frontmatter claim, three-bucket verification), and autonomy-mode pause points sit **between** Workflow invocations, never inside one. In Autopilot these questions are skipped, so there is no opt-in — use Agent fan-out unless the user pre-authorized workflows.\n\n### 4. Code Review Mode\n\n| Question | Options |\n|----------|---------|\n| \"Run an automatic code review after each wave?\" | 1. Automatic two-axis review per wave (Recommended), 2. Only at the end (single review after the DAG drains), 3. Off — I'll review myself |\n\nIn **Autopilot**, skip the question and default to automatic per-wave review.\n\n## Getting Started\n\nGiven a plan directory path:\n\n1. **Read `root.md` fully** (no `limit`/`offset`). Capture: Overview, Current State, Desired End State, Implementation Approach, Global Verification.\n2. **Read every `step-<n>.md`'s frontmatter** to build the dependency graph (`id`, `depends_on`). You don't need to read step bodies up front — the sub-agents will do that.\n3. **Validate the DAG:**\n - No cycles\n - Every `depends_on` ID exists as a step file\n - At least one step has `depends_on: []` (otherwise nothing can start)\n4. **Set `root.md` frontmatter `status: in-progress`.**\n5. **Build a TodoWrite list** with one entry per step, marked `pending`.\n6. **Resume support:** if any step's body has `- [x]` boxes already (or its frontmatter says `status: completed` if the user added it), trust them and treat that step as `done`.\n\nIf no path given, ask via AskUserQuestion.\n\n## The Scheduler Loop\n\nThe scheduler reads each step's frontmatter `status` (`ready` | `claimed` | `done`) and `depends_on`. The frontmatter `status` field is the **single source of truth** — multiple orchestrator instances on the same plan dir coordinate through it (each `desplega:step-running` sub-agent atomically claims its step before doing work).\n\n```\nwhile any step has status != done:\n ready = [step for step in steps\n if step.status == \"ready\"\n and all(dep.status == \"done\" for dep in step.depends_on)]\n if not ready:\n # DAG drained, OR every remaining undone step is claimed by another worker\n if any step has status == claimed: wait for in-flight claims to resolve\n else: report stuck (likely cycle or unrecoverable failure)\n continue\n fan out each step in `ready` as a parallel `desplega:step-running` sub-agent\n wait for the wave to complete\n review reports; step-running has already updated frontmatter\n (status: done on success, status: ready on retry-able failure, status: claimed if held for investigation)\n if Critical mode: pause for manual verification of newly-completed steps\n if any failed: stop and ask user how to proceed\n```\n\n### Spawning a Step Sub-agent\n\nUse the `Agent` tool with `run_in_background: true`, invoking `desplega:step-running`. Pass:\n\n- **Step path**: full path to `step-<n>.md`\n- **Plan dir**: full path to the parent plan directory\n- **Agent ID**: unique ID for this sub-agent (e.g. orchestrator session ID + step ID + timestamp). step-running uses this for atomic claim + stale-claim detection.\n- **Plan-level context** (optional): a quick brief from `root.md`. step-running re-reads `root.md` itself, so this is just to reduce round-trips.\n\n`step-running` owns:\n- Atomic claim (rewrite frontmatter `status: ready` → `status: claimed, assignee: <agent-id>, claimed_at: <ts>`)\n- Three-bucket verification (Automated Verification, Automated QA, QA Doc identification)\n- Terminal status transition (`status: done` on success, `status: ready` on retry-able failure)\n- Reporting back\n\nThe orchestrator does NOT do step work itself — it delegates. See `desplega:step-running` for the full sub-agent contract.\n\n**Executor routing**: if the `desplega:delegate-work` skill is available, pick each step's executor per its routing matrix instead of defaulting to a `step-running` sub-agent — a step may route to a Codex variant (one worktree per parallel slice) or a specific Claude model tier. Only the executor choice changes; the scheduler, frontmatter claim protocol, and all other semantics here stay unchanged. When a step routes to Codex, the orchestrator owns the frontmatter bookkeeping that `step-running` would normally do (Codex must not edit plan files).\n\n### Wave Completion\n\nWhen a wave finishes:\n1. **Review each agent's report.** Mark steps `done` only if `completed` was reported.\n2. **Run the wave code review** (unless review mode is Off) — invoke `desplega:code-reviewing` on the wave's combined diff: Standards + Spec axes as parallel background sub-agents (routed per `desplega:delegate-work`), spec source = the completed steps' bodies and Success Criteria. Critical findings block those steps' commits — fix and re-verify first. If \"Only at the end\" was selected, run one review over the full diff after the DAG drains instead.\n3. **Handle `QA Doc: <path>`** — for each step that reported a QA doc, invoke `desplega:qa` against that path. The Automated QA bucket inside the step is already handled by the sub-agent; only the linked doc needs separate orchestration here. (`QA: n/a` → proceed normally.)\n4. **Manual verification (if not Autopilot)** — present manual verification items from each completed step's body. Wait for user confirmation. Don't tick manual boxes until confirmed.\n5. **Commits (if commit-per-step was selected)** — after a step's manual verification passes, create a commit: `[step-N] <step name>`.\n6. **Loop** — recompute `ready` and start the next wave.\n\n## Handling Failures and Mismatches\n\nIf a sub-agent reports `failed` or `blocked`, or you spot a mismatch between plan and reality:\n\n| Question | Options |\n|----------|---------|\n| \"[step-N] [issue]. How should I proceed?\" | 1. Adapt step (edit step-N.md and retry), 2. Retry as-is, 3. Skip and continue (mark step blocked), 4. Stop the run |\n\nIn Autopilot mode, use best judgment, document the decision in the step file, and continue if non-fatal.\n\n## After the DAG Drains\n\nWhen every step is `done`:\n\n1. Run **Global Verification** from `root.md`. Tick automated checks; surface manual checks to the user.\n2. Set `root.md` frontmatter `status: completed`.\n3. Offer post-implementation auditing: \"Would you like me to run `/verify-plan` and `/review` on the plan directory?\"\n4. If commit-per-step was off, offer to create a single bundled commit now.\n5. If the work ships as a GitHub PR: once review comments land, address them with `desplega:tackle-gh-comments` (fetch threads, verify each claim, fix, reply, resolve — push last).\n\n## Important Guidelines\n\n1. **One step = one sub-agent.** Don't bundle steps into a single agent even if they're in the same wave — fan-out is the whole point.\n2. **Plan-level context goes to every sub-agent.** Sibling step bodies do not.\n3. **The DAG is canonical via step frontmatter** — if `root.md`'s table is out of sync, trust the frontmatter.\n4. **Resume works step-granular.** If the user re-runs `/v-implement` mid-DAG, completed steps stay completed; only undone ones rerun.\n5. **Don't tick manual checkboxes** until the user confirms — automated boxes can be ticked by the sub-agent or the orchestrator.\n\n## Review Integration\n\nIf `file-review` is available and the user opted in:\n- After each step's significant code changes, invoke `/file-review:file-review <changed-file>`.\n- Process feedback with `file-review:process-review` before treating the step as done.\n- Skip in Autopilot.\n";
12009
12174
 
12010
12175
  // templates/skills/v-planning/config.json
12011
- var config_default49 = `{
12176
+ var config_default50 = `{
12012
12177
  "category": "skills",
12013
12178
  "description": "Vertical / parallel implementation planning skill. Creates DAG-structured plan directories where each step is an independent, QA-able vertical slice that sub-agents can pick up and implement in parallel. Use whenever the user wants a plan that fans out (multiple independent features), invokes /v-plan, or asks for a \\"parallel plan\\", \\"DAG plan\\", \\"vertical plan\\", or \\"plan that can be parallelized\\" — even if they don't say those exact words. Prefer the linear \`planning\` skill for strictly sequential work.",
12014
12179
  "displayName": "V-Planning",
@@ -12029,7 +12194,7 @@ var config_default49 = `{
12029
12194
  `;
12030
12195
 
12031
12196
  // templates/skills/v-planning/content.md
12032
- var content_default49 = `# v-planning
12197
+ var content_default50 = `# v-planning
12033
12198
 
12034
12199
  You create implementation plans as a **DAG of vertical steps** — each step a complete, QA-able slice of value (DB + API + UI + tests for one feature). The DAG captures feature-level dependencies, so independent steps can be implemented in parallel by sub-agents.
12035
12200
 
@@ -12120,7 +12285,7 @@ Structure validation runs automatically (rule 9, Haiku sub-agent).
12120
12285
  `;
12121
12286
 
12122
12287
  // templates/skills/verifying/config.json
12123
- var config_default50 = `{
12288
+ var config_default51 = `{
12124
12289
  "category": "skills",
12125
12290
  "description": "Post-implementation plan verification. Cross-references plans against actual changes for completeness and accuracy.",
12126
12291
  "displayName": "Verifying",
@@ -12141,7 +12306,7 @@ var config_default50 = `{
12141
12306
  `;
12142
12307
 
12143
12308
  // templates/skills/verifying/content.md
12144
- var content_default50 = `# Verifying
12309
+ var content_default51 = `# Verifying
12145
12310
 
12146
12311
  You are performing a post-implementation audit of a plan, cross-referencing it against actual changes to ensure nothing was missed, nothing is stale, and the implementation matches what was planned.
12147
12312
 
@@ -12289,7 +12454,7 @@ File-review is on by default (unless Autopilot):
12289
12454
  `;
12290
12455
 
12291
12456
  // templates/skills/work-on-task/config.json
12292
- var config_default51 = `{
12457
+ var config_default52 = `{
12293
12458
  "kind": "skill",
12294
12459
  "name": "work-on-task",
12295
12460
  "displayName": "Work On Task",
@@ -12306,10 +12471,10 @@ var config_default51 = `{
12306
12471
  `;
12307
12472
 
12308
12473
  // templates/skills/work-on-task/content.md
12309
- var content_default51 = "# Working on a task\n\nThe taskId follows the command. Without one, call `get-tasks` with `mineOnly: true` and take your `pending` or `in_progress` task. If there is none, say so and stop.\n\nThis message carries the task text, its attachments, its output format, and memories from past sessions. If it does not (you invoked this command yourself, or the context was compacted), run the `task-context-gathering` script with the taskId.\n\nWhen the task names a skill (`researching`, `planning`, `implementing`), use it. Otherwise work directly.\n\nFinish the task with one of the four endings in your operating contract: `completed`, `defer-task`, `request-human-input`, or `failed`. Then stop.\n\nResuming (a resume task, or work cut by a graceful shutdown): read the parent's last progress line, then re-read live state once (PR state and head SHA, branch, `git status`) before new work. Re-run controls only if the head moved. Never redo a pushed commit or open a second PR for the same branch. Store a progress line with branch, PR number and head SHA each time you push. A document task has no branch: its live state is the brief's agent-fs output path and the task attachments. Run `agent-fs ls` on that path, download any partial and extend it. Then list the task's local work directory: a shutdown can leave the newest draft only there, or leave cache files half-written. Parse every cache file, delete the ones that fail, and re-run only the stages whose output is missing. Never re-run collection steps that already produced artifacts. A render task (video, image, generated page) has no branch either: its live state is the local project directory plus the brief's agent-fs output. List both; timestamps are hints only. Before reusing an output, verify that it exists, is complete and valid, and corresponds to the current sources and render settings (for example, using recorded input/settings hashes). Download remote output and verify its bytes and provenance; agent-fs listing dates alone do not establish freshness. Re-render missing, invalid, incomplete or stale output. Hand over the live app link `${AGENT_FS_LIVE_URL}/file/~/<org>/<drive>/<path>` by default. Use a share link only when the requester asked for one or the reader has no agent-fs login: then reuse a usable one, and create a missing one or replace an expired, revoked or view-exhausted one without re-rendering a valid unchanged output. A task that covers several PRs re-reads every PR in scope (state, mergedAt, head SHA), not only the first: a PR that merged during the shutdown takes no more pushes. If your task's `model` differs from the parent's, say so in the output, because the result's provenance changed.\n\nWrite times in replies, outputs and defer notes in the requester's timezone when the Requester Profile names one, never raw UTC.\n\nIf the user interrupts, follow their instructions. To resume, call `/work-on-task <taskId>` again.\n";
12474
+ var content_default52 = "# Working on a task\n\nThe taskId follows the command. Without one, call `get-tasks` with `mineOnly: true` and take your `pending` or `in_progress` task. If there is none, say so and stop.\n\nThis message carries the task text, its attachments, its output format, and memories from past sessions. If it does not (you invoked this command yourself, or the context was compacted), run the `task-context-gathering` script with the taskId.\n\nWhen the task names a skill (`researching`, `planning`, `implementing`), use it. Otherwise work directly.\n\nFinish the task with one of the four endings in your operating contract: `completed`, `defer-task`, `request-human-input`, or `failed`. Then stop.\n\nResuming (a resume task, or work cut by a graceful shutdown): read the parent's last progress line, then re-read live state once (PR state and head SHA, branch, `git status`) before new work. Re-run controls only if the head moved. Never redo a pushed commit or open a second PR for the same branch. Store a progress line with branch, PR number and head SHA each time you push. A document task has no branch: its live state is the brief's agent-fs output path and the task attachments. Run `agent-fs ls` on that path, download any partial and extend it. Then list the task's local work directory: a shutdown can leave the newest draft only there, or leave cache files half-written. Parse every cache file, delete the ones that fail, and re-run only the stages whose output is missing. Never re-run collection steps that already produced artifacts. A render task (video, image, generated page) has no branch either: its live state is the local project directory plus the brief's agent-fs output. List both; timestamps are hints only. Before reusing an output, verify that it exists, is complete and valid, and corresponds to the current sources and render settings (for example, using recorded input/settings hashes). Download remote output and verify its bytes and provenance; agent-fs listing dates alone do not establish freshness. Re-render missing, invalid, incomplete or stale output. Hand over the live app link `${AGENT_FS_LIVE_URL}/file/~/<org>/<drive>/<path>` by default. Use a share link only when the requester asked for one or the reader has no agent-fs login: then reuse a usable one, and create a missing one or replace an expired, revoked or view-exhausted one without re-rendering a valid unchanged output. A task that covers several PRs re-reads every PR in scope (state, mergedAt, head SHA), not only the first: a PR that merged during the shutdown takes no more pushes. If your task's `model` differs from the parent's, say so in the output, because the result's provenance changed.\n\nWrite times in replies, outputs and defer notes in the requester's timezone when the Requester Profile names one, never raw UTC.\n\nIf the user interrupts, follow their instructions. To resume, call `/work-on-task <taskId>` again.\n";
12310
12475
 
12311
12476
  // templates/skills/workflow-iterate/config.json
12312
- var config_default52 = `{
12477
+ var config_default53 = `{
12313
12478
  "kind": "skill",
12314
12479
  "name": "workflow-iterate",
12315
12480
  "displayName": "Workflow Iteration",
@@ -12331,7 +12496,7 @@ var config_default52 = `{
12331
12496
  `;
12332
12497
 
12333
12498
  // templates/skills/workflow-iterate/content.md
12334
- var content_default52 = `# Workflow Iteration
12499
+ var content_default53 = `# Workflow Iteration
12335
12500
 
12336
12501
  Use this skill when you need to change an existing workflow without breaking live runs. The goal is to make small, verified revisions: inspect the current workflow, diagnose the failing step, patch only the required node or edge, trigger a realistic run, and keep iterating until the run reaches the intended terminal state.
12337
12502
 
@@ -12608,7 +12773,7 @@ The same rules apply to a standalone \`request-human-input\` call.
12608
12773
  `;
12609
12774
 
12610
12775
  // templates/skills/workflow-structured-output/config.json
12611
- var config_default53 = `{
12776
+ var config_default54 = `{
12612
12777
  "kind": "skill",
12613
12778
  "name": "workflow-structured-output",
12614
12779
  "displayName": "Workflow Structured Output",
@@ -12625,10 +12790,10 @@ var config_default53 = `{
12625
12790
  `;
12626
12791
 
12627
12792
  // templates/skills/workflow-structured-output/content.md
12628
- var content_default53 = '# Workflow Structured Output\n\n> **Companion skill — `workflow-iterate` (author-side).** This skill is for *workers* assigned a task spawned by an `agent-task` workflow node with an `outputSchema`. The author-side counterpart `workflow-iterate` covers how the workflow defines that schema, why gates downstream depend on it, and how to debug failed runs. If you ever need to understand *why* a particular schema is shaped the way it is — or you\'re switching from worker to author mode — read `workflow-iterate`.\n\n## Failure reason → fix (read this first)\n\nIf you see this failure reason on a task, the fix is always the same:\n\n| failureReason contains | What it means | Fix |\n|---|---|---|\n| `Task has an outputSchema but no output was provided` | You called `store-progress` without an `output` when the task required a JSON object matching `outputSchema` | Re-call `store-progress` with `status: "completed"` and `output` = a **stringified JSON** matching the schema exactly |\n| `Task output must be valid JSON` / `Task output does not match the outputSchema` | You passed invalid JSON, omitted required fields, or used the wrong types | Re-read the schema, include every `required` field with the exact key names, re-call `store-progress` |\n\n**You can re-call `store-progress` even after a rejection.** Your prior progress updates do not count as the final output. Fix the JSON and try again.\n\n## Pre-flight checklist (run through before calling store-progress)\n\n1. **Do the task details contain an actual `outputSchema`?** If yes, runtime\n enforcement is active: continue with that exact schema.\n2. **If there is no `outputSchema`, does the user provide an explicit JSON Output\n Format or interface?** Honor it as the requested output contract even though\n the runner is not enforcing an `outputSchema`.\n3. **Are workflow origin or tags such as `deterministic`, `litmus`, `validation`,\n or `context` the only signals?** They are heuristics only. Re-read the task\n details for an actual schema or explicit format. If neither exists, do not\n invent one; plain-text output is allowed.\n4. **Can I quote the exact required shape from the task details?** Use its exact\n keys and types, with every required field and no guessed renames.\n5. **Is my `output` a string (stringified JSON), not an object?** For a structured\n contract, `store-progress.output` should be a JSON string.\n6. **Only after the applicable contract is clear:** call `store-progress` with\n `status: "completed"` and the stringified JSON, or use plain text when no\n structured contract exists.\n\nIf the required shape is unclear, re-read the task details. Never synthesize a\nschema from tags or workflow origin.\n\n## Why this exists\n\nWhen a task has an actual `outputSchema`, the runner validates\n`store-progress.output` against it and rejects missing output, invalid JSON, or\nschema mismatches with one of the current messages listed above. A JSON Output\nFormat or interface without `task.outputSchema` remains a user instruction, but\nit is not the same runtime enforcement mechanism. Missing the distinction can\nturn completed work into a rejected terminal update, so check the task contract\nbefore reporting completion.\n\n## How to spot a structured-output task\n\nTreat these signals differently:\n\n- An actual `task.outputSchema` means JSON is runtime-enforced.\n- An explicit "Output Format", "Return a JSON object", or TypeScript/JSON\n interface is a user contract to return that shape, even without runtime\n enforcement.\n- Tags such as `deterministic`, `litmus`, `validation`, `releases`, or `context`,\n and `source = workflow`, only tell you to inspect the task details carefully.\n They do not prove a schema exists.\n\nWhen in doubt, re-read the task details and its `outputSchema`. Do not invent a\nschema or required fields.\n\n## How to complete correctly\n\n1. **Build the JSON object** that matches the actual `outputSchema` or explicit\n user-provided JSON format. Include every required field and use the exact key\n names from that contract.\n2. **Stringify it** — `store-progress.output` must be a string, not an object. Use `JSON.stringify(obj)` in your head.\n3. **Call store-progress** with `status: "completed"` and that JSON string as `output`.\n\n### Example — skip case\n\nTask has schema `{skip: bool, reason?: str, contextPath?: str, ...}` and you\'re skipping because the release already exists:\n\n```\nstore-progress(\n taskId,\n status="completed",\n output=\'{"skip":true,"reason":"Release already exists for this week"}\'\n)\n```\n\n### Example — full run\n\n```\nstore-progress(\n taskId,\n status="completed",\n output=\'{"skip":false,"contextPath":"release-runs/2026-04-20/context.json","commitCount":42,"repos":["example-repo"],"repoPatternsSource":"cache","dateRange":"2026-04-13 to 2026-04-20"}\'\n)\n```\n\n### Example — litmus / validation verdict\n\n```\nstore-progress(\n taskId,\n status="completed",\n output=\'{"verdict":"publish","reason":"5 user-facing changes; threshold met"}\'\n)\n```\n\n## Anti-patterns for an `outputSchema` task\n\n- `output: "Done. Context written to agent-fs at release-runs/2026-04-20/context.json"`\n- `output: "Published release notes for week of 2026-04-20"`\n- `output: "Verdict: publish"`\n- Calling `store-progress` with `status: "completed"` and no `output` at all\n- JSON that\'s missing any `required` field from the schema\n- JSON with extra keys instead of the schema\'s exact keys\n\n## Recovery if you realize mid-task\n\nIf you\'ve done all the work but forgot the JSON contract, just call `store-progress` again with the correct JSON string in `output`. Your prior progress updates don\'t count as the final output.\n\n## Verify before completing\n\nRead your task description once more. Find the schema. Build the JSON. Then complete. Takes 30 seconds. Saves a workflow re-run.\n\n## See also\n\n- **`workflow-iterate`** — the author-side counterpart of this skill. Read it if you\'re editing the workflow that produced this task, or want to understand why this particular schema is shaped the way it is (which gates downstream depend on it, etc.).\n';
12793
+ var content_default54 = '# Workflow Structured Output\n\n> **Companion skill — `workflow-iterate` (author-side).** This skill is for *workers* assigned a task spawned by an `agent-task` workflow node with an `outputSchema`. The author-side counterpart `workflow-iterate` covers how the workflow defines that schema, why gates downstream depend on it, and how to debug failed runs. If you ever need to understand *why* a particular schema is shaped the way it is — or you\'re switching from worker to author mode — read `workflow-iterate`.\n\n## Failure reason → fix (read this first)\n\nIf you see this failure reason on a task, the fix is always the same:\n\n| failureReason contains | What it means | Fix |\n|---|---|---|\n| `Task has an outputSchema but no output was provided` | You called `store-progress` without an `output` when the task required a JSON object matching `outputSchema` | Re-call `store-progress` with `status: "completed"` and `output` = a **stringified JSON** matching the schema exactly |\n| `Task output must be valid JSON` / `Task output does not match the outputSchema` | You passed invalid JSON, omitted required fields, or used the wrong types | Re-read the schema, include every `required` field with the exact key names, re-call `store-progress` |\n\n**You can re-call `store-progress` even after a rejection.** Your prior progress updates do not count as the final output. Fix the JSON and try again.\n\n## Pre-flight checklist (run through before calling store-progress)\n\n1. **Do the task details contain an actual `outputSchema`?** If yes, runtime\n enforcement is active: continue with that exact schema.\n2. **If there is no `outputSchema`, does the user provide an explicit JSON Output\n Format or interface?** Honor it as the requested output contract even though\n the runner is not enforcing an `outputSchema`.\n3. **Are workflow origin or tags such as `deterministic`, `litmus`, `validation`,\n or `context` the only signals?** They are heuristics only. Re-read the task\n details for an actual schema or explicit format. If neither exists, do not\n invent one; plain-text output is allowed.\n4. **Can I quote the exact required shape from the task details?** Use its exact\n keys and types, with every required field and no guessed renames.\n5. **Is my `output` a string (stringified JSON), not an object?** For a structured\n contract, `store-progress.output` should be a JSON string.\n6. **Only after the applicable contract is clear:** call `store-progress` with\n `status: "completed"` and the stringified JSON, or use plain text when no\n structured contract exists.\n\nIf the required shape is unclear, re-read the task details. Never synthesize a\nschema from tags or workflow origin.\n\n## Why this exists\n\nWhen a task has an actual `outputSchema`, the runner validates\n`store-progress.output` against it and rejects missing output, invalid JSON, or\nschema mismatches with one of the current messages listed above. A JSON Output\nFormat or interface without `task.outputSchema` remains a user instruction, but\nit is not the same runtime enforcement mechanism. Missing the distinction can\nturn completed work into a rejected terminal update, so check the task contract\nbefore reporting completion.\n\n## How to spot a structured-output task\n\nTreat these signals differently:\n\n- An actual `task.outputSchema` means JSON is runtime-enforced.\n- An explicit "Output Format", "Return a JSON object", or TypeScript/JSON\n interface is a user contract to return that shape, even without runtime\n enforcement.\n- Tags such as `deterministic`, `litmus`, `validation`, `releases`, or `context`,\n and `source = workflow`, only tell you to inspect the task details carefully.\n They do not prove a schema exists.\n\nWhen in doubt, re-read the task details and its `outputSchema`. Do not invent a\nschema or required fields.\n\n## How to complete correctly\n\n1. **Build the JSON object** that matches the actual `outputSchema` or explicit\n user-provided JSON format. Include every required field and use the exact key\n names from that contract.\n2. **Stringify it** — `store-progress.output` must be a string, not an object. Use `JSON.stringify(obj)` in your head.\n3. **Call store-progress** with `status: "completed"` and that JSON string as `output`.\n\n### Example — skip case\n\nTask has schema `{skip: bool, reason?: str, contextPath?: str, ...}` and you\'re skipping because the release already exists:\n\n```\nstore-progress(\n taskId,\n status="completed",\n output=\'{"skip":true,"reason":"Release already exists for this week"}\'\n)\n```\n\n### Example — full run\n\n```\nstore-progress(\n taskId,\n status="completed",\n output=\'{"skip":false,"contextPath":"release-runs/2026-04-20/context.json","commitCount":42,"repos":["example-repo"],"repoPatternsSource":"cache","dateRange":"2026-04-13 to 2026-04-20"}\'\n)\n```\n\n### Example — litmus / validation verdict\n\n```\nstore-progress(\n taskId,\n status="completed",\n output=\'{"verdict":"publish","reason":"5 user-facing changes; threshold met"}\'\n)\n```\n\n## Anti-patterns for an `outputSchema` task\n\n- `output: "Done. Context written to agent-fs at release-runs/2026-04-20/context.json"`\n- `output: "Published release notes for week of 2026-04-20"`\n- `output: "Verdict: publish"`\n- Calling `store-progress` with `status: "completed"` and no `output` at all\n- JSON that\'s missing any `required` field from the schema\n- JSON with extra keys instead of the schema\'s exact keys\n\n## Recovery if you realize mid-task\n\nIf you\'ve done all the work but forgot the JSON contract, just call `store-progress` again with the correct JSON string in `output`. Your prior progress updates don\'t count as the final output.\n\n## Verify before completing\n\nRead your task description once more. Find the schema. Build the JSON. Then complete. Takes 30 seconds. Saves a workflow re-run.\n\n## See also\n\n- **`workflow-iterate`** — the author-side counterpart of this skill. Read it if you\'re editing the workflow that produced this task, or want to understand why this particular schema is shaped the way it is (which gates downstream depend on it, etc.).\n';
12629
12794
 
12630
12795
  // templates/skills/wts-expert/config.json
12631
- var config_default54 = `{
12796
+ var config_default55 = `{
12632
12797
  "category": "skills",
12633
12798
  "description": "Git worktree management expert for @desplega.ai/wts. Use when the user asks about git worktrees, wts commands, worktree workflows, or wants help managing multiple branches simultaneously.",
12634
12799
  "displayName": "WTS Expert",
@@ -12649,7 +12814,7 @@ var config_default54 = `{
12649
12814
  `;
12650
12815
 
12651
12816
  // templates/skills/wts-expert/content.md
12652
- var content_default54 = `# WTS Expert
12817
+ var content_default55 = `# WTS Expert
12653
12818
 
12654
12819
  You are an expert on \`@desplega.ai/wts\`, a CLI tool for managing Git worktrees with tmux integration, Claude Code launcher support, and GitHub PR creation.
12655
12820
 
@@ -15629,11 +15794,11 @@ var BUILT_IN_SKILL_SOURCES = [
15629
15794
  { config: config_default37, body: content_default37 },
15630
15795
  { config: config_default38, body: content_default38 },
15631
15796
  { config: config_default43, body: content_default43 },
15797
+ { config: config_default44, body: content_default44 },
15632
15798
  { config: config_default39, body: content_default39 },
15633
15799
  { config: config_default40, body: content_default40 },
15634
15800
  { config: config_default41, body: content_default41 },
15635
15801
  { config: config_default42, body: content_default42 },
15636
- { config: config_default44, body: content_default44 },
15637
15802
  { config: config_default45, body: content_default45 },
15638
15803
  { config: config_default46, body: content_default46 },
15639
15804
  { config: config_default47, body: content_default47 },
@@ -15643,7 +15808,8 @@ var BUILT_IN_SKILL_SOURCES = [
15643
15808
  { config: config_default51, body: content_default51 },
15644
15809
  { config: config_default52, body: content_default52 },
15645
15810
  { config: config_default53, body: content_default53 },
15646
- { config: config_default54, body: content_default54 }
15811
+ { config: config_default54, body: content_default54 },
15812
+ { config: config_default55, body: content_default55 }
15647
15813
  ];
15648
15814
  function canonicalFiles(files) {
15649
15815
  return [...files].sort((a, b) => a.path.localeCompare(b.path)).map((file) => `${file.path}
@@ -15897,7 +16063,7 @@ async function runSeeders(seeders, opts) {
15897
16063
  var import_cron_parser = __toESM(require_dist2(), 1);
15898
16064
 
15899
16065
  // templates/schedules/daily-blocker-digest/config.json
15900
- var config_default55 = `{
16066
+ var config_default56 = `{
15901
16067
  "kind": "schedule",
15902
16068
  "name": "daily-blocker-digest",
15903
16069
  "displayName": "Daily Blocker Digest",
@@ -15919,7 +16085,7 @@ var config_default55 = `{
15919
16085
  `;
15920
16086
 
15921
16087
  // templates/schedules/daily-blocker-digest/content.md
15922
- var content_default55 = `# Daily Blocker Digest
16088
+ var content_default56 = `# Daily Blocker Digest
15923
16089
 
15924
16090
  Delivery uses configured admin channels with an in-app fallback.
15925
16091
 
@@ -16088,7 +16254,7 @@ Call \`store-progress\` with status \`completed\` and an output paragraph coveri
16088
16254
  `;
16089
16255
 
16090
16256
  // templates/schedules/daily-compounding-reflection/config.json
16091
- var config_default56 = `{
16257
+ var config_default57 = `{
16092
16258
  "kind": "schedule",
16093
16259
  "name": "daily-compounding-reflection",
16094
16260
  "displayName": "Daily Evolution",
@@ -16111,7 +16277,7 @@ var config_default56 = `{
16111
16277
  `;
16112
16278
 
16113
16279
  // templates/schedules/daily-compounding-reflection/content.md
16114
- var content_default56 = `# Daily Compounding Reflection
16280
+ var content_default57 = `# Daily Compounding Reflection
16115
16281
 
16116
16282
  Delivery uses configured admin channels with an in-app fallback.
16117
16283
 
@@ -16336,7 +16502,7 @@ If you have zero changes across all three folds and zero deferred items, somethi
16336
16502
  `;
16337
16503
 
16338
16504
  // templates/schedules/daily-hn-briefing/config.json
16339
- var config_default57 = `{
16505
+ var config_default58 = `{
16340
16506
  "kind": "schedule",
16341
16507
  "name": "daily-hn-briefing",
16342
16508
  "displayName": "Daily Hacker News Briefing",
@@ -16353,7 +16519,7 @@ var config_default57 = `{
16353
16519
  `;
16354
16520
 
16355
16521
  // templates/schedules/daily-hn-briefing/content.md
16356
- var content_default57 = `# Daily Hacker News Briefing
16522
+ var content_default58 = `# Daily Hacker News Briefing
16357
16523
 
16358
16524
  Template parameters: {{REPORT_EMAIL}}
16359
16525
 
@@ -16455,7 +16621,7 @@ IMPORTANT:
16455
16621
  `;
16456
16622
 
16457
16623
  // templates/schedules/daily-status-report/config.json
16458
- var config_default58 = `{
16624
+ var config_default59 = `{
16459
16625
  "kind": "schedule",
16460
16626
  "name": "daily-status-report",
16461
16627
  "displayName": "Daily Status Report",
@@ -16477,7 +16643,7 @@ var config_default58 = `{
16477
16643
  `;
16478
16644
 
16479
16645
  // templates/schedules/daily-status-report/content.md
16480
- var content_default58 = `# Daily Status Report
16646
+ var content_default59 = `# Daily Status Report
16481
16647
 
16482
16648
  Give the operator one daily read on whether the swarm is healthy: what's running, what's failed, what's waiting on them.
16483
16649
 
@@ -16573,7 +16739,7 @@ More than 3 qualify ⇒ post the 3 that matter and put the rest in the task outp
16573
16739
  `;
16574
16740
 
16575
16741
  // templates/schedules/daily-swarm-update-check/config.json
16576
- var config_default59 = `{
16742
+ var config_default60 = `{
16577
16743
  "kind": "schedule",
16578
16744
  "name": "daily-swarm-update-check",
16579
16745
  "displayName": "Daily Agent-Swarm Update Check",
@@ -16595,7 +16761,7 @@ var config_default59 = `{
16595
16761
  `;
16596
16762
 
16597
16763
  // templates/schedules/daily-swarm-update-check/content.md
16598
- var content_default59 = `# Daily Agent-Swarm Update Check
16764
+ var content_default60 = `# Daily Agent-Swarm Update Check
16599
16765
 
16600
16766
  Zero-config auto-update watchdog: compares the swarm's own running version against the latest published GitHub release of \`desplega-ai/agent-swarm\`, and flags the operator when an upgrade is available. No placeholders and no integration required — every install gets this by default.
16601
16767
 
@@ -16647,7 +16813,7 @@ Do not attempt the upgrade yourself — this schedule only detects and reports.
16647
16813
  `;
16648
16814
 
16649
16815
  // templates/schedules/daily-workflow-health-audit/config.json
16650
- var config_default60 = `{
16816
+ var config_default61 = `{
16651
16817
  "kind": "schedule",
16652
16818
  "name": "daily-workflow-health-audit",
16653
16819
  "displayName": "Daily Workflow Health Audit",
@@ -16669,7 +16835,7 @@ var config_default60 = `{
16669
16835
  `;
16670
16836
 
16671
16837
  // templates/schedules/daily-workflow-health-audit/content.md
16672
- var content_default60 = `# Daily Workflow Health Audit
16838
+ var content_default61 = `# Daily Workflow Health Audit
16673
16839
 
16674
16840
  Delivery uses configured admin channels with an in-app fallback.
16675
16841
 
@@ -16863,7 +17029,7 @@ Omit any section whose count is 0. **HARD CEILING 700 characters — not the 400
16863
17029
  `;
16864
17030
 
16865
17031
  // templates/schedules/gtm-weekly-review/config.json
16866
- var config_default61 = `{
17032
+ var config_default62 = `{
16867
17033
  "kind": "schedule",
16868
17034
  "name": "gtm-weekly-review",
16869
17035
  "displayName": "Weekly GTM Metrics Review",
@@ -16880,7 +17046,7 @@ var config_default61 = `{
16880
17046
  `;
16881
17047
 
16882
17048
  // templates/schedules/gtm-weekly-review/content.md
16883
- var content_default61 = `Template parameters: {{REPO_URL}}, {{GSC_PROPERTY}}
17049
+ var content_default62 = `Template parameters: {{REPO_URL}}, {{GSC_PROPERTY}}
16884
17050
 
16885
17051
  # Weekly GTM Metrics Review
16886
17052
 
@@ -16961,7 +17127,7 @@ This is part of your team's GTM goal; update the goal statement before enabling
16961
17127
  `;
16962
17128
 
16963
17129
  // templates/schedules/weekly-code-health-reports/config.json
16964
- var config_default62 = `{
17130
+ var config_default63 = `{
16965
17131
  "kind": "schedule",
16966
17132
  "name": "weekly-code-health-reports",
16967
17133
  "displayName": "Weekly Code Health Reports",
@@ -16978,7 +17144,7 @@ var config_default62 = `{
16978
17144
  `;
16979
17145
 
16980
17146
  // templates/schedules/weekly-code-health-reports/content.md
16981
- var content_default62 = `# Weekly Code Health Reports
17147
+ var content_default63 = `# Weekly Code Health Reports
16982
17148
 
16983
17149
  Template parameters: {{REPO_URL}}, {{BRANCH}}, {{SCOPE_PATH}}, {{REPORT_NAME}}, {{PAGE_ID}}
16984
17150
 
@@ -17043,7 +17209,7 @@ Call \`store-progress\` with status \`completed\` and an output summary that inc
17043
17209
  `;
17044
17210
 
17045
17211
  // templates/schedules/weekly-dependabot-triage/config.json
17046
- var config_default63 = `{
17212
+ var config_default64 = `{
17047
17213
  "kind": "schedule",
17048
17214
  "name": "weekly-dependabot-triage",
17049
17215
  "displayName": "Weekly Dependency Triage",
@@ -17060,7 +17226,7 @@ var config_default63 = `{
17060
17226
  `;
17061
17227
 
17062
17228
  // templates/schedules/weekly-dependabot-triage/content.md
17063
- var content_default63 = `# Weekly Dependency Triage
17229
+ var content_default64 = `# Weekly Dependency Triage
17064
17230
 
17065
17231
  Template parameters: {{SLACK_CHANNEL_ID}}, {{REPO_URL}}, {{TIMEZONE}}
17066
17232
 
@@ -17114,7 +17280,7 @@ Call \`store-progress\` with status \`completed\` and an output summary listing
17114
17280
  `;
17115
17281
 
17116
17282
  // templates/schedules/weekly-dora-metrics/config.json
17117
- var config_default64 = `{
17283
+ var config_default65 = `{
17118
17284
  "kind": "schedule",
17119
17285
  "name": "weekly-dora-metrics",
17120
17286
  "displayName": "Weekly DORA Metrics",
@@ -17131,7 +17297,7 @@ var config_default64 = `{
17131
17297
  `;
17132
17298
 
17133
17299
  // templates/schedules/weekly-dora-metrics/content.md
17134
- var content_default64 = `# Weekly DORA Metrics
17300
+ var content_default65 = `# Weekly DORA Metrics
17135
17301
 
17136
17302
  Template parameters: {{REPO_URL}}, {{BRANCH}}, {{TAG_PATTERN}}, {{REPORT_NAME}}, {{PAGE_ID}}
17137
17303
 
@@ -17197,7 +17363,7 @@ Call \`store-progress\` with status \`completed\` and an output summary that inc
17197
17363
  `;
17198
17364
 
17199
17365
  // templates/schedules/weekly-harness-upgrade-check/config.json
17200
- var config_default65 = `{
17366
+ var config_default66 = `{
17201
17367
  "kind": "schedule",
17202
17368
  "name": "weekly-harness-upgrade-check",
17203
17369
  "displayName": "Weekly Harness Upgrade Check",
@@ -17214,7 +17380,7 @@ var config_default65 = `{
17214
17380
  `;
17215
17381
 
17216
17382
  // templates/schedules/weekly-harness-upgrade-check/content.md
17217
- var content_default65 = '# Weekly Harness Upgrade Check\n\nThis is a topology-preserving, anonymized port of the live Sunday schedule. It keeps its bundle, deduplication, baseline, partial-fallback, and CI acceptance behavior.\n\n```json\n{"cron":"0 16 * * 0","timezone":"UTC","agentRole":"lead","enabled":true}\n```\n\n**Weekly Harness Upgrade — self-hosted repository Dockerfile.worker**\n\nRepo: `{{REPO_URL}}` (working dir: `/workspace/repo`)\nFile: `Dockerfile.worker`\n\nThe worker image pins these harnesses via `ARG`. Each week, check upstream for new versions and open ONE PR bundling ALL outdated harness bumps together ({{PR_REVIEWER}}\'s preference — bump ALL in one PR per run, do NOT stagger one-per-run).\n\n| ARG | Source | Sync requirement |\n|---|---|---|\n| `CLAUDE_CODE_VERSION` | npm `@anthropic-ai/claude-code` | none |\n| `PI_CODING_AGENT_VERSION` | npm `@earendil-works/pi-coding-agent` | MUST match `@earendil-works/pi-agent-core`, `@earendil-works/pi-ai`, and `@earendil-works/pi-coding-agent` in `package.json` (family-pin, all same version) — bump all together |\n| `CODEX_VERSION` | npm `@openai/codex` | MUST match direct `@openai/codex` in `package.json` (enforced by `scripts/check-codex-default-model.sh`) |\n| `OPENCODE_VERSION` | npm `@opencode/sdk` | Installs both `@opencode/cli` and `@opencode/sdk`. MUST match `@opencode/sdk` and `@opencode/plugin` in `package.json` devDependencies. OpenCode 2 ships under the `@opencode/*` scope; never take a version from `opencode-ai`, `@opencode-ai/sdk`, or the `sst/opencode` GitHub releases (still the 1.x line, which would be a downgrade) |\n\n## Steps\n\n1. `cd /workspace/repo && git fetch origin && git checkout main && git pull --ff-only`\n2. Read current pinned versions from `Dockerfile.worker` (the `ARG` lines) and from `package.json` (for the pi family + `@openai/codex` + `@opencode/sdk`).\n3. For each harness, fetch the latest version:\n - npm claude-code: `npm view @anthropic-ai/claude-code version`\n - npm pi: `npm view @earendil-works/pi-coding-agent version` (use the SAME version for `@earendil-works/pi-agent-core` and `@earendil-works/pi-ai` — they\'re a family pin)\n - npm codex: `npm view @openai/codex version`\n - npm opencode: `npm view @opencode/sdk version` (one version for `@opencode/cli`, `@opencode/sdk`, `@opencode/plugin`)\n4. Check for an existing open bundled PR — `gh pr list --search "harness upgrade in:title" --state open --repo {{REPO_URL}}`. Look at the branch prefix `harness-upgrade/`. If one is already open AND was created within the last 48h (sibling schedule may have just opened it), skip and complete with `"Skipped: sibling harness upgrade PR already open"` + the existing PR URL.\n5. Collect ALL outdated harnesses. If none are outdated, complete with output `"All harnesses up to date as of YYYY-MM-DD"` (no PR).\n6. Branch: `harness-upgrade/weekly-YYYY-MM-DD` (e.g. `harness-upgrade/weekly-2026-06-03`).\n7. Edit `Dockerfile.worker` — bump every outdated ARG. Also update `package.json`:\n - Codex: bump direct `@openai/codex` to match `CODEX_VERSION`.\n - Pi family: bump `@earendil-works/pi-agent-core`, `@earendil-works/pi-ai`, and `@earendil-works/pi-coding-agent` to the same new version as `PI_CODING_AGENT_VERSION`.\n - Opencode: bump `@opencode/sdk` and `@opencode/plugin` (devDependencies) to match `OPENCODE_VERSION`.\n Then re-run `bun install` so `bun.lock` updates.\n8. Local verification (all must pass before pushing):\n ```bash\n bun install --frozen-lockfile\n bun run lint\n bun run tsc:check\n bun test\n bash scripts/check-db-boundary.sh\n ```\n For Codex bumps: also run `bash scripts/check-codex-default-model.sh` (CI runs it too). It fails when `ARG CODEX_VERSION` differs from the direct `@openai/codex` pin in `package.json`, or when the Dockerfile\'s baseline `model = "..."` differs from `CODEX_DEFAULT_MODEL` in `src/providers/codex-models.ts`.\n Note: do NOT run `docker build -f Dockerfile.worker .` locally — the runner lacks docker. CI\'s `docker-worker-build` job is the acceptance gate.\n9. If any local check fails, apply the **partial-bundle fallback** before giving up — one harness must never block the others:\n **BASELINE FIRST — do this before ANY isolation work.** A red gate does NOT mean the bumps broke anything. Re-run the EXACT failing command on a pristine `origin/main` worktree with zero bumps applied (`git worktree add /tmp/hb-baseline origin/main && cd /tmp/hb-baseline && bun install --frozen-lockfile`) and compare. If the SAME checks fail with the SAME assertions and the same pass/skip/fail totals, the failure is **PRE-EXISTING and unrelated to the bumps** ⇒ it does NOT block this PR, and you must NOT attempt isolation for it. Proceed to step 10, open the PR, and add a `## Pre-existing failures (also fail on origin/main)` section quoting the verbatim error plus both totals (baseline vs branch) so the reviewer can see they match. Only a failure that is RED on your branch and GREEN on baseline was caused by a bump — apply a–d below to that failure ONLY. A gate that is red on origin/main is never a reason to skip the weekly bump.\n a. Isolate which harness\'s bump caused it. The error usually names the package; if not, revert bumps one at a time until the step-8 gate passes.\n b. Revert ONLY that harness — its `Dockerfile.worker` ARG **and** its `package.json` pins (respect the family/sync requirements in the table above) — then re-run `bun install` and the FULL step-8 gate.\n c. Gate green ⇒ open the PR with the remaining harnesses and add a `## Held back` section naming the excluded harness, current → attempted version, and the VERBATIM error. Name it in your `store-progress` output too.\n d. Gate still red with that harness reverted, OR the failure cannot be isolated to one harness ⇒ do NOT open a PR; report via `store-progress` with `failureReason`.\n Migrating an upstream API break (a removed option, a renamed export, a moved type) is still OUT OF SCOPE for this routine — hold that harness back per (c) rather than changing code here.\n10. Push the branch and open a PR:\n - Title: `chore(docker): bump harnesses (weekly YYYY-MM-DD)` — or list the bumps, e.g. `chore(docker): bump claude-code, pi, opencode (weekly YYYY-MM-DD)`.\n - Body: include a table of current → new versions for every harness bumped, link to each upstream changelog (e.g. https://github.com/anthropics/claude-code/releases/tag/v<X.Y.Z>), and the local verification output (or "all green").\n - Add `{{PR_REVIEWER}}` as a reviewer.\n - DO NOT merge — {{PR_REVIEWER}} reviews and merges.\n11. Verify CI on the PR — wait for the merge-gate workflow to start, confirm at least the `docker-worker-build` job is queued/passing. If CI fails, comment on the PR with the failure log and leave the branch for human review.\n\n## Constraints\n\n- **ONE bundled PR per run.** Bump every outdated harness in the same PR — do not stagger one-per-run. The ONLY permitted exclusion is a harness held back by the step-9 partial-bundle fallback, which must be declared in the PR body.\n- **No `--no-verify`, no force pushes.**\n- If a harness has a major-version bump (e.g. 2.x → 3.x), still bundle it but flag clearly in the PR description that this is a major bump and may need extra review.\n- Pi family-pin: all three pi packages MUST be the same version. If they drift in the lockfile, fix the drift in the same PR.\n\n## Sibling-schedule coordination\nThis schedule has a sibling — `weekly-harness-upgrade-check-wed` (Wednesday 05:00 BCN). If a sibling-opened PR is OPEN and `< 48h` old, step 4 skips. This is the dedup gate. Don\'t change branch-naming heuristics in a way that breaks the dedup.\n\n## Output\n\n`store-progress` with `status: "completed"` and `output` containing:\n- The PR URL (if one was opened) + the table of harnesses bumped, OR\n- "No-op: all harnesses up to date as of YYYY-MM-DD" with the version table, OR\n- "Skipped: sibling harness upgrade PR already open" with the existing PR URL.\n';
17383
+ var content_default66 = '# Weekly Harness Upgrade Check\n\nThis is a topology-preserving, anonymized port of the live Sunday schedule. It keeps its bundle, deduplication, baseline, partial-fallback, and CI acceptance behavior.\n\n```json\n{"cron":"0 16 * * 0","timezone":"UTC","agentRole":"lead","enabled":true}\n```\n\n**Weekly Harness Upgrade — self-hosted repository Dockerfile.worker**\n\nRepo: `{{REPO_URL}}` (working dir: `/workspace/repo`)\nFile: `Dockerfile.worker`\n\nThe worker image pins these harnesses via `ARG`. Each week, check upstream for new versions and open ONE PR bundling ALL outdated harness bumps together ({{PR_REVIEWER}}\'s preference — bump ALL in one PR per run, do NOT stagger one-per-run).\n\n| ARG | Source | Sync requirement |\n|---|---|---|\n| `CLAUDE_CODE_VERSION` | npm `@anthropic-ai/claude-code` | none |\n| `PI_CODING_AGENT_VERSION` | npm `@earendil-works/pi-coding-agent` | MUST match `@earendil-works/pi-agent-core`, `@earendil-works/pi-ai`, and `@earendil-works/pi-coding-agent` in `package.json` (family-pin, all same version) — bump all together |\n| `CODEX_VERSION` | npm `@openai/codex` | MUST match direct `@openai/codex` in `package.json` (enforced by `scripts/check-codex-default-model.sh`) |\n| `OPENCODE_VERSION` | npm `@opencode/sdk` | Installs both `@opencode/cli` and `@opencode/sdk`. MUST match `@opencode/sdk` and `@opencode/plugin` in `package.json` devDependencies. OpenCode 2 ships under the `@opencode/*` scope; never take a version from `opencode-ai`, `@opencode-ai/sdk`, or the `sst/opencode` GitHub releases (still the 1.x line, which would be a downgrade) |\n\n## Steps\n\n1. `cd /workspace/repo && git fetch origin && git checkout main && git pull --ff-only`\n2. Read current pinned versions from `Dockerfile.worker` (the `ARG` lines) and from `package.json` (for the pi family + `@openai/codex` + `@opencode/sdk`).\n3. For each harness, fetch the latest version:\n - npm claude-code: `npm view @anthropic-ai/claude-code version`\n - npm pi: `npm view @earendil-works/pi-coding-agent version` (use the SAME version for `@earendil-works/pi-agent-core` and `@earendil-works/pi-ai` — they\'re a family pin)\n - npm codex: `npm view @openai/codex version`\n - npm opencode: `npm view @opencode/sdk version` (one version for `@opencode/cli`, `@opencode/sdk`, `@opencode/plugin`)\n4. Check for an existing open bundled PR — `gh pr list --search "harness upgrade in:title" --state open --repo {{REPO_URL}}`. Look at the branch prefix `harness-upgrade/`. If one is already open AND was created within the last 48h (sibling schedule may have just opened it), skip and complete with `"Skipped: sibling harness upgrade PR already open"` + the existing PR URL.\n5. Collect ALL outdated harnesses. If none are outdated, complete with output `"All harnesses up to date as of YYYY-MM-DD"` (no PR).\n6. Branch: `harness-upgrade/weekly-YYYY-MM-DD` (e.g. `harness-upgrade/weekly-2026-06-03`).\n7. Edit `Dockerfile.worker` — bump every outdated ARG. Also update `package.json`:\n - Codex: bump direct `@openai/codex` to match `CODEX_VERSION`.\n - Pi family: bump `@earendil-works/pi-agent-core`, `@earendil-works/pi-ai`, and `@earendil-works/pi-coding-agent` to the same new version as `PI_CODING_AGENT_VERSION`.\n - Opencode: bump `@opencode/sdk` and `@opencode/plugin` (devDependencies) to match `OPENCODE_VERSION`.\n Then re-run `bun install` so `bun.lock` updates.\n8. Local verification (all must pass before pushing):\n ```bash\n bun install --frozen-lockfile\n bun run lint\n bun run tsc:check\n bun test\n bash scripts/check-db-boundary.sh\n ```\n For Codex bumps: also run `bash scripts/check-codex-default-model.sh` (CI runs it too). It fails when `ARG CODEX_VERSION` differs from the direct `@openai/codex` pin in `package.json`, or when the Dockerfile\'s baseline `model = "..."` differs from `CODEX_DEFAULT_MODEL` in `src/providers/codex-models.ts`.\n Note: do NOT run `docker build -f Dockerfile.worker .` locally — the runner lacks docker. CI\'s `docker-worker-build` job is the acceptance gate.\n9. If any local check fails, apply the **partial-bundle fallback** before giving up — one harness must never block the others:\n **BASELINE FIRST — do this before ANY isolation work.** A red gate does NOT mean the bumps broke anything. Re-run the EXACT failing command on a pristine `origin/main` worktree with zero bumps applied (`git worktree add /tmp/hb-baseline origin/main && cd /tmp/hb-baseline && bun install --frozen-lockfile`) and compare. If the SAME checks fail with the SAME assertions and the same pass/skip/fail totals, the failure is **PRE-EXISTING and unrelated to the bumps** ⇒ it does NOT block this PR, and you must NOT attempt isolation for it. Proceed to step 10, open the PR, and add a `## Pre-existing failures (also fail on origin/main)` section quoting the verbatim error plus both totals (baseline vs branch) so the reviewer can see they match. Only a failure that is RED on your branch and GREEN on baseline was caused by a bump — apply a–d below to that failure ONLY. A gate that is red on origin/main is never a reason to skip the weekly bump.\n a. Isolate which harness\'s bump caused it. The error usually names the package; if not, revert bumps one at a time until the step-8 gate passes.\n b. Revert ONLY that harness — its `Dockerfile.worker` ARG **and** its `package.json` pins (respect the family/sync requirements in the table above) — then re-run `bun install` and the FULL step-8 gate.\n c. Gate green ⇒ open the PR with the remaining harnesses and add a `## Held back` section naming the excluded harness, current → attempted version, and the VERBATIM error. Name it in your `store-progress` output too.\n d. Gate still red with that harness reverted, OR the failure cannot be isolated to one harness ⇒ do NOT open a PR; report via `store-progress` with `failureReason`.\n Migrating an upstream API break (a removed option, a renamed export, a moved type) is still OUT OF SCOPE for this routine — hold that harness back per (c) rather than changing code here.\n10. Push the branch and open a PR:\n - Title: `chore(docker): bump harnesses (weekly YYYY-MM-DD)` — or list the bumps, e.g. `chore(docker): bump claude-code, pi, opencode (weekly YYYY-MM-DD)`.\n - Body: include a table of current → new versions for every harness bumped, link to each upstream changelog (e.g. https://github.com/anthropics/claude-code/releases/tag/v<X.Y.Z>), and the local verification output (or "all green").\n - Add `{{PR_REVIEWER}}` as a reviewer.\n - DO NOT merge — {{PR_REVIEWER}} reviews and merges.\n11. Verify CI on the PR — wait for the merge-gate workflow to start, confirm at least the `docker-worker-build` job is queued/passing. If CI fails, comment on the PR with the failure log and leave the branch for human review.\n\n## Constraints\n\n- **ONE bundled PR per run.** Bump every outdated harness in the same PR — do not stagger one-per-run. The ONLY permitted exclusion is a harness held back by the step-9 partial-bundle fallback, which must be declared in the PR body.\n- **No `--no-verify`, no force pushes.**\n- If a harness has a major-version bump (e.g. 2.x → 3.x), still bundle it but flag clearly in the PR description that this is a major bump and may need extra review.\n- Pi family-pin: all three pi packages MUST be the same version. If they drift in the lockfile, fix the drift in the same PR.\n\n## Sibling-schedule coordination\nThis schedule has a sibling — `weekly-harness-upgrade-check-wed` (Wednesday 05:00 BCN). If a sibling-opened PR is OPEN and `< 48h` old, step 4 skips. This is the dedup gate. Don\'t change branch-naming heuristics in a way that breaks the dedup.\n\n## Output\n\n`store-progress` with `status: "completed"` and `output` containing:\n- The PR URL (if one was opened) + the table of harnesses bumped, OR\n- "No-op: all harnesses up to date as of YYYY-MM-DD" with the version table, OR\n- "Skipped: sibling harness upgrade PR already open" with the existing PR URL.\n';
17218
17384
 
17219
17385
  // src/be/seed/schedules-seeder.ts
17220
17386
  init_db3();
@@ -17236,7 +17402,7 @@ function resolveSeededEnabled(params) {
17236
17402
  }
17237
17403
 
17238
17404
  // templates/workflows/alerts-triage/config.json
17239
- var config_default66 = `{
17405
+ var config_default67 = `{
17240
17406
  "kind": "workflow",
17241
17407
  "name": "alerts-triage",
17242
17408
  "displayName": "Alerts Triage",
@@ -17253,7 +17419,7 @@ var config_default66 = `{
17253
17419
  `;
17254
17420
 
17255
17421
  // templates/workflows/alerts-triage/content.md
17256
- var content_default66 = `# Alerts Triage
17422
+ var content_default67 = `# Alerts Triage
17257
17423
 
17258
17424
  The Slack handler emits \`slack.message\`; this workflow keeps the event-driven path and deduplicates work after the channel filter.
17259
17425
 
@@ -17273,7 +17439,7 @@ The Slack handler emits \`slack.message\`; this workflow keeps the event-driven
17273
17439
  `;
17274
17440
 
17275
17441
  // templates/workflows/autopilot/config.json
17276
- var config_default67 = `{
17442
+ var config_default68 = `{
17277
17443
  "kind": "workflow",
17278
17444
  "name": "autopilot",
17279
17445
  "displayName": "Autopilot Feature Pipeline",
@@ -17290,7 +17456,7 @@ var config_default67 = `{
17290
17456
  `;
17291
17457
 
17292
17458
  // templates/workflows/autopilot/content.md
17293
- var content_default67 = `# Autopilot Feature Pipeline
17459
+ var content_default68 = `# Autopilot Feature Pipeline
17294
17460
 
17295
17461
  Template parameter: {{REPO_URL}}
17296
17462
 
@@ -17302,7 +17468,7 @@ Use this workflow as a canonical feature delivery pipeline. Customize roles and
17302
17468
  `;
17303
17469
 
17304
17470
  // templates/workflows/claude-code-changelog-watch/config.json
17305
- var config_default68 = `{
17471
+ var config_default69 = `{
17306
17472
  "kind": "workflow",
17307
17473
  "name": "claude-code-changelog-watch",
17308
17474
  "displayName": "Claude Code Changelog Watch",
@@ -17319,10 +17485,10 @@ var config_default68 = `{
17319
17485
  `;
17320
17486
 
17321
17487
  // templates/workflows/claude-code-changelog-watch/content.md
17322
- var content_default68 = '# Claude Code Changelog Watch\n\nThis topology-preserving self-hosted port removes installation-specific identities, endpoints, and credentials while retaining the live workflow\'s nodes, edges, input mappings, guards, retries, cooldown, and triggers. Configure the declared template parameters and integrations before enabling it.\n\nPrerequisite: the `check` and `commit` nodes run the global script `claude-code-changelog-check`, which is not seeded. Author it before enabling the workflow, or every run fails at the first node.\n\n```json\n{"name":"claude-code-changelog-watch","description":"Changelog watcher with deduplication: fetch, gate on a new version, publish an in-app receipt plus any configured delivery providers, then commit the version marker.","nodes":[{"id":"check","type":"swarm-script","label":"Fetch changelog + compare vs KV","config":{"scriptName":"claude-code-changelog-check","scope":"global","args":{"mode":"check"}},"next":"gate"},{"id":"gate","type":"property-match","label":"Gate: only continue on a new version","config":{"mode":"all","conditions":[{"field":"check.result.isNew","op":"eq","value":true}]},"next":{"true":"post"}},{"id":"post","type":"agent-task","label":"Post new version to Slack","config":{"model":"sonnet","tags":["changelog","claude-code","workflow"],"priority":50,"template":"**Claude Code new version announcement**\\n\\nA new Claude Code version was detected by the claude-code-changelog-watch workflow.\\n\\nNew version: {{check.result.latestVersion}} (released {{check.result.releaseDate}}, previous known: {{check.result.lastKnown}})\\n\\nRaw release notes:\\n{{check.result.section}}\\n\\nSteps:\\n1. ONE `slack-post` to the configured Slack notification target, **max 400 chars**:\\n\\n```\\n:rocket: *Claude Code {{check.result.latestVersion}}* — <the one change that matters to us, one line>\\n<https://code.claude.com/docs/en/changelog|changelog>\\n```\\n\\nRules:\\n- **One line.** Pick the single item that affects how we run the swarm (a fix we were hitting, a flag we use, a breaking change). Not 3-5 bullets.\\n- If a second item genuinely matters, one more bullet. Never more than two.\\n- **Routine release with nothing relevant to us ⇒ still post, but the one line is just the headline feature.** Never paste the release notes.\\n- No preamble, no \\"is out!\\", no per-surface breakdown (VSCode/CLI/SDK), no closing line.\\n\\n2. Complete with output \\"Posted Claude Code {{check.result.latestVersion}} to in-app activity and configured delivery providers.\\" plus the charCount.\\n\\nDo NOT update any version state — the workflow\'s commit node handles that after you complete. Do NOT post more than once."},"next":"commit","inputs":{"check":"check"}},{"id":"commit","type":"swarm-script","label":"Commit new version to KV","config":{"scriptName":"claude-code-changelog-check","scope":"global","args":{"mode":"commit","version":"{{check.result.latestVersion}}"}},"inputs":{"check":"check"}}],"onNodeFailure":"fail"}\n```\n\n\n\n\n';
17488
+ var content_default69 = '# Claude Code Changelog Watch\n\nThis topology-preserving self-hosted port removes installation-specific identities, endpoints, and credentials while retaining the live workflow\'s nodes, edges, input mappings, guards, retries, cooldown, and triggers. Configure the declared template parameters and integrations before enabling it.\n\nPrerequisite: the `check` and `commit` nodes run the global script `claude-code-changelog-check`, which is not seeded. Author it before enabling the workflow, or every run fails at the first node.\n\n```json\n{"name":"claude-code-changelog-watch","description":"Changelog watcher with deduplication: fetch, gate on a new version, publish an in-app receipt plus any configured delivery providers, then commit the version marker.","nodes":[{"id":"check","type":"swarm-script","label":"Fetch changelog + compare vs KV","config":{"scriptName":"claude-code-changelog-check","scope":"global","args":{"mode":"check"}},"next":"gate"},{"id":"gate","type":"property-match","label":"Gate: only continue on a new version","config":{"mode":"all","conditions":[{"field":"check.result.isNew","op":"eq","value":true}]},"next":{"true":"post"}},{"id":"post","type":"agent-task","label":"Post new version to Slack","config":{"model":"sonnet","tags":["changelog","claude-code","workflow"],"priority":50,"template":"**Claude Code new version announcement**\\n\\nA new Claude Code version was detected by the claude-code-changelog-watch workflow.\\n\\nNew version: {{check.result.latestVersion}} (released {{check.result.releaseDate}}, previous known: {{check.result.lastKnown}})\\n\\nRaw release notes:\\n{{check.result.section}}\\n\\nSteps:\\n1. ONE `slack-post` to the configured Slack notification target, **max 400 chars**:\\n\\n```\\n:rocket: *Claude Code {{check.result.latestVersion}}* — <the one change that matters to us, one line>\\n<https://code.claude.com/docs/en/changelog|changelog>\\n```\\n\\nRules:\\n- **One line.** Pick the single item that affects how we run the swarm (a fix we were hitting, a flag we use, a breaking change). Not 3-5 bullets.\\n- If a second item genuinely matters, one more bullet. Never more than two.\\n- **Routine release with nothing relevant to us ⇒ still post, but the one line is just the headline feature.** Never paste the release notes.\\n- No preamble, no \\"is out!\\", no per-surface breakdown (VSCode/CLI/SDK), no closing line.\\n\\n2. Complete with output \\"Posted Claude Code {{check.result.latestVersion}} to in-app activity and configured delivery providers.\\" plus the charCount.\\n\\nDo NOT update any version state — the workflow\'s commit node handles that after you complete. Do NOT post more than once."},"next":"commit","inputs":{"check":"check"}},{"id":"commit","type":"swarm-script","label":"Commit new version to KV","config":{"scriptName":"claude-code-changelog-check","scope":"global","args":{"mode":"commit","version":"{{check.result.latestVersion}}"}},"inputs":{"check":"check"}}],"onNodeFailure":"fail"}\n```\n\n\n\n\n';
17323
17489
 
17324
17490
  // templates/workflows/competitor-radar/config.json
17325
- var config_default69 = `{
17491
+ var config_default70 = `{
17326
17492
  "kind": "workflow",
17327
17493
  "name": "competitor-radar",
17328
17494
  "displayName": "Competitor Radar",
@@ -17339,7 +17505,7 @@ var config_default69 = `{
17339
17505
  `;
17340
17506
 
17341
17507
  // templates/workflows/competitor-radar/content.md
17342
- var content_default69 = `# Competitor Radar
17508
+ var content_default70 = `# Competitor Radar
17343
17509
 
17344
17510
  This self-hosted port retains the scheduled, fixture, extraction, gap-analysis, litmus, cooldown, and bounded-report behavior. Its pinned GSC helper is embedded in the workflow, so it does not fetch executable code from Desplega infrastructure.
17345
17511
 
@@ -17349,7 +17515,7 @@ This self-hosted port retains the scheduled, fixture, extraction, gap-analysis,
17349
17515
  `;
17350
17516
 
17351
17517
  // templates/workflows/docs-site-releases/config.json
17352
- var config_default70 = `{
17518
+ var config_default71 = `{
17353
17519
  "kind": "workflow",
17354
17520
  "name": "docs-site-releases",
17355
17521
  "displayName": "Documentation Release Notes",
@@ -17366,7 +17532,7 @@ var config_default70 = `{
17366
17532
  `;
17367
17533
 
17368
17534
  // templates/workflows/docs-site-releases/content.md
17369
- var content_default70 = `# Documentation Release Notes
17535
+ var content_default71 = `# Documentation Release Notes
17370
17536
 
17371
17537
  This topology-preserving self-hosted port removes installation-specific identities, endpoints, and credentials while retaining the live workflow's nodes, edges, input mappings, guards, retries, cooldown, and triggers. Configure the declared template parameters and integrations before enabling it.
17372
17538
 
@@ -17381,7 +17547,7 @@ This topology-preserving self-hosted port removes installation-specific identiti
17381
17547
  `;
17382
17548
 
17383
17549
  // templates/workflows/gsc-topic-miner/config.json
17384
- var config_default71 = `{
17550
+ var config_default72 = `{
17385
17551
  "kind": "workflow",
17386
17552
  "name": "gsc-topic-miner",
17387
17553
  "displayName": "Search Topic Miner",
@@ -17398,7 +17564,7 @@ var config_default71 = `{
17398
17564
  `;
17399
17565
 
17400
17566
  // templates/workflows/gsc-topic-miner/content.md
17401
- var content_default71 = `# Search Topic Miner
17567
+ var content_default72 = `# Search Topic Miner
17402
17568
 
17403
17569
  This template uses only the configured GSC and agent-fs integrations. The deferred seeder creates the weekly schedule binding; no installation-specific schedule ID is shipped.
17404
17570
 
@@ -17408,7 +17574,7 @@ This template uses only the configured GSC and agent-fs integrations. The deferr
17408
17574
  `;
17409
17575
 
17410
17576
  // templates/workflows/linear-drain-loop/config.json
17411
- var config_default72 = `{
17577
+ var config_default73 = `{
17412
17578
  "kind": "workflow",
17413
17579
  "name": "linear-drain-loop",
17414
17580
  "displayName": "Linear Drain Loop",
@@ -17430,7 +17596,7 @@ var config_default72 = `{
17430
17596
  `;
17431
17597
 
17432
17598
  // templates/workflows/linear-drain-loop/content.md
17433
- var content_default72 = `# Linear Drain Loop
17599
+ var content_default73 = `# Linear Drain Loop
17434
17600
 
17435
17601
  Template parameter: {{LINEAR_PROJECT_ID}}
17436
17602
 
@@ -17475,7 +17641,7 @@ Blocked and ambiguous items are explicitly left alone — the dispatch node surf
17475
17641
  `;
17476
17642
 
17477
17643
  // templates/workflows/llm-safe-release-context/config.json
17478
- var config_default73 = `{
17644
+ var config_default74 = `{
17479
17645
  "kind": "workflow",
17480
17646
  "name": "llm-safe-release-context",
17481
17647
  "displayName": "LLM-Safe Release Context",
@@ -17492,7 +17658,7 @@ var config_default73 = `{
17492
17658
  `;
17493
17659
 
17494
17660
  // templates/workflows/llm-safe-release-context/content.md
17495
- var content_default73 = `# LLM-Safe Release Context
17661
+ var content_default74 = `# LLM-Safe Release Context
17496
17662
 
17497
17663
  Template parameters: {{ORG_ID}}, {{REPO_URL}}
17498
17664
 
@@ -17566,7 +17732,7 @@ This avoids the common failure mode where a large \`context.json\` fills the mod
17566
17732
  `;
17567
17733
 
17568
17734
  // templates/workflows/pr-review-status-sweep/config.json
17569
- var config_default74 = `{
17735
+ var config_default75 = `{
17570
17736
  "kind": "workflow",
17571
17737
  "name": "pr-review-status-sweep",
17572
17738
  "displayName": "PR Review Status Sweep",
@@ -17583,7 +17749,7 @@ var config_default74 = `{
17583
17749
  `;
17584
17750
 
17585
17751
  // templates/workflows/pr-review-status-sweep/content.md
17586
- var content_default74 = `# PR Review Status Sweep
17752
+ var content_default75 = `# PR Review Status Sweep
17587
17753
 
17588
17754
  This topology-preserving self-hosted port removes installation-specific identities, endpoints, and credentials while retaining the live workflow's nodes, edges, input mappings, guards, retries, cooldown, and triggers. Configure the declared template parameters and integrations before enabling it.
17589
17755
 
@@ -17598,7 +17764,7 @@ Prerequisite: the \`sweep\` node runs the agent-scoped script \`pr-review-status
17598
17764
  `;
17599
17765
 
17600
17766
  // templates/workflows/ralph-loop/config.json
17601
- var config_default75 = `{
17767
+ var config_default76 = `{
17602
17768
  "kind": "workflow",
17603
17769
  "name": "ralph-loop",
17604
17770
  "displayName": "Iterative Review Loop",
@@ -17615,7 +17781,7 @@ var config_default75 = `{
17615
17781
  `;
17616
17782
 
17617
17783
  // templates/workflows/ralph-loop/content.md
17618
- var content_default75 = `# Iterative Review Loop
17784
+ var content_default76 = `# Iterative Review Loop
17619
17785
 
17620
17786
  Template parameter: {{REPO_URL}}
17621
17787
 
@@ -17666,19 +17832,19 @@ The \`maxIterations\` parameter is declarative: the reviewer signals PASS when d
17666
17832
  init_db3();
17667
17833
  var asText2 = (value) => value;
17668
17834
  var BUILT_IN_WORKFLOW_SOURCES = [
17669
- { config: asText2(config_default66), content: asText2(content_default66) },
17670
17835
  { config: asText2(config_default67), content: asText2(content_default67) },
17836
+ { config: asText2(config_default68), content: asText2(content_default68) },
17671
17837
  {
17672
- config: asText2(config_default68),
17673
- content: asText2(content_default68)
17838
+ config: asText2(config_default69),
17839
+ content: asText2(content_default69)
17674
17840
  },
17675
- { config: asText2(config_default69), content: asText2(content_default69) },
17676
17841
  { config: asText2(config_default70), content: asText2(content_default70) },
17677
17842
  { config: asText2(config_default71), content: asText2(content_default71) },
17678
17843
  { config: asText2(config_default72), content: asText2(content_default72) },
17679
17844
  { config: asText2(config_default73), content: asText2(content_default73) },
17680
17845
  { config: asText2(config_default74), content: asText2(content_default74) },
17681
- { config: asText2(config_default75), content: asText2(content_default75) }
17846
+ { config: asText2(config_default75), content: asText2(content_default75) },
17847
+ { config: asText2(config_default76), content: asText2(content_default76) }
17682
17848
  ];
17683
17849
  function sortJson(value) {
17684
17850
  if (Array.isArray(value))
@@ -17794,34 +17960,34 @@ var workflowsSeeder = createWorkflowsSeeder();
17794
17960
  // src/be/seed/schedules-seeder.ts
17795
17961
  var asText3 = (value) => value;
17796
17962
  var BUILT_IN_SCHEDULE_SOURCES = [
17797
- { config: asText3(config_default55), content: asText3(content_default55) },
17963
+ { config: asText3(config_default56), content: asText3(content_default56) },
17798
17964
  {
17799
- config: asText3(config_default56),
17800
- content: asText3(content_default56)
17965
+ config: asText3(config_default57),
17966
+ content: asText3(content_default57)
17801
17967
  },
17802
- { config: asText3(config_default57), content: asText3(content_default57) },
17803
17968
  { config: asText3(config_default58), content: asText3(content_default58) },
17804
- {
17805
- config: asText3(config_default59),
17806
- content: asText3(content_default59)
17807
- },
17969
+ { config: asText3(config_default59), content: asText3(content_default59) },
17808
17970
  {
17809
17971
  config: asText3(config_default60),
17810
17972
  content: asText3(content_default60)
17811
17973
  },
17812
- { config: asText3(config_default61), content: asText3(content_default61) },
17813
17974
  {
17814
- config: asText3(config_default62),
17815
- content: asText3(content_default62)
17975
+ config: asText3(config_default61),
17976
+ content: asText3(content_default61)
17816
17977
  },
17978
+ { config: asText3(config_default62), content: asText3(content_default62) },
17817
17979
  {
17818
17980
  config: asText3(config_default63),
17819
17981
  content: asText3(content_default63)
17820
17982
  },
17821
- { config: asText3(config_default64), content: asText3(content_default64) },
17822
17983
  {
17823
- config: asText3(config_default65),
17824
- content: asText3(content_default65)
17984
+ config: asText3(config_default64),
17985
+ content: asText3(content_default64)
17986
+ },
17987
+ { config: asText3(config_default65), content: asText3(content_default65) },
17988
+ {
17989
+ config: asText3(config_default66),
17990
+ content: asText3(content_default66)
17825
17991
  }
17826
17992
  ];
17827
17993
  function parseScheduleSource(source) {