This specification is maintained by the AgentRules Working Group. Have enhancements or want to claim maintainership?Submit Specification →
securitycritical PriorityID: openfga-contextual-tuples-cache-guardrail

OpenFGA Contextual Tuple Authorization & Deterministic In-Memory Decision Caching

Enforces deterministic cryptographic hashing of request-scoped contextual tuples, store IDs, and model versions within in-memory ReBAC evaluation caches. Prevents authorization bypasses, cache poisoning, and cross-tenant privilege escalation caused by naive cache keys that omit transient contextual claims.

Prohibited Anti-Pattern: Omitting Contextual Tuples from In-Memory ReBAC Cache Keys Causing Permission Leaks

Export Ready-to-Drop Configuration

Select format below to copy code or download file directly.

---
description: OpenFGA Contextual Tuple Authorization & Deterministic In-Memory Decision Caching - Enforces deterministic cryptographic hashing of request-scoped contextual tuples, store IDs, and model versions within in-memory ReBAC evaluation caches. Prevents authorization bypasses, cache poisoning, and cross-tenant privilege escalation caused by naive cache keys that omit transient contextual claims.
globs: src/auth/**/*.{ts,tsx}, src/security/**/*.{ts,tsx}, src/services/**/*.{ts,tsx}, src/middleware/**/*.{ts,tsx}
alwaysApply: true
verified_by: "agentrules.org"
license: "CC-BY-4.0"
source: "https://agentrules.org/rules/openfga-contextual-tuples-cache-guardrail"
---

# OpenFGA Contextual Tuple Authorization & Deterministic In-Memory Decision Caching

> **Severity**: CRITICAL | **Category**: security
> **Anti-Pattern Warning**: Omitting Contextual Tuples from In-Memory ReBAC Cache Keys Causing Permission Leaks

## System Constraints
You are a Principal Security Architect enforcing safe OpenFGA ReBAC patterns. Mandate that every in-memory access decision cache incorporates sorted, canonicalized contextual tuples, authorization model IDs, and tenant boundaries in its cache key. Strictly reject static tuple evaluation caches that omit contextual authorization state.

## Strict Guidelines
- Engineers MUST ALWAYS compute authorization cache keys from a canonical SHA-256 hash that includes storeId, modelId, user, relation, object, and all sorted contextual tuples.
- Engineers MUST NOT cache authorization decisions using only user, relation, and object whenever contextual tuples or request-scoped claims are supplied.
- Services MUST limit in-memory L1 decision cache TTLs to low ceilings (<= 2-5 seconds) to mitigate revocation lag while dampening high-frequency microservice hot loops.
- Code SHOULD leverage contextual tuples strictly for ephemeral request-scoped attributes (e.g., dynamic IP, MFA context, resource lock state) rather than persisting temporary state into persistent OpenFGA storage.
- Components NEVER share in-memory authorization decision entries across distinct tenant boundaries, even if tuple coordinates match.

## Bad vs Good Implementations
### Naive OpenFGA Decision Caching vs. Canonical Contextual Hashing

#### Bad Antipattern (AI Common Hallucination)
> **Why it fails**: The cache key only indexes user, relation, and object. If User A presents a contextual tuple granting ephemeral access (e.g., emergency break-glass or dynamic tenant switch), subsequent requests from User A without that contextual tuple—or under different contextual constraints—will be falsely granted access due to cache poisoning.
```typescript
import { OpenFgaClient, ClientCheckRequest, TupleKey } from '@openfga/sdk';

const l1Cache = new Map<string, boolean>();

export async function checkAccess(
  fga: OpenFgaClient,
  user: string,
  relation: string,
  object: string,
  contextualTuples: TupleKey[]
): Promise<boolean> {
  // VULNERABLE: Cache key ignores contextualTuples, modelId, and tenant boundary
  const cacheKey = `${user}:${relation}:${object}`;
  if (l1Cache.has(cacheKey)) {
    return l1Cache.get(cacheKey)!;
  }

  const { allowed } = await fga.check({
    user,
    relation,
    object,
    contextualTuples
  });

  l1Cache.set(cacheKey, allowed ?? false);
  return allowed ?? false;
}
```

#### Production Standard (Correct)
> **Standard**: Constructs a cryptographically deterministic SHA-256 cache key factoring in store tenant boundaries, model versions, and canonically sorted contextual tuples. Employs bounded LRU TTL caching to enforce revocation timeliness while guaranteeing high-throughput sub-millisecond evaluation.
```typescript
import { OpenFgaClient, ClientCheckRequest, TupleKey } from '@openfga/sdk';
import { createHash } from 'node:crypto';
import { LRUCache } from 'lru-cache';

interface AuthorizationCacheKeyInput {
  storeId: string;
  modelId?: string;
  user: string;
  relation: string;
  object: string;
  contextualTuples?: TupleKey[];
}

const decisionCache = new LRUCache<string, boolean>({
  max: 50_000,
  ttl: 3_000, // 3-second bounded TTL to mitigate revocation lag
  allowStale: false
});

function buildCanonicalCacheKey(input: AuthorizationCacheKeyInput): string {
  const sortedTuples = (input.contextualTuples ?? [])
    .slice()
    .sort((a, b) => `${a.user}:${a.relation}:${a.object}`.localeCompare(`${b.user}:${b.relation}:${b.object}`));

  const canonicalPayload = JSON.stringify({
    storeId: input.storeId,
    modelId: input.modelId ?? 'latest',
    user: input.user,
    relation: input.relation,
    object: input.object,
    tuples: sortedTuples
  });

  return createHash('sha256').update(canonicalPayload).digest('hex');
}

export async function checkAccess(
  fga: OpenFgaClient,
  storeId: string,
  user: string,
  relation: string,
  object: string,
  contextualTuples: TupleKey[] = []
): Promise<boolean> {
  const cacheKey = buildCanonicalCacheKey({
    storeId,
    user,
    relation,
    object,
    contextualTuples
  });

  const cachedDecision = decisionCache.get(cacheKey);
  if (cachedDecision !== undefined) {
    return cachedDecision;
  }

  const { allowed } = await fga.check({
    user,
    relation,
    object,
    contextualTuples
  });

  const decision = allowed ?? false;
  decisionCache.set(cacheKey, decision);
  return decision;
}
```

Recommended MCP Servers (mcp-serverlist.com)

Equip agent with system tools to verify code for this stack.

Recommended Agent Skills (askills.dev)

Ready-to-use executable skill functions tailored to this stack.

Architectural Specification & Invariant Rationale

Architectural Invariant Design: OpenFGA Contextual Tuple Authorization & Deterministic In-Memory Decision Caching

OpenFGA Contextual Tuple Authorization & Deterministic In-Memory Decision Caching defines an industrial-grade behavioral standard for security engineering. Enforces deterministic cryptographic hashing of request-scoped contextual tuples, store IDs, and model versions within in-memory ReBAC evaluation caches. Prevents authorization bypasses, cache poisoning, and cross-tenant privilege escalation caused by naive cache keys that omit transient contextual claims. Modern software architectures require strict adherence to deterministic patterns to guarantee high availability, maintainability, and zero security vulnerabilities.

Framework Paradigm Shift & Drift MechanicsLLMs are trained on millions of open-source repositories containing outdated code, legacy idioms, and unpatched antipatterns. When coding assistants generate implementations for this stack, they default to common statistical tokens: Omitting Contextual Tuples from In-Memory ReBAC Cache Keys Causing Permission Leaks Without an explicit system instruction file, developers spend hours debugging silent failures.
Failure Modes & Production Blast Radius

Hazard Analysis: What Breaks Without This Rule

The following failure modes have been cataloged from hundreds of hours of production code reviews where AI assistants produced non-compliant implementations:

Failure ModeAI Symptom (The Anti-Pattern)SeverityProduction Impact & Remedy
AI Hallucination & Deprecation DriftOmitting Contextual Tuples from In-Memory ReBAC Cache Keys Causing Permission LeaksCritical
Violating this industrial standard introduces regression bugs, security risks, and unexpected runtime failures in production.
Enforce explicit behavioral system directives across all AI coding assistants in your repository.
Silent Architecture InconsistencyAI assistants produce mixed paradigms across files, creating fragmented codebase conventions.Medium
Increases cognitive load during code reviews and leads to maintenance debt across engineering teams.
Pin project conventions in .cursor/rules, CLAUDE.md, and AGENTS.md so all team agents follow identical guardrails.
Architectural Directives in Detail

Step-by-Step Production Directives

Each rule constraint below is injected into the AI agent's system prompt to establish deterministic boundaries:

1

Engineers MUST ALWAYS compute authorization cache keys from a canonical SHA-256 hash that includes storeId, modelId, user, relation, object, and all sorted contextual tuples.

Engineers MUST ALWAYS compute authorization cache keys from a canonical SHA-256 hash that includes storeId, modelId, user, relation, object, and all sorted contextual tuples.

Rationale:AI models frequently generate unconstrained code here because statistical language distributions lack project-specific architectural context. Mandating this directive ensures that generated code adheres to verified industrial production requirements.
Enforcement:Integrated into the Agent Pack rule file. When Cursor, Claude Code, or Codex processes this prompt, it applies this constraint before emitting syntax.
2

Engineers MUST NOT cache authorization decisions using only user, relation, and object whenever contextual tuples or request-scoped claims are supplied.

Engineers MUST NOT cache authorization decisions using only user, relation, and object whenever contextual tuples or request-scoped claims are supplied.

Rationale:AI models frequently generate unconstrained code here because statistical language distributions lack project-specific architectural context. Mandating this directive ensures that generated code adheres to verified industrial production requirements.
Enforcement:Integrated into the Agent Pack rule file. When Cursor, Claude Code, or Codex processes this prompt, it applies this constraint before emitting syntax.
3

Services MUST limit in-memory L1 decision cache TTLs to low ceilings (<= 2-5 seconds) to mitigate revocation lag while dampening high-frequency microservice hot loops.

Services MUST limit in-memory L1 decision cache TTLs to low ceilings (<= 2-5 seconds) to mitigate revocation lag while dampening high-frequency microservice hot loops.

Rationale:AI models frequently generate unconstrained code here because statistical language distributions lack project-specific architectural context. Mandating this directive ensures that generated code adheres to verified industrial production requirements.
Enforcement:Integrated into the Agent Pack rule file. When Cursor, Claude Code, or Codex processes this prompt, it applies this constraint before emitting syntax.
4

Code SHOULD leverage contextual tuples strictly for ephemeral request-scoped attributes (e.g., dynamic IP, MFA context, resource lock state) rather than persisting temporary state into persistent OpenFGA storage.

Code SHOULD leverage contextual tuples strictly for ephemeral request-scoped attributes (e.g., dynamic IP, MFA context, resource lock state) rather than persisting temporary state into persistent OpenFGA storage.

Rationale:AI models frequently generate unconstrained code here because statistical language distributions lack project-specific architectural context. Mandating this directive ensures that generated code adheres to verified industrial production requirements.
Enforcement:Integrated into the Agent Pack rule file. When Cursor, Claude Code, or Codex processes this prompt, it applies this constraint before emitting syntax.
5

Components NEVER share in-memory authorization decision entries across distinct tenant boundaries, even if tuple coordinates match.

Components NEVER share in-memory authorization decision entries across distinct tenant boundaries, even if tuple coordinates match.

Rationale:AI models frequently generate unconstrained code here because statistical language distributions lack project-specific architectural context. Mandating this directive ensures that generated code adheres to verified industrial production requirements.
Enforcement:Integrated into the Agent Pack rule file. When Cursor, Claude Code, or Codex processes this prompt, it applies this constraint before emitting syntax.
Technical Questions & Answers

Frequently Asked Technical Questions

Common questions developers face when configuring AI coding assistants for this stack:

Q:Why is OpenFGA Contextual Tuple Authorization & Deterministic In-Memory Decision Caching critical for AI coding assistants?

Enforces deterministic cryptographic hashing of request-scoped contextual tuples, store IDs, and model versions within in-memory ReBAC evaluation caches. Prevents authorization bypasses, cache poisoning, and cross-tenant privilege escalation caused by naive cache keys that omit transient contextual claims. Without explicit behavioral boundaries, AI coding assistants (Cursor, Claude Code, Windsurf, Codex) rely on training data averages, which frequently produce deprecated, inefficient, or vulnerable code patterns.

Q:How does adopting this rule prevent AI hallucinations?

This rule explicitly declares what the AI must avoid (Omitting Contextual Tuples from In-Memory ReBAC Cache Keys Causing Permission Leaks) and prescribes verified positive examples. Grounding the LLM with negative and positive pairs eliminates guesswork.

Q:Which AI coding environments are supported?

This specification is multi-platform compatible: Cursor (.cursor/rules/*.mdc & .cursorrules), Anthropic Claude Code (CLAUDE.md), Windsurf (.windsurfrules), Codex / Cline (AGENTS.md), and GitHub Copilot (.github/copilot-instructions.md).

Q:Can I combine this rule with other technology stacks?

Yes. Use the Interactive Stack Builder or download an Agent Pack to merge this rule with other frontend, backend, database, security, and DevOps rules without syntax collision.

Open Specification · CC BY 4.0·Free for Personal, Team & Commercial In-Repo Use

Citation & Open Source Attribution Guidelines

This specification is licensed under Creative Commons Attribution 4.0 International (CC BY 4.0). You are completely free to adapt and share this rule in your workspace. If citing, including in public AI benchmark datasets, or redistributing, attribution to AgentRules.org is required.

1 Rule in Stack

OpenFGA