Analyze and fix unnecessary useState, derived state, and server-state-in-local-state anti-patterns
Installation
Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
Analyze and fix unnecessary useState, derived state, and server-state-in-local-state anti-patterns
You Might Not Need State
Arguments:
scope: what to analyze (default: your current changes). Examples: "diff to main", "PR #123", "src/components/", "whole codebase"
fix: whether to apply fixes (default: true). Set to false to only propose changes.
User arguments: $ARGUMENTS
Context
This codebase uses React Query for all server state and Zustand for client-only global state. useState should only be used for ephemeral UI concerns (open/closed, hover, local form input). Server data should never be copied into useState or Zustand — React Query is the single source of truth.
Derived state stored in useState: If a value can be computed from props, other state, or query data, compute it inline during render instead of storing it in state.
Server state copied into useState: Never useState + useEffect to sync React Query data into local state. Use query data directly. The only exception is forms where users edit server data.
Props mirrored into state: Never useState(prop) + useEffect(() => setState(prop)). Use the prop directly, or use a key to reset component state.
Chained useEffect state updates: Never chain Effects that set state to trigger other Effects. Calculate all derived values in the event handler or inline during render.
Storing objects when an ID suffices: Store selectedId not a copy of the selected object. Derive the object: items.find(i => i.id === selectedId).
State that duplicates Zustand or React Query: If the data already lives in a store or query cache, don't create a parallel useState.
Steps
Read the references above to understand the guidelines
Analyze the specified scope for the anti-patterns listed above
If fix=true, apply the fixes. If fix=false, propose the fixes without applying.