diff --git a/log.md b/log.md index dbf8946..b5484b2 100644 --- a/log.md +++ b/log.md @@ -265,3 +265,15 @@ Resolves debt #4 from the previous entry — Phase 2 cold-load is verified end-t 3. Wire-format IMEI/UUID closure — Phase 2 backend question, not blocking dogfood. 4. ~~SPA Phase 2 cold-load lifecycle~~ — resolved today; pending push to `dev`. 5. **Phase 3 dogfood readiness** — error boundaries, mobile responsive baseline, per-device detail panel, operator-friendly empty/loading states. The next biggest fish for Rally Albania 2026-06-06. + +## [2026-05-04] note | Phase 3 plan + tasks 3.1 / 3.2 / 3.5 landed on dev + +Drafted `trm/spa/.planning/phase-3-dogfood-readiness/` task plan: eight per-task `.md` files numbered to match task IDs (01–08 ↔ 3.1–3.8). Path-1 execution order picked: 3.1 → 3.2 → 3.5 → 3.4 → 3.3 → 3.6 → 3.7 → 3.8 (reliability surface first, then operator polish, then mobile + tests, then observability, then brand). + +**3.1 — error boundaries** (commit `c1410b0`). `` class component + `error-bus` pub/sub + `` panel. Three boundaries wired: chrome (in `_authed/route.tsx`), route (in `__root.tsx`), map (in `monitor.tsx` wrapping just the layer + camera children). Notable deviation: spec sketched the map boundary inside `map-view.tsx` wrapping ALL children, but that would also wrap the floating controls (event picker, basemap switcher, connection chip), which violated the spec's own acceptance bullet. Moved into `monitor.tsx` to scope the boundary to layers + camera. `` stays a clean positioning singleton with no opinion on what's protected. Verified via Playwright with a temporary throw-on-query helper. + +**3.2 — connection-state UI escalations** (commit `8e830f0`). `` (top-of-map; muted at 5–30 s of outage, warning style ≥ 30 s or terminal `disconnected`) and `` (collapsible card; sorted last-seen-ascending). Connection store gains `outageStartedAt` set on `connected → !connected`, cleared on the inverse, and explicitly NOT set on cold-load `disconnected → connecting` so the banner only escalates for mid-session outages. + +**3.5 — empty / loading state polish** (commit `bc7483f`). `` + `` primitives, `` (soft "Connecting to live feed…" / "No devices reporting yet" cue layered over the map, hides itself once any positions arrive), `` distinct "Connecting…" disabled state, login submit-button spinner. + +**Open issue surfaced during 3.2 smoke:** the device list panel renders 8-char device-id prefixes (e.g. "35042406") instead of IMEI labels because `useDevicesById()` doesn't find those IDs in Directus's `devices` table. The Redis stream's `deviceId` and Directus's `devices.id` are diverging — the IMEI/UUID closure debt (#3) surfacing in the SPA. Will block 3.4's vehicle / crew join until closed; flagged in `04-per-device-detail-panel.md`'s risks section.