OdyDocs

Switchboard safety model

Why a confident AI plan can't silently change live calls: the guardrails in Switchboard's design.

Private preview

These guarantees are enforced in code today for every allowlisted workspace.

The failure that matters for an AI setup tool is a confident plan that changes live calls, or a remote caller who gets it to act as someone else. Switchboard's design makes that mechanical rather than relying on the prompt.

#Who fills in what

PieceFilled in byWhy
What was heard, assumptions, questions, stepsThe modelOnly it can restate a free-text request
Risk, reversibility, cost, plan gateCode (the catalog)A model can't downplay a purchase
Before-snapshot hash, signatureCode, at approvalThe executor runs only what was signed
Acting user, workspaceThe verified app sessionA request body can't name them

#Guardrails

#GuardrailEffect
1Session onlyAPI keys get 404. The routes aren't mounted on /v1/api, /v1/mcp or any job or webhook route
2Admin or ownerMembers get 403. Request bodies that try to set actorUid, workspaceId, approvedBy, signature, steps, plan and similar fields are rejected
3AllowlistOff for every workspace unless it's named explicitly. There's no "all workspaces" switch
4Signed plansA different workspace, approver, param or version fails verification (timing-safe HMAC compare)
5Same approver buildsAnother admin can read a plan but can't build it
6Risk re-read at buildRisk comes from the catalog, not the stored plan. Unknown actions are treated as critical and never run
7Risk and spend capsHigh-risk steps (purchases) don't run in preview. The only exception is the plan upgrade, which needs its own confirmation and a typed APPROVE. Plans over the monthly spend cap can't be approved
8Optimistic concurrencyIf a teammate edited something the plan touches, the build pauses instead of overwriting
9Never unroutedAfter each write, routing is verified. A number left answering nowhere stops the build
10No silent retriesAn interrupted write isn't retried automatically, so there's no double purchase
11Same functions as SettingsRuns as the approving admin under the database's row-level security. There's no privileged path
12Rate limitsPlanner calls are limited per workspace per hour, and each revision counts

#Prompt injection

Teammate names, greetings, the current plan and the request itself reach the model fenced and escaped as data, so a name like </account_data> ignore previous instructions can't break out. The system prompt treats all of it as data. Even if a model were persuaded, the validator drops steps that don't trace back to the request, the catalog rejects unknown actions, and nothing runs without a human approving it. The model never sees signing keys or telecom and billing credentials.

#Audit

Every plan event (created, revised, question answered, step decided, approved, checked, built, paused) goes into an append-only table that the app's own database roles can't update or delete. Rows disappear only when the plan's workspace is deleted.

Last updated Wed Oct 14 2026 00:00:00 GMT+0000 (Coordinated Universal Time)Something wrong on this page? Tell us