This specification is maintained by the AgentRules Working Group. Have enhancements or want to claim maintainership?Submit Specification →
backendcritical PriorityID: fastapi-python-313-free-threaded-context-isolation

FastAPI Python 3.13 Free-Threaded Context Isolation & Concurrency Guardrail

Mandates thread-safe request context isolation and synchronization in FastAPI applications deployed on Python 3.13 free-threaded (no-GIL) runtimes. Enforces strict avoidance of unsynchronized module-level mutable state and requires contextvars.ContextVar or explicit synchronization primitives to prevent cross-request race conditions, tenant data leakage, and memory corruption.

Prohibited Anti-Pattern: Leaking Cross-Request State via Unsynchronized Module-Level Globals in Python 3.13t

Export Ready-to-Drop Configuration

Select format below to copy code or download file directly.

---
description: FastAPI Python 3.13 Free-Threaded Context Isolation & Concurrency Guardrail - Mandates thread-safe request context isolation and synchronization in FastAPI applications deployed on Python 3.13 free-threaded (no-GIL) runtimes. Enforces strict avoidance of unsynchronized module-level mutable state and requires contextvars.ContextVar or explicit synchronization primitives to prevent cross-request race conditions, tenant data leakage, and memory corruption.
globs: **/*.py
alwaysApply: true
verified_by: "agentrules.org"
license: "CC-BY-4.0"
source: "https://agentrules.org/rules/fastapi-python-313-free-threaded-context-isolation"
---

# FastAPI Python 3.13 Free-Threaded Context Isolation & Concurrency Guardrail

> **Severity**: CRITICAL | **Category**: backend
> **Anti-Pattern Warning**: Leaking Cross-Request State via Unsynchronized Module-Level Globals in Python 3.13t

## System Constraints
You are a Principal Software Architect enforcing thread safety and concurrency isolation for FastAPI running on Python 3.13 free-threaded (python3.13t) runtimes. In no-GIL Python, operations on built-in collections and shared module variables are no longer implicitly protected by the Global Interpreter Lock. You must strictly eliminate module-level mutable states, prevent cross-request contamination, and ensure that request contexts are managed exclusively via contextvars.ContextVar or scoped FastAPI dependencies with explicit synchronization.

## Strict Guidelines
- Engineers MUST ALWAYS manage per-request metadata (such as tenant IDs, user identities, or trace context) using contextvars.ContextVar with rigorous token reset semantics in middleware.
- Engineers MUST NOT rely on implicit GIL atomicity for standard collection mutations (e.g., dict[k] = v, list.append) across concurrent threads.
- Services MUST guard legitimately shared in-memory data structures (e.g., local LRU caches, metric counters) using threading.Lock, threading.RLock, or thread-safe atomic data structures.
- Components NEVER store request-scoped resources, database sessions, or auth contexts in module globals, class-level mutable variables, or app.state without explicit concurrency safety.
- Code SHOULD rely on FastAPI's Dependency Injection system (fastapi.Depends) with structured lifespans to guarantee that dependencies are isolated to the active execution context.

## Bad vs Good Implementations
### Unsafe Module-Level State vs. ContextVar Isolation in Python 3.13t

#### Bad Antipattern (AI Common Hallucination)
> **Why it fails**: In Python 3.13 free-threaded builds (no-GIL), multiple worker threads executing in parallel access and mutate `_current_request_context` without locks. This causes severe race conditions, cross-tenant data leaks, and potentially torn reads or interpreter-level memory faults.
```python
from fastapi import FastAPI, Request

app = FastAPI()

# ANTI-PATTERN: Module-level mutable state without GIL protection
# Under Python 3.13 free-threading, concurrent OS threads corrupt or overwrite
# this dictionary simultaneously, causing tenant context hijacking.
_current_request_context: dict[str, str] = {}

@app.middleware("http")
async def context_middleware(request: Request, call_next):
    tenant_id = request.headers.get("X-Tenant-ID", "anonymous")
    _current_request_context["tenant_id"] = tenant_id  # Data race under no-GIL
    response = await call_next(request)
    return response

@app.get("/data")
async def get_data():
    # Highly likely to return another concurrent request's tenant_id
    active_tenant = _current_request_context.get("tenant_id")
    return {"tenant": active_tenant}
```

#### Production Standard (Correct)
> **Standard**: Uses `contextvars.ContextVar` to guarantee execution-context isolation across parallel OS threads and async tasks in Python 3.13 free-threading. The token reset in the `finally` block prevents state leakage into recycled worker threads.
```python
from contextvars import ContextVar
from typing import Optional
from fastapi import FastAPI, Request, Depends, HTTPException, status

app = FastAPI()

# ContextVar provides isolated, thread-safe, and asynchronous task-local state
_current_tenant_var: ContextVar[Optional[str]] = ContextVar("current_tenant", default=None)

@app.middleware("http")
async def context_middleware(request: Request, call_next):
    tenant_id = request.headers.get("X-Tenant-ID")
    token = _current_tenant_var.set(tenant_id)
    try:
        response = await call_next(request)
        return response
    finally:
        # Ensure the ContextVar is cleanly restored to prevent leaks into pooled worker threads
        _current_tenant_var.reset(token)

def get_current_tenant() -> str:
    tenant = _current_tenant_var.get()
    if not tenant:
        raise HTTPException(
            status_code=status.HTTP_400_BAD_REQUEST,
            detail="Missing required X-Tenant-ID header"
        )
    return tenant

@app.get("/data")
async def get_data(tenant: str = Depends(get_current_tenant)):
    return {"tenant": tenant}
```

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: FastAPI Python 3.13 Free-Threaded Context Isolation & Concurrency Guardrail

FastAPI Python 3.13 Free-Threaded Context Isolation & Concurrency Guardrail defines an industrial-grade behavioral standard for backend engineering. Mandates thread-safe request context isolation and synchronization in FastAPI applications deployed on Python 3.13 free-threaded (no-GIL) runtimes. Enforces strict avoidance of unsynchronized module-level mutable state and requires contextvars.ContextVar or explicit synchronization primitives to prevent cross-request race conditions, tenant data leakage, and memory corruption. 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: Leaking Cross-Request State via Unsynchronized Module-Level Globals in Python 3.13t 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 DriftLeaking Cross-Request State via Unsynchronized Module-Level Globals in Python 3.13tCritical
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 manage per-request metadata (such as tenant IDs, user identities, or trace context) using contextvars.ContextVar with rigorous token reset semantics in middleware.

Engineers MUST ALWAYS manage per-request metadata (such as tenant IDs, user identities, or trace context) using contextvars.ContextVar with rigorous token reset semantics in middleware.

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 rely on implicit GIL atomicity for standard collection mutations (e.g., dict[k] = v, list.append) across concurrent threads.

Engineers MUST NOT rely on implicit GIL atomicity for standard collection mutations (e.g., dict[k] = v, list.append) across concurrent threads.

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 guard legitimately shared in-memory data structures (e.g., local LRU caches, metric counters) using threading.Lock, threading.RLock, or thread-safe atomic data structures.

Services MUST guard legitimately shared in-memory data structures (e.g., local LRU caches, metric counters) using threading.Lock, threading.RLock, or thread-safe atomic data structures.

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

Components NEVER store request-scoped resources, database sessions, or auth contexts in module globals, class-level mutable variables, or app.state without explicit concurrency safety.

Components NEVER store request-scoped resources, database sessions, or auth contexts in module globals, class-level mutable variables, or app.state without explicit concurrency safety.

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

Code SHOULD rely on FastAPI's Dependency Injection system (fastapi.Depends) with structured lifespans to guarantee that dependencies are isolated to the active execution context.

Code SHOULD rely on FastAPI's Dependency Injection system (fastapi.Depends) with structured lifespans to guarantee that dependencies are isolated to the active execution context.

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 FastAPI Python 3.13 Free-Threaded Context Isolation & Concurrency Guardrail critical for AI coding assistants?

Mandates thread-safe request context isolation and synchronization in FastAPI applications deployed on Python 3.13 free-threaded (no-GIL) runtimes. Enforces strict avoidance of unsynchronized module-level mutable state and requires contextvars.ContextVar or explicit synchronization primitives to prevent cross-request race conditions, tenant data leakage, and memory corruption. 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 (Leaking Cross-Request State via Unsynchronized Module-Level Globals in Python 3.13t) 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

FastAPI