fix(dashboard): stop skeleton flash on background refetch
Fixes #1131 — use-dynamic-query flashes skeletons on background refetch.
Problem: useDynamicQuery and useBatchDynamicQuery returned isLoading as query.isLoading || query.isFetching, so every 10m background refetch flipped isLoading true and unmounted cached data behind skeletons.
Changed: apps/dashboard/hooks/use-dynamic-query.ts — return isLoading as query.isLoading only; isFetching stays exposed for subtle refresh indicators. Checked consumers (use-events-stream, use-funnels, realtime-stats) already read isFetching separately or combine explicitly, so no behavior loss.
Checked: bunx biome check on the file passes; bunx tsc --noEmit in apps/dashboard passes. Full pre-push test run is blocked by a pre-existing, unrelated apps/links shutdown test failure (Bun.spawn ENOENT on Windows path with space); dashboard change does not touch links.
Dependencies/overlaps: none. Only open PR on this surface is #1127 (collapsed sidebar), unrelated.
AI disclosure: assisted by OpenCode (Muse Spark). Human-verified: read the hook and consumers, ran typecheck and lint.
Summary by cubic
Fixes the dashboard hooks so background refetches no longer flash skeletons over cached data.
useDynamicQuery and useBatchDynamicQuery set isLoading to query.isLoading || query.isFetching, so every 10-minute background refetch flipped isLoading to true and unmounted cached results behind skeletons. isLoading now tracks query.isLoading only; isFetching stays available for subtle refresh indicators. Consumers already read isFetching separately or combine explicitly, so no behavior is lost.