Read the authorization change history for a subject, paged by revision. The
audit surface the first compliance conversation opens: who granted what, when.
The number of Action variants (including the Unrecognized catch-all):
the stride of the shared coarse-capability bitmask layout (action_index).
The stride must cover every action so one feature’s last action bit never
collides with the next feature’s first.
The bit index of a (feature, action) in the coarse-capability bitmask, a
pure function shared by every enforcer so the fork and the plane cannot drift.
Feature/Action are VariantArray enums, so the ordinal is stable per wire
revision.
The on-behalf-of check: an agent acting for a user is permitted an op only
when both its own grants and the invoking user’s grants permit it. The agent
can never exceed the user who invoked it (permission intersection).
The (feature, action) a managed command code authorizes against. None for
a code with no capability semantics (hello, backend hello, client metadata,
batch, and the authz band itself), which is gated another way.
Whether grants permit (feature, action) on resource, deny-wins. An
empty set permits nothing (there is no allow to match). resource is the
selector decoded from a request, or None for an unkeyed op.
The canonical role-name rule, shared by the SDK, the server, and the
console so a name accepted by one tier is never rejected by the next. A
valid name is non-empty, at most MAX_ROLE_NAME_BYTES bytes, and made
only of ASCII letters, digits, -, _, and .. Enforced on define and
bind, never on replay: a journaled role loads regardless, so tightening the
rule cannot strand existing state.