Episode 2 — React Frontend Architecture NextJS / 2.12 — Server State and API Integration
2.12.b — Loading and error states (graceful UX)
Learning outcomes
- Model async UI with explicit states (not a single
loadingboolean). - Design retry, offline, and partial failure paths.
- Keep accessibility: announce errors where appropriate.
Recommended state shape (manual fetching)
type Remote<T> =
| { status: "idle" }
| { status: "loading" }
| { status: "error"; message: string; retry: () => void }
| { status: "success"; data: T };
Render each branch with purposeful UI—not a generic spinner for everything.
Error UX checklist
- Human-readable message + technical request id for support
- Retry button when safe (GET) vs guidance when unsafe (POST paid action)
- Do not lose form input on recoverable errors
TanStack Query alignment
useQuery gives you isPending, isError, isSuccess, failureReason, refetch—prefer these over ad-hoc booleans when adopting the library.
Appendix — Scenario bank (basic → advanced)
Flashcard rhythm: symptom → cause → fix → phrase for interviews.
API1-001 — loading & errors #1
- Level: Beginner
- Symptom: stale UI or spinner stuck after
13ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Missing skeleton for LCP-critical content.
- Primary remediation: Use partial skeletons; stream layout stability.
- Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-002 — loading & errors #2
- Level: Beginner+
- Symptom: stale UI or spinner stuck after
26ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Loading flash on fast networks (CLS / annoyance).
- Primary remediation: Normalize
{ message, code, requestId }error model. - Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-003 — loading & errors #3
- Level: Intermediate
- Symptom: stale UI or spinner stuck after
39ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Retry storms on 500 without exponential backoff.
- Primary remediation: Backoff + jitter; respect Retry-After when present.
- Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-004 — loading & errors #4
- Level: Intermediate+
- Symptom: stale UI or spinner stuck after
52ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Errors thrown as raw strings; no retry or support correlation id.
- Primary remediation: Minimum skeleton time or
placeholderDatapatterns when appropriate. - Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-005 — loading & errors #5
- Level: Advanced
- Symptom: stale UI or spinner stuck after
65ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Spinner blocks entire layout including unrelated chrome.
- Primary remediation: Reserve space with aspect-ratio/skeleton components.
- Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-006 — loading & errors #6
- Level: Advanced+
- Symptom: stale UI or spinner stuck after
78ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Boolean
loadingonly—cannot represent empty vs error vs refreshing simultaneously. - Primary remediation: Use discriminated union or TanStack Query status union for explicit UI states.
- Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-007 — loading & errors #7
- Level: Beginner
- Symptom: stale UI or spinner stuck after
91ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Missing skeleton for LCP-critical content.
- Primary remediation: Use partial skeletons; stream layout stability.
- Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-008 — loading & errors #8
- Level: Beginner+
- Symptom: stale UI or spinner stuck after
104ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Loading flash on fast networks (CLS / annoyance).
- Primary remediation: Normalize
{ message, code, requestId }error model. - Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-009 — loading & errors #9
- Level: Intermediate
- Symptom: stale UI or spinner stuck after
117ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Retry storms on 500 without exponential backoff.
- Primary remediation: Backoff + jitter; respect Retry-After when present.
- Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-010 — loading & errors #10
- Level: Intermediate+
- Symptom: stale UI or spinner stuck after
130ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Errors thrown as raw strings; no retry or support correlation id.
- Primary remediation: Minimum skeleton time or
placeholderDatapatterns when appropriate. - Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-011 — loading & errors #11
- Level: Advanced
- Symptom: stale UI or spinner stuck after
143ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Spinner blocks entire layout including unrelated chrome.
- Primary remediation: Reserve space with aspect-ratio/skeleton components.
- Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-012 — loading & errors #12
- Level: Advanced+
- Symptom: stale UI or spinner stuck after
156ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Boolean
loadingonly—cannot represent empty vs error vs refreshing simultaneously. - Primary remediation: Use discriminated union or TanStack Query status union for explicit UI states.
- Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-013 — loading & errors #13
- Level: Beginner
- Symptom: stale UI or spinner stuck after
169ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Missing skeleton for LCP-critical content.
- Primary remediation: Use partial skeletons; stream layout stability.
- Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-014 — loading & errors #14
- Level: Beginner+
- Symptom: stale UI or spinner stuck after
182ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Loading flash on fast networks (CLS / annoyance).
- Primary remediation: Normalize
{ message, code, requestId }error model. - Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-015 — loading & errors #15
- Level: Intermediate
- Symptom: stale UI or spinner stuck after
195ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Retry storms on 500 without exponential backoff.
- Primary remediation: Backoff + jitter; respect Retry-After when present.
- Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-016 — loading & errors #16
- Level: Intermediate+
- Symptom: stale UI or spinner stuck after
8ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Errors thrown as raw strings; no retry or support correlation id.
- Primary remediation: Minimum skeleton time or
placeholderDatapatterns when appropriate. - Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-017 — loading & errors #17
- Level: Advanced
- Symptom: stale UI or spinner stuck after
21ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Spinner blocks entire layout including unrelated chrome.
- Primary remediation: Reserve space with aspect-ratio/skeleton components.
- Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-018 — loading & errors #18
- Level: Advanced+
- Symptom: stale UI or spinner stuck after
34ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Boolean
loadingonly—cannot represent empty vs error vs refreshing simultaneously. - Primary remediation: Use discriminated union or TanStack Query status union for explicit UI states.
- Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-019 — loading & errors #19
- Level: Beginner
- Symptom: stale UI or spinner stuck after
47ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Missing skeleton for LCP-critical content.
- Primary remediation: Use partial skeletons; stream layout stability.
- Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-020 — loading & errors #20
- Level: Beginner+
- Symptom: stale UI or spinner stuck after
60ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Loading flash on fast networks (CLS / annoyance).
- Primary remediation: Normalize
{ message, code, requestId }error model. - Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-021 — loading & errors #21
- Level: Intermediate
- Symptom: stale UI or spinner stuck after
73ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Retry storms on 500 without exponential backoff.
- Primary remediation: Backoff + jitter; respect Retry-After when present.
- Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-022 — loading & errors #22
- Level: Intermediate+
- Symptom: stale UI or spinner stuck after
86ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Errors thrown as raw strings; no retry or support correlation id.
- Primary remediation: Minimum skeleton time or
placeholderDatapatterns when appropriate. - Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-023 — loading & errors #23
- Level: Advanced
- Symptom: stale UI or spinner stuck after
99ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Spinner blocks entire layout including unrelated chrome.
- Primary remediation: Reserve space with aspect-ratio/skeleton components.
- Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-024 — loading & errors #24
- Level: Advanced+
- Symptom: stale UI or spinner stuck after
112ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Boolean
loadingonly—cannot represent empty vs error vs refreshing simultaneously. - Primary remediation: Use discriminated union or TanStack Query status union for explicit UI states.
- Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-025 — loading & errors #25
- Level: Beginner
- Symptom: stale UI or spinner stuck after
125ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Missing skeleton for LCP-critical content.
- Primary remediation: Use partial skeletons; stream layout stability.
- Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-026 — loading & errors #26
- Level: Beginner+
- Symptom: stale UI or spinner stuck after
138ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Loading flash on fast networks (CLS / annoyance).
- Primary remediation: Normalize
{ message, code, requestId }error model. - Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-027 — loading & errors #27
- Level: Intermediate
- Symptom: stale UI or spinner stuck after
151ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Retry storms on 500 without exponential backoff.
- Primary remediation: Backoff + jitter; respect Retry-After when present.
- Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-028 — loading & errors #28
- Level: Intermediate+
- Symptom: stale UI or spinner stuck after
164ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Errors thrown as raw strings; no retry or support correlation id.
- Primary remediation: Minimum skeleton time or
placeholderDatapatterns when appropriate. - Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-029 — loading & errors #29
- Level: Advanced
- Symptom: stale UI or spinner stuck after
177ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Spinner blocks entire layout including unrelated chrome.
- Primary remediation: Reserve space with aspect-ratio/skeleton components.
- Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-030 — loading & errors #30
- Level: Advanced+
- Symptom: stale UI or spinner stuck after
190ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Boolean
loadingonly—cannot represent empty vs error vs refreshing simultaneously. - Primary remediation: Use discriminated union or TanStack Query status union for explicit UI states.
- Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-031 — loading & errors #31
- Level: Beginner
- Symptom: stale UI or spinner stuck after
3ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Missing skeleton for LCP-critical content.
- Primary remediation: Use partial skeletons; stream layout stability.
- Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-032 — loading & errors #32
- Level: Beginner+
- Symptom: stale UI or spinner stuck after
16ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Loading flash on fast networks (CLS / annoyance).
- Primary remediation: Normalize
{ message, code, requestId }error model. - Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-033 — loading & errors #33
- Level: Intermediate
- Symptom: stale UI or spinner stuck after
29ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Retry storms on 500 without exponential backoff.
- Primary remediation: Backoff + jitter; respect Retry-After when present.
- Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-034 — loading & errors #34
- Level: Intermediate+
- Symptom: stale UI or spinner stuck after
42ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Errors thrown as raw strings; no retry or support correlation id.
- Primary remediation: Minimum skeleton time or
placeholderDatapatterns when appropriate. - Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-035 — loading & errors #35
- Level: Advanced
- Symptom: stale UI or spinner stuck after
55ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Spinner blocks entire layout including unrelated chrome.
- Primary remediation: Reserve space with aspect-ratio/skeleton components.
- Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-036 — loading & errors #36
- Level: Advanced+
- Symptom: stale UI or spinner stuck after
68ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Boolean
loadingonly—cannot represent empty vs error vs refreshing simultaneously. - Primary remediation: Use discriminated union or TanStack Query status union for explicit UI states.
- Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-037 — loading & errors #37
- Level: Beginner
- Symptom: stale UI or spinner stuck after
81ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Missing skeleton for LCP-critical content.
- Primary remediation: Use partial skeletons; stream layout stability.
- Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-038 — loading & errors #38
- Level: Beginner+
- Symptom: stale UI or spinner stuck after
94ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Loading flash on fast networks (CLS / annoyance).
- Primary remediation: Normalize
{ message, code, requestId }error model. - Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-039 — loading & errors #39
- Level: Intermediate
- Symptom: stale UI or spinner stuck after
107ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Retry storms on 500 without exponential backoff.
- Primary remediation: Backoff + jitter; respect Retry-After when present.
- Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-040 — loading & errors #40
- Level: Intermediate+
- Symptom: stale UI or spinner stuck after
120ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Errors thrown as raw strings; no retry or support correlation id.
- Primary remediation: Minimum skeleton time or
placeholderDatapatterns when appropriate. - Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-041 — loading & errors #41
- Level: Advanced
- Symptom: stale UI or spinner stuck after
133ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Spinner blocks entire layout including unrelated chrome.
- Primary remediation: Reserve space with aspect-ratio/skeleton components.
- Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-042 — loading & errors #42
- Level: Advanced+
- Symptom: stale UI or spinner stuck after
146ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Boolean
loadingonly—cannot represent empty vs error vs refreshing simultaneously. - Primary remediation: Use discriminated union or TanStack Query status union for explicit UI states.
- Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-043 — loading & errors #43
- Level: Beginner
- Symptom: stale UI or spinner stuck after
159ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Missing skeleton for LCP-critical content.
- Primary remediation: Use partial skeletons; stream layout stability.
- Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-044 — loading & errors #44
- Level: Beginner+
- Symptom: stale UI or spinner stuck after
172ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Loading flash on fast networks (CLS / annoyance).
- Primary remediation: Normalize
{ message, code, requestId }error model. - Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-045 — loading & errors #45
- Level: Intermediate
- Symptom: stale UI or spinner stuck after
185ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Retry storms on 500 without exponential backoff.
- Primary remediation: Backoff + jitter; respect Retry-After when present.
- Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-046 — loading & errors #46
- Level: Intermediate+
- Symptom: stale UI or spinner stuck after
198ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Errors thrown as raw strings; no retry or support correlation id.
- Primary remediation: Minimum skeleton time or
placeholderDatapatterns when appropriate. - Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-047 — loading & errors #47
- Level: Advanced
- Symptom: stale UI or spinner stuck after
11ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Spinner blocks entire layout including unrelated chrome.
- Primary remediation: Reserve space with aspect-ratio/skeleton components.
- Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-048 — loading & errors #48
- Level: Advanced+
- Symptom: stale UI or spinner stuck after
24ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Boolean
loadingonly—cannot represent empty vs error vs refreshing simultaneously. - Primary remediation: Use discriminated union or TanStack Query status union for explicit UI states.
- Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-049 — loading & errors #49
- Level: Beginner
- Symptom: stale UI or spinner stuck after
37ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Missing skeleton for LCP-critical content.
- Primary remediation: Use partial skeletons; stream layout stability.
- Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-050 — loading & errors #50
- Level: Beginner+
- Symptom: stale UI or spinner stuck after
50ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Loading flash on fast networks (CLS / annoyance).
- Primary remediation: Normalize
{ message, code, requestId }error model. - Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-051 — loading & errors #51
- Level: Intermediate
- Symptom: stale UI or spinner stuck after
63ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Retry storms on 500 without exponential backoff.
- Primary remediation: Backoff + jitter; respect Retry-After when present.
- Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-052 — loading & errors #52
- Level: Intermediate+
- Symptom: stale UI or spinner stuck after
76ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Errors thrown as raw strings; no retry or support correlation id.
- Primary remediation: Minimum skeleton time or
placeholderDatapatterns when appropriate. - Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-053 — loading & errors #53
- Level: Advanced
- Symptom: stale UI or spinner stuck after
89ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Spinner blocks entire layout including unrelated chrome.
- Primary remediation: Reserve space with aspect-ratio/skeleton components.
- Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-054 — loading & errors #54
- Level: Advanced+
- Symptom: stale UI or spinner stuck after
102ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Boolean
loadingonly—cannot represent empty vs error vs refreshing simultaneously. - Primary remediation: Use discriminated union or TanStack Query status union for explicit UI states.
- Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-055 — loading & errors #55
- Level: Beginner
- Symptom: stale UI or spinner stuck after
115ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Missing skeleton for LCP-critical content.
- Primary remediation: Use partial skeletons; stream layout stability.
- Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-056 — loading & errors #56
- Level: Beginner+
- Symptom: stale UI or spinner stuck after
128ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Loading flash on fast networks (CLS / annoyance).
- Primary remediation: Normalize
{ message, code, requestId }error model. - Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-057 — loading & errors #57
- Level: Intermediate
- Symptom: stale UI or spinner stuck after
141ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Retry storms on 500 without exponential backoff.
- Primary remediation: Backoff + jitter; respect Retry-After when present.
- Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-058 — loading & errors #58
- Level: Intermediate+
- Symptom: stale UI or spinner stuck after
154ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Errors thrown as raw strings; no retry or support correlation id.
- Primary remediation: Minimum skeleton time or
placeholderDatapatterns when appropriate. - Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-059 — loading & errors #59
- Level: Advanced
- Symptom: stale UI or spinner stuck after
167ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Spinner blocks entire layout including unrelated chrome.
- Primary remediation: Reserve space with aspect-ratio/skeleton components.
- Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-060 — loading & errors #60
- Level: Advanced+
- Symptom: stale UI or spinner stuck after
180ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Boolean
loadingonly—cannot represent empty vs error vs refreshing simultaneously. - Primary remediation: Use discriminated union or TanStack Query status union for explicit UI states.
- Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-061 — loading & errors #61
- Level: Beginner
- Symptom: stale UI or spinner stuck after
193ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Missing skeleton for LCP-critical content.
- Primary remediation: Use partial skeletons; stream layout stability.
- Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-062 — loading & errors #62
- Level: Beginner+
- Symptom: stale UI or spinner stuck after
6ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Loading flash on fast networks (CLS / annoyance).
- Primary remediation: Normalize
{ message, code, requestId }error model. - Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-063 — loading & errors #63
- Level: Intermediate
- Symptom: stale UI or spinner stuck after
19ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Retry storms on 500 without exponential backoff.
- Primary remediation: Backoff + jitter; respect Retry-After when present.
- Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-064 — loading & errors #64
- Level: Intermediate+
- Symptom: stale UI or spinner stuck after
32ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Errors thrown as raw strings; no retry or support correlation id.
- Primary remediation: Minimum skeleton time or
placeholderDatapatterns when appropriate. - Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-065 — loading & errors #65
- Level: Advanced
- Symptom: stale UI or spinner stuck after
45ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Spinner blocks entire layout including unrelated chrome.
- Primary remediation: Reserve space with aspect-ratio/skeleton components.
- Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-066 — loading & errors #66
- Level: Advanced+
- Symptom: stale UI or spinner stuck after
58ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Boolean
loadingonly—cannot represent empty vs error vs refreshing simultaneously. - Primary remediation: Use discriminated union or TanStack Query status union for explicit UI states.
- Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-067 — loading & errors #67
- Level: Beginner
- Symptom: stale UI or spinner stuck after
71ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Missing skeleton for LCP-critical content.
- Primary remediation: Use partial skeletons; stream layout stability.
- Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-068 — loading & errors #68
- Level: Beginner+
- Symptom: stale UI or spinner stuck after
84ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Loading flash on fast networks (CLS / annoyance).
- Primary remediation: Normalize
{ message, code, requestId }error model. - Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-069 — loading & errors #69
- Level: Intermediate
- Symptom: stale UI or spinner stuck after
97ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Retry storms on 500 without exponential backoff.
- Primary remediation: Backoff + jitter; respect Retry-After when present.
- Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-070 — loading & errors #70
- Level: Intermediate+
- Symptom: stale UI or spinner stuck after
110ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Errors thrown as raw strings; no retry or support correlation id.
- Primary remediation: Minimum skeleton time or
placeholderDatapatterns when appropriate. - Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-071 — loading & errors #71
- Level: Advanced
- Symptom: stale UI or spinner stuck after
123ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Spinner blocks entire layout including unrelated chrome.
- Primary remediation: Reserve space with aspect-ratio/skeleton components.
- Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-072 — loading & errors #72
- Level: Advanced+
- Symptom: stale UI or spinner stuck after
136ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Boolean
loadingonly—cannot represent empty vs error vs refreshing simultaneously. - Primary remediation: Use discriminated union or TanStack Query status union for explicit UI states.
- Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-073 — loading & errors #73
- Level: Beginner
- Symptom: stale UI or spinner stuck after
149ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Missing skeleton for LCP-critical content.
- Primary remediation: Use partial skeletons; stream layout stability.
- Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-074 — loading & errors #74
- Level: Beginner+
- Symptom: stale UI or spinner stuck after
162ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Loading flash on fast networks (CLS / annoyance).
- Primary remediation: Normalize
{ message, code, requestId }error model. - Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-075 — loading & errors #75
- Level: Intermediate
- Symptom: stale UI or spinner stuck after
175ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Retry storms on 500 without exponential backoff.
- Primary remediation: Backoff + jitter; respect Retry-After when present.
- Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-076 — loading & errors #76
- Level: Intermediate+
- Symptom: stale UI or spinner stuck after
188ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Errors thrown as raw strings; no retry or support correlation id.
- Primary remediation: Minimum skeleton time or
placeholderDatapatterns when appropriate. - Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-077 — loading & errors #77
- Level: Advanced
- Symptom: stale UI or spinner stuck after
1ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Spinner blocks entire layout including unrelated chrome.
- Primary remediation: Reserve space with aspect-ratio/skeleton components.
- Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-078 — loading & errors #78
- Level: Advanced+
- Symptom: stale UI or spinner stuck after
14ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Boolean
loadingonly—cannot represent empty vs error vs refreshing simultaneously. - Primary remediation: Use discriminated union or TanStack Query status union for explicit UI states.
- Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-079 — loading & errors #79
- Level: Beginner
- Symptom: stale UI or spinner stuck after
27ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Missing skeleton for LCP-critical content.
- Primary remediation: Use partial skeletons; stream layout stability.
- Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-080 — loading & errors #80
- Level: Beginner+
- Symptom: stale UI or spinner stuck after
40ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Loading flash on fast networks (CLS / annoyance).
- Primary remediation: Normalize
{ message, code, requestId }error model. - Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-081 — loading & errors #81
- Level: Intermediate
- Symptom: stale UI or spinner stuck after
53ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Retry storms on 500 without exponential backoff.
- Primary remediation: Backoff + jitter; respect Retry-After when present.
- Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-082 — loading & errors #82
- Level: Intermediate+
- Symptom: stale UI or spinner stuck after
66ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Errors thrown as raw strings; no retry or support correlation id.
- Primary remediation: Minimum skeleton time or
placeholderDatapatterns when appropriate. - Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-083 — loading & errors #83
- Level: Advanced
- Symptom: stale UI or spinner stuck after
79ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Spinner blocks entire layout including unrelated chrome.
- Primary remediation: Reserve space with aspect-ratio/skeleton components.
- Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-084 — loading & errors #84
- Level: Advanced+
- Symptom: stale UI or spinner stuck after
92ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Boolean
loadingonly—cannot represent empty vs error vs refreshing simultaneously. - Primary remediation: Use discriminated union or TanStack Query status union for explicit UI states.
- Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-085 — loading & errors #85
- Level: Beginner
- Symptom: stale UI or spinner stuck after
105ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Missing skeleton for LCP-critical content.
- Primary remediation: Use partial skeletons; stream layout stability.
- Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-086 — loading & errors #86
- Level: Beginner+
- Symptom: stale UI or spinner stuck after
118ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Loading flash on fast networks (CLS / annoyance).
- Primary remediation: Normalize
{ message, code, requestId }error model. - Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-087 — loading & errors #87
- Level: Intermediate
- Symptom: stale UI or spinner stuck after
131ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Retry storms on 500 without exponential backoff.
- Primary remediation: Backoff + jitter; respect Retry-After when present.
- Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-088 — loading & errors #88
- Level: Intermediate+
- Symptom: stale UI or spinner stuck after
144ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Errors thrown as raw strings; no retry or support correlation id.
- Primary remediation: Minimum skeleton time or
placeholderDatapatterns when appropriate. - Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-089 — loading & errors #89
- Level: Advanced
- Symptom: stale UI or spinner stuck after
157ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Spinner blocks entire layout including unrelated chrome.
- Primary remediation: Reserve space with aspect-ratio/skeleton components.
- Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-090 — loading & errors #90
- Level: Advanced+
- Symptom: stale UI or spinner stuck after
170ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Boolean
loadingonly—cannot represent empty vs error vs refreshing simultaneously. - Primary remediation: Use discriminated union or TanStack Query status union for explicit UI states.
- Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-091 — loading & errors #91
- Level: Beginner
- Symptom: stale UI or spinner stuck after
183ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Missing skeleton for LCP-critical content.
- Primary remediation: Use partial skeletons; stream layout stability.
- Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-092 — loading & errors #92
- Level: Beginner+
- Symptom: stale UI or spinner stuck after
196ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Loading flash on fast networks (CLS / annoyance).
- Primary remediation: Normalize
{ message, code, requestId }error model. - Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-093 — loading & errors #93
- Level: Intermediate
- Symptom: stale UI or spinner stuck after
9ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Retry storms on 500 without exponential backoff.
- Primary remediation: Backoff + jitter; respect Retry-After when present.
- Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-094 — loading & errors #94
- Level: Intermediate+
- Symptom: stale UI or spinner stuck after
22ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Errors thrown as raw strings; no retry or support correlation id.
- Primary remediation: Minimum skeleton time or
placeholderDatapatterns when appropriate. - Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-095 — loading & errors #95
- Level: Advanced
- Symptom: stale UI or spinner stuck after
35ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Spinner blocks entire layout including unrelated chrome.
- Primary remediation: Reserve space with aspect-ratio/skeleton components.
- Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-096 — loading & errors #96
- Level: Advanced+
- Symptom: stale UI or spinner stuck after
48ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Boolean
loadingonly—cannot represent empty vs error vs refreshing simultaneously. - Primary remediation: Use discriminated union or TanStack Query status union for explicit UI states.
- Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-097 — loading & errors #97
- Level: Beginner
- Symptom: stale UI or spinner stuck after
61ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Missing skeleton for LCP-critical content.
- Primary remediation: Use partial skeletons; stream layout stability.
- Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-098 — loading & errors #98
- Level: Beginner+
- Symptom: stale UI or spinner stuck after
74ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Loading flash on fast networks (CLS / annoyance).
- Primary remediation: Normalize
{ message, code, requestId }error model. - Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-099 — loading & errors #99
- Level: Intermediate
- Symptom: stale UI or spinner stuck after
87ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Retry storms on 500 without exponential backoff.
- Primary remediation: Backoff + jitter; respect Retry-After when present.
- Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-100 — loading & errors #100
- Level: Intermediate+
- Symptom: stale UI or spinner stuck after
100ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Errors thrown as raw strings; no retry or support correlation id.
- Primary remediation: Minimum skeleton time or
placeholderDatapatterns when appropriate. - Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-101 — loading & errors #101
- Level: Advanced
- Symptom: stale UI or spinner stuck after
113ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Spinner blocks entire layout including unrelated chrome.
- Primary remediation: Reserve space with aspect-ratio/skeleton components.
- Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-102 — loading & errors #102
- Level: Advanced+
- Symptom: stale UI or spinner stuck after
126ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Boolean
loadingonly—cannot represent empty vs error vs refreshing simultaneously. - Primary remediation: Use discriminated union or TanStack Query status union for explicit UI states.
- Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-103 — loading & errors #103
- Level: Beginner
- Symptom: stale UI or spinner stuck after
139ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Missing skeleton for LCP-critical content.
- Primary remediation: Use partial skeletons; stream layout stability.
- Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-104 — loading & errors #104
- Level: Beginner+
- Symptom: stale UI or spinner stuck after
152ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Loading flash on fast networks (CLS / annoyance).
- Primary remediation: Normalize
{ message, code, requestId }error model. - Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-105 — loading & errors #105
- Level: Intermediate
- Symptom: stale UI or spinner stuck after
165ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Retry storms on 500 without exponential backoff.
- Primary remediation: Backoff + jitter; respect Retry-After when present.
- Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-106 — loading & errors #106
- Level: Intermediate+
- Symptom: stale UI or spinner stuck after
178ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Errors thrown as raw strings; no retry or support correlation id.
- Primary remediation: Minimum skeleton time or
placeholderDatapatterns when appropriate. - Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-107 — loading & errors #107
- Level: Advanced
- Symptom: stale UI or spinner stuck after
191ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Spinner blocks entire layout including unrelated chrome.
- Primary remediation: Reserve space with aspect-ratio/skeleton components.
- Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-108 — loading & errors #108
- Level: Advanced+
- Symptom: stale UI or spinner stuck after
4ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Boolean
loadingonly—cannot represent empty vs error vs refreshing simultaneously. - Primary remediation: Use discriminated union or TanStack Query status union for explicit UI states.
- Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-109 — loading & errors #109
- Level: Beginner
- Symptom: stale UI or spinner stuck after
17ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Missing skeleton for LCP-critical content.
- Primary remediation: Use partial skeletons; stream layout stability.
- Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-110 — loading & errors #110
- Level: Beginner+
- Symptom: stale UI or spinner stuck after
30ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Loading flash on fast networks (CLS / annoyance).
- Primary remediation: Normalize
{ message, code, requestId }error model. - Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-111 — loading & errors #111
- Level: Intermediate
- Symptom: stale UI or spinner stuck after
43ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Retry storms on 500 without exponential backoff.
- Primary remediation: Backoff + jitter; respect Retry-After when present.
- Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-112 — loading & errors #112
- Level: Intermediate+
- Symptom: stale UI or spinner stuck after
56ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Errors thrown as raw strings; no retry or support correlation id.
- Primary remediation: Minimum skeleton time or
placeholderDatapatterns when appropriate. - Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-113 — loading & errors #113
- Level: Advanced
- Symptom: stale UI or spinner stuck after
69ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Spinner blocks entire layout including unrelated chrome.
- Primary remediation: Reserve space with aspect-ratio/skeleton components.
- Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-114 — loading & errors #114
- Level: Advanced+
- Symptom: stale UI or spinner stuck after
82ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Boolean
loadingonly—cannot represent empty vs error vs refreshing simultaneously. - Primary remediation: Use discriminated union or TanStack Query status union for explicit UI states.
- Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-115 — loading & errors #115
- Level: Beginner
- Symptom: stale UI or spinner stuck after
95ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Missing skeleton for LCP-critical content.
- Primary remediation: Use partial skeletons; stream layout stability.
- Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-116 — loading & errors #116
- Level: Beginner+
- Symptom: stale UI or spinner stuck after
108ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Loading flash on fast networks (CLS / annoyance).
- Primary remediation: Normalize
{ message, code, requestId }error model. - Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-117 — loading & errors #117
- Level: Intermediate
- Symptom: stale UI or spinner stuck after
121ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Retry storms on 500 without exponential backoff.
- Primary remediation: Backoff + jitter; respect Retry-After when present.
- Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-118 — loading & errors #118
- Level: Intermediate+
- Symptom: stale UI or spinner stuck after
134ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Errors thrown as raw strings; no retry or support correlation id.
- Primary remediation: Minimum skeleton time or
placeholderDatapatterns when appropriate. - Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-119 — loading & errors #119
- Level: Advanced
- Symptom: stale UI or spinner stuck after
147ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Spinner blocks entire layout including unrelated chrome.
- Primary remediation: Reserve space with aspect-ratio/skeleton components.
- Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-120 — loading & errors #120
- Level: Advanced+
- Symptom: stale UI or spinner stuck after
160ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Boolean
loadingonly—cannot represent empty vs error vs refreshing simultaneously. - Primary remediation: Use discriminated union or TanStack Query status union for explicit UI states.
- Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-121 — loading & errors #121
- Level: Beginner
- Symptom: stale UI or spinner stuck after
173ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Missing skeleton for LCP-critical content.
- Primary remediation: Use partial skeletons; stream layout stability.
- Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-122 — loading & errors #122
- Level: Beginner+
- Symptom: stale UI or spinner stuck after
186ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Loading flash on fast networks (CLS / annoyance).
- Primary remediation: Normalize
{ message, code, requestId }error model. - Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-123 — loading & errors #123
- Level: Intermediate
- Symptom: stale UI or spinner stuck after
199ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Retry storms on 500 without exponential backoff.
- Primary remediation: Backoff + jitter; respect Retry-After when present.
- Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-124 — loading & errors #124
- Level: Intermediate+
- Symptom: stale UI or spinner stuck after
12ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Errors thrown as raw strings; no retry or support correlation id.
- Primary remediation: Minimum skeleton time or
placeholderDatapatterns when appropriate. - Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-125 — loading & errors #125
- Level: Advanced
- Symptom: stale UI or spinner stuck after
25ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Spinner blocks entire layout including unrelated chrome.
- Primary remediation: Reserve space with aspect-ratio/skeleton components.
- Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-126 — loading & errors #126
- Level: Advanced+
- Symptom: stale UI or spinner stuck after
38ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Boolean
loadingonly—cannot represent empty vs error vs refreshing simultaneously. - Primary remediation: Use discriminated union or TanStack Query status union for explicit UI states.
- Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-127 — loading & errors #127
- Level: Beginner
- Symptom: stale UI or spinner stuck after
51ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Missing skeleton for LCP-critical content.
- Primary remediation: Use partial skeletons; stream layout stability.
- Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-128 — loading & errors #128
- Level: Beginner+
- Symptom: stale UI or spinner stuck after
64ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Loading flash on fast networks (CLS / annoyance).
- Primary remediation: Normalize
{ message, code, requestId }error model. - Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-129 — loading & errors #129
- Level: Intermediate
- Symptom: stale UI or spinner stuck after
77ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Retry storms on 500 without exponential backoff.
- Primary remediation: Backoff + jitter; respect Retry-After when present.
- Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-130 — loading & errors #130
- Level: Intermediate+
- Symptom: stale UI or spinner stuck after
90ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Errors thrown as raw strings; no retry or support correlation id.
- Primary remediation: Minimum skeleton time or
placeholderDatapatterns when appropriate. - Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-131 — loading & errors #131
- Level: Advanced
- Symptom: stale UI or spinner stuck after
103ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Spinner blocks entire layout including unrelated chrome.
- Primary remediation: Reserve space with aspect-ratio/skeleton components.
- Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-132 — loading & errors #132
- Level: Advanced+
- Symptom: stale UI or spinner stuck after
116ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Boolean
loadingonly—cannot represent empty vs error vs refreshing simultaneously. - Primary remediation: Use discriminated union or TanStack Query status union for explicit UI states.
- Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-133 — loading & errors #133
- Level: Beginner
- Symptom: stale UI or spinner stuck after
129ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Missing skeleton for LCP-critical content.
- Primary remediation: Use partial skeletons; stream layout stability.
- Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-134 — loading & errors #134
- Level: Beginner+
- Symptom: stale UI or spinner stuck after
142ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Loading flash on fast networks (CLS / annoyance).
- Primary remediation: Normalize
{ message, code, requestId }error model. - Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-135 — loading & errors #135
- Level: Intermediate
- Symptom: stale UI or spinner stuck after
155ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Retry storms on 500 without exponential backoff.
- Primary remediation: Backoff + jitter; respect Retry-After when present.
- Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-136 — loading & errors #136
- Level: Intermediate+
- Symptom: stale UI or spinner stuck after
168ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Errors thrown as raw strings; no retry or support correlation id.
- Primary remediation: Minimum skeleton time or
placeholderDatapatterns when appropriate. - Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-137 — loading & errors #137
- Level: Advanced
- Symptom: stale UI or spinner stuck after
181ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Spinner blocks entire layout including unrelated chrome.
- Primary remediation: Reserve space with aspect-ratio/skeleton components.
- Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-138 — loading & errors #138
- Level: Advanced+
- Symptom: stale UI or spinner stuck after
194ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Boolean
loadingonly—cannot represent empty vs error vs refreshing simultaneously. - Primary remediation: Use discriminated union or TanStack Query status union for explicit UI states.
- Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-139 — loading & errors #139
- Level: Beginner
- Symptom: stale UI or spinner stuck after
7ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Missing skeleton for LCP-critical content.
- Primary remediation: Use partial skeletons; stream layout stability.
- Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-140 — loading & errors #140
- Level: Beginner+
- Symptom: stale UI or spinner stuck after
20ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Loading flash on fast networks (CLS / annoyance).
- Primary remediation: Normalize
{ message, code, requestId }error model. - Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-141 — loading & errors #141
- Level: Intermediate
- Symptom: stale UI or spinner stuck after
33ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Retry storms on 500 without exponential backoff.
- Primary remediation: Backoff + jitter; respect Retry-After when present.
- Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-142 — loading & errors #142
- Level: Intermediate+
- Symptom: stale UI or spinner stuck after
46ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Errors thrown as raw strings; no retry or support correlation id.
- Primary remediation: Minimum skeleton time or
placeholderDatapatterns when appropriate. - Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-143 — loading & errors #143
- Level: Advanced
- Symptom: stale UI or spinner stuck after
59ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Spinner blocks entire layout including unrelated chrome.
- Primary remediation: Reserve space with aspect-ratio/skeleton components.
- Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-144 — loading & errors #144
- Level: Advanced+
- Symptom: stale UI or spinner stuck after
72ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Boolean
loadingonly—cannot represent empty vs error vs refreshing simultaneously. - Primary remediation: Use discriminated union or TanStack Query status union for explicit UI states.
- Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-145 — loading & errors #145
- Level: Beginner
- Symptom: stale UI or spinner stuck after
85ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Missing skeleton for LCP-critical content.
- Primary remediation: Use partial skeletons; stream layout stability.
- Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-146 — loading & errors #146
- Level: Beginner+
- Symptom: stale UI or spinner stuck after
98ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Loading flash on fast networks (CLS / annoyance).
- Primary remediation: Normalize
{ message, code, requestId }error model. - Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-147 — loading & errors #147
- Level: Intermediate
- Symptom: stale UI or spinner stuck after
111ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Retry storms on 500 without exponential backoff.
- Primary remediation: Backoff + jitter; respect Retry-After when present.
- Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-148 — loading & errors #148
- Level: Intermediate+
- Symptom: stale UI or spinner stuck after
124ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Errors thrown as raw strings; no retry or support correlation id.
- Primary remediation: Minimum skeleton time or
placeholderDatapatterns when appropriate. - Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-149 — loading & errors #149
- Level: Advanced
- Symptom: stale UI or spinner stuck after
137ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Spinner blocks entire layout including unrelated chrome.
- Primary remediation: Reserve space with aspect-ratio/skeleton components.
- Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-150 — loading & errors #150
- Level: Advanced+
- Symptom: stale UI or spinner stuck after
150ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Boolean
loadingonly—cannot represent empty vs error vs refreshing simultaneously. - Primary remediation: Use discriminated union or TanStack Query status union for explicit UI states.
- Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-151 — loading & errors #151
- Level: Beginner
- Symptom: stale UI or spinner stuck after
163ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Missing skeleton for LCP-critical content.
- Primary remediation: Use partial skeletons; stream layout stability.
- Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-152 — loading & errors #152
- Level: Beginner+
- Symptom: stale UI or spinner stuck after
176ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Loading flash on fast networks (CLS / annoyance).
- Primary remediation: Normalize
{ message, code, requestId }error model. - Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-153 — loading & errors #153
- Level: Intermediate
- Symptom: stale UI or spinner stuck after
189ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Retry storms on 500 without exponential backoff.
- Primary remediation: Backoff + jitter; respect Retry-After when present.
- Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-154 — loading & errors #154
- Level: Intermediate+
- Symptom: stale UI or spinner stuck after
2ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Errors thrown as raw strings; no retry or support correlation id.
- Primary remediation: Minimum skeleton time or
placeholderDatapatterns when appropriate. - Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-155 — loading & errors #155
- Level: Advanced
- Symptom: stale UI or spinner stuck after
15ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Spinner blocks entire layout including unrelated chrome.
- Primary remediation: Reserve space with aspect-ratio/skeleton components.
- Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-156 — loading & errors #156
- Level: Advanced+
- Symptom: stale UI or spinner stuck after
28ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Boolean
loadingonly—cannot represent empty vs error vs refreshing simultaneously. - Primary remediation: Use discriminated union or TanStack Query status union for explicit UI states.
- Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-157 — loading & errors #157
- Level: Beginner
- Symptom: stale UI or spinner stuck after
41ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Missing skeleton for LCP-critical content.
- Primary remediation: Use partial skeletons; stream layout stability.
- Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.
API1-158 — loading & errors #158
- Level: Beginner+
- Symptom: stale UI or spinner stuck after
54ms of navigation. - Integration smell: server errors surfaced as blank screen without recovery path.
- Root cause class: Loading flash on fast networks (CLS / annoyance).
- Primary remediation: Normalize
{ message, code, requestId }error model. - Verify: Network tab + React Query Devtools (if used) + user retry path.
- Interview one-liner: Loading UX is part of the API contract—design empty, loading, error, success explicitly.