# Lappy v0.0.13 — stationary Street speed display

Street's current-speed fields on Drive and Trip now settle to **0.0 km/h (or mph)** when persistent low-speed GPS noise is compatible with a stop. Page layouts and controls are unchanged. The owner confirmed the approximately 4:16–5:09 interval of the 19 October road capture was a stationary red-light stop, with no creeping; that interval is a labelled replay check.

## Scope

`StreetSpeed` is bounded presentation state, updated from every accepted GPS sample. It receives a const `Sample` and never changes it. Raw captures, the Mac BLE capture app, GPS detail fields, Street trip/peak/moving-time statistics and both timing engines retain their existing data paths. Drag and Track receive raw samples before Street presentation processing. Timing quality thresholds are unchanged.

## Policy

- Enter zero after two seconds of qualifying samples in both receiver and host time. Speed must be ≤1.0 m/s (3.6 km/h), and ≤twice the receiver's speed-accuracy estimate with a 0.3 m/s floor.
- Release immediately at 1,389 mm/s (about 5 km/h). Below that, release after 0.3 seconds above three times speed accuracy, with a minimum exit threshold of 0.5 m/s (1.8 km/h). Hysteresis prevents flicker and allows accurately measured slow movement to return promptly.
- Require a receiver-valid 3D fix, at least four used satellites, horizontal accuracy ≤15 m and nonzero speed accuracy ≤1 m/s. Otherwise clear the hold and use the normal raw-speed/fix display policy.
- Host/receiver gaps over 0.5 seconds, invalid epochs and receiver clock resets clear continuity. Duplicate/backward epochs cannot advance a dwell. A zero expires after 0.5 seconds without fresh progress. Existing stale/no-fix display states remain in effect.

GPS alone cannot always distinguish very slow creeping from noisy standstill. Low-confidence creeping can appear as zero until the exit conditions are met. This is a Street presentation trade-off, not a measurement of physical standstill. Trip statistics still use their existing raw-sample policy and can accumulate drift; this patch only changes current-speed presentation.

## Validation

- Both ESP32 profiles build. Decoder/Drag/Track/calendar tests and nine Python tests pass. New sanitizer tests cover dwell, hysteresis, immediate/confirmed move-off, accurate creeping, poor/no fix, uncertainty limits, gaps, duplicate/backward/reset/buffered epochs, stale expiry, week rollover and 25 Hz.
- Both real captures replay through the production filter. All 1,242 stationary and 3,806 road raw speeds match the original CSV. Every road reading above 5.01 km/h remains unchanged.
- In the confirmed red-light interval, zero starts at **258.540 s**, about **2.103 s** after its first usable sample, and holds through **308.938 s**: 505 of 526 usable samples show zero, including every sample from elapsed 259 s onward. Other intervals have no independent standstill annotation.
- Simulator interaction tests cover Drive/Trip zero in both units, raw nonzero speed on Drag, move-off and stale handling. Choose **Street / stationary GPS noise** in the simulator while viewing Street; wait about two seconds.
- Existing UI geometry is preserved. No ESP32 was connected for this release: it is built and replay-tested, ready to flash, with no new physical-device acceptance claim.

Replay summary: `releases/0.0.13/simulation/street/replay-report.json`. Original captures and raw/filtered replay CSVs remain under local `captures/analysis/2026-10-19/` and are excluded from the release ZIP.
