2026-06-22 21:32:32 +02:00
|
|
|
|
---
|
|
|
|
|
|
domain: infotech
|
|
|
|
|
|
repo: sand-boxer
|
2026-06-24 07:57:40 +02:00
|
|
|
|
updated: "2026-06-24"
|
2026-06-22 21:32:32 +02:00
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
# SCOPE
|
|
|
|
|
|
|
|
|
|
|
|
> This file helps you quickly understand what this repository is about,
|
|
|
|
|
|
> when it is relevant, and when it is not.
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## One-liner
|
|
|
|
|
|
|
2026-06-23 21:40:43 +02:00
|
|
|
|
Coulomb meta-framework for **establishing sandboxes** — profile-based provision,
|
2026-06-24 08:01:18 +02:00
|
|
|
|
extension routing, workspace checkpoints, lifecycle registration, and host
|
|
|
|
|
|
telemetry — so agents and automations run in isolated venues without workstation
|
|
|
|
|
|
blast radius.
|
2026-06-22 21:32:32 +02:00
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## Core Idea
|
|
|
|
|
|
|
2026-06-23 21:40:43 +02:00
|
|
|
|
sand-boxer is the **sandbox establishment service** (OpenRouter for sandboxes).
|
|
|
|
|
|
It answers which recipe applies, which backend fulfills it, where it runs, and
|
|
|
|
|
|
what happened during lifecycle. It is **self-sustained** — it does not depend on
|
|
|
|
|
|
wise-validator or other sibling projects.
|
2026-06-22 21:32:32 +02:00
|
|
|
|
|
2026-06-23 21:40:43 +02:00
|
|
|
|
A **profile** is a named, versioned recipe bound to an **extension** (backend
|
|
|
|
|
|
adapter). Consumers request `create`; sand-boxer provisions on a placement host,
|
|
|
|
|
|
confirms reachability (`ready`), emits State Hub lifecycle events, and tears down
|
|
|
|
|
|
on destroy or operator reap.
|
2026-06-22 21:32:32 +02:00
|
|
|
|
|
2026-06-23 21:40:43 +02:00
|
|
|
|
**wise-validator** (separate repo) consumes sand-boxer for cross-repo e2e
|
|
|
|
|
|
validation; sand-boxer does not run health checks or test commands.
|
|
|
|
|
|
|
|
|
|
|
|
Lineage: provision/teardown extracted from `the-custodian/e2e-framework/`;
|
2026-06-24 08:01:18 +02:00
|
|
|
|
`ext.vm-packer` attach mode covers build-machine workspaces; full Packer build
|
|
|
|
|
|
orchestration from `create` remains deferred.
|
2026-06-22 21:32:32 +02:00
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## In Scope
|
|
|
|
|
|
|
2026-06-23 21:40:43 +02:00
|
|
|
|
- **Unified establishment API** — CLI v0 + HTTP stub (`create`, `get`, `list`,
|
2026-06-24 07:57:40 +02:00
|
|
|
|
`destroy`, `recreate`, `snapshot`, `restore`); `extend_ttl` planned
|
2026-06-24 08:01:18 +02:00
|
|
|
|
- **Profile catalog** — six profiles: compose e2e/checkpoint, sandbox canary,
|
|
|
|
|
|
vm-haskell-build, saas-stub, burst-sandbox
|
|
|
|
|
|
- **Extension platform** — `ext.compose-ssh`, `ext.vm-packer`, `ext.saas-stub`;
|
|
|
|
|
|
plugin contract in `docs/meta-framework.md` and `docs/extension-sdk.md`
|
|
|
|
|
|
- **Routing engine** — `RouteSpec` strategies (`prefer-self-hosted`, `lowest-cost`,
|
|
|
|
|
|
`lowest-latency`, `explicit`); see `docs/routing.md`
|
|
|
|
|
|
- **Payments v0** — credits store, pre-create balance check, post-destroy debit
|
|
|
|
|
|
for metered extensions; see `docs/payments.md`
|
|
|
|
|
|
- **Workspace checkpoints** — snapshot index + extension hooks; see `docs/snapshots.md`
|
2026-06-23 21:40:43 +02:00
|
|
|
|
- **Host placement** — profile `placement` + `SANDBOXER_HOST` overrides;
|
|
|
|
|
|
sandboxer01 preferred, CoulombCore interim
|
2026-06-24 08:01:18 +02:00
|
|
|
|
- **Lifecycle + State Hub** — transitions emit progress events; JSON stores at
|
|
|
|
|
|
`~/.local/share/sandboxer/sandboxes.json` and `snapshots.json`
|
2026-06-23 21:40:43 +02:00
|
|
|
|
- **Host telemetry** — canary self-deploy, `inspect host` / `inspect stale`,
|
|
|
|
|
|
`reap-stale` (SAND-WP-0008)
|
|
|
|
|
|
- **Capability registry** — `capability.execution.sandbox-provision` (draft)
|
|
|
|
|
|
- **Sibling integration contracts** — `docs/integrations/` (glas-harness,
|
|
|
|
|
|
wise-validator, snuggle-inventor)
|
|
|
|
|
|
- **Runbooks and smoke** — compose-e2e, sandbox-canary; remote smoke scripts
|
|
|
|
|
|
- **Workplans and charter** — ADR-001 files in `workplans/`, `INTENT.md`
|
2026-06-22 21:32:32 +02:00
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## Out of Scope
|
|
|
|
|
|
|
|
|
|
|
|
| Concern | Owner |
|
|
|
|
|
|
|---------|--------|
|
2026-06-23 21:40:43 +02:00
|
|
|
|
| E2e health checks, test execution, validation results | **wise-validator** |
|
|
|
|
|
|
| Agent gateway, tools, memory | **glas-harness** |
|
|
|
|
|
|
| Code generation, tech specs | **snuggle-inventor** |
|
|
|
|
|
|
| Workstream / task state | `state-hub` |
|
|
|
|
|
|
| Scheduling | `activity-core` |
|
|
|
|
|
|
| SSH tunnels | `ops-bridge` |
|
2026-06-22 21:32:32 +02:00
|
|
|
|
| SSH certificate issuance | `ops-warden` |
|
2026-06-23 21:40:43 +02:00
|
|
|
|
| Canon and agent instruction canon | `the-custodian` |
|
|
|
|
|
|
| Capability federation hub | `reuse-surface` |
|
|
|
|
|
|
| Production on Railiance01 | `railiance-apps` / domain repos |
|
2026-06-24 08:01:18 +02:00
|
|
|
|
| Real E2B / Modal / Daytona cloud APIs | Future adapters (stub in-repo) |
|
|
|
|
|
|
| fin-hub billing export | Future |
|
2026-06-22 21:32:32 +02:00
|
|
|
|
|
2026-06-23 21:40:43 +02:00
|
|
|
|
sand-boxer **consumes** ops-bridge and ops-warden for reachability; it does not
|
|
|
|
|
|
own tunnels or CAs.
|
2026-06-22 21:32:32 +02:00
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## Relevant When
|
|
|
|
|
|
|
2026-06-23 21:40:43 +02:00
|
|
|
|
- Provisioning an isolated compose stack on CoulombCore / sandboxer01
|
2026-06-24 08:01:18 +02:00
|
|
|
|
- Attaching a workspace on a pre-built VM (`profile.vm-haskell-build`)
|
|
|
|
|
|
- Saving or restoring a workspace checkpoint (`profile.compose-checkpoint`)
|
|
|
|
|
|
- Choosing self-hosted vs metered SaaS backend (`profile.burst-sandbox`)
|
2026-06-23 21:40:43 +02:00
|
|
|
|
- Canary self-deploy or host inventory before placing workloads
|
|
|
|
|
|
- activity-core, CI, glas-harness, or wise-validator need a sandbox handle
|
|
|
|
|
|
- Discovering sandbox capability via `registry/`
|
|
|
|
|
|
- Migrating off `the-custodian/e2e-framework` provision path
|
2026-06-22 21:32:32 +02:00
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## Not Relevant When
|
|
|
|
|
|
|
2026-06-23 21:40:43 +02:00
|
|
|
|
- Running repo e2e tests end-to-end (use **wise-validator** `validate run`)
|
|
|
|
|
|
- Local-only work with acceptable blast radius
|
|
|
|
|
|
- Tunnel or cert operations alone (ops-bridge / ops-warden)
|
|
|
|
|
|
- Task/workstream tracking alone (state-hub)
|
2026-06-22 21:32:32 +02:00
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## Current State
|
|
|
|
|
|
|
2026-06-24 08:01:18 +02:00
|
|
|
|
- **Status:** v0 operational — self-hosted compose path proven on CoulombCore;
|
|
|
|
|
|
routing, payments stub, and snapshots shipped
|
|
|
|
|
|
- **Workplans finished:** SAND-WP-0001–0008 (all workplans in `workplans/`;
|
|
|
|
|
|
0003/0004 delivered in sibling repos wise-validator / the-custodian)
|
|
|
|
|
|
- **Package:** `src/sandboxer/` — CLI, manager, extensions, routing, payments,
|
|
|
|
|
|
snapshots, telemetry, HTTP API
|
|
|
|
|
|
- **Profiles:** `profile.compose-e2e`, `profile.compose-checkpoint`,
|
|
|
|
|
|
`profile.sandbox-canary`, `profile.vm-haskell-build`, `profile.saas-stub`,
|
|
|
|
|
|
`profile.burst-sandbox`
|
|
|
|
|
|
- **Extensions:** `ext.compose-ssh` (compose + tar snapshots),
|
|
|
|
|
|
`ext.vm-packer` (attach), `ext.saas-stub` (metered stub + metadata snapshots)
|
|
|
|
|
|
- **Docs:** `meta-framework`, `extension-sdk`, `host-telemetry`, `routing`,
|
|
|
|
|
|
`payments`, `snapshots`, `migration-gaps`, `migration-build-machines`
|
2026-06-23 21:40:43 +02:00
|
|
|
|
- **Registry:** `capability.execution.sandbox-provision` indexed (draft)
|
2026-06-24 08:01:18 +02:00
|
|
|
|
- **Tests:** 54 pytest cases; `make check` green
|
|
|
|
|
|
- **Siblings:** wise-validator `validate run` (SAND-WP-0003); the-custodian
|
|
|
|
|
|
`make e2e REPO=` shim (SAND-WP-0004)
|
2026-06-23 21:40:43 +02:00
|
|
|
|
|
2026-06-24 12:36:56 +02:00
|
|
|
|
Latest gap analysis: `history/2026-06-24-post-wp0007-intent-scope-gap-analysis.md`
|
|
|
|
|
|
Next workplan: **SAND-WP-0009** (TTL enforcement and operational hardening).
|
2026-06-22 21:32:32 +02:00
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## What Is Possible Now
|
|
|
|
|
|
|
2026-06-23 21:40:43 +02:00
|
|
|
|
```bash
|
|
|
|
|
|
make setup && make install # sandboxer CLI
|
|
|
|
|
|
sandboxer create # canary self-deploy (no args)
|
|
|
|
|
|
sandboxer create --profile profile.compose-e2e --input repo=/path/to/repo
|
2026-06-24 08:01:18 +02:00
|
|
|
|
sandboxer create --profile profile.vm-haskell-build --input vm=haskell-build --input repo=/path
|
|
|
|
|
|
sandboxer create --profile profile.burst-sandbox # routes to saas-stub when needed
|
|
|
|
|
|
sandboxer get <id> / list / destroy / recreate
|
|
|
|
|
|
sandboxer snapshot <id> [--name LABEL]
|
|
|
|
|
|
sandboxer restore <snapshot_id>
|
|
|
|
|
|
sandboxer snapshots list / snapshots get <id>
|
|
|
|
|
|
sandboxer credits show / credits add <amount>
|
|
|
|
|
|
sandboxer inspect host / inspect stale / reap-stale [--apply]
|
2026-06-23 21:40:43 +02:00
|
|
|
|
make smoke-remote # CoulombCore compose smoke (SANDBOXER_HOST)
|
|
|
|
|
|
|
|
|
|
|
|
# Full e2e validation (wise-validator, separate install):
|
|
|
|
|
|
validate run ~/activity-core
|
2026-06-23 21:43:53 +02:00
|
|
|
|
|
|
|
|
|
|
# Legacy operator entry (the-custodian):
|
|
|
|
|
|
cd ~/the-custodian && make e2e REPO=activity-core
|
2026-06-23 21:40:43 +02:00
|
|
|
|
```
|
2026-06-22 21:32:32 +02:00
|
|
|
|
|
2026-06-24 08:01:18 +02:00
|
|
|
|
- State Hub lifecycle events on create/destroy/snapshot (when hub reachable)
|
|
|
|
|
|
- HTTP API via `uvicorn sandboxer.api.app:app` (sandboxes + snapshots)
|
2026-06-23 21:40:43 +02:00
|
|
|
|
- Operator runbooks under `docs/runbooks/`
|
2026-06-22 21:32:32 +02:00
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## What Is Not Possible Yet
|
|
|
|
|
|
|
2026-06-23 21:40:43 +02:00
|
|
|
|
- TTL auto-expiry / `extend_ttl` enforcement
|
2026-06-24 08:01:18 +02:00
|
|
|
|
- Packer build orchestration from `create` (attach-only today)
|
|
|
|
|
|
- Real E2B / Modal / Daytona adapters (in-repo stub only)
|
|
|
|
|
|
- Cross-host snapshot transfer
|
2026-06-23 21:40:43 +02:00
|
|
|
|
- Formal ops-bridge tunnel attachment in reachability descriptor
|
|
|
|
|
|
- Dedicated sandboxer01 host (CoulombCore interim only today)
|
|
|
|
|
|
- `reuse-surface validate` / federation publish workflow
|
|
|
|
|
|
- `.repo-classification.yaml` (State Hub C-24 hygiene)
|
2026-06-24 08:01:18 +02:00
|
|
|
|
- fin-hub billing export for metered usage
|
2026-06-22 21:32:32 +02:00
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## How It Fits
|
|
|
|
|
|
|
|
|
|
|
|
```mermaid
|
|
|
|
|
|
flowchart LR
|
2026-06-23 21:40:43 +02:00
|
|
|
|
WV[wise-validator] -->|create/destroy| SB[sand-boxer]
|
|
|
|
|
|
GH[glas-harness] -->|create| SB
|
|
|
|
|
|
AC[activity-core] -->|when| WV
|
|
|
|
|
|
AC -->|venue request| SB
|
|
|
|
|
|
SB -->|provision| HOST[CoulombCore / sandboxer01]
|
|
|
|
|
|
SB -->|lifecycle| SH[state-hub]
|
|
|
|
|
|
SB -->|SSH reachability| OB[ops-bridge]
|
2026-06-24 08:01:18 +02:00
|
|
|
|
TC[the-custodian] -.->|make e2e shim| WV
|
|
|
|
|
|
TC -.->|provision| SB
|
2026-06-22 21:32:32 +02:00
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## Terminology
|
|
|
|
|
|
|
2026-06-23 21:40:43 +02:00
|
|
|
|
- **Profile** — named sandbox recipe (extension binding, placement, TTL metadata)
|
2026-06-24 08:01:18 +02:00
|
|
|
|
- **Extension** — backend adapter (`provision`, `wait_ready`, `teardown`; optional
|
|
|
|
|
|
`snapshot` / `restore_from_snapshot`)
|
2026-06-23 21:40:43 +02:00
|
|
|
|
- **Establishment** — create through `ready` (distinct from validation pass/fail)
|
2026-06-24 08:01:18 +02:00
|
|
|
|
- **Snapshot** — point-in-time workspace checkpoint; restore creates a new sandbox
|
|
|
|
|
|
- **Route** — extension selection policy when multiple backends qualify
|
2026-06-23 21:40:43 +02:00
|
|
|
|
- **Canary** — `profile.sandbox-canary` self-deploy with host telemetry
|
|
|
|
|
|
- Actor types: `adm`, `agt`, `atm`
|
2026-06-22 21:32:32 +02:00
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## Related / Overlapping
|
|
|
|
|
|
|
2026-06-23 21:40:43 +02:00
|
|
|
|
- **wise-validator** — validation orchestration; one-way consumer of sand-boxer
|
2026-06-24 08:01:18 +02:00
|
|
|
|
- **the-custodian** — legacy `e2e-framework/`; `make e2e` shim delegates to
|
|
|
|
|
|
wise-validator (SAND-WP-0004)
|
2026-06-23 21:40:43 +02:00
|
|
|
|
- **ops-bridge** / **ops-warden** — connectivity and identity consumers
|
|
|
|
|
|
- **state-hub** — lifecycle visibility
|
|
|
|
|
|
- **reuse-surface** — capability federation target
|
2026-06-22 21:32:32 +02:00
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## Provided Capabilities
|
|
|
|
|
|
|
2026-06-23 21:40:43 +02:00
|
|
|
|
Registered (draft): `capability.execution.sandbox-provision` —
|
|
|
|
|
|
see `registry/capabilities/execution.sandbox-provision.md`.
|
2026-06-22 21:32:32 +02:00
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## Getting Oriented
|
|
|
|
|
|
|
2026-06-23 21:40:43 +02:00
|
|
|
|
| Path | Purpose |
|
|
|
|
|
|
|------|---------|
|
|
|
|
|
|
| `INTENT.md` | Charter and sibling boundaries |
|
|
|
|
|
|
| `docs/meta-framework.md` | API, lifecycle, extension contract |
|
2026-06-24 08:01:18 +02:00
|
|
|
|
| `docs/extension-sdk.md` | Extension author guide |
|
2026-06-23 21:40:43 +02:00
|
|
|
|
| `docs/host-telemetry.md` | Canary and inventory |
|
2026-06-24 08:01:18 +02:00
|
|
|
|
| `docs/routing.md` | Backend selection strategies |
|
|
|
|
|
|
| `docs/payments.md` | Credits and metering |
|
|
|
|
|
|
| `docs/snapshots.md` | Checkpoint snapshot/restore |
|
2026-06-23 21:40:43 +02:00
|
|
|
|
| `docs/migration-gaps.md` | Legacy cutover status |
|
|
|
|
|
|
| `docs/integrations/` | Consumer contracts |
|
|
|
|
|
|
| `workplans/` | ADR-001 work structure |
|
|
|
|
|
|
| `history/` | INTENT ↔ SCOPE assessments |
|
|
|
|
|
|
| `AGENTS.md` | Session protocol |
|