Single-callback createEffect(fn) | 🔴 throws | split (compute, apply) |
createEffect(fn, 0) / createMemo(fn, 0) initial values | 🔴 wrong arg | options object; prev default parameter |
| Setter then immediate read of same signal/DOM | 🔴 stale read | flush() or restructure |
| Signal/store write inside memo/compute/component body | 🔴 throws in dev | derive, or move write to handler/action |
actionFn() invoked inside memo/compute/component body | 🔴 dev error (ACTION_CALLED_IN_OWNED_SCOPE, beta.17); may livelock in prod | invoke from handler/effect callback/onSettled |
ownedWrite: true on app state | 🟡 escape-hatch abuse | derive instead; ownedWrite is for internal flags |
Top-level const x = props.x / store read in component body | 🟡 warns, stale | read in JSX/memo; untrack if deliberate |
onCleanup inside onSettled/createTrackedEffect | 🔴 throws | return cleanup |
Cleanup returned from onSettled fired out of band (event handler/tracked effect/nested onSettled) | 🔴 dev error (beta.16), dropped in prod | call the setup helper from the component body (owned scope) |
Primitives created inside onSettled/tracked effect | 🔴 throws | create in component body |
| Store proxy passed compute→apply, read in apply | 🟡 warns, won't re-run | extract plain values / deep(store) in compute |
Async read with no <Loading> ancestor | 🟡 root mount deferred | add boundary where fallback UI is wanted |
async function* memo over a socket/emitter/observable with no up-front onCleanup | 🔴 leaks on dispose/re-run | onCleanup (before the first await/yield) that cancels the source; try/finally/.return() can't unwind a parked generator |
refresh() called inside a computation | 🔴 throws | call from handlers/actions |
isRefreshing( call (or imported from solid-js) | 🔴 removed in beta.15 | gone from solid-js exports; detect a refresh re-run by key comparison, or use isPending/<Loading> |
<For> callback shape vs keying mode mismatch (item() on keyed, i() on keyed={false}) | 🔴 type/runtime error | check the mode table |
Dynamic boolean keyed={cond()} with function children | 🟡 ambiguous shape | literal mode or key function |
useX-with-throw context wrapper hooks | 🔵 dead boilerplate | direct useContext (throws by itself) |
camelCase DOM attributes (tabIndex, readOnly) | 🟡 wrong attribute | lowercase; handlers stay camelCase |
merge(..., maybeUndefined) assuming skip semantics | 🔴 silently overrides | filter keys or restructure defaults |