This specification is maintained by the AgentRules Working Group. Have enhancements or want to claim maintainership?Submit Specification →
frontendcritical PriorityID: web-locks-client-state-sync-standard

Web Locks API State Synchronization and Concurrency Control Guardrail

Enforces deterministic cross-tab synchronization and prevents IndexedDB write-skew anomalies during high-frequency optimistic state mutations and queue drains. Mandates atomic, scoped synchronization via the native Web Locks API (`navigator.locks.request`) paired with cross-context invalidation signals across concurrent browsing contexts (tabs, dedicated workers, and service workers).

Prohibited Anti-Pattern: Unsynchronized Read-Modify-Write Cycles and Optimistic Queue Drains Across Concurrent Tabs Causing IndexedDB Write-Skew and State Regression

Export Ready-to-Drop Configuration

Select format below to copy code or download file directly.

---
description: Web Locks API State Synchronization and Concurrency Control Guardrail - Enforces deterministic cross-tab synchronization and prevents IndexedDB write-skew anomalies during high-frequency optimistic state mutations and queue drains. Mandates atomic, scoped synchronization via the native Web Locks API (`navigator.locks.request`) paired with cross-context invalidation signals across concurrent browsing contexts (tabs, dedicated workers, and service workers).
globs: src/**/*.{ts,tsx}, src/workers/**/*.{ts,js}, src/storage/**/*.{ts,js}, public/sw.js
alwaysApply: true
verified_by: "agentrules.org"
license: "CC-BY-4.0"
source: "https://agentrules.org/rules/web-locks-client-state-sync-standard"
---

# Web Locks API State Synchronization and Concurrency Control Guardrail

> **Severity**: CRITICAL | **Category**: frontend
> **Anti-Pattern Warning**: Unsynchronized Read-Modify-Write Cycles and Optimistic Queue Drains Across Concurrent Tabs Causing IndexedDB Write-Skew and State Regression

## System Constraints
You are a Principal Software Architect enforcing the Web Locks API Client-State Cross-Tab Synchronization Standard. You must mandate strict lock scoping, prevent deadlocks, enforce fallback guards for unsupported environments, and eliminate lost updates during concurrent client-side mutations across independent browsing contexts.

## Strict Guidelines
- Engineers MUST ALWAYS wrap multi-step IndexedDB read-modify-write sequences and offline mutation queue processing inside `navigator.locks.request` with an explicit resource identifier and mode (`exclusive` or `shared`).
- Engineers MUST NOT rely on IndexedDB internal transaction locks alone for cross-step application workflows; IndexedDB transactions close between asynchronous macro/micro-tasks, allowing interleaved concurrent writes across different tabs.
- Code MUST pass an `AbortSignal` with a deterministic timeout (e.g., `AbortSignal.timeout(ms)`) to `navigator.locks.request` options to prevent orphan lock acquisition freezes if an execution context hangs or terminates abruptly.
- Services MUST implement hierarchical, granular lock naming conventions (e.g., `sync:entity:${domain}:${id}`) to prevent coarse global bottlenecks while avoiding cyclic cross-lock dependencies that introduce deadlocks.
- Components NEVER execute uncoordinated direct local state writes after an external lock release; state managers MUST verify monotonic revision sequence vectors or emit cross-context events (e.g., via `BroadcastChannel`) alongside lock completion to notify peer execution contexts.

## Bad vs Good Implementations
### Uncoordinated Concurrent IndexedDB Read-Modify-Write Queue Mutation

#### Bad Antipattern (AI Common Hallucination)
> **Why it fails**: Opening an IDB transaction asynchronously across separate async calls does not protect the composite read-modify-write cycle across different browser tabs. Two tabs reading simultaneously will both observe version N and increment to N+1, causing the last writer to overwrite the previous writer's delta without detection.
```typescript
import { openDB } from 'idb';

interface MutationRecord {
  id: string;
  version: number;
  delta: Record<string, unknown>;
}

export async function appendMutation(entityId: string, delta: Record<string, unknown>): Promise<void> {
  const db = await openDB('AppStore', 1);
  
  // VULNERABLE: Multiple tabs simultaneously read the same version
  // and write disparate state, overwriting sibling tab mutations (write-skew).
  const currentRecord = await db.get('entities', entityId) as MutationRecord | undefined;
  const nextVersion = (currentRecord?.version ?? 0) + 1;
  
  const updated: MutationRecord = {
    id: entityId,
    version: nextVersion,
    delta: { ...(currentRecord?.delta ?? {}), ...delta }
  };
  
  await db.put('entities', updated);
}
```

#### Production Standard (Correct)
> **Standard**: Mutations are synchronized using `navigator.locks.request` with an exclusive lock keyed specifically to the target entity, an explicit abort timeout, and an internal scoped IndexedDB readwrite transaction. Peer contexts are informed immediately via BroadcastChannel to prevent stale cache displays.
```typescript
import { openDB } from 'idb';

interface MutationRecord {
  id: string;
  version: number;
  delta: Record<string, unknown>;
}

const LOCK_TIMEOUT_MS = 5000;
const channel = new BroadcastChannel('app-state-sync');

export async function appendMutation(entityId: string, delta: Record<string, unknown>): Promise<void> {
  if (!('locks' in navigator)) {
    throw new Error('Web Locks API is required for consistent state mutations.');
  }

  const lockKey = `locks:entity:${entityId}`;
  const options: LockOptions = {
    mode: 'exclusive',
    signal: AbortSignal.timeout(LOCK_TIMEOUT_MS)
  };

  await navigator.locks.request(lockKey, options, async () => {
    const db = await openDB('AppStore', 1);
    const tx = db.transaction('entities', 'readwrite');
    const store = tx.objectStore('entities');

    const currentRecord = await store.get(entityId) as MutationRecord | undefined;
    const nextVersion = (currentRecord?.version ?? 0) + 1;

    const updated: MutationRecord = {
      id: entityId,
      version: nextVersion,
      delta: { ...(currentRecord?.delta ?? {}), ...delta }
    };

    await store.put(updated);
    await tx.done;

    channel.postMessage({ type: 'ENTITY_MUTATED', entityId, version: nextVersion });
  });
}
```

Architectural Specification & Invariant Rationale

Architectural Invariant Design: Web Locks API State Synchronization and Concurrency Control Guardrail

Web Locks API State Synchronization and Concurrency Control Guardrail defines an industrial-grade behavioral standard for frontend engineering. Enforces deterministic cross-tab synchronization and prevents IndexedDB write-skew anomalies during high-frequency optimistic state mutations and queue drains. Mandates atomic, scoped synchronization via the native Web Locks API (`navigator.locks.request`) paired with cross-context invalidation signals across concurrent browsing contexts (tabs, dedicated workers, and service workers). 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: Unsynchronized Read-Modify-Write Cycles and Optimistic Queue Drains Across Concurrent Tabs Causing IndexedDB Write-Skew and State Regression 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 DriftUnsynchronized Read-Modify-Write Cycles and Optimistic Queue Drains Across Concurrent Tabs Causing IndexedDB Write-Skew and State RegressionCritical
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 wrap multi-step IndexedDB read-modify-write sequences and offline mutation queue processing inside `navigator.locks.request` with an explicit resource identifier and mode (`exclusive` or `shared`).

Engineers MUST ALWAYS wrap multi-step IndexedDB read-modify-write sequences and offline mutation queue processing inside `navigator.locks.request` with an explicit resource identifier and mode (`exclusive` or `shared`).

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 IndexedDB internal transaction locks alone for cross-step application workflows

Engineers MUST NOT rely on IndexedDB internal transaction locks alone for cross-step application workflows; IndexedDB transactions close between asynchronous macro/micro-tasks, allowing interleaved concurrent writes across different tabs.

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

Code MUST pass an `AbortSignal` with a deterministic timeout (e.g., `AbortSignal.timeout(ms)`) to `navigator.locks.request` options to prevent orphan lock acquisition freezes if an execution context hangs or terminates abruptly.

Code MUST pass an `AbortSignal` with a deterministic timeout (e.g., `AbortSignal.timeout(ms)`) to `navigator.locks.request` options to prevent orphan lock acquisition freezes if an execution context hangs or terminates abruptly.

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 implement hierarchical, granular lock naming conventions (e.g., `sync

Services MUST implement hierarchical, granular lock naming conventions (e.g., `sync:entity:${domain}:${id}`) to prevent coarse global bottlenecks while avoiding cyclic cross-lock dependencies that introduce deadlocks.

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 execute uncoordinated direct local state writes after an external lock release

Components NEVER execute uncoordinated direct local state writes after an external lock release; state managers MUST verify monotonic revision sequence vectors or emit cross-context events (e.g., via `BroadcastChannel`) alongside lock completion to notify peer execution contexts.

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 Web Locks API State Synchronization and Concurrency Control Guardrail critical for AI coding assistants?

Enforces deterministic cross-tab synchronization and prevents IndexedDB write-skew anomalies during high-frequency optimistic state mutations and queue drains. Mandates atomic, scoped synchronization via the native Web Locks API (`navigator.locks.request`) paired with cross-context invalidation signals across concurrent browsing contexts (tabs, dedicated workers, and service workers). 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 (Unsynchronized Read-Modify-Write Cycles and Optimistic Queue Drains Across Concurrent Tabs Causing IndexedDB Write-Skew and State Regression) 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 FRONTEND Rules

View all rules →
frontend
119

SolidStart 1.0 Server Functions & Async Boundaries Production Standard

SolidStart 1.0 relies on the Vinxi bundler to split `server$` closures into independent HTTP POST RPC endpoints. Direct lexical closure over client signals within `server$` scopes or failure to demarcate async boundaries with `<Suspense>` causes silent serialization failures, client-bundle secret leaks, and SSR hydration mismatches. Enforcing strict parameter passing, runtime input validation, and Solid async primitives maintains security and fine-grained reactivity across network boundaries.

frontend
119

Astro 5 Actions & Content Layer Production Standard

Enforces strict type safety and architectural correctness for Astro 5 Server Actions and the zero-waterfall Content Layer API. Prevents runtime contract mismatches, hydration mismatches, and unhandled mutation exceptions across dynamic and prerendered boundaries. Failure to follow these patterns leads to silent data fetching waterfalls, build-time cache corruptions, and unhandled server action exceptions.

frontend
51

Nuxt 4 Nitro Server Engine & Shared Directory Production Standard

Nuxt 4 enforces strict boundary segregation between client UI in the app/ directory, backend endpoints in server/, and universal contracts in shared/. Violating cross-boundary isolation or maintaining module-scoped state in Nitro server handlers causes catastrophic cross-request data corruption and hydration mismatches under concurrent production traffic. Architects must enforce request-isolated H3 event contexts, universal serialization schemas, and strict path-alias boundaries.

1 Rule in Stack

Web