One credential per agent
Secrets are sealed on the server and decrypt only at execution, so an agent holds exactly one credential: its SwitchTender token. It never sees an SSH key, a cloud login, or a vault password. Revoking that one token shuts the door.
One gate, regardless of which tool
Ansible, Terraform, OpenTofu, Bash, PowerShell, Python, and Go all go through the same request, policy, approval, and chain. An agent that chains a Terraform change, an Ansible update, and a shell script inside one incident does not cross into a different approval model partway through: every one of those runs carries the same actor identity, the same policy evaluation, and lands in the same chain. Switching tools does not get an agent out from under the gate.
A human approval gate, bound to content
Agents can propose changes. Only authorized humans can approve them, and this gate is free on every tier. An agent's run waits for a person's approval with no policy written, its dry runs included, unless a rule with effect: exempt covers it, and its Terraform or OpenTofu apply waits twice: once before it plans, and again for the apply its plan proposes, carrying the saved plan. On Team, a rule can require an approver other than the person the agent acts for. An approval comes from a person's session, a person's own token, or a pull request comment from the forge account a person linked, and the server refuses an agent's approval at the route and again where the decision is made.
Policies can also hold people's runs for a person, refuse runs outright, or key on the operation's assessed risk, or on whether an agent or a person asked, and the approval itself is a chain entry committing a digest of the exact change released. The executor refuses a change that drifted after the decision, so what a person approved is provably what ran. An approver can record why, masked for known secrets, kept as audit evidence, and committed so a receipt holder can check it offline. Community holds plain rules of your own, as many as you need: require-approval policies and exemptions, each of which can be narrowed to a single tool, for instance, rather than holding everything. Pro adds refusing a run outright and keying on risk. The full engine is Team: scoping a rule to agents, to a named actor, or to the account a token is bound to, and requiring that the approver not be the requester.
MCP with no approve tool
An agent runtime that speaks the Model Context Protocol connects straight to switchtender mcp with its agent token. It serves seven MCP tools: list templates, propose a run, list recent runs, read a run, its log, and its evidence, and list the workflow approval steps waiting for a person. There is no approve tool and no way to widen its own reach. --allow-adhoc adds an eighth that lets the agent compose a run of its own rather than launch a template an operator wrote, and even that one is held by default and goes through the same approval policy. Hand it an admin token, which an agent could use to release its own runs, and the command exits instead of starting. Serving on one anyway means typing --allow-admin-token, which exists for a local trial and prints a warning naming the risk at every start. The safe setting is the one you get without asking for it, so the same gated, chained, fail-closed request a person makes is the only thing an agent can make.
Actor-level provenance
Every entry names the actor behind it, whether it was a person or an agent (actor_type), and whose authority it used (on_behalf_of), all committed by the entry hash. The kind is declared when the token is minted, with --agent, rather than guessed from how a request looks, so an agent's changes stay attributable instead of blurring into a shared account. The live demo seeds an agent token named remediation-agent, bound to the ops-lead account the way switchtender token new --user ops-lead --agent mints one. Every request it makes goes through the real API with that token: its restart and its Terraform apply are held for a person, the workflow that would carry the apply inside it is refused at submission, its attempt to approve its own held run is refused at the door, and its smoke test runs under a narrow exemption. A run an agent asks for records which agent, the account it is bound to, and who provisioned its token, and each approval records who approved it and how separation of duties was evaluated.
Fail-closed recording
Every mutation is written into the audit chain before its handler runs. If the record cannot be written, the change is refused with a 503 instead of performed silently. There is no path where an agent changes something and nothing is written down.
A receipt for every change
Every mutation other than signing in or out returns an Audit-Receipt header naming its sequence and hash. Keep them. A receipt later proves the chain still holds that exact entry at that exact position, so an omission is detectable by the party it happened to.
Sealed offline verification
switchtender audit bundle emits the chain as a signed LoomSeal bundle. It verifies on a machine with no network and no SwitchTender install, against the key the server publishes at /.well-known/loomseal.json.