Skip to main content

RBAC Permission Matrix

This document defines the Role-Based Access Control (RBAC) system used in Aragora for fine-grained authorization.

Overview​

Aragora uses a hierarchical RBAC system with:

  • 8 System Roles with predefined permissions
  • 100+ Permissions covering all resource types
  • Role Hierarchy for permission inheritance
  • Custom Roles for organization-specific needs

System Roles​

RolePriorityDescriptionUse Case
Owner100Full control over organizationOrganization founders
Admin80Manage users and resources (no billing)IT administrators
Compliance Officer75Data governance and auditSecurity/compliance teams
Team Lead55Manage team membershipEngineering managers
Debate Creator50Create and run debatesPower users
Member40Standard organization accessRegular employees
Analyst30Read-only analytics accessData analysts
Viewer10Minimal read accessExternal stakeholders

Role Hierarchy​

Owner
└── Admin
├── Compliance Officer
│ └── Analyst
│ └── Viewer
└── Debate Creator
└── Team Lead
└── Member
└── Viewer

Roles inherit all permissions from their descendants in the hierarchy.

Permission Categories​

Core Permissions​

Debates (debate.*)​

PermissionOwnerAdminComplianceTeam LeadCreatorMemberAnalystViewer
debate.create✓✓-✓✓✓--
debate.read✓✓✓✓✓✓✓✓
debate.update✓✓-✓✓---
debate.delete✓✓------
debate.run✓✓-✓✓✓--
debate.stop✓✓-✓✓✓--
debate.fork✓✓-✓✓✓--

Agents (agent.*)​

PermissionOwnerAdminComplianceTeam LeadCreatorMemberAnalystViewer
agent.create✓✓------
agent.read✓✓✓✓✓✓✓✓
agent.update✓✓------
agent.delete✓✓------
agent.deploy✓✓------

Users (user.*)​

PermissionOwnerAdminComplianceTeam LeadCreatorMemberAnalystViewer
user.read✓✓✓✓✓✓✓-
user.invite✓✓------
user.remove✓✓------
user.change_role✓✓------
user.impersonate✓-------

Organization (organization.*)​

PermissionOwnerAdminComplianceTeam LeadCreatorMemberAnalystViewer
organization.read✓✓✓✓✓✓✓✓
organization.update✓✓------
organization.manage_billing✓-------
organization.view_audit✓✓✓-----
organization.export_data✓✓------

Enterprise Permissions​

Gauntlet (Adversarial Testing)​

PermissionOwnerAdminComplianceTeam LeadCreatorMemberAnalystViewer
gauntlet.run✓✓-✓✓✓--
gauntlet.read✓✓✓✓✓✓✓-
gauntlet.delete✓✓------
gauntlet.sign✓✓------
gauntlet.compare✓✓-✓✓---
gauntlet.export_data✓✓-✓✓---

Compliance & Data Governance​

PermissionOwnerAdminComplianceTeam LeadCreatorMemberAnalystViewer
data_classification.read✓-✓-----
data_classification.classify✓-✓-----
data_retention.read✓-✓-----
data_retention.update✓-✓-----
pii.read✓-✓-----
pii.redact✓-✓-----
audit_log.read✓-✓-----
audit_log.export✓-✓-----

Control Plane​

PermissionOwnerAdminComplianceTeam LeadCreatorMemberAnalystViewer
control_plane.read✓✓✓-----
control_plane.submit✓✓------
control_plane.cancel✓✓------
control_plane.deliberate✓✓------

Computer Use (computer_use.*)​

PermissionOwnerAdminComplianceTeam LeadCreatorMemberAnalystViewer
computer_use.read✓✓------
computer_use.execute✓✓------
computer_use.browser✓✓------
computer_use.shell✓✓------
computer_use.file_read✓✓------
computer_use.file_write✓✓------
computer_use.screenshot✓✓------
computer_use.network✓✓------
computer_use.admin✓✓------

Handler Permission Mapping​

Admin Handlers (/api/v1/admin/*)​

EndpointMethodPermissionNotes
/admin/organizationsGETadmin.organizations.listList all orgs
/admin/usersGETadmin.users.listList all users
/admin/statsGETadmin.stats.readSystem statistics
/admin/metricsGETadmin.metrics.readSystem metrics
/admin/revenueGETadmin.revenue.readRevenue stats
/admin/users/\{id\}/impersonatePOSTadmin.users.impersonateUser impersonation
/admin/users/\{id\}/deactivatePOSTadmin.users.deactivateDeactivate user
/admin/users/\{id\}/activatePOSTadmin.users.activateActivate user
/admin/users/\{id\}/unlockPOSTadmin.users.unlockUnlock account
/admin/nomic/statusGETadmin.nomic.readNomic loop status
/admin/nomic/circuit-breakersGETadmin.nomic.readCircuit breakers
/admin/nomic/resetPOSTadmin.nomic.writeReset nomic phase
/admin/nomic/pausePOSTadmin.nomic.writePause nomic
/admin/nomic/resumePOSTadmin.nomic.writeResume nomic

Security Handlers (/api/v1/admin/security/*)​

EndpointMethodPermissionNotes
/admin/security/statusGETadmin.security.statusEncryption status
/admin/security/healthGETadmin.security.healthSecurity health
/admin/security/keysGETadmin.security.keysList keys
/admin/security/rotate-keyPOSTadmin.security.rotateRotate key

Billing Handlers (/api/v1/billing/*)​

EndpointMethodPermissionNotes
/billing/usageGETorg:billingUsage stats
/billing/subscriptionGETorg:billingSubscription details
/billing/checkoutPOSTorg:billingCreate checkout
/billing/portalPOSTorg:billingBilling portal
/billing/cancelPOSTorg:billingCancel subscription
/billing/resumePOSTorg:billingResume subscription
/billing/audit-logGETadmin:auditBilling audit log
/billing/usage/exportGETorg:billingExport usage
/billing/usage/forecastGETorg:billingUsage forecast
/billing/invoicesGETorg:billingInvoice history

Custom Role Creation​

Organizations can create custom roles based on system roles:

from aragora.rbac.defaults import create_custom_role

engineering_role = create_custom_role(
name="engineering",
display_name="Engineering Team",
description="Engineering with agent management",
permission_keys={
"agent.create",
"agent.update",
"connector.create",
},
org_id="org-123",
base_role="debate_creator", # Inherit permissions
)

Role Templates​

TemplateBase RoleAdditional Permissions
engineeringdebate_creatoragent.create, agent.update, connector.create
researchanalysttraining.create, debate.create, debate.run
supportvieweruser.read, organization.view_audit
externalviewer(none)

Permission Enforcement​

Decorator Usage​

from aragora.rbac.decorators import require_permission

@require_permission("debate.create")
async def create_debate(context: AuthorizationContext, ...):
...

@require_permission("user.impersonate", resource_id_param="user_id")
async def impersonate_user(context: AuthorizationContext, user_id: str, ...):
...

Manual Check​

from aragora.rbac import check_permission, AuthorizationContext

context = AuthorizationContext(
user_id="user-123",
roles={"admin"},
org_id="org-456",
)

decision = check_permission(context, "debate.delete", resource_id="debate-789")
if decision.allowed:
# Proceed with deletion
...

Audit Logging​

All RBAC decisions are logged for compliance:

{
"timestamp": "2026-01-25T12:00:00Z",
"user_id": "user-123",
"permission": "debate.delete",
"resource_id": "debate-789",
"allowed": true,
"reason": "Permission granted via admin role",
"ip_address": "192.168.1.1"
}

Best Practices​

  1. Principle of Least Privilege: Assign the minimum role needed
  2. Role Inheritance: Use hierarchy instead of duplicating permissions
  3. Custom Roles: Create org-specific roles for unique needs
  4. Audit Regularly: Review role assignments quarterly
  5. MFA Enforcement: Require MFA for admin/owner roles