This specification is maintained by the AgentRules Working Group. Have enhancements or want to claim maintainership?Submit Specification →
mobilecritical PriorityID: react-native-turbomodule-sync-reentrancy-guardrail

React Native Fabric/JSI Synchronous TurboModule Reentrancy and Threading Guardrail

Eliminates thread deadlocks, priority inversions, and lock contention occurring when concurrent JavaScript operations synchronously invoke native C++ TurboModules across Fabric UI rendering threads and JS threads. Enforces asynchronous bridging or non-blocking lockless state reads for any native state accessed during synchronous layout or render phases.

Prohibited Anti-Pattern: Synchronously blocking C++ TurboModule invocations during layout calculation or cross-thread state resolution causing main-thread deadlock

Export Ready-to-Drop Configuration

Select format below to copy code or download file directly.

---
description: "React Native Fabric/JSI Synchronous TurboModule Reentrancy and Threading Guardrail - Eliminates thread deadlocks, priority inversions, and lock contention occurring when concurrent JavaScript operations synchronously invoke native C++ TurboModules across Fabric UI rendering threads and JS threads. Enforces asynchronous bridging or non-blocking lockless state reads for any native state accessed during synchronous layout or render phases."
globs: "src/**/*.{ts,tsx}, ios/**/*.{h,m,mm,cpp}, android/app/src/main/**/*.{java,kt,cpp}"
alwaysApply: true
license: "CC-BY-4.0"
source: "https://agentrules.org/rules/react-native-turbomodule-sync-reentrancy-guardrail"
---

# React Native Fabric/JSI Synchronous TurboModule Reentrancy and Threading Guardrail

> **Severity**: CRITICAL | **Category**: mobile
> **Anti-Pattern Warning**: Synchronously blocking C++ TurboModule invocations during layout calculation or cross-thread state resolution causing main-thread deadlock

## System Constraints
You are a Principal Mobile Architect specializing in the React Native New Architecture (Fabric, TurboModules, and JSI). Mandate strict isolation between synchronous native TurboModule JSI methods and concurrent execution paths. Ensure synchronous JSI calls never acquire mutex locks held across UI thread mutations, preventing reentrancy deadlocks between the JS thread and Fabric background commit pipelines.

## Strict Guidelines
- Engineers MUST NEVER execute synchronous TurboModule methods (`TurboModule.syncMethod()`) inside Fabric layout measures, render hooks, or synchronous component lifecycles without strict lockless read semantics.
- Engineers MUST NOT acquire blocking mutexes (e.g., `std::mutex::lock`) inside JSI synchronous hooks if those same locks are acquired during Fabric shadow-tree mutations on the UI/render thread.
- Native TurboModules exposing synchronous JSI getters MUST maintain atomic, copy-on-write, or read-copy-update (RCU) snapshots to guarantee zero wait-time execution across concurrent threads.
- High-throughput native mutations MUST dispatch asynchronously to dedicated worker queues rather than preempting synchronous host function execution.
- Components NEVER trigger synchronous native updates inside event callbacks that execute concurrently with layout recalculations (e.g., `onLayout`, custom Fabric shadow measurement).

## Bad vs Good Implementations
### Eliminating Synchronous Mutex Lock Inversion via Atomic Snapshots in TurboModules

#### Bad Antipattern (AI Common Hallucination)
> **Why it fails**: Invoking a synchronous TurboModule method inside active component rendering locks the JS thread while waiting for native synchronization primitives. If the native implementation attempts to sync with the main or UI thread simultaneously, a fatal deadlock occurs.
```typescript
import { TurboModuleRegistry } from 'react-native';

interface DeviceSyncMetricsModule {
  getSynchronousMetrics(): { frameDropCount: number; memoryPressure: string };
  recordEvent(eventName: string): void;
}

const MetricsModule = TurboModuleRegistry.getEnforcing<DeviceSyncMetricsModule>('DeviceSyncMetrics');

// ANTI-PATTERN: Calling synchronous native modules inside render or measure
// When native side holds a mutex to mutate state on UI thread while JS thread waits
// on getSynchronousMetrics(), Fabric deadlocks.
export function useRenderTracking(componentId: string) {
  const metrics = MetricsModule.getSynchronousMetrics(); // Native mutex lock contention
  MetricsModule.recordEvent(`render_${componentId}`);
  return metrics;
}
```

#### Production Standard (Correct)
> **Standard**: Accesses a lockless atomic native snapshot via non-blocking JSI operations, and defers mutating events to an asynchronous dispatch pipeline decoupled from Fabric's synchronous render-and-commit loop.
```typescript
import { TurboModuleRegistry } from 'react-native';
import { useEffect, useRef } from 'react';

interface DeviceSyncMetricsModule {
  getAtomicMetricsSnapshot(): { frameDropCount: number; memoryPressure: string };
  queueEventAsync(eventName: string): void;
}

const MetricsModule = TurboModuleRegistry.getEnforcing<DeviceSyncMetricsModule>('DeviceSyncMetrics');

// PRODUCTION FIX: Use atomic lock-free reads and decouple event queuing from render pass
export function useRenderTracking(componentId: string) {
  const metricsRef = useRef<{ frameDropCount: number; memoryPressure: string } | null>(null);

  // Guaranteed lockless atomic read
  if (metricsRef.current === null) {
    metricsRef.current = MetricsModule.getAtomicMetricsSnapshot();
  }

  useEffect(() => {
    // Native state updates run strictly asynchronous to UI and JS thread render cycles
    MetricsModule.queueEventAsync(`render_${componentId}`);
  }, [componentId]);

  return metricsRef.current;
}
```

Recommended MCP Servers (mcp-serverlist.com)

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

Architectural Specification & Invariant Rationale

Architectural Invariant Design: React Native Fabric/JSI Synchronous TurboModule Reentrancy and Threading Guardrail

React Native Fabric/JSI Synchronous TurboModule Reentrancy and Threading Guardrail defines an industrial-grade behavioral standard for mobile engineering. Eliminates thread deadlocks, priority inversions, and lock contention occurring when concurrent JavaScript operations synchronously invoke native C++ TurboModules across Fabric UI rendering threads and JS threads. Enforces asynchronous bridging or non-blocking lockless state reads for any native state accessed during synchronous layout or render phases. 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: Synchronously blocking C++ TurboModule invocations during layout calculation or cross-thread state resolution causing main-thread deadlock 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 DriftSynchronously blocking C++ TurboModule invocations during layout calculation or cross-thread state resolution causing main-thread deadlockCritical
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 NEVER execute synchronous TurboModule methods (`TurboModule.syncMethod()`) inside Fabric layout measures, render hooks, or synchronous component lifecycles without strict lockless read semantics.

Engineers MUST NEVER execute synchronous TurboModule methods (`TurboModule.syncMethod()`) inside Fabric layout measures, render hooks, or synchronous component lifecycles without strict lockless read semantics.

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 acquire blocking mutexes (e.g., `std

Engineers MUST NOT acquire blocking mutexes (e.g., `std::mutex::lock`) inside JSI synchronous hooks if those same locks are acquired during Fabric shadow-tree mutations on the UI/render thread.

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

Native TurboModules exposing synchronous JSI getters MUST maintain atomic, copy-on-write, or read-copy-update (RCU) snapshots to guarantee zero wait-time execution across concurrent threads.

Native TurboModules exposing synchronous JSI getters MUST maintain atomic, copy-on-write, or read-copy-update (RCU) snapshots to guarantee zero wait-time execution 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.
4

High-throughput native mutations MUST dispatch asynchronously to dedicated worker queues rather than preempting synchronous host function execution.

High-throughput native mutations MUST dispatch asynchronously to dedicated worker queues rather than preempting synchronous host function execution.

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 trigger synchronous native updates inside event callbacks that execute concurrently with layout recalculations (e.g., `onLayout`, custom Fabric shadow measurement).

Components NEVER trigger synchronous native updates inside event callbacks that execute concurrently with layout recalculations (e.g., `onLayout`, custom Fabric shadow measurement).

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 React Native Fabric/JSI Synchronous TurboModule Reentrancy and Threading Guardrail critical for AI coding assistants?

Eliminates thread deadlocks, priority inversions, and lock contention occurring when concurrent JavaScript operations synchronously invoke native C++ TurboModules across Fabric UI rendering threads and JS threads. Enforces asynchronous bridging or non-blocking lockless state reads for any native state accessed during synchronous layout or render phases. 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 (Synchronously blocking C++ TurboModule invocations during layout calculation or cross-thread state resolution causing main-thread deadlock) 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.

Related MOBILE Rules

View all rules →
1 Rule in Stack

React