Skip to content
rev0Docs

The permission gate

The board runs agents that execute shell commands and edit files on your machine, so every tool and command an agent reaches for is checked against a permission gate before it runs. Anything outside the agent’s pre-approved set pauses the run and parks the ticket in Pending Action until a human answers; Approve a tool request walks through that, and Permission lists lists what the gate checks against.

A new MCP server gets no free pass: its first call routes through the same panel as any other new tool.

Some commands always ask. Recursive deletion, sudo, git push, piping a download into a shell and the rest of the built-in dangerous list go to a human even under the default command policy, and the built-in safe baseline never approves one. Only a grant you give yourself (an Always allow on the panel, or Allow under Settings > Security > Command permissions) lets one through, and a Deny entry beats everything. The full order is in Permission lists.

The gate needs an approval channel: a way for the engine to stop before a tool runs and wait for the board’s answer. Not every engine has one.

EngineGatedWhy
Claude CodeYesEvery tool call goes through the board’s approval callback.
Codex (the default app-server transport)YesThe transport has an approval channel, so a Codex run gets the same panels and grants as a Claude run. Codex is handed whole MCP servers, so a deny entry that bans one tool on a server does not hold; ban the whole server (mcp__<name>__*) instead.
Codex with REV0_CODEX_TRANSPORT=execNoThe older exec transport has no approval channel. Its sandbox still follows the run (read only for a plan), but no command reaches the board first. It is an escape hatch, not a mode to run in.
CursorNoCursor’s print mode has no approval callback. The board runs it with --force inside Cursor’s own sandbox (read only --mode ask for a plan run), so Cursor’s sandbox and project permissions apply, but the board never sees a command before it runs.

The run itself says so: when a rule is not in force, the board posts an Engine parity comment on the ticket at the start of the run naming it. Give those engines only work you would let run unattended, in a repo you can reset. Run Codex instead of Claude Code covers both engines.

The gate decides which command runs. It does not decide what that command can read: by default every process an agent spawns inherits the board’s own environment, which includes REV0_AUTH_TOKEN (the board’s API token, exactly what would let a command go around the gated tools), your Jira and Slack tokens, and SSH_AUTH_SOCK (signing with your SSH keys without ever seeing a private key).

Allow-list the agent’s environment (Settings > Automation > Features) turns that around: the child environment is built from an allow-list instead of inherited. Agents keep PATH, HOME, the temp, locale and timezone variables, TLS and proxy settings, the VIRTUAL_ENV and UV_* venv pins and the engine’s own credential; everything else is dropped. The board’s kanban MCP tools are unaffected, because that server has always been handed its token explicitly rather than inheriting one.

It is off by default on purpose: an integration on your machine may legitimately read an inherited variable, and stripping it silently is miserable to diagnose. Notable casualties once you turn it on are SSH_AUTH_SOCK (an agent pushing over SSH), GH_TOKEN and GITHUB_TOKEN (an agent shelling out to gh, whose own login still works) and any cloud credential (AWS_*, GOOGLE_*). Name the ones you need in Extra variables to pass through. This is a second, independent layer: it changes nothing about the gate itself.

The gate governs agents. It does not protect a board that anyone on the network can reach: whoever reaches an unauthenticated port can create tickets and approve requests themselves. That is what the access token is for; see Security.