> ## Documentation Index
> Fetch the complete documentation index at: https://docs.zap.wzrd.tech/llms.txt
> Use this file to discover all available pages before exploring further.

# Modal (GPU lane)

> Modal is the GPU lane target — never a general sandbox. It mounts only when a gpu lane is declared.

<img src="https://mintcdn.com/gratitude5dee-zap-56/Y4G9H4edehsua_Ul/images/logos/modal.svg?fit=max&auto=format&n=Y4G9H4edehsua_Ul&q=85&s=ea190d51d931d3e2e6365a2d62df0cdc" alt="Modal" style={{ height: "32px", width: "auto" }} noZoom width="24" height="24" data-path="images/logos/modal.svg" />

Modal is **not** a general sandbox in Zap: it is the GPU lane target (`sandbox.modal` plugin plus the `lanes.gpu` dispatcher).

* `acquire()` accepts `purpose: "lane"` only — anything else throws `MODAL_LANE_ONLY`, so a CPU runtime can never mount it by accident.
* Capabilities: `gpu: true`, `isolation: "container"`; sizes are the GPU classes priced in `pricing.json`.
* Mounting: the lane dispatcher routes to Modal only when `Runtime.md` `lanes` includes `gpu:<class>` or a media step declares `gpu`. Without a declared lane, Modal never mounts.
* Pricing: `pricing.json` carries the `gpu_second` SKU per class (USD/s). `estimateGpuCost(class, seconds, pricing)` is the plan-only estimator.

```ts theme={null}
import { createGpuLaneExecutor } from "@wzrdtech/zap-runtime/lanes/gpu";

const lanes = createGpuLaneExecutor({
  cpu: cpuLaneExecutor,
  lanes: runtimeMd.lanes ?? [], // e.g. ["gpu:L40S"]
  mount: () => modalLaneTarget, // lazy: never called without a gpu lane
});
```

`zap doctor` reports `first-party (gpu lane only)` and verifies that `pricing.json` classes match the supported GPU classes — drift fails.
