Files
yaris-obd/BUGS.md
T

118 lines
5.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# yaris-obd Bug Tracker
Standalone bug/issue tracker. One `## BUG-XX` per issue. Numbering sequential.
**Status**: `OPEN` → `IN PROGRESS` → `CLOSED` (with commit ref + verification).
When CLOSED, move the entire entry to Resolved — don't duplicate.
---
## Open bugs
### BUG-01 — WiFi/hotspot unreachable from phone while cell data is on
- **Status**: `IN PROGRESS` (netwatch fix deployed, needs in-car test)
- **Fix applied**: `yaris_uplink.py` now skips the periodic AP scan when clients are connected
(`_ap_client_count()` via `iw dev station dump`). Settings page has new "In-car access" card
showing hotspot URL with copy button and cell-data warning.
- **Needs verification**: Connect phone to Pi hotspot while driving; confirm it stays up >3 min.
---
### BUG-02 — Micro-USB power port on the Pi is physically damaged
- **Status**: `OPEN`
- **Severity**: Hardware
- **Area**: Hardware / power
- **Phase**: Phase 26
- **Symptom**: Pi's micro-USB 5V connector is worn — unreliable under vibration.
- **Fix scope**: Owner hard-wires 5V/GND to GPIO header (pins 2/4 for 5V).
---
### BUG-06 — Server timestamps are shifted (naive local time stored as UTC)
- **Status**: `IN PROGRESS` (fix deployed 2026-08-11, needs new-data verification)
- **Severity**: High-ish
- **Area**: `modules/app_upload.py`, `server/sql`, `server/modules/db.py`, portal
- **Phase**: Phase 26
- **Symptom**: Server trip times shifted by EDT offset (~4-5h). Pi stores naive
local time; Postgres `TIMESTAMPTZ` interprets it as UTC.
- **Fix**: New `_to_tz_aware()` helper in `app_upload.py` converts naive SQLite
timestamps to timezone-aware ISO strings before upload (e.g.,
`2026-08-10 19:27:30` → `2026-08-10T19:27:30-04:00`). Already-aware timestamps
pass through unchanged. **Existing rows on the server are NOT migrated** — only
new uploads benefit from this fix. Old trips will still show the wrong time
until a one-time server-side `UPDATE` migration is run (needs owner sign-off).
- **Acceptance**: New trips uploaded after this fix display correct local time
on both portal and Pi.
---
### BUG-11 — Dashboard GPS shows "Stale fix" while Status shows "Live fix"
- **Status**: `OPEN`
- **Severity**: Low
- **Area**: `static/js/yaris.js`, `static/js/status.js`
- **Phase**: Phase 26
- **Symptom**: Dashboard shows "Stale fix", lat/lon blank. Status page shows "Live fix"
with valid coordinates. Both pages query the same `/api/gps/status` endpoint.
- **Root cause**: Dashboard `renderGpsStatus()` updates badge + age text but never
populates lat/lon fields — those only receive data from the live `socket.on('gps_location')`
event. Status page reads `gps.latitude`/`gps.longitude` directly from the API response.
Also, the staleness thresholds differ: Dashboard marks stale at >30s, Status page
ignores age entirely.
- **Fix scope**: `renderGpsStatus()` should populate lat/lon from the API response
(already present in `status.latitude`, `status.longitude`).
- **Acceptance**: Dashboard GPS card matches Status page — both show same fix status
and coordinates.
---
## Resolved
### BUG-03 — DTC/MIL codes never persisted
- **Status**: `CLOSED` 2026-08-11
- **Commit**: `e2f2314`
- **Fix**: `save_dtc_state()` persists MIL+codes each poll. `/api/dtc` falls back to
`get_persisted_dtc_state()` when OBD offline. Cleared codes tracked via IS_SET timestamps.
- **Verification**: Deployed to Pi, `/api/dtc` returns persisted snapshot, stats show `active_dtc: 0`.
### BUG-04 — Server merges two trips into one
- **Status**: `CLOSED` 2026-08-11
- **Commit**: `96fb897`
- **Fix**: Replaced time-gap splitting with Pi's motion-aware logic: OBD > 1 km/h primary,
GPS >= 8m × 3 consecutive fallback, 5-min inactivity gap.
- **Verification**: Server trips cleared + recomputed. 17 trips on both Pi and server.
### BUG-05 — Server route replay speed_source always "gps"
- **Status**: `CLOSED` 2026-08-11
- **Commit**: `e2f2314`
- **Fix**: `"obd" if speed > 0 else "gps"` matching Pi logic.
- **Verification**: Docker rebuild, `/health` OK LAN + Cloudflare.
### BUG-07 — Trip replay on portal sometimes does nothing
- **Status**: `CLOSED` 2026-08-11
- **Commit**: `fa93384`
- **Fix**: Full rewrite of `static/js/history.js`: unified AbortController cancels fetch
+ all downstream rendering on trip switch; 300ms debounce prevents double-tap stacking;
loading spinner on map + `.table-active` row highlight give clear feedback; geocode
preload starts immediately before map rendering so cache is warm for the scrubber;
`signal.aborted` guards after every async step (route build, fitBounds, timeline init).
- **Verification**: Deployed to Pi and server. Rapid trip-switching no longer freezes.
Verified on both platforms 2026-08-11.
### BUG-08 — No trip deletion on local Pi
- **Status**: `CLOSED` 2026-08-11
- **Commit**: `c5c478b`
- **Fix**: `deletable` macro, `window.confirmDelete`, `DELETE /api/trip/<id>`, configurable
`data-delete-url` in shared `history.js`. Raw tracking preserved.
- **Verification**: Trip 1967 deleted (18→17 trips), 2028 tracking rows preserved.
### BUG-09 — Server trip scrubber geocoding is slow
- **Status**: `CLOSED` 2026-08-11
- **Fix**: `preloadGeocodes()` batch-fetches all unique coords (concurrency 4) on trip load.
`geocodePoint()` checks in-memory cache first.
- **Verification**: `preloadGeocodes` present in history.js on both Pi and server Docker container.
### BUG-10 — GPS-only false trips when car not connected
- **Status**: `CLOSED` 2026-08-11
- **Fix**: `_car_ever_connected` flag in `app_obd.py`. `build_trip_summaries()` returns
empty list when car was never connected.
- **Verification**: Pi bench-test shows 0 trips. No OBD = no GPS-only trips.