# Identity Plane — per-scope network identity for runtimes Runtimes are sandboxed to centrally-managed network identities keyed by auth scope. Compute lives in scripts, never in agent runtimes: attestation runs outside-in (pid → session → harness scans assign scope; runtimes never claim it). ## Model - **Grouping level = account api origin** (email-anchored). One oauth subject, or one main account behind several API keys, is a group. - **Isolation unit = api token.** Lookup resolves `api_key → account_origin(s)`; one origin rolls scope UP to the umbrella account, two or more (openrouter + provider) keep scope DOWN at the key itself. The account is master; the key is never authoritative about its own scope. - **Cycling follows the scope unit.** Rotation is the priority mechanism; a cycle provisions a fresh identity for whatever the scope unit is. - **Keys referenced by fingerprint** (`sha256:<64hex>`) in the checked-in map. Key bytes never appear in the map, state, code paths, or CLI output. CLI shows emails and fingerprints only. ## Files - `identity-map.json` (tracked): `{accounts: {email: {keys: [{fp, origins[], label?}]}}}`. Fingerprints via `identity-resolve.py fp`. Top-level `_` entries are doc-only. - `identity-state.json` (gitignored runtime state): scope → label/provider/netns assignment + run bindings. - `bin/identity-resolve.py`: pure resolver + `fp` / `lookup` / `check`. - `bin/identity-provider.py`: `Provider` interface, real `WarpProvider`, boilerplate `GenericWireGuardProvider` and `SocksProxyProvider`. - `bin/identity-broker.py`: lifecycle (`up/down/cycle/exec/routes/ status/bind`). `--map` / `--state` select files. - `tests/test_identity_plane.py`: resolver, provider shapes, broker transitions, CLI flags — stubbed runners only. ## Warp provider (live) Built on established structures: identity via `netvm-new-identity.sh` (operator-authorized 2026-10-03), netns via `netvm-node-up.sh` / `netvm-node-down.sh` (`warp-