Cloud computer scale architecture audit
Date: 2026-08-22
Status: Architecture recommendation
Tracking issue: #34, Assess Cloudflare Computer patterns for OpenAgents cloud computers
Executive decision
OpenAgents should let one chat own 10–30 logical computers, but it should not create 10–30 Google Compute Engine (GCE) virtual machines when the chat starts. A logical computer must be a durable workspace and policy record. Compute must be a temporary, metered runtime lease that OpenAgents allocates only while work runs.
OpenAgents already has most of the necessary control-plane concepts across two repositories:
openagents.comowns conversations, text and voice parity, authority snapshots, budgets, durablework_jobs, progress projection, and reports.- The private
openagentsmonorepo owns managed-sandbox lifecycle contracts, Google Cloud provisioning, capacity policy, checkpoint concepts, execution receipts, and an Agent Computer Firecracker implementation.
OpenAgents should connect these systems through one provider-neutral cloud-computer API. It should not build a third computer scheduler inside Phoenix.
The runtime recommendation has two tracks:
- Make a hardened, pooled Firecracker provider on dedicated nested-virtualization GCE hosts the strong-isolation target for arbitrary repositories and tools. Reuse the existing Firecracker code, but do not expose it to multi-tenant fan-out until it runs under
jaileror an equivalent containment layer, enforces cgroups and egress policy, uses copy-on-write images, and passes host-loss and residue tests. - Qualify GKE Agent Sandbox as the standard-density provider. Its gVisor isolation,
SandboxClaim, warm-pool, and snapshot patterns match chat fan-out well and remove part of the custom host scheduler burden. However, the current Google interface usesgcloud beta,v1alpha1custom resources, and GKE 1.35.2 or later. OpenAgents should not make it the only production provider until it passes the same acceptance suite as Firecracker.
Keep the existing one-GCE-VM-per-managed-sandbox provider as a low-concurrency fallback and forensic isolation class. It is not the fan-out provider.
Cloudflare Computer provides useful workspace, synchronization, lifecycle, and routing patterns. OpenAgents should adopt those semantics, not Cloudflare's Durable Object, SQLite, FUSE, container, or Cap'n Web implementation.
Audit scope and evidence
This audit answers the following question:
If one ordinary chat can request 10, 15, 20, or 30 computers, how should OpenAgents provide those computers without coupling chat fan-out to GCE instance count, exhausting shared quota, weakening isolation, or creating a second orchestration system?
The audit inspected these snapshots:
openagents.comat7b2253af8534cc0bd68b46c16268dd95680d1f32.- The private
OpenAgentsInc/openagentsmonorepo at local committed revision3c9a714ed30aaf10a885c963b0a88b01d85b5bc3. The working tree contained unrelated local state, so this audit made no changes there and makes no deployment claim for that revision. - Cloudflare Computer at
de87919a4fd37242e960e13b7b3ba802d1eef0a0. - Read-only Google Cloud resource and quota observations for the production project on 2026-08-22.
- Current Google Cloud documentation linked in Sources.
The audit treats documentation in Cloudflare Computer as directional when the repository labels a feature unimplemented or forward-looking. It distinguishes those descriptions from behavior present in source.
What OpenAgents has now
The Phoenix control plane
openagents.com already has the durable work authority that a cloud computer needs:
OpenAgents.Work.Jobstores the conversation and owner, text or voice surface, work kind, immutable authority and budget snapshots, lifecycle state, usage, owner node, and generation fence inwork_jobs(lib/openagents/work/job.ex).OpenAgents.ComputerAgentJobsgives connected customer machines one owner-scoped entry point. Both the model tool and API use it, which prevents text, voice, and API authorization from drifting (lib/openagents/computer_agent_jobs.ex).- The work supervisor can relocate durable jobs after node loss. Progress projections do not replace the durable job record.
- The SCV path already models work that runs on OpenAgents capacity. It creates a disposable workspace and runs a bounded coding process, but the current runner is local to the Phoenix host and an interrupted SCV cannot reattach (
lib/openagents/work/scv_server.ex,lib/openagents/scv/workspace.ex, andlib/openagents/scv/run.ex).
These primitives should remain the user-facing admission and reporting path. Text and voice must call the same cloud-computer service and persist the same authority, budget, target, and usage data. The surface field may affect presentation; it must not select a different backend or policy.
The managed-sandbox control plane
The private openagents monorepo already contains a provider-neutral managed-sandbox contract and a live GCE provider (crates/oa-codex-control/src/managed_sandbox_runtime.rs). It includes:
- Owner, tenant, work-unit, sandbox, generation, profile, budget, capability, and time-to-live bindings.
- Capacity policy with maximum and concurrent capacity.
- A durable local provider journal written before provider effects.
- Deterministic resource references and idempotent request fingerprints.
- Readiness, stop, cleanup, checkpoint, and forensic residue concepts.
- Network rules that deny general ingress and egress while admitting narrowly scoped control traffic.
- A production path that creates a dedicated GCE instance, disk, and firewall set for each sandbox.
The current provisioning profile uses e2-small and caps concurrent managed sandboxes at two (scripts/cloud/provision-managed-sandbox-runtime.sh). That profile offers a clear isolation boundary for private preview work. It cannot serve 15 concurrent computers efficiently because every computer consumes an instance, regional CPU quota, persistent-disk operations, firewall operations, startup latency, and cleanup work.
The provider currently counts active resources by listing GCE instances. A high-fan-out scheduler needs transactional reservations in its own database and a reconciler against Google Cloud. Enumerating cloud resources during admission cannot prevent concurrent over-allocation reliably.
The Agent Computer Firecracker path
The private monorepo also has a live Firecracker provisioner (crates/oa-codex-control/src/cloud_vm.rs). It gives each run a deterministic virtual-machine reference, a copied root filesystem, a TAP device and subnet, a vsock channel, and targeted teardown.
The implementation is a useful starting point, but it is not a dense multi-tenant pool yet:
- Each guest reserves 4 vCPUs and 8 GiB of memory. Fifteen simultaneous guests require 60 vCPUs and 120 GiB before host overhead. Thirty require 120 vCPUs and 240 GiB.
- The observed live Agent Computer host is an
n2-standard-4instance. It cannot host the requested fan-out. - Provisioning copies the complete writable root filesystem for every run instead of using a shared read-only base plus a copy-on-write overlay.
- The code launches Firecracker directly. Its own comment states
NOT jailer. The surrounding architecture materials describe jailer, seccomp, cgroup, and chroot containment, but the live launch path does not provide that boundary. - The guest network receives general network-address-translation egress in the inspected path. Multi-tenant production needs a default-deny egress broker and metadata protection that the runtime cannot bypass.
OpenAgents should close these gaps before it raises concurrency. MicroVMs reduce the blast radius of an untrusted guest kernel, but they do not replace host process containment, resource controls, network policy, or a cleanup proof.
Current Google Cloud headroom
The 2026-08-22 read-only quota snapshot for us-central1 showed:
| Quota | Limit | Observed use |
|---|---|---|
| Regional CPUs | 3,000 | 105 |
| N2 CPUs | 3,000 | 44 |
| VM instances | 6,000 | 35 |
| In-use IP addresses | 575 | 16 |
| Persistent disk capacity | 102,400 GiB | 120 GiB |
| SSD persistent disk capacity | 40,960 GiB | 4,310 GiB |
| Snapshots | 10,000 | 31 |
This snapshot shows enough quota for a controlled pilot. It does not justify direct allocation from chat requests:
- Google states that quota does not guarantee zonal or regional resource availability.
- The project already runs production, staging, GKE, control, and sandbox workloads. Cloud computers share failure and quota domains with them.
- One chat that requests 30 one-vCPU VMs converts one user action into 30 instance creates, 30 disks, 30 cleanup paths, and multiple control-plane API calls.
- A stopped GCE VM still consumes the VM instance quota. A logical computer cannot be represented by a stopped VM if OpenAgents expects large cold fleets.
- Nested virtualization needs supported machine families such as N2. E2 does not support the Firecracker host role.
- Google documents a 10% or greater CPU performance penalty for nested virtualization, with workload-dependent input/output overhead. Capacity and cost tests must measure the outer host and the guests together.
Quota must cap an internal reservation system. It must not serve as that reservation system.
What Cloudflare Computer gets right
Cloudflare Computer separates a durable Workspace from execution backends. A Durable Object and SQLite-backed virtual file system hold authoritative workspace state. A container or worker backend connects lazily when execution needs it. The container runs computerd, mounts or mirrors workspace state, executes commands, emits sequenced events, and synchronizes changes back.
The following implemented patterns transfer well to OpenAgents:
- One workspace API over multiple backends. Callers use one runtime interface, while server policy selects a container, shell, or module backend. Cloudflare's documentation correctly states that backend selection is routing, not authorization.
- Durable authority outside the runtime. A container can disappear without becoming the owner of durable files or execution identity.
- Lazy runtime allocation. Reading metadata or inspecting a cold workspace does not require a running container.
- Reverse connection from runtime to control plane. The runtime dials the owner with a workspace-scoped secret. This avoids opening a general inbound administration surface.
- A synchronization bracket. Command execution follows
push -> spawn -> events/result -> pull. - Idempotent synchronization and explicit command ambiguity. Cloudflare retries synchronization safely. If the transport fails after a command may have started, it does not replay the command automatically.
- Runtime generation fences. Execution identifiers remain bound to the runtime process that accepted them. A replacement runtime cannot accidentally accept an operation intended for its predecessor.
- Sequenced, retained events. Callers can reattach, observe bounded output, cancel, and dispose execution handles.
- Replace broken sessions. A dead transport invalidates the backend connection instead of leaving a partially trusted channel in service.
- Measured filesystem tradeoffs. The repository publishes benchmark data instead of assuming that a durable virtual file system performs like local disk.
These semantics match OpenAgents' existing work_jobs, generation fences, durable reports, and event projections.
What OpenAgents should not copy
OpenAgents should not copy these Cloudflare-specific choices:
- Durable Object and SQLite workspace authority. OpenAgents already uses PostgreSQL for durable control state and Google Cloud Storage (GCS) for artifacts and checkpoints. Adding a separate database authority per computer would split operations and recovery.
- A database-backed FUSE tree for all workload data. Cloudflare's own benchmark reports a full
npm installat 124.7 seconds on its workspace mount, compared with 63.9 seconds on container ext4 and 34.3 seconds ontmpfs. Its 64 MiB sequential copy and read cases are tens of times slower than local filesystems. OpenAgents should restore a checkpoint to local disk, run against local disk, and checkpoint changed data back to GCS. - One durable owner object paired to one container. At OpenAgents' requested scale, one chat may hold 30 logical computers while only a subset runs. Durable ownership and runtime allocation must have independent cardinality.
- Cloudflare's wire stack. Cap'n Web and Cloudflare bindings solve Cloudflare deployment concerns. OpenAgents can preserve the protocol semantics over its existing authenticated control service, WebSocket, or HTTP streaming transports.
- Preview features as production dependencies. Cloudflare labels mount sources as unimplemented and hibernation behavior as forward-looking in the inspected snapshot. OpenAgents should require source and acceptance evidence before relying on either behavior.
Pattern decisions
| Cloudflare pattern | Decision | OpenAgents implementation |
|---|---|---|
| Durable workspace separated from runtime | Adopt | PostgreSQL workspace record plus GCS checkpoints and content manifests |
| One runtime API over backends | Adopt | Provider-neutral managed-sandbox API called by Phoenix |
| Backend routing is not authorization | Adopt | Resolve the runtime class after authority, budget, and policy admission |
| Lazy backend connection | Adopt | Create a runtime lease only for active execution or an explicit warm request |
| Reverse-dial control channel | Adopt | Runtime receives a short-lived, generation-bound credential and dials the control plane |
| Revisioned push and pull | Adapt | Restore a checkpoint to local disk, record a start watermark, and upload an incremental terminal checkpoint |
| Idempotent sync, no blind command replay | Adopt | Give each command an idempotency key and explicit not_dispatched, may_have_started, and terminal outcomes |
| Runtime UUID and event sequence fences | Adopt | Bind every command and event stream to workspace_id, lease_id, and generation |
| Retained execution events | Adopt | Persist bounded event metadata and artifact references; project live events through Phoenix PubSub |
| Database-backed FUSE as the work disk | Reject | Use local ext4 or equivalent copy-on-write storage while the runtime is active |
| One workspace owner per running container | Reject | Allow many cold logical workspaces and a smaller set of active leases |
| Cloudflare-specific storage and RPC | Reject | Keep PostgreSQL, GCS, Req, and the existing OpenAgents control service |
Runtime options
| Runtime | Isolation | Fan-out fit | Operational cost | Recommendation |
|---|---|---|---|---|
| One GCE VM per computer | Strong VM boundary | Poor. Instance, disk, firewall, startup, and cleanup costs scale linearly with computers. | High | Keep for low-concurrency forensic or strong-isolation work. Do not use as the default. |
| Firecracker on dedicated GCE hosts | MicroVM kernel boundary with high density after hardening | Strong after the scheduler, images, network, and host isolation support density. | Medium to high because OpenAgents owns hosts and the microVM control plane. | Use as the strong-isolation target. Harden the existing implementation before multi-tenant use. |
| GKE Sandbox and GKE Agent Sandbox | gVisor user-space kernel boundary | Strong scheduling model. Claims and warm pools map well to 10–30 logical computers. | Medium. GKE handles placement, but the Agent Sandbox surface is new. | Run a qualification track and use it for the standard class if it passes. Keep a second provider until the interface matures. |
| Cloud Run jobs | Container boundary for finite tasks | Good for one-shot parallel tasks, not retained interactive computers. | Low to medium | Use for bounded SCV-style jobs that need no listener or reattachment. Do not present a job as a computer. |
| Containers on Phoenix application nodes | Shared host kernel and secrets | Poor risk boundary and competes with the web fleet. | Low initial effort, high incident risk | Do not use. |
| Customer-connected computers | Customer-controlled isolation and capacity | Does not consume OpenAgents quota, but availability depends on the customer. | Low OpenAgents compute cost | Keep as an explicit user-selected target. Do not silently fall back to it. |
Recommended runtime classes
Expose product-oriented profiles instead of provider names:
standard: starts with 1–2 vCPUs and 2–4 GiB, local copy-on-write scratch, controlled network access, and a bounded lifetime. Qualify GKE Agent Sandbox and Firecracker against the same contract.strong: hardened Firecracker or dedicated GCE, selected for arbitrary native code, higher-risk tools, or stronger isolation requirements.batch: a one-shot Cloud Run or SCV execution with no promise of an interactive retained runtime.
Do not expose gce_vm, firecracker, gvisor, or a region as chat tool choices. Policy and capacity should select providers after admission. Store the resolved provider and image digest in receipts.
The logical computer model
A logical computer should survive runtime loss and spend no compute while cold. Its durable record needs at least:
id,owner_id,conversation_id, and a user-visible label.state:cold,queued,starting,active,stopping,failed, ordestroyed.generation, currentruntime_lease_id, and last accepted event sequence.- Runtime profile, capability set, network policy, authority snapshot, and budget snapshot.
- Current checkpoint reference, checkpoint digest, base image digest, and workspace revision.
- Creation, last-use, idle-expiry, maximum-lifetime, and destruction timestamps.
- Accumulated vCPU-seconds, memory-GiB-seconds, storage byte-hours, network bytes, and provider operations.
A separate runtime-lease record should contain:
- Provider, region, zone or cluster, host or sandbox reference, and generation.
- Reserved vCPU, memory, scratch capacity, and network class.
- Reservation, start, readiness, heartbeat, expiry, release, and cleanup timestamps.
- A short-lived credential digest and runtime attestation or readiness evidence.
- Terminal disposition and zero-residue evidence.
Commands need their own durable identity. A command record should distinguish:
- Admitted but not dispatched.
- Dispatched with an acknowledgement.
- Transport lost and command may have started.
- Running with a last accepted sequence.
- Completed, failed, cancelled, timed out, or lost.
This distinction prevents a controller restart from rerunning a destructive command.
Capacity and quota model
Separate inventory from concurrency
For a request to create 15 computers, OpenAgents should create 15 logical workspace records immediately. It should activate only the number admitted by the chat, tenant, and global concurrency budgets. The remaining computers stay cold or queued and show that state in chat.
A conservative private-preview policy could start with:
- 30 logical computers per chat.
- Four active
standardruntimes per chat by default. - Eight active runtimes for an explicitly admitted high-fan-out operation.
- Two active
strongruntimes per chat until density and isolation evidence supports more. - A small global warm pool, such as two to four runtimes per active region, instead of a warm pool for each chat.
These are initial safety limits, not product promises. Load tests and observed queue time should set later values.
Admit through hierarchical reservations
One serializable admission transaction should reserve capacity across these scopes:
- Command and runtime profile.
- Logical computer.
- Conversation.
- User and tenant.
- Provider class and region.
- Global OpenAgents safety limit.
The scheduler should use its own reservation rows and database locks. A reconciler should compare those reservations with provider state, recover leaked leases, and fail closed when quota observations become stale.
Calculate an effective provider limit as the minimum of:
- The configured safety ceiling.
- Observed provider quota minus reserved headroom.
- Host, cluster, or regional allocatable capacity.
- Budget and rate limits.
- Any temporary incident or drain limit.
Reserve at least 25% of the observed quota or configured provider ceiling for the existing application, cleanup, replacements, and operational recovery. OpenAgents should set a lower fixed ceiling during private preview even when the Google quota is much larger.
Use realistic profiles
The current Firecracker profile allocates 4 vCPUs and 8 GiB per computer:
| Active computers | Guest vCPUs | Guest memory |
|---|---|---|
| 4 | 16 | 32 GiB |
| 15 | 60 | 120 GiB |
| 30 | 120 | 240 GiB |
A 1-vCPU, 2-GiB standard profile changes the same planning envelope to 15 vCPUs and 30 GiB for 15 active computers, or 30 vCPUs and 60 GiB for 30. Host overhead, checkpoint traffic, image caches, and warm capacity remain additional.
OpenAgents must benchmark real coding workloads before changing the profile. The purpose of the smaller profile is to define the fan-out question accurately, not to assume that every workload fits.
Control start storms
When a chat requests 15 simultaneous starts, the scheduler should:
- Reserve the admitted bundle atomically.
- Start runtimes through a bounded worker pool.
- Apply jitter and provider operation limits.
- Stream per-computer queue and readiness state.
- Release unused reservations if any start fails or exceeds its deadline.
- Continue admitting queued computers fairly instead of letting one chat consume every free slot.
Use weighted fair queuing across tenants and conversations. Do not let a large chat block cleanup, health probes, or production application recovery.
Recommended architecture
Chat tool or API
|
v
Phoenix admission service
- owner and conversation scope
- text/voice-neutral policy
- authority and budget snapshot
- durable work job
|
v
Cloud-computer control adapter
|
v
Managed-sandbox control plane
- logical workspace
- quota and capacity reservation
- provider routing
- lease and generation fence
- command and event journal
|
+---------------------+----------------------+------------------+
| | | |
v v v v
Firecracker pool GKE Agent Sandbox Dedicated GCE Cloud Run job
strong class standard candidate forensic class batch class
| | | |
+---------------------+----------------------+------------------+
|
v
Local runtime filesystem
|
checkpoints and artifacts
|
v
GCS + PostgreSQL
Phoenix should use Req to call the managed-sandbox control service. That adapter should expose create, list, start, execute, attach, cancel, stop, checkpoint, restore, fork, and destroy operations. It should return stable OpenAgents references and typed errors instead of provider responses.
The Phoenix tool family should operate on logical computers:
computer_createcomputer_listcomputer_runcomputer_stopcomputer_destroy
The existing connected-computer tools can share names only if each call includes an explicit target reference and the server resolves the target type. Never infer “customer machine” versus “OpenAgents cloud computer” from text versus voice or from which route received the request.
Workspace and checkpoint design
Use PostgreSQL for control metadata and GCS for workspace checkpoints and large artifacts. A runtime should:
- Boot from a pinned, signed base image.
- Restore the current checkpoint into local copy-on-write storage.
- Run tools against the local filesystem.
- Upload an incremental, content-addressed checkpoint at explicit boundaries and at bounded intervals.
- Commit the new checkpoint reference with a generation compare-and-swap.
- Retain the previous checkpoint until the new checkpoint passes integrity checks.
Do not mount the full dependency tree from a remote database-backed filesystem. Cache base images, toolchains, and common dependency layers on the host or cluster. Keep secrets outside checkpoints. A restored runtime must receive new short-lived credentials.
A checkpoint can support stop, resume, fork, host replacement, and post-incident analysis. It does not make in-flight command replay safe. The command journal still needs an explicit ambiguity state.
Security requirements before fan-out
The pooled providers must pass these gates before OpenAgents enables multi-tenant use:
- Run Firecracker under
jaileror a documented equivalent with namespaces, cgroups, seccomp, a read-only host view, dedicated runtime users, and bounded device access. - Enforce hard CPU, memory, process, file-descriptor, scratch, network, and wall-clock limits per lease.
- Block the Google metadata service from guests unless a narrowly scoped broker provides a required capability. Never pass a host service-account identity into a guest.
- Default-deny egress. Route allowed source control, package, model, and OpenAgents control traffic through an observable policy broker.
- Give each lease a generation-bound, short-lived credential. Remove bootstrap secrets from the environment after the runtime connects.
- Keep runtime hosts separate from Phoenix, databases, control credentials, and customer-connected-computer controllers.
- Prove teardown removes processes, TAP devices, mounts, overlays, cgroups, credentials, temporary firewall state, and scratch data.
- Drain and replace a host after repeated isolation or cleanup failures.
- Encrypt checkpoints with a workspace-scoped key and enforce owner and tenant scope on every restore and fork.
- Record image, kernel, runtime, policy, and checkpoint digests in an operator-visible receipt.
GKE Agent Sandbox must meet the same contract. gVisor reduces host-kernel exposure, but OpenAgents must still use non-root containers, drop Linux capabilities, prevent service-account token mounts, set resource limits, forbid privileged and host namespaces, and restrict network access.
Failure and recovery contract
The control plane should define these outcomes before implementation:
- Controller restarts before dispatch: Resume the command from the durable admitted record.
- Controller loses the acknowledgement after dispatch: Mark the command
may_have_started. Reattach by command and runtime identity; do not start a replacement command automatically. - Runtime transport fails: Invalidate the connection. Reconnect only to the same runtime generation; otherwise report the execution as lost.
- Runtime dies between checkpoints: Restore the last committed checkpoint in a new generation. Report any uncheckpointed file loss.
- Host dies: Reconcile all leases on the host, release reservations only after provider evidence, and restore eligible workspaces elsewhere.
- Checkpoint upload succeeds but database commit fails: Reuse the content-addressed object on retry and commit it with a generation check.
- Database commit succeeds but acknowledgement is lost: Return the already-committed checkpoint or command result by idempotency key.
- Quota or capacity observation is stale: Queue new work and preserve cleanup capacity.
- Budget expires: Stop the command, take a bounded terminal checkpoint if policy allows, and release the lease.
- Cleanup cannot prove zero residue: Quarantine the host or sandbox resource and open an incident. Do not return that capacity to the pool.
Implementation plan
Phase 0: Consolidate contracts
- Define one
cloud_computer.v1contract in the private control plane for logical workspaces, leases, commands, events, checkpoints, and receipts. - Reuse the managed-sandbox ownership, budget, capability, TTL, generation, and cleanup concepts.
- Add a provider interface that can represent dedicated GCE, pooled Firecracker, GKE Agent Sandbox, and Cloud Run batch work.
- Replace provider-side instance enumeration as the admission authority with durable reservations and a reconciler.
Phase 1: Connect Phoenix
- Add a cloud-computer target to the existing Work path instead of creating a parallel job system.
- Add logical-computer and runtime-lease records or stable references that
work_jobscan own. - Implement one
Reqclient and one service entry point used by text, voice, tools, and API routes. - Project bounded live events through the existing conversation activity path and persist terminal reports and usage.
- Keep cloud-computer tools disabled until the runtime acceptance gates pass.
Phase 2: Harden the Firecracker pool
- Replace direct Firecracker launch with
jaileror an equivalent documented boundary. - Add cgroup, namespace, process, storage, and network enforcement.
- Replace full root-filesystem copies with immutable base images and copy-on-write overlays.
- Add a host agent that reports allocatable capacity, health, active leases, image-cache state, and cleanup evidence.
- Add a small global warm pool and deadline-bound startup.
- Run hosts in a dedicated managed instance group with drain, replacement, and zone-spread behavior.
Phase 3: Qualify GKE Agent Sandbox
- Create a private test cluster or node pool on the required GKE version.
- Implement the same provider contract with
SandboxTemplate,SandboxWarmPool,SandboxClaim, andSandboxresources. - Test tool compatibility, startup time, checkpoint behavior, network policy, observability, and cleanup.
- Treat memory-and-filesystem snapshot support as experimental until the GKE add-on owns the documented snapshot controller path. The current documentation describes a manual controller installation as a temporary step.
- Compare cost, operator work, density, and incident recovery with the hardened Firecracker provider.
- Promote it to
standardonly if it passes and keep provider fallback explicit.
Phase 4: Raise fan-out in evidence-backed steps
- Start with two active cloud computers per chat.
- Qualify four, eight, fifteen, and thirty logical computers, while increasing active concurrency separately.
- Record startup, queue, execution, checkpoint, restore, and cleanup percentiles for each profile.
- Raise limits only after quota, fairness, isolation, and residue reports pass at the next level.
Acceptance suite
Before a chat can activate 15 computers, require one exact-candidate report that covers:
- 30 logical computers in one chat with no compute allocated while all are cold.
- 15 concurrent standard runtimes with bounded startup and no provider API storm.
- Fair scheduling when multiple chats request the same fan-out.
- Controller restart before dispatch, after dispatch, during streaming, and during checkpoint commit.
- One runtime crash and one complete host loss.
- Reattachment without duplicate commands or cross-generation event delivery.
- Default-deny egress, metadata denial, and scoped broker access.
- Cross-tenant filesystem, process, network, credential, and checkpoint isolation tests.
- CPU, memory, process, disk, time, and network exhaustion tests.
- Cleanup and zero-residue evidence after success, failure, cancellation, timeout, and host drain.
- Quota saturation with reserved cleanup and production headroom intact.
- Text and voice requests producing the same backend admission, authority, budget, receipts, and outcomes.
- Billing and usage totals matching provider observations within a documented tolerance.
Track at least these service-level indicators:
- Queue time and cold-start time by runtime class.
- Active, cold, queued, failed, leaked, and quarantined computers.
- Host allocatable and reserved CPU, memory, and scratch capacity.
- Quota age, safety headroom, and denied admissions.
- Command ambiguity, duplicate-dispatch prevention, and reattachment rates.
- Checkpoint duration, bytes, restore duration, and integrity failures.
- Cleanup duration and zero-residue failures.
- Runtime cost per active minute and per completed job.
Direct answers
Should OpenAgents use Cloudflare Computer's patterns?
Yes. Adopt its separation of durable workspace from runtime, one provider-neutral execution API, lazy runtime allocation, reverse-dial control, generation fences, sequenced events, idempotent synchronization, and explicit no-replay boundary.
Do not copy its Durable Object, SQLite, FUSE, Cap'n Web, or one-owner-to-one-container implementation. Those choices fit Cloudflare's platform and do not solve OpenAgents' Google Cloud quota and shared-infrastructure constraints.
Should OpenAgents use microVMs?
Yes, for the strong isolation class and arbitrary user code. The existing Firecracker path makes this an extension of current work. It needs security and density changes before multi-tenant production.
MicroVMs should not become the product model. A computer remains a logical workspace, and the scheduler can lease a Firecracker microVM, a GKE sandbox, a dedicated GCE VM, or a batch runtime based on policy.
Can one chat have 15 computers?
Yes. Create 15 logical computers, then admit a bounded number of active runtime leases. A normal chat should start with four active leases, while an explicitly budgeted high-fan-out operation can request more. The UI and chat transcript should show cold, queued, starting, active, and terminal states.
Can one chat have 30 active computers?
The architecture supports it, but current infrastructure does not qualify it. The present one-GCE-per-sandbox profile caps at two, and the observed Firecracker host cannot run the existing 4-vCPU, 8-GiB guest profile at that density. OpenAgents must complete the pooled-provider, quota-broker, isolation, and load-test work first.
What should OpenAgents build next?
Build the provider-neutral logical-computer and lease contract, then connect Phoenix to the existing managed-sandbox control plane. Harden the existing Firecracker provider and qualify GKE Agent Sandbox behind the same interface. Do not add another direct GCE provisioning path to openagents.com.
Sources
OpenAgents source
openagents.com:lib/openagents/work/job.ex,lib/openagents/computer_agent_jobs.ex,lib/openagents/work/scv_server.ex,lib/openagents/scv/workspace.ex, andlib/openagents/scv/run.ex.- Private
openagentsmonorepo:specs/openagents/managed-agent-sandboxes.product-spec.md,docs/khala-code/2026-07-06-agent-computers-strategy.md,docs/khala-code/2026-07-06-agent-computer-isolation-posture.md,crates/oa-codex-control/src/managed_sandbox_runtime.rs,crates/oa-codex-control/src/cloud_vm.rs, andscripts/cloud/provision-managed-sandbox-runtime.sh.
Cloudflare source
- Cloudflare Computer repository
README.mddocs/02_sync_protocol.mddocs/05_runtime_interface.mddocs/07_injected_service.mddocs/11_lifecycle.mddocs/16_code_execution.mddocs/19_performance.mdpackages/computer/src/workspace.tspackages/computer/src/backends/container/cloudflare-container.tspackages/computerd/src/cli/computerd.ts