Permission changes and audit trails
Keeps authorization decisions current after role changes and records policy or approval history without leaking denied data.
policy-audit-cache-invalidation
Team members using this skill
When is it useful?
Use when revoked access remains cached or approvals become stale after edits.
What does it help you do?
- Invalidates affected permission caches across relevant sessions and services.
- Records before-and-after policy changes and approval lifecycle events.
- Returns safe denial responses without revealing inaccessible resources.
Try asking this
Revoke a team role during an active session and verify immediate denial plus an attributable audit record. Warm the permission cache before revocation and repeat the protected request afterward. Denial should be immediate and the audit record should name who changed access.
Detailed documentation
Read the skill’s original instructions, examples and checks in their authored language.
Show less
Policy Audit & Cache Invalidation
When to Use
Use when implementing permission caching, JWT/session claim validation, policy decision logging, or compliance audit trails for authorization and approval systems.
1. Permission Cache Hygiene & Immediate Invalidation
Caching authorization decisions or embedding roles inside long-lived stateless JWTs introduces a dangerous revocation lag where a fired employee, downgraded member, or revoked API key retains access until TTL expiry:
- Never Cache Permission Decisions Indefinitely: Every cached role/permission lookup must have a short, bounded TTL and deterministic event-driven invalidation.
- Include Subject & Resource Version Stamps in Cache Keys:
- Maintain a
permissions_version(orupdated_atepoch) onworkspace_membershipsandusers. - When a user's role changes, a membership is revoked, a delegation is cancelled, or an organization's plan changes, increment
permissions_versionand purgetenant:${tenantId}:authz:${userId}:*.
- Maintain a
- Resource-State Decisions Must Not Be Stale-Cached:
- Decisions that depend on mutable resource state (
quote.status === 'pending_approval',quote.amount,account.owner_id) must evaluate against the current database row (or transaction-locked row for mutations), never a stale cached boolean.
- Decisions that depend on mutable resource state (
2. Structured Authorization & Approval Audit Trail
Sensitive access checks, policy mutations, and approval decisions must be traceable and tamper-evident:
What Must Always Be Logged
- Policy & Role Mutations: Role assignments, permission matrix edits, delegation grants/revocations, and approval threshold configuration changes (with
beforeandafterdiffs). - Approval Lifecycle Events:
approval.requested,approval.approved,approval.rejected,approval.superseded(when edits invalidate a prior approval), andapproval.expired—recordingsubject_type,subject_id,subject_version,payload_sha256,requester_id,decider_id, andreason. - Sensitive Reads & Authorization Denials:
- Access to restricted/PII fields or bulk data exports (
export.executed). - High-severity authorization denials (
authz.deniedon privilege escalation attempts, cross-tenant probes, or self-approval attempts), including which policy rule denied the action (rule: 'sod.no_self_approval').
- Access to restricted/PII fields or bulk data exports (
Safe Error Responses (Zero Data Leakage on Denial)
- Record the detailed denial reason (
missing_role,wrong_department,status_locked,cross_tenant_mismatch) in the server-side audit log. - Return only a safe, minimal error to the caller (
404when the caller has no read visibility on the resource;403with a domain reason code likeself_approval_forbiddenorinsufficient_roleonly when the caller is already authorized to view the resource).
Included files 1
SKILL.md
