@desplega.ai/agent-swarm 1.49.0 → 1.52.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 (547) hide show
  1. package/README.md +1 -1
  2. package/openapi.json +2070 -728
  3. package/package.json +10 -1
  4. package/src/agentmail/handlers.ts +65 -10
  5. package/src/agentmail/templates.ts +111 -0
  6. package/src/be/db.ts +1233 -7
  7. package/src/be/migrations/014_prompt_templates.sql +33 -0
  8. package/src/be/migrations/015_workflow_workspace.sql +3 -0
  9. package/src/be/migrations/016_active_session_runner_session.sql +4 -0
  10. package/src/be/migrations/017_channel_activity_cursors.sql +6 -0
  11. package/src/be/migrations/018_fix_seed_double_version.sql +30 -0
  12. package/src/be/migrations/019_skills.sql +65 -0
  13. package/src/be/migrations/020_approval_requests.sql +41 -0
  14. package/src/be/seed.ts +62 -0
  15. package/src/be/skill-parser.ts +70 -0
  16. package/src/be/skill-sync.ts +106 -0
  17. package/src/commands/runner.ts +320 -132
  18. package/src/commands/templates.ts +172 -0
  19. package/src/github/handlers.ts +292 -77
  20. package/src/github/mentions-aliases.test.ts +73 -0
  21. package/src/github/mentions.test.ts +3 -3
  22. package/src/github/mentions.ts +32 -6
  23. package/src/github/templates.ts +398 -0
  24. package/src/gitlab/handlers.ts +63 -22
  25. package/src/gitlab/templates.ts +140 -0
  26. package/src/heartbeat/heartbeat.ts +19 -10
  27. package/src/heartbeat/templates.ts +30 -0
  28. package/src/http/active-sessions.ts +27 -0
  29. package/src/http/approval-requests.ts +247 -0
  30. package/src/http/config.ts +3 -3
  31. package/src/http/index.ts +9 -2
  32. package/src/http/poll.ts +135 -14
  33. package/src/http/prompt-templates.ts +412 -0
  34. package/src/http/schedules.ts +35 -0
  35. package/src/http/skills.ts +479 -0
  36. package/src/http/workflows.ts +8 -0
  37. package/src/linear/sync.ts +28 -4
  38. package/src/linear/templates.ts +47 -0
  39. package/src/prompts/base-prompt.ts +41 -490
  40. package/src/prompts/registry.ts +57 -0
  41. package/src/prompts/resolver.ts +296 -0
  42. package/src/prompts/session-templates.ts +604 -0
  43. package/src/providers/claude-adapter.ts +15 -2
  44. package/src/providers/pi-mono-extension.ts +5 -1
  45. package/src/scheduler/scheduler.ts +125 -91
  46. package/src/server.ts +44 -0
  47. package/src/slack/assistant.ts +7 -4
  48. package/src/slack/channel-activity.ts +177 -0
  49. package/src/slack/handlers.ts +21 -6
  50. package/src/slack/templates.ts +55 -0
  51. package/src/tests/approval-requests.test.ts +735 -0
  52. package/src/tests/artifact-sdk.test.ts +12 -12
  53. package/src/tests/base-prompt.test.ts +49 -49
  54. package/src/tests/channel-activity.test.ts +363 -0
  55. package/src/tests/heartbeat.test.ts +1 -0
  56. package/src/tests/linear-webhook.test.ts +7 -3
  57. package/src/tests/pool-session-logs.test.ts +199 -0
  58. package/src/tests/prompt-template-github.test.ts +682 -0
  59. package/src/tests/prompt-template-remaining.test.ts +504 -0
  60. package/src/tests/prompt-template-resolver.test.ts +621 -0
  61. package/src/tests/prompt-template-session.test.ts +363 -0
  62. package/src/tests/prompt-templates-db.test.ts +616 -0
  63. package/src/tests/self-improvement.test.ts +8 -7
  64. package/src/tests/skill-parser.test.ts +178 -0
  65. package/src/tests/skill-sync.test.ts +171 -0
  66. package/src/tests/slack-metadata-inheritance.test.ts +1 -1
  67. package/src/tests/slack-thread-followups.test.ts +1 -1
  68. package/src/tests/structured-output.test.ts +0 -4
  69. package/src/tests/tool-annotations.test.ts +2 -1
  70. package/src/tests/update-profile-agentid.test.ts +248 -0
  71. package/src/tests/update-profile-auth.test.ts +195 -0
  72. package/src/tests/workflow-async-v2.test.ts +126 -4
  73. package/src/tests/workflow-definition-validation.test.ts +76 -0
  74. package/src/tests/workflow-executors.test.ts +4 -2
  75. package/src/tests/workflow-retry-v2.test.ts +1 -1
  76. package/src/tests/workflow-schedule-trigger.test.ts +104 -0
  77. package/src/tests/workflow-workspace.test.ts +272 -0
  78. package/src/tools/prompt-templates/delete.ts +86 -0
  79. package/src/tools/prompt-templates/get.ts +89 -0
  80. package/src/tools/prompt-templates/index.ts +5 -0
  81. package/src/tools/prompt-templates/list.ts +95 -0
  82. package/src/tools/prompt-templates/preview.ts +84 -0
  83. package/src/tools/prompt-templates/set.ts +117 -0
  84. package/src/tools/request-human-input.ts +106 -0
  85. package/src/tools/skills/index.ts +11 -0
  86. package/src/tools/skills/skill-create.ts +105 -0
  87. package/src/tools/skills/skill-delete.ts +67 -0
  88. package/src/tools/skills/skill-get.ts +75 -0
  89. package/src/tools/skills/skill-install-remote.ts +152 -0
  90. package/src/tools/skills/skill-install.ts +101 -0
  91. package/src/tools/skills/skill-list.ts +77 -0
  92. package/src/tools/skills/skill-publish.ts +123 -0
  93. package/src/tools/skills/skill-search.ts +43 -0
  94. package/src/tools/skills/skill-sync-remote.ts +128 -0
  95. package/src/tools/skills/skill-uninstall.ts +60 -0
  96. package/src/tools/skills/skill-update.ts +128 -0
  97. package/src/tools/store-progress.ts +22 -4
  98. package/src/tools/task-action.ts +20 -0
  99. package/src/tools/templates.ts +53 -0
  100. package/src/tools/tool-config.ts +23 -0
  101. package/src/tools/update-profile.ts +106 -34
  102. package/src/tools/workflows/create-workflow.ts +19 -1
  103. package/src/tools/workflows/update-workflow.ts +16 -1
  104. package/src/types.ts +109 -2
  105. package/src/workflows/definition.ts +30 -12
  106. package/src/workflows/engine.ts +40 -14
  107. package/src/workflows/executors/agent-task.ts +14 -3
  108. package/src/workflows/executors/human-in-the-loop.ts +160 -0
  109. package/src/workflows/executors/registry.ts +2 -0
  110. package/src/workflows/index.ts +1 -1
  111. package/src/workflows/recovery.ts +72 -0
  112. package/src/workflows/resume.ts +162 -12
  113. package/src/workflows/triggers.ts +31 -2
  114. package/src/workflows/version.ts +2 -0
  115. package/.claude/settings.json +0 -84
  116. package/.claude/settings.local.json +0 -117
  117. package/.dockerignore +0 -61
  118. package/.editorconfig +0 -15
  119. package/.entire/settings.json +0 -4
  120. package/.env.docker.example +0 -56
  121. package/.env.example +0 -78
  122. package/.github/ISSUE_TEMPLATE/bug_report.yml +0 -78
  123. package/.github/ISSUE_TEMPLATE/community-template.yml +0 -77
  124. package/.github/ISSUE_TEMPLATE/config.yml +0 -8
  125. package/.github/ISSUE_TEMPLATE/feature_request.yml +0 -60
  126. package/.github/PULL_REQUEST_TEMPLATE/community-template.md +0 -29
  127. package/.github/workflows/ci.yml +0 -52
  128. package/.github/workflows/docker-and-deploy.yml +0 -132
  129. package/.github/workflows/merge-gate.yml +0 -233
  130. package/.opencode/plugins/entire.ts +0 -133
  131. package/.superset/config.json +0 -6
  132. package/.wts-config.json +0 -4
  133. package/.wts-setup.ts +0 -171
  134. package/CHANGELOG.md +0 -447
  135. package/CLAUDE.md +0 -521
  136. package/CONTRIBUTING.md +0 -315
  137. package/DEPLOYMENT.md +0 -622
  138. package/Dockerfile +0 -65
  139. package/Dockerfile.worker +0 -189
  140. package/MCP.md +0 -841
  141. package/UI.md +0 -40
  142. package/api-entrypoint.sh +0 -56
  143. package/assets/agent-swarm-logo-orange.png +0 -0
  144. package/assets/agent-swarm-logo.png +0 -0
  145. package/assets/agent-swarm.mp4 +0 -0
  146. package/assets/agent-swarm.png +0 -0
  147. package/biome.json +0 -39
  148. package/deploy/DEPLOY.md +0 -60
  149. package/deploy/agent-swarm.service +0 -17
  150. package/deploy/docker-push.ts +0 -30
  151. package/deploy/install.ts +0 -85
  152. package/deploy/prod-db.ts +0 -42
  153. package/deploy/uninstall.ts +0 -12
  154. package/deploy/update.ts +0 -21
  155. package/depot.json +0 -1
  156. package/docker-compose.example.yml +0 -350
  157. package/docker-compose.local.yml +0 -119
  158. package/docker-entrypoint.sh +0 -632
  159. package/docs-site/app/api/search/route.ts +0 -4
  160. package/docs-site/app/docs/[[...slug]]/page.tsx +0 -87
  161. package/docs-site/app/docs/layout.tsx +0 -12
  162. package/docs-site/app/globals.css +0 -24
  163. package/docs-site/app/layout.config.tsx +0 -34
  164. package/docs-site/app/layout.tsx +0 -119
  165. package/docs-site/app/llms-full.txt/route.ts +0 -11
  166. package/docs-site/app/llms.mdx/docs/[[...slug]]/route.ts +0 -24
  167. package/docs-site/app/llms.txt/route.ts +0 -8
  168. package/docs-site/app/page.tsx +0 -5
  169. package/docs-site/app/robots.ts +0 -13
  170. package/docs-site/app/sitemap.ts +0 -37
  171. package/docs-site/components/api-page.client.tsx +0 -4
  172. package/docs-site/components/api-page.tsx +0 -7
  173. package/docs-site/components/mdx/mermaid.tsx +0 -55
  174. package/docs-site/content/docs/(documentation)/architecture/agents.mdx +0 -117
  175. package/docs-site/content/docs/(documentation)/architecture/hooks.mdx +0 -77
  176. package/docs-site/content/docs/(documentation)/architecture/memory.mdx +0 -96
  177. package/docs-site/content/docs/(documentation)/architecture/meta.json +0 -4
  178. package/docs-site/content/docs/(documentation)/architecture/overview.mdx +0 -172
  179. package/docs-site/content/docs/(documentation)/concepts/epics.mdx +0 -98
  180. package/docs-site/content/docs/(documentation)/concepts/meta.json +0 -4
  181. package/docs-site/content/docs/(documentation)/concepts/scheduling.mdx +0 -136
  182. package/docs-site/content/docs/(documentation)/concepts/services.mdx +0 -104
  183. package/docs-site/content/docs/(documentation)/concepts/task-lifecycle.mdx +0 -148
  184. package/docs-site/content/docs/(documentation)/concepts/workflows.mdx +0 -209
  185. package/docs-site/content/docs/(documentation)/contributing.mdx +0 -158
  186. package/docs-site/content/docs/(documentation)/getting-started.mdx +0 -157
  187. package/docs-site/content/docs/(documentation)/guides/agentmail-integration.mdx +0 -79
  188. package/docs-site/content/docs/(documentation)/guides/deployment.mdx +0 -171
  189. package/docs-site/content/docs/(documentation)/guides/github-integration.mdx +0 -81
  190. package/docs-site/content/docs/(documentation)/guides/gitlab-integration.mdx +0 -93
  191. package/docs-site/content/docs/(documentation)/guides/linear-integration.mdx +0 -98
  192. package/docs-site/content/docs/(documentation)/guides/meta.json +0 -13
  193. package/docs-site/content/docs/(documentation)/guides/sentry-integration.mdx +0 -52
  194. package/docs-site/content/docs/(documentation)/guides/slack-integration.mdx +0 -179
  195. package/docs-site/content/docs/(documentation)/guides/x402-payments.mdx +0 -154
  196. package/docs-site/content/docs/(documentation)/index.mdx +0 -65
  197. package/docs-site/content/docs/(documentation)/meta.json +0 -19
  198. package/docs-site/content/docs/(documentation)/reference/cli.mdx +0 -241
  199. package/docs-site/content/docs/(documentation)/reference/environment-variables.mdx +0 -205
  200. package/docs-site/content/docs/(documentation)/reference/mcp-tools.mdx +0 -449
  201. package/docs-site/content/docs/(documentation)/reference/meta.json +0 -4
  202. package/docs-site/content/docs/api-reference/active-sessions.mdx +0 -9
  203. package/docs-site/content/docs/api-reference/agents.mdx +0 -9
  204. package/docs-site/content/docs/api-reference/channels.mdx +0 -9
  205. package/docs-site/content/docs/api-reference/config.mdx +0 -9
  206. package/docs-site/content/docs/api-reference/debug.mdx +0 -9
  207. package/docs-site/content/docs/api-reference/ecosystem.mdx +0 -9
  208. package/docs-site/content/docs/api-reference/epics.mdx +0 -9
  209. package/docs-site/content/docs/api-reference/index.mdx +0 -32
  210. package/docs-site/content/docs/api-reference/memory.mdx +0 -9
  211. package/docs-site/content/docs/api-reference/meta.json +0 -25
  212. package/docs-site/content/docs/api-reference/poll.mdx +0 -9
  213. package/docs-site/content/docs/api-reference/repos.mdx +0 -9
  214. package/docs-site/content/docs/api-reference/schedules.mdx +0 -9
  215. package/docs-site/content/docs/api-reference/session-data.mdx +0 -9
  216. package/docs-site/content/docs/api-reference/stats.mdx +0 -9
  217. package/docs-site/content/docs/api-reference/tasks.mdx +0 -9
  218. package/docs-site/content/docs/api-reference/trackers.mdx +0 -9
  219. package/docs-site/content/docs/api-reference/webhooks.mdx +0 -9
  220. package/docs-site/content/docs/api-reference/workflows.mdx +0 -9
  221. package/docs-site/content/docs/meta.json +0 -3
  222. package/docs-site/lib/get-llm-text.ts +0 -10
  223. package/docs-site/lib/openapi.ts +0 -23
  224. package/docs-site/lib/source.ts +0 -8
  225. package/docs-site/mdx-components.tsx +0 -13
  226. package/docs-site/next.config.mjs +0 -29
  227. package/docs-site/package.json +0 -35
  228. package/docs-site/pnpm-lock.yaml +0 -5407
  229. package/docs-site/postcss.config.mjs +0 -8
  230. package/docs-site/public/logo.png +0 -0
  231. package/docs-site/scripts/generate-docs.ts +0 -171
  232. package/docs-site/source.config.ts +0 -17
  233. package/docs-site/tsconfig.json +0 -46
  234. package/ecosystem.config.cjs +0 -66
  235. package/landing/next.config.ts +0 -14
  236. package/landing/package.json +0 -31
  237. package/landing/pnpm-lock.yaml +0 -1091
  238. package/landing/postcss.config.mjs +0 -8
  239. package/landing/public/apple-touch-icon.png +0 -0
  240. package/landing/public/favicon.ico +0 -0
  241. package/landing/public/logo.png +0 -0
  242. package/landing/public/og-image.png +0 -0
  243. package/landing/public/omghost-desplega.svg +0 -30
  244. package/landing/public/omghost-openfort.svg +0 -9
  245. package/landing/src/app/actions/waitlist.ts +0 -25
  246. package/landing/src/app/blog/openfort-hackathon/page.tsx +0 -863
  247. package/landing/src/app/blog/page.tsx +0 -162
  248. package/landing/src/app/blog/swarm-metrics/page.tsx +0 -685
  249. package/landing/src/app/examples/page.tsx +0 -174
  250. package/landing/src/app/examples/x402/page.tsx +0 -456
  251. package/landing/src/app/globals.css +0 -122
  252. package/landing/src/app/layout.tsx +0 -134
  253. package/landing/src/app/page.tsx +0 -27
  254. package/landing/src/app/robots.ts +0 -13
  255. package/landing/src/app/sitemap.ts +0 -44
  256. package/landing/src/components/architecture.tsx +0 -163
  257. package/landing/src/components/cta.tsx +0 -52
  258. package/landing/src/components/features.tsx +0 -160
  259. package/landing/src/components/footer.tsx +0 -100
  260. package/landing/src/components/hero.tsx +0 -217
  261. package/landing/src/components/how-it-works.tsx +0 -165
  262. package/landing/src/components/navbar.tsx +0 -147
  263. package/landing/src/components/waitlist.tsx +0 -110
  264. package/landing/src/components/why-choose.tsx +0 -149
  265. package/landing/src/components/workshops.tsx +0 -328
  266. package/landing/src/lib/utils.ts +0 -6
  267. package/landing/tsconfig.json +0 -41
  268. package/misc/transcripts/2026-03-09-pi-mono-e2e-verification.md +0 -154
  269. package/new-ui/CLAUDE.md +0 -92
  270. package/new-ui/README.md +0 -73
  271. package/new-ui/biome.json +0 -42
  272. package/new-ui/components.json +0 -21
  273. package/new-ui/index.html +0 -25
  274. package/new-ui/package.json +0 -49
  275. package/new-ui/pnpm-lock.yaml +0 -4845
  276. package/new-ui/public/logo.png +0 -0
  277. package/new-ui/src/api/client.ts +0 -814
  278. package/new-ui/src/api/hooks/index.ts +0 -64
  279. package/new-ui/src/api/hooks/use-agents.ts +0 -58
  280. package/new-ui/src/api/hooks/use-channels.ts +0 -115
  281. package/new-ui/src/api/hooks/use-config-api.ts +0 -46
  282. package/new-ui/src/api/hooks/use-costs.ts +0 -122
  283. package/new-ui/src/api/hooks/use-db-query.ts +0 -29
  284. package/new-ui/src/api/hooks/use-epics.ts +0 -75
  285. package/new-ui/src/api/hooks/use-repos.ts +0 -61
  286. package/new-ui/src/api/hooks/use-schedules.ts +0 -81
  287. package/new-ui/src/api/hooks/use-services.ts +0 -16
  288. package/new-ui/src/api/hooks/use-stats.ts +0 -27
  289. package/new-ui/src/api/hooks/use-tasks.ts +0 -89
  290. package/new-ui/src/api/hooks/use-workflows.ts +0 -109
  291. package/new-ui/src/api/types.ts +0 -549
  292. package/new-ui/src/app/App.tsx +0 -13
  293. package/new-ui/src/app/providers.tsx +0 -32
  294. package/new-ui/src/app/router.tsx +0 -52
  295. package/new-ui/src/components/layout/app-header.tsx +0 -47
  296. package/new-ui/src/components/layout/app-sidebar.tsx +0 -128
  297. package/new-ui/src/components/layout/breadcrumbs.tsx +0 -57
  298. package/new-ui/src/components/layout/config-guard.tsx +0 -22
  299. package/new-ui/src/components/layout/root-layout.tsx +0 -40
  300. package/new-ui/src/components/layout/swarm-switcher.tsx +0 -85
  301. package/new-ui/src/components/shared/command-menu.tsx +0 -131
  302. package/new-ui/src/components/shared/data-grid.tsx +0 -141
  303. package/new-ui/src/components/shared/empty-state.tsx +0 -24
  304. package/new-ui/src/components/shared/error-boundary.tsx +0 -72
  305. package/new-ui/src/components/shared/json-viewer.tsx +0 -47
  306. package/new-ui/src/components/shared/name-connection-modal.tsx +0 -99
  307. package/new-ui/src/components/shared/page-skeleton.tsx +0 -16
  308. package/new-ui/src/components/shared/session-log-viewer.tsx +0 -364
  309. package/new-ui/src/components/shared/stats-bar.tsx +0 -132
  310. package/new-ui/src/components/shared/status-badge.tsx +0 -131
  311. package/new-ui/src/components/shared/usage-summary.tsx +0 -179
  312. package/new-ui/src/components/ui/alert-dialog.tsx +0 -176
  313. package/new-ui/src/components/ui/alert.tsx +0 -60
  314. package/new-ui/src/components/ui/avatar.tsx +0 -96
  315. package/new-ui/src/components/ui/badge.tsx +0 -46
  316. package/new-ui/src/components/ui/button.tsx +0 -62
  317. package/new-ui/src/components/ui/card.tsx +0 -75
  318. package/new-ui/src/components/ui/command.tsx +0 -160
  319. package/new-ui/src/components/ui/dialog.tsx +0 -143
  320. package/new-ui/src/components/ui/dropdown-menu.tsx +0 -226
  321. package/new-ui/src/components/ui/input.tsx +0 -21
  322. package/new-ui/src/components/ui/label.tsx +0 -19
  323. package/new-ui/src/components/ui/progress.tsx +0 -26
  324. package/new-ui/src/components/ui/scroll-area.tsx +0 -54
  325. package/new-ui/src/components/ui/select.tsx +0 -175
  326. package/new-ui/src/components/ui/separator.tsx +0 -28
  327. package/new-ui/src/components/ui/sheet.tsx +0 -132
  328. package/new-ui/src/components/ui/sidebar.tsx +0 -691
  329. package/new-ui/src/components/ui/skeleton.tsx +0 -13
  330. package/new-ui/src/components/ui/sonner.tsx +0 -35
  331. package/new-ui/src/components/ui/switch.tsx +0 -33
  332. package/new-ui/src/components/ui/table.tsx +0 -92
  333. package/new-ui/src/components/ui/tabs.tsx +0 -79
  334. package/new-ui/src/components/ui/textarea.tsx +0 -18
  335. package/new-ui/src/components/ui/tooltip.tsx +0 -51
  336. package/new-ui/src/components/workflows/action-node.tsx +0 -53
  337. package/new-ui/src/components/workflows/condition-node.tsx +0 -50
  338. package/new-ui/src/components/workflows/graph-utils.ts +0 -124
  339. package/new-ui/src/components/workflows/json-tree.tsx +0 -189
  340. package/new-ui/src/components/workflows/node-styles.ts +0 -10
  341. package/new-ui/src/components/workflows/step-detail-sheet.tsx +0 -87
  342. package/new-ui/src/components/workflows/trigger-node.tsx +0 -41
  343. package/new-ui/src/components/workflows/workflow-graph.tsx +0 -65
  344. package/new-ui/src/hooks/use-auto-scroll.ts +0 -82
  345. package/new-ui/src/hooks/use-config.ts +0 -203
  346. package/new-ui/src/hooks/use-keyboard-shortcuts.ts +0 -41
  347. package/new-ui/src/hooks/use-mobile.ts +0 -19
  348. package/new-ui/src/hooks/use-theme.ts +0 -60
  349. package/new-ui/src/lib/config.ts +0 -188
  350. package/new-ui/src/lib/slugs.ts +0 -71
  351. package/new-ui/src/lib/utils.ts +0 -120
  352. package/new-ui/src/main.tsx +0 -11
  353. package/new-ui/src/pages/agents/[id]/page.tsx +0 -492
  354. package/new-ui/src/pages/agents/page.tsx +0 -134
  355. package/new-ui/src/pages/chat/page.tsx +0 -674
  356. package/new-ui/src/pages/config/page.tsx +0 -1109
  357. package/new-ui/src/pages/dashboard/page.tsx +0 -454
  358. package/new-ui/src/pages/debug/page.tsx +0 -275
  359. package/new-ui/src/pages/epics/[id]/page.tsx +0 -809
  360. package/new-ui/src/pages/epics/page.tsx +0 -321
  361. package/new-ui/src/pages/not-found/page.tsx +0 -18
  362. package/new-ui/src/pages/repos/page.tsx +0 -369
  363. package/new-ui/src/pages/schedules/[id]/page.tsx +0 -664
  364. package/new-ui/src/pages/schedules/page.tsx +0 -477
  365. package/new-ui/src/pages/services/page.tsx +0 -128
  366. package/new-ui/src/pages/tasks/[id]/page.tsx +0 -670
  367. package/new-ui/src/pages/tasks/page.tsx +0 -592
  368. package/new-ui/src/pages/usage/page.tsx +0 -195
  369. package/new-ui/src/pages/workflow-runs/[id]/page.tsx +0 -363
  370. package/new-ui/src/pages/workflows/[id]/page.tsx +0 -417
  371. package/new-ui/src/pages/workflows/page.tsx +0 -266
  372. package/new-ui/src/styles/ag-grid.css +0 -36
  373. package/new-ui/src/styles/globals.css +0 -213
  374. package/new-ui/test-results/.last-run.json +0 -4
  375. package/new-ui/tsconfig.app.json +0 -34
  376. package/new-ui/tsconfig.json +0 -4
  377. package/new-ui/tsconfig.node.json +0 -26
  378. package/new-ui/vercel.json +0 -4
  379. package/new-ui/vite.config.ts +0 -28
  380. package/plugin/README.md +0 -1
  381. package/plugin/build-pi-skills.ts +0 -233
  382. package/plugin/hooks/hooks.json +0 -71
  383. package/prek.toml +0 -75
  384. package/pyproject.toml +0 -9
  385. package/scripts/check-db-boundary.sh +0 -60
  386. package/scripts/e2e-docker-provider.ts +0 -820
  387. package/scripts/e2e-io-schemas-test.ts +0 -807
  388. package/scripts/e2e-provider-test.ts +0 -220
  389. package/scripts/e2e-workflow-redesign.sh +0 -229
  390. package/scripts/e2e-workflow-test.sh +0 -285
  391. package/scripts/e2e-workflow-test.ts +0 -857
  392. package/scripts/generate-mcp-docs.ts +0 -415
  393. package/scripts/generate-openapi.ts +0 -26
  394. package/scripts/measure-tool-tokens.ts +0 -118
  395. package/scripts/x402-e2e-test.ts +0 -195
  396. package/scripts/x402-test-server.ts +0 -236
  397. package/scripts/x402-testnet-e2e.ts +0 -668
  398. package/slack-manifest.json +0 -88
  399. package/templates-ui/README.md +0 -46
  400. package/templates-ui/components.json +0 -17
  401. package/templates-ui/eslint.config.mjs +0 -18
  402. package/templates-ui/next.config.ts +0 -7
  403. package/templates-ui/package.json +0 -35
  404. package/templates-ui/pnpm-lock.yaml +0 -4571
  405. package/templates-ui/postcss.config.mjs +0 -7
  406. package/templates-ui/public/file.svg +0 -1
  407. package/templates-ui/public/globe.svg +0 -1
  408. package/templates-ui/public/logo.png +0 -0
  409. package/templates-ui/public/next.svg +0 -1
  410. package/templates-ui/public/vercel.svg +0 -1
  411. package/templates-ui/public/window.svg +0 -1
  412. package/templates-ui/src/app/[category]/[name]/page.tsx +0 -89
  413. package/templates-ui/src/app/api/templates/[...slug]/route.ts +0 -52
  414. package/templates-ui/src/app/api/templates/route.ts +0 -18
  415. package/templates-ui/src/app/builder/page.tsx +0 -37
  416. package/templates-ui/src/app/globals.css +0 -94
  417. package/templates-ui/src/app/layout.tsx +0 -79
  418. package/templates-ui/src/app/page.tsx +0 -38
  419. package/templates-ui/src/app/robots.ts +0 -11
  420. package/templates-ui/src/app/sitemap.ts +0 -31
  421. package/templates-ui/src/components/compose-builder.tsx +0 -442
  422. package/templates-ui/src/components/compose-preview.tsx +0 -117
  423. package/templates-ui/src/components/file-preview.tsx +0 -77
  424. package/templates-ui/src/components/footer.tsx +0 -40
  425. package/templates-ui/src/components/header.tsx +0 -41
  426. package/templates-ui/src/components/template-card.tsx +0 -87
  427. package/templates-ui/src/components/template-detail.tsx +0 -125
  428. package/templates-ui/src/components/template-gallery.tsx +0 -263
  429. package/templates-ui/src/components/ui/badge.tsx +0 -36
  430. package/templates-ui/src/components/ui/button.tsx +0 -57
  431. package/templates-ui/src/components/ui/card.tsx +0 -76
  432. package/templates-ui/src/components/ui/separator.tsx +0 -31
  433. package/templates-ui/src/components/ui/tooltip.tsx +0 -32
  434. package/templates-ui/src/lib/compose-generator.ts +0 -241
  435. package/templates-ui/src/lib/templates.ts +0 -137
  436. package/templates-ui/src/lib/utils.ts +0 -6
  437. package/templates-ui/tsconfig.json +0 -34
  438. package/thoughts/research/2026-02-28-openfort-viem-x402-research.md +0 -679
  439. package/thoughts/research/2026-02-28-x402-payments-research.md +0 -686
  440. package/thoughts/researcher/plans/2026-02-20-agent-self-improvement-plan.md +0 -282
  441. package/thoughts/researcher/research/2026-02-20-agent-self-improvement.md +0 -492
  442. package/thoughts/shared/plans/.gitkeep +0 -0
  443. package/thoughts/shared/plans/2025-12-18-slack-integration.md +0 -1195
  444. package/thoughts/shared/plans/2025-12-19-agent-log-streaming.md +0 -732
  445. package/thoughts/shared/plans/2025-12-19-role-based-swarm-plugin.md +0 -361
  446. package/thoughts/shared/plans/2025-12-20-mobile-responsive-ui.md +0 -501
  447. package/thoughts/shared/plans/2025-12-20-startup-team-swarm.md +0 -560
  448. package/thoughts/shared/plans/2025-12-23-runner-level-polling.md +0 -934
  449. package/thoughts/shared/plans/2025-12-23-runner-session-logs.md +0 -1000
  450. package/thoughts/shared/plans/2025-12-23-worker-lead-spawn-triggers.md +0 -568
  451. package/thoughts/shared/plans/2026-01-09-inverse-teleport.md +0 -1516
  452. package/thoughts/shared/plans/2026-01-12-agent-rename-pm2-control.md +0 -1133
  453. package/thoughts/shared/plans/2026-01-12-github-app-integration.md +0 -380
  454. package/thoughts/shared/plans/2026-01-12-lead-inbox-model.md +0 -876
  455. package/thoughts/shared/plans/2026-01-12-ralph-wiggum-integration.md +0 -463
  456. package/thoughts/shared/plans/2026-01-13-agent-concurrency.md +0 -691
  457. package/thoughts/shared/plans/2026-01-13-github-assignment-handling.md +0 -690
  458. package/thoughts/shared/plans/2026-01-13-prevent-duplicate-trigger-processing.md +0 -1071
  459. package/thoughts/shared/plans/2026-01-14-fix-slack-thread-context.md +0 -507
  460. package/thoughts/shared/plans/2026-01-15-scheduled-tasks-implementation.md +0 -565
  461. package/thoughts/shared/plans/2026-01-15-usage-cost-tracking-ui.md +0 -1479
  462. package/thoughts/shared/plans/2026-01-16-epics-feature-implementation.md +0 -1230
  463. package/thoughts/shared/plans/2026-02-26-mcp-tool-context-reduction.md +0 -282
  464. package/thoughts/shared/plans/2026-03-02-claude-context-mode-integration.md +0 -328
  465. package/thoughts/shared/plans/2026-03-02-code-level-heartbeat.md +0 -224
  466. package/thoughts/shared/research/.gitkeep +0 -0
  467. package/thoughts/shared/research/2025-01-09-inverse-teleport-plan-review.md +0 -420
  468. package/thoughts/shared/research/2025-12-18-slack-integration.md +0 -442
  469. package/thoughts/shared/research/2025-12-19-agent-log-streaming.md +0 -339
  470. package/thoughts/shared/research/2025-12-19-agent-secrets-cli-research.md +0 -390
  471. package/thoughts/shared/research/2025-12-21-gemini-cli-integration.md +0 -376
  472. package/thoughts/shared/research/2025-12-22-runner-loop-architecture.md +0 -582
  473. package/thoughts/shared/research/2025-12-22-setup-experience-improvements.md +0 -264
  474. package/thoughts/shared/research/2026-01-13-lead-duplicate-trigger-processing.md +0 -223
  475. package/thoughts/shared/research/2026-01-14-lead-slack-thread-context.md +0 -277
  476. package/thoughts/shared/research/2026-01-15-ai-tracker-agent-swarm-integration.md +0 -376
  477. package/thoughts/shared/research/2026-01-15-auto-starting-processes-in-worker-containers.md +0 -787
  478. package/thoughts/shared/research/2026-01-15-scheduled-tasks.md +0 -390
  479. package/thoughts/shared/research/2026-01-16-epics-feature-research.md +0 -437
  480. package/thoughts/shared/research/2026-02-26-cliffy-mcp-tools.md +0 -159
  481. package/thoughts/shared/research/2026-03-03-database-migration-system-refactor.md +0 -337
  482. package/thoughts/swarm-researcher/plans/2026-02-23-openclaw-improvements-plan.md +0 -778
  483. package/thoughts/swarm-researcher/plans/2026-02-26-artifacts-localtunnel-plan.md +0 -1269
  484. package/thoughts/swarm-researcher/research/2026-02-23-openclaw-vs-agent-swarm-comparison.md +0 -411
  485. package/thoughts/swarm-researcher/research/2026-02-26-artifacts-localtunnel.md +0 -724
  486. package/thoughts/taras/brainstorms/2026-03-20-prompt-template-registry.md +0 -443
  487. package/thoughts/taras/brainstorms/2026-03-20-setup-cli-onboarding.md +0 -307
  488. package/thoughts/taras/plans/2026-01-22-agent-swarm-schemas.md +0 -98
  489. package/thoughts/taras/plans/2026-01-28-per-worker-claude-md.md +0 -617
  490. package/thoughts/taras/plans/2026-01-28-sentry-cli-integration.md +0 -214
  491. package/thoughts/taras/plans/2026-02-20-auto-improvement.md +0 -803
  492. package/thoughts/taras/plans/2026-02-20-env-management.md +0 -538
  493. package/thoughts/taras/plans/2026-02-20-memory-system.md +0 -882
  494. package/thoughts/taras/plans/2026-02-20-repos-knowledge.md +0 -806
  495. package/thoughts/taras/plans/2026-02-20-session-attach.md +0 -647
  496. package/thoughts/taras/plans/2026-02-20-worker-identity.md +0 -820
  497. package/thoughts/taras/plans/2026-02-25-feat-new-ui-visual-redesign-plan.md +0 -768
  498. package/thoughts/taras/plans/2026-03-04-fix-buildSystemPrompt-missing-fields.md +0 -77
  499. package/thoughts/taras/plans/2026-03-04-new-ui-missing-actions.md +0 -543
  500. package/thoughts/taras/plans/2026-03-06-one-time-scheduled-tasks.md +0 -373
  501. package/thoughts/taras/plans/2026-03-08-memory-self-improvement-enhancements.md +0 -512
  502. package/thoughts/taras/plans/2026-03-08-pi-mono-provider-implementation.md +0 -919
  503. package/thoughts/taras/plans/2026-03-09-templates-registry.md +0 -723
  504. package/thoughts/taras/plans/2026-03-10-task-working-directory.md +0 -371
  505. package/thoughts/taras/plans/2026-03-11-archil-per-agent-write-strategy.md +0 -621
  506. package/thoughts/taras/plans/2026-03-12-eliminate-inbox-route-to-tasks.md +0 -61
  507. package/thoughts/taras/plans/2026-03-12-slack-thread-followup-additive.md +0 -488
  508. package/thoughts/taras/plans/2026-03-13-slack-ai-improvements.md +0 -644
  509. package/thoughts/taras/plans/2026-03-16-route-wrapper-openapi.md +0 -636
  510. package/thoughts/taras/plans/2026-03-17-multi-api-config.md +0 -444
  511. package/thoughts/taras/plans/2026-03-18-agent-fs-integration.md +0 -591
  512. package/thoughts/taras/plans/2026-03-18-debug-db-explorer.md +0 -446
  513. package/thoughts/taras/plans/2026-03-18-workflow-redesign.md +0 -987
  514. package/thoughts/taras/plans/2026-03-19-compound-learnings.md +0 -403
  515. package/thoughts/taras/plans/2026-03-19-ticket-tracker-linear-integration.md +0 -860
  516. package/thoughts/taras/plans/2026-03-19-workflow-io-schemas-and-bugs.md +0 -899
  517. package/thoughts/taras/plans/2026-03-20-setup-cli-onboarding.md +0 -874
  518. package/thoughts/taras/plans/2026-03-20-workflow-structured-output-validation-workspace.md +0 -723
  519. package/thoughts/taras/research/2026-01-22-vercel-cli-integration.md +0 -287
  520. package/thoughts/taras/research/2026-01-27-excessive-polling-issue.md +0 -311
  521. package/thoughts/taras/research/2026-01-28-per-worker-claude-md.md +0 -383
  522. package/thoughts/taras/research/2026-01-28-sentry-cli-integration.md +0 -240
  523. package/thoughts/taras/research/2026-02-19-agent-native-swarm-architecture.md +0 -390
  524. package/thoughts/taras/research/2026-02-19-swarm-gaps-implementation.md +0 -594
  525. package/thoughts/taras/research/2026-02-25-dashboard-ui-design-best-practices.md +0 -825
  526. package/thoughts/taras/research/2026-02-26-task-detail-page-redesign.md +0 -393
  527. package/thoughts/taras/research/2026-03-03-new-ui-missing-actions.md +0 -168
  528. package/thoughts/taras/research/2026-03-05-pi-mono-provider-research.md +0 -230
  529. package/thoughts/taras/research/2026-03-06-workflow-engine-design.md +0 -445
  530. package/thoughts/taras/research/2026-03-08-drive-loop-concept.md +0 -375
  531. package/thoughts/taras/research/2026-03-08-pi-mono-deep-dive.md +0 -869
  532. package/thoughts/taras/research/2026-03-09-templates-registry.md +0 -373
  533. package/thoughts/taras/research/2026-03-10-agent-working-directory.md +0 -223
  534. package/thoughts/taras/research/2026-03-10-configurable-event-prompts.md +0 -339
  535. package/thoughts/taras/research/2026-03-11-archil-production-setup.md +0 -181
  536. package/thoughts/taras/research/2026-03-11-archil-shared-disk-write-strategies.md +0 -437
  537. package/thoughts/taras/research/2026-03-13-slack-ai-features.md +0 -258
  538. package/thoughts/taras/research/2026-03-16-openapi-docs-generation.md +0 -335
  539. package/thoughts/taras/research/2026-03-16-route-wrapper-openapi.md +0 -670
  540. package/thoughts/taras/research/2026-03-16-slack-thread-followups-e2e.md +0 -54
  541. package/thoughts/taras/research/2026-03-18-agent-fs-integration.md +0 -558
  542. package/thoughts/taras/research/2026-03-18-linear-integration-finalization.md +0 -526
  543. package/thoughts/taras/research/2026-03-18-workflow-redesign.md +0 -797
  544. package/thoughts/taras/research/2026-03-19-workflow-node-io-schemas-and-bugs.md +0 -563
  545. package/thoughts/taras/research/2026-03-19-workflow-structured-output-validation-workspace.md +0 -486
  546. package/thoughts/taras/research/2026-03-20-prompt-template-registry.md +0 -469
  547. package/tsconfig.json +0 -37
@@ -1,621 +0,0 @@
1
- ---
2
- date: 2026-03-11T10:40:00Z
3
- topic: "Archil Per-Agent Write Strategy Implementation"
4
- author: Claude
5
- status: completed
6
- tags: [plan, archil, shared-disk, per-agent, ownership, fly-io]
7
- research: "thoughts/taras/research/2026-03-11-archil-shared-disk-write-strategies.md"
8
- autonomy: critical
9
- ---
10
-
11
- # Archil Per-Agent Write Strategy Implementation Plan
12
-
13
- ## Overview
14
-
15
- Implement per-agent write isolation on the shared Archil disk. Each agent gets exclusive write ownership of its own subdirectories (`thoughts/$AGENT_ID/`, `memory/$AGENT_ID/`, `downloads/$AGENT_ID/`, `misc/$AGENT_ID/`). All agents can read everything via the `--shared` mount. Write attempts to non-owned directories are intercepted by a PreToolUse hook guardrail (proactive) that warns the agent before the write fails, with a PostToolUse safety net for writes that bypass PreToolUse (e.g., Bash-based writes).
16
-
17
- ## Current State Analysis
18
-
19
- The shared Archil disk at `/workspace/shared` is mounted with `--shared` on all containers (workers + API). Currently:
20
-
21
- - `docker-entrypoint.sh:55-58` does `mkdir -p` for `thoughts/shared/{plans,research}` and `memory/` — the **first agent to boot wins ownership**, others silently fail with EPERM
22
- - `docker-entrypoint.sh:477-486` does `archil checkout` for `thoughts/$AGENT_ID` only — this works correctly
23
- - `base-prompt.ts:219` tells agents to write shared plans to `thoughts/shared/plans/` — broken for all agents except the first to boot
24
- - `base-prompt.ts:245` tells agents to write memory to `/workspace/shared/memory/` — same issue
25
- - `hook.ts:473-474` auto-indexes memory files using `startsWith("/workspace/shared/memory/")` — already matches `memory/$AGENT_ID/foo.md`, no change needed
26
-
27
- ### Key Discoveries:
28
- - `hook.ts:473-474`: Memory auto-indexing path detection uses `startsWith("/workspace/shared/memory/")` which naturally matches per-agent subdirs — **no hook change needed for indexing**
29
- - `hook.ts:164`: `isShared` scope detection uses same prefix — **also fine**
30
- - `inject-learning.ts`, `store-progress.ts`: Write to database only, not filesystem — **not affected**
31
- - `memory-search` MCP tool: Queries indexed database — **not affected by path changes**
32
- - `slack-download-file.ts:14`: Hardcoded default `/workspace/shared/downloads/slack/` — needs update
33
- - Archil `mkdir` on unowned dirs auto-grants ownership to the creator **at the first new parent level** (see Appendix A)
34
- - Archil `--shared` mounts are always fully readable by all clients
35
- - **CRITICAL**: `mkdir -p thoughts/agent-1/plans` when `thoughts/` doesn't exist auto-grants delegation on `thoughts/` (the parent), NOT `thoughts/agent-1/`. This blocks all other agents from writing inside `thoughts/`. Fix: pre-create top-level dirs, then agents `mkdir` only their subdirs (grants delegation at the correct subdir level).
36
- - Write failures on `--shared` mounts produce **"Read-only file system"** errors (not EPERM/EACCES)
37
- - A single Archil client can hold multiple non-overlapping delegations simultaneously (verified)
38
- - `archil checkout` requires the target path to already exist (fails with "does not exist" otherwise)
39
- - Unmounting releases ALL delegations; remounting starts fresh
40
-
41
- **Note on `misc/`**: This directory is a new addition (not analyzed in the research). It serves as a catch-all for unanticipated agent writes — agents doing ad-hoc work (temp files, scratch data, tool outputs) need somewhere safe to write that doesn't pollute the structured `thoughts/`/`memory/`/`downloads/` hierarchy. Without it, agents would fail on any write that doesn't fit the three predefined categories.
42
-
43
- ## Desired End State
44
-
45
- ```
46
- /workspace/shared/ # --shared mount, all agents read everything
47
- ├── thoughts/
48
- │ ├── worker-1/ # Checked out by worker-1 at boot
49
- │ │ ├── plans/
50
- │ │ ├── research/
51
- │ │ └── brainstorms/
52
- │ ├── worker-2/ # Checked out by worker-2 at boot
53
- │ │ └── ...
54
- │ └── lead/ # Checked out by lead at boot
55
- │ └── ...
56
- ├── memory/
57
- │ ├── worker-1/ # Checked out by worker-1
58
- │ ├── worker-2/ # Checked out by worker-2
59
- │ └── lead/ # Checked out by lead
60
- ├── downloads/
61
- │ ├── worker-1/slack/ # Checked out by worker-1
62
- │ └── worker-2/slack/ # Checked out by worker-2
63
- └── misc/
64
- ├── worker-1/ # Catch-all for unanticipated writes
65
- └── worker-2/
66
- ```
67
-
68
- Boot flow — two-phase (API pre-creates, workers checkout):
69
-
70
- **API machine** (boots first — deploy script waits for "started"):
71
- ```
72
- archil mount --shared {disk} /workspace/shared
73
- → mkdir thoughts/ memory/ downloads/ misc/ # creates top-level dirs, gets parent delegations
74
- → archil unmount /workspace/shared # releases parent delegations
75
- → archil mount --shared {disk} /workspace/shared # remount clean (no delegations)
76
- ```
77
-
78
- **Worker/Lead machines** (boot after API):
79
- ```
80
- archil mount --shared {disk} /workspace/shared # top-level dirs already exist (API created them)
81
- → mkdir thoughts/$AGENT_ID # auto-grants delegation on thoughts/$AGENT_ID (NOT thoughts/)
82
- → mkdir memory/$AGENT_ID # auto-grants delegation on memory/$AGENT_ID
83
- → mkdir downloads/$AGENT_ID # auto-grants delegation on downloads/$AGENT_ID
84
- → mkdir misc/$AGENT_ID # auto-grants delegation on misc/$AGENT_ID
85
- → archil checkout thoughts/$AGENT_ID # persistent ownership (survives reboots)
86
- → archil checkout memory/$AGENT_ID
87
- → archil checkout downloads/$AGENT_ID
88
- → archil checkout misc/$AGENT_ID
89
- → mkdir -p thoughts/$AGENT_ID/{plans,research,brainstorms}
90
- → mkdir -p downloads/$AGENT_ID/slack
91
- ```
92
-
93
- **Why two phases?** Archil `mkdir` auto-grants delegation at the **first new directory** in the path. If `thoughts/` doesn't exist, `mkdir -p thoughts/agent-1/plans` grants delegation on `thoughts/` (the parent), blocking all other agents. By having the API pre-create top-level dirs and release ownership, workers' `mkdir thoughts/$AGENT_ID` correctly grants delegation at the subdir level only.
94
-
95
- Agent runtime:
96
- - Write to own dirs: ✅ (owned via checkout)
97
- - Read any agent's dirs: ✅ (shared mount)
98
- - Write to another agent's dir: ❌ "Read-only file system" → hook hints "use your own dir"
99
- - Write to non-existent top-level: ❌ hook hints "use misc/$AGENT_ID/"
100
-
101
- ## Quick Verification Reference
102
-
103
- Common commands:
104
- - `bun run tsc:check` — TypeScript check
105
- - `bun run lint` — Biome lint
106
- - Deploy test: push to main → wait for Docker build → `GITHUB_TOKEN=$(gh auth token) bun run scripts/deploy-swarm.ts <app> -y` (from agent-swarm-internal)
107
- - Check logs: `fly logs -a <app> --no-tail | head -100`
108
- - Check machines: `fly machines list -a <app>`
109
-
110
- Key files:
111
- - `docker-entrypoint.sh` — boot-time checkout
112
- - `src/prompts/base-prompt.ts` — agent system prompt
113
- - `src/hooks/hook.ts` — PostToolUse hook (memory indexing + guardrails)
114
- - `src/tools/slack-download-file.ts` — slack download default path
115
- - `plugin/pi-skills/work-on-task/SKILL.md` — pi-mono skill paths
116
-
117
- ## What We're NOT Doing
118
-
119
- - **API-mediated shared writes** — deferred. If we ever need a truly shared writable directory, we'll add an API endpoint for that.
120
- - **Database discovery layer** — memory-search already provides this. Plan/research discovery is handled by `ls /workspace/shared/thoughts/*/plans/` in prompts.
121
- - **Data migration** — existing `thoughts/shared/` files remain readable. No move needed.
122
- - **Deploy script changes** — `deploy-swarm.ts` doesn't need changes (Archil disk names and env vars stay the same).
123
- - **Orphaned directory cleanup** — if `AGENT_ID` changes (e.g., machine replacement), the old agent's dirs remain on disk. Acceptable tech debt for v1 — dirs are small and readable by all agents. Cleanup can be added later if needed.
124
-
125
- ## Implementation Approach
126
-
127
- Four phases, each independently deployable and verifiable:
128
-
129
- 1. **Entrypoint**: Two-phase setup — API pre-creates top-level dirs and releases ownership, workers create per-agent subdirs and checkout. Includes retry backoff for boot race safety.
130
- 2. **Prompting**: Update base-prompt.ts to describe the new directory layout. Works with or without Archil.
131
- 3. **Hook guardrails**: Add PreToolUse prevention (primary, proactive) and PostToolUse detection (secondary, safety net) for non-owned write attempts.
132
- 4. **Tool path updates**: Update hardcoded paths in slack download tool and pi-skills.
133
-
134
- ---
135
-
136
- ## Phase 1: Entrypoint — Two-Phase Directory Setup
137
-
138
- ### Overview
139
- Implement a two-phase boot sequence: the API machine pre-creates top-level directories and releases ownership, then workers create their per-agent subdirectories and claim ownership via checkout. This avoids the parent-delegation problem where `mkdir -p thoughts/$AGENT_ID/plans` would auto-grant ownership of the entire `thoughts/` directory to the first agent to boot, blocking all others (see Appendix A for the test that discovered this).
140
-
141
- ### Changes Required:
142
-
143
- #### 1. API entrypoint — pre-create top-level dirs
144
- **File**: `docker-entrypoint.sh`
145
- **Location**: After the `archil mount --shared` call for the shared disk, add a block for the API role:
146
-
147
- ```bash
148
- # --- API: Pre-create top-level shared directories ---
149
- # The API boots first (deploy script waits for "started" state).
150
- # We create the top-level category dirs so that workers' mkdir
151
- # auto-grants delegation at the subdir level (not the parent).
152
- # Then we unmount/remount to release the parent delegations.
153
- if [ "$AGENT_ROLE" = "api" ] && [ -n "$ARCHIL_MOUNT_TOKEN" ]; then
154
- echo "Pre-creating shared directory structure..."
155
- for category in thoughts memory downloads misc; do
156
- mkdir -p "/workspace/shared/$category" 2>/dev/null || true
157
- done
158
- # Release parent delegations (mkdir auto-granted them)
159
- sudo --preserve-env=ARCHIL_MOUNT_TOKEN archil unmount /workspace/shared 2>/dev/null || true
160
- sudo --preserve-env=ARCHIL_MOUNT_TOKEN archil mount --shared \
161
- --region "$ARCHIL_REGION" "$ARCHIL_SHARED_DISK_NAME" /workspace/shared
162
- echo "Shared directory structure ready (delegations released)"
163
- fi
164
- ```
165
-
166
- #### 2. Worker/Lead entrypoint — per-agent checkout
167
- **File**: `docker-entrypoint.sh`
168
- **Location**: Remove the broken shared mkdir block (currently around lines 55-58). Replace the per-agent checkout block (currently around lines 477-486).
169
-
170
- ```bash
171
- if [ -n "$AGENT_ID" ]; then
172
- AGENT_SHARED="/workspace/shared"
173
-
174
- echo "Setting up per-agent directories for $AGENT_ID..."
175
-
176
- # The shared disk is already mounted via `archil mount --shared`.
177
- # Read access to ALL directories (including other agents') is automatic.
178
- # Here we claim WRITE ownership of this agent's own subdirectories only.
179
- #
180
- # IMPORTANT: Top-level dirs (thoughts/, memory/, downloads/, misc/) are
181
- # pre-created by the API machine at boot. This ensures our mkdir below
182
- # auto-grants delegation at the SUBDIR level (e.g., thoughts/$AGENT_ID),
183
- # not the parent level (thoughts/). See Appendix A in the plan for details.
184
-
185
- for category in "thoughts" "memory" "downloads" "misc"; do
186
- AGENT_DIR="$AGENT_SHARED/$category/$AGENT_ID"
187
-
188
- # Create our subdir (auto-grants delegation on $AGENT_ID level)
189
- mkdir -p "$AGENT_DIR" 2>/dev/null || true
190
-
191
- # Checkout for persistent ownership (survives reboots where dir already exists)
192
- if [ -n "$ARCHIL_MOUNT_TOKEN" ]; then
193
- sudo --preserve-env=ARCHIL_MOUNT_TOKEN archil checkout "$AGENT_DIR" 2>/dev/null || true
194
- fi
195
- done
196
-
197
- # Create standard subdirectories (within owned dirs, always succeeds)
198
- mkdir -p "$AGENT_SHARED/thoughts/$AGENT_ID/plans"
199
- mkdir -p "$AGENT_SHARED/thoughts/$AGENT_ID/research"
200
- mkdir -p "$AGENT_SHARED/thoughts/$AGENT_ID/brainstorms"
201
- mkdir -p "$AGENT_SHARED/downloads/$AGENT_ID/slack"
202
-
203
- echo "Per-agent directories ready for $AGENT_ID"
204
- fi
205
- ```
206
-
207
- #### 3. Worker entrypoint — retry with backoff (safety net)
208
- **File**: `docker-entrypoint.sh`
209
- **Location**: Wrap the mkdir/checkout loop above in a retry mechanism in case workers boot before the API finishes pre-creating dirs:
210
-
211
- ```bash
212
- # Safety net: if top-level dirs don't exist yet (API still booting),
213
- # retry a few times with backoff
214
- if [ -n "$ARCHIL_MOUNT_TOKEN" ]; then
215
- for attempt in 1 2 3; do
216
- if [ -d "$AGENT_SHARED/thoughts" ]; then
217
- break
218
- fi
219
- echo "Waiting for shared directory structure (attempt $attempt/3)..."
220
- sleep 3
221
- done
222
- fi
223
- ```
224
-
225
- ### Success Criteria:
226
-
227
- #### Automated Verification:
228
- - [x] Entrypoint runs without errors: `fly logs -a <app> --no-tail | grep -E "(Pre-creating|Per-agent directories ready|Error)"`
229
- - [x] All machines start successfully: `fly machines list -a <app>` shows all `started`
230
- - [x] Agent can write to own dir: SSH in and `echo test > /workspace/shared/thoughts/$AGENT_ID/test.txt`
231
- - [x] Agent can read other's dir: SSH in as agent-1 and `cat /workspace/shared/thoughts/agent-2/test.txt`
232
-
233
- #### Manual Verification:
234
- - [x] Deploy to test swarm and confirm all workers + lead boot cleanly
235
- - [x] **DELEGATION CHECK**: `archil delegations /workspace/shared` on each worker shows 4 delegations at the subdir level (e.g., `thoughts/agent-1`, NOT `thoughts/`)
236
- - [x] **CROSS-AGENT WRITE BLOCKED**: SSH into worker-1, try `echo test > /workspace/shared/thoughts/agent-2/test.txt` — verify "Read-only file system" error
237
- - [x] **CROSS-AGENT READ WORKS**: SSH into worker-1, `cat /workspace/shared/thoughts/agent-2/test.txt` — verify content is readable
238
- - [x] **READ PROPAGATION TEST**: Worker-1 writes a file, worker-2 reads it immediately — note any delay
239
- - [x] Verify existing `thoughts/shared/` directory (if present) is still readable
240
-
241
- **Implementation Note**: The error pattern for non-owned writes is confirmed: **"Read-only file system"** (not EPERM/EACCES). This will be used in Phase 3. Pause for confirmation before proceeding.
242
-
243
- ---
244
-
245
- ## Phase 2: Prompting — Directory Layout Convention
246
-
247
- ### Overview
248
- Update `base-prompt.ts` to describe the per-agent directory convention. This works as good hygiene even without Archil — agents are guided to write to organized per-agent directories. With Archil, the guardrail (Phase 3) enforces it.
249
-
250
- ### Changes Required:
251
-
252
- #### 1. Workspace directory layout in system prompt
253
- **File**: `src/prompts/base-prompt.ts`
254
- **Changes** (around lines 215-250):
255
-
256
- Update the workspace directory structure description to describe the per-agent layout:
257
- - Personal workspace (`/workspace/personal/`) — unchanged
258
- - Shared workspace (`/workspace/shared/`) — each agent writes to `{category}/{yourId}/`, reads everything
259
- - List the write directories: thoughts, memory, downloads, misc
260
- - Show how to discover other agents' work: `ls /workspace/shared/thoughts/*/plans/`, `memory-search`
261
- - Add clear warning: "Do NOT write to another agent's directory"
262
-
263
- #### 2. Remove references to `thoughts/shared/`
264
- **File**: `src/prompts/base-prompt.ts`
265
- **Changes**: Find and update all references to `thoughts/shared/plans/` and `thoughts/shared/research/` to use `thoughts/{agentId}/plans/` and `thoughts/{agentId}/research/` instead.
266
-
267
- #### 3. Update memory write path guidance
268
- **File**: `src/prompts/base-prompt.ts`
269
- **Changes** (around line 245): Change memory write path from `/workspace/shared/memory/` to `/workspace/shared/memory/{agentId}/`.
270
-
271
- ### Success Criteria:
272
-
273
- #### Automated Verification:
274
- - [x] TypeScript check passes: `bun run tsc:check`
275
- - [x] Lint passes: `bun run lint`
276
- - [x] No remaining references to `thoughts/shared/plans` or `thoughts/shared/research` as write targets: `grep -rn "thoughts/shared" src/prompts/`
277
-
278
- #### Manual Verification:
279
- - [x] Read the generated prompt for a test agent and confirm the workspace layout section is clear and correct
280
- - [x] Verify agent ID substitution works correctly in the prompt
281
-
282
- **Implementation Note**: This phase doesn't require a deploy to verify. TypeScript + lint is sufficient. Proceed to Phase 3 after confirmation.
283
-
284
- ---
285
-
286
- ## Phase 3: Hook Guardrails — Write Failure Detection
287
-
288
- ### Overview
289
- Add PreToolUse write prevention (primary, proactive) and PostToolUse error detection (secondary, safety net) in `hook.ts` and `pi-mono-extension.ts`. The error pattern for non-owned writes is **"Read-only file system"** (confirmed in Appendix A testing).
290
-
291
- ### Changes Required:
292
-
293
- #### 1. Path ownership check helper
294
- **Files**: `src/hooks/hook.ts` and `src/providers/pi-mono-extension.ts`
295
- **Changes**: Add a shared helper function (or duplicate in both files):
296
- ```ts
297
- function isOwnedSharedPath(path: string, agentId: string): boolean {
298
- const sharedCategories = ["thoughts", "memory", "downloads", "misc"];
299
- return sharedCategories.some(cat =>
300
- path.startsWith(`/workspace/shared/${cat}/${agentId}/`)
301
- );
302
- }
303
- ```
304
-
305
- #### 2. PreToolUse prevention (primary — proactive)
306
- **Files**: `src/hooks/hook.ts` (PreToolUse handler) and `src/providers/pi-mono-extension.ts` (`tool_call` handler)
307
- **Changes**: Before a Write/Edit tool executes, check if:
308
- 1. `ARCHIL_MOUNT_TOKEN` is set (skip in local dev — all paths are writable)
309
- 2. The target path is under `/workspace/shared/` but NOT under the agent's own subdirectory
310
-
311
- If both conditions are true, return a **non-blocking warning** hint:
312
- ```
313
- ⚠️ This write will fail: You don't have write access to this directory.
314
-
315
- On shared workspaces, each agent can only write to their own directories:
316
- - /workspace/shared/thoughts/{yourId}/
317
- - /workspace/shared/memory/{yourId}/
318
- - /workspace/shared/downloads/{yourId}/
319
- - /workspace/shared/misc/{yourId}/
320
-
321
- You CAN read any file on the shared disk. For writes, use your own subdirectory.
322
- ```
323
-
324
- This prevents wasted tool calls by warning the agent before the write fails.
325
-
326
- #### 3. PostToolUse detection (secondary — safety net)
327
- **Files**: `src/hooks/hook.ts` (PostToolUse handler) and `src/providers/pi-mono-extension.ts` (`tool_result` handler)
328
- **Changes**: After a Write/Edit tool call, check if:
329
- 1. The tool result indicates an error (exact pattern from Phase 1 error discovery)
330
- 2. The target path is under `/workspace/shared/` but NOT owned by this agent
331
-
332
- If both conditions are true, return the same hint as above. This catches cases where the PreToolUse check didn't fire (e.g., Bash-based writes, MCP tools).
333
-
334
- ### Success Criteria:
335
-
336
- #### Automated Verification:
337
- - [x] TypeScript check passes: `bun run tsc:check`
338
- - [x] Lint passes: `bun run lint`
339
- - [x] Hook correctly identifies owned paths: test `isOwnedSharedPath("/workspace/shared/memory/agent-1/foo.md", "agent-1")` → true
340
- - [x] Hook correctly identifies non-owned paths: test `isOwnedSharedPath("/workspace/shared/memory/agent-2/foo.md", "agent-1")` → false
341
- - [x] Both `hook.ts` and `pi-mono-extension.ts` contain the guardrail logic
342
-
343
- #### Manual Verification:
344
- - [x] Deploy and have an agent attempt to write to another agent's directory — verify the PreToolUse hint appears before the write
345
- - [x] Verify writes to own directory still work without any hook interference
346
- - [x] Verify the hint message is clear and actionable
347
- - [x] Test with pi-mono harness (if available) to confirm parity
348
-
349
- **Implementation Note**: PreToolUse is the primary guardrail (proactive). PostToolUse is the safety net (reactive). Both must be implemented in both `hook.ts` and `pi-mono-extension.ts`.
350
-
351
- ---
352
-
353
- ## Phase 4: Tool Path Updates
354
-
355
- ### Overview
356
- Update hardcoded default paths in tools that write to the shared disk, so they use per-agent subdirectories by default.
357
-
358
- ### Changes Required:
359
-
360
- #### 1. Slack download file tool
361
- **File**: `src/tools/slack-download-file.ts`
362
- **Changes** (around line 14): Update the default download directory to include agent ID:
363
- ```ts
364
- const DEFAULT_DOWNLOAD_DIR = `/workspace/shared/downloads/${process.env.AGENT_ID || "default"}/slack`;
365
- ```
366
-
367
- #### 2. Slack files utility
368
- **File**: `src/slack/files.ts`
369
- **Changes** (around line 14): Same pattern — update default path to include `$AGENT_ID`.
370
-
371
- #### 3. Pi-mono work-on-task skill
372
- **File**: `plugin/pi-skills/work-on-task/SKILL.md`
373
- **Changes** (around line 27): Update path from `thoughts/shared/plans/` to `thoughts/{agentId}/plans/`.
374
-
375
- #### 4. Plugin commands
376
- **File**: `plugin/commands/work-on-task.md`
377
- **Changes** (around line 68): Update `shared/memory/` reference to `memory/{agentId}/` (this line references the memory path, not thoughts).
378
-
379
- #### 5. Plugin build script
380
- **File**: `plugin/build-pi-skills.ts`
381
- **Changes** (around line 76): Update `thoughts/shared/plans/` reference.
382
-
383
- #### 6. Agent templates
384
- **Files**:
385
- - `templates/official/researcher/CLAUDE.md` (line 33)
386
- - `templates/official/tester/CLAUDE.md` (line 36)
387
- - `templates/official/forward-deployed-engineer/CLAUDE.md` (line 36)
388
- **Changes**: Update shared path references to use per-agent convention.
389
-
390
- #### 7. Documentation
391
- **Files**:
392
- - `docs-site/content/docs/architecture/memory.mdx` (lines 20, 28)
393
- - `docs-site/content/docs/architecture/agents.mdx` (line 78)
394
- - `docs-site/content/docs/guides/slack-integration.mdx` (line 89)
395
- - `docs-site/content/docs/reference/mcp-tools.mdx` (line 213)
396
- - `MCP.md` (line 272)
397
- - `README.md` (line 148)
398
- **Changes**: Update shared path references in documentation.
399
-
400
- #### 8. Database prompt text
401
- **File**: `src/be/db.ts`
402
- **Changes** (around line 2144): Update prompt text referencing shared memory path.
403
-
404
- #### 9. Remaining hardcoded shared paths
405
- **Files**: Final grep sweep for any remaining hardcoded references to shared write paths.
406
-
407
- ### Success Criteria:
408
-
409
- #### Automated Verification:
410
- - [x] TypeScript check passes: `bun run tsc:check`
411
- - [x] Lint passes: `bun run lint`
412
- - [x] No remaining hardcoded shared write paths: `grep -rn "/workspace/shared/downloads/slack" src/ plugin/ templates/ docs-site/ README.md MCP.md` returns nothing
413
- - [x] No remaining `thoughts/shared` write targets: `grep -rn "thoughts/shared" src/ plugin/ templates/ docs-site/ README.md MCP.md | grep -v "read\|Read\|cat \|ls "` returns nothing
414
-
415
- #### Manual Verification:
416
- - [x] Deploy and test Slack file download — verify file lands in `downloads/$AGENT_ID/slack/`
417
- - [x] Test a pi-mono agent's plan creation — verify plan goes to `thoughts/$AGENT_ID/plans/`
418
-
419
- **Implementation Note**: After completing this phase, do a full E2E deploy and verify all write operations land in the correct per-agent directories.
420
-
421
- ---
422
-
423
- ## Testing Strategy
424
-
425
- ### Automated
426
- - `bun run tsc:check` — type safety
427
- - `bun run lint` — code quality
428
- - `grep` searches for leftover hardcoded paths
429
-
430
- ### Manual E2E (on live swarm)
431
- After all phases:
432
- 1. Deploy fresh with `GITHUB_TOKEN=$(gh auth token) bun run scripts/deploy-swarm.ts <app> -y`
433
- 2. `fly logs -a <app> --no-tail | grep "Per-agent directories"` — verify all agents checkout OK
434
- 3. `fly machines list -a <app>` — all machines started
435
- 4. Via MCP or SSH, have an agent:
436
- - Write a plan → verify lands in `thoughts/$AGENT_ID/plans/`
437
- - Write a memory file → verify lands in `memory/$AGENT_ID/` and is auto-indexed
438
- - Download a Slack file → verify lands in `downloads/$AGENT_ID/slack/`
439
- - Read another agent's plan → verify succeeds
440
- - Attempt to write to another agent's dir → verify hook guardrail fires
441
- 5. Check `archil delegations /workspace/shared` shows correct per-agent checkouts
442
-
443
- ## References
444
- - Research: `thoughts/taras/research/2026-03-11-archil-shared-disk-write-strategies.md`
445
- - Archil shared disk docs: https://docs.archil.com/concepts/shared-disks
446
- - Current entrypoint: `docker-entrypoint.sh`
447
- - Current prompts: `src/prompts/base-prompt.ts`
448
- - Current hooks: `src/hooks/hook.ts`
449
-
450
- ---
451
-
452
- ## Appendix A: Live Archil Checkout Testing
453
-
454
- _Tested 2026-03-11 on `swarm-test-archil` (Fly.io, AMS region). Two worker machines (`test-agent-1`, `test-agent-2`) with a shared Archil disk._
455
-
456
- ### Test environment
457
- ```
458
- App: swarm-test-archil (deploys/test in agent-swarm-internal)
459
- Workers: 7810621a9e29e8 (test-agent-1), 683435ef716518 (test-agent-2)
460
- Shared disk: dsk-00000000000069cb
461
- ```
462
-
463
- ### Test 1: Multiple checkouts per client ✅
464
- Worker-2 successfully held 6+ delegations simultaneously:
465
- ```bash
466
- # On worker-2 after mkdir + checkout:
467
- archil delegations /workspace/shared
468
- # Result:
469
- # /workspace/shared/thoughts (Active)
470
- # /workspace/shared/memory (Active)
471
- # /workspace/shared/thoughts/test-agent-2 (Active)
472
- # /workspace/shared/misc (Active)
473
- # /workspace/shared/memory/test-agent-2 (Active)
474
- # /workspace/shared/downloads (Active)
475
- ```
476
- **Conclusion**: A single Archil client CAN hold multiple non-overlapping delegations.
477
-
478
- ### Test 2: Parent delegation problem ❌ (discovered)
479
- Worker-2 ran `mkdir -p /workspace/shared/thoughts/test-agent-2/plans` (first agent to create `thoughts/`):
480
- ```bash
481
- archil delegations /workspace/shared
482
- # Result: /workspace/shared/thoughts (Active) ← owns ALL of thoughts/!
483
- ```
484
- Worker-1 then tried to create its subdir:
485
- ```bash
486
- mkdir -p /workspace/shared/thoughts/test-agent-1/plans
487
- # Result: mkdir: cannot create directory '/workspace/shared/thoughts/test-agent-1': Read-only file system
488
- ```
489
- **Root cause**: `mkdir -p` auto-grants delegation at the **first new parent directory**. Since `thoughts/` didn't exist, worker-2 got delegation on `thoughts/` (not `thoughts/test-agent-2/`), blocking all other agents.
490
-
491
- ### Test 3: Cross-agent reads ✅
492
- Worker-1 successfully read worker-2's file:
493
- ```bash
494
- # On worker-1:
495
- cat /workspace/shared/thoughts/test-agent-2/plans/test.txt
496
- # Result: hello from agent-2
497
- ```
498
-
499
- ### Test 4: Cross-agent writes blocked ✅
500
- Worker-1 correctly blocked from writing to worker-2's dir:
501
- ```bash
502
- echo "intruder" > /workspace/shared/thoughts/test-agent-2/plans/hack.txt
503
- # Result: bash: /workspace/shared/thoughts/test-agent-2/plans/hack.txt: Read-only file system
504
- ```
505
- **Error pattern confirmed: "Read-only file system"** (not EPERM or EACCES).
506
-
507
- ### Test 5: Unmount/remount/checkout fix ✅
508
- Worker-2 unmounted, remounted, then checked out only its subdir:
509
- ```bash
510
- archil unmount /workspace/shared
511
- archil mount --shared --region aws-eu-west-1 $ARCHIL_SHARED_DISK_NAME /workspace/shared
512
- archil checkout /workspace/shared/thoughts/test-agent-2
513
- archil checkout /workspace/shared/memory/test-agent-2
514
-
515
- archil delegations /workspace/shared
516
- # Result:
517
- # /workspace/shared/thoughts/test-agent-2 (Active) ← correct! subdir only
518
- # /workspace/shared/memory/test-agent-2 (Active)
519
- ```
520
- **Conclusion**: Unmounting releases ALL delegations. Checkout on existing subdirs grants delegation at the correct level.
521
-
522
- ### Test 6: Worker-1 mkdir after parent delegation released ✅
523
- With worker-2 no longer owning `thoughts/` (only `thoughts/test-agent-2`), worker-1 successfully created its subdir:
524
- ```bash
525
- # On worker-1 (after unmount/remount):
526
- mkdir -p /workspace/shared/thoughts/test-agent-1/plans
527
- # Result: exit 0 (success!)
528
-
529
- echo "hello from agent-1" > /workspace/shared/thoughts/test-agent-1/plans/my-plan.txt
530
- # Result: exit 0 (success!)
531
-
532
- archil checkout /workspace/shared/thoughts/test-agent-1
533
- # Result: exit 0
534
-
535
- archil delegations /workspace/shared
536
- # Result: /workspace/shared/thoughts/test-agent-1 (Active) ← correct!
537
- ```
538
-
539
- ### Test 7: archil checkout requires existing path ❌
540
- ```bash
541
- archil checkout /workspace/shared/thoughts/test-agent-2
542
- # Before dir exists: 'checkout' operation failed because path does not exist
543
- # After mkdir: exit 0 (success)
544
- ```
545
- **Conclusion**: `archil checkout` cannot create directories. Path must exist first.
546
-
547
- ### Summary of findings
548
-
549
- | Behavior | Result |
550
- |----------|--------|
551
- | Multiple checkouts per client | ✅ Works (6+ simultaneous) |
552
- | Cross-agent reads | ✅ Works perfectly |
553
- | Cross-agent write blocking | ✅ "Read-only file system" |
554
- | `mkdir` delegation level | ⚠️ First NEW parent level |
555
- | `checkout` on non-existent path | ❌ Fails |
556
- | Unmount releases all delegations | ✅ Works |
557
- | Unmount/remount/checkout narrows delegation | ✅ Works |
558
- | Concurrent subdir ownership | ✅ Works (when parent unowned) |
559
-
560
- **Key insight**: The API must pre-create top-level dirs and release ownership before workers boot. This ensures workers' `mkdir thoughts/$AGENT_ID` grants delegation at the subdir level (correct) instead of the parent level (broken).
561
-
562
- ---
563
-
564
- ## Review Errata
565
-
566
- _Reviewed: 2026-03-11 by Claude_
567
-
568
- ### Critical
569
-
570
- _(none remaining)_
571
-
572
- ### Important
573
-
574
- _(none remaining)_
575
-
576
- ### Resolved
577
-
578
- - [x] Missing `brainstorms/` subdirectory — added to both Archil and non-Archil blocks, desired end state, and boot flow
579
- - [x] Read-only access to other agents' dirs — clarified in entrypoint comment that `--shared` mounts provide automatic read access
580
- - [x] `ARCHIL_MOUNT_TOKEN` availability in hooks — confirmed: hooks run as subprocesses in the same container, env vars are inherited
581
- - [x] Line references verified — `hook.ts` lines corrected (473→860-864, 164→870)
582
- - [x] Phase 3 missing `pi-mono-extension.ts` — added to all Phase 3 change items
583
- - [x] Phase 1 checkout-vs-mkdir ambiguity — switched to `mkdir` first (auto-grants ownership), `checkout` as fallback
584
- - [x] Phase 4 grep sweep — expanded to include `templates/`, `docs-site/`, `README.md`, `MCP.md`
585
- - [x] Phase 3 PreToolUse vs PostToolUse — PreToolUse is now primary (proactive), PostToolUse is safety net
586
- - [x] Rollback notes — skipped per Taras: whole thing is a no-op in non-Archil case
587
- - [x] Overview said "PostToolUse hook guardrail" as primary — updated to describe PreToolUse as primary, PostToolUse as safety net (bot review #4)
588
- - [x] `misc/` directory not in research — added justification note in Current State Analysis (bot review #1)
589
- - [x] Phase 4 item 4 (`work-on-task.md:68`) had wrong change description — corrected: references `shared/memory/`, not `thoughts/shared/` (bot review #2, #5)
590
- - [x] Research open questions #2 (multiple checkouts) and #3 (read propagation delay) — added explicit validation steps to Phase 1 manual verification (bot review #3)
591
- - [x] Research open question #4 (AGENT_ID stability) — added orphaned directory note to "What We're NOT Doing" as explicit tech debt (bot review #3)
592
- - [x] **Parent delegation problem discovered via live testing** — `mkdir -p thoughts/$AGENT_ID/plans` auto-grants delegation on `thoughts/` (the parent), not `thoughts/$AGENT_ID`. Fix: two-phase boot — API pre-creates top-level dirs, workers create subdirs. See Appendix A.
593
- - [x] **Error pattern confirmed** — non-owned writes produce "Read-only file system" (not EPERM/EACCES). Phase 3 updated.
594
- - [x] **Research open questions #2 and #3 answered** — multiple checkouts per client: ✅ works. Read propagation: needs live test but reads confirmed working cross-agent.
595
-
596
- ---
597
-
598
- ## Local Test Results (2026-03-11)
599
-
600
- _Tested locally with Docker images `agent-swarm-api:1.41.0` and `agent-swarm-worker:1.41.0`._
601
-
602
- 1. **Single worker directory creation** — worker-alpha gets the exact expected structure:
603
- `shared/thoughts/worker-alpha/{plans,research,brainstorms}`, `shared/memory/worker-alpha/`,
604
- `shared/downloads/worker-alpha/slack/`, `shared/misc/worker-alpha/`
605
-
606
- 2. **Multi-agent isolation** — worker-alpha and worker-beta on the same shared volume create
607
- completely separate subdirectory trees with no overlap.
608
-
609
- 3. **API role behavior** — Correctly skips shared dir pre-creation when `ARCHIL_MOUNT_TOKEN` is
610
- absent (local dev path). Only pre-creates top-level dirs when Archil is active.
611
-
612
- 4. **`isOwnedSharedPath()` logic** — 9/9 test cases pass:
613
- - Owned paths (own agent's files) → true
614
- - Other agent's paths → false
615
- - Paths without category prefix → false
616
- - Directory itself without trailing slash → false (correct — agents write files, not dirs)
617
-
618
- 5. **Hook integration** — PreToolUse warns on Write/Edit to non-owned shared paths. PostToolUse
619
- catches "Read-only file system" as safety net. Both gated on `ARCHIL_MOUNT_TOKEN` (inactive locally).
620
-
621
- **Remaining**: Live Archil delegation test needs a Fly.io deploy to validate two-phase boot + cross-agent write blocking on actual Archil shared disk.