.agents/skills/ux-audit/references/layer-1-static.md
The fast, offline baseline. Read the route + feature code and decide, for each block, whether the states and patterns a good surface needs exist in the code. Run this on every audit; it's cheap and gives complete structural coverage.
Part of the ux-audit skill — see ../SKILL.md. Benchmark:
pattern-catalog.md + the ux checklists.
error case), an init flag is gated on success
only, a draft lives in an in-memory store with no persist, a pattern is absent, a fetch
has no retry, an action has no in-progress path.variant prop — mark it "pending L2".// reads as one more choice, isPrimary, variant="ghost" — is a
claim, not a verdict. The mechanism that would realize it may be absent, and L1 can't see
the gap between the two. Treat an intent-comment as a thing to confirm at L2, never tick
it ✅ off the comment. ❌ missed once: the ask-user custom-input comment said it "reads as one
more choice", but the row had none of the numbered chips the real options carry — so it
didn't; the comment described an intent the render never delivered.Pin down the route (src/routes/**) and the feature components (src/features/**) it
delegates to. Enumerate the blocks the user sees, top to bottom, plus the chrome (nav,
header, sidebar). An Explore agent is good for breadth — ask it to return the component
tree, and for each block: the data-fetching mechanism and which of empty / loading / error /
retry exist or are missing, with file:line. Re-read the 2–3 files behind your top
findings yourself.
Walk pattern-catalog.md family by family. For each block, tag the
Tidwell pattern(s) it implements and rate: ✅ solid / ⚠️ partial-or-misused / —
absent-but-expected. Output a table: Pattern | Where (block + file) | rating | note.
This also surfaces missing patterns (a feed with no Update Indicator).
For each block, walk the relevant ux module and record each gap as
present / missing / misleading with file:line. High-yield checks, most-common-first:
file:line. Ask it on every surface, including the small "just a
form" ones; that's where it hides.Rank by the shared severity rubric (SKILL.md). Feed the patterns table (step 2) and the gap list (step 3) into the shared output shape. Tag any verdict you couldn't reach from code as "pending L2/L3" so the next layer knows to confirm it.