Files
pitchfast/backlog/tasks/task-28 - Diagnose-dashboard-initial-load-retry-loop.md
2026-06-05 16:47:22 +02:00

4.9 KiB

id, title, status, assignee, created_date, updated_date, labels, dependencies, priority, ordinal
id title status assignee created_date updated_date labels dependencies priority ordinal
TASK-28 Diagnose dashboard initial-load retry loop In Progress
2026-06-05 13:46 2026-06-05 14:01
high 30000

Description

Find the root cause of the repeated dashboard requests on initial load, especially the repeated GET /dashboard/leads entries, and implement a targeted fix only after reproducing and tracing the loop.

Acceptance Criteria

  • #1 Root cause is identified with evidence from the relevant dashboard/auth/navigation code
  • #2 A minimal fix prevents repeated dashboard/leads requests on initial load
  • #3 Relevant tests or verification commands are run

Implementation Plan

  1. Read provided logs and identify repeated route pattern
  2. Trace dashboard auth, routing, and navigation layers
  3. Reproduce the repeated requests locally or via tests
  4. Confirm the root cause with the smallest evidence-producing change
  5. Implement one targeted fix
  6. Run focused verification and update acceptance criteria

Implementation Notes

Evidence gathered:

  • User-provided log repeatedly shows successful GET /dashboard/leads during dashboard use.
  • Existing Next dev log shows a hydration failure in components/dashboard-theme.tsx:88 inside DashboardThemeToggle during /dashboard rendering: server rendered Moon/aria-pressed=false while client rendered Sun/aria-pressed=true.
  • Next local docs confirm client/server render differences during hydration cause the tree to be regenerated.
  • Separate WIP issue observed: /dashboard/outreach imports a missing component, which can also produce repeated dev overlay errors, but the initial dashboard hydration error is the targeted root cause for this task.

Implemented targeted fix:

  • DashboardThemeProvider now uses useSyncExternalStore with a stable server snapshot of light, preventing the server/client icon and aria-pressed mismatch on initial dashboard hydration.
  • Added tests/dashboard-theme.test.ts to guard against reintroducing localStorage reads in the initial render path. Verification:
  • node --test .test-output/tests/dashboard-theme.test.js passes.
  • pnpm test compiles and includes the new dashboard theme test as passing, but the full run still fails in existing TASK-13 outreach WIP test OutreachReviewWorkspace uses the review workspace API and required controls.
  • pnpm lint no longer reports components/dashboard-theme.tsx; it still fails in existing components/outreach/outreach-review-workspace.tsx WIP.

Additional verification note:

  • pnpm exec tsc --noEmit fails in existing components/outreach/outreach-review-workspace.tsx WIP with type mismatches and missing fields; this is separate from the dashboard theme hydration fix and was already part of unrelated TASK-13 worktree changes.

User retest on 2026-06-05 falsified the first hydration-only fix. New evidence: pnpm dev still logs repeated GET /dashboard/leads every roughly 300-400ms with 200 responses, with proxy.ts taking ~165-522ms each time, followed by one get-session and two convex token requests. Re-entering systematic debugging; no more fixes until request initiator is identified.

Added temporary development-only proxy instrumentation for /dashboard/leads request classification. It logs non-sensitive request headers: accept, rsc, next-router-prefetch, next-router-segment-prefetch, next-hmr-refresh, next-url, sec-fetch-mode, purpose, referer, state-tree presence, and user-agent. Remove after confirming requester.

Corrected root cause after user retest and header instrumentation:

  • First hydration hypothesis was incomplete and did not stop the request fan-out.
  • Development-only proxy header instrumentation showed real browser /dashboard/leads requests were same-origin CORS fetches with next-url set to the current dashboard route, not document reloads, HMR refreshes, or server redirect loops.
  • Code search showed the repeated target originates from visible Next Link surfaces: dashboard sidebar nav plus many LeadFunnelCard action links that can share href /dashboard/leads. Next App Router prefetches visible links, and each protected prefetch crosses proxy.ts and isAuthenticated(), producing many 200 GET /dashboard/leads entries. Implemented fix:
  • Set prefetch={false} on DashboardSidebar nav links and LeadFunnelCard action links to keep click navigation but stop automatic protected-route prefetch fan-out.
  • Removed temporary proxy/fetch diagnostics.
  • Added tests/dashboard-prefetch.test.ts to lock this behavior. Verification:
  • pnpm exec tsc -p tsconfig.test.json passes.
  • node --test .test-output/tests/dashboard-prefetch.test.js .test-output/tests/dashboard-theme.test.js passes.
  • pnpm test passes 260/260.
  • pnpm lint passes with existing generated/unused warnings only, no errors.