Skip to content

4.2.0 release review: Medium fixes - #451

Merged
TheAngryRaven merged 8 commits into
BETAfrom
claude/project-thread-8611jc-medium
Oct 3, 2026
Merged

TheAngryRaven merged 8 commits into
BETAfrom
claude/project-thread-8611jc-medium

Conversation

@TheAngryRaven

Copy link
Copy Markdown
Owner

Requested by Dove · project thread

Summary

Fixes all ten Medium findings from the 4.2.0 release review of #423. The High fixes are in #450, and the Low fixes come in a separate PR.

Before:

  • Opening a drag log after a circuit session kept the circuit's course selected, so a drag run could overwrite that course's lap snapshot.
  • Incomplete drag runs still counted as "fastest" in several places.
  • Overlay gauges kept the MPH range after switching to KPH.
  • A native video copy that finished after you switched sessions could attach to the wrong session.
  • In the Android app, offline readiness said "not ready" forever.
  • Deleting a session left its stored native video behind.
  • Updated sample logs and logger photos never reached devices that had already cached them.

After:

  • Drag loads clear the course selection, and snapshots are disabled for drag sessions.
  • Every fastest-lap pick uses fastestRankedLap.
  • Gauge ranges are re-computed when the data sources change.
  • A late video copy is dropped if the session has changed since it started.
  • The Android app shows offline readiness as handled by the app.
  • Deleting a session also deletes its native video.
  • Deferred offline assets carry a content revision and are re-fetched when it changes.

How:

  • A1: applyCourselessLaps in useDataLoader is shared by the drag and waypoint paths. A pure snapshotEligible() gates the snapshot logic in useLapSnapshots (plan 0022).
  • A2: fastestRankedLap is now used in the overlay renderer, lapSnapshot, OverlaysMenu, ExternalRefBar, TrackEditor and useDataLoader (plans 0022 and 0023).
  • B2: memoRange also keys on the dataSources identity (plan 0023).
  • B3: a new lib/latestGate.ts load token in useVideoSync (plan 0024).
  • B4: a new "native" readiness state, with an i18n key in all 7 locales (plan 0027).
  • B5: fileStorage.deleteFile cascades to deleteNativeStoredVideo (plan 0024).
  • PERF-1: offline-assets.json is now {url, revision} with a SHA-256 prefix. Warmup re-fetches stale or untagged entries and prunes files the build no longer ships (plan 0027).
  • T1: 17 Vitest cases for nativeVideoExport.ts.
  • DOC-3: src/assets/fonts/OFL.txt (SIL OFL 1.1, Archivo copyright), linked from the README credit.
  • DOC-4: the native video bridge, native-storage plugin, pwaInstall and persistentStorage are documented in CLAUDE.md, docs/subsystems.md and src/plugins/README.md.

The CHANGELOG gets Fixed bullets appended to the 4.2.0 list.

Type of Change

  • Bug fix
  • Documentation

Checklist

  • bun run lint passes
  • bun run typecheck passes
  • bun run test:run passes (3233 tests)
  • bun run build succeeds
  • Feature works offline
  • Docs updated where relevant (README.md, CLAUDE.md, CHANGELOG.md)

Notes for Reviewers

🤖 Generated with Claude Code

https://claude.ai/code/session_01NZ3Pt89yubdPtYn5Wc8fjW


Generated by Claude Code

claude added 8 commits October 2, 2026 00:58
A drag (or waypoint) load kept the previous file's course selection, so
canSnapshot stayed live and a 10-second drag run could replace that
course's real snapshot (then cloud-sync it). Course-less pre-application
now goes through applyCourselessLaps, which clears the selection, and
useLapSnapshots refuses drag sessions outright (snapshotEligible).

Every remaining bare min-reduce "fastest" pick (overlay best-lap, the
Overlays menu and external-ref trophies, lapSnapshot.fastestLap, the
generated course outline, useDataLoader's own helper) now goes through
fastestRankedLap so an incomplete run's data window never ranks.

The overlay range memo keyed only on the session arrays, but the data
source defs close over the unit toggles; include their identity so a
MPH/KPH or metric switch re-ranges the gauges (plan 0023).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NZ3Pt89yubdPtYn5Wc8fjW
loadRecording's background storeNativeVideo copy (and the async
tryLoadNativeStored lookup) set nativeStoredKey whenever it resolved, so
a copy started for session A that landed after switching to session B
attached A's key to B — and VideoPlayer then exported A's footage under
B's overlays. A small latest-wins gate (lib/latestGate) is invalidated on
every session/video change; stale results are dropped.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NZ3Pt89yubdPtYn5Wc8fjW
useOfflineReadiness only checked "serviceWorker" in navigator, which
Android's WebView exposes even though the native shell never registers
a worker (main.tsx), so Settings read "not ready" forever. A new
"native" readiness state is checked first via isNativeApp(); the row
shows it as done with no download button, and the hook skips the
deferred-asset counting there. i18n key added in every locale.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NZ3Pt89yubdPtYn5Wc8fjW
deleteNativeStoredVideo had no callers, so every session deleted in the
native app orphaned its stored video (gigabytes) in app data, and the
function was dead code. fileStorage.deleteFile already cascades the
session's per-file weather cache; it now drops the native copy the same
best-effort way, covering both the file manager and cloud-sync's
remove-local path.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NZ3Pt89yubdPtYn5Wc8fjW
Moving samples/ and loggers/ out of the precache also moved them out of
Workbox's per-file revisioning, and their runtime route is CacheFirst
with no expiry, so an updated sample log or logger photo never reached
a device that had already cached it. offline-assets.json now carries a
content hash per file; the warm-up stamps each stored response with it
(X-Asset-Revision, fetched with cache: reload), treats a mismatched or
unstamped entry as missing, and prunes paths the build no longer ships
(never against an empty manifest). The readiness count uses the same
check. Plan 0027 and CLAUDE.md updated.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NZ3Pt89yubdPtYn5Wc8fjW
nativeVideoExport.ts carried the IPC sequencing, the stale stored-key
retry and the fallback-vs-error classifier behind a 4.2.0 Fixed entry
with no tests (release review T1). Pins: declines (web, multi-chunk,
no dimensions), the begin-failure classifier as it stands today
(unsupported:/unknown/not found/not allowed fall back; anything else
reports), chunked upload -> run -> collect/save -> dispose order, the
quality mapping, 15 Hz overlay layers, mid-job error + dispose, cancel,
and the stored-source path including the retry without the key.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NZ3Pt89yubdPtYn5Wc8fjW
src/assets/fonts/ carries the two Archivo woff2 files but not their
licence; OFL 1.1 condition 2 requires the copyright notice and licence
to travel with redistributed copies. Add OFL.txt (Archivo's copyright
line + the verbatim OFL 1.1 text) next to the fonts and point the
README credit at it. Credits already list Archivo in both places.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NZ3Pt89yubdPtYn5Wc8fjW
CLAUDE.md, docs/subsystems.md and src/plugins/README.md had no mention
of the native-storage plugin, nativeVideoExport / nativeVideoStore /
nativeBytes, persistentStorage or pwaInstall (release review DOC-4,
Rule 5). Adds them to the architecture map and first-party plugin list,
a subsystems section for the native video bridge and one for offline
durability, and the platform-gated plugin example. Plans 0022 and 0024
record this branch's review fixes (course-less selection clearing,
range memo keyed on data sources, latest-wins key gate, delete cascade).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NZ3Pt89yubdPtYn5Wc8fjW
@TheAngryRaven TheAngryRaven self-assigned this Oct 2, 2026
@supabase

supabase Bot commented Oct 2, 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

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 8823ec1 Commit Preview URL

Branch Preview URL
Oct 02 2026, 01:10 AM

@github-actions

github-actions Bot commented Oct 2, 2026

Copy link
Copy Markdown

Coverage Summary

Lines: 62.58% (9111/14557) · Statements: 61.61% · Functions: 58.43% · Branches: 58.97%

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 93.33% 100% 79.09%
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 12.9% 20% 12.12%
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 1.53% 3.84% 5.79%
src/hooks/useNativeFirmwareUpdate.ts 0% 0% 0%
src/hooks/useNoteManager.ts 0% 0% 0%
src/hooks/useOfflineReadiness.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/analytics.ts 94.87% 100% 96.59%
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 97.87% 94.44% 94.69%
src/lib/ble/dfu/firmwareUpdateError.ts 100% 100% 100%
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.62% 88% 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/trackOpcodes.ts 100% 100% 100%
src/lib/ble/trackSync.ts 89.89% 90.9% 72.72%
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 57.69% 50% 58.33%
src/lib/courseDetection.ts 97.34% 100% 82.22%
src/lib/courseLineStyle.ts 100% 100% 100%
src/lib/courseSectors.ts 100% 100% 94.73%
src/lib/datalogParser.ts 87.01% 100% 81.94%
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/deviceCourseOverrides.ts 100% 100% 97.29%
src/lib/deviceCoursePicker.ts 100% 100% 100%
src/lib/deviceCourseSelection.ts 100% 100% 100%
src/lib/deviceGeneratedNames.ts 100% 100% 100%
src/lib/deviceSettingsSchema.ts 97.87% 100% 97.4%
src/lib/deviceSyncFetch.ts 100% 100% 100%
src/lib/deviceSyncNames.ts 100% 100% 100%
src/lib/deviceSyncOps.ts 100% 100% 93.33%
src/lib/deviceSyncPlan.ts 100% 100% 100%
src/lib/deviceSyncRunner.ts 95.65% 100% 90%
src/lib/deviceSyncWizard.ts 100% 100% 70.96%
src/lib/deviceTimezones.ts 89.28% 92.85% 90.9%
src/lib/deviceTrackBudget.ts 100% 100% 100%
src/lib/deviceTrackSync.ts 100% 100% 96.4%
src/lib/doveParser.ts 89.6% 72.72% 77.27%
src/lib/dovexParser.ts 88.31% 100% 82.85%
src/lib/dragRunDetection.ts 100% 100% 92.2%
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.97% 78.12% 72.22%
src/lib/firmwareUpdateReminder.ts 100% 100% 100%
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/gopro/goproImport.ts 100% 100% 87.5%
src/lib/gopro/goproTelemetry.ts 100% 100% 92.59%
src/lib/gopro/gpmf.ts 99.09% 100% 88.46%
src/lib/gopro/mp4Boxes.ts 94.07% 100% 77%
src/lib/gopro/testFixtures.ts 99.01% 100% 95.55%
src/lib/gopro/videoHandoff.ts 100% 100% 100%
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/insta360/ipc.ts 0% 0% 0%
src/lib/insta360/nativePlayer.ts 90.52% 82.14% 79.41%
src/lib/insta360/playerClock.ts 100% 100% 90%
src/lib/insta360/pose.ts 100% 100% 100%
src/lib/insta360/types.ts 100% 100% 100%
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 96.31% 100% 91.09%
src/lib/lapDelta.ts 99.2% 100% 85.07%
src/lib/lapOverlays.ts 100% 100% 86%
src/lib/lapSnapshot.ts 100% 100% 86.36%
src/lib/lapSnapshotStorage.ts 100% 83.33% 100%
src/lib/latestGate.ts 100% 100% 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/bleDetails.ts 11.11% 11.11% 100%
src/lib/loggers/doveslogger/dovesloggerConnection.ts 75% 73.33% 100%
src/lib/loggers/doveslogger/firmwareInfo.ts 100% 100% 100%
src/lib/loggers/doveslogger/ipc.ts 100% 91.66% 85.71%
src/lib/loggers/downloadFlow.ts 100% 100% 100%
src/lib/loggers/errors.ts 100% 100% 100%
src/lib/loggers/fileNaming.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/native/owner.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/nativeBytes.ts 89.47% 100% 62.5%
src/lib/nativeVideoExport.ts 100% 70% 87.09%
src/lib/nativeVideoStore.ts 54.54% 75% 45.83%
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/offlineReadiness.ts 100% 100% 100%
src/lib/offlineWarmup.ts 69.09% 66.66% 65.62%
src/lib/overlayCanvasRenderer.ts 63.28% 71.42% 49.75%
src/lib/parseReport.ts 69.56% 87.5% 74.35%
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/persistentStorage.ts 100% 100% 90.9%
src/lib/platform.ts 100% 88.88% 93.1%
src/lib/profanity.ts 100% 100% 75%
src/lib/pwaInstall.ts 75% 80% 79.16%
src/lib/referenceUtils.ts 100% 100% 90.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.69% 100% 75.91%
src/lib/setupRevision.ts 100% 100% 95.65%
src/lib/setupRevisionStorage.ts 92.45% 79.16% 83.33%
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/sprintCourse.ts 100% 100% 92.3%
src/lib/submittedTracksStorage.ts 0% 0% 0%
src/lib/supportTrackData.ts 100% 100% 75%
src/lib/templateEdit.ts 97.82% 88.88% 86.95%
src/lib/templateStorage.ts 93.54% 69.23% 100%
src/lib/trackStorage.ts 15.57% 26.78% 17.77%
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% 91.66%
src/plugins/cloud-sync/syncEngine.ts 99.1% 91.3% 81.63%
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/native-storage/deviceVideos.ts 100% 100% 100%
src/plugins/native-storage/DeviceVideosPanel.tsx 0% 0% 0%
src/plugins/native-storage/index.ts 0% 0% 0%
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 100% 100% 100%

@TheAngryRaven TheAngryRaven mentioned this pull request Oct 2, 2026
9 tasks done
@TheAngryRaven
TheAngryRaven merged commit 376b752 into BETA Oct 3, 2026
7 checks passed
TheAngryRaven pushed a commit that referenced this pull request Oct 3, 2026
Resolves the conflicts left by #450 and #451 landing first. CHANGELOG keeps
both Fixed lists. useDataLoader tests keep the load-precedence tests and the
course-clearing ones. countCachedAssets (plan 0027) now takes a predicate, so
the readiness hook keeps the revision-aware isDeferredAssetCached check from
#451 while the counting stays in the tested lib.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NZ3Pt89yubdPtYn5Wc8fjW
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