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 JSONPermission 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
Estate → Discovery
itr discover / onboard / offboard inventory
Work → Approvals
One inbox. Timeout fail-closed. Approve is not execute.
Work → Flows
CI and evidence-pack templates
Policies → Gitops
Validate, diff, apply YAML into authorize
Costs → Imported
Cursor/Claude/Codex spend sidecar — never a Fly 402
Settings
Runtime keys vs org API keys
Agent Control (OpenClaw / Hermes) queues an audited user turn on an existing agent — never a hidden system prompt. Connect clients: Cursor, Claude Desktop, Codex.
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.