Episode 2 — React Frontend Architecture NextJS / 2.11 — Routing and Application Structure
2.11.d — useNavigate: programmatic navigation
Learning outcomes
- Navigate imperatively after async work (login, save).
- Choose
replacevs default push behavior deliberately. - Avoid navigation during render.
Example
import { useNavigate } from "react-router-dom";
export function SaveButton() {
const navigate = useNavigate();
return (
<button
type="button"
onClick={async () => {
await save();
navigate("/done", { replace: true });
}}
>
Save
</button>
);
}
When to prefer Link
If the user is clicking a normal navigation affordance, prefer Link—it is accessible, middle-clickable, and SEO-friendlier for public pages than buttons with navigate.
Appendix — Scenario bank (basic → advanced)
Drill format: broken URL / UX → root cause → fix → interview phrase.
RR3-001 — useNavigate #1
- Level: Beginner
- Symptom: 404 on refresh at depth
13or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: Relative navigate resolves incorrectly from nested route context.
- Primary remediation: Use replace for auth redirects and post-submit redirects when stack should not grow.
- Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-002 — useNavigate #2
- Level: Beginner+
- Symptom: 404 on refresh at depth
26or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: Blocking navigation without prompt UX for dirty forms.
- Primary remediation: Cancel async or guard with mounted flag before navigate.
- Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-003 — useNavigate #3
- Level: Intermediate
- Symptom: 404 on refresh at depth
39or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: Programmatic nav duplicates work Link already expresses declaratively.
- Primary remediation: Prefer Link for user-visible navigation; reserve navigate for post-mutation flows.
- Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-004 — useNavigate #4
- Level: Intermediate+
- Symptom: 404 on refresh at depth
52or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: Navigation on unmounted component after async completion.
- Primary remediation: Use router blocker APIs per version docs for unsaved changes.
- Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-005 — useNavigate #5
- Level: Advanced
- Symptom: 404 on refresh at depth
65or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: Forgot
replace: trueduplicating history entries on wizard back. - Primary remediation: Use absolute paths or
relativeoption intentionally. - Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-006 — useNavigate #6
- Level: Advanced+
- Symptom: 404 on refresh at depth
78or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: navigate() called during render causing infinite redirect loop.
- Primary remediation: Call navigate in event handlers or effects with stable deps—not render.
- Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-007 — useNavigate #7
- Level: Beginner
- Symptom: 404 on refresh at depth
91or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: Relative navigate resolves incorrectly from nested route context.
- Primary remediation: Use replace for auth redirects and post-submit redirects when stack should not grow.
- Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-008 — useNavigate #8
- Level: Beginner+
- Symptom: 404 on refresh at depth
104or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: Blocking navigation without prompt UX for dirty forms.
- Primary remediation: Cancel async or guard with mounted flag before navigate.
- Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-009 — useNavigate #9
- Level: Intermediate
- Symptom: 404 on refresh at depth
117or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: Programmatic nav duplicates work Link already expresses declaratively.
- Primary remediation: Prefer Link for user-visible navigation; reserve navigate for post-mutation flows.
- Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-010 — useNavigate #10
- Level: Intermediate+
- Symptom: 404 on refresh at depth
130or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: Navigation on unmounted component after async completion.
- Primary remediation: Use router blocker APIs per version docs for unsaved changes.
- Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-011 — useNavigate #11
- Level: Advanced
- Symptom: 404 on refresh at depth
143or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: Forgot
replace: trueduplicating history entries on wizard back. - Primary remediation: Use absolute paths or
relativeoption intentionally. - Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-012 — useNavigate #12
- Level: Advanced+
- Symptom: 404 on refresh at depth
156or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: navigate() called during render causing infinite redirect loop.
- Primary remediation: Call navigate in event handlers or effects with stable deps—not render.
- Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-013 — useNavigate #13
- Level: Beginner
- Symptom: 404 on refresh at depth
169or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: Relative navigate resolves incorrectly from nested route context.
- Primary remediation: Use replace for auth redirects and post-submit redirects when stack should not grow.
- Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-014 — useNavigate #14
- Level: Beginner+
- Symptom: 404 on refresh at depth
182or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: Blocking navigation without prompt UX for dirty forms.
- Primary remediation: Cancel async or guard with mounted flag before navigate.
- Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-015 — useNavigate #15
- Level: Intermediate
- Symptom: 404 on refresh at depth
195or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: Programmatic nav duplicates work Link already expresses declaratively.
- Primary remediation: Prefer Link for user-visible navigation; reserve navigate for post-mutation flows.
- Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-016 — useNavigate #16
- Level: Intermediate+
- Symptom: 404 on refresh at depth
8or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: Navigation on unmounted component after async completion.
- Primary remediation: Use router blocker APIs per version docs for unsaved changes.
- Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-017 — useNavigate #17
- Level: Advanced
- Symptom: 404 on refresh at depth
21or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: Forgot
replace: trueduplicating history entries on wizard back. - Primary remediation: Use absolute paths or
relativeoption intentionally. - Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-018 — useNavigate #18
- Level: Advanced+
- Symptom: 404 on refresh at depth
34or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: navigate() called during render causing infinite redirect loop.
- Primary remediation: Call navigate in event handlers or effects with stable deps—not render.
- Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-019 — useNavigate #19
- Level: Beginner
- Symptom: 404 on refresh at depth
47or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: Relative navigate resolves incorrectly from nested route context.
- Primary remediation: Use replace for auth redirects and post-submit redirects when stack should not grow.
- Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-020 — useNavigate #20
- Level: Beginner+
- Symptom: 404 on refresh at depth
60or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: Blocking navigation without prompt UX for dirty forms.
- Primary remediation: Cancel async or guard with mounted flag before navigate.
- Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-021 — useNavigate #21
- Level: Intermediate
- Symptom: 404 on refresh at depth
73or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: Programmatic nav duplicates work Link already expresses declaratively.
- Primary remediation: Prefer Link for user-visible navigation; reserve navigate for post-mutation flows.
- Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-022 — useNavigate #22
- Level: Intermediate+
- Symptom: 404 on refresh at depth
86or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: Navigation on unmounted component after async completion.
- Primary remediation: Use router blocker APIs per version docs for unsaved changes.
- Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-023 — useNavigate #23
- Level: Advanced
- Symptom: 404 on refresh at depth
99or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: Forgot
replace: trueduplicating history entries on wizard back. - Primary remediation: Use absolute paths or
relativeoption intentionally. - Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-024 — useNavigate #24
- Level: Advanced+
- Symptom: 404 on refresh at depth
112or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: navigate() called during render causing infinite redirect loop.
- Primary remediation: Call navigate in event handlers or effects with stable deps—not render.
- Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-025 — useNavigate #25
- Level: Beginner
- Symptom: 404 on refresh at depth
125or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: Relative navigate resolves incorrectly from nested route context.
- Primary remediation: Use replace for auth redirects and post-submit redirects when stack should not grow.
- Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-026 — useNavigate #26
- Level: Beginner+
- Symptom: 404 on refresh at depth
138or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: Blocking navigation without prompt UX for dirty forms.
- Primary remediation: Cancel async or guard with mounted flag before navigate.
- Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-027 — useNavigate #27
- Level: Intermediate
- Symptom: 404 on refresh at depth
151or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: Programmatic nav duplicates work Link already expresses declaratively.
- Primary remediation: Prefer Link for user-visible navigation; reserve navigate for post-mutation flows.
- Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-028 — useNavigate #28
- Level: Intermediate+
- Symptom: 404 on refresh at depth
164or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: Navigation on unmounted component after async completion.
- Primary remediation: Use router blocker APIs per version docs for unsaved changes.
- Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-029 — useNavigate #29
- Level: Advanced
- Symptom: 404 on refresh at depth
177or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: Forgot
replace: trueduplicating history entries on wizard back. - Primary remediation: Use absolute paths or
relativeoption intentionally. - Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-030 — useNavigate #30
- Level: Advanced+
- Symptom: 404 on refresh at depth
190or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: navigate() called during render causing infinite redirect loop.
- Primary remediation: Call navigate in event handlers or effects with stable deps—not render.
- Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-031 — useNavigate #31
- Level: Beginner
- Symptom: 404 on refresh at depth
3or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: Relative navigate resolves incorrectly from nested route context.
- Primary remediation: Use replace for auth redirects and post-submit redirects when stack should not grow.
- Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-032 — useNavigate #32
- Level: Beginner+
- Symptom: 404 on refresh at depth
16or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: Blocking navigation without prompt UX for dirty forms.
- Primary remediation: Cancel async or guard with mounted flag before navigate.
- Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-033 — useNavigate #33
- Level: Intermediate
- Symptom: 404 on refresh at depth
29or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: Programmatic nav duplicates work Link already expresses declaratively.
- Primary remediation: Prefer Link for user-visible navigation; reserve navigate for post-mutation flows.
- Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-034 — useNavigate #34
- Level: Intermediate+
- Symptom: 404 on refresh at depth
42or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: Navigation on unmounted component after async completion.
- Primary remediation: Use router blocker APIs per version docs for unsaved changes.
- Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-035 — useNavigate #35
- Level: Advanced
- Symptom: 404 on refresh at depth
55or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: Forgot
replace: trueduplicating history entries on wizard back. - Primary remediation: Use absolute paths or
relativeoption intentionally. - Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-036 — useNavigate #36
- Level: Advanced+
- Symptom: 404 on refresh at depth
68or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: navigate() called during render causing infinite redirect loop.
- Primary remediation: Call navigate in event handlers or effects with stable deps—not render.
- Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-037 — useNavigate #37
- Level: Beginner
- Symptom: 404 on refresh at depth
81or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: Relative navigate resolves incorrectly from nested route context.
- Primary remediation: Use replace for auth redirects and post-submit redirects when stack should not grow.
- Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-038 — useNavigate #38
- Level: Beginner+
- Symptom: 404 on refresh at depth
94or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: Blocking navigation without prompt UX for dirty forms.
- Primary remediation: Cancel async or guard with mounted flag before navigate.
- Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-039 — useNavigate #39
- Level: Intermediate
- Symptom: 404 on refresh at depth
107or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: Programmatic nav duplicates work Link already expresses declaratively.
- Primary remediation: Prefer Link for user-visible navigation; reserve navigate for post-mutation flows.
- Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-040 — useNavigate #40
- Level: Intermediate+
- Symptom: 404 on refresh at depth
120or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: Navigation on unmounted component after async completion.
- Primary remediation: Use router blocker APIs per version docs for unsaved changes.
- Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-041 — useNavigate #41
- Level: Advanced
- Symptom: 404 on refresh at depth
133or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: Forgot
replace: trueduplicating history entries on wizard back. - Primary remediation: Use absolute paths or
relativeoption intentionally. - Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-042 — useNavigate #42
- Level: Advanced+
- Symptom: 404 on refresh at depth
146or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: navigate() called during render causing infinite redirect loop.
- Primary remediation: Call navigate in event handlers or effects with stable deps—not render.
- Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-043 — useNavigate #43
- Level: Beginner
- Symptom: 404 on refresh at depth
159or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: Relative navigate resolves incorrectly from nested route context.
- Primary remediation: Use replace for auth redirects and post-submit redirects when stack should not grow.
- Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-044 — useNavigate #44
- Level: Beginner+
- Symptom: 404 on refresh at depth
172or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: Blocking navigation without prompt UX for dirty forms.
- Primary remediation: Cancel async or guard with mounted flag before navigate.
- Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-045 — useNavigate #45
- Level: Intermediate
- Symptom: 404 on refresh at depth
185or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: Programmatic nav duplicates work Link already expresses declaratively.
- Primary remediation: Prefer Link for user-visible navigation; reserve navigate for post-mutation flows.
- Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-046 — useNavigate #46
- Level: Intermediate+
- Symptom: 404 on refresh at depth
198or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: Navigation on unmounted component after async completion.
- Primary remediation: Use router blocker APIs per version docs for unsaved changes.
- Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-047 — useNavigate #47
- Level: Advanced
- Symptom: 404 on refresh at depth
11or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: Forgot
replace: trueduplicating history entries on wizard back. - Primary remediation: Use absolute paths or
relativeoption intentionally. - Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-048 — useNavigate #48
- Level: Advanced+
- Symptom: 404 on refresh at depth
24or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: navigate() called during render causing infinite redirect loop.
- Primary remediation: Call navigate in event handlers or effects with stable deps—not render.
- Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-049 — useNavigate #49
- Level: Beginner
- Symptom: 404 on refresh at depth
37or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: Relative navigate resolves incorrectly from nested route context.
- Primary remediation: Use replace for auth redirects and post-submit redirects when stack should not grow.
- Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-050 — useNavigate #50
- Level: Beginner+
- Symptom: 404 on refresh at depth
50or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: Blocking navigation without prompt UX for dirty forms.
- Primary remediation: Cancel async or guard with mounted flag before navigate.
- Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-051 — useNavigate #51
- Level: Intermediate
- Symptom: 404 on refresh at depth
63or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: Programmatic nav duplicates work Link already expresses declaratively.
- Primary remediation: Prefer Link for user-visible navigation; reserve navigate for post-mutation flows.
- Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-052 — useNavigate #52
- Level: Intermediate+
- Symptom: 404 on refresh at depth
76or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: Navigation on unmounted component after async completion.
- Primary remediation: Use router blocker APIs per version docs for unsaved changes.
- Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-053 — useNavigate #53
- Level: Advanced
- Symptom: 404 on refresh at depth
89or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: Forgot
replace: trueduplicating history entries on wizard back. - Primary remediation: Use absolute paths or
relativeoption intentionally. - Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-054 — useNavigate #54
- Level: Advanced+
- Symptom: 404 on refresh at depth
102or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: navigate() called during render causing infinite redirect loop.
- Primary remediation: Call navigate in event handlers or effects with stable deps—not render.
- Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-055 — useNavigate #55
- Level: Beginner
- Symptom: 404 on refresh at depth
115or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: Relative navigate resolves incorrectly from nested route context.
- Primary remediation: Use replace for auth redirects and post-submit redirects when stack should not grow.
- Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-056 — useNavigate #56
- Level: Beginner+
- Symptom: 404 on refresh at depth
128or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: Blocking navigation without prompt UX for dirty forms.
- Primary remediation: Cancel async or guard with mounted flag before navigate.
- Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-057 — useNavigate #57
- Level: Intermediate
- Symptom: 404 on refresh at depth
141or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: Programmatic nav duplicates work Link already expresses declaratively.
- Primary remediation: Prefer Link for user-visible navigation; reserve navigate for post-mutation flows.
- Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-058 — useNavigate #58
- Level: Intermediate+
- Symptom: 404 on refresh at depth
154or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: Navigation on unmounted component after async completion.
- Primary remediation: Use router blocker APIs per version docs for unsaved changes.
- Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-059 — useNavigate #59
- Level: Advanced
- Symptom: 404 on refresh at depth
167or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: Forgot
replace: trueduplicating history entries on wizard back. - Primary remediation: Use absolute paths or
relativeoption intentionally. - Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-060 — useNavigate #60
- Level: Advanced+
- Symptom: 404 on refresh at depth
180or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: navigate() called during render causing infinite redirect loop.
- Primary remediation: Call navigate in event handlers or effects with stable deps—not render.
- Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-061 — useNavigate #61
- Level: Beginner
- Symptom: 404 on refresh at depth
193or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: Relative navigate resolves incorrectly from nested route context.
- Primary remediation: Use replace for auth redirects and post-submit redirects when stack should not grow.
- Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-062 — useNavigate #62
- Level: Beginner+
- Symptom: 404 on refresh at depth
6or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: Blocking navigation without prompt UX for dirty forms.
- Primary remediation: Cancel async or guard with mounted flag before navigate.
- Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-063 — useNavigate #63
- Level: Intermediate
- Symptom: 404 on refresh at depth
19or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: Programmatic nav duplicates work Link already expresses declaratively.
- Primary remediation: Prefer Link for user-visible navigation; reserve navigate for post-mutation flows.
- Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-064 — useNavigate #64
- Level: Intermediate+
- Symptom: 404 on refresh at depth
32or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: Navigation on unmounted component after async completion.
- Primary remediation: Use router blocker APIs per version docs for unsaved changes.
- Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-065 — useNavigate #65
- Level: Advanced
- Symptom: 404 on refresh at depth
45or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: Forgot
replace: trueduplicating history entries on wizard back. - Primary remediation: Use absolute paths or
relativeoption intentionally. - Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-066 — useNavigate #66
- Level: Advanced+
- Symptom: 404 on refresh at depth
58or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: navigate() called during render causing infinite redirect loop.
- Primary remediation: Call navigate in event handlers or effects with stable deps—not render.
- Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-067 — useNavigate #67
- Level: Beginner
- Symptom: 404 on refresh at depth
71or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: Relative navigate resolves incorrectly from nested route context.
- Primary remediation: Use replace for auth redirects and post-submit redirects when stack should not grow.
- Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-068 — useNavigate #68
- Level: Beginner+
- Symptom: 404 on refresh at depth
84or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: Blocking navigation without prompt UX for dirty forms.
- Primary remediation: Cancel async or guard with mounted flag before navigate.
- Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-069 — useNavigate #69
- Level: Intermediate
- Symptom: 404 on refresh at depth
97or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: Programmatic nav duplicates work Link already expresses declaratively.
- Primary remediation: Prefer Link for user-visible navigation; reserve navigate for post-mutation flows.
- Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-070 — useNavigate #70
- Level: Intermediate+
- Symptom: 404 on refresh at depth
110or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: Navigation on unmounted component after async completion.
- Primary remediation: Use router blocker APIs per version docs for unsaved changes.
- Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-071 — useNavigate #71
- Level: Advanced
- Symptom: 404 on refresh at depth
123or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: Forgot
replace: trueduplicating history entries on wizard back. - Primary remediation: Use absolute paths or
relativeoption intentionally. - Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-072 — useNavigate #72
- Level: Advanced+
- Symptom: 404 on refresh at depth
136or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: navigate() called during render causing infinite redirect loop.
- Primary remediation: Call navigate in event handlers or effects with stable deps—not render.
- Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-073 — useNavigate #73
- Level: Beginner
- Symptom: 404 on refresh at depth
149or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: Relative navigate resolves incorrectly from nested route context.
- Primary remediation: Use replace for auth redirects and post-submit redirects when stack should not grow.
- Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-074 — useNavigate #74
- Level: Beginner+
- Symptom: 404 on refresh at depth
162or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: Blocking navigation without prompt UX for dirty forms.
- Primary remediation: Cancel async or guard with mounted flag before navigate.
- Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-075 — useNavigate #75
- Level: Intermediate
- Symptom: 404 on refresh at depth
175or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: Programmatic nav duplicates work Link already expresses declaratively.
- Primary remediation: Prefer Link for user-visible navigation; reserve navigate for post-mutation flows.
- Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-076 — useNavigate #76
- Level: Intermediate+
- Symptom: 404 on refresh at depth
188or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: Navigation on unmounted component after async completion.
- Primary remediation: Use router blocker APIs per version docs for unsaved changes.
- Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-077 — useNavigate #77
- Level: Advanced
- Symptom: 404 on refresh at depth
1or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: Forgot
replace: trueduplicating history entries on wizard back. - Primary remediation: Use absolute paths or
relativeoption intentionally. - Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-078 — useNavigate #78
- Level: Advanced+
- Symptom: 404 on refresh at depth
14or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: navigate() called during render causing infinite redirect loop.
- Primary remediation: Call navigate in event handlers or effects with stable deps—not render.
- Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-079 — useNavigate #79
- Level: Beginner
- Symptom: 404 on refresh at depth
27or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: Relative navigate resolves incorrectly from nested route context.
- Primary remediation: Use replace for auth redirects and post-submit redirects when stack should not grow.
- Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-080 — useNavigate #80
- Level: Beginner+
- Symptom: 404 on refresh at depth
40or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: Blocking navigation without prompt UX for dirty forms.
- Primary remediation: Cancel async or guard with mounted flag before navigate.
- Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-081 — useNavigate #81
- Level: Intermediate
- Symptom: 404 on refresh at depth
53or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: Programmatic nav duplicates work Link already expresses declaratively.
- Primary remediation: Prefer Link for user-visible navigation; reserve navigate for post-mutation flows.
- Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-082 — useNavigate #82
- Level: Intermediate+
- Symptom: 404 on refresh at depth
66or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: Navigation on unmounted component after async completion.
- Primary remediation: Use router blocker APIs per version docs for unsaved changes.
- Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-083 — useNavigate #83
- Level: Advanced
- Symptom: 404 on refresh at depth
79or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: Forgot
replace: trueduplicating history entries on wizard back. - Primary remediation: Use absolute paths or
relativeoption intentionally. - Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-084 — useNavigate #84
- Level: Advanced+
- Symptom: 404 on refresh at depth
92or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: navigate() called during render causing infinite redirect loop.
- Primary remediation: Call navigate in event handlers or effects with stable deps—not render.
- Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-085 — useNavigate #85
- Level: Beginner
- Symptom: 404 on refresh at depth
105or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: Relative navigate resolves incorrectly from nested route context.
- Primary remediation: Use replace for auth redirects and post-submit redirects when stack should not grow.
- Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-086 — useNavigate #86
- Level: Beginner+
- Symptom: 404 on refresh at depth
118or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: Blocking navigation without prompt UX for dirty forms.
- Primary remediation: Cancel async or guard with mounted flag before navigate.
- Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-087 — useNavigate #87
- Level: Intermediate
- Symptom: 404 on refresh at depth
131or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: Programmatic nav duplicates work Link already expresses declaratively.
- Primary remediation: Prefer Link for user-visible navigation; reserve navigate for post-mutation flows.
- Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-088 — useNavigate #88
- Level: Intermediate+
- Symptom: 404 on refresh at depth
144or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: Navigation on unmounted component after async completion.
- Primary remediation: Use router blocker APIs per version docs for unsaved changes.
- Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-089 — useNavigate #89
- Level: Advanced
- Symptom: 404 on refresh at depth
157or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: Forgot
replace: trueduplicating history entries on wizard back. - Primary remediation: Use absolute paths or
relativeoption intentionally. - Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-090 — useNavigate #90
- Level: Advanced+
- Symptom: 404 on refresh at depth
170or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: navigate() called during render causing infinite redirect loop.
- Primary remediation: Call navigate in event handlers or effects with stable deps—not render.
- Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-091 — useNavigate #91
- Level: Beginner
- Symptom: 404 on refresh at depth
183or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: Relative navigate resolves incorrectly from nested route context.
- Primary remediation: Use replace for auth redirects and post-submit redirects when stack should not grow.
- Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-092 — useNavigate #92
- Level: Beginner+
- Symptom: 404 on refresh at depth
196or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: Blocking navigation without prompt UX for dirty forms.
- Primary remediation: Cancel async or guard with mounted flag before navigate.
- Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-093 — useNavigate #93
- Level: Intermediate
- Symptom: 404 on refresh at depth
9or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: Programmatic nav duplicates work Link already expresses declaratively.
- Primary remediation: Prefer Link for user-visible navigation; reserve navigate for post-mutation flows.
- Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-094 — useNavigate #94
- Level: Intermediate+
- Symptom: 404 on refresh at depth
22or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: Navigation on unmounted component after async completion.
- Primary remediation: Use router blocker APIs per version docs for unsaved changes.
- Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-095 — useNavigate #95
- Level: Advanced
- Symptom: 404 on refresh at depth
35or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: Forgot
replace: trueduplicating history entries on wizard back. - Primary remediation: Use absolute paths or
relativeoption intentionally. - Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-096 — useNavigate #96
- Level: Advanced+
- Symptom: 404 on refresh at depth
48or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: navigate() called during render causing infinite redirect loop.
- Primary remediation: Call navigate in event handlers or effects with stable deps—not render.
- Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-097 — useNavigate #97
- Level: Beginner
- Symptom: 404 on refresh at depth
61or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: Relative navigate resolves incorrectly from nested route context.
- Primary remediation: Use replace for auth redirects and post-submit redirects when stack should not grow.
- Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-098 — useNavigate #98
- Level: Beginner+
- Symptom: 404 on refresh at depth
74or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: Blocking navigation without prompt UX for dirty forms.
- Primary remediation: Cancel async or guard with mounted flag before navigate.
- Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-099 — useNavigate #99
- Level: Intermediate
- Symptom: 404 on refresh at depth
87or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: Programmatic nav duplicates work Link already expresses declaratively.
- Primary remediation: Prefer Link for user-visible navigation; reserve navigate for post-mutation flows.
- Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-100 — useNavigate #100
- Level: Intermediate+
- Symptom: 404 on refresh at depth
100or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: Navigation on unmounted component after async completion.
- Primary remediation: Use router blocker APIs per version docs for unsaved changes.
- Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-101 — useNavigate #101
- Level: Advanced
- Symptom: 404 on refresh at depth
113or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: Forgot
replace: trueduplicating history entries on wizard back. - Primary remediation: Use absolute paths or
relativeoption intentionally. - Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-102 — useNavigate #102
- Level: Advanced+
- Symptom: 404 on refresh at depth
126or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: navigate() called during render causing infinite redirect loop.
- Primary remediation: Call navigate in event handlers or effects with stable deps—not render.
- Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-103 — useNavigate #103
- Level: Beginner
- Symptom: 404 on refresh at depth
139or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: Relative navigate resolves incorrectly from nested route context.
- Primary remediation: Use replace for auth redirects and post-submit redirects when stack should not grow.
- Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-104 — useNavigate #104
- Level: Beginner+
- Symptom: 404 on refresh at depth
152or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: Blocking navigation without prompt UX for dirty forms.
- Primary remediation: Cancel async or guard with mounted flag before navigate.
- Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-105 — useNavigate #105
- Level: Intermediate
- Symptom: 404 on refresh at depth
165or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: Programmatic nav duplicates work Link already expresses declaratively.
- Primary remediation: Prefer Link for user-visible navigation; reserve navigate for post-mutation flows.
- Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-106 — useNavigate #106
- Level: Intermediate+
- Symptom: 404 on refresh at depth
178or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: Navigation on unmounted component after async completion.
- Primary remediation: Use router blocker APIs per version docs for unsaved changes.
- Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-107 — useNavigate #107
- Level: Advanced
- Symptom: 404 on refresh at depth
191or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: Forgot
replace: trueduplicating history entries on wizard back. - Primary remediation: Use absolute paths or
relativeoption intentionally. - Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-108 — useNavigate #108
- Level: Advanced+
- Symptom: 404 on refresh at depth
4or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: navigate() called during render causing infinite redirect loop.
- Primary remediation: Call navigate in event handlers or effects with stable deps—not render.
- Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-109 — useNavigate #109
- Level: Beginner
- Symptom: 404 on refresh at depth
17or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: Relative navigate resolves incorrectly from nested route context.
- Primary remediation: Use replace for auth redirects and post-submit redirects when stack should not grow.
- Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-110 — useNavigate #110
- Level: Beginner+
- Symptom: 404 on refresh at depth
30or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: Blocking navigation without prompt UX for dirty forms.
- Primary remediation: Cancel async or guard with mounted flag before navigate.
- Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-111 — useNavigate #111
- Level: Intermediate
- Symptom: 404 on refresh at depth
43or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: Programmatic nav duplicates work Link already expresses declaratively.
- Primary remediation: Prefer Link for user-visible navigation; reserve navigate for post-mutation flows.
- Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-112 — useNavigate #112
- Level: Intermediate+
- Symptom: 404 on refresh at depth
56or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: Navigation on unmounted component after async completion.
- Primary remediation: Use router blocker APIs per version docs for unsaved changes.
- Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-113 — useNavigate #113
- Level: Advanced
- Symptom: 404 on refresh at depth
69or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: Forgot
replace: trueduplicating history entries on wizard back. - Primary remediation: Use absolute paths or
relativeoption intentionally. - Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-114 — useNavigate #114
- Level: Advanced+
- Symptom: 404 on refresh at depth
82or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: navigate() called during render causing infinite redirect loop.
- Primary remediation: Call navigate in event handlers or effects with stable deps—not render.
- Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-115 — useNavigate #115
- Level: Beginner
- Symptom: 404 on refresh at depth
95or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: Relative navigate resolves incorrectly from nested route context.
- Primary remediation: Use replace for auth redirects and post-submit redirects when stack should not grow.
- Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-116 — useNavigate #116
- Level: Beginner+
- Symptom: 404 on refresh at depth
108or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: Blocking navigation without prompt UX for dirty forms.
- Primary remediation: Cancel async or guard with mounted flag before navigate.
- Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-117 — useNavigate #117
- Level: Intermediate
- Symptom: 404 on refresh at depth
121or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: Programmatic nav duplicates work Link already expresses declaratively.
- Primary remediation: Prefer Link for user-visible navigation; reserve navigate for post-mutation flows.
- Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-118 — useNavigate #118
- Level: Intermediate+
- Symptom: 404 on refresh at depth
134or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: Navigation on unmounted component after async completion.
- Primary remediation: Use router blocker APIs per version docs for unsaved changes.
- Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-119 — useNavigate #119
- Level: Advanced
- Symptom: 404 on refresh at depth
147or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: Forgot
replace: trueduplicating history entries on wizard back. - Primary remediation: Use absolute paths or
relativeoption intentionally. - Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-120 — useNavigate #120
- Level: Advanced+
- Symptom: 404 on refresh at depth
160or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: navigate() called during render causing infinite redirect loop.
- Primary remediation: Call navigate in event handlers or effects with stable deps—not render.
- Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-121 — useNavigate #121
- Level: Beginner
- Symptom: 404 on refresh at depth
173or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: Relative navigate resolves incorrectly from nested route context.
- Primary remediation: Use replace for auth redirects and post-submit redirects when stack should not grow.
- Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-122 — useNavigate #122
- Level: Beginner+
- Symptom: 404 on refresh at depth
186or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: Blocking navigation without prompt UX for dirty forms.
- Primary remediation: Cancel async or guard with mounted flag before navigate.
- Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-123 — useNavigate #123
- Level: Intermediate
- Symptom: 404 on refresh at depth
199or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: Programmatic nav duplicates work Link already expresses declaratively.
- Primary remediation: Prefer Link for user-visible navigation; reserve navigate for post-mutation flows.
- Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-124 — useNavigate #124
- Level: Intermediate+
- Symptom: 404 on refresh at depth
12or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: Navigation on unmounted component after async completion.
- Primary remediation: Use router blocker APIs per version docs for unsaved changes.
- Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-125 — useNavigate #125
- Level: Advanced
- Symptom: 404 on refresh at depth
25or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: Forgot
replace: trueduplicating history entries on wizard back. - Primary remediation: Use absolute paths or
relativeoption intentionally. - Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-126 — useNavigate #126
- Level: Advanced+
- Symptom: 404 on refresh at depth
38or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: navigate() called during render causing infinite redirect loop.
- Primary remediation: Call navigate in event handlers or effects with stable deps—not render.
- Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-127 — useNavigate #127
- Level: Beginner
- Symptom: 404 on refresh at depth
51or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: Relative navigate resolves incorrectly from nested route context.
- Primary remediation: Use replace for auth redirects and post-submit redirects when stack should not grow.
- Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-128 — useNavigate #128
- Level: Beginner+
- Symptom: 404 on refresh at depth
64or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: Blocking navigation without prompt UX for dirty forms.
- Primary remediation: Cancel async or guard with mounted flag before navigate.
- Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-129 — useNavigate #129
- Level: Intermediate
- Symptom: 404 on refresh at depth
77or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: Programmatic nav duplicates work Link already expresses declaratively.
- Primary remediation: Prefer Link for user-visible navigation; reserve navigate for post-mutation flows.
- Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-130 — useNavigate #130
- Level: Intermediate+
- Symptom: 404 on refresh at depth
90or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: Navigation on unmounted component after async completion.
- Primary remediation: Use router blocker APIs per version docs for unsaved changes.
- Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-131 — useNavigate #131
- Level: Advanced
- Symptom: 404 on refresh at depth
103or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: Forgot
replace: trueduplicating history entries on wizard back. - Primary remediation: Use absolute paths or
relativeoption intentionally. - Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-132 — useNavigate #132
- Level: Advanced+
- Symptom: 404 on refresh at depth
116or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: navigate() called during render causing infinite redirect loop.
- Primary remediation: Call navigate in event handlers or effects with stable deps—not render.
- Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-133 — useNavigate #133
- Level: Beginner
- Symptom: 404 on refresh at depth
129or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: Relative navigate resolves incorrectly from nested route context.
- Primary remediation: Use replace for auth redirects and post-submit redirects when stack should not grow.
- Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-134 — useNavigate #134
- Level: Beginner+
- Symptom: 404 on refresh at depth
142or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: Blocking navigation without prompt UX for dirty forms.
- Primary remediation: Cancel async or guard with mounted flag before navigate.
- Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-135 — useNavigate #135
- Level: Intermediate
- Symptom: 404 on refresh at depth
155or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: Programmatic nav duplicates work Link already expresses declaratively.
- Primary remediation: Prefer Link for user-visible navigation; reserve navigate for post-mutation flows.
- Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-136 — useNavigate #136
- Level: Intermediate+
- Symptom: 404 on refresh at depth
168or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: Navigation on unmounted component after async completion.
- Primary remediation: Use router blocker APIs per version docs for unsaved changes.
- Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-137 — useNavigate #137
- Level: Advanced
- Symptom: 404 on refresh at depth
181or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: Forgot
replace: trueduplicating history entries on wizard back. - Primary remediation: Use absolute paths or
relativeoption intentionally. - Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-138 — useNavigate #138
- Level: Advanced+
- Symptom: 404 on refresh at depth
194or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: navigate() called during render causing infinite redirect loop.
- Primary remediation: Call navigate in event handlers or effects with stable deps—not render.
- Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-139 — useNavigate #139
- Level: Beginner
- Symptom: 404 on refresh at depth
7or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: Relative navigate resolves incorrectly from nested route context.
- Primary remediation: Use replace for auth redirects and post-submit redirects when stack should not grow.
- Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-140 — useNavigate #140
- Level: Beginner+
- Symptom: 404 on refresh at depth
20or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: Blocking navigation without prompt UX for dirty forms.
- Primary remediation: Cancel async or guard with mounted flag before navigate.
- Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-141 — useNavigate #141
- Level: Intermediate
- Symptom: 404 on refresh at depth
33or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: Programmatic nav duplicates work Link already expresses declaratively.
- Primary remediation: Prefer Link for user-visible navigation; reserve navigate for post-mutation flows.
- Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-142 — useNavigate #142
- Level: Intermediate+
- Symptom: 404 on refresh at depth
46or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: Navigation on unmounted component after async completion.
- Primary remediation: Use router blocker APIs per version docs for unsaved changes.
- Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-143 — useNavigate #143
- Level: Advanced
- Symptom: 404 on refresh at depth
59or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: Forgot
replace: trueduplicating history entries on wizard back. - Primary remediation: Use absolute paths or
relativeoption intentionally. - Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-144 — useNavigate #144
- Level: Advanced+
- Symptom: 404 on refresh at depth
72or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: navigate() called during render causing infinite redirect loop.
- Primary remediation: Call navigate in event handlers or effects with stable deps—not render.
- Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-145 — useNavigate #145
- Level: Beginner
- Symptom: 404 on refresh at depth
85or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: Relative navigate resolves incorrectly from nested route context.
- Primary remediation: Use replace for auth redirects and post-submit redirects when stack should not grow.
- Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-146 — useNavigate #146
- Level: Beginner+
- Symptom: 404 on refresh at depth
98or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: Blocking navigation without prompt UX for dirty forms.
- Primary remediation: Cancel async or guard with mounted flag before navigate.
- Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-147 — useNavigate #147
- Level: Intermediate
- Symptom: 404 on refresh at depth
111or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: Programmatic nav duplicates work Link already expresses declaratively.
- Primary remediation: Prefer Link for user-visible navigation; reserve navigate for post-mutation flows.
- Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-148 — useNavigate #148
- Level: Intermediate+
- Symptom: 404 on refresh at depth
124or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: Navigation on unmounted component after async completion.
- Primary remediation: Use router blocker APIs per version docs for unsaved changes.
- Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-149 — useNavigate #149
- Level: Advanced
- Symptom: 404 on refresh at depth
137or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: Forgot
replace: trueduplicating history entries on wizard back. - Primary remediation: Use absolute paths or
relativeoption intentionally. - Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-150 — useNavigate #150
- Level: Advanced+
- Symptom: 404 on refresh at depth
150or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: navigate() called during render causing infinite redirect loop.
- Primary remediation: Call navigate in event handlers or effects with stable deps—not render.
- Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-151 — useNavigate #151
- Level: Beginner
- Symptom: 404 on refresh at depth
163or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: Relative navigate resolves incorrectly from nested route context.
- Primary remediation: Use replace for auth redirects and post-submit redirects when stack should not grow.
- Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-152 — useNavigate #152
- Level: Beginner+
- Symptom: 404 on refresh at depth
176or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: Blocking navigation without prompt UX for dirty forms.
- Primary remediation: Cancel async or guard with mounted flag before navigate.
- Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-153 — useNavigate #153
- Level: Intermediate
- Symptom: 404 on refresh at depth
189or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: Programmatic nav duplicates work Link already expresses declaratively.
- Primary remediation: Prefer Link for user-visible navigation; reserve navigate for post-mutation flows.
- Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-154 — useNavigate #154
- Level: Intermediate+
- Symptom: 404 on refresh at depth
2or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: Navigation on unmounted component after async completion.
- Primary remediation: Use router blocker APIs per version docs for unsaved changes.
- Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-155 — useNavigate #155
- Level: Advanced
- Symptom: 404 on refresh at depth
15or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: Forgot
replace: trueduplicating history entries on wizard back. - Primary remediation: Use absolute paths or
relativeoption intentionally. - Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-156 — useNavigate #156
- Level: Advanced+
- Symptom: 404 on refresh at depth
28or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: navigate() called during render causing infinite redirect loop.
- Primary remediation: Call navigate in event handlers or effects with stable deps—not render.
- Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-157 — useNavigate #157
- Level: Beginner
- Symptom: 404 on refresh at depth
41or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: Relative navigate resolves incorrectly from nested route context.
- Primary remediation: Use replace for auth redirects and post-submit redirects when stack should not grow.
- Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.
RR3-158 — useNavigate #158
- Level: Beginner+
- Symptom: 404 on refresh at depth
54or wrong active nav highlight. - Structure symptom: duplicated layout or import cycles after refactor.
- Root cause class: Blocking navigation without prompt UX for dirty forms.
- Primary remediation: Cancel async or guard with mounted flag before navigate.
- Verify: direct URL load, back/forward, deep link from email, mobile share sheet.
- Interview one-liner: Declarative routing for discoverability; imperative navigate for outcomes of async work.