Skip to main content

Permission Matrix: Enterprise RBAC (FR-008, FR-014)

Version: 1.1
Status: Active
FRs: FR-001, FR-002, FR-008, FR-012, FR-014, FR-016
Date: 2026-03-26 (updated 2026-03-26 β€” T121)

Overview​

This matrix enumerates protected capabilities across all FR-008 integration surfaces: Admin UI, Slack, Supervisor, RAG, sub-agents, tools, tasks (Task Builder), skills, A2A, and MCP. Default deny applies to any capability not explicitly listed as allowed for a given role (FR-002).

Keycloak export: Resource names below align with deploy/keycloak/realm-config.json (caipe-platform β†’ Authorization Services β†’ resources admin_ui, slack, supervisor, rag, sub_agent, tool, skill, a2a, mcp). There is no separate task resource in that export yet; task-level checks use the same realm role conventions as agents until a dedicated resource is added (FR-028).

Roles​

RoleDescriptionSource
adminFull platform administrationKeycloak realm role
kb_adminKB administration (all KBs)Keycloak realm role
team_memberTeam-scoped accessKeycloak realm role
chat_userAgent chat accessKeycloak realm role
deniedTest persona: authenticated user without chat/tool/MCP baseline rolesNot a realm role in dev exportβ€”model with offline_access only (see seed denied-user)

Per-resource roles follow the pattern <type>_<permission>:<id> (e.g., kb_reader:my-kb, agent_user:agent-123, task_user:task-456, skill_user:skill-789). Wildcards (kb_reader:*, agent_user:*, etc.) grant access to all resources of that type at that permission level. Sample KB roles ship in realm-config.json; agent / task / skill id-scoped roles are created/assigned at runtime via Admin API / UI as resources are provisioned.

Permission Matrix​

1. Admin UI (admin_ui)​

CapabilityScopeRequired RolesPDPASP Relationship
View dashboardviewadmin, kb_admin, team_member, chat_userKeycloakN/A
View usersviewadminKeycloakN/A
Manage usersadminadminKeycloakN/A
Manage rolesconfigureadminKeycloakN/A
View audit logsaudit.viewadminKeycloakN/A
Configure platformconfigureadminKeycloakN/A
View teamsviewadmin, kb_admin, team_memberKeycloakN/A
Manage teamsadminadminKeycloakN/A

2. Slack (slack)​

CapabilityScopeRequired RolesPDPASP Relationship
Use bot commandsinvokechat_user, team_member, kb_admin, adminKeycloakN/A
Admin bot commandsadminadminKeycloakN/A
Identity linkingconfigureAny authenticatedKeycloakN/A

3. Supervisor (supervisor)​

CapabilityScopeRequired RolesPDPASP Relationship
Invoke assistantinvokechat_user, team_member, kb_admin, adminAGN/A
Configure routingconfigureadminAGN/A
View routing configviewadminAGN/A

4. RAG (rag)​

CapabilityScopeRequired RolesPDPASP Relationship
Query KBquerychat_user, team_member, kb_admin, admin, kb_reader:<id>AG + RAG serverPer-KB filter
Ingest dataingestkb_admin, admin, kb_ingestor:<id>AG + RAG serverPer-KB filter
Admin KBadminkb_admin, admin, kb_admin:<id>AG + RAG serverPer-KB filter
Create RAG tooltool.createteam_member, kb_admin, adminKeycloakTeam-scoped
Update RAG tooltool.updateteam_member (own team), kb_admin, adminKeycloakTeam-scoped
Delete RAG tooltool.deleteteam_member (own team), kb_admin, adminKeycloakTeam-scoped
View RAG toolstool.viewchat_user, team_member, kb_admin, adminKeycloakN/A

5. Sub-agents (sub_agent)​

CapabilityScopeRequired RolesPDPASP Relationship
Dispatchinvokechat_user, team_member, kb_admin, adminAGDeny wins with ASP
View resultsviewchat_user, team_member, kb_admin, adminAGN/A
Configure / route sub-agentconfigureadminKeycloak / AGN/A
Sub-agent administrationadminadminKeycloak / AGN/A

6. Tools (tool)​

CapabilityScopeRequired RolesPDPASP Relationship
Invoke toolinvokechat_user, team_member, kb_admin, adminAGDeny wins: if ASP denies, tool is blocked even if RBAC allows
Configure toolconfigureadminAGN/A
View tool listviewchat_user, team_member, kb_admin, adminAGFiltered by ASP

7. Skills Gateway (skill)​

Keycloak resource skill in realm-config.json exposes scopes view, invoke, configure, delete. Fine-grained access uses the same three-layer pattern as dynamic agents (FR-028): realm roles, optional resource policies, MongoDB visibility, and CEL where configured.

CapabilityScopeRequired RolesPDPASP Relationship
View skill catalog / metadataviewchat_user, team_member, kb_admin, admin, or skill_user:<id> / skill_admin:<id> for restricted skillsKeycloak + serviceFiltered by ASP
Invoke skillinvokeBaseline roles above, or per-skill skill_user:<id> / skill_admin:<id>AG + serviceDeny wins with ASP
Create / update skill configconfigureskill_admin:<id>, admin, or team maintainer per product rulesKeycloak + serviceN/A
Delete skilldeleteskill_admin:<id> or adminKeycloak + serviceN/A
Wildcardview / invoke / configure / deleteskill_user:*, skill_admin:*Keycloak + serviceSame as per-id, all skills

8. A2A (a2a)​

CapabilityScopeRequired RolesPDPASP Relationship
Create taskcreatechat_user, team_member, kb_admin, adminAGN/A
View artifactsviewchat_user, team_member, kb_admin, adminAGN/A
Cancel taskdeleteOwner or adminAGN/A

9. MCP (mcp)​

CapabilityScopeRequired RolesPDPASP Relationship
List toolsviewchat_user, team_member, kb_admin, adminAGFiltered by ASP
Invoke toolinvokechat_user, team_member, kb_admin, adminAGDeny wins: if ASP denies, tool is blocked even if RBAC allows
Admin toolsadminadminAGN/A

10. Task Builder (task)​

FR-008 treats user-defined tasks as first-class alongside agents and skills. The sample Keycloak export does not define a separate task Authorization Resource; enforcement is realm roles + MongoDB + CEL (and BFF routes), analogous to dynamic agents until Keycloak resources are synced for tasks.

CapabilityScopeRequired RolesPDPASP Relationship
List / view task definitionsviewchat_user, team_member, kb_admin, admin, or task_user:<id> / task_admin:<id> (plus team visibility)BFF / Task serviceCEL optional
Execute / schedule taskinvoketask_user:<id>, task_admin:<id>, or baseline platform roles per deploymentAG + serviceDeny wins with ASP
Create / update taskconfiguretask_admin:<id>, team_member (own team), adminBFF / Task serviceTeam-scoped
Delete taskdeletetask_admin:<id> or adminBFF / Task serviceN/A
Wildcardview / invoke / configure / deletetask_user:*, task_admin:*As aboveβ€”

11. Chat & conversations (UI BFF) (FR-008 surface: CAIPE web UI)​

CapabilityScopeRequired RolesPDPASP Relationship
List/create own conversationsview / createAuthenticated user (session)Session + ownershipN/A
Send messages / use chatinvokeTypically chat_user+ for agent-backed chat; product route may not yet call Keycloak per messageSession + optional RBACTool calls via ASP + AG
Open shared / team conversationviewShare recipient or team member per conversation ACLSession + MongoDB ACLN/A

12. Policies & ASP tool configuration (UI BFF)​

CapabilityScopeRequired RolesPDPASP Relationship
View / edit platform policiesview / configureadminKeycloak admin_ui + admin sessionASP policies stored in Mongo β€” admin only

FR-008 ↔ Keycloak Authorization Resources​

FR-008 surfacerealm-config.json resource name
CAIPE Admin UIadmin_ui
Slackslack
Supervisorsupervisor
RAG / KB / RAG tools (AuthZ layer)rag
Sub-agentssub_agent
Runtime toolstool
Skills Gatewayskill
A2Aa2a
MCPmcp
Task Builder(not in export β€” planned / realm roles + app layer)

Keycloak export alignment (operator note)​

The checked-in realm-config.json is a dev sample. Scope policies do not encode every matrix row literallyβ€”for example, rag-query-access attaches query, tool.view, and kb.query to chat-user-role-policy only; team_member and kb_admin gain RAG-related access through other policies (e.g. rag-team-tool-access, rag-kb-admin-access) that may not include the query scope. Before production, reconcile Authorization Services permissions with this matrix (or with operator-guide.md) so PDP outcomes match intended enterprise roles.

Composition with ASP (FR-012)​

The 098 permission matrix and ASP (Answer Set Programming) Global Tool Authorization Policy are independent layers. When both apply:

  1. RBAC is evaluated first (Keycloak or AG).
  2. If RBAC denies, the request is denied (RBAC is authoritative).
  3. If RBAC allows, ASP is evaluated.
  4. If ASP denies, the request is denied (deny wins).
  5. If both allow, the request proceeds.

This is an intersection model: effective access = RBAC ∩ ASP.

Enforcement Points​

PathPDPMechanism
Admin UI (BFF)Keycloak AuthZrequireRbacPermission() in API routes
Slack botKeycloak AuthZrbac_middleware.py
MCP/A2A/AgentAgent GatewayCEL policy rules in config.yaml
RAG serverAG + RAG serverJWT validation + per-KB filter
Dynamic agentsAG + serviceJWT validation + CEL per-agent
Task BuilderBFF + service + AG (if task invokes tools)Realm roles + CEL + MongoDB visibility
Skills GatewayBFF + AG + serviceKeycloak skill + CEL + ASP

Tenant Isolation (FR-020)​

All matrix checks are scoped by org claim from the JWT. A principal in org A cannot access resources belonging to org B. AG enforces tenant isolation via the CEL rule:

has(jwt.org) && has(request.headers.x_tenant_id) && jwt.org != request.headers.x_tenant_id