Skip to content

Release v3.3.0 - #373

Merged
TheAngryRaven merged 15 commits into
mainfrom
BETA
Jul 31, 2026
Merged

Release v3.3.0#373
TheAngryRaven merged 15 commits into
mainfrom
BETA

Conversation

@TheAngryRaven

@TheAngryRaven TheAngryRaven commented Jul 31, 2026

Copy link
Copy Markdown
Owner

v3.3.0 — 2026-07-31

This one started with a bug report that looked unbelievable: an AiM Solo 2 rider sent us a session showing a 735 mph top speed and a 134-mile race line shooting off into the desert — from a 16-minute club race. The GPS looked destroyed. It wasn't.

Digging into the raw file, every single GPS fix turned out to be healthy — centimeter-level accuracy, 8–16 satellites, all of it right on track. What was broken was the clock: newer Solo 2 firmware writes its GPS records in a way that confused the decoder into misreading thousands of tiny timestamp wiggles as 16-bit clock rollovers, stretching a 16-minute race into a "64-hour" timeline. Every downstream step then resampled real data against that scrambled clock and hallucinated the rest — the teleporting race line, the impossible speeds, even a fake "99% packets dropped" warning.

The fix goes all the way down. The decoder now rebuilds the timeline from the GPS receiver's own clock (a field the logger firmware can't corrupt), and the affected session decodes identically to AiM's RaceStudio — same lap times, to the millisecond. On top of that, LapWing now sanity-checks every file format's GPS rows on load, so provable garbage never reaches your data again. And because our users are the best: the riders and drivers who reported these bugs shared their real session files with us, so those full sessions now live in our test suite and every release is checked against them.

Fixed

  • Solo 2 .xrk logs with corrupt GPS timecodes now decode correctly. Newer Solo 2 firmware writes GPS records with jittered logger timestamps and every epoch duplicated (two position solutions ~4 m apart); the bundled libxrk decoder misread the jitter as thousands of 16-bit clock rollovers, stretching a 16-minute race into "64 hours", weaving a ~4 m square-wave through the track line, and fabricating positions miles off track, 735 mph speeds, and a false "99% packets dropped" reading — while the file's actual GPS data is healthy and centimeter-smooth. The decoder now rebuilds the GPS timeline from the receiver's own clock and matches RaceStudio's output exactly (verified: same lap times; 19 mi session distance vs the previous 95). Healthy files decode byte-identically.
  • VBO files without a sats column no longer render as a straight line. A user-reported .vbo whose data rows start with time (no leading satellite count) had every channel read one column off — latitude got the longitude column, longitude got velocity — producing a straight speed-driven streak. The parser now verifies the column mapping against the data shape and realigns before parsing.

Added

  • Bad GPS rows are dropped on load, for every file format. The datalog is rebuilt into a clean dataset as it loads: any row with a negative satellite count, accuracy, or DOP (values that can never go negative — that row is provably garbage), a DOP above 10, or a position implying faster than ~335 mph from the previous kept row is skipped before anything downstream sees it — so a poor-signal session no longer corrupts the race line, lap detection, distance, or speed stats. Dropped rows are counted on the map's rejected-rows badge (bad-fix / teleport).
  • Real GPS heading for .xrk imports. The decoder now exports the receiver's course over ground (derived from its velocity vector), so the map's direction arrow no longer falls back to noisy position-difference bearings that pointed in random directions at low speed.
  • AiM quality channels on the charts. AiM CSV imports now expose H Accuracy (converted to meters) and pDOP/HDOP as channels, matching what .xrk imports already carried.
  • Supported Files refresh. Every listed format is now backed by automated parser tests — several verified end-to-end against full real user-shared sessions committed as regression fixtures (RaceBox and VBOX .vbo, an Alfano 6 ADA export, a RaceStudio 3 CSV, and the corrupt-timecode Solo 2 .xrk) — so the "Experimental" labels are gone. Racelogic VBO and MoTeC binary move up into the featured group, and the legacy Dove CSV entry is retired from the list (the format still imports fine — it just doesn't need advertising).

Changed

  • AiM .xrk quality channels are never fabricated. Satellite counts, position/speed accuracy, and DOP now appear on a row only when the logger actually recorded them at that row's timestamp — no interpolation (which invented impossible values like "-1597 satellites" in tooltips) and no filling (which dressed garbage rows up with a neighbor's healthy readings).

Full changelog: v3.2.0...main

claude and others added 11 commits July 30, 2026 16:44
A user-reported .vbo rendered as a straight line: its data rows start
with time (no leading satellite count), so the whole column mapping sat
one slot right of the data — sats read packed HHMMSS time (shown as a
113457 "satellite count"), time read latitude (near-constant, collapsing
the session duration), lat read longitude, lon read velocity (the
straight speed-driven streak), and velocity read heading (~350 km/h
phantom top speed).

Verify the resolved mapping against the data shape before parsing: a
genuine sats column is a small integer and never a packed HHMMSS.SS
token, so when the sats column carries packed time and the time column
does not, drop the phantom sats mapping and pull everything one slot
left. Covers both a [column names] line that over-declares sats and the
positional fallback's sats-first assumption.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MpnVWWkfwqypBMzvVs1qbs
…eed filtering

A Solo2 user's poor-signal .xrk session (95-99% packet loss) rendered a
134-mile race line and a 735 mph top speed: errant fixes survived parsing and
corrupted every downstream feature, and interpolated quality channels showed
impossible values (-1597 satellites) in tooltips.

Why filtering lives in one place: a new post-parse filterGpsQuality() runs in
the datalog router after normalizeChannels(), so every format is covered at
the single point all features draw from.

- Always-on quality gate: drops provably-invalid fixes (negative satellites/
  accuracy, DOP <= 0) and weak fixes (sats < 4, accuracy > 20 m, DOP > 10),
  per-signal opt-in so files without quality channels are untouched, with a
  fallback tier so an all-weak (marginal, not corrupt) session still loads.
- "Hardcore data filtering" setting (default off, kart-tuned, car users
  exist): poison-proof teleport gate + speed *repair* - errant reported
  speeds are recomputed from neighboring positions instead of dropping
  otherwise-healthy packets. Toggling reparses the open session.
- XRK quality channels now forward-fill instead of interpolating (the source
  of the fabricated tooltip values, and a mask over garbage fixes).
- AiM CSV: ad-hoc 100 m/s teleport filter migrated into the hardcore pass;
  PosAccuracy (as H Accuracy, meters) and pDOP/HDOP now exported as channels.
- New lowQuality rejection category + repairedSpeeds surfaced on the existing
  map badge; i18n keys seeded manually (no ANTHROPIC_API_KEY in this env).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011gFSnXfjV4g1kcjAQGbjd6
…ad rows only

Maintainer review: the first cut over-reached into reprocessing (weak-fix
thresholds, a hardcore setting with teleport gating, neighbor-based speed
repair). Step 1 is just: as rows load, drop the provably-garbage ones and
rebuild a clean dataset - decide about further filtering after the spikes
are gone.

- filterGpsQuality is now a single pass: drop rows with negative satellite
  counts / accuracy / DOP (those can never go negative) or DOP > 10; files
  without quality channels untouched; if every row would be condemned the
  file is shown raw instead of refused.
- Reverted: hardcoreGpsFiltering setting + SettingsModal section + reparse
  effect, speed repair (repairedSpeeds), createTeleportGate, weak-fix
  thresholds, the settings-read fallback in the router.
- Restored: the AiM CSV always-on 100 m/s implied-speed teleport filter.
- Kept: XRK quality channels forward-fill (interpolation smeared the
  negative blips this cleanup looks for), AiM quality-channel exports,
  the bad-fix badge counter, per-signal channel key lists.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011gFSnXfjV4g1kcjAQGbjd6
…umps

The rebuilt dataset still contained the Solo2 spike: its garbage rows carried
NO recorded quality data, and the resampler was filling those rows with the
last healthy packet's readings - so a corrupt fix showed "15 sats / pDOP 1.2"
and sailed through the cleanup. Two fixes:

- xrkResample: quality channels resample by exact timecode match only (+-5ms).
  A row shows a satellites/DOP/accuracy value ONLY when the logger recorded
  one at that row's timestamp; otherwise it is absent. No interpolation
  (which invented "-1597 satellites"), no fill (which dressed garbage rows
  up as healthy).
- gpsQualityFilter: a row whose position implies moving faster than
  MAX_SPEED_MPS (150 m/s - the app-wide GPS-glitch bound, no ground vehicle
  reaches it) from the last kept row is skipped during the rebuild, counted
  as teleportation. This is the only proof available for corrupt fixes that
  carry no quality data at all. The reference advances only on kept rows and
  re-anchors after 50 consecutive rejections so a garbage first row can't
  condemn the file.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011gFSnXfjV4g1kcjAQGbjd6
With the reported file in hand, the "bad GPS data" theory collapsed: every
native GPS sample is healthy (all positions on track, 8-16 sats, pDOP <= 2.1,
accuracy <= 0.77m, speed <= 110mph). The corruption is the CLOCK: the wasm
decoder mis-unwraps a 16-bit ms counter across interleaved sample blocks,
stamping rows with spurious +-k*65536ms offsets, out-of-order blocks, and
duplicated timestamps - a 16-minute race spanning "64 hours". Resampling
against that non-monotonic clock EXTRAPOLATED other channels (unclamped
interpolation fraction), fabricating positions miles off track, 735mph
speeds, and the impossible quality values. The "99.4% pkts dropped" banner
was the same artifact.

- xrkResample: detect the fault per channel (time running backwards, or >=3
  deltas within 1s of an exact 65536 multiple - a real pit gap is nowhere
  near one), unfold the spurious multiples, stable-sort rows by true time,
  skip rows that don't advance the clock. Values never altered or invented.
- interpolateOnto: clamp the interpolation fraction to [0,1] - resampling
  must never extrapolate, whatever the input ordering.

Verified against the reported file: duration 64h -> 20min, zero samples off
track, zero jumps > 500m, max speed 110.2mph (= native max), monotonic time.
Healthy fixtures untouched (repair gate never fires).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011gFSnXfjV4g1kcjAQGbjd6
…ork)

Root fix for the corrupt-clock decode, replacing reliance on the TS-side
mitigation (which stays as a dormant safety net). The libxrk fork
(fix/solo2-gps-timecode-corruption, rev 16b7fc8) now:

- phase-unwraps logger timecodes with half-range hysteresis so block-seam
  jitter is no longer misread as thousands of 16-bit rollovers, and
- when timecodes run backwards, rebuilds the GPS timeline from the
  receiver's own clock (NAV-SOL itow, immune to the logger bug), keeping
  one record per epoch - affected files write every epoch twice (two
  solutions ~4m apart; mixing them wove a ~4m square-wave through the
  race line).

Pin xrk-wasm at the fork rev + rebuild committed wasm artifacts.

Verified with the reported Buttonwillow file end-to-end: 24,309 epochs /
972s / 18.96mi (7 laps), best lap 127.780s matching RaceStudio's 2:07.800,
zero off-track samples, 17 rows dropped total (was: "64 hours", 95mi,
735mph, thousands dropped). Healthy fixtures decode byte-identically; all
2,387 tests green with the new wasm.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011gFSnXfjV4g1kcjAQGbjd6
The map's direction arrow pointed in random directions on .xrk sessions:
no heading channel was exported, so mapMarker fell back to a bearing
derived from adjacent (noisy) positions - pure noise at low speed. The
receiver's own course over ground (from its velocity vector) was already
computed inside libxrk but never exposed.

Bump the libxrk fork rev (a8426db: heading field on GpsDecodeResult),
export "GPS Heading" from the wasm wrapper, rebuild the artifacts. The
existing GPS_ROLES mapping picks it up into GpsSample.heading with no
app-side changes. Verified on the reported Solo2 file: heading present
on every sample, mean deviation from direction of travel at race pace
0.95 degrees.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011gFSnXfjV4g1kcjAQGbjd6
…ring-sxjirh

plan 0014: repair broken Solo2 .xrk timecodes + GPS row cleanup (all formats)
…ng-5atcp5

Fix VBO parsing for files whose data rows lack the sats column
Coach plugin already on the production npm package on BETA
(@perchwerks/eye-in-the-sky 0.5.0) — no flip needed.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011gFSnXfjV4g1kcjAQGbjd6
@supabase

supabase Bot commented Jul 31, 2026

Copy link
Copy Markdown

This pull request has been ignored for the connected project tdxloldxzvnzdivdazzd because there are no changes detected in supabase directory. You can change this behaviour in Project Integrations Settings ↗︎.


Preview Branches by Supabase.
Learn more about Supabase Branching ↗︎.

@cloudflare-workers-and-pages

cloudflare-workers-and-pages Bot commented Jul 31, 2026

Copy link
Copy Markdown

Deploying with  Cloudflare Workers  Cloudflare Workers

The latest updates on your project. Learn more about integrating Git with Workers.

Status Name Latest Commit Preview URL Updated (UTC)
✅ Deployment successful!
View logs
lapwing a06962b Commit Preview URL

Branch Preview URL
Jul 31 2026, 04:59 AM

@github-actions

github-actions Bot commented Jul 31, 2026

Copy link
Copy Markdown

Coverage Summary

Lines: 57.08% (7059/12366) · Statements: 56.22% · Functions: 53.48% · Branches: 53.59%

Per-file coverage
File Lines Functions Branches
src/components/admin/supportAttachment.ts 0% 0% 0%
src/components/map/positionArrowMarker.ts 0% 0% 0%
src/components/video-overlays/dataSourceResolver.ts 85.07% 71.42% 80.82%
src/components/video-overlays/overlayUtils.ts 100% 100% 100%
src/components/video-overlays/registry.ts 100% 100% 100%
src/components/video-overlays/sectorUtils.ts 94.73% 100% 84.37%
src/components/video-overlays/themes.ts 100% 100% 100%
src/components/video-overlays/types.ts 100% 100% 100%
src/hooks/use-mobile.tsx 0% 0% 100%
src/hooks/use-toast.ts 0% 0% 0%
src/hooks/useAuth.ts 100% 100% 100%
src/hooks/useDataLoader.ts 14.11% 20% 17.02%
src/hooks/useDocumentHead.ts 0% 0% 0%
src/hooks/useEngineManager.ts 0% 0% 0%
src/hooks/useFileManager.ts 0% 0% 0%
src/hooks/useFirmwareUpdate.ts 0% 0% 0%
src/hooks/useKartManager.ts 100% 100% 100%
src/hooks/useLapManagement.ts 0% 0% 0%
src/hooks/useLapOverlays.ts 0% 0% 0%
src/hooks/useLapSnapshots.ts 0% 0% 0%
src/hooks/useNativeFirmwareUpdate.ts 0% 0% 0%
src/hooks/useNoteManager.ts 0% 0% 0%
src/hooks/useOnlineStatus.ts 0% 0% 0%
src/hooks/usePlayback.ts 0% 0% 0%
src/hooks/useReferenceLap.ts 0% 0% 0%
src/hooks/useSessionData.ts 0% 0% 0%
src/hooks/useSessionMetadata.ts 0% 0% 0%
src/hooks/useSettings.ts 0% 0% 0%
src/hooks/useSetupManager.ts 0% 0% 100%
src/hooks/useSimPlayback.ts 0% 0% 0%
src/hooks/useStripePrices.ts 0% 0% 0%
src/hooks/useSubscription.ts 0% 0% 0%
src/hooks/useTemplateFields.ts 0% 0% 0%
src/hooks/useTemplateManager.ts 0% 0% 0%
src/hooks/useTrackEditorForm.ts 0% 0% 0%
src/hooks/useVehicleManager.ts 0% 0% 100%
src/hooks/useVideoSync.ts 0% 0% 0%
src/hooks/useWakeLock.ts 0% 0% 0%
src/hooks/useWaybackImagery.ts 0% 0% 0%
src/lib/test/idb.ts 100% 100% 100%
src/lib/aimParser.ts 96.21% 100% 83.05%
src/lib/alfanoParser.ts 93.44% 100% 75.66%
src/lib/appActivity.ts 0% 0% 100%
src/lib/billing.ts 97.36% 100% 98.21%
src/lib/billingClient.ts 0% 0% 0%
src/lib/ble/test/mockBle.ts 96% 90% 50%
src/lib/ble/battery.ts 93.33% 100% 87.5%
src/lib/ble/connection.ts 0% 0% 0%
src/lib/ble/dfu/dfuPackage.ts 96.66% 100% 81.25%
src/lib/ble/dfu/dfuTypes.ts 100% 100% 100%
src/lib/ble/dfu/firmwareImage.ts 100% 100% 100%
src/lib/ble/dfu/firmwareManifest.ts 96.92% 92.85% 93.18%
src/lib/ble/dfu/index.ts 100% 100% 100%
src/lib/ble/dfu/version.ts 96.77% 100% 83.33%
src/lib/ble/fileTransfer.ts 90.69% 95% 72.91%
src/lib/ble/firmwareCrc.ts 100% 100% 100%
src/lib/ble/firmwareUpload.ts 90.4% 87.5% 84.31%
src/lib/ble/format.ts 100% 100% 100%
src/lib/ble/index.ts 100% 100% 100%
src/lib/ble/internal.ts 100% 100% 50%
src/lib/ble/settings.ts 93.6% 100% 85.29%
src/lib/ble/trackSync.ts 89.69% 90.9% 70.96%
src/lib/ble/types.ts 100% 100% 100%
src/lib/bleDatalogger.ts 100% 100% 100%
src/lib/blogPosts.ts 100% 100% 97.22%
src/lib/brakingZones.ts 97.14% 100% 86.11%
src/lib/browserCompat.ts 0% 0% 0%
src/lib/buildInfo.ts 100% 100% 100%
src/lib/canvas2d.ts 100% 100% 91.66%
src/lib/channels.ts 100% 100% 84.61%
src/lib/chartAxis.ts 98% 100% 82.92%
src/lib/chartColors.ts 100% 100% 100%
src/lib/chartUtils.ts 100% 100% 97.05%
src/lib/contactMessage.ts 47.61% 50% 43.75%
src/lib/courseDetection.ts 97.16% 100% 80.23%
src/lib/courseSectors.ts 100% 100% 94.87%
src/lib/datalogParser.ts 83.56% 80% 81.81%
src/lib/db/index.ts 0% 0% 0%
src/lib/db/submissionMaterialize.ts 100% 100% 97.5%
src/lib/db/supabaseAdapter.ts 0% 0% 0%
src/lib/db/types.ts 100% 100% 100%
src/lib/dbUtils.ts 76.23% 80% 17.2%
src/lib/debugConsole.ts 57.74% 61.11% 47.72%
src/lib/deviceSettingsSchema.ts 93.33% 100% 96.42%
src/lib/deviceTrackSync.ts 100% 100% 100%
src/lib/doveParser.ts 89.6% 72.72% 77.27%
src/lib/dovexParser.ts 87.14% 100% 80.95%
src/lib/driverProfileGroups.ts 100% 100% 83.33%
src/lib/emailValidation.ts 100% 100% 100%
src/lib/engineStorage.ts 100% 75% 100%
src/lib/engineUtils.ts 100% 100% 91.66%
src/lib/fieldResolver.ts 100% 100% 83.33%
src/lib/fileBrowserTree.ts 98.87% 97.5% 89.36%
src/lib/fileLoadingState.ts 100% 100% 100%
src/lib/fileStorage.ts 82.79% 78.12% 72.22%
src/lib/fnv1a.ts 100% 100% 100%
src/lib/garageEvents.ts 100% 100% 100%
src/lib/gforceCalculation.ts 100% 100% 97.22%
src/lib/ggDiagram.ts 100% 100% 94.73%
src/lib/gps/customGps.ts 100% 100% 82.05%
src/lib/gps/dovepWriter.ts 100% 100% 92%
src/lib/gps/gpsFix.ts 100% 100% 100%
src/lib/gps/index.ts 100% 100% 100%
src/lib/gps/observationSample.ts 100% 100% 100%
src/lib/gps/realtimeTimer.ts 90.07% 100% 76.04%
src/lib/gps/sessionGate.ts 100% 100% 100%
src/lib/gpsQualityFilter.ts 100% 100% 96.77%
src/lib/graphPrefsStorage.ts 100% 100% 100%
src/lib/i18n/config.ts 100% 100% 100%
src/lib/i18n/format.ts 100% 100% 85.71%
src/lib/i18n/pluginLocales.ts 0% 0% 100%
src/lib/i18n/seedUtils.ts 100% 100% 90.47%
src/lib/imageCrop.ts 12.19% 10% 0%
src/lib/iracingParser.ts 91.93% 80% 76.47%
src/lib/kartStorage.ts 100% 75% 100%
src/lib/lapAlignment.ts 100% 80% 76.92%
src/lib/lapCalculation.ts 95.85% 100% 89.68%
src/lib/lapDelta.ts 99.2% 100% 85.07%
src/lib/lapOverlays.ts 100% 100% 86%
src/lib/lapSnapshot.ts 100% 100% 88.46%
src/lib/lapSnapshotStorage.ts 100% 83.33% 100%
src/lib/leaderboardBrowse.ts 100% 92.3% 80.76%
src/lib/leaderboardHandoff.ts 100% 100% 100%
src/lib/leaderboardSession.ts 97.67% 83.33% 67.85%
src/lib/leaderboardTypes.ts 100% 100% 100%
src/lib/logFileType.ts 100% 100% 100%
src/lib/loggers/alfano/alfanoConnection.ts 100% 100% 100%
src/lib/loggers/alfano/ipc.ts 100% 100% 100%
src/lib/loggers/doveslogger/dovesloggerConnection.ts 100% 100% 100%
src/lib/loggers/doveslogger/firmwareInfo.ts 100% 100% 100%
src/lib/loggers/doveslogger/ipc.ts 100% 100% 100%
src/lib/loggers/errors.ts 100% 100% 100%
src/lib/loggers/fledglingConnection.ts 100% 100% 100%
src/lib/loggers/index.ts 100% 100% 100%
src/lib/loggers/mychron/ipc.ts 100% 100% 100%
src/lib/loggers/mychron/mychronConnection.ts 100% 100% 100%
src/lib/loggers/native/ipc.ts 100% 100% 100%
src/lib/loggers/progress.ts 94.73% 100% 96.15%
src/lib/loggers/types.ts 100% 100% 100%
src/lib/mapMarker.ts 100% 100% 100%
src/lib/motecParser.ts 89.61% 81.48% 55.71%
src/lib/navBack.ts 100% 100% 71.42%
src/lib/nmeaParser.ts 85.62% 92.85% 71.22%
src/lib/noteStorage.ts 100% 80% 100%
src/lib/overlayCanvasRenderer.ts 0% 0% 0%
src/lib/parseReport.ts 68.18% 85.71% 72.22%
src/lib/parserUtils.ts 100% 100% 98.93%
src/lib/passwordStrength.ts 100% 100% 100%
src/lib/pendingCheckout.ts 58.82% 25% 100%
src/lib/platform.ts 100% 87.5% 91.3%
src/lib/profanity.ts 100% 100% 75%
src/lib/referenceUtils.ts 98.29% 100% 86.66%
src/lib/rssFeed.ts 0% 100% 100%
src/lib/sampleData.ts 100% 100% 100%
src/lib/satelliteImagery.ts 100% 100% 90%
src/lib/setupHistory.ts 94.17% 100% 72.51%
src/lib/setupRevision.ts 100% 100% 94.11%
src/lib/setupRevisionStorage.ts 84.48% 78.26% 36.84%
src/lib/setupStatus.ts 100% 100% 100%
src/lib/setupStorage.ts 81.35% 58.62% 100%
src/lib/shareSession.ts 100% 100% 100%
src/lib/sim/simClient.ts 0% 0% 0%
src/lib/sim/simPlayback.ts 100% 100% 97.22%
src/lib/sim/simSession.ts 100% 100% 100%
src/lib/speedBounds.ts 94.28% 66.66% 87.17%
src/lib/speedEvents.ts 86.56% 100% 76%
src/lib/speedHeatmap.ts 100% 100% 100%
src/lib/submittedTracksStorage.ts 0% 0% 0%
src/lib/templateEdit.ts 97.82% 88.88% 86.95%
src/lib/templateStorage.ts 93.54% 69.23% 100%
src/lib/trackStorage.ts 16.4% 28.3% 18.18%
src/lib/trackSubmission.ts 100% 100% 92.64%
src/lib/trackUtils.ts 100% 100% 97.05%
src/lib/ubxParser.ts 99% 100% 89.58%
src/lib/units.ts 100% 100% 100%
src/lib/updateFlow.ts 100% 100% 100%
src/lib/utils.ts 100% 100% 100%
src/lib/vboParser.ts 91.71% 100% 77.83%
src/lib/vehicleHistory.ts 97.29% 100% 80%
src/lib/vehicleStorage.ts 100% 75% 100%
src/lib/versionCheck.ts 19.44% 12.5% 44.73%
src/lib/videoExport.ts 0% 0% 0%
src/lib/videoExportTarget.ts 100% 100% 84.61%
src/lib/videoFileStorage.ts 100% 76% 61.11%
src/lib/videoPlaylist.ts 95.71% 100% 90%
src/lib/videoStorage.ts 100% 76.92% 77.77%
src/lib/videoTimeline.ts 100% 100% 100%
src/lib/wakeLock.ts 100% 80% 100%
src/lib/weatherCacheStorage.ts 100% 100% 100%
src/lib/weatherService.ts 23.8% 35.29% 25.89%
src/lib/xrk/xrkClient.ts 3.57% 0% 0%
src/lib/xrk/xrkConfig.ts 100% 100% 100%
src/lib/xrk/xrkImporter.ts 70% 75% 80%
src/lib/xrk/xrkMapping.ts 98.7% 100% 87.5%
src/lib/xrk/xrkResample.ts 100% 100% 94%
src/lib/xrk/xrkTypes.ts 100% 100% 100%
src/lib/xrk/xrkWorker.ts 0% 0% 0%
src/plugins/cloud-sync/accountDeletion.ts 100% 100% 100%
src/plugins/cloud-sync/accountExport.ts 0% 0% 0%
src/plugins/cloud-sync/accountImport.ts 13.51% 25% 26.08%
src/plugins/cloud-sync/activeUser.ts 100% 100% 100%
src/plugins/cloud-sync/autoSync.ts 0% 0% 0%
src/plugins/cloud-sync/cloudClient.ts 55% 25% 87.5%
src/plugins/cloud-sync/CloudLogsPanel.tsx 0% 0% 0%
src/plugins/cloud-sync/DataPrivacyPanel.tsx 0% 0% 0%
src/plugins/cloud-sync/exportManifest.ts 100% 100% 100%
src/plugins/cloud-sync/FileDeleteToggle.tsx 0% 0% 0%
src/plugins/cloud-sync/fileSync.ts 91.66% 85.71% 100%
src/plugins/cloud-sync/FileSyncToggle.tsx 0% 0% 0%
src/plugins/cloud-sync/index.ts 0% 0% 0%
src/plugins/cloud-sync/LapSnapshotsPanel.tsx 0% 0% 0%
src/plugins/cloud-sync/leaderboardClient.ts 8.92% 10.52% 1.56%
src/plugins/cloud-sync/leaderboardSubmission.ts 100% 100% 94.11%
src/plugins/cloud-sync/LeaderboardSubmitPanel.tsx 0% 0% 0%
src/plugins/cloud-sync/localUsage.ts 100% 100% 50%
src/plugins/cloud-sync/merge.ts 100% 100% 100%
src/plugins/cloud-sync/pendingSync.ts 100% 100% 100%
src/plugins/cloud-sync/postsClient.ts 0% 0% 0%
src/plugins/cloud-sync/profile.ts 61.53% 50% 63.33%
src/plugins/cloud-sync/publicProfile.ts 6.25% 28.57% 0%
src/plugins/cloud-sync/publicShare.ts 100% 100% 100%
src/plugins/cloud-sync/publicVehicleSync.ts 92.85% 100% 78.57%
src/plugins/cloud-sync/sessionShare.ts 92.15% 76.92% 91.66%
src/plugins/cloud-sync/setupRevisionTombstones.ts 100% 100% 83.33%
src/plugins/cloud-sync/ShareFileButton.tsx 0% 0% 0%
src/plugins/cloud-sync/ShareSessionDialog.tsx 0% 0% 0%
src/plugins/cloud-sync/shareState.ts 100% 100% 100%
src/plugins/cloud-sync/shareToken.ts 100% 100% 100%
src/plugins/cloud-sync/snapshotSync.ts 97.22% 87.5% 75%
src/plugins/cloud-sync/snapshotTombstones.ts 100% 100% 100%
src/plugins/cloud-sync/StoragePanel.tsx 0% 0% 0%
src/plugins/cloud-sync/storageTypes.ts 100% 100% 100%
src/plugins/cloud-sync/storeAccessors.ts 100% 100% 90%
src/plugins/cloud-sync/syncEngine.ts 99.05% 91.3% 80%
src/plugins/cloud-sync/syncStores.ts 100% 100% 100%
src/plugins/cloud-sync/trackAutoSubmit.ts 100% 100% 78.57%
src/plugins/fileSources.ts 0% 0% 100%
src/plugins/index.ts 0% 0% 0%
src/plugins/mounts.ts 71.42% 75% 100%
src/plugins/panels.ts 75% 83.33% 100%
src/plugins/PluginMount.tsx 0% 0% 0%
src/plugins/PluginPanelHost.tsx 0% 0% 0%
src/plugins/registry.ts 77.27% 50% 100%
src/plugins/storage.ts 90.32% 70.83% 66.66%
src/plugins/tools/i18n.ts 0% 0% 100%
src/plugins/tools/index.ts 0% 0% 100%
src/plugins/tools/laptimer/lapTimerSession.ts 89.06% 80% 84.37%
src/plugins/tools/laptimer/LapTimerTool.tsx 0% 0% 0%
src/plugins/tools/laptimer/useLapTimer.ts 0% 0% 0%
src/plugins/tools/pill-alignment/CalibrationPanel.tsx 0% 0% 0%
src/plugins/tools/pill-alignment/envelope.ts 100% 100% 90.9%
src/plugins/tools/pill-alignment/EnvelopePlot.tsx 0% 0% 0%
src/plugins/tools/pill-alignment/FindSetupPanel.tsx 0% 0% 0%
src/plugins/tools/pill-alignment/inverse.ts 95.83% 100% 88.52%
src/plugins/tools/pill-alignment/model.ts 100% 100% 92.85%
src/plugins/tools/pill-alignment/OverheadToeView.tsx 0% 0% 100%
src/plugins/tools/pill-alignment/PillAlignmentTool.tsx 0% 0% 0%
src/plugins/tools/pill-alignment/PillDial.tsx 0% 0% 0%
src/plugins/tools/pill-alignment/profiles.ts 100% 100% 84.61%
src/plugins/tools/pill-alignment/toe.ts 100% 100% 100%
src/plugins/tools/seat-position/model.ts 100% 100% 60%
src/plugins/tools/seat-position/SeatDiagram.tsx 0% 0% 0%
src/plugins/tools/seat-position/SeatPositionTool.tsx 0% 0% 0%
src/plugins/tools/shared/NumRow.tsx 0% 0% 0%
src/plugins/tools/toolList.ts 0% 0% 100%
src/plugins/tools/ToolsLandingTile.tsx 0% 0% 0%
src/plugins/tools/ToolsPanel.tsx 0% 0% 0%
src/plugins/types.ts 100% 100% 100%
src/types/racing.ts 0% 0% 0%

claude and others added 4 commits July 31, 2026 02:04
Racelogic VBO, Alfano 6, and AiM CSV get a purple "Validated" badge in
Supported Files (Alfano + AiM CSV shed "Experimental"), backed by full
real user-shared sessions committed as fixtures with end-to-end tests:

- racebox-lignano.vbo: RaceBox export whose data rows lack the sats
  column - the #368 column-realignment bug, proven fixed on the real file
- vbox-modena.vbo: classic layout, sats column first
- alfano6-ada-martensville.csv: Alfano 6 ADA "classic Excel" export -
  locale grouping separators, Absolute Time, Lat./Lon. layout (this is an
  Alfano 6 file, not MyChron CSV; AiM CSV validation rests on the existing
  real racestudio3-aim.csv fixture)
- solo2-buttonwillow.xrk: the corrupt-timecode Solo 2 session behind the
  v3.3.0 GPS fix, now asserting RaceStudio-identical decode (24,309
  epochs / 971.7s / all positions on track / max 110mph / heading on
  every sample)

All fixtures shared by their owners for validation use.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011gFSnXfjV4g1kcjAQGbjd6
…all tested formats

- Remove the Dove CSV entry from the Supported Files dialog (legacy
  first-party format; still imports, just not advertised) - component ids
  and all seven locales.
- The Validated badge now marks automated parser test coverage and applies
  to every listed format (primary cards included), so its absence isn't
  read as a warning. A future format stays unbadged until its Vitest
  suite lands.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011gFSnXfjV4g1kcjAQGbjd6
…y featured

Every listed format now has automated parser test coverage, so per-format
status badges (Experimental / Validated) say nothing and are gone. VBO
swaps into NMEA's featured slot and MoTeC binary moves up under iRacing;
NMEA drops to the secondary group. Card copy relocated across all seven
locales to match the new primary/secondary key paths.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011gFSnXfjV4g1kcjAQGbjd6
@TheAngryRaven
TheAngryRaven merged commit 4ec343d into main Jul 31, 2026
11 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants