Follow-up to #477 / #479 (GitHub connections + app_runtime checkout sandboxes) and #478 / #482 (Claude Code connection). The engine and the platform's Incus backend (activeagents/activeagents, "Wire GitHub connections and checkout sandboxes into the platform") now agree on a contract. This issue tracks what still has to exist before a checkout sandbox runs real code in production.
What already works
- The engine validates the repository against the owner's GitHub selection and gives the backend
sandbox_session.checkout_spec (repository, ref, clone_url, username, token) and sandbox_session.runtime_environment (CLAUDE_CODE_OAUTH_TOKEN or ANTHROPIC_API_KEY).
IncusSandboxService (platform) creates the container from sandbox-app-runtime. It then:
- fetches the ref into
/workspace/app; the token rides only in the exec environment and an ephemeral http.extraHeader, never in instance config, argv or .git/config;
- runs
sandbox-app-boot /workspace/app with the Claude Code environment;
- waits for
:8080/up;
- reads
/workspace/runtime.json → { "mcp_path": …, "mcp_token": … }.
- The session then serves as the MCP server
sandbox:<session_id> for the owner's agents and evaluations.
Remaining requirements
1. The sandbox-app-runtime image and boot contract
2. Claude Code sessions in the sandbox: COI (code-on-incus) or similar
The Claude Code credential reaches the booted app, but nothing runs a Claude Code session against the checkout yet (the dashboard assistant still says "COI execution … not implemented"). Evaluate COI (code-on-incus), which runs Claude Code in isolated Incus containers, against a small runner of our own:
3. Isolation and security
4. Lifecycle and UX
5. Other backends
Follow-up to #477 / #479 (GitHub connections +
app_runtimecheckout sandboxes) and #478 / #482 (Claude Code connection). The engine and the platform's Incus backend (activeagents/activeagents, "Wire GitHub connections and checkout sandboxes into the platform") now agree on a contract. This issue tracks what still has to exist before a checkout sandbox runs real code in production.What already works
sandbox_session.checkout_spec(repository,ref,clone_url,username,token) andsandbox_session.runtime_environment(CLAUDE_CODE_OAUTH_TOKENorANTHROPIC_API_KEY).IncusSandboxService(platform) creates the container fromsandbox-app-runtime. It then:/workspace/app; the token rides only in the exec environment and an ephemeralhttp.extraHeader, never in instance config, argv or.git/config;sandbox-app-boot /workspace/appwith the Claude Code environment;:8080/up;/workspace/runtime.json→{ "mcp_path": …, "mcp_token": … }.sandbox:<session_id>for the owner's agents and evaluations.Remaining requirements
1. The
sandbox-app-runtimeimage and boot contractsandbox-app-runtime(and-gpu). It needsgit, Ruby via a version manager that honours the checkout's.ruby-version/.tool-versions, Node/Bun for JS builds, a local Postgres/SQLite,libvips, and Chromium if Playwright tools are expected./usr/local/bin/sandbox-app-boot APP_DIR:bundle install/ JS install with caches;bin/rails db:prepareagainst a throwaway database;0.0.0.0:8080detached;/workspace/runtime.json(mcp_path= the checkout's engine mount +/mcp,mcp_token= that key);bin/sandbox-setupor.activeagents/sandbox.ymlin the repo would let an app customize the steps.RAILS_ENV=developmentor a dedicatedsandboxenv,SECRET_KEY_BASEgenerated per sandbox, and provider keys only when the owner opts in.docs/framework/dashboard.mdnext to the existing backend section.2. Claude Code sessions in the sandbox: COI (code-on-incus) or similar
The Claude Code credential reaches the booted app, but nothing runs a Claude Code session against the checkout yet (the dashboard assistant still says "COI execution … not implemented"). Evaluate COI (code-on-incus), which runs Claude Code in isolated Incus containers, against a small runner of our own:
/workspace/app, orclaude -pheadless invoked through Incus exec.CLAUDE_CODE_OAUTH_TOKENfromruntime_environmentonly, never persisted in instance config, and scrubbed from transcripts.connections.coi/connections.claude_codeto supported.3. Isolation and security
app_runtime: allow GitHub, package registries and the chosen LLM provider, deny the platform's internal network and cloud metadata endpoints.app_runtime(currently thecpu_mediumtier by default): disk quota forbundle install, max boot time (BOOT_TIMEOUT= 900s), process limits.sandbox-restrictedfor a full app (it was written for the Playwright and terminal images).4. Lifecycle and UX
sandbox:*runtimes in the agent editor's MCP server picker and the Tools roster (Dashboard: connect GitHub via OAuth, choose repositories, and run agents/evals in a sandbox built from the checkout #477 follow-up), so the key doesn't have to be copied.mcp_servers.contents:write/ PR scopes, which is an argument for GitHub App tokens.5. Other backends
KubernetesSandboxServiceandCloudRunService(platform) do not handlecheckout_specyet. Port the same contract (init container for the fetch,runtime.jsonfrom a shared volume), or declareapp_runtimeIncus-only.