§05 · Governance & observability

Access control

Who can see and connect to each agent. RBAC decides what a user may do at all; ABAC then narrows access per request — per-agent access lists, which scope sensitive agents to named people, teams, or roles, are one example.

Access to an agent passes two checks, one from each access-control model Exo uses. RBAC (role-based) asks whether the user holds the right permission (e.g. agents:read, agents:invoke) — a property of the user's role, regardless of which agent. ABAC (attribute-based) then decides from attributes of the specific request. Per-agent access lists are one such ABAC policy: they ask whether, for this agent, the user is on the list. Both must pass.

Open vs restricted

  • Open: an agent with no access-list entries is visible to anyone with agents:read.
  • Restricted: add the first principal and the agent becomes visible only to listed users, teams, and roles. Remove the last entry and it flips back to open.

Principals are user, team, or role. A user sees a restricted agent if they're granted directly, are a member of a granted team, hold a granted role, or hold agents:admin (which bypasses the list). Agents a user can't see return 404, not 403, so their existence doesn't leak.

Creation forms ask up front: Private starts the access list with just you, Shared creates the resource open. A resource's creator always keeps full access to it either way.

Access levels

An agent's Access panel showing grants with read and invoke levels
The Access panel on an agent: each grant carries its levels.

Each grant carries three independent levels. None implies another; a principal ends up with everything granted across every entry that matches them.

LevelWhat it admits
readList the resource, open its detail page, see it in pickers. Discovery, not use.
writeChange it: edit, delete, rename, enable or disable, pause.
invokeUse it: run, connect, exec, chat, stream, proxy.

New grants start as read-only; add invoke for anyone who should actually use the resource, including agents calling a tool. Levels never widen RBAC: the role permission is still required, the level narrows what it reaches.

Grant & revoke

Manage the list from the dashboard's Access tab. Each grant adds one principal with its levels; each revoke removes one. To reopen an agent, revoke its last entry. This requires agents:admin.

Require MFA

Any agent, tool, or file system can additionally demand a fresh MFA check before it is used: the Require MFA to invoke toggle at the bottom of the Access panel. When the workspace already enforces MFA tenant-wide the toggle shows as required and cannot be loosened per resource.

Permission matrix

The full RBAC catalogue — every key Exo's built-in handlers gate, mirroring model.SystemPermissions — against the two seeded roles. means the role holds that permission. Admin carries the entire catalogue (rebuilt from the system list on every release, so it never misses a new key); Member is the narrow read-plus-invoke seed. Tenant-authored roles mix and match any of these, and custom permissions add rows your own code gates on.

PermissionWhat it gatesAdminMember
users:readSee team members & pending invitations
users:inviteInvite new members
users:writeEdit or remove members
roles:readView roles & their assignments
roles:writeCreate/edit roles and assign permissions
idp:readView identity providers (SSO / SCIM)
idp:writeConfigure identity providers
teams:readView tenant-authored teams
teams:writeCreate/edit teams & membership
agents:readSee agents (subject to access lists)
agents:invokeAttach to and run agents
agents:writeEdit the Agent CR
agents:adminManage per-agent access lists; bypass ABAC visibility
deployments:readView Exo Operator deployments
deployments:writeManage deployments & tokens
deployments:deleteDelete deployments
sessions:readInspect session transcripts & tool calls
sessions:writeCheckpoint / resume sessions
audit:readRead the audit streams
audit:exportExport the audit streams
events:readRead the platform activity / event stream
sandboxes:readView code sandboxes
sandboxes:writeCreate / edit sandboxes
sandboxes:invokeRun code sandboxes
sandboxes:deleteDelete sandboxes
tools:readView the Cluster Tools catalogue
tools:writeManage Cluster Tools
policies:readView Runtime Policies
policies:writeManage Runtime Policies
policies:deleteDelete Runtime Policies
approvals:readSee pending approval requests
approvals:decideApprove or deny held commands
guardrails:readView guardrails
guardrails:writeManage guardrails
integrations:readView Slack / Jira / Adaptive integrations
integrations:writeManage integrations
oauth_apps:readView OAuth Apps
oauth_apps:writeManage OAuth Apps
providers:readView LLM provider gateways
providers:writeManage LLM providers & credentials
tenant:readView tenant settings
tenant:writeEdit tenant settings
skills:readView the Skills catalogue
skills:writeManage Skills
mcp:readView MCP servers
mcp:writeManage MCP servers
claw:readView Claw
claw:writeManage Claw
memory:readView agent memory
memory:writeManage agent memory
log_storage:readView log-storage config
log_storage:writeManage log-storage config

Visibility & permissions

Grant and revoke are admin-only; each records who granted access (granted_by) and when (granted_at). See Roles & permissions for the permission catalogue and how teams differ from IdP groups.