The entitlement export
Raw grant rows cannot be reviewed: between the group DAG, role indirection, implicit manager subjects,everyone, and revokes, effective access is a computation. exportEntitlements runs it per user:
held), not rows. What remediation uses: the sources. Each one names the grant row to revoke or end-date, and a personal revoke covers the “remove this one person from inherited access” case. Write-back is the ordinary API; there is no parallel remediation surface to integrate.
Candidates default to every user the store can name (records plus user-subject grant rows); pass { userIds } for a population your host enumerates. Pair each export with the audit cursor for the evidence trail, and with listSodViolations for the conflicts page of the same review.
Wildcard drift: what changed since you certified
Forward-inclusive wildcards are a deliberate commitment: a storeddocs.files.* grant absorbs keys published under that prefix later, with no write and no re-review trigger. A grant certified in Q1 may therefore confer permissions that did not exist in Q1. Since 0.7.0 every catalog publish retains its document, and the drift report makes the absorption visible:
listWildcardDrift({ sinceVersion }); every finding is a grant or assigned role now conferring more than what was signed. Expired grants and unassigned roles are excluded, since they confer nothing. removedKeys surfaces tombstone candidates in the other direction.
Drift needs catalog history. The bundled drivers retain it (the Prisma schema’s optional
AlfizCatalogVersion model); a schema without the model answers unsupported rather than wrongly.The IGA integration shape
- Ingest: run
exportEntitlements()on the IGA’s collection schedule and mapuserId+entitlements[].key(+ per-sourcescope) onto its entitlement model. The export is deterministic JSON; diffing two runs is the IGA’s incremental feed. - Certify: campaigns, reviewer routing, and attestations live in the IGA. Alfiz’s reporting hierarchy (
getReportingEdges) can seed reviewer assignment. - Remediate: the IGA’s revoke decision calls your endpoint, which calls
deleteGrant/createRevoke/ an expiry update, audited like every write. A review that cannot remediate is not a control, and this one closes the loop with three ordinary calls. - Evidence: the audit export (cursor paging, optional hash chain) is the record that the remediation happened.