Documentation Index
Fetch the complete documentation index at: https://docs.emergence.ai/llms.txt
Use this file to discover all available pages before exploring further.
Configure Roles and Permissions
CRAFT uses OpenFGA for Relationship-Based Access Control (ReBAC). This guide covers setting up roles, assigning permissions, and configuring the permission inheritance model across organizations, projects, and resources.Prerequisites
Before you begin, ensure you have:
- A running CRAFT with the Governance service bootstrapped
- Administrative access (the
adminorownerrole on the target organization) - A valid JWT token for the admin user
- The OpenFGA schema loaded during Governance bootstrap
How Permissions Work
The platform uses a relationship-based model rather than traditional role-based access control. Permissions are computed at query time from relationships between users, roles, and resources.Role Hierarchy
| Role | Scope | Capabilities |
|---|---|---|
owner | Organization | Full control, can transfer ownership, manage all settings |
admin | Organization / Project | Manage users, projects, settings. Cannot transfer organization ownership |
member | Project | Standard access to project resources |
developer | Project | Create and modify agents, data connections, workflows |
operator | Project | Deploy, schedule, and monitor resources |
viewer | Project | Read-only access to all resources |
Computed Permissions
Permissions are derived from roles via the OpenFGA schema:| Permission | owner | admin | member | developer | operator | viewer |
|---|---|---|---|---|---|---|
can_read | Yes | Yes | Yes | Yes | Yes | Yes |
can_write | Yes | Yes | Yes | Yes | No | No |
can_delete | Yes | Yes | No | No | No | No |
can_execute | Yes | Yes | Yes | Yes | Yes | No |
can_manage_secrets | Yes | Yes | No | No | No | No |
Step 1: Understand the OpenFGA Schema
The permission model is defined in the OpenFGA Schema DSL. The schema lives at:The runtime JSON version at
openfga-schema.json is what the Governance service reads at startup. After editing the .fga file, run ./scripts/generate-openfga-schema.sh to regenerate the JSON.Step 2: Assign Organization Roles
Assign roles to users at the organization level using the Governance API.- API
- Python SDK
Step 3: Assign Project Roles
Project roles provide finer-grained control within an organization.Permission Inheritance
Roles inherit downward through the hierarchy:Organization owner
Automatically has admin-level permissions on all projects and resources within the organization.
Organization admin
Automatically has admin-level permissions on all projects. Can create and delete projects.
Project developer
Has
can_read, can_write, and can_execute on all resources within the specific project. Cannot delete resources or manage secrets.Step 4: Verify Permissions
Check whether a user has a specific permission on a resource:Common Permission Patterns
Data team with read-only analytics access
Data team with read-only analytics access
Assign
viewer on the project containing data connections and dashboards. Users can run queries via Data Insights but cannot modify data connections or agent configurations.DevOps team managing deployments
DevOps team managing deployments
Assign
operator on the target project. Operators can deploy agents, trigger schedules, and monitor health, but cannot modify agent code or data connection credentials.Service accounts for CI/CD
Service accounts for CI/CD
Create Keycloak client credentials and assign
developer or operator on the target project. Service accounts authenticate via client credentials grant and have the same permission model as human users.Cross-project access
Cross-project access
A user can have different roles on different projects within the same organization. Assign roles per project to implement least-privilege access.
Integration with SSO Groups
When SSO is configured, IdP groups map through Keycloak to OpenFGA:Schema Modifications
To add a new permission:- Edit
packages/em_runtime_governance/schema/openfga-schema.fga - Run
./scripts/generate-openfga-schema.shto regenerate the runtime JSON - Update the
Permissionsclass inpackages/em_runtime_common/src/common/permissions.py - Run
make dev-syncto regenerate SDKs
Troubleshooting
Permission checks returning 403
Permission checks returning 403
Verify the OpenFGA schema is loaded by checking Governance bootstrap logs. Ensure the user’s JWT contains the correct groups claim. Confirm the user has been assigned a role on the target project.
Inherited permissions not working
Inherited permissions not working
Check that the project has a
parent relationship to the organization in OpenFGA. This is set automatically when projects are created via the Governance API.Role changes not taking effect
Role changes not taking effect
OpenFGA evaluates permissions at query time — there is no caching delay. If changes are not reflected, verify the role assignment was successful by listing members on the project.
Next Steps
SSO Integration
Configure SSO to automate group-to-role mapping from your IdP.
Authorization Deep Dive
Learn about the full OpenFGA schema and computed permissions model.
Multi-Tenancy
Understand how permissions integrate with the multi-tenant architecture.
Security Overview
Review the complete security model including authentication and data protection.

