Authorization model
How Cedar rules evaluate permit and forbid against the assembled effective policy
The authorization model is how Dome decides whether an agent may call a tool or model. Dome evaluates Cedar permit and forbid policies against a typed entity model on every governed request. Any matching forbid denies the request, and when no rule matches, the request is denied.
How a request is decided
Each request maps to one principal (Dome::Agent), one action (Dome::Action), and one resource (Dome::MCPTool or Dome::LLMModel). Conditions may also read request context and, when present, verified act-as claims on the principal.
permit(
principal == Dome::Agent::"data-pipeline",
action == Dome::Action::"mcp:call",
resource == Dome::MCPTool::"database-query"
);
forbid(
principal,
action == Dome::Action::"mcp:call",
resource == Dome::MCPTool::"production-deploy"
) unless {
principal has metadata &&
principal.metadata has deploy_target &&
principal.metadata.deploy_target == "production"
};Evaluation semantics
- The evaluator checks every rule in the effective policy against the request.
- If any
forbidmatches, the request is denied, regardless of any matchingpermit. - If no
forbidmatches and at least onepermitmatches, the request is allowed. - If no rule matches at all, the request is denied (default-deny / fail-closed).
forbid always wins. A forbid at organization scope cannot be overridden by a permit at agent scope. Design rules accordingly: broad restrictions at higher scopes, specific allowances at lower scopes.
Effective policy
The effective policy is the merged set of all active rule bundles across the scope hierarchy. Assembly works as follows:
- Fetch the active bundle at each scope: organization, tenant, workspace, agent.
- Merge Cedar files with scope-prefixed filenames (
org/rules.cedar,workspace/rules.cedar) to prevent name collisions. - Compute a composite content hash from the merged file list.
- Load the merged policy into the evaluator as a single PolicySet.
The gateway polls for content-hash changes on a sync interval (default: 10 seconds). When a bundle is deployed or rolled back, the hash changes and the gateway picks up the new policy on the next sync.
Per-workspace vs per-agent evaluation
| Deployment | Evaluator | Use case |
|---|---|---|
| Hosted gateway | WorkspaceRuleEvaluator maintains separate policy sets per assigned workspace | Multi-tenant shared gateway |
| SDK / dedicated runtime | RuleEvaluator uses a single workspace policy set | Dedicated per-service deployment |
Both evaluators enforce the same Cedar semantics. The hosted gateway adds per-workspace freshness checks. If a workspace's policy has not synced within its configured freshness window, the affected tool.call or model.call completes with result=denied and denial.reason=stale_policy.
Fail-closed behavior
The authorization model is fail-closed at every level:
- No matching rule: denied by default.
- Evaluator error: denied.
- Stale policy: denied (hosted gateway only, per-workspace freshness window).
- No policy loaded: denied.
Cedar itself has no permissive or audit-only mode. Use simulation to test rule changes before deploying.
Next steps
With that Cedar evaluation model in mind, continue with:
- Rules concept for bundles, scopes, and effective Rules
- Rules reference for entity, action, and attribute catalogs
- Authorize Access to write, validate, simulate, and apply Rules
- Permissions concept for platform RBAC (separate from Cedar)
- Scopes concept for the hierarchy that feeds effective policy