Two cross-cutting controls govern who can touch the fleet and how the graph stays honest:
owner, admin, member, viewer) decides
which permission strings they hold, and each route demands a specific one.drift_events row for an operator to resolve.This pocket is the lookup reference for both. For the task-oriented walkthroughs, see the How-To pocket.
RBAC and drift meet at the resolution step. Detecting drift is automatic and needs no caller; resolving it is a write to the catalog, so the resolution endpoints (accept, reapply, snooze) are gated by the same RBAC matrix as any other data write:
data:read — held by every role, down to
viewer.data:write — held
by member and above.Neither path mutates real infrastructure. Accepting a drift event writes the
observed value into Terrantula's own catalog; it never runs terraform apply.
Pushing the catalog value back out to infrastructure flows through Actions →
pull requests → your CI, exactly as every other change does.
This pocket documents drift events — an entity's stored properties vs. what an internal reconciler observes. That is distinct from cross-source drift, which tracks an entity against the external IaC source it was imported from (a TFC state file, an Atmos stacks dir, an S3 state). They use different tables and different APIs. The cross-source flow lives in the Cross-source drift how-to.
requirePermission /
requireMethodPermission gate routes.drift_events schema,
event lifecycle, reconciler behavior, and the API/SDK surface.