Adapter capability checklist
| Capability | Provider obligation |
|---|---|
| Create | Verify image/account/region and network isolation before one native submission. Correlate the returned sandbox to the attempt. |
| Destroy | Attempt native compute cleanup; report computeStopped: true only after confirmation. |
| Scope | Authenticate authority and include every routing partition that changes native resource identity. Check it on every read and mutation. |
| Exec | Declare argv and/or shell accurately. Preserve binary stdout/stderr and apply the combined output bound. Disable hidden retries. |
| Files | Enforce byte bounds. Offer overwrite: false only with native atomic no-clobber semantics. |
| Inventory | Paginate and verify listed resource ownership, including detail reads when list payloads omit scope. Listed sandbox references must match what reopen verifies. |
| Recovery | Observe a previous submission without starting it again. Validate token version and native resource/operation correlation. |
| Close | Release owned local clients exactly once. Never imply that close or abort destroyed remote compute. |
adapterSuite from @beachside/adapter/testing exercises required managed-compute scenarios and reports which ran. The provider adapters run this suite against deterministic native boundaries. The fake provider is a test simulation, not an isolated execution environment. The suite does not certify an external provider’s behavior by itself; its fixture must demonstrate that the native transport makes one outbound mutation attempt.
State portability checks
Section titled “State portability checks”SDK clients expose asynchronous client.capabilities() and box.capabilities() observations, plus read-only request evaluation:
const check = await client.sandboxes.checkCreate({ environment: Image.prepared("your-image-id"), requirements: { snapshot: { requirements: { preserve: "filesystem" } } },});if (check.status === "supported") { console.log(check.value.snapshot);}checkSnapshot() resolves the configured native default. Optional requirements validate its preservation, interruption, source lifecycle and consistency without selecting another profile. The profile and artifact metadata report fresh or resumed execution and unknown consistency where evidence is unavailable. The four statuses distinguish implemented support, unsupported combinations, unavailable access/state, and unknown evidence. Unknown state or retention cannot satisfy hard requirements. Supported checks report mount handling, retention evidence, manual cleanup, and explicitly unknown restore restrictions. They never build images, allocate probe resources, stop compute, or dispatch capture.
Requirements are rechecked during create preparation and before submission. Unsupported requests fail before allocation; unknown and unavailable requirements also block allocation. No automatic provider switching is performed.
Daytona and E2B direct connections implement distinct capture/restore profiles. Daytona maps volume CRUD and mounting; E2B maps volume CRUD behind native access eligibility but does not support mounts. Read Snapshots and volumes for their limits. Eligible private sandboxes also support explicit suspension, resumption and renewal; see sandbox lifecycle. Volume versions remain unsupported. The asynchronous direct capability getter is an intentional API change; callers must await it.
Preparation validates requirements before the durable submission marker, then read-only eligibility is checked again before dispatch. Recovery only observes native evidence. For a source already observed as stopped, a profile ending stopped satisfies unchanged lifecycle state.
lifecycle.renew reports resolved minSeconds, optional maxSeconds, stepSeconds and native clock scope when the mapped adapter can establish them. Omitted maxSeconds means the provider documents no maximum, as on Daytona and boxd. Positive requests below the native minimum may round upward; resolved settings never grant less time than requested. These bounds describe SDK mapping, not account entitlement or a reservation. Applications use renew() or renew({ forSeconds }) with defaults selected in adapter setup; capability inspection is optional. Renewal checks the actual running state and policy before effects, preserves ACK independently of detail reads, and never replays an uncertain reset.