docs(design): agent mounts, one derived durable folder per agent#5215
docs(design): agent mounts, one derived durable folder per agent#5215mmabrouk wants to merge 4 commits into
Conversation
Design workspace for agent-scoped mounts: identity minted into the reserved mount slug from the workflow artifact id (JP's mechanism), no schema change, no wire change, no configuration. Context, research with code pointers, decisions D1-D4, four slices, six open questions for review. Claude-Session: https://claude.ai/code/session_01QHXdTFZjipBCPX3PkeWbh6
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
|
Important Review skippedDraft detected. Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Pro Plus Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
…t.md The env var alone is plumbing, not discovery: neither Pi nor Claude inspects env or lists the cwd parent unprompted, so the mount would sit unused until an instructions change ships. D3 gains two filesystem-borne signals, both cheap and idempotent: - an agent-files symlink inside the cwd pointing at the sibling mountpoint (listing the cwd is the one discovery action every harness performs; a symlink is a pointer, not the rejected nested FUSE mount) - a README.md seeded into the agent mount, write-if-absent, stating the persistence rule research.md records why the instructions file cannot carry the signal: for pi_core and claude the rendered AGENTS.md/CLAUDE.md is the author's text verbatim; only pi_agenta composes a platform preamble. Also records the geesefs-symlink-support verification task for slice 2. Claude-Session: https://claude.ai/code/session_01UogudBC9VRCRkpT5bZVxex
|
Pushed a review round from tonight's session with Mahmoud (55ba4f9): discovery is now part of D3. The env var alone is plumbing, not discovery — neither Pi nor Claude inspects
Open question 3 widens accordingly: |
|
Implementation up as a draft: #5247 (api + runner + web + docs). See its base note for the stacked-on-unmerged-work situation. |
Self-healing discovery symlink (geesefs drops symlinks across remount), the Daytona env-var delivery fix, live QA results (incl. Daytona verified), and a new open-issues log. Implementation is PR #5247. Claude-Session: https://claude.ai/code/session_01UogudBC9VRCRkpT5bZVxex
Rename the Mounts region to Storage and give it config-style inner sections like Triggers has: App drive (the agent's durable folder, #5215 — coming soon) and Session drive (per-conversation working folder, browsable from the session panel). 'Drive' over 'mount' — mounts name the mechanism, not the thing. Skeleton updated to match.
Today an agent has no storage of its own: every run's files live in the session's mount (or an ephemeral temp dir for sessionless runs) and are invisible to the agent's other conversations. After this project, every agent has one durable folder, mounted into all of its runs next to the session cwd, browsable from the frontend.
This PR is the design workspace, no code. It captures the mechanism JP settled in his voice note (2026-07-11) plus the review that sharpened it:
__ag__agent__<artifact_id>__default), upserted on the existingunique(project_id, slug)constraint,session_idstays NULL. No migration, no new column, no uniqueness machinery.runContext.workflow.artifact.id; it signs the agent mount best-effort and mounts it at<cwd>-agent, local and Daytona, exposing the path via one env var.POST /mounts/agents/sign(runner) andPOST /mounts/agents/query(frontend lookup; read never creates). The frontend reuses the existing mount file browser.How to review:
plan.mdis the document to comment on; it ends with six open questions (slug shape, endpoint placement, mount point constant, query semantics, frontend slice ownership, run-type coverage).context.mdholds the why and the rejected alternatives;research.mdthe code facts with file:line pointers.Depends on nothing; builds on the transcript-mounts pattern from #5197 (applied to the tree, unmerged), so the runner slice tracks that PR's final shape.
https://claude.ai/code/session_01QHXdTFZjipBCPX3PkeWbh6