§15 Agent Workspaces (Sandboxes on Operon)
Operon as the state plane for coding-agent sandboxes: Git on the bucket, copy-on-write environments, registry proxy, caches, sandbox runtimes, sessions as durable executions, MCP gateway with tool retrieval
Status: Approved (user) · 2026-09-24. Items marked (verify) are unconfirmed and are resolved in the W-phase plans. Amendments proposed 2026-10-01 by §36 Loam Git (D388–D390, D394, D398, D399) are marked inline; they await the owner because this document is approved.
Coding agents such as Claude Code and Codex run inside sandboxes: an isolated process or microVM, a checkout of a repository, installed dependencies and a network policy. The runtime (the VM or namespace jail) is compute. Everything else — code, branches, checkpoints, dependencies, caches, transcripts, memory — is state that must be fast to materialize, cheap to fork and must survive the sandbox. That is Operon's model: stateless compute over a bucket.
Operon is the state plane for sandboxes, not the sandbox runtime. It never executes agent code in its own processes.
1. What a coding-agent sandbox needs
| Need | Typical today | Operon piece |
|---|---|---|
| Isolation (process, microVM) | Firecracker, gVisor, bubblewrap, Landlock | Not Operon — integrate runtimes (§8) |
| Source checkout, a branch per agent, commits, diffs, rewind | GitHub + a full clone per sandbox | Repos: Git on the bucket, O(1) forks, partial clone (§3) |
| Dependencies and toolchains ready at start | Reinstall per sandbox, or a fat image per project | Environment images: content-addressed, lazily loaded, copy-on-write (§5) |
| Package downloads under egress control | Direct internet access, or a proxy allowlist | Registry proxy in the gateway (§6) |
| Build and test caches | Local, lost with the sandbox | Shared caches in the bucket (§7) |
| Crash recovery of a long run | Start over | Every session is a durable execution (§14) with workspace and session-state checkpoints (§9) |
| Search over code, docs and past runs | Separate vector DB + grep | Code-index links into collections and graphs (§4) |
| Transcripts, tool calls, token cost | Log files, vendor dashboards | Streams → tables (§9) |
| Tools for the agent | Ad-hoc MCP servers | Operon MCP server (§10) |
| Scoped credentials | Long-lived tokens in the sandbox | Credential vending per sandbox (§8) |
2. Principles
- State plane, not runtime. Operon stores and serves; sandbox runtimes execute.
- One writer per workspace; share by commit. Agents exchange work as commits and branches (the Git model), not through a shared POSIX filesystem. This removes distributed locking and cache coherence from the design.
- Immutable, content-addressed lower layers + a local writable upper layer. Code trees and environment images are immutable and deduplicated; each sandbox writes to a local copy-on-write layer. A fork is a new pointer, never a copy.
- Lazy and cached. Nothing is downloaded before it is read; every read goes through the node-local H1 cache (§04), so sandboxes on one host share it.
- Tenancy by namespace. Deduplication happens within a namespace. Cross-namespace sharing is only for a designated public-packages namespace, to avoid content-existence side channels.
3. Repos: Git on the bucket
Why Git: agents already know it from training data (git diff, branches, worktrees), Claude Code and Codex operate on Git repositories, and a commit is exactly the checkpoint an agent needs: a durable snapshot with identity, parent and message. Cloudflare Artifacts and Freestyle made the same bet for agent storage.
3.1 Layout
ns/<ns>/repos/<repo_id>/
refs # one canonical document: all refs, live packs, fork parent — replaced by conditional PUT
packs/<ulid>.pack # immutable packfiles (create-only)
packs/<ulid>.idx # pack index (+ .bitmap, .rev after repack)
commit-graph/<ulid> # built by repack- Refs are a CAS'd document, not metastore state. A deployment may hold tens of millions of repos (Cloudflare's stated target is tens of millions per namespace), and pushes are user data. The per-repo document pattern is the one the Resonate blob server uses (§14): one conditional PUT commits a ref transaction atomically.
Amended (proposed), D388–D390 (§36 §4): the single
refsdocument becomes a per-repository WAL of create-only segments (wal/<seq>.lgw, the commit point) plus checkpoints (checkpoints/<seq>.lgc) and aheadhint; a push's pack and index become one object,packs/<checksum>.lpk. A fork is a checkpoint 0 naming its parent and seq, still one PUT.
- Fork = a new
refsdocument naming its parent (superseded by D388: a checkpoint 0 naming the parent repository and seq). Reads fall through to the parent's packs (Git "alternates"), so a fork costs one PUT and no data copy. Per-agent forks or per-agent branches both work.
3.2 Protocol
- Smart HTTP, protocol v2, in the
gatewayrole, for stockgit, gitoxide, libgit2 and JGit clients. (D394, §36 §6.1: v2 upload-pack; receive-pack stays v0/v1 because v2 has no push; plans GT1–GT2.) - Push (receive-pack): stream the pack → verify it (index, connectivity, object limits) → PUT pack + idx (create-only) → CAS the
refsdocument with per-ref old-oid checks, fast-forward rules and branch protection (superseded by D389–D391, §36 §4.4 and §6.3: onepacks/<checksum>.lpkPUT, then the transaction joins the sequencer's next create-only WAL segment) → append a record to the repo's event stream → acknowledge. The event record is written after the commit, at least once, with a repair sweep, so links (§4) see every push. - Fetch/clone (upload-pack): negotiation uses the commit-graph cached on query nodes; existing packs are reused whole when the wants cover them, otherwise a pack is generated. Partial clone (
--filter=blob:none,tree:0) and shallow clones let sandboxes start with trees only and fetch blobs on demand. - Contention: pushes to one repo contend on its
refsdocument. Repo-affinity routing (§04) lets one node group-commit concurrent pushes, as Resonate does per origin. - Git LFS: batch API with objects in the namespace CAS (§5.2).
- Import and mirror: import from GitHub/GitLab, periodic sync, optional push-back of agent branches.
3.3 Maintenance
A worker task repacks small packs into larger ones with bitmaps and a commit-graph. GC runs by reachability across a fork family (a parent's packs stay while any fork references them), after the §03 §7 grace period.
3.4 Buy vs build
- gitoxide (
gix-pack,gix-protocol,gix-packetline,gix-hashwith SHA-1 and SHA-256,gix-commitgraph; Apache-2.0/MIT, very active) provides the object and pack machinery. Its own status page lists server-side upload-pack/receive-pack plumbing as not implemented, so Operon builds the server loop on gix primitives. That is the build part. - References:
git-remote-object-store(Apache-2.0, Rust:bundleandpackchainengines on S3/Azure with GC and compaction),awslabs/git-remote-s3(Apache-2.0, Python: bundles + LFS on S3), Cloudflare Artifacts (closed; a Zig/WASM Git server on Durable Objects + R2). - Later option — Jujutsu:
jj(Apache-2.0, Rust) has pluggable backends for commits, the operation log, op heads and the index (Google runs it against cloud storage).jjsnapshots the working copy on every command and keeps an undoable operation log, which suits agents. An Operon backend is Phase C.
4. Code intelligence: why this belongs in Operon
A Git host stores code; Operon also makes it searchable the moment it is pushed.
repo → collectionlink: each push event → changed blobs → tree-sitter (MIT) parse → chunks by symbol → Tantivy text +embed()vectors → a collection keyed by(repo, ref, path, symbol). The default branch and branches with open agent work are indexed.repo → graphlink: files, symbols, imports and calls as a graph, so "who callsparse_config" is onegraph_neighborscall (§07 §5.1).- Read-your-writes: a push returns a consistency token; an agent that pushes and then searches with that token sees its own change (§05 §5).
5. Environments: dependencies without reinstalling
5.1 The sandbox filesystem
/workspace upper: local NVMe (overlayfs) lower: repo tree @ commit (lazy, from Operon)
/env upper: local NVMe lower: environment image @ env_key (lazy, CAS)
/cache upper: local, written back async lower: namespace package caches (CAS)
/tmp local only- Fork = a new upper layer over the same lower layers: O(1), nothing copied.
- Checkpoint = the
/workspaceupper layer hashed into Git objects and committed to the agent's branch (§9). Only changed files are uploaded.
5.2 Environment images
- Key:
env_key = hash(lockfiles, toolchain versions, platform, setup script). Identical projects on identical lockfiles share one image. - Format: content-defined chunks (FastCDC, BLAKE3 digests) packed into 16–64 MiB pack objects with an index, plus a filesystem manifest. Small files are never one PUT each. This is the nydus RAFS model.
- Buy: nydus (Apache-2.0, Rust, CNCF Dragonfly): RAFS v6 images (EROFS-compatible), cross-layer chunk dedup, lazy fetch through FUSE, virtiofs or in-kernel EROFS + fscache. Operon stores the chunk packs and serves them through its cache; nydus builds and mounts images (verify that nydus's storage backend can point at Operon's bucket or cache endpoint).
- Build once: a sandbox that misses its
env_keytriggers an env build worker task that installs into a builder sandbox, converts the result to an image and publishes it. Concurrent misses on one key share one build through a metastore lease on the key. - Why lazy: a sandbox touches a small fraction of its environment at start. The SOCI paper (arXiv 2607.06868) reports 7.4–9.3× lower cold-start pull time for lazy loading versus full pulls, and Mintlify reports session creation dropping from about 46 s to about 100 ms with a virtual filesystem.
5.3 Package caches
Mount the namespace's caches for uv (UV_CACHE_DIR), pnpm (store-dir), Cargo (CARGO_HOME/registry), Go (GOMODCACHE) and pip wheels as a CAS-backed lower layer. New entries land in the local upper layer and are published back asynchronously; since entries are content-addressed, concurrent publishes cannot conflict. uv and pnpm already hardlink from a content-addressed store on one host; this extends the same store across hosts and past the sandbox's lifetime.
6. Registry proxy: egress control
- Read-through endpoints in the
gatewayrole for PyPI (simple API, PEP 503/691), npm, crates.io (sparse index), Go (GOPROXY). (D399, §36 §9: the crates.io mirror comes first, in GT3.) Artifacts are fetched from upstream once, stored immutably in the CAS and served from cache. - Policy: allowlists, version pinning, a quarantine window for newly published versions (supply-chain defense), and an audit record per download to a stream.
- A sandbox's network policy then needs only Operon and the model API. That matches how Claude Code's sandbox runtime (a proxy with a domain allowlist) and Codex (network off by default) already work.
- OCI images: run an existing registry (
distributionorzot, both Apache-2.0) with its S3 driver on the bucket instead of implementing OCI distribution.
7. Build and test caches
- sccache (Apache-2.0) has an S3 backend: point it at
ns/<ns>/cache/sccache/with vended credentials. No Operon code. (D398, §36 §8: keys become per repository and trust class,ns/<ns>/cache/sccache/<repo>/<class>/, and an optional gateway path over sccache's WebDAV backend adds metering, approximate LRU and server-enforced trust; plan GT3.) - Bazel / Buck2 / Pants:
bazel-remote(Apache-2.0) with its S3 backend now; Operon's own REAPI CAS + ActionCache on the namespace CAS is Phase C. - Turborepo / Nx remote-cache HTTP APIs: small, Phase B.
8. Sandbox runtimes: integrate, do not build
Coding agents need a full Linux userland (Node or Bun, Git, a shell, compilers), so the isolation unit is a microVM running an OCI image or, where KVM is unavailable, a user-space kernel. Function-level sandboxes (Hyperlight, WebAssembly) cannot host Claude Code, Codex or opencode.
| Runtime | License | Language | Isolation | Snapshot / fork | Needs | Role |
|---|---|---|---|---|---|---|
| microsandbox | Apache-2.0 | Rust (libkrun) | microVM per sandbox, OCI images | Snapshot, restore and fork of live sandboxes in core (2026-06) | KVM (Linux), Apple Silicon, WHP (Windows) | Default backend: embeddable SDK, no daemon, per-sandbox egress allowlists |
| Firecracker | Apache-2.0 | Rust | microVM | Memory + disk snapshots; restore with copy-on-write memory | KVM | Fleet backend for large hosts (the E2B model) |
| Cloud Hypervisor | Apache-2.0 / BSD-3 | Rust | microVM (virtiofs, hotplug) | Snapshot/restore | KVM | Alternative VMM |
| libkrun | Apache-2.0 | Rust | microVM library | via embedder | KVM / HVF | Under microsandbox |
| crosvm | BSD-3 | Rust | microVM (ChromeOS) | — | KVM | Reference |
| Kata Containers | Apache-2.0 | Rust (runtime-rs) | microVM per pod | — | KVM | Kubernetes RuntimeClass option |
| youki | Apache-2.0 | Rust | OCI containers (namespaces) | — | — | Not a security boundary for untrusted code alone |
| gVisor | Apache-2.0 | Go | User-space kernel | runsc checkpoint | Nothing (systrap) | Kubernetes backend without KVM |
| E2B | Apache-2.0 (infra) | Go | Firecracker | Yes | KVM | Managed or self-hosted provider adapter |
Anthropic sandbox-runtime | Apache-2.0 | TypeScript | bubblewrap / Seatbelt + network proxy | — | — | Laptop/dev mode; what Claude Code uses for its sandboxed bash tool |
| Codex CLI | Apache-2.0 | Rust | Landlock + seccomp | — | — | Laptop/dev mode; sandboxing on by default |
| Hyperlight | Apache-2.0 | Rust | micro-VM per function call | — | KVM / Hyper-V | Not suitable (no OS for agent harnesses) |
| Daytona | AGPL-3.0 | — | — | — | — | Avoid: license; open-source repo reported unmaintained (2026-06) |
Decision (proposed): operon-sandbox is a Rust crate with a Runtime trait and four backends, chosen per deployment:
| Backend | When |
|---|---|
microsandbox (default) | Single hosts, laptops (macOS/Linux/Windows), demos; fork of live sandboxes |
firecracker | Dense production fleets on KVM hosts; copy-on-write memory across restored snapshots |
gvisor | Kubernetes clusters without KVM or nested virtualization |
process (Landlock + seccomp, or bubblewrap) | Trusted local development only; never multi-tenant |
operon-sandbox is a small agent (sidecar or in-VM binary) that runtimes call with a spec:
repo = "ns/acme/repos/api" # fork or branch to work on
ref = "agent/run-8f2c"
env_key = "auto" # derived from lockfiles
caches = ["uv", "pnpm", "cargo"]
egress = "operon-only" # registry proxy + model API
token = "<vended, 1h, scoped to this repo branch, env read, cache write>"It mounts the layers (§5), points package managers at the proxy (§6), ships telemetry, and implements checkpoint, fork, suspend and resume. Adapters: microsandbox, E2B templates, Kubernetes pods. Inside microVMs, virtiofs or EROFS + fscache avoids needing FUSE privileges in pods (verify per runtime).
Credential vending: tokens are short-lived and scoped to (namespace, repo, branch prefix, env read, cache write, MCP tools), the way Lakekeeper vends table credentials (§10 §4).
VM memory snapshots (fork a running VM, as Morph's Infinibranch does) are a runtime feature. Operon can store Firecracker snapshot files (memory + disk diff) in the CAS with chunk dedup for suspend-to-bucket and resume-anywhere. Phase C.
9. Agent sessions: stored in Operon, run as durable executions
Every agent session is a Resonate durable execution (§14), and every session is stored in Operon. A crash of the sandbox, the host or the orchestrator never loses a session; it resumes mid-conversation on another host.
9.1 What a session is
| Part | Where it lives | Written when |
|---|---|---|
| Session workflow | Resonate origin session-<id> (ns/<ns>/durable/wf/…) | Every step transition |
| Workspace | Branch agent/<session> in an Operon repo (§3) | Every checkpoint |
Harness session state (~/.claude/projects/…/*.jsonl, ~/.codex/sessions/, ~/.local/share/opencode/opencode.db) | The /agent-home layer, checkpointed with the workspace as a tree in the namespace CAS | Every checkpoint |
| Session log (messages, tool calls, results, token usage) | Stream sessions (one partition key per session) → table agent_sessions + collection session_history | Continuously, from telemetry and from parsed session files |
| Traces and metrics | OTLP → streams → tables (§16 §6) | Continuously |
9.2 The session workflow
session(id, task): # a Resonate durable function
ws = ctx.run(fork_branch, task.repo, id) # step: create agent/<id>
env = ctx.run(resolve_env, task.repo) # step: env_key → image (build once)
turn = 0
loop:
r = ctx.run(agent_turn, id, turn, ws, env) # step: one harness turn in a sandbox
# value = {commit, home_tree, stop_reason, tokens, consistency_token}
if r.stop_reason in (done, failed, budget): break
if r.needs_human: ctx.promise("approve-"+id).await # durable human-in-the-loop wait
turn += 1
ctx.run(finish, id, r.commit) # push branch / open reviewagent_turnstarts (or reuses) a sandbox mounted at the previous step'scommitandhome_tree, runs the harness non-interactively in resume mode (claude -p --resume <session>,codex exec resume <session>,opencode run --session <session>; verify exact flags per version) for one turn or a bounded number of tool calls, then checkpoints and returns. Settled steps are never re-run on replay, so model calls already paid for are not repeated.- Crash recovery: if a sandbox or host dies mid-turn, the Resonate task lease expires, another worker acquires the task (fenced by its version), replays settled steps from their memoized values and re-runs only the interrupted turn from the last checkpoint.
- Fork and rewind: any settled step's
{commit, home_tree}is a restore point: fork N sessions from turn k to explore alternatives (tree-of-thought, parallel evals), each sharing every lower layer. - Human in the loop: approvals are durable promises; a session can wait days at no compute cost (no sandbox runs while it waits).
9.3 Storing sessions
- The
sessionsstream receives one record per message, tool call and turn result (from OTLP spans and events, and from the harness's session files parsed withtokscale-core, §16 §6). - A link keeps
agent_sessions(one row per turn: harness, model, tokens, cost, tools used, duration, outcome; a collection until M4 adds tables, then an Iceberg table) andsession_history, a collection over transcripts, so agents can search past sessions as memory (hybrid search, §05 §4). - Session files in
/agent-homeare the harness's own resume state; the stream is Operon's queryable copy. Both survive the sandbox. - Result: merge within the Operon repo, or push the branch to the GitHub mirror.
10. MCP: Operon's server and the MCP gateway
Target spec: MCP 2026-07-28, which makes the protocol stateless: no initialize handshake and no Mcp-Session-Id; every request carries its protocol version and client capabilities in _meta; server/discover advertises versions; Mcp-Method / Mcp-Name headers let gateways route without parsing JSON; list results carry ttlMs and cacheScope; server-initiated requests are replaced by multi-round-trip input_required results; long-running work uses the Tasks extension; OpenTelemetry context travels in _meta (traceparent).
10.1 Operon MCP server (W0)
- Tools:
search(hybrid over collections, including code, with graphexpandfrom M3),sql(includinggraph_expand),memory_write,repo_read/repo_diff/repo_logat a ref,session_search(past sessions). - Stateless by the spec, so any gateway node answers any request; OAuth maps to a namespace. Library: the official Rust MCP SDK (
rmcp; license and 2026-07-28 support to verify). - Small and immediately useful to every Claude Code, Codex and opencode user, so it is proposed for M1, independent of the rest of this document.
- Beside it is the CLI's stdio bootstrap server,
loam mcp serve(D289, §30 §12). It offers docs search, SDK snippets, stack status and creation, and.env.loamexport, and holds no data tools.loam mcp installregisters both servers in the agent's config (D290).
10.2 MCP gateway with tool retrieval (W1)
Agents with many MCP servers pay for every tool definition in every request. The gateway fronts all of a namespace's MCP servers and sends the model only the tool definitions a task needs.
- Catalog: the gateway reads
tools/listfrom each registered server (cached forttlMs) and upserts every tool into a collection (name, description, parameter names; BM25 + embedding) and a tool graph (a mapped graph, §07):PROVIDESedges from server to tool,REQUIRESedges from tool to tool (from schemas and docs, e.g.create_prneedspush_branch), and weightedCO_USEDedges between tools learned from session traces. - Retrieval (Graph RAG-Tool Fusion, arXiv 2502.07223): hybrid search over the catalog seeds candidates, a 1–2 hop expansion over
REQUIRES/CO_USEDadds their dependencies, and a rerank keeps the top k. One native Operon query with anexpandstage (§05 §4, §07 §5.2). - Delivery, spec-compliant: under 2026-07-28
tools/listmust not vary per connection, so the gateway exposes a fixed pair of meta-tools,find_tools(query, k)→ matching tool definitions, andcall_tool(name, arguments)→ validated against the tool's JSON Schema and proxied with the caller's credentials. Works with any client (Codex, opencode, Claude Code). - Clients with native deferral: Claude Code defers MCP tool definitions by default (
ENABLE_TOOL_SEARCH) and the Anthropic API offers a tool search tool withdefer_loading; the gateway can also serve the full catalog to them and let the client search. The demo compares both (§16). - Older servers: for servers on 2025-11-25 the gateway probes with
server/discover, holds the upstream session itself and presents a stateless face to agents. - Tracing: the gateway propagates
traceparentfrom_meta, so an agent's LLM span, the MCP call and the Operon query that served it share one trace.
11. Object layout additions
ns/<ns>/repos/<repo_id>/{refs, packs/, commit-graph/} # amended by D388–D390: {head, wal/, checkpoints/, packs/<checksum>.lpk, midx/, commit-graph/} (§36 §4.1)
ns/<ns>/cas/packs/<ulid>.{pack,idx} # chunks: env images, LFS, package caches, artifacts
ns/<ns>/envs/<env_key>/manifest # environment image manifest (nydus bootstrap)
ns/<ns>/cache/<tool>/… # sccache, bazel-remote, turboGC: reachability from refs documents (from D388: checkpoints within retention, §36 §7) and env manifests (env images retained by last use), cache entries by age (§03 §7).
12. Design targets (not measurements)
| Operation | Target |
|---|---|
| Fork a repo or workspace | One conditional PUT, or none (overlay only) |
| Sandbox start, warm env image, warm node cache | < 1 s to first command |
| Sandbox start, cold node | Manifest GETs + lazy reads of only what is touched |
| Checkpoint | Upload of changed files only, as one pack + one refs CAS |
| Small files | Never one object per file |
13. Phasing
| Phase | When | Scope | Exit gates |
|---|---|---|---|
| W0 | With M1 | Operon MCP server on the 2026-07-28 stateless spec | Claude Code, Codex and opencode use Operon tools over MCP |
| W1 | After M3 | Repos (smart HTTP v2, forks, partial clone, repack/GC, LFS, GitHub import); code-index links; credential vending; OTLP ingest of agent traces and metrics (OTLP logs ship in M2, D73); MCP gateway with graph-based tool retrieval; session workflows on Resonate with stored sessions (§9) | Client matrix (git, gitoxide, libgit2, JGit) passes clone/fetch/push/partial clone; 10k concurrent forks; Claude Code and Codex complete a task end to end with Operon as the remote |
| W2 | After W1 | operon-sandbox: Runtime trait with microsandbox, Firecracker, gVisor and process backends; lazy workspace mount, env images via nydus, package-cache layer, registry proxy (PyPI, npm, crates, Go), sccache wiring; the 100-agent fleet demo (§16), staged as α after M3 + W1 and β after M4 + W2 | Warm-env start target met; installs work with egress limited to Operon; kill a sandbox mid-task and resume on another host from the last checkpoint with an identical workspace |
| W3 | Phase C | jj backend, REAPI CAS/AC, VM snapshot storage, Turborepo/Nx caches | — |
14. Non-goals
- Not a sandbox runtime or VM host; no untrusted code in Operon processes.
- Not a distributed POSIX filesystem and no concurrent multi-writer workspaces. For shared POSIX datasets use JuiceFS (Apache-2.0) or Amazon S3 Files.
- Not a GitHub replacement: no pull-request UI, issues or CI (webhooks and mirroring only).
- Not a secrets manager.
15. Alternatives considered
| Option | License | Verdict |
|---|---|---|
| AgentFS (Turso) | MIT (Rust) | SQLite-backed copy-on-write overlay + KV + tool-call audit. Its object-storage ("disaggregated") version is described by its author as "a direction, not a finished system". Reference; possible upper-layer format |
| Amazon S3 Files | AWS service (GA 2026-04) | NFS mount of a bucket with "stage and commit" roughly every 60 s. AWS-only, no forks or versions; complementary |
| JuiceFS | Apache-2.0 (Go) | POSIX on S3 with a separate metadata engine and clone; heavy and unversioned for per-agent workspaces |
| mountpoint-s3 | Apache-2.0 (Rust) | Key-per-file mapping, read-mostly; reference for FUSE-on-S3 performance |
| Cloudflare Artifacts, Freestyle Git | Closed | Validate "Git as the agent filesystem"; references |
| aggit | MIT (Rust) | Small S3-backed, Git-versioned store for agents; reference |
| ZeroFS | AGPL-3.0 | Avoid (license) |
| Daytona | AGPL-3.0 | Avoid (license, maintenance) |
16. Open questions
- Scope of the Git server Operon must build on gitoxide (protocol v2 only? v0/v1 for old clients?). Proposed answer (D394, §36 §6.1): v2 upload-pack, v0/v1 receive-pack, v0 upload-pack only if a W1 matrix client lacks v2 (Q387).
- Whether nydus can read chunks through
object_storeor needs an S3-compatible endpoint on Operon's cache. - FUSE vs virtiofs vs EROFS + fscache per runtime, and privileges in Kubernetes pods.
- A cross-ecosystem definition of
env_key(lockfile sets, native build steps, CPU architecture). - Cross-namespace dedup policy for public packages.
- Rust MCP SDK license; OpenTelemetry coverage in Claude Code and Codex.
- Whether repos become a sixth object kind (with an implicit stream) or stay a service like durable execution. Proposed answer (D388, §36): a service with its own bucket WAL, its events mirrored into the
_gitstream.
§14 Durable Execution (Resonate Protocol)
Resonate protocol surface: durable promises, tasks and schedules on the bucket; phases, consistency, cost
§16 Demo: 100 Coding Agents on Operon
100 Claude Code / Codex / opencode sessions on one host and one bucket: density, durability, tool-retrieval savings, analytics with tokscale parity