Skip to content

4.2.0 release review: Low fixes - #452

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

TheAngryRaven merged 12 commits into
BETAfrom
claude/project-thread-8611jc-low

Conversation

@TheAngryRaven

Copy link
Copy Markdown
Owner

Requested by Dove · project thread

Summary

Fixes all 16 Low findings from the 4.2.0 release review of #423. The High fixes are in #450 and the Medium fixes in #451.

Before:

  • A failed setup-history load stayed on "Loading…", and a failed rollback or duplicate did nothing visible.
  • One malformed GoPro GPMF payload aborted the whole import.
  • A hostile MP4 sample count could exhaust the tab's memory.
  • A late close from an old Insta360 player could kill the new stream.
  • Native-only and GoPro code sat in the eager main chunk.
  • The landing page and README promised .360 GoPro import without the caveat that it's untested.

After:

  • Setup history shows an error with Retry, and rollback or duplicate failures show a toast.
  • Bad GPMF payloads are skipped.
  • stsz counts are capped against the file size.
  • Only the player that opened the stream can close it.
  • The main chunk is 16.6 kB smaller (5.2 kB gzipped), and the precache is 29 KiB smaller.
  • .360 is marked experimental in all 7 locales and the README.

How:

  • A3: errors in SetupHistoryPanel are caught and reported, with new setupHistory keys in all 7 locales (plan 0028).
  • A4 + SEC-1: each GPS stream is decoded independently, readComplex validates its TYPE width, and stsz counts are capped (plan 0029, with regression tests).
  • B6: a per-instance owner check in nativePlayer.ts (plan 0025).
  • PERF-2:
    • New gopro/goproDetect.ts, with goproImport loaded by dynamic import.
    • useVideoSync loads nativeVideoStore and NativePlayerElement on first use.
    • The store's change-event constant moved to nativeVideoStoreEvents.ts.
    • VideoPlayer loads the Insta360 IPC and nativeVideoExport only inside the native app.
  • PERF-3: removed the unrendered upright Archivo face.
  • REL-5: removed two leftover console.logs in VideoPlayer.
  • T2: one tested lib/nativeUnavailable.ts classifier. It replaces three copies (the review found two) and has a tighter regex.
  • T3: scripts/deferredAssets.ts is the single source for the deferred dirs; the route regex and SW matcher are derived from it (generated SW is unchanged).
  • T4: pure load-precedence functions in useDataLoader, with 7 tests.
  • T5: countCachedAssets moved into lib/offlineReadiness, with tests.
  • REL-3 / REL-4: drag mode is folded into the first Added block with its plan citation, and the read-only banner fix moved to Fixed.
  • DOC-5 / 6 / 7: plan 0022 is marked done, the CLAUDE.md video-overlays line describes the single renderer, and .360 is marked experimental.

Type of Change

  • Bug fix
  • Refactor / reusability improvement
  • Documentation

Checklist

  • bun run lint passes
  • bun run typecheck passes
  • bun run test:run passes (3225 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 11 commits October 2, 2026 01:10
Release review A3: the history load had no catch, so a failed IndexedDB
read left the panel on "Loading…" forever, and a rollback or duplicate
that threw was swallowed (the busy flag cleared, nothing said why). The
panel now shows an error with a Retry button when the load fails, and a
failed rollback/duplicate raises an error toast instead of a silent
no-op. Strings added in every locale.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NZ3Pt89yubdPtYn5Wc8fjW
Release review A4 + SEC-1.

A4: an unknown TYPE character in one GPS9 stream threw out of
extractGpsPayload and aborted the whole GoPro import. A camera writes one
payload per second, so a single corrupt one should cost one second, not
the session. Each stream decode is now isolated (a bad GPS9 can still
fall back to GPS5 in the same payload), and readComplex rejects a TYPE
wider than its record instead of reading into the next one.

SEC-1: a uniform-size stsz box is just a size and a uint32 count, so a
hostile file could ask new Array() for ~4 billion entries and OOM the
tab (the regression test OOMs the worker without the fix). Every sample
occupies `size` bytes of the file, so the count is capped at
fileSize / size. The other sample tables were already bounded by their
box length.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NZ3Pt89yubdPtYn5Wc8fjW
Release review B6: the shell runs one native player and
insta360_player_close carries no player id, so an earlier
NativePlayerElement closing late (its close() after a newer one opened,
or an open that resolved after it was closed) killed whichever stream
was live. Elements now record which one last opened the player and only
that one may release it.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NZ3Pt89yubdPtYn5Wc8fjW
Release review T2: the check that decides "this shell can't do it, fall
back quietly" was copied into nativeVideoExport.ts, nativeVideoStore.ts
and insta360/ipc.ts, untested, and matched any message containing
"unknown", "not found" or "not allowed" — so a real failure such as
"file not found" or "unknown error" could be mistaken for an old shell
and silently take the fallback path. It now lives once in
lib/nativeUnavailable.ts and only accepts the `unsupported:` sentinel
prefix or Tauri's own missing-command / ACL rejection shapes. The
Insta360 copy had no callers and is removed (insta360SdkInfo already
treats any error as unavailable). nativeVideoExport's exports and its
handling of every real shell error string are unchanged.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NZ3Pt89yubdPtYn5Wc8fjW
Release review T3: the runtime-cache route matched a hand-inlined
/^\/(?:samples|loggers)\// because workbox-build serializes the
urlPattern callback by its source text, so a closure over the constant
would be empty in the worker. Adding a directory to the list without
editing the regex would precache-exclude it and then never cache it at
runtime. The list moves to scripts/deferredAssets.ts with a builder that
derives the regex from it and splices it into the matcher's source; both
are unit-tested, including the toString round-trip workbox does. The
generated service worker route is byte-identical.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NZ3Pt89yubdPtYn5Wc8fjW
Release review T4: the order a fresh load resolves in (confident course,
then drag runs, then waypoint, then the nearest-track prompt) and the
rule that a restored track/course shadows a saved drag tag lived only
inline in useDataLoader. Both are extracted as pure functions
(chooseAutoDetectPath, shouldRestoreDragSession) and covered, including
that drag detection never runs when a course already matched. Extract
only: the branch bodies are unchanged.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NZ3Pt89yubdPtYn5Wc8fjW
Release review T5: useOfflineReadiness's only logic not already in the
tested lib/offlineReadiness was the "how many deferred assets are
cached" count. It moves there as countCachedAssets (injectable cache,
a throwing lookup counts as a miss, no Cache API means zero) with
tests; the hook keeps only browser plumbing.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NZ3Pt89yubdPtYn5Wc8fjW
Release review PERF-3: the only font-brand use (the landing hero) is
italic, so the upright variable face was ~35 KB in every offline
install that no page ever drew. Only the italic face ships now; the
index.css comment says how to bring the upright one back. Precache
4251.83 -> 4222.66 KiB (together with the PERF-2 split).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NZ3Pt89yubdPtYn5Wc8fjW
Release review PERF-2 (+ REL-5). The eager graph statically imported
the GoPro MP4/GPMF extractor (via FileImport and datalogParser), the
Insta360 camera player and the native video-store bridge (via
useVideoSync), so every web visitor downloaded code only a GoPro import
or the LapWing shell ever runs.

- goproDetect.ts holds the cheap name/ftyp gates the routers need on
  every import; goproImport (and mp4Boxes/gpmf behind it) is now
  dynamic-imported when a video actually arrives.
- useVideoSync loads nativeVideoStore and NativePlayerElement on first
  use (type-only imports otherwise); the store's change-event constant
  moves to nativeVideoStoreEvents.ts so the hook can listen without
  pulling in the bridge.
- VideoPlayer (lazy GraphViewTab chunk) loads the Insta360 IPC and the
  native export bridge only inside the native app.

Main chunk: 754.68 -> 738.13 kB raw, 231.04 -> 225.82 kB gzip. None of
the insta360_*/video_store_*/GPMF code remains in it.

Also drops the two leftover console.log calls in VideoPlayer's save
paths (Rule 7).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NZ3Pt89yubdPtYn5Wc8fjW
- REL-3/DOC-2: fold the stray second "### Added" block (drag mode) into
  the first one and cite plan 0022.
- REL-4: the read-only banner fix moves from Changed to Fixed.
- Fixed entries for this pass's user-visible fixes (setup history
  errors, malformed/hostile GoPro files, Insta360 stream replacement).
- DOC-5: plan 0022 is done, not IN PROGRESS.
- DOC-6: CLAUDE.md's video-overlays entry described the per-widget
  *Overlay components plan 0023 deleted; it now names the single scene
  renderer.
- DOC-7: README marks .360 GoPro import experimental, matching plan
  0029's "untested".
- CLAUDE.md / plan 0029 updated for goproDetect, the dynamic GoPro
  import, the deferredAssets module and the italic-only Archivo.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NZ3Pt89yubdPtYn5Wc8fjW
The README already flags .360 (MAX/Fusion) as untested; the in-app supported-files
list promised it unqualified in every language.

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

cloudflare-workers-and-pages Bot commented Oct 2, 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 19a332d Commit Preview URL

Branch Preview URL
Oct 03 2026, 01:07 AM

@github-actions

github-actions Bot commented Oct 2, 2026 •

Copy link
Copy Markdown

Coverage Summary

Lines: 62.67% (9146/14592) · Statements: 61.69% · Functions: 58.51% · Branches: 59.09%

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 16.79% 27.77% 24.32%
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.17% 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/goproDetect.ts 100% 100% 100%
src/lib/gopro/goproImport.ts 100% 100% 87.5%
src/lib/gopro/goproTelemetry.ts 100% 100% 92.59%
src/lib/gopro/gpmf.ts 99.15% 100% 90%
src/lib/gopro/mp4Boxes.ts 93.95% 100% 77.55%
src/lib/gopro/testFixtures.ts 99.02% 100% 95.74%
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.09% 82.75% 77.77%
src/lib/insta360/playerClock.ts 100% 100% 90%
src/lib/insta360/pose.ts 100% 100% 100%
src/lib/insta360/resumeSession.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/nativeUnavailable.ts 100% 100% 100%
src/lib/nativeVideoExport.ts 100% 66.66% 86.66%
src/lib/nativeVideoStore.ts 51.21% 71.42% 40.9%
src/lib/nativeVideoStoreEvents.ts 100% 100% 100%
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%

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
@TheAngryRaven
TheAngryRaven merged commit 6200d5c into BETA Oct 3, 2026
7 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