# Lappy v0.0.14 — stationary Street trip counters

Street's trip distance and moving time now use the same stationary detection as its current-speed display. UI layout and controls are unchanged. Raw FD02 capture measurements, the Mac BLE capture app, GPS detail fields, peak speed and Drag/Track timing inputs remain unchanged.

## Behaviour

- During the existing two-second stationary-candidate dwell, trip increments are held provisionally. Confirming a stop discards them, so the counters do not creep up during detection or jump backwards afterwards.
- If the candidate ends before confirmation because movement resumes, those tentative increments are committed. Normal moving-speed integration keeps its existing trapezoidal calculation, 0.5 m/s endpoint threshold and speed-accuracy gate.
- Confirmed stationary samples add neither distance nor moving time. Moving off resumes integration from fresh moving samples, without bridging the stopped-to-moving interval. The current-speed filter's entry/exit thresholds and hysteresis are unchanged from v0.0.13.
- Invalid epochs, reconnects, quality loss and receiver/host gaps discard pending increments and break continuity as appropriate. Counters remain monotonic, continue across UI modes/pages, and reset at boot as before.
- `StreetStatistics` is separate from the original raw `Statistics` used by desktop capture/replay. Every sample remains const; Drag and Track receive the original sample before Street processing. Shutdown summary events now contain the filtered Street totals, while raw notification records remain untouched.

GPS cannot always distinguish uncertain creeping from standstill. Low-confidence movement can therefore be suppressed by this Street policy. Accurately measured creeping remains counted. No physical stationary detector or new GPS quality claim is introduced.

## Validation

- Both supplied real captures replay through the production decoder and Street code: **1,242 stationary frames and 3,806 road frames**, with no record/checksum errors. Raw speeds and raw replay trip totals match the original capture CSVs. The current-speed output is identical to v0.0.13.
- Throughout the owner-confirmed red-light interval **256.437524–308.938182 seconds**, all **526 samples** retain identical Street counters: **0 m and 0 s added**, including the candidate dwell. The original raw counters would add **18.55325 m and 27.8 moving seconds**. No other road interval is independently labelled stationary.
- The entire home stationary capture adds zero filtered trip distance and moving time; its original trip integration also adds zero because its valid speeds are below the integration threshold.
- Sanitizer tests cover dwell/hold suppression, raw sample and peak preservation, move-off, unconfirmed tentative movement, accurate creeping, invalid fixes, host/receiver gaps, reconnect/reset, duplicate/backward/invalid epochs, week rollover and 25 Hz. Existing decoder, Drag, Track, calendar and Python tests pass.
- Native simulator interaction tests verify the counters remain flat while viewing Street or Drag, then resume when moving. Drive/Trip current speed works in either display unit; Drag still shows the raw nonzero noise speed.
- **95 UI artboards** were compared with v0.0.13. Only Settings' version text and stationary Street Trip values change. UI source, Drag/Track engines/services, decoder and Mac capture sources are byte-for-byte unchanged.
- V1 and V2 firmware profiles build; native simulator tests pass. This patch is ready to flash; it has not been physically tested or flashed as part of this change.

Aggregate replay evidence is included in `releases/0.0.14/simulation/street/replay-report.json`. Private captures and coordinate-bearing replay CSVs remain local under `captures/analysis/2026-10-19/` and are excluded from the release ZIP. Run `tools/street-replay` (built as `.cache/host/street-replay` by `tools/test.sh`) against an LPR file to export raw and Street counters side by side.
