This specification is maintained by the AgentRules Working Group. Have enhancements or want to claim maintainership?Submit Specification →
backendcritical PriorityID: fastapi-python313-free-threaded-state-synchronization-standard

FastAPI Python 3.13 Free-Threaded Shared State Synchronization Standard

Enforces strict thread-safety invariants and explicit synchronization primitives for FastAPI applications operating on free-threaded Python 3.13 (PEP 703) runtimes without the Global Interpreter Lock. Mandates lock-encapsulated data structures and prohibits reliance on legacy CPython bytecode atomicity across concurrent native worker threads.

Prohibited Anti-Pattern: Relying on implicit GIL bytecode atomicity for shared mutable state in Python 3.13t runtimes.

Export Ready-to-Drop Configuration

Select format below to copy code or download file directly.

---
description: FastAPI Python 3.13 Free-Threaded Shared State Synchronization Standard - Enforces strict thread-safety invariants and explicit synchronization primitives for FastAPI applications operating on free-threaded Python 3.13 (PEP 703) runtimes without the Global Interpreter Lock. Mandates lock-encapsulated data structures and prohibits reliance on legacy CPython bytecode atomicity across concurrent native worker threads.
globs: src/**/*.py, app/**/*.py, api/**/*.py
alwaysApply: true
verified_by: "agentrules.org"
license: "CC-BY-4.0"
source: "https://agentrules.org/rules/fastapi-python313-free-threaded-state-synchronization-standard"
---

# FastAPI Python 3.13 Free-Threaded Shared State Synchronization Standard

> **Severity**: CRITICAL | **Category**: backend
> **Anti-Pattern Warning**: Relying on implicit GIL bytecode atomicity for shared mutable state in Python 3.13t runtimes.

## System Constraints
You are a Principal Software Architect enforcing the FastAPI Python 3.13 Free-Threaded Shared State Synchronization Standard. Python 3.13 free-threaded builds (python3.13t) completely remove the Global Interpreter Lock (GIL), allowing Starlette AnyIO worker threads, async task loops, and multiprocessing bridges to execute true parallel machine instructions simultaneously. You must strictly reject any code assuming dict mutations, counter increments, list appends, or object attribute assignments are thread-safe or atomic. All mutable shared state across requests, lifespan scopes, and threadpools must be guarded by explicit locking primitives or encapsulated in deterministic synchronized constructs.

## Strict Guidelines
- Engineers MUST ALWAYS protect shared in-memory collections and class attributes with explicit synchronization primitives (e.g., 'threading.Lock', 'threading.RLock', or custom reader-writer locks) when running under free-threaded Python 3.13t.
- Engineers MUST NOT rely on bytecode-level execution atomicity (e.g., 'dict[key] = val', 'counter += 1', or 'list.append()') which fails under multi-core parallel execution in free-threaded CPython.
- Engineers MUST NEVER use bare module-level mutable globals (dicts, lists, sets) as cross-request caches or state stores without thread-safe access wrappers.
- Services MUST encapsulate shared mutable application state into cohesive, thread-safe classes managed via FastAPI dependency injection or lifespan state ('request.app.state').
- Code executing inside 'starlette.concurrency.run_in_threadpool' or 'anyio.to_thread.run_sync' MUST guarantee that any shared state accessed within the worker thread is synchronized against the main event loop thread and sibling worker threads.
- Read-modify-write patterns MUST execute within a single atomic lock acquisition to avoid interleaving and race conditions.

## Bad vs Good Implementations
### Synchronizing In-Memory State in Free-Threaded FastAPI

#### Bad Antipattern (AI Common Hallucination)
> **Why it fails**: Under Python 3.13 free-threaded execution, 'metric_store['total_requests'] += 1' compiles down to separate LOAD, ADD, and STORE instructions running concurrently across native threads. Without the GIL, interleaved memory writes cause severe race conditions, dropped updates, and potential internal dict pointer corruption.
```python
from fastapi import FastAPI
from starlette.concurrency import run_in_threadpool

app = FastAPI()

# CRITICAL FLAW: Implicit GIL reliance in Python 3.13t
# Dict updates and += operations are non-atomic across parallel native threads
metric_store: dict[str, int] = {"total_requests": 0}

def compute_background_metric() -> None:
    metric_store["total_requests"] += 1

@app.post("/track")
async def track_metric():
    await run_in_threadpool(compute_background_metric)
    return {"status": "ok", "count": metric_store["total_requests"]}
```

#### Production Standard (Correct)
> **Standard**: The good example encapsulates shared memory within a slot-based dataclass governed by an explicit 'threading.Lock'. All read-modify-write sequences are synchronized, guaranteeing atomic updates across parallel OS threads under Python 3.13 free-threading.
```python
import threading
from dataclasses import dataclass, field
from fastapi import FastAPI, Depends
from starlette.concurrency import run_in_threadpool

@dataclass(slots=True)
class ThreadSafeMetrics:
    _lock: threading.Lock = field(default_factory=threading.Lock)
    _total_requests: int = 0

    def increment(self) -> int:
        with self._lock:
            self._total_requests += 1
            return self._total_requests

    def get_count(self) -> int:
        with self._lock:
            return self._total_requests

app = FastAPI()
app.state.metrics = ThreadSafeMetrics()

def get_metrics() -> ThreadSafeMetrics:
    return app.state.metrics

def compute_background_metric(metrics: ThreadSafeMetrics) -> int:
    return metrics.increment()

@app.post("/track")
async def track_metric(metrics: ThreadSafeMetrics = Depends(get_metrics)):
    current_total = await run_in_threadpool(compute_background_metric, metrics)
    return {"status": "ok", "count": current_total}
```

Architectural Specification & Invariant Rationale

Architectural Invariant Design: FastAPI Python 3.13 Free-Threaded Shared State Synchronization Standard

FastAPI Python 3.13 Free-Threaded Shared State Synchronization Standard defines an industrial-grade behavioral standard for backend engineering. Enforces strict thread-safety invariants and explicit synchronization primitives for FastAPI applications operating on free-threaded Python 3.13 (PEP 703) runtimes without the Global Interpreter Lock. Mandates lock-encapsulated data structures and prohibits reliance on legacy CPython bytecode atomicity across concurrent native worker threads. 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: Relying on implicit GIL bytecode atomicity for shared mutable state in Python 3.13t runtimes. 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 DriftRelying on implicit GIL bytecode atomicity for shared mutable state in Python 3.13t runtimes.Critical
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 protect shared in-memory collections and class attributes with explicit synchronization primitives (e.g., 'threading.Lock', 'threading.RLock', or custom reader-writer locks) when running under free-threaded Python 3.13t.

Engineers MUST ALWAYS protect shared in-memory collections and class attributes with explicit synchronization primitives (e.g., 'threading.Lock', 'threading.RLock', or custom reader-writer locks) when running under free-threaded Python 3.13t.

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 bytecode-level execution atomicity (e.g., 'dict[key] = val', 'counter += 1', or 'list.append()') which fails under multi-core parallel execution in free-threaded CPython.

Engineers MUST NOT rely on bytecode-level execution atomicity (e.g., 'dict[key] = val', 'counter += 1', or 'list.append()') which fails under multi-core parallel execution in free-threaded CPython.

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

Engineers MUST NEVER use bare module-level mutable globals (dicts, lists, sets) as cross-request caches or state stores without thread-safe access wrappers.

Engineers MUST NEVER use bare module-level mutable globals (dicts, lists, sets) as cross-request caches or state stores without thread-safe access wrappers.

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

Services MUST encapsulate shared mutable application state into cohesive, thread-safe classes managed via FastAPI dependency injection or lifespan state ('request.app.state').

Services MUST encapsulate shared mutable application state into cohesive, thread-safe classes managed via FastAPI dependency injection or lifespan state ('request.app.state').

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 executing inside 'starlette.concurrency.run_in_threadpool' or 'anyio.to_thread.run_sync' MUST guarantee that any shared state accessed within the worker thread is synchronized against the main event loop thread and sibling worker threads.

Code executing inside 'starlette.concurrency.run_in_threadpool' or 'anyio.to_thread.run_sync' MUST guarantee that any shared state accessed within the worker thread is synchronized against the main event loop thread and sibling worker 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.
6

Read-modify-write patterns MUST execute within a single atomic lock acquisition to avoid interleaving and race conditions.

Read-modify-write patterns MUST execute within a single atomic lock acquisition to avoid interleaving and race conditions.

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 Shared State Synchronization Standard critical for AI coding assistants?

Enforces strict thread-safety invariants and explicit synchronization primitives for FastAPI applications operating on free-threaded Python 3.13 (PEP 703) runtimes without the Global Interpreter Lock. Mandates lock-encapsulated data structures and prohibits reliance on legacy CPython bytecode atomicity across concurrent native worker threads. 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 (Relying on implicit GIL bytecode atomicity for shared mutable state in Python 3.13t runtimes.) 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