Control plane

Discover and onboard local agents with itr, apply policy YAML, and approve privileged tools — without mixing runtime keys into dashboard APIs.

Two planes

Production data plane is the Intertrace Gateway on Fly at https://intertrace.fly.dev. Clients send LLM / MCP / A2A traffic with itr_rt_*. The kernel remains POST https://intertrace.fly.dev/v1/actions/authorize.

The control plane is the dashboard at platform.intertrace.ai — inventory, policy authoring, approvals, imported spend, and Agent Control. It is not a second authorize engine. YAML you apply compiles into the same authorize intents the gateway already enforces.

Two keys

Mint an org API key in Settings → API keys. Send it as X-Intertrace-Key (or Authorization: Bearer itr_…). Runtime itr_rt_* keys stay on Fly and are rejected on control-plane routes.

itr CLI

itr is Intertrace’s control-plane CLI. Discover is local (no key). Onboard rewrites MCP / base_url to Fly, writes a .intertrace.bak next to the config, then posts inventory to Estate. Offboard restores the backup.

cd cli/itr && go build -o itr .
export INTERTRACE_URL=https://platform.intertrace.ai
export INTERTRACE_API_KEY=itr_...          # org API key, never itr_rt_*
itr discover
itr onboard --runtime cursor --gateway https://intertrace.fly.dev
itr policy apply --file policy.yaml
itr approvals list
itr usage import --file cursor.csv
itr permission-hook --source claude_code   # stdin event, stdout native JSON

Permission hook: pipe the host event to itr permission-hook --source claude_code (or cursor / codex_cli). The CLI polls until the same approval row is decided.

Dashboard surfaces

Permission hooks

Native Claude, Cursor, and Codex permission hooks call POST /api/runtime/permission-check with an org API key. Pending and timeout are fail-closed. Claude and Cursor may surface the host’s ask UI; Codex fail-closes. A policy block without a timeout is never downgraded to ask.