skip to content
Replays

Sandbox Private Home

Sandbox Write Boundary

Gantry tried to move agent writes into run-owned storage, then left a visible record of what survived and what was withdrawn.

Gantry milestones

3 milestones 14 tasks 30 agents

4 plan 13 execute 17 review

181k peak context

119k median execute

Gantry tried to move agent writes into run-owned storage, then left a visible record of what survived and what was withdrawn.

11h 39m total 11m 13s per task

2h execute 1h 8m review

259 edits 1.2k commands

codex harness

This run attempted the most ambitious version of Gantry's sandbox posture: a broadly readable host with writes routed into the run worktree, a private home, temporary storage, runtime sockets, declared credential exemptions, and explicit operator binds. It was cut as a milestone run because the profile contract, runtime adoption, and public proof each had to be understandable to fresh agents before the next layer depended on them.

The current tree no longer ships that full posture. Later work withdrew the private-home and read-mostly write boundary and restored the built-in sandbox to a process fence with a writable host view, while keeping parts of the shared wrapper machinery, visibility vocabulary, MCP shell behavior, and documentation history. This replay therefore reads as both a build record and a survival record: it shows how the design was decomposed, and where the live project now says the stronger boundary did not hold.

How this walkthrough is structured

Feature

What did the run build and ship?

The shipped tree later replaced the write-boundary claim with a process-fence contract, while retaining shared wrapper resolution, visibility metadata, MCP parity, and the historical documentation trail.

Build

How did Gantry structure the work?

The run separated sandbox policy, runtime adoption, and proof work into milestone-sized cuts, with unit gates staying green while final integration needed reconciliation.

Milestone 1

Shared Sandbox Profile

3 tasks 9 agents 1h 9m wall time 177k peak context

The exact read-mostly profile this milestone introduced is not the current default. The live sandbox guide now describes a process fence with a writable host view and a read-only main checkout guard. What remains from this layer is the idea that callers resolve a shared wrapper profile rather than each building their own command. The current config and agent paths still route through shared profile construction, but with a narrower claim than this milestone built.

This milestone carried the pure profile and configuration work before any runtime path depended on it. The brief kept the slice at the boundary where bubblewrap arguments are built, where bind ordering and operator inputs can be tested without real mounts. Its sprints all stayed within hermetic argv and parsing contracts, and the run facts show no recovery or replan inside the milestone. That made it a suitable foundation for later work, even though integration later had to reconcile the whole run.

Shared Profile Contract

2 agents 19m 9s wall time 102k peak context

The live agent and MCP paths still call shared profile builders before spawning work. Current code no longer carries this sprint's future private-home promise as the public posture, but it does preserve the single resolution point that prevents agent execution and shell execution from drifting. The surviving feature is architectural rather than policy-specific. Later process-fence work reused the same shape while changing what the built-in wrapper claimed to protect.

This sprint created the interface later agents would consume instead of asking them to rediscover sandbox argv assembly. Its brief was narrow for a fresh worker: gather mode, main checkout, worktree, operator binds, and future run-owned locations into one profile request, then return already split arguments. The contract was explicitly injection-safe, so path handling could be proven at construction time. The sprint passed without a recorded repair, giving the next profile change one place to land.

Read-Mostly Profile

2 agents 15m 29s wall time 149k peak context

This policy is the part that no longer stands as shipped behavior. The current sandbox documentation says the built-in wrapper preserves a writable host view and does not provide filesystem or home-directory confinement. The read-only main checkout and writable Git metadata carve-back are still part of the process-fence profile. The broader read-mostly host and scoped-write posture survives only in archived plans and analysis that explain why it was withdrawn.

This sprint held the core policy change: make the host readable first, then carve back only declared writable paths. That was the hardest profile slice in the first milestone because bind ordering became the product contract. The brief made that complexity testable without bubblewrap by pinning root masking, worktree writability, shared Git storage, hook protection, device support, and argument safety. It completed cleanly, so the configuration sprint could treat the policy as already present.

Sandbox Settings Surface

2 agents 23m 14s wall time 177k peak context

The specific read-write and read-only exemption variables from this sprint are absent from the current user contract. Current configuration instead exposes managed process-fence modes, disabled mode, required mode, and a custom wrapper command. The useful survivor is the disciplined handling of sandbox mode as operator-visible configuration with warnings for weaker states. Generated schema and docs now present that narrower surface.

This sprint connected the new profile to operator configuration. Its scope was small enough for one agent because it dealt with parsing, default selection, explicit legacy opt-out, custom wrapper passthrough, and effective configuration snapshots. The brief also made malformed inputs and flag-shaped paths part of the testable boundary. It crossed the gate without recovery, leaving later runtime work with a coherent settings object.

Milestone 2

Writable Run Areas

7 tasks 16 agents 2h 7m wall time 181k peak context

The live tree shows this milestone as partly superseded. The private-home and credential-exemption design was withdrawn after it broke real harness launch on the operator machine, and later documentation says Gantry does not add credential-specific binds. The shared wrapper use, MCP shell parity, sandbox visibility event, and current documentation vocabulary remain visible. This milestone's feature legacy is therefore mixed: some mechanisms survived, while the central write-boundary posture did not.

This milestone applied the profile to real execution paths and added the run-owned locations the first milestone could only model. The cut was larger and more operational: private home lifecycle, temporary storage, runtime sockets, harness credentials, agent launch, MCP shell execution, fallback visibility, mount checks, and docs. The sprint gates stayed green, but one sprint has no finish sha in the run-facts record and the final run later needed merge reconciliation. The boundary pressure lived at integration rather than in a single unit's repair loop.

Shared Profile Contract

2 agents 11m 13s wall time 113k peak context

The current profile request no longer represents the full run-owned home and exemption set as a shipped boundary. It still gives agent and MCP callers one profile resolution path and still distinguishes built-in, custom, and disabled wrapper states. The current process-fence code binds the main checkout read-only and keeps Git metadata writable for commits. The feature that remains is the shared wrapper contract, not the stronger filesystem policy.

This sprint reopened the profile boundary with the full runtime contract in view. The brief asked it to represent worktree writes, readable checkout, Git metadata, temporary storage, runtime sockets, private home, credential exemptions, operator binds, legacy host mode, and custom wrapper mode. That is a large contract, but still one coherent place for a fresh agent because it stayed at profile request construction. It completed without unit-local recovery.

Run Writable Areas

2 agents 21m 26s wall time 181k peak context

The run-owned private home from this sprint is not current behavior. Archived analysis records that masking the real home removed harness binaries installed below the operator home, and the change was withdrawn. Current docs explicitly say normal tools, caches, credentials, and absolute source paths keep working through a writable host view. Runtime storage and MCP capture paths remain important, but the private-home write sink is historical.

This sprint supplied the lifecycle objects the profile needed: a run home, temporary storage, runtime socket reachability, and cleanup or reclamation behavior. The brief was structurally risky because it touched the environment agents actually run inside, but the requested proof was still framed as hermetic lifecycle and input assembly tests. The sprint crossed its recorded gates, yet later analysis shows this was the design point the automated pipeline could not truly validate. The real failure appeared only when an authenticated harness had to launch through the new home mount.

Harness Credential Exemptions

2 agents 21m 26s wall time 166k peak context

The live harness docs now state the opposite contract: Gantry does not add credential-specific filesystem binds. Stored logins and token variables are whatever each CLI normally sees in the operator environment. Harness code still knows how to detect authentication readiness for prompts and startup checks, and Codex and Gemini still have native sandbox behavior disabled under Gantry. The exemption table itself belongs to the withdrawn write-boundary design.

This sprint tried to keep authentication working after the private home hid the real one. Its brief divided the problem by harness, requiring the smallest ambient credential path each command needed and excluding token authentication because environment injection already handled it. That made the work declarative and testable without real credentials. It finished without recorded recovery, but its premise depended on the private-home policy that later failed in real use.

Agent And MCP Adoption

2 agents 18m 1s wall time 155k peak context

The shared adoption remains, with changed semantics. Agent launches still prepend Gantry's wrapper profile across harnesses, and MCP `run_bash` still resolves the same wrapper state as an agent spawn. The private-home and credential inputs no longer describe live behavior, but the no-fork rule between agent execution and MCP shell execution still stands. This is one of the run's clearest surviving implementation ideas.

This sprint was the point where the shared profile stopped being an abstract builder and became the launch path. The brief asked normal agent stages and MCP shell execution to consume the same profile inputs, including worktree, private home, temporary storage, credentials, and runtime sockets. That cut was right-sized because earlier sprints had already named those inputs. The run facts show the unit stages passed, though the finish record is incomplete compared with the milestone ledger.

Visibility And Backstop

1 agents 25m 13s wall time 109k peak context

Visibility metadata still survives strongly in the current tree. Run history has sandbox visibility events, environment summaries render wrapper state, and MCP `run_bash` returns structured wrapper data for process fence, custom wrapper, and no wrapper cases. The escaped-write backstop is still used when Gantry's built-in process fence is absent. The vocabulary was later renamed around wrapper state, but the observability contract remains.

This sprint made degraded or bypassed confinement visible instead of leaving it on stderr or implicit tool results. Its brief was a vocabulary contract for run history, MCP registration, MCP results, startup warnings, and the post-agent escaped-write backstop. That kind of observability slice is agent-sized because it can be tested as serialization and metadata without running bubblewrap. It stayed green and gave later documentation precise terms to use.

Opt-In Mount Checks

2 agents 9m wall time 118k peak context

The current project keeps focused wrapper probes and manual smoke guidance, but not this sprint's private-home mount proof as the default story. Documentation now says the default gate does not require bubblewrap or credentials, and real authenticated smoke checks are operator procedures. The historical analysis calls out that synthetic home probes proved mount mechanics rather than launch policy. This sprint's durable lesson is the separation of hermetic checks from real-host proof.

This sprint separated real mount proof from the default gate. The brief asked for opt-in checks covering home writes, hidden secrets, worktree writes, cache writes, credential refresh, sibling path protection, and a smoke path for authenticated execution. That split matched the test policy, but it also exposed a limitation: the automated worker could add probes more readily than it could prove a real operator machine. The sprint finished green, while later analysis showed fixture mount probes had not validated the true home boundary.

Sandbox Docs And Reference

2 agents 10m 30s wall time 131k peak context

Most of this sprint's specific write-boundary prose was later replaced. Current docs no longer publish the credential exemption table or private-home write boundary as live behavior. The reference-data discipline survives: MCP tool descriptions, configuration rows, and docs now agree on process-fence language. The archived sandbox plan and analysis preserve why the stronger wording was removed.

This sprint converted the completed milestone into operator-facing prose and generated reference data. The brief waited until runtime behavior and visibility vocabulary existed, then asked for sandbox docs, credential tables, MCP language, harness guidance, stale wording cleanup, and reference refresh. It was a broad editorial sweep, but bounded by already-built behavior. It completed without recovery and closed the milestone before final integration.

Milestone 3

Docs And Mount Proof

4 tasks 11 agents 44m 33s wall time 119k peak context

The live tree keeps much of this milestone as historical correction rather than live policy. The current sandbox and harness docs now explain the process-fence posture and link security-minded users to external confinement guidance. MCP `run_bash` still advertises and returns wrapper-state metadata. The promised private-home proof did not survive as validation of shipped behavior, because the shipped behavior changed after the run.

This milestone was intended to prove and explain the final boundary after implementation. Its scope was mostly user-facing: real-mount proof, shell-tool contract, primary sandbox docs, harness docs, and an authenticated smoke run. The cut was sensible on paper because docs followed runtime work, but the smoke requirement sat outside what an agent inside the pipeline could actually perform. The unit gates stayed green, and the later incident record names that structural verification gap directly.

Opt In Mount Proof

2 agents 4m 15s wall time 78k peak context

The live project no longer uses the private-home proof as evidence for the current sandbox posture. The current verification docs point to process-fence probes and manual authenticated smoke checks instead. The archived incident record is the more important survivor: it explains why the fixture proof missed the operator home problem. This sprint's current value is cautionary, not an active feature.

This sprint turned the final mount contract into an opt-in exercise rather than a default gate. The brief named concrete behaviors for real home masking, private-home writes, cache writes, worktree writes, sibling protection, and credential refresh. That made the proof precise, but still depended on a development host and stored credentials that the worker could not assume. It passed its recorded checks, while later analysis found the proof did not cover the real harness-launch failure.

Shell Contract Sync

2 agents 6m 16s wall time 75k peak context

This contribution still stands after the posture change. The `run_bash` tool description says it runs in the resolved worktree under the same wrapper state as coding agents. Its result metadata distinguishes active process fence, custom wrapper, and no wrapper, and reference data carries the same wording. The feature survived because it describes observable wrapper state rather than promising private-home confinement.

This sprint focused on the externally advertised MCP shell contract. The brief asked the tool description and generated reference data to say exactly what wrapper state was active and what metadata callers would receive. That was a small, checkable surface because the MCP action behavior had already been built. It crossed the gate cleanly and gave documentation a generated source of truth.

Sandbox Boundary Docs

2 agents 7m 50s wall time 97k peak context

The current sandbox page no longer says this boundary is shipped. It describes a disposable worktree plus a process fence, and explicitly denies filesystem, credential, home-directory, temporary-storage, and network confinement. That replacement is now the public contract. The withdrawn docs remain useful only through archive and analysis pages that explain the failed design.

This sprint rewrote the main sandbox guide around the intended final read and write boundary. The brief was documentation-heavy but precise: state what stayed readable, where writes were allowed, how the private home worked, what configuration meant, and which security claims remained out of scope. It was agent-sized because the implementation was supposed to be done. The run did not record a repair here, but later history shows the underlying behavior changed after publication.

Harness Docs Smoke

2 agents 18m 41s wall time 119k peak context

Current harness docs still benefit from the alignment work, but now describe Gantry's wrapper as a process fence with a writable host view. Assistant and MCP docs include manual authenticated smoke guidance for the process-fence profile and record a later successful proof. They no longer present the private-home design as current. The surviving feature is accurate harness and MCP documentation after correction, not the original proof claim.

This sprint was supposed to align related harness and assistant docs and prove the default profile with a real authenticated run. The documentation part fit a fresh agent, but the smoke proof required standing outside the very environment being changed. The sprint closed with prose and docs rather than an operator-verified real run. Later analysis identifies that as the missed check that would have caught the private-home breakage quickly.