# Lappy v0.4.0

Recovery and sustained-use improvements for V2 Rev1.1.

- Custom recording stages an incremental recovery checkpoint every two seconds after Start, plus lifecycle markers. Successful SD writes are acknowledged on screen. A reboot restores a partial recording stopped, ready for review/resume/discard. A completed route remains recoverable until its draft file is saved. Checkpoints bound normal loss to the latest acknowledged write; a stalled or failed card can delay saving.
- Every completed or invalid Track attempt enters a CRC-framed permanent result journal. The on-device list remains bounded to 32 entries. Export all entries with `python3 tools/inspect_track_journal.py PATH_TO_TRACK_DIRECTORY --output results.jsonl`. Valid records preceding a torn tail remain readable. A full pending queue disables rearming and stops further timing before reserved capacity is exhausted.
- Recording time refreshes at 100 ms without rebuilding its widget tree. This refresh interval does not round timed results: timing continues to use receiver timestamps and interpolated gate crossings, preserving fractional milliseconds internally. The screen is not a measure of physical timing accuracy.
- Course/reference and compact result state use alternating CRC-verified generations. Ordinary runs update the small result index instead of rewriting the whole course and reference. Idle ARM/DISARM no longer writes those files.
- Route validation runs on the storage worker. Cached map geometry, retained header labels, nonblocking recorder status, and queued STOP/CANCEL reduce UI lock waits. STOP/CANCEL remain available during GPS loss and partial recording.
- Raw capture drains in batches, reserves queue capacity for important events, and rotates at 8 MiB into independently readable segments. Optional USB forwarding uses its own bounded queue; USB backpressure cannot hold the SD worker.
- The shutdown worker reserves its stack at boot and is reused. Saving no longer depends on finding a new contiguous stack in fragmented internal RAM at the end of a session. Shutdown logging copies only the fields it needs.
- Diagnostics include receiver timestamp cadence, decoder/storage/settings/PB task stack margins, pending journal entries, checkpoint age, slow SD operations and dropped optional USB output. SD BUSY and checkpoint status expose delayed storage.

Track retains five-satellite acceptance with the existing 3D-fix, horizontal/speed accuracy, continuity, latency and finite directional gate checks. Split adjustment remains 50 m with no fine option. Drag timing, pairing protocol, bootloader, partition table and factory geometry are unchanged.

Dragy Pro supports 25 Hz, but this release does not send an unverified rate-selection command. Lappy processes the rate supplied by the receiver; diagnostics distinguish 40 ms (25 Hz) and 100 ms (10 Hz) GPS epochs. Live rate negotiation remains unverified because Dragy was unavailable for this update.

Validation covers sanitizer tests, CRC/torn-write recovery, a 10,000-result archive, incremental recovery rotation, full-size course/reference saves, an accelerated 12-hour 25 Hz replay, October 27 private recording regressions, native LVGL interactions and the V2 build. See the matching hardware report for installed-device checks. Accelerated replay does not substitute for a physical 12-hour soak or road accuracy testing.
