Episode 2 — React Frontend Architecture NextJS / 2.12 — Server State and API Integration

2.12.b — Loading and error states (graceful UX)

<< 2.12 Overview


Learning outcomes

  1. Model async UI with explicit states (not a single loading boolean).
  2. Design retry, offline, and partial failure paths.
  3. 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 13 ms 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 26 ms 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 39 ms 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 52 ms 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 placeholderData patterns 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 65 ms 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 78 ms of navigation.
  • Integration smell: server errors surfaced as blank screen without recovery path.
  • Root cause class: Boolean loading only—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 91 ms 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 104 ms 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 117 ms 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 130 ms 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 placeholderData patterns 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 143 ms 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 156 ms of navigation.
  • Integration smell: server errors surfaced as blank screen without recovery path.
  • Root cause class: Boolean loading only—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 169 ms 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 182 ms 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 195 ms 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 8 ms 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 placeholderData patterns 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 21 ms 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 34 ms of navigation.
  • Integration smell: server errors surfaced as blank screen without recovery path.
  • Root cause class: Boolean loading only—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 47 ms 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 60 ms 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 73 ms 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 86 ms 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 placeholderData patterns 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 99 ms 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 112 ms of navigation.
  • Integration smell: server errors surfaced as blank screen without recovery path.
  • Root cause class: Boolean loading only—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 125 ms 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 138 ms 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 151 ms 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 164 ms 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 placeholderData patterns 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 177 ms 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 190 ms of navigation.
  • Integration smell: server errors surfaced as blank screen without recovery path.
  • Root cause class: Boolean loading only—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 3 ms 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 16 ms 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 29 ms 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 42 ms 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 placeholderData patterns 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 55 ms 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 68 ms of navigation.
  • Integration smell: server errors surfaced as blank screen without recovery path.
  • Root cause class: Boolean loading only—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 81 ms 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 94 ms 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 107 ms 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 120 ms 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 placeholderData patterns 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 133 ms 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 146 ms of navigation.
  • Integration smell: server errors surfaced as blank screen without recovery path.
  • Root cause class: Boolean loading only—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 159 ms 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 172 ms 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 185 ms 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 198 ms 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 placeholderData patterns 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 11 ms 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 24 ms of navigation.
  • Integration smell: server errors surfaced as blank screen without recovery path.
  • Root cause class: Boolean loading only—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 37 ms 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 50 ms 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 63 ms 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 76 ms 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 placeholderData patterns 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 89 ms 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 102 ms of navigation.
  • Integration smell: server errors surfaced as blank screen without recovery path.
  • Root cause class: Boolean loading only—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 115 ms 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 128 ms 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 141 ms 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 154 ms 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 placeholderData patterns 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 167 ms 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 180 ms of navigation.
  • Integration smell: server errors surfaced as blank screen without recovery path.
  • Root cause class: Boolean loading only—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 193 ms 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 6 ms 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 19 ms 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 32 ms 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 placeholderData patterns 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 45 ms 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 58 ms of navigation.
  • Integration smell: server errors surfaced as blank screen without recovery path.
  • Root cause class: Boolean loading only—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 71 ms 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 84 ms 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 97 ms 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 110 ms 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 placeholderData patterns 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 123 ms 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 136 ms of navigation.
  • Integration smell: server errors surfaced as blank screen without recovery path.
  • Root cause class: Boolean loading only—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 149 ms 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 162 ms 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 175 ms 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 188 ms 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 placeholderData patterns 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 1 ms 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 14 ms of navigation.
  • Integration smell: server errors surfaced as blank screen without recovery path.
  • Root cause class: Boolean loading only—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 27 ms 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 40 ms 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 53 ms 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 66 ms 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 placeholderData patterns 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 79 ms 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 92 ms of navigation.
  • Integration smell: server errors surfaced as blank screen without recovery path.
  • Root cause class: Boolean loading only—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 105 ms 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 118 ms 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 131 ms 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 144 ms 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 placeholderData patterns 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 157 ms 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 170 ms of navigation.
  • Integration smell: server errors surfaced as blank screen without recovery path.
  • Root cause class: Boolean loading only—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 183 ms 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 196 ms 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 9 ms 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 22 ms 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 placeholderData patterns 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 35 ms 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 48 ms of navigation.
  • Integration smell: server errors surfaced as blank screen without recovery path.
  • Root cause class: Boolean loading only—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 61 ms 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 74 ms 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 87 ms 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 100 ms 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 placeholderData patterns 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 113 ms 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 126 ms of navigation.
  • Integration smell: server errors surfaced as blank screen without recovery path.
  • Root cause class: Boolean loading only—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 139 ms 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 152 ms 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 165 ms 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 178 ms 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 placeholderData patterns 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 191 ms 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 4 ms of navigation.
  • Integration smell: server errors surfaced as blank screen without recovery path.
  • Root cause class: Boolean loading only—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 17 ms 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 30 ms 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 43 ms 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 56 ms 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 placeholderData patterns 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 69 ms 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 82 ms of navigation.
  • Integration smell: server errors surfaced as blank screen without recovery path.
  • Root cause class: Boolean loading only—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 95 ms 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 108 ms 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 121 ms 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 134 ms 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 placeholderData patterns 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 147 ms 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 160 ms of navigation.
  • Integration smell: server errors surfaced as blank screen without recovery path.
  • Root cause class: Boolean loading only—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 173 ms 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 186 ms 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 199 ms 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 12 ms 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 placeholderData patterns 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 25 ms 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 38 ms of navigation.
  • Integration smell: server errors surfaced as blank screen without recovery path.
  • Root cause class: Boolean loading only—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 51 ms 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 64 ms 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 77 ms 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 90 ms 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 placeholderData patterns 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 103 ms 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 116 ms of navigation.
  • Integration smell: server errors surfaced as blank screen without recovery path.
  • Root cause class: Boolean loading only—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 129 ms 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 142 ms 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 155 ms 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 168 ms 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 placeholderData patterns 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 181 ms 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 194 ms of navigation.
  • Integration smell: server errors surfaced as blank screen without recovery path.
  • Root cause class: Boolean loading only—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 7 ms 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 20 ms 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 33 ms 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 46 ms 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 placeholderData patterns 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 59 ms 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 72 ms of navigation.
  • Integration smell: server errors surfaced as blank screen without recovery path.
  • Root cause class: Boolean loading only—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 85 ms 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 98 ms 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 111 ms 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 124 ms 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 placeholderData patterns 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 137 ms 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 150 ms of navigation.
  • Integration smell: server errors surfaced as blank screen without recovery path.
  • Root cause class: Boolean loading only—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 163 ms 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 176 ms 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 189 ms 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 2 ms 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 placeholderData patterns 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 15 ms 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 28 ms of navigation.
  • Integration smell: server errors surfaced as blank screen without recovery path.
  • Root cause class: Boolean loading only—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 41 ms 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 54 ms 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.

<< 2.12 Overview