§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.

Grant & revoke

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

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
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.