4. Policy language
Policies are declarative. The reference evaluator is deterministic, side-effect free, and usable without an agent or network call.
interface Policy {
id: string;
effect: 'allow' | 'deny';
principal: SubjectSelector;
operation: Operation | Operation[];
resource: ResourceSelector;
scope?: ScopeExpression;
conditions?: ConditionExpression[];
obligations?: Obligation[];
priority: number;
validDuring?: TimeWindow;
version: string;
}
interface AuthorizationRequest {
requestId: string;
subject: Subject;
operation: Operation;
resource: ResourceRef;
proposedInput?: unknown;
purpose?: string;
context: RequestContext;
}
interface Decision {
requestId: string;
effect: 'allow' | 'deny';
reasonCode: string;
matchedPolicies: string[];
obligations: Obligation[];
fieldFilter?: FieldFilter;
expiresAt?: string;
policyVersion: string;
}
4.1 Conditions
Subject and scope
subjectIs, roleIs, ownerIsSubject, resourceInWorkspace, fieldsWithin
Context
purposeIs, approvalPresent, timeBetween, deviceTrustAtLeast, mfaRecent
Input constraints
recipientCountAtMost, amountAtMost, domainIs, queryContainsNoSecrets
Obligations
requireConfirmation, previewChanges, redactFields, writeReceipt, requireHumanReview
policy.allow({
id: 'john-send-own-mail',
principal: subject('user:john'),
operation: 'execute',
resource: capability('mail.send'),
scope: { mailbox: 'user:john' },
conditions: [
purposeIs('job_outreach'),
recipientCountAtMost(20),
approvalPresent('this_action')
],
obligations: [writeReceipt(), requireConfirmation('explicit')]
});