This specification is maintained by the AgentRules Working Group. Have enhancements or want to claim maintainership?Submit Specification →
mobilecritical PriorityID: capacitor-7-native-bridge-backpressure-guardrail

Capacitor 7 Native Bridge Async Serialization Backpressure Guardrail

Prevents UI thread hitching and out-of-memory panics by enforcing bounded queuing, rate limiting, and structured batching on asynchronous native-to-webview message passing during burst sensor and hardware events. Enforces leaky-bucket or sampling rate limits on Capacitor 7 notifyListeners to protect the JavaScript runtime from bridge queue starvation.

Prohibited Anti-Pattern: Unbounded Sensor Event Forwarding via notifyListeners Flooding the Native-to-JavaScript Bridge

Export Ready-to-Drop Configuration

Select format below to copy code or download file directly.

---
description: Capacitor 7 Native Bridge Async Serialization Backpressure Guardrail - Prevents UI thread hitching and out-of-memory panics by enforcing bounded queuing, rate limiting, and structured batching on asynchronous native-to-webview message passing during burst sensor and hardware events. Enforces leaky-bucket or sampling rate limits on Capacitor 7 notifyListeners to protect the JavaScript runtime from bridge queue starvation.
globs: src/**/*.{ts,tsx}, ios/App/**/*.{swift,m}, android/app/src/main/java/**/*.java, android/app/src/main/kotlin/**/*.kt
alwaysApply: true
verified_by: "agentrules.org"
license: "CC-BY-4.0"
source: "https://agentrules.org/rules/capacitor-7-native-bridge-backpressure-guardrail"
---

# Capacitor 7 Native Bridge Async Serialization Backpressure Guardrail

> **Severity**: CRITICAL | **Category**: mobile
> **Anti-Pattern Warning**: Unbounded Sensor Event Forwarding via notifyListeners Flooding the Native-to-JavaScript Bridge

## System Constraints
You are a Principal Mobile Architect enforcing strict backpressure and serialization bounds across the Capacitor 7 Native-to-WebView bridge. Unbounded invocation of `notifyListeners` during high-frequency native events (accelerometer, gyroscope, BLE scanning, GPS location updates) saturates the native message queue, causes GC pauses in the V8/WebKit engine, and drops frames on the main thread. Mandate sampling intervals, bounded circular ring buffers, and batch payloads at the native layer before bridging to JavaScript.

## Strict Guidelines
- Engineers MUST ALWAYS enforce a minimum hardware-sampling window or throttle native event delivery (e.g., minimum 16ms-66ms interval) before serializing data to `notifyListeners`.
- Engineers MUST NOT emit raw, high-frequency (>60Hz) sensor, location, or peripheral telemetry individually across the Capacitor bridge.
- Native plugins MUST implement bounded circular buffers (drop-oldest or drop-latest) rather than unbounded FIFO queues when WebView consumption lags behind native hardware ticks.
- Data structures serialized across the bridge MUST use flattened, pre-allocated JSON objects or typed binary transfer where supported, avoiding deep nested object graph cloning.
- Webview consumers MUST acknowledge stream reception (pull-based or windowed ACK) when transferring large payloads across the bridge to prevent buffer bloat.
- Plugins MUST detach or pause native hardware listeners (e.g., SensorEventListener, CMMotionManager) whenever there are zero active WebView listeners.

## Bad vs Good Implementations
### Throttled Native Motion Emitter with Fixed-Frequency Dispatch

#### Bad Antipattern (AI Common Hallucination)
> **Why it fails**: Subscribing directly to unthrottled hardware interrupts floods the native-to-webview message passing channel. Every tick incurs a JSON serialization cycle in the native thread and a deserialization allocation cycle in WebKit/V8, stalling the rendering pipeline.
```typescript
import { PluginListenerHandle } from '@capacitor/core';
import { Motion } from '@capacitor/motion';

// ANTI-PATTERN: Direct unbounded consumer of high-frequency bridge messages
let lastEventTime = 0;
export async function listenToHighFrequencySensor(): Promise<PluginListenerHandle> {
  return await Motion.addListener('accel', (event) => {
    // WebView thread receives 100-200 events/sec, flooding V8 JSON deserializer
    // causing massive GC churn and UI hitching on low-end Android devices
    console.log('Received raw acceleration:', event.acceleration.x);
    document.getElementById('render-target')!.style.transform = `translateX(${event.acceleration.x}px)`;
  });
}
```

#### Production Standard (Correct)
> **Standard**: Enforces backpressure using a single-slot bounded buffer (dropping stale intermediate ticks) and schedules updates through requestAnimationFrame, ensuring message consumption is synchronized with the display refresh cycle and native serialization load is eliminated.
```typescript
import { PluginListenerHandle } from '@capacitor/core';
import { Motion, AccelListenerEvent } from '@capacitor/motion';

interface BatchedMotionOptions {
  fpsThrottleMs?: number;
  onFrame: (sample: AccelListenerEvent) => void;
}

// PRODUCTION FIX: Coalescing/Sampling guardrail with requestAnimationFrame backpressure
export async function listenToSensorWithBackpressure(
  options: BatchedMotionOptions
): Promise<PluginListenerHandle> {
  const throttleMs = options.fpsThrottleMs ?? 16.67; // Default: ~60fps maximum
  let lastEmit = 0;
  let latestSample: AccelListenerEvent | null = null;
  let rafScheduled = false;

  return await Motion.addListener('accel', (event: AccelListenerEvent) => {
    const now = performance.now();
    latestSample = event; // Bounded single-slot buffer (drop-oldest)

    if (now - lastEmit >= throttleMs && !rafScheduled) {
      rafScheduled = true;
      requestAnimationFrame(() => {
        if (latestSample) {
          options.onFrame(latestSample);
          lastEmit = performance.now();
        }
        rafScheduled = false;
      });
    }
  });
}
```

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: Capacitor 7 Native Bridge Async Serialization Backpressure Guardrail

Capacitor 7 Native Bridge Async Serialization Backpressure Guardrail defines an industrial-grade behavioral standard for mobile engineering. Prevents UI thread hitching and out-of-memory panics by enforcing bounded queuing, rate limiting, and structured batching on asynchronous native-to-webview message passing during burst sensor and hardware events. Enforces leaky-bucket or sampling rate limits on Capacitor 7 notifyListeners to protect the JavaScript runtime from bridge queue starvation. 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: Unbounded Sensor Event Forwarding via notifyListeners Flooding the Native-to-JavaScript Bridge 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 DriftUnbounded Sensor Event Forwarding via notifyListeners Flooding the Native-to-JavaScript BridgeCritical
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 enforce a minimum hardware-sampling window or throttle native event delivery (e.g., minimum 16ms-66ms interval) before serializing data to `notifyListeners`.

Engineers MUST ALWAYS enforce a minimum hardware-sampling window or throttle native event delivery (e.g., minimum 16ms-66ms interval) before serializing data to `notifyListeners`.

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 emit raw, high-frequency (>60Hz) sensor, location, or peripheral telemetry individually across the Capacitor bridge.

Engineers MUST NOT emit raw, high-frequency (>60Hz) sensor, location, or peripheral telemetry individually across the Capacitor bridge.

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 plugins MUST implement bounded circular buffers (drop-oldest or drop-latest) rather than unbounded FIFO queues when WebView consumption lags behind native hardware ticks.

Native plugins MUST implement bounded circular buffers (drop-oldest or drop-latest) rather than unbounded FIFO queues when WebView consumption lags behind native hardware ticks.

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

Data structures serialized across the bridge MUST use flattened, pre-allocated JSON objects or typed binary transfer where supported, avoiding deep nested object graph cloning.

Data structures serialized across the bridge MUST use flattened, pre-allocated JSON objects or typed binary transfer where supported, avoiding deep nested object graph cloning.

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

Webview consumers MUST acknowledge stream reception (pull-based or windowed ACK) when transferring large payloads across the bridge to prevent buffer bloat.

Webview consumers MUST acknowledge stream reception (pull-based or windowed ACK) when transferring large payloads across the bridge to prevent buffer bloat.

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

Plugins MUST detach or pause native hardware listeners (e.g., SensorEventListener, CMMotionManager) whenever there are zero active WebView listeners.

Plugins MUST detach or pause native hardware listeners (e.g., SensorEventListener, CMMotionManager) whenever there are zero active WebView listeners.

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 Capacitor 7 Native Bridge Async Serialization Backpressure Guardrail critical for AI coding assistants?

Prevents UI thread hitching and out-of-memory panics by enforcing bounded queuing, rate limiting, and structured batching on asynchronous native-to-webview message passing during burst sensor and hardware events. Enforces leaky-bucket or sampling rate limits on Capacitor 7 notifyListeners to protect the JavaScript runtime from bridge queue starvation. 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 (Unbounded Sensor Event Forwarding via notifyListeners Flooding the Native-to-JavaScript Bridge) 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

Capacitor