@desplega.ai/agent-swarm 2.6.0 → 2.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (213) hide show
  1. package/README.md +2 -0
  2. package/dist/{acp-adapter-dgfakfpw.js → acp-adapter-ma1js5n7.js} +6 -6
  3. package/dist/{actions-fbqma8aa.js → actions-1vhmtvg9.js} +18 -18
  4. package/dist/{amp-adapter-en0jy6hs.js → amp-adapter-sxqqvmdk.js} +3 -3
  5. package/dist/{app-k8a5cgpp.js → app-mwx1d5a9.js} +3 -3
  6. package/dist/{assistant-a16433gr.js → assistant-yx1p6g82.js} +20 -20
  7. package/dist/{boot-reembed-f4nn561n.js → boot-reembed-5h37a2c2.js} +1 -1
  8. package/dist/{boot-reembed-6c1sjfnr.js → boot-reembed-7h78vmvv.js} +2 -1
  9. package/dist/{boot-scrub-sweep-d4w9gajf.js → boot-scrub-sweep-8mawd4gw.js} +3 -3
  10. package/dist/{boot-seeds-9bmkspyw.js → boot-seeds-ca84dhnn.js} +4 -4
  11. package/dist/{claude-adapter-nys1kjxa.js → claude-adapter-wqt4hfkq.js} +7 -7
  12. package/dist/{claude-managed-adapter-55207973.js → claude-managed-adapter-6fjqtr2z.js} +2 -2
  13. package/dist/{claude-managed-setup-3cm35gey.js → claude-managed-setup-rqv98sea.js} +2 -2
  14. package/dist/{claude-sdk-session-nw5yd8cp.js → claude-sdk-session-f29f3b2x.js} +7 -7
  15. package/dist/{cli-sxgtf5fw.js → cli-07q03xm2.js} +1 -1
  16. package/dist/{cli-k21gx5ht.js → cli-1hhbzkbb.js} +6 -6
  17. package/dist/{cli-v49fkghp.js → cli-1m9x8dr5.js} +1 -1
  18. package/dist/{cli-24j1jeeb.js → cli-2pvzmas1.js} +3 -3
  19. package/dist/{cli-w2656ka1.js → cli-2y7v133v.js} +7 -7
  20. package/dist/{cli-g8ka5j4j.js → cli-48gxjmcz.js} +94 -36
  21. package/dist/{cli-2sjhpsns.js → cli-54sj64fc.js} +1 -1
  22. package/dist/{cli-aj8djyqt.js → cli-60sty27p.js} +2 -2
  23. package/dist/{cli-4hxrf0p4.js → cli-6a9qfa8b.js} +308 -47
  24. package/dist/{cli-n7asmce6.js → cli-6mgdba42.js} +3 -3
  25. package/dist/{cli-gf95q3bm.js → cli-6srv653c.js} +3 -3
  26. package/dist/{cli-9abdgn5t.js → cli-86ehn4s5.js} +3 -3
  27. package/dist/{cli-bqztfyve.js → cli-8mbc9za9.js} +1 -1
  28. package/dist/{cli-a2rr0fmg.js → cli-8wmj18cz.js} +1 -1
  29. package/dist/{cli-c2habvsf.js → cli-9gsm2rzp.js} +8 -8
  30. package/dist/{cli-4rf0f5vg.js → cli-9pshx6rd.js} +4 -2
  31. package/dist/{cli-abkm71vr.js → cli-a6ds2epe.js} +1 -1
  32. package/dist/{cli-esakngh8.js → cli-a89zdqz9.js} +1 -1
  33. package/dist/{cli-3ndmpxxv.js → cli-ay40dnj3.js} +2 -2
  34. package/dist/{cli-kf4jree9.js → cli-aypd09nf.js} +1 -1
  35. package/dist/{cli-6y51ryva.js → cli-b3yzyc57.js} +1 -1
  36. package/dist/{cli-ag2yrnt5.js → cli-c668vvcf.js} +2 -2
  37. package/dist/{cli-5sckpqcx.js → cli-d20qvpr2.js} +1 -1
  38. package/dist/{cli-a34pr3w1.js → cli-e1595bgx.js} +2 -2
  39. package/dist/{cli-m70bajzr.js → cli-f12mr20z.js} +1 -1
  40. package/dist/{cli-dqygeeh5.js → cli-f1e0ptjj.js} +10 -1
  41. package/dist/{cli-mvjz5an3.js → cli-f4dbh7a5.js} +7 -7
  42. package/dist/{cli-az25fn5f.js → cli-gsfk58nw.js} +2 -2
  43. package/dist/{cli-1tem6ns9.js → cli-gt4h8cxw.js} +3 -2
  44. package/dist/{cli-cz37jqss.js → cli-h5jeg46p.js} +2 -2
  45. package/dist/{cli-emhjcj2y.js → cli-he9gbdx0.js} +60 -10
  46. package/dist/{cli-3fwqy71j.js → cli-j0ppywdr.js} +38 -31
  47. package/dist/{cli-5rj83bam.js → cli-j3y0x2n4.js} +34 -33
  48. package/dist/{cli-3gfvmzht.js → cli-j9bpmykh.js} +73 -25
  49. package/dist/{cli-m5a9m0ak.js → cli-kv7sbc2c.js} +3 -3
  50. package/dist/{cli-g20jjwt4.js → cli-m30k9777.js} +12 -12
  51. package/dist/{cli-683y0b3a.js → cli-m5e802r7.js} +2 -2
  52. package/dist/{cli-nn6vx2mq.js → cli-ptfq202x.js} +5 -3
  53. package/dist/{cli-d2dpf95n.js → cli-qj442fws.js} +1 -1
  54. package/dist/{cli-03gg9pd1.js → cli-rd5m70gj.js} +4 -4
  55. package/dist/{cli-gnsb1zxa.js → cli-s09j9vp5.js} +1 -1
  56. package/dist/{cli-zqne1qcj.js → cli-s0mgx214.js} +2 -2
  57. package/dist/{cli-sqma6vw1.js → cli-sgqm2582.js} +5 -5
  58. package/dist/{cli-nq677csy.js → cli-sjctjr48.js} +1 -1
  59. package/dist/{cli-3aqd4jaa.js → cli-twctnkng.js} +3 -3
  60. package/dist/{cli-j6rktc91.js → cli-v6shg7na.js} +1 -1
  61. package/dist/{cli-7enjwya9.js → cli-vz78s5wm.js} +1 -1
  62. package/dist/{cli-art7c1zh.js → cli-wqr7cea4.js} +4 -4
  63. package/dist/{cli-hfeb68z4.js → cli-x37r7qwf.js} +11 -3
  64. package/dist/{cli-ffvsj2qw.js → cli-yd2nreqw.js} +2 -2
  65. package/dist/{cli-ca6banwz.js → cli-ymjpkxgn.js} +6 -6
  66. package/dist/{cli-mtnj4fwa.js → cli-yxbsmx56.js} +5 -5
  67. package/dist/cli.js +18 -16
  68. package/dist/{codex-adapter-d95q4qsn.js → codex-adapter-zk59x2zh.js} +5 -5
  69. package/dist/{codex-hook-brpnycn5.js → codex-hook-xyjhvxwd.js} +1 -1
  70. package/dist/{codex-session-runner-gdwd8h0c.js → codex-session-runner-kh6s4j3n.js} +5 -5
  71. package/dist/{commands-jqmgk54b.js → commands-68et1qv2.js} +2 -2
  72. package/dist/{controller-z3jq589f.js → controller-fyrbnzg4.js} +2 -2
  73. package/dist/{controllers-connect-r2za39ef.js → controllers-connect-nep9h2xv.js} +19 -19
  74. package/dist/{cursor-adapter-4mr4jgkw.js → cursor-adapter-yss3pg7t.js} +1 -1
  75. package/dist/{db-w36wwb5g.js → db-28gjyvxj.js} +2 -2
  76. package/dist/{db-ppv2tze7.js → db-8ftwvzba.js} +3 -3
  77. package/dist/{dispatcher-pv5h77vf.js → dispatcher-hayexmkr.js} +17 -17
  78. package/dist/{dsh-adapter-d4pdpb3r.js → dsh-adapter-46wawff9.js} +1 -1
  79. package/dist/{easter-egg-3d-4sp4dvmc.js → easter-egg-3d-8d1e0h4m.js} +1 -1
  80. package/dist/{execute-jev839y1.js → execute-cjrfxfnm.js} +1 -1
  81. package/dist/{external-channel-y6nkzhnn.js → external-channel-xbmxcg09.js} +2 -2
  82. package/dist/{grok-adapter-t08b9ntm.js → grok-adapter-ag4wks2a.js} +7 -7
  83. package/dist/handlers-tzmevqb5.js +41 -0
  84. package/dist/{heartbeat-vn31xwdk.js → heartbeat-psfvcgwp.js} +20 -20
  85. package/dist/{hook-6d0zbvvt.js → hook-8pz04697.js} +5 -5
  86. package/dist/{hook-cpjs8q51.js → hook-cyq4mryn.js} +6 -6
  87. package/dist/{http-9c6medda.js → http-haj1nd6k.js} +109 -114
  88. package/dist/{index-qhjf2htm.js → index-jwt2bj6f.js} +261 -96
  89. package/dist/{index-g6k9tctj.js → index-q52f47pe.js} +1 -1
  90. package/dist/{index-pkma1yf8.js → index-syvhnvtw.js} +1 -1
  91. package/dist/{index-yqgbfgaj.js → index-y1ajx04a.js} +20 -20
  92. package/dist/{index-k0yt1tvq.js → index-z5h22pes.js} +17 -17
  93. package/dist/{index-38t35h0n.js → index-zyq8ct52.js} +17 -17
  94. package/dist/{keepalive-em0117bp.js → keepalive-xdvsamvj.js} +3 -3
  95. package/dist/{lead-23e7z59t.js → lead-hqg57kdp.js} +35 -35
  96. package/dist/{maintenance-kbme3qy9.js → maintenance-4y2xzh3a.js} +1 -1
  97. package/dist/{oauth-refresh-sweep-xysj4yse.js → oauth-refresh-sweep-jd4r7zbs.js} +8 -3
  98. package/dist/{onboard-p6q0vz97.js → onboard-18447q9q.js} +5 -5
  99. package/dist/{opencode-adapter-esv3k9yn.js → opencode-adapter-26b2frdf.js} +5 -5
  100. package/dist/{otel-impl-54qhqh1z.js → otel-impl-f9tgr8yw.js} +1 -1
  101. package/dist/{pi-mono-adapter-mymbwhj0.js → pi-mono-adapter-qn6qbga1.js} +33 -12
  102. package/dist/{pricing-refresh-yb75wv33.js → pricing-refresh-dw2tgb53.js} +3 -3
  103. package/dist/{rbac-roles-1vp2mw4p.js → rbac-roles-aygm2760.js} +2 -2
  104. package/dist/{rbac-roles-dexhc9x8.js → rbac-roles-s4nwj2m3.js} +1 -1
  105. package/dist/{render-v2-tjay5hhf.js → render-v2-yfvdfr0x.js} +3 -3
  106. package/dist/{resume-8ayf37g5.js → resume-1bmvjbf3.js} +7 -7
  107. package/dist/{runtime-hqe5cqcd.js → runtime-f7tpzedy.js} +1 -1
  108. package/dist/{session-access-fdhp987s.js → session-access-r5garej6.js} +4 -4
  109. package/dist/{session-source-backfill-qgtc86z1.js → session-source-backfill-424wzv0r.js} +2 -2
  110. package/dist/{setup-4rrmqcq3.js → setup-8tygvxkq.js} +1 -1
  111. package/dist/{virtual-modules-52km00d6.js → virtual-modules-xsw323b3.js} +2 -2
  112. package/dist/{work-objects-p28fgd70.js → work-objects-ggnghpgf.js} +20 -20
  113. package/dist/{worker-e3w7vye1.js → worker-sqjd1nqf.js} +35 -35
  114. package/openapi.json +69 -1
  115. package/package.json +5 -3
  116. package/src/be/automation-preflight.ts +2 -0
  117. package/src/be/db/api-keys.ts +9 -0
  118. package/src/be/db/workflow-runs.ts +36 -5
  119. package/src/be/db.ts +80 -22
  120. package/src/be/memory/task-learning.ts +155 -0
  121. package/src/be/migrations/245_script_executor.sql +3 -0
  122. package/src/be/oauth-refresh-sweep.ts +2 -1
  123. package/src/be/scripts/boot-reembed.ts +2 -0
  124. package/src/be/scripts/db.ts +14 -4
  125. package/src/be/scripts/embeddings.ts +2 -0
  126. package/src/be/scripts/run-saved.ts +1 -0
  127. package/src/be/scripts/typecheck.ts +9 -3
  128. package/src/be/seed-skills/index.ts +7 -0
  129. package/src/commands/onboard/compose-generator.ts +5 -3
  130. package/src/commands/provider-credentials.ts +2 -1
  131. package/src/heartbeat/heartbeat.ts +14 -1
  132. package/src/heartbeat/script-runner-probe.ts +47 -0
  133. package/src/http/api-keys.ts +24 -9
  134. package/src/http/idempotency-key.ts +1 -1
  135. package/src/http/index.ts +3 -3
  136. package/src/http/pages-public.ts +38 -5
  137. package/src/http/scripts.ts +27 -0
  138. package/src/http/workflows.ts +10 -0
  139. package/src/http/x.ts +5 -0
  140. package/src/prompts/base-prompt.ts +21 -1
  141. package/src/prompts/session-templates.ts +17 -3
  142. package/src/providers/amp-adapter.ts +1 -1
  143. package/src/providers/dsh-adapter.ts +1 -1
  144. package/src/providers/pi-mono-adapter.ts +41 -11
  145. package/src/scheduler/scheduler.ts +2 -1
  146. package/src/scripts-runtime/eval-harness.ts +8 -1
  147. package/src/scripts-runtime/executors/native.ts +22 -16
  148. package/src/scripts-runtime/executors/quickjs-prelude.ts +103 -1
  149. package/src/scripts-runtime/executors/quickjs-runner.ts +2 -1
  150. package/src/scripts-runtime/executors/quickjs.ts +7 -0
  151. package/src/scripts-runtime/executors/registry.ts +32 -0
  152. package/src/scripts-runtime/executors/types.ts +7 -0
  153. package/src/scripts-runtime/host-validated-args.ts +133 -0
  154. package/src/scripts-runtime/loader.ts +30 -3
  155. package/src/scripts-runtime/swarm-sdk.ts +9 -2
  156. package/src/scripts-runtime/types/stdlib.d.ts +9 -1
  157. package/src/scripts-runtime/types/swarm-sdk.d.ts +9 -1
  158. package/src/tests/api-key-status-by-suffix.test.ts +242 -0
  159. package/src/tests/base-prompt.test.ts +70 -2
  160. package/src/tests/community-linear-delivery-loop.test.ts +2099 -0
  161. package/src/tests/credential-check.test.ts +4 -2
  162. package/src/tests/docs-index.test.ts +135 -0
  163. package/src/tests/dsh-adapter.test.ts +1 -1
  164. package/src/tests/fetch-resolved-env.test.ts +16 -2
  165. package/src/tests/heartbeat-checklist.test.ts +89 -0
  166. package/src/tests/heartbeat-script-runner-probe.test.ts +83 -0
  167. package/src/tests/oauth-refresh-sweep.test.ts +34 -1
  168. package/src/tests/onboard-compose.test.ts +20 -0
  169. package/src/tests/opencode-adapter.test.ts +2 -1
  170. package/src/tests/pages-frame-ancestors.test.ts +162 -0
  171. package/src/tests/pi-codemode.test.ts +2 -1
  172. package/src/tests/pi-mono-adapter.test.ts +54 -0
  173. package/src/tests/pi-native-mcp.test.ts +13 -1
  174. package/src/tests/pi-tool-exposure.test.ts +8 -8
  175. package/src/tests/probe-tool-schema-tokens.test.ts +144 -0
  176. package/src/tests/prompt-template-session.test.ts +4 -3
  177. package/src/tests/request-composition-derive.test.ts +329 -0
  178. package/src/tests/script-connections.test.ts +2 -0
  179. package/src/tests/script-executor-conformance.test.ts +36 -1
  180. package/src/tests/script-executor-quickjs-pool.test.ts +50 -0
  181. package/src/tests/script-executor-quickjs.test.ts +140 -0
  182. package/src/tests/script-host-validated-args-native.test.ts +196 -0
  183. package/src/tests/script-per-script-executor.test.ts +415 -0
  184. package/src/tests/scripts-external-api.test.ts +45 -0
  185. package/src/tests/sdk-allowlist.test.ts +3 -2
  186. package/src/tests/self-improvement.test.ts +4 -4
  187. package/src/tests/store-progress-learning.test.ts +288 -0
  188. package/src/tests/ui-logs-parser.test.ts +180 -0
  189. package/src/tests/workflow-engine-v2.test.ts +116 -1
  190. package/src/tests/workflow-mcp-trigger-schema.test.ts +209 -0
  191. package/src/tests/workflow-run-finished-event.test.ts +263 -0
  192. package/src/tests/workflow-swarm-script.test.ts +34 -0
  193. package/src/tools/script-common.ts +1 -0
  194. package/src/tools/script-run.ts +7 -0
  195. package/src/tools/script-upsert.ts +7 -0
  196. package/src/tools/store-progress.ts +67 -1
  197. package/src/tools/workflows/trigger-workflow.ts +104 -10
  198. package/src/types.ts +12 -1
  199. package/src/utils/credentials.ts +5 -2
  200. package/src/workflows/engine.ts +18 -16
  201. package/src/workflows/executors/swarm-script.ts +5 -0
  202. package/src/workflows/foreach-driver.ts +5 -11
  203. package/src/workflows/node-timeout.ts +30 -0
  204. package/templates/community/linear-delivery-loop/PLAYBOOK.md +323 -0
  205. package/templates/community/linear-delivery-loop/README.md +38 -0
  206. package/templates/community/linear-delivery-loop/config.example.json +31 -0
  207. package/templates/community/linear-delivery-loop/lead-prompt.md +34 -0
  208. package/templates/community/linear-delivery-loop/schedule.json +10 -0
  209. package/templates/community/linear-delivery-loop/scripts/linear-delivery-setup.ts +148 -0
  210. package/templates/community/linear-delivery-loop/scripts/linear-delivery-tick.ts +1781 -0
  211. package/templates/skills/swarm-docs/config.json +14 -0
  212. package/templates/skills/swarm-docs/content.md +144 -0
  213. package/dist/handlers-eqsnmv95.js +0 -41
@@ -5,7 +5,7 @@ import {
5
5
  extractArgsJsonSchema,
6
6
  typecheckScript,
7
7
  parseSkillContent
8
- } from "./cli-3gfvmzht.js";
8
+ } from "./cli-j9bpmykh.js";
9
9
  import {
10
10
  getDbClient2,
11
11
  computeContentHash2,
@@ -26,19 +26,19 @@ import {
26
26
  deleteSkill2,
27
27
  getSkillByName2,
28
28
  init_db3
29
- } from "./cli-g8ka5j4j.js";
30
- import"./cli-kf4jree9.js";
29
+ } from "./cli-48gxjmcz.js";
30
+ import"./cli-aypd09nf.js";
31
31
  import"./cli-3ggwdtb0.js";
32
32
  import {
33
33
  agentFsProvisionSeeder
34
- } from "./cli-6y51ryva.js";
34
+ } from "./cli-b3yzyc57.js";
35
35
  import"./cli-e8xyjvfc.js";
36
36
  import {
37
37
  validateDefinition
38
- } from "./cli-3fwqy71j.js";
39
- import"./cli-g20jjwt4.js";
40
- import"./cli-gnsb1zxa.js";
41
- import"./cli-v49fkghp.js";
38
+ } from "./cli-j0ppywdr.js";
39
+ import"./cli-m30k9777.js";
40
+ import"./cli-s09j9vp5.js";
41
+ import"./cli-1m9x8dr5.js";
42
42
  import"./cli-2nf3b08t.js";
43
43
  import"./cli-kvzgak7c.js";
44
44
  import"./cli-445c1vp7.js";
@@ -48,7 +48,7 @@ import {
48
48
  } from "./cli-691vz9mk.js";
49
49
  import"./cli-13p25grh.js";
50
50
  import"./cli-0adyhvq2.js";
51
- import"./cli-esakngh8.js";
51
+ import"./cli-a89zdqz9.js";
52
52
  import"./cli-rycdaj0a.js";
53
53
  import {
54
54
  __toESM
@@ -11056,8 +11056,172 @@ var config_default42 = `{
11056
11056
  // templates/skills/step-running/content.md
11057
11057
  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
11058
 
11059
- // templates/skills/swarm-extensions/config.json
11059
+ // templates/skills/swarm-docs/config.json
11060
11060
  var config_default43 = `{
11061
+ "kind": "skill",
11062
+ "name": "swarm-docs",
11063
+ "displayName": "Swarm Docs",
11064
+ "slug": "swarm-docs",
11065
+ "title": "Swarm Docs",
11066
+ "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.",
11067
+ "version": "1.0.0",
11068
+ "category": "skills",
11069
+ "placeholders": [],
11070
+ "runAllSeedersCandidate": true,
11071
+ "systemDefault": true,
11072
+ "tags": ["docs", "playbooks", "guides", "lead"]
11073
+ }
11074
+ `;
11075
+
11076
+ // templates/skills/swarm-docs/content.md
11077
+ var content_default43 = `# Swarm docs
11078
+
11079
+ 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.
11080
+
11081
+ ## When to load this skill
11082
+
11083
+ 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.
11084
+
11085
+ ## Offer a page (lead)
11086
+
11087
+ Follow these rules when you reply to a person.
11088
+
11089
+ 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.
11090
+ 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.
11091
+ 3. Make at most one offer per reply. Offer a page at most once per thread, and never again after a no.
11092
+ 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.
11093
+ 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.
11094
+ 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.
11095
+
11096
+ Entries marked "reference" are never offered. Read them when a task touches their topic.
11097
+
11098
+ ## Read a page (any agent)
11099
+
11100
+ 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.
11101
+
11102
+ - A 404 means the slug changed after this release. Fetch \`https://docs.agent-swarm.dev/llms.txt\` and find the page by title.
11103
+ - 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.
11104
+ - 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.
11105
+
11106
+ <!-- docs-index:start -->
11107
+ <!-- Generated by \`bun run build:docs-index\` from the docs frontmatter. Do not edit by hand. -->
11108
+
11109
+ ## Playbooks
11110
+
11111
+ - [Playbooks](https://docs.agent-swarm.dev/docs/playbooks). Reference.
11112
+ - [The rulebook our lead agent wrote for itself](https://docs.agent-swarm.dev/docs/playbooks/lead-agent-rulebook). Reference.
11113
+ - [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.
11114
+ - [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.
11115
+ - [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.
11116
+ - [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.
11117
+ - [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.
11118
+ - [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.
11119
+ - [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\`.
11120
+ - [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\`.
11121
+ - [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.
11122
+ - [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.
11123
+ - [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\`.
11124
+ - [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.
11125
+ - [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.
11126
+ - [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.
11127
+ - [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\`.
11128
+ - [Hot Patterns](https://docs.agent-swarm.dev/docs/playbooks/patterns). Reference.
11129
+ - [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.
11130
+ - [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.
11131
+ - [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.
11132
+ - [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.
11133
+ - [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.
11134
+
11135
+ ## Guides
11136
+
11137
+ - [Deployment Guide](https://docs.agent-swarm.dev/docs/guides/deployment). When: Someone wants to run Agent Swarm on their own server with Docker Compose.
11138
+ - [Kubernetes and Helm](https://docs.agent-swarm.dev/docs/guides/kubernetes). When: Someone wants to install Agent Swarm on Kubernetes.
11139
+ - [Rootless Podman](https://docs.agent-swarm.dev/docs/guides/podman-rootless). When: Someone wants to run Agent Swarm under rootless Podman.
11140
+ - [Published Artifacts](https://docs.agent-swarm.dev/docs/guides/published-artifacts). Reference.
11141
+ - [Asset Namespaces](https://docs.agent-swarm.dev/docs/guides/asset-namespaces). Reference.
11142
+ - [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.
11143
+ - [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.
11144
+ - [E2B Provider Smoke Tests](https://docs.agent-swarm.dev/docs/guides/e2b-provider-smoke-tests). Reference.
11145
+ - [Evals Harness](https://docs.agent-swarm.dev/docs/guides/evals-harness). Reference.
11146
+ - [Personalization & Status](https://docs.agent-swarm.dev/docs/guides/personalization). Reference.
11147
+ - [Secrets Encryption](https://docs.agent-swarm.dev/docs/guides/secrets-encryption). When: Someone asks how swarm secrets are stored, encrypted or backed up.
11148
+ - [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.
11149
+ - [Provider Capability Matrix](https://docs.agent-swarm.dev/docs/guides/provider-capability-matrix). Reference.
11150
+ - [Adding a Harness Provider](https://docs.agent-swarm.dev/docs/guides/harness-providers). Reference.
11151
+ - [Steer a Running Task](https://docs.agent-swarm.dev/docs/guides/task-steering). Reference.
11152
+ - [Claude Code Mod](https://docs.agent-swarm.dev/docs/guides/claude-code-mod). Reference.
11153
+ - [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.
11154
+ - [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.
11155
+ - [Performance & Resource Sizing](https://docs.agent-swarm.dev/docs/guides/performance-resource-sizing). Reference.
11156
+ - [Cost & context computation](https://docs.agent-swarm.dev/docs/guides/cost-and-context-computation). Reference.
11157
+ - [Extensions](https://docs.agent-swarm.dev/docs/guides/extensions). Reference.
11158
+ - [Scripts runtime](https://docs.agent-swarm.dev/docs/guides/scripts-runtime). Reference.
11159
+ - [Agent capabilities and tool allowlist](https://docs.agent-swarm.dev/docs/guides/agent-capabilities). Reference.
11160
+ - [Scripts-only mode (code-mode)](https://docs.agent-swarm.dev/docs/guides/scripts-only-mode). Reference.
11161
+ - [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.
11162
+ - [OAuth callback migration](https://docs.agent-swarm.dev/docs/guides/oauth-callback-migration). Reference.
11163
+ - [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.
11164
+ - [Scripts credential broker](https://docs.agent-swarm.dev/docs/guides/scripts-credential-broker). Reference.
11165
+ - [One-off Script Workflow Runs](https://docs.agent-swarm.dev/docs/guides/script-workflow-runs). Reference.
11166
+ - [Claude Bridge](https://docs.agent-swarm.dev/docs/guides/claude-bridge-experimental). Reference.
11167
+ - [Worker Credential Recovery](https://docs.agent-swarm.dev/docs/guides/worker-credential-recovery). Reference.
11168
+ - [Model Gateways](https://docs.agent-swarm.dev/docs/guides/provider-auth/model-gateways). Reference.
11169
+ - [Codex OAuth](https://docs.agent-swarm.dev/docs/guides/provider-auth/codex-oauth). Reference.
11170
+ - [Cursor](https://docs.agent-swarm.dev/docs/guides/provider-auth/cursor). Reference.
11171
+ - [Amp](https://docs.agent-swarm.dev/docs/guides/provider-auth/amp). Reference.
11172
+ - [Grok](https://docs.agent-swarm.dev/docs/guides/provider-auth/grok). Reference.
11173
+ - [DeepSeek Harness (dsh)](https://docs.agent-swarm.dev/docs/guides/provider-auth/dsh). Reference.
11174
+ - [x402 Payments](https://docs.agent-swarm.dev/docs/guides/x402-payments). Reference.
11175
+ - [Multi-runtime agents](https://docs.agent-swarm.dev/docs/guides/multi-runtime-agents). Reference.
11176
+ - [Runtime pools (beta)](https://docs.agent-swarm.dev/docs/guides/runtime-pools). Reference.
11177
+
11178
+ ## Other docs
11179
+
11180
+ - [Introduction](https://docs.agent-swarm.dev/docs)
11181
+ - [Getting Started](https://docs.agent-swarm.dev/docs/getting-started)
11182
+ - [Architecture Overview](https://docs.agent-swarm.dev/docs/architecture/overview)
11183
+ - [Agent Identity & Configuration](https://docs.agent-swarm.dev/docs/architecture/agents)
11184
+ - [Memory System](https://docs.agent-swarm.dev/docs/architecture/memory)
11185
+ - [Hook System](https://docs.agent-swarm.dev/docs/architecture/hooks)
11186
+ - [Task Lifecycle](https://docs.agent-swarm.dev/docs/concepts/task-lifecycle)
11187
+ - [Scheduled Tasks](https://docs.agent-swarm.dev/docs/concepts/scheduling)
11188
+ - [Workflows](https://docs.agent-swarm.dev/docs/concepts/workflows)
11189
+ - [Team Collaboration](https://docs.agent-swarm.dev/docs/features/team-collaboration)
11190
+ - [Apps](https://docs.agent-swarm.dev/docs/apps)
11191
+ - [App concepts](https://docs.agent-swarm.dev/docs/apps/concepts)
11192
+ - [Build an App](https://docs.agent-swarm.dev/docs/apps/build-an-app)
11193
+ - [App recipes](https://docs.agent-swarm.dev/docs/apps/recipes)
11194
+ - [Overview](https://docs.agent-swarm.dev/docs/ui)
11195
+ - [Sessions](https://docs.agent-swarm.dev/docs/ui/sessions)
11196
+ - [Configuration](https://docs.agent-swarm.dev/docs/ui/configuration)
11197
+ - [Comb (beta)](https://docs.agent-swarm.dev/docs/ui/comb)
11198
+ - [Integrations](https://docs.agent-swarm.dev/docs/integrations)
11199
+ - [Slack Integration](https://docs.agent-swarm.dev/docs/integrations/slack)
11200
+ - [GitHub App Integration](https://docs.agent-swarm.dev/docs/integrations/github)
11201
+ - [GitLab Integration](https://docs.agent-swarm.dev/docs/integrations/gitlab)
11202
+ - [Azure DevOps Integration](https://docs.agent-swarm.dev/docs/integrations/azure-devops)
11203
+ - [Bitbucket Integration](https://docs.agent-swarm.dev/docs/integrations/bitbucket)
11204
+ - [Linear](https://docs.agent-swarm.dev/docs/integrations/linear)
11205
+ - [Jira Integration](https://docs.agent-swarm.dev/docs/integrations/jira)
11206
+ - [Sentry Integration](https://docs.agent-swarm.dev/docs/integrations/sentry)
11207
+ - [AgentMail Integration](https://docs.agent-swarm.dev/docs/integrations/agentmail)
11208
+ - [Kapso (WhatsApp)](https://docs.agent-swarm.dev/docs/integrations/kapso)
11209
+ - [Chat SDK](https://docs.agent-swarm.dev/docs/integrations/chat-sdk)
11210
+ - [Composio](https://docs.agent-swarm.dev/docs/integrations/composio)
11211
+ - [Salesforce](https://docs.agent-swarm.dev/docs/integrations/salesforce)
11212
+ - [Microsoft Graph](https://docs.agent-swarm.dev/docs/integrations/microsoft-graph)
11213
+ - [Serply Search](https://docs.agent-swarm.dev/docs/integrations/serply)
11214
+ - [MCP Tools Reference](https://docs.agent-swarm.dev/docs/reference/mcp-tools)
11215
+ - [Environment Variables](https://docs.agent-swarm.dev/docs/reference/environment-variables)
11216
+ - [CLI Reference](https://docs.agent-swarm.dev/docs/reference/cli)
11217
+ - [The \`x\` command](https://docs.agent-swarm.dev/docs/reference/x-command)
11218
+ - [Telemetry](https://docs.agent-swarm.dev/docs/reference/telemetry)
11219
+ - [Contributing](https://docs.agent-swarm.dev/docs/contributing)
11220
+ <!-- docs-index:end -->
11221
+ `;
11222
+
11223
+ // templates/skills/swarm-extensions/config.json
11224
+ var config_default44 = `{
11061
11225
  "kind": "skill",
11062
11226
  "name": "swarm-extensions",
11063
11227
  "displayName": "Swarm Extensions",
@@ -11074,7 +11238,7 @@ var config_default43 = `{
11074
11238
  `;
11075
11239
 
11076
11240
  // templates/skills/swarm-extensions/content.md
11077
- var content_default43 = `# Swarm Extensions
11241
+ var content_default44 = `# Swarm Extensions
11078
11242
 
11079
11243
  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
11244
 
@@ -11255,10 +11419,10 @@ export default extension;
11255
11419
  `;
11256
11420
 
11257
11421
  // 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';
11422
+ 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
11423
 
11260
11424
  // templates/skills/swarm-scripts/content.md
11261
- var content_default44 = `# Swarm Scripts
11425
+ var content_default45 = `# Swarm Scripts
11262
11426
 
11263
11427
  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
11428
 
@@ -11453,7 +11617,7 @@ A named script can serve \`POST /api/x/script/<id>\` for callers outside the swa
11453
11617
  `;
11454
11618
 
11455
11619
  // templates/skills/tackle-gh-comments/config.json
11456
- var config_default45 = `{
11620
+ var config_default46 = `{
11457
11621
  "category": "skills",
11458
11622
  "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
11623
  "displayName": "Tackle GH Comments",
@@ -11474,7 +11638,7 @@ var config_default45 = `{
11474
11638
  `;
11475
11639
 
11476
11640
  // templates/skills/tackle-gh-comments/content.md
11477
- var content_default45 = `# Tackle GitHub PR comments
11641
+ var content_default46 = `# Tackle GitHub PR comments
11478
11642
 
11479
11643
  Review threads and their resolved state live **only in GraphQL**. The REST API
11480
11644
  cannot read \`isResolved\` and cannot resolve a thread, and \`gh pr view --comments\`
@@ -11593,7 +11757,7 @@ committed, and the branch is pushed.
11593
11757
  `;
11594
11758
 
11595
11759
  // templates/skills/taste-minimalist-skill/config.json
11596
- var config_default46 = `{
11760
+ var config_default47 = `{
11597
11761
  "kind": "skill",
11598
11762
  "name": "taste-minimalist-skill",
11599
11763
  "displayName": "Taste Minimalist Skill",
@@ -11615,7 +11779,7 @@ var config_default46 = `{
11615
11779
  `;
11616
11780
 
11617
11781
  // 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.
11782
+ var content_default47 = `> Vendored from [taste-skill](https://github.com/Leonxlnx/taste-skill) / [tasteskill.dev](https://www.tasteskill.dev/) at commit 06d6028b5c623016c59ce8536f578e5a1127b499.
11619
11783
  > Upstream license: MIT, Copyright (c) 2026 Leonxlnx. See ../TASTE-SKILL-LICENSE.
11620
11784
 
11621
11785
  # Protocol: Premium Utilitarian Minimalism UI Architect
@@ -11701,7 +11865,7 @@ When tasked with writing frontend code (HTML, React, Tailwind, Vue) or designing
11701
11865
  `;
11702
11866
 
11703
11867
  // templates/skills/tdd-planning/config.json
11704
- var config_default47 = `{
11868
+ var config_default48 = `{
11705
11869
  "category": "skills",
11706
11870
  "description": "TDD-focused implementation planning. Creates plans with strict Red-Green-Commit/Rollback cycles for each step.",
11707
11871
  "displayName": "TDD Planning",
@@ -11722,7 +11886,7 @@ var config_default47 = `{
11722
11886
  `;
11723
11887
 
11724
11888
  // templates/skills/tdd-planning/content.md
11725
- var content_default47 = `# TDD Planning
11889
+ var content_default48 = `# TDD Planning
11726
11890
 
11727
11891
  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
11892
 
@@ -11984,7 +12148,7 @@ Before finalizing any TDD plan, verify:
11984
12148
  `;
11985
12149
 
11986
12150
  // templates/skills/v-implementing/config.json
11987
- var config_default48 = `{
12151
+ var config_default49 = `{
11988
12152
  "category": "skills",
11989
12153
  "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
12154
  "displayName": "V-Implementing",
@@ -12005,10 +12169,10 @@ var config_default48 = `{
12005
12169
  `;
12006
12170
 
12007
12171
  // 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";
12172
+ 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
12173
 
12010
12174
  // templates/skills/v-planning/config.json
12011
- var config_default49 = `{
12175
+ var config_default50 = `{
12012
12176
  "category": "skills",
12013
12177
  "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
12178
  "displayName": "V-Planning",
@@ -12029,7 +12193,7 @@ var config_default49 = `{
12029
12193
  `;
12030
12194
 
12031
12195
  // templates/skills/v-planning/content.md
12032
- var content_default49 = `# v-planning
12196
+ var content_default50 = `# v-planning
12033
12197
 
12034
12198
  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
12199
 
@@ -12120,7 +12284,7 @@ Structure validation runs automatically (rule 9, Haiku sub-agent).
12120
12284
  `;
12121
12285
 
12122
12286
  // templates/skills/verifying/config.json
12123
- var config_default50 = `{
12287
+ var config_default51 = `{
12124
12288
  "category": "skills",
12125
12289
  "description": "Post-implementation plan verification. Cross-references plans against actual changes for completeness and accuracy.",
12126
12290
  "displayName": "Verifying",
@@ -12141,7 +12305,7 @@ var config_default50 = `{
12141
12305
  `;
12142
12306
 
12143
12307
  // templates/skills/verifying/content.md
12144
- var content_default50 = `# Verifying
12308
+ var content_default51 = `# Verifying
12145
12309
 
12146
12310
  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
12311
 
@@ -12289,7 +12453,7 @@ File-review is on by default (unless Autopilot):
12289
12453
  `;
12290
12454
 
12291
12455
  // templates/skills/work-on-task/config.json
12292
- var config_default51 = `{
12456
+ var config_default52 = `{
12293
12457
  "kind": "skill",
12294
12458
  "name": "work-on-task",
12295
12459
  "displayName": "Work On Task",
@@ -12306,10 +12470,10 @@ var config_default51 = `{
12306
12470
  `;
12307
12471
 
12308
12472
  // 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";
12473
+ 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
12474
 
12311
12475
  // templates/skills/workflow-iterate/config.json
12312
- var config_default52 = `{
12476
+ var config_default53 = `{
12313
12477
  "kind": "skill",
12314
12478
  "name": "workflow-iterate",
12315
12479
  "displayName": "Workflow Iteration",
@@ -12331,7 +12495,7 @@ var config_default52 = `{
12331
12495
  `;
12332
12496
 
12333
12497
  // templates/skills/workflow-iterate/content.md
12334
- var content_default52 = `# Workflow Iteration
12498
+ var content_default53 = `# Workflow Iteration
12335
12499
 
12336
12500
  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
12501
 
@@ -12608,7 +12772,7 @@ The same rules apply to a standalone \`request-human-input\` call.
12608
12772
  `;
12609
12773
 
12610
12774
  // templates/skills/workflow-structured-output/config.json
12611
- var config_default53 = `{
12775
+ var config_default54 = `{
12612
12776
  "kind": "skill",
12613
12777
  "name": "workflow-structured-output",
12614
12778
  "displayName": "Workflow Structured Output",
@@ -12625,10 +12789,10 @@ var config_default53 = `{
12625
12789
  `;
12626
12790
 
12627
12791
  // 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';
12792
+ 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
12793
 
12630
12794
  // templates/skills/wts-expert/config.json
12631
- var config_default54 = `{
12795
+ var config_default55 = `{
12632
12796
  "category": "skills",
12633
12797
  "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
12798
  "displayName": "WTS Expert",
@@ -12649,7 +12813,7 @@ var config_default54 = `{
12649
12813
  `;
12650
12814
 
12651
12815
  // templates/skills/wts-expert/content.md
12652
- var content_default54 = `# WTS Expert
12816
+ var content_default55 = `# WTS Expert
12653
12817
 
12654
12818
  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
12819
 
@@ -15629,11 +15793,11 @@ var BUILT_IN_SKILL_SOURCES = [
15629
15793
  { config: config_default37, body: content_default37 },
15630
15794
  { config: config_default38, body: content_default38 },
15631
15795
  { config: config_default43, body: content_default43 },
15796
+ { config: config_default44, body: content_default44 },
15632
15797
  { config: config_default39, body: content_default39 },
15633
15798
  { config: config_default40, body: content_default40 },
15634
15799
  { config: config_default41, body: content_default41 },
15635
15800
  { config: config_default42, body: content_default42 },
15636
- { config: config_default44, body: content_default44 },
15637
15801
  { config: config_default45, body: content_default45 },
15638
15802
  { config: config_default46, body: content_default46 },
15639
15803
  { config: config_default47, body: content_default47 },
@@ -15643,7 +15807,8 @@ var BUILT_IN_SKILL_SOURCES = [
15643
15807
  { config: config_default51, body: content_default51 },
15644
15808
  { config: config_default52, body: content_default52 },
15645
15809
  { config: config_default53, body: content_default53 },
15646
- { config: config_default54, body: content_default54 }
15810
+ { config: config_default54, body: content_default54 },
15811
+ { config: config_default55, body: content_default55 }
15647
15812
  ];
15648
15813
  function canonicalFiles(files) {
15649
15814
  return [...files].sort((a, b) => a.path.localeCompare(b.path)).map((file) => `${file.path}
@@ -15897,7 +16062,7 @@ async function runSeeders(seeders, opts) {
15897
16062
  var import_cron_parser = __toESM(require_dist2(), 1);
15898
16063
 
15899
16064
  // templates/schedules/daily-blocker-digest/config.json
15900
- var config_default55 = `{
16065
+ var config_default56 = `{
15901
16066
  "kind": "schedule",
15902
16067
  "name": "daily-blocker-digest",
15903
16068
  "displayName": "Daily Blocker Digest",
@@ -15919,7 +16084,7 @@ var config_default55 = `{
15919
16084
  `;
15920
16085
 
15921
16086
  // templates/schedules/daily-blocker-digest/content.md
15922
- var content_default55 = `# Daily Blocker Digest
16087
+ var content_default56 = `# Daily Blocker Digest
15923
16088
 
15924
16089
  Delivery uses configured admin channels with an in-app fallback.
15925
16090
 
@@ -16088,7 +16253,7 @@ Call \`store-progress\` with status \`completed\` and an output paragraph coveri
16088
16253
  `;
16089
16254
 
16090
16255
  // templates/schedules/daily-compounding-reflection/config.json
16091
- var config_default56 = `{
16256
+ var config_default57 = `{
16092
16257
  "kind": "schedule",
16093
16258
  "name": "daily-compounding-reflection",
16094
16259
  "displayName": "Daily Evolution",
@@ -16111,7 +16276,7 @@ var config_default56 = `{
16111
16276
  `;
16112
16277
 
16113
16278
  // templates/schedules/daily-compounding-reflection/content.md
16114
- var content_default56 = `# Daily Compounding Reflection
16279
+ var content_default57 = `# Daily Compounding Reflection
16115
16280
 
16116
16281
  Delivery uses configured admin channels with an in-app fallback.
16117
16282
 
@@ -16336,7 +16501,7 @@ If you have zero changes across all three folds and zero deferred items, somethi
16336
16501
  `;
16337
16502
 
16338
16503
  // templates/schedules/daily-hn-briefing/config.json
16339
- var config_default57 = `{
16504
+ var config_default58 = `{
16340
16505
  "kind": "schedule",
16341
16506
  "name": "daily-hn-briefing",
16342
16507
  "displayName": "Daily Hacker News Briefing",
@@ -16353,7 +16518,7 @@ var config_default57 = `{
16353
16518
  `;
16354
16519
 
16355
16520
  // templates/schedules/daily-hn-briefing/content.md
16356
- var content_default57 = `# Daily Hacker News Briefing
16521
+ var content_default58 = `# Daily Hacker News Briefing
16357
16522
 
16358
16523
  Template parameters: {{REPORT_EMAIL}}
16359
16524
 
@@ -16455,7 +16620,7 @@ IMPORTANT:
16455
16620
  `;
16456
16621
 
16457
16622
  // templates/schedules/daily-status-report/config.json
16458
- var config_default58 = `{
16623
+ var config_default59 = `{
16459
16624
  "kind": "schedule",
16460
16625
  "name": "daily-status-report",
16461
16626
  "displayName": "Daily Status Report",
@@ -16477,7 +16642,7 @@ var config_default58 = `{
16477
16642
  `;
16478
16643
 
16479
16644
  // templates/schedules/daily-status-report/content.md
16480
- var content_default58 = `# Daily Status Report
16645
+ var content_default59 = `# Daily Status Report
16481
16646
 
16482
16647
  Give the operator one daily read on whether the swarm is healthy: what's running, what's failed, what's waiting on them.
16483
16648
 
@@ -16573,7 +16738,7 @@ More than 3 qualify ⇒ post the 3 that matter and put the rest in the task outp
16573
16738
  `;
16574
16739
 
16575
16740
  // templates/schedules/daily-swarm-update-check/config.json
16576
- var config_default59 = `{
16741
+ var config_default60 = `{
16577
16742
  "kind": "schedule",
16578
16743
  "name": "daily-swarm-update-check",
16579
16744
  "displayName": "Daily Agent-Swarm Update Check",
@@ -16595,7 +16760,7 @@ var config_default59 = `{
16595
16760
  `;
16596
16761
 
16597
16762
  // templates/schedules/daily-swarm-update-check/content.md
16598
- var content_default59 = `# Daily Agent-Swarm Update Check
16763
+ var content_default60 = `# Daily Agent-Swarm Update Check
16599
16764
 
16600
16765
  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
16766
 
@@ -16647,7 +16812,7 @@ Do not attempt the upgrade yourself — this schedule only detects and reports.
16647
16812
  `;
16648
16813
 
16649
16814
  // templates/schedules/daily-workflow-health-audit/config.json
16650
- var config_default60 = `{
16815
+ var config_default61 = `{
16651
16816
  "kind": "schedule",
16652
16817
  "name": "daily-workflow-health-audit",
16653
16818
  "displayName": "Daily Workflow Health Audit",
@@ -16669,7 +16834,7 @@ var config_default60 = `{
16669
16834
  `;
16670
16835
 
16671
16836
  // templates/schedules/daily-workflow-health-audit/content.md
16672
- var content_default60 = `# Daily Workflow Health Audit
16837
+ var content_default61 = `# Daily Workflow Health Audit
16673
16838
 
16674
16839
  Delivery uses configured admin channels with an in-app fallback.
16675
16840
 
@@ -16863,7 +17028,7 @@ Omit any section whose count is 0. **HARD CEILING 700 characters — not the 400
16863
17028
  `;
16864
17029
 
16865
17030
  // templates/schedules/gtm-weekly-review/config.json
16866
- var config_default61 = `{
17031
+ var config_default62 = `{
16867
17032
  "kind": "schedule",
16868
17033
  "name": "gtm-weekly-review",
16869
17034
  "displayName": "Weekly GTM Metrics Review",
@@ -16880,7 +17045,7 @@ var config_default61 = `{
16880
17045
  `;
16881
17046
 
16882
17047
  // templates/schedules/gtm-weekly-review/content.md
16883
- var content_default61 = `Template parameters: {{REPO_URL}}, {{GSC_PROPERTY}}
17048
+ var content_default62 = `Template parameters: {{REPO_URL}}, {{GSC_PROPERTY}}
16884
17049
 
16885
17050
  # Weekly GTM Metrics Review
16886
17051
 
@@ -16961,7 +17126,7 @@ This is part of your team's GTM goal; update the goal statement before enabling
16961
17126
  `;
16962
17127
 
16963
17128
  // templates/schedules/weekly-code-health-reports/config.json
16964
- var config_default62 = `{
17129
+ var config_default63 = `{
16965
17130
  "kind": "schedule",
16966
17131
  "name": "weekly-code-health-reports",
16967
17132
  "displayName": "Weekly Code Health Reports",
@@ -16978,7 +17143,7 @@ var config_default62 = `{
16978
17143
  `;
16979
17144
 
16980
17145
  // templates/schedules/weekly-code-health-reports/content.md
16981
- var content_default62 = `# Weekly Code Health Reports
17146
+ var content_default63 = `# Weekly Code Health Reports
16982
17147
 
16983
17148
  Template parameters: {{REPO_URL}}, {{BRANCH}}, {{SCOPE_PATH}}, {{REPORT_NAME}}, {{PAGE_ID}}
16984
17149
 
@@ -17043,7 +17208,7 @@ Call \`store-progress\` with status \`completed\` and an output summary that inc
17043
17208
  `;
17044
17209
 
17045
17210
  // templates/schedules/weekly-dependabot-triage/config.json
17046
- var config_default63 = `{
17211
+ var config_default64 = `{
17047
17212
  "kind": "schedule",
17048
17213
  "name": "weekly-dependabot-triage",
17049
17214
  "displayName": "Weekly Dependency Triage",
@@ -17060,7 +17225,7 @@ var config_default63 = `{
17060
17225
  `;
17061
17226
 
17062
17227
  // templates/schedules/weekly-dependabot-triage/content.md
17063
- var content_default63 = `# Weekly Dependency Triage
17228
+ var content_default64 = `# Weekly Dependency Triage
17064
17229
 
17065
17230
  Template parameters: {{SLACK_CHANNEL_ID}}, {{REPO_URL}}, {{TIMEZONE}}
17066
17231
 
@@ -17114,7 +17279,7 @@ Call \`store-progress\` with status \`completed\` and an output summary listing
17114
17279
  `;
17115
17280
 
17116
17281
  // templates/schedules/weekly-dora-metrics/config.json
17117
- var config_default64 = `{
17282
+ var config_default65 = `{
17118
17283
  "kind": "schedule",
17119
17284
  "name": "weekly-dora-metrics",
17120
17285
  "displayName": "Weekly DORA Metrics",
@@ -17131,7 +17296,7 @@ var config_default64 = `{
17131
17296
  `;
17132
17297
 
17133
17298
  // templates/schedules/weekly-dora-metrics/content.md
17134
- var content_default64 = `# Weekly DORA Metrics
17299
+ var content_default65 = `# Weekly DORA Metrics
17135
17300
 
17136
17301
  Template parameters: {{REPO_URL}}, {{BRANCH}}, {{TAG_PATTERN}}, {{REPORT_NAME}}, {{PAGE_ID}}
17137
17302
 
@@ -17197,7 +17362,7 @@ Call \`store-progress\` with status \`completed\` and an output summary that inc
17197
17362
  `;
17198
17363
 
17199
17364
  // templates/schedules/weekly-harness-upgrade-check/config.json
17200
- var config_default65 = `{
17365
+ var config_default66 = `{
17201
17366
  "kind": "schedule",
17202
17367
  "name": "weekly-harness-upgrade-check",
17203
17368
  "displayName": "Weekly Harness Upgrade Check",
@@ -17214,7 +17379,7 @@ var config_default65 = `{
17214
17379
  `;
17215
17380
 
17216
17381
  // 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';
17382
+ 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
17383
 
17219
17384
  // src/be/seed/schedules-seeder.ts
17220
17385
  init_db3();
@@ -17236,7 +17401,7 @@ function resolveSeededEnabled(params) {
17236
17401
  }
17237
17402
 
17238
17403
  // templates/workflows/alerts-triage/config.json
17239
- var config_default66 = `{
17404
+ var config_default67 = `{
17240
17405
  "kind": "workflow",
17241
17406
  "name": "alerts-triage",
17242
17407
  "displayName": "Alerts Triage",
@@ -17253,7 +17418,7 @@ var config_default66 = `{
17253
17418
  `;
17254
17419
 
17255
17420
  // templates/workflows/alerts-triage/content.md
17256
- var content_default66 = `# Alerts Triage
17421
+ var content_default67 = `# Alerts Triage
17257
17422
 
17258
17423
  The Slack handler emits \`slack.message\`; this workflow keeps the event-driven path and deduplicates work after the channel filter.
17259
17424
 
@@ -17273,7 +17438,7 @@ The Slack handler emits \`slack.message\`; this workflow keeps the event-driven
17273
17438
  `;
17274
17439
 
17275
17440
  // templates/workflows/autopilot/config.json
17276
- var config_default67 = `{
17441
+ var config_default68 = `{
17277
17442
  "kind": "workflow",
17278
17443
  "name": "autopilot",
17279
17444
  "displayName": "Autopilot Feature Pipeline",
@@ -17290,7 +17455,7 @@ var config_default67 = `{
17290
17455
  `;
17291
17456
 
17292
17457
  // templates/workflows/autopilot/content.md
17293
- var content_default67 = `# Autopilot Feature Pipeline
17458
+ var content_default68 = `# Autopilot Feature Pipeline
17294
17459
 
17295
17460
  Template parameter: {{REPO_URL}}
17296
17461
 
@@ -17302,7 +17467,7 @@ Use this workflow as a canonical feature delivery pipeline. Customize roles and
17302
17467
  `;
17303
17468
 
17304
17469
  // templates/workflows/claude-code-changelog-watch/config.json
17305
- var config_default68 = `{
17470
+ var config_default69 = `{
17306
17471
  "kind": "workflow",
17307
17472
  "name": "claude-code-changelog-watch",
17308
17473
  "displayName": "Claude Code Changelog Watch",
@@ -17319,10 +17484,10 @@ var config_default68 = `{
17319
17484
  `;
17320
17485
 
17321
17486
  // 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';
17487
+ 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
17488
 
17324
17489
  // templates/workflows/competitor-radar/config.json
17325
- var config_default69 = `{
17490
+ var config_default70 = `{
17326
17491
  "kind": "workflow",
17327
17492
  "name": "competitor-radar",
17328
17493
  "displayName": "Competitor Radar",
@@ -17339,7 +17504,7 @@ var config_default69 = `{
17339
17504
  `;
17340
17505
 
17341
17506
  // templates/workflows/competitor-radar/content.md
17342
- var content_default69 = `# Competitor Radar
17507
+ var content_default70 = `# Competitor Radar
17343
17508
 
17344
17509
  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
17510
 
@@ -17349,7 +17514,7 @@ This self-hosted port retains the scheduled, fixture, extraction, gap-analysis,
17349
17514
  `;
17350
17515
 
17351
17516
  // templates/workflows/docs-site-releases/config.json
17352
- var config_default70 = `{
17517
+ var config_default71 = `{
17353
17518
  "kind": "workflow",
17354
17519
  "name": "docs-site-releases",
17355
17520
  "displayName": "Documentation Release Notes",
@@ -17366,7 +17531,7 @@ var config_default70 = `{
17366
17531
  `;
17367
17532
 
17368
17533
  // templates/workflows/docs-site-releases/content.md
17369
- var content_default70 = `# Documentation Release Notes
17534
+ var content_default71 = `# Documentation Release Notes
17370
17535
 
17371
17536
  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
17537
 
@@ -17381,7 +17546,7 @@ This topology-preserving self-hosted port removes installation-specific identiti
17381
17546
  `;
17382
17547
 
17383
17548
  // templates/workflows/gsc-topic-miner/config.json
17384
- var config_default71 = `{
17549
+ var config_default72 = `{
17385
17550
  "kind": "workflow",
17386
17551
  "name": "gsc-topic-miner",
17387
17552
  "displayName": "Search Topic Miner",
@@ -17398,7 +17563,7 @@ var config_default71 = `{
17398
17563
  `;
17399
17564
 
17400
17565
  // templates/workflows/gsc-topic-miner/content.md
17401
- var content_default71 = `# Search Topic Miner
17566
+ var content_default72 = `# Search Topic Miner
17402
17567
 
17403
17568
  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
17569
 
@@ -17408,7 +17573,7 @@ This template uses only the configured GSC and agent-fs integrations. The deferr
17408
17573
  `;
17409
17574
 
17410
17575
  // templates/workflows/linear-drain-loop/config.json
17411
- var config_default72 = `{
17576
+ var config_default73 = `{
17412
17577
  "kind": "workflow",
17413
17578
  "name": "linear-drain-loop",
17414
17579
  "displayName": "Linear Drain Loop",
@@ -17430,7 +17595,7 @@ var config_default72 = `{
17430
17595
  `;
17431
17596
 
17432
17597
  // templates/workflows/linear-drain-loop/content.md
17433
- var content_default72 = `# Linear Drain Loop
17598
+ var content_default73 = `# Linear Drain Loop
17434
17599
 
17435
17600
  Template parameter: {{LINEAR_PROJECT_ID}}
17436
17601
 
@@ -17475,7 +17640,7 @@ Blocked and ambiguous items are explicitly left alone — the dispatch node surf
17475
17640
  `;
17476
17641
 
17477
17642
  // templates/workflows/llm-safe-release-context/config.json
17478
- var config_default73 = `{
17643
+ var config_default74 = `{
17479
17644
  "kind": "workflow",
17480
17645
  "name": "llm-safe-release-context",
17481
17646
  "displayName": "LLM-Safe Release Context",
@@ -17492,7 +17657,7 @@ var config_default73 = `{
17492
17657
  `;
17493
17658
 
17494
17659
  // templates/workflows/llm-safe-release-context/content.md
17495
- var content_default73 = `# LLM-Safe Release Context
17660
+ var content_default74 = `# LLM-Safe Release Context
17496
17661
 
17497
17662
  Template parameters: {{ORG_ID}}, {{REPO_URL}}
17498
17663
 
@@ -17566,7 +17731,7 @@ This avoids the common failure mode where a large \`context.json\` fills the mod
17566
17731
  `;
17567
17732
 
17568
17733
  // templates/workflows/pr-review-status-sweep/config.json
17569
- var config_default74 = `{
17734
+ var config_default75 = `{
17570
17735
  "kind": "workflow",
17571
17736
  "name": "pr-review-status-sweep",
17572
17737
  "displayName": "PR Review Status Sweep",
@@ -17583,7 +17748,7 @@ var config_default74 = `{
17583
17748
  `;
17584
17749
 
17585
17750
  // templates/workflows/pr-review-status-sweep/content.md
17586
- var content_default74 = `# PR Review Status Sweep
17751
+ var content_default75 = `# PR Review Status Sweep
17587
17752
 
17588
17753
  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
17754
 
@@ -17598,7 +17763,7 @@ Prerequisite: the \`sweep\` node runs the agent-scoped script \`pr-review-status
17598
17763
  `;
17599
17764
 
17600
17765
  // templates/workflows/ralph-loop/config.json
17601
- var config_default75 = `{
17766
+ var config_default76 = `{
17602
17767
  "kind": "workflow",
17603
17768
  "name": "ralph-loop",
17604
17769
  "displayName": "Iterative Review Loop",
@@ -17615,7 +17780,7 @@ var config_default75 = `{
17615
17780
  `;
17616
17781
 
17617
17782
  // templates/workflows/ralph-loop/content.md
17618
- var content_default75 = `# Iterative Review Loop
17783
+ var content_default76 = `# Iterative Review Loop
17619
17784
 
17620
17785
  Template parameter: {{REPO_URL}}
17621
17786
 
@@ -17666,19 +17831,19 @@ The \`maxIterations\` parameter is declarative: the reviewer signals PASS when d
17666
17831
  init_db3();
17667
17832
  var asText2 = (value) => value;
17668
17833
  var BUILT_IN_WORKFLOW_SOURCES = [
17669
- { config: asText2(config_default66), content: asText2(content_default66) },
17670
17834
  { config: asText2(config_default67), content: asText2(content_default67) },
17835
+ { config: asText2(config_default68), content: asText2(content_default68) },
17671
17836
  {
17672
- config: asText2(config_default68),
17673
- content: asText2(content_default68)
17837
+ config: asText2(config_default69),
17838
+ content: asText2(content_default69)
17674
17839
  },
17675
- { config: asText2(config_default69), content: asText2(content_default69) },
17676
17840
  { config: asText2(config_default70), content: asText2(content_default70) },
17677
17841
  { config: asText2(config_default71), content: asText2(content_default71) },
17678
17842
  { config: asText2(config_default72), content: asText2(content_default72) },
17679
17843
  { config: asText2(config_default73), content: asText2(content_default73) },
17680
17844
  { config: asText2(config_default74), content: asText2(content_default74) },
17681
- { config: asText2(config_default75), content: asText2(content_default75) }
17845
+ { config: asText2(config_default75), content: asText2(content_default75) },
17846
+ { config: asText2(config_default76), content: asText2(content_default76) }
17682
17847
  ];
17683
17848
  function sortJson(value) {
17684
17849
  if (Array.isArray(value))
@@ -17794,34 +17959,34 @@ var workflowsSeeder = createWorkflowsSeeder();
17794
17959
  // src/be/seed/schedules-seeder.ts
17795
17960
  var asText3 = (value) => value;
17796
17961
  var BUILT_IN_SCHEDULE_SOURCES = [
17797
- { config: asText3(config_default55), content: asText3(content_default55) },
17962
+ { config: asText3(config_default56), content: asText3(content_default56) },
17798
17963
  {
17799
- config: asText3(config_default56),
17800
- content: asText3(content_default56)
17964
+ config: asText3(config_default57),
17965
+ content: asText3(content_default57)
17801
17966
  },
17802
- { config: asText3(config_default57), content: asText3(content_default57) },
17803
17967
  { config: asText3(config_default58), content: asText3(content_default58) },
17804
- {
17805
- config: asText3(config_default59),
17806
- content: asText3(content_default59)
17807
- },
17968
+ { config: asText3(config_default59), content: asText3(content_default59) },
17808
17969
  {
17809
17970
  config: asText3(config_default60),
17810
17971
  content: asText3(content_default60)
17811
17972
  },
17812
- { config: asText3(config_default61), content: asText3(content_default61) },
17813
17973
  {
17814
- config: asText3(config_default62),
17815
- content: asText3(content_default62)
17974
+ config: asText3(config_default61),
17975
+ content: asText3(content_default61)
17816
17976
  },
17977
+ { config: asText3(config_default62), content: asText3(content_default62) },
17817
17978
  {
17818
17979
  config: asText3(config_default63),
17819
17980
  content: asText3(content_default63)
17820
17981
  },
17821
- { config: asText3(config_default64), content: asText3(content_default64) },
17822
17982
  {
17823
- config: asText3(config_default65),
17824
- content: asText3(content_default65)
17983
+ config: asText3(config_default64),
17984
+ content: asText3(content_default64)
17985
+ },
17986
+ { config: asText3(config_default65), content: asText3(content_default65) },
17987
+ {
17988
+ config: asText3(config_default66),
17989
+ content: asText3(content_default66)
17825
17990
  }
17826
17991
  ];
17827
17992
  function parseScheduleSource(source) {