Skip to main content
The authority: section says which principal may propose which action. It lives at the top of ctrlrun.yaml from ctrlrun.policy/v3, or in a standalone document passed with --authority whose only keys are schema and authority. It is opt-in and then fail-closed: absent, nothing changes; present, every principal needs a matching grant and no grant means denied. A test asserts this page names every key the loader accepts.

The section

A grant

A grant carries no decision:. How much autonomy an action has is the policy’s answer, the same for everyone; the grant answers whether this principal may ask at all.
runnable

How a grant matches

A grant covers an action when the subject matches the principal, the action name matches one of actions, the resolved resource matches one of resources, the environment is in environments, every constraint holds over the arguments, and expires_at has not passed. Every failing reason is collected and the reported one follows a fixed order, so the evidence for a configuration does not depend on the order grants appear in the file. Where several grants match, the receipt names the lowest id.

Delegation

ctrlrun delegate --parent <id> --file grant.yaml --as AGENT[/USER] writes a delegated grant beneath a delegable one. The file has the keys above minus id. It is accepted only if it is provably a subset of its parent on every dimension, at creation and again at every evaluation:
  • a narrower or equal subject (never a wildcard, never dropping the parent’s user);
  • actions, resources, environments each a subset;
  • constraints no looser on any argument;
  • expires_at no later than the parent’s.
Omitting a dimension the parent constrains is rejected, not inherited. A child that leaves out resources: would authorize resources its parent never could. ctrlrun revoke <id> cuts a chain of any depth with one write and is not reversible.

What the section does not do

It does not authenticate anybody: the principal comes from the identity provider, and --as on the command line is an assertion recorded as created_via: cli. It does not match on a token claim, does not propagate across an agent-to-agent hop, and does not hot-reload: revocation and expiry are live, an edited file takes effect when the process next loads it.

Next