Governance, approvals, entitlements, and feature flags
Clank uses one data only policy vocabulary for browser users, agents, services, hosted limits, and staged feature delivery. Evaluation is deterministic and deny by default.
Clank uses one data-only policy vocabulary for browser users, agents, services, hosted limits, and staged feature delivery. Evaluation is deterministic and deny-by-default.
import {
defineGovernancePolicy,
entitlement,
evaluateFeatureFlag,
evaluatePolicy,
} from "@clank.run/framework/governance";
const policy = defineGovernancePolicy({
revision: "workspace-18",
rules: [
{
id: "agents-delete-production",
actions: ["todos.delete"],
principalKinds: ["agent"],
resource: "production:*",
effect: "approval",
approvalTtlMs: 5 * 60_000,
},
{
id: "members-write",
actions: ["todos.*"],
roles: ["member"],
effect: "allow",
},
],
entitlements: [
{ key: "projects", limit: 10 },
{ key: "custom-domains", limit: true },
],
flags: [{
key: "new-board",
enabled: true,
default: "classic",
variants: [{ name: "new", weight: 2_500, value: "new" }],
allowRoles: ["operator"],
}],
});
const decision = evaluatePolicy(policy, {
action: "todos.delete",
resource: "production:todos",
principal: { id: "codex", kind: "agent", roles: ["member"] },
});
const projectLimit = entitlement(policy, "projects");
const board = evaluateFeatureFlag(policy, "new-board", {
subject: "workspace_4",
});Rules use exact actions or a trailing wildcard. They can select roles, principal kinds, resource patterns, and exact request attributes. Rules are first-match, so put specific deny or approval rules before broader allows. Policies reject unknown fields, duplicate IDs, invalid schedules, ambiguous variant totals, and non-JSON values.
Agent action approval
issueApproval() creates a short-lived HMAC grant bound to an action, principal, resource, rule, and policy revision. verifyApproval() checks those bindings, lifetime, signature, and an optional used-nonce set. Store a consumed nonce transactionally to enforce one-time use. Use a dedicated random secret of at least 32 bytes; never reuse a session key or store it in policy JSON.
const grant = await issueApproval({
policy,
request,
approvedBy: signedInUser.id,
secret: process.env.APPROVAL_HMAC_KEY!,
});
const accepted = await verifyApproval({
grant,
policy,
request,
secret: process.env.APPROVAL_HMAC_KEY!,
usedNonces,
});Typed feature delivery
Flags can be disabled, scheduled, targeted, or assigned to weighted variants. A stable hash of policy revision, flag key, and subject keeps assignment consistent across servers. Weights use 10,000 basis points; unallocated traffic receives the declared default. Every evaluation records its variant and reason for audits and revision traces.
CLI evaluation
clank workbench policy policy.json todos.delete \
--principal=codex --kind=agent --roles=member \
--resource=production:todos --json
clank workbench flag policy.json new-board \
--subject=workspace_4 --jsonThe workbench reads bounded JSON files and prints protocol-versioned output for humans, agents, and CI.