X_ISLAND_PROPS_INVALID
Means
an island was handed props it may not receive
Typical cause
a key not listed in props: [...], a value that is not JSON (a function, Date, class instance, bigint, symbol, undefined, or a cycle), or a payload over ISLAND_PROPS_MAX_BYTES (16,384 bytes As of 2026-09-05; it was 4,096). A spread such as <Modal {...row} /> fails and the cause names every undeclared key, which is how a password hash is caught before it crosses to the client. Over the cap, the cause names the heaviest props with their bytes. A declared 500 — the author's fault, never the caller's — so problem+json carries the cause in prod; on a budgeted route the budgets step reports it at verify time under this code
Fix
declare the prop in island({ props: [...] }), or pass a JSON value; over the cap, pass <prop>: [] and an endpoint (queryPath('<query>'), from @ultimat3/core) and fetch the rows inside the island after mount — a list that is the same on every request is a dataset, not a prop