Episode 2 — React Frontend Architecture NextJS / 2.13 — Global State Management
2.13.d — Global state vs local state
Learning outcomes
- Apply a decision checklist for where state should live.
- Recognize URL state, server cache state, and client UI state as different buckets.
- Refactor premature global state back to local without breaking UX.
Default: local (colocated)
Keep state in the component that owns the UI until:
- a sibling needs it → lift to parent
- many routes need it → consider global store or URL
- server is source of truth → fetch/cache layer
URL as state
Filters, pagination, selected tabs that should be shareable often belong in the URL query string—not a global store.
Global client state examples
- authenticated UI session flags (sidebar collapsed)
- cross-route wizard progress (until persisted server-side)
- feature flags client cache (with refresh policy)
Anti-pattern
Putting every useState into Zustand “for consistency” creates global coupling and harder testing.
Appendix — Scenario bank (basic → advanced)
Each card: symptom → cause → fix → interview phrase. Drill five cards daily and explain aloud without reading.
GS3-001 — Global vs local #1
- Level: Beginner
- Symptom: subtree re-renders
13% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Prefer URL for shareable filters/bookmarks; sync to global only when needed.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-002 — Global vs local #2
- Level: Beginner+
- Symptom: subtree re-renders
26% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Namespace keys per feature or use sessionStorage for drafts intentionally.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-003 — Global vs local #3
- Level: Intermediate
- Symptom: subtree re-renders
39% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Use a data library for server cache; keep global store for cross-route client concerns.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-004 — Global vs local #4
- Level: Intermediate+
- Symptom: subtree re-renders
52% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Keep ephemeral UI local; use portals/context for cross-cutting UI chrome only.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-005 — Global vs local #5
- Level: Advanced
- Symptom: subtree re-renders
65% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Colocate state in the lowest owner; lift only when a second sibling truly needs it.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-006 — Global vs local #6
- Level: Advanced+
- Symptom: subtree re-renders
78% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Prefer URL for shareable filters/bookmarks; sync to global only when needed.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-007 — Global vs local #7
- Level: Beginner
- Symptom: subtree re-renders
91% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Namespace keys per feature or use sessionStorage for drafts intentionally.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-008 — Global vs local #8
- Level: Beginner+
- Symptom: subtree re-renders
104% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Use a data library for server cache; keep global store for cross-route client concerns.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-009 — Global vs local #9
- Level: Intermediate
- Symptom: subtree re-renders
117% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Keep ephemeral UI local; use portals/context for cross-cutting UI chrome only.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-010 — Global vs local #10
- Level: Intermediate+
- Symptom: subtree re-renders
130% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Colocate state in the lowest owner; lift only when a second sibling truly needs it.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-011 — Global vs local #11
- Level: Advanced
- Symptom: subtree re-renders
143% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Prefer URL for shareable filters/bookmarks; sync to global only when needed.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-012 — Global vs local #12
- Level: Advanced+
- Symptom: subtree re-renders
156% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Namespace keys per feature or use sessionStorage for drafts intentionally.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-013 — Global vs local #13
- Level: Beginner
- Symptom: subtree re-renders
169% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Use a data library for server cache; keep global store for cross-route client concerns.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-014 — Global vs local #14
- Level: Beginner+
- Symptom: subtree re-renders
182% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Keep ephemeral UI local; use portals/context for cross-cutting UI chrome only.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-015 — Global vs local #15
- Level: Intermediate
- Symptom: subtree re-renders
195% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Colocate state in the lowest owner; lift only when a second sibling truly needs it.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-016 — Global vs local #16
- Level: Intermediate+
- Symptom: subtree re-renders
8% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Prefer URL for shareable filters/bookmarks; sync to global only when needed.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-017 — Global vs local #17
- Level: Advanced
- Symptom: subtree re-renders
21% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Namespace keys per feature or use sessionStorage for drafts intentionally.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-018 — Global vs local #18
- Level: Advanced+
- Symptom: subtree re-renders
34% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Use a data library for server cache; keep global store for cross-route client concerns.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-019 — Global vs local #19
- Level: Beginner
- Symptom: subtree re-renders
47% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Keep ephemeral UI local; use portals/context for cross-cutting UI chrome only.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-020 — Global vs local #20
- Level: Beginner+
- Symptom: subtree re-renders
60% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Colocate state in the lowest owner; lift only when a second sibling truly needs it.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-021 — Global vs local #21
- Level: Intermediate
- Symptom: subtree re-renders
73% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Prefer URL for shareable filters/bookmarks; sync to global only when needed.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-022 — Global vs local #22
- Level: Intermediate+
- Symptom: subtree re-renders
86% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Namespace keys per feature or use sessionStorage for drafts intentionally.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-023 — Global vs local #23
- Level: Advanced
- Symptom: subtree re-renders
99% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Use a data library for server cache; keep global store for cross-route client concerns.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-024 — Global vs local #24
- Level: Advanced+
- Symptom: subtree re-renders
112% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Keep ephemeral UI local; use portals/context for cross-cutting UI chrome only.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-025 — Global vs local #25
- Level: Beginner
- Symptom: subtree re-renders
125% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Colocate state in the lowest owner; lift only when a second sibling truly needs it.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-026 — Global vs local #26
- Level: Beginner+
- Symptom: subtree re-renders
138% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Prefer URL for shareable filters/bookmarks; sync to global only when needed.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-027 — Global vs local #27
- Level: Intermediate
- Symptom: subtree re-renders
151% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Namespace keys per feature or use sessionStorage for drafts intentionally.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-028 — Global vs local #28
- Level: Intermediate+
- Symptom: subtree re-renders
164% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Use a data library for server cache; keep global store for cross-route client concerns.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-029 — Global vs local #29
- Level: Advanced
- Symptom: subtree re-renders
177% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Keep ephemeral UI local; use portals/context for cross-cutting UI chrome only.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-030 — Global vs local #30
- Level: Advanced+
- Symptom: subtree re-renders
190% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Colocate state in the lowest owner; lift only when a second sibling truly needs it.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-031 — Global vs local #31
- Level: Beginner
- Symptom: subtree re-renders
3% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Prefer URL for shareable filters/bookmarks; sync to global only when needed.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-032 — Global vs local #32
- Level: Beginner+
- Symptom: subtree re-renders
16% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Namespace keys per feature or use sessionStorage for drafts intentionally.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-033 — Global vs local #33
- Level: Intermediate
- Symptom: subtree re-renders
29% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Use a data library for server cache; keep global store for cross-route client concerns.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-034 — Global vs local #34
- Level: Intermediate+
- Symptom: subtree re-renders
42% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Keep ephemeral UI local; use portals/context for cross-cutting UI chrome only.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-035 — Global vs local #35
- Level: Advanced
- Symptom: subtree re-renders
55% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Colocate state in the lowest owner; lift only when a second sibling truly needs it.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-036 — Global vs local #36
- Level: Advanced+
- Symptom: subtree re-renders
68% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Prefer URL for shareable filters/bookmarks; sync to global only when needed.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-037 — Global vs local #37
- Level: Beginner
- Symptom: subtree re-renders
81% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Namespace keys per feature or use sessionStorage for drafts intentionally.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-038 — Global vs local #38
- Level: Beginner+
- Symptom: subtree re-renders
94% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Use a data library for server cache; keep global store for cross-route client concerns.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-039 — Global vs local #39
- Level: Intermediate
- Symptom: subtree re-renders
107% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Keep ephemeral UI local; use portals/context for cross-cutting UI chrome only.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-040 — Global vs local #40
- Level: Intermediate+
- Symptom: subtree re-renders
120% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Colocate state in the lowest owner; lift only when a second sibling truly needs it.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-041 — Global vs local #41
- Level: Advanced
- Symptom: subtree re-renders
133% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Prefer URL for shareable filters/bookmarks; sync to global only when needed.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-042 — Global vs local #42
- Level: Advanced+
- Symptom: subtree re-renders
146% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Namespace keys per feature or use sessionStorage for drafts intentionally.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-043 — Global vs local #43
- Level: Beginner
- Symptom: subtree re-renders
159% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Use a data library for server cache; keep global store for cross-route client concerns.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-044 — Global vs local #44
- Level: Beginner+
- Symptom: subtree re-renders
172% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Keep ephemeral UI local; use portals/context for cross-cutting UI chrome only.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-045 — Global vs local #45
- Level: Intermediate
- Symptom: subtree re-renders
185% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Colocate state in the lowest owner; lift only when a second sibling truly needs it.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-046 — Global vs local #46
- Level: Intermediate+
- Symptom: subtree re-renders
198% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Prefer URL for shareable filters/bookmarks; sync to global only when needed.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-047 — Global vs local #47
- Level: Advanced
- Symptom: subtree re-renders
11% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Namespace keys per feature or use sessionStorage for drafts intentionally.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-048 — Global vs local #48
- Level: Advanced+
- Symptom: subtree re-renders
24% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Use a data library for server cache; keep global store for cross-route client concerns.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-049 — Global vs local #49
- Level: Beginner
- Symptom: subtree re-renders
37% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Keep ephemeral UI local; use portals/context for cross-cutting UI chrome only.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-050 — Global vs local #50
- Level: Beginner+
- Symptom: subtree re-renders
50% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Colocate state in the lowest owner; lift only when a second sibling truly needs it.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-051 — Global vs local #51
- Level: Intermediate
- Symptom: subtree re-renders
63% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Prefer URL for shareable filters/bookmarks; sync to global only when needed.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-052 — Global vs local #52
- Level: Intermediate+
- Symptom: subtree re-renders
76% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Namespace keys per feature or use sessionStorage for drafts intentionally.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-053 — Global vs local #53
- Level: Advanced
- Symptom: subtree re-renders
89% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Use a data library for server cache; keep global store for cross-route client concerns.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-054 — Global vs local #54
- Level: Advanced+
- Symptom: subtree re-renders
102% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Keep ephemeral UI local; use portals/context for cross-cutting UI chrome only.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-055 — Global vs local #55
- Level: Beginner
- Symptom: subtree re-renders
115% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Colocate state in the lowest owner; lift only when a second sibling truly needs it.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-056 — Global vs local #56
- Level: Beginner+
- Symptom: subtree re-renders
128% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Prefer URL for shareable filters/bookmarks; sync to global only when needed.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-057 — Global vs local #57
- Level: Intermediate
- Symptom: subtree re-renders
141% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Namespace keys per feature or use sessionStorage for drafts intentionally.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-058 — Global vs local #58
- Level: Intermediate+
- Symptom: subtree re-renders
154% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Use a data library for server cache; keep global store for cross-route client concerns.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-059 — Global vs local #59
- Level: Advanced
- Symptom: subtree re-renders
167% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Keep ephemeral UI local; use portals/context for cross-cutting UI chrome only.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-060 — Global vs local #60
- Level: Advanced+
- Symptom: subtree re-renders
180% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Colocate state in the lowest owner; lift only when a second sibling truly needs it.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-061 — Global vs local #61
- Level: Beginner
- Symptom: subtree re-renders
193% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Prefer URL for shareable filters/bookmarks; sync to global only when needed.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-062 — Global vs local #62
- Level: Beginner+
- Symptom: subtree re-renders
6% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Namespace keys per feature or use sessionStorage for drafts intentionally.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-063 — Global vs local #63
- Level: Intermediate
- Symptom: subtree re-renders
19% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Use a data library for server cache; keep global store for cross-route client concerns.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-064 — Global vs local #64
- Level: Intermediate+
- Symptom: subtree re-renders
32% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Keep ephemeral UI local; use portals/context for cross-cutting UI chrome only.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-065 — Global vs local #65
- Level: Advanced
- Symptom: subtree re-renders
45% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Colocate state in the lowest owner; lift only when a second sibling truly needs it.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-066 — Global vs local #66
- Level: Advanced+
- Symptom: subtree re-renders
58% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Prefer URL for shareable filters/bookmarks; sync to global only when needed.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-067 — Global vs local #67
- Level: Beginner
- Symptom: subtree re-renders
71% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Namespace keys per feature or use sessionStorage for drafts intentionally.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-068 — Global vs local #68
- Level: Beginner+
- Symptom: subtree re-renders
84% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Use a data library for server cache; keep global store for cross-route client concerns.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-069 — Global vs local #69
- Level: Intermediate
- Symptom: subtree re-renders
97% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Keep ephemeral UI local; use portals/context for cross-cutting UI chrome only.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-070 — Global vs local #70
- Level: Intermediate+
- Symptom: subtree re-renders
110% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Colocate state in the lowest owner; lift only when a second sibling truly needs it.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-071 — Global vs local #71
- Level: Advanced
- Symptom: subtree re-renders
123% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Prefer URL for shareable filters/bookmarks; sync to global only when needed.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-072 — Global vs local #72
- Level: Advanced+
- Symptom: subtree re-renders
136% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Namespace keys per feature or use sessionStorage for drafts intentionally.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-073 — Global vs local #73
- Level: Beginner
- Symptom: subtree re-renders
149% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Use a data library for server cache; keep global store for cross-route client concerns.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-074 — Global vs local #74
- Level: Beginner+
- Symptom: subtree re-renders
162% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Keep ephemeral UI local; use portals/context for cross-cutting UI chrome only.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-075 — Global vs local #75
- Level: Intermediate
- Symptom: subtree re-renders
175% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Colocate state in the lowest owner; lift only when a second sibling truly needs it.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-076 — Global vs local #76
- Level: Intermediate+
- Symptom: subtree re-renders
188% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Prefer URL for shareable filters/bookmarks; sync to global only when needed.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-077 — Global vs local #77
- Level: Advanced
- Symptom: subtree re-renders
1% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Namespace keys per feature or use sessionStorage for drafts intentionally.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-078 — Global vs local #78
- Level: Advanced+
- Symptom: subtree re-renders
14% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Use a data library for server cache; keep global store for cross-route client concerns.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-079 — Global vs local #79
- Level: Beginner
- Symptom: subtree re-renders
27% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Keep ephemeral UI local; use portals/context for cross-cutting UI chrome only.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-080 — Global vs local #80
- Level: Beginner+
- Symptom: subtree re-renders
40% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Colocate state in the lowest owner; lift only when a second sibling truly needs it.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-081 — Global vs local #81
- Level: Intermediate
- Symptom: subtree re-renders
53% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Prefer URL for shareable filters/bookmarks; sync to global only when needed.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-082 — Global vs local #82
- Level: Intermediate+
- Symptom: subtree re-renders
66% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Namespace keys per feature or use sessionStorage for drafts intentionally.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-083 — Global vs local #83
- Level: Advanced
- Symptom: subtree re-renders
79% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Use a data library for server cache; keep global store for cross-route client concerns.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-084 — Global vs local #84
- Level: Advanced+
- Symptom: subtree re-renders
92% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Keep ephemeral UI local; use portals/context for cross-cutting UI chrome only.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-085 — Global vs local #85
- Level: Beginner
- Symptom: subtree re-renders
105% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Colocate state in the lowest owner; lift only when a second sibling truly needs it.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-086 — Global vs local #86
- Level: Beginner+
- Symptom: subtree re-renders
118% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Prefer URL for shareable filters/bookmarks; sync to global only when needed.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-087 — Global vs local #87
- Level: Intermediate
- Symptom: subtree re-renders
131% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Namespace keys per feature or use sessionStorage for drafts intentionally.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-088 — Global vs local #88
- Level: Intermediate+
- Symptom: subtree re-renders
144% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Use a data library for server cache; keep global store for cross-route client concerns.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-089 — Global vs local #89
- Level: Advanced
- Symptom: subtree re-renders
157% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Keep ephemeral UI local; use portals/context for cross-cutting UI chrome only.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-090 — Global vs local #90
- Level: Advanced+
- Symptom: subtree re-renders
170% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Colocate state in the lowest owner; lift only when a second sibling truly needs it.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-091 — Global vs local #91
- Level: Beginner
- Symptom: subtree re-renders
183% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Prefer URL for shareable filters/bookmarks; sync to global only when needed.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-092 — Global vs local #92
- Level: Beginner+
- Symptom: subtree re-renders
196% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Namespace keys per feature or use sessionStorage for drafts intentionally.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-093 — Global vs local #93
- Level: Intermediate
- Symptom: subtree re-renders
9% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Use a data library for server cache; keep global store for cross-route client concerns.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-094 — Global vs local #94
- Level: Intermediate+
- Symptom: subtree re-renders
22% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Keep ephemeral UI local; use portals/context for cross-cutting UI chrome only.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-095 — Global vs local #95
- Level: Advanced
- Symptom: subtree re-renders
35% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Colocate state in the lowest owner; lift only when a second sibling truly needs it.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-096 — Global vs local #96
- Level: Advanced+
- Symptom: subtree re-renders
48% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Prefer URL for shareable filters/bookmarks; sync to global only when needed.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-097 — Global vs local #97
- Level: Beginner
- Symptom: subtree re-renders
61% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Namespace keys per feature or use sessionStorage for drafts intentionally.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-098 — Global vs local #98
- Level: Beginner+
- Symptom: subtree re-renders
74% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Use a data library for server cache; keep global store for cross-route client concerns.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-099 — Global vs local #99
- Level: Intermediate
- Symptom: subtree re-renders
87% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Keep ephemeral UI local; use portals/context for cross-cutting UI chrome only.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-100 — Global vs local #100
- Level: Intermediate+
- Symptom: subtree re-renders
100% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Colocate state in the lowest owner; lift only when a second sibling truly needs it.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-101 — Global vs local #101
- Level: Advanced
- Symptom: subtree re-renders
113% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Prefer URL for shareable filters/bookmarks; sync to global only when needed.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-102 — Global vs local #102
- Level: Advanced+
- Symptom: subtree re-renders
126% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Namespace keys per feature or use sessionStorage for drafts intentionally.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-103 — Global vs local #103
- Level: Beginner
- Symptom: subtree re-renders
139% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Use a data library for server cache; keep global store for cross-route client concerns.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-104 — Global vs local #104
- Level: Beginner+
- Symptom: subtree re-renders
152% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Keep ephemeral UI local; use portals/context for cross-cutting UI chrome only.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-105 — Global vs local #105
- Level: Intermediate
- Symptom: subtree re-renders
165% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Colocate state in the lowest owner; lift only when a second sibling truly needs it.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-106 — Global vs local #106
- Level: Intermediate+
- Symptom: subtree re-renders
178% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Prefer URL for shareable filters/bookmarks; sync to global only when needed.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-107 — Global vs local #107
- Level: Advanced
- Symptom: subtree re-renders
191% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Namespace keys per feature or use sessionStorage for drafts intentionally.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-108 — Global vs local #108
- Level: Advanced+
- Symptom: subtree re-renders
4% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Use a data library for server cache; keep global store for cross-route client concerns.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-109 — Global vs local #109
- Level: Beginner
- Symptom: subtree re-renders
17% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Keep ephemeral UI local; use portals/context for cross-cutting UI chrome only.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-110 — Global vs local #110
- Level: Beginner+
- Symptom: subtree re-renders
30% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Colocate state in the lowest owner; lift only when a second sibling truly needs it.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-111 — Global vs local #111
- Level: Intermediate
- Symptom: subtree re-renders
43% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Prefer URL for shareable filters/bookmarks; sync to global only when needed.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-112 — Global vs local #112
- Level: Intermediate+
- Symptom: subtree re-renders
56% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Namespace keys per feature or use sessionStorage for drafts intentionally.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-113 — Global vs local #113
- Level: Advanced
- Symptom: subtree re-renders
69% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Use a data library for server cache; keep global store for cross-route client concerns.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-114 — Global vs local #114
- Level: Advanced+
- Symptom: subtree re-renders
82% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Keep ephemeral UI local; use portals/context for cross-cutting UI chrome only.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-115 — Global vs local #115
- Level: Beginner
- Symptom: subtree re-renders
95% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Colocate state in the lowest owner; lift only when a second sibling truly needs it.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-116 — Global vs local #116
- Level: Beginner+
- Symptom: subtree re-renders
108% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Prefer URL for shareable filters/bookmarks; sync to global only when needed.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-117 — Global vs local #117
- Level: Intermediate
- Symptom: subtree re-renders
121% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Namespace keys per feature or use sessionStorage for drafts intentionally.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-118 — Global vs local #118
- Level: Intermediate+
- Symptom: subtree re-renders
134% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Use a data library for server cache; keep global store for cross-route client concerns.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-119 — Global vs local #119
- Level: Advanced
- Symptom: subtree re-renders
147% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Keep ephemeral UI local; use portals/context for cross-cutting UI chrome only.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-120 — Global vs local #120
- Level: Advanced+
- Symptom: subtree re-renders
160% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Colocate state in the lowest owner; lift only when a second sibling truly needs it.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-121 — Global vs local #121
- Level: Beginner
- Symptom: subtree re-renders
173% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Prefer URL for shareable filters/bookmarks; sync to global only when needed.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-122 — Global vs local #122
- Level: Beginner+
- Symptom: subtree re-renders
186% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Namespace keys per feature or use sessionStorage for drafts intentionally.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-123 — Global vs local #123
- Level: Intermediate
- Symptom: subtree re-renders
199% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Use a data library for server cache; keep global store for cross-route client concerns.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-124 — Global vs local #124
- Level: Intermediate+
- Symptom: subtree re-renders
12% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Keep ephemeral UI local; use portals/context for cross-cutting UI chrome only.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-125 — Global vs local #125
- Level: Advanced
- Symptom: subtree re-renders
25% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Colocate state in the lowest owner; lift only when a second sibling truly needs it.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-126 — Global vs local #126
- Level: Advanced+
- Symptom: subtree re-renders
38% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Prefer URL for shareable filters/bookmarks; sync to global only when needed.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-127 — Global vs local #127
- Level: Beginner
- Symptom: subtree re-renders
51% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Namespace keys per feature or use sessionStorage for drafts intentionally.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-128 — Global vs local #128
- Level: Beginner+
- Symptom: subtree re-renders
64% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Use a data library for server cache; keep global store for cross-route client concerns.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-129 — Global vs local #129
- Level: Intermediate
- Symptom: subtree re-renders
77% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Keep ephemeral UI local; use portals/context for cross-cutting UI chrome only.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-130 — Global vs local #130
- Level: Intermediate+
- Symptom: subtree re-renders
90% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Colocate state in the lowest owner; lift only when a second sibling truly needs it.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-131 — Global vs local #131
- Level: Advanced
- Symptom: subtree re-renders
103% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Prefer URL for shareable filters/bookmarks; sync to global only when needed.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-132 — Global vs local #132
- Level: Advanced+
- Symptom: subtree re-renders
116% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Namespace keys per feature or use sessionStorage for drafts intentionally.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-133 — Global vs local #133
- Level: Beginner
- Symptom: subtree re-renders
129% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Use a data library for server cache; keep global store for cross-route client concerns.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-134 — Global vs local #134
- Level: Beginner+
- Symptom: subtree re-renders
142% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Keep ephemeral UI local; use portals/context for cross-cutting UI chrome only.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-135 — Global vs local #135
- Level: Intermediate
- Symptom: subtree re-renders
155% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Colocate state in the lowest owner; lift only when a second sibling truly needs it.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-136 — Global vs local #136
- Level: Intermediate+
- Symptom: subtree re-renders
168% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Prefer URL for shareable filters/bookmarks; sync to global only when needed.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-137 — Global vs local #137
- Level: Advanced
- Symptom: subtree re-renders
181% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Namespace keys per feature or use sessionStorage for drafts intentionally.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-138 — Global vs local #138
- Level: Advanced+
- Symptom: subtree re-renders
194% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Use a data library for server cache; keep global store for cross-route client concerns.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-139 — Global vs local #139
- Level: Beginner
- Symptom: subtree re-renders
7% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Keep ephemeral UI local; use portals/context for cross-cutting UI chrome only.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-140 — Global vs local #140
- Level: Beginner+
- Symptom: subtree re-renders
20% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Colocate state in the lowest owner; lift only when a second sibling truly needs it.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-141 — Global vs local #141
- Level: Intermediate
- Symptom: subtree re-renders
33% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Prefer URL for shareable filters/bookmarks; sync to global only when needed.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-142 — Global vs local #142
- Level: Intermediate+
- Symptom: subtree re-renders
46% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Namespace keys per feature or use sessionStorage for drafts intentionally.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-143 — Global vs local #143
- Level: Advanced
- Symptom: subtree re-renders
59% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Use a data library for server cache; keep global store for cross-route client concerns.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-144 — Global vs local #144
- Level: Advanced+
- Symptom: subtree re-renders
72% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Keep ephemeral UI local; use portals/context for cross-cutting UI chrome only.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-145 — Global vs local #145
- Level: Beginner
- Symptom: subtree re-renders
85% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Colocate state in the lowest owner; lift only when a second sibling truly needs it.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-146 — Global vs local #146
- Level: Beginner+
- Symptom: subtree re-renders
98% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Prefer URL for shareable filters/bookmarks; sync to global only when needed.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-147 — Global vs local #147
- Level: Intermediate
- Symptom: subtree re-renders
111% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Namespace keys per feature or use sessionStorage for drafts intentionally.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-148 — Global vs local #148
- Level: Intermediate+
- Symptom: subtree re-renders
124% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Use a data library for server cache; keep global store for cross-route client concerns.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-149 — Global vs local #149
- Level: Advanced
- Symptom: subtree re-renders
137% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Keep ephemeral UI local; use portals/context for cross-cutting UI chrome only.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-150 — Global vs local #150
- Level: Advanced+
- Symptom: subtree re-renders
150% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Colocate state in the lowest owner; lift only when a second sibling truly needs it.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-151 — Global vs local #151
- Level: Beginner
- Symptom: subtree re-renders
163% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Prefer URL for shareable filters/bookmarks; sync to global only when needed.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-152 — Global vs local #152
- Level: Beginner+
- Symptom: subtree re-renders
176% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Namespace keys per feature or use sessionStorage for drafts intentionally.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-153 — Global vs local #153
- Level: Intermediate
- Symptom: subtree re-renders
189% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Use a data library for server cache; keep global store for cross-route client concerns.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-154 — Global vs local #154
- Level: Intermediate+
- Symptom: subtree re-renders
2% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Keep ephemeral UI local; use portals/context for cross-cutting UI chrome only.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-155 — Global vs local #155
- Level: Advanced
- Symptom: subtree re-renders
15% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Colocate state in the lowest owner; lift only when a second sibling truly needs it.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-156 — Global vs local #156
- Level: Advanced+
- Symptom: subtree re-renders
28% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Prefer URL for shareable filters/bookmarks; sync to global only when needed.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-157 — Global vs local #157
- Level: Beginner
- Symptom: subtree re-renders
41% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Namespace keys per feature or use sessionStorage for drafts intentionally.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.
GS3-158 — Global vs local #158
- Level: Beginner+
- Symptom: subtree re-renders
54% more than expected after a small unrelated UI change. - Architecture smell: unclear ownership of who may mutate shared state.
- Root cause class: Global store used for UI that only one route owns.
- Primary remediation: Use a data library for server cache; keep global store for cross-route client concerns.
- Proof: React DevTools highlight updates; split providers and re-measure.
- Interview one-liner: Global is for cross-cutting client truth; local is for ephemeral and private UI state.