Skip to content

inp.hydration contention

github-actions[bot] edited this page Sep 6, 2026 · 1 revision

inp.hydration-contention

Rule ID: inp.hydration-contention Severity: WARN Category: inp Target Standards: Astro Islands Architecture & Partial Hydration Specification, W3C Cooperative Scheduling & Main-Thread Budget Invariants, Google Core Web Vitals (INP Input Delay & Hydration Contention)


1. Overview & Core Invariant

Concurrently hydrating multiple Astro client:load islands saturates the main thread and spikes input delay

Core Invariant:

"Astro templates must avoid declaring multiple eager 'client:load' island directives simultaneously; non-critical islands must use deferred hydration directives ('client:idle' or 'client:visible')."


2. Technical Grounding & Engine Realities

The 'client:load' directive instructs the browser to immediately fetch and execute island JavaScript upon page load, before user interaction or idle periods.

When multiple islands (3 or more) declare 'client:load' on the same page, their hydration phases execute in parallel or rapid succession on the main thread. This contention monopolizes CPU resources during initial user interactions, generating severe Long Tasks and inflating Input Delay.

By reserving 'client:load' strictly for critical interactive UI (such as primary navigation) and deferring secondary components to 'client:idle' or 'client:visible', the main thread remains responsive to user taps, clicks, and keystrokes.


3. Vulnerability & Risk Taxonomy

Risk Vector Severity Impact
Initial Hydration CPU Saturation HIGH Multiple islands running concurrent React hydration lock the main thread during the window when users attempt first interaction.
Severe Input Delay Spikes MEDIUM User clicks or keystrokes are queued behind synchronous island hydration tasks, resulting in INP > 200ms.

4. Non-Compliant Code Patterns (Bad Examples)

ASTRO (Multiple non-critical islands concurrently hydrated with client:load):

---
import HeaderNav from '../components/HeaderNav.tsx';
import SearchBar from '../components/SearchBar.tsx';
import PromoBanner from '../components/PromoBanner.tsx';
---
<HeaderNav client:load />
<SearchBar client:load />
<PromoBanner client:load />

5. Compliant Implementation Patterns (Good Examples)

ASTRO (Only critical navigation uses client:load; secondary islands use deferred hydration):

---
import HeaderNav from '../components/HeaderNav.tsx';
import SearchBar from '../components/SearchBar.tsx';
import PromoBanner from '../components/PromoBanner.tsx';
---
<HeaderNav client:load />
<SearchBar client:idle />
<PromoBanner client:visible />

6. How to Suppress (Ignore Directives)

If this pattern is required for an intentional exception, suppress the diagnostic using the canonical Charites Rule ID:

<!-- charites:ignore inp.hydration-contention intentional exception -->
// charites:ignore inp.hydration-contention intentional exception

7. Configuration Reference (charites.yaml)

rules:
  inp.hydration-contention:
    severity: warn # error | warn | info | off

8. Architectural Domain & Verification Reference


Rule Categories

A11y (16 rules)
Browser (12 rules)
Cls (16 rules)
Design (1 rules)
Ergonomy (5 rules)
Inp (16 rules)
Lcp (16 rules)
Mobile (5 rules)
Performance (16 rules)
Pwa (10 rules)
Responsive (18 rules)
Semantic (1 rules)
Theme (32 rules)
Ux (20 rules)

Clone this wiki locally