Skip to content

Expose active reference snapshot + session setup to plugin panels#76

Merged
TheAngryRaven merged 2 commits into
BETAfrom
claude/lap-snapshot-feature-VBWDI
May 28, 2026
Merged

Expose active reference snapshot + session setup to plugin panels#76
TheAngryRaven merged 2 commits into
BETAfrom
claude/lap-snapshot-feature-VBWDI

Conversation

@TheAngryRaven
Copy link
Copy Markdown
Owner

@TheAngryRaven TheAngryRaven commented May 28, 2026

Summary

Make lap snapshots and the current session setup available to plugin panels (the AI coach). Today panels only receive { data, laps, selectedLapNumber, course, useKph }, so the coach has zero awareness of snapshots, and no way to see the setup the driver is currently running.

This PR adds two fields to PluginPanelProps:

activeSnapshot: PluginSnapshot | null

The snapshot the user has loaded as the reference lap, or null. A curated, serializable PluginSnapshot with:

  • clean-lap samples (the ±5s capture buffer is already trimmed — ready to render/compare),
  • the frozen engine (the comparison key), course geometry, vehicle, and setup,
  • lap time + source file/lap.

sessionSetup: VehicleSetup | null

The setup sheet currently assigned to the active session log (via the file manager), or null — i.e. what the driver is running right now. Pair with activeSnapshot.setup (the frozen baseline) to compare and coach across sessions.

Both are computed once in Index.tsx and threaded through SessionContext to all three panel hosts (Coach, Labs, Profile). Existing panels ignore the new fields. The external coach package can now be updated (separately) to consume props.sessionSetup + props.activeSnapshot.

Scope decisions

  • Active snapshot only (not the full per-course list) — the coach sees whatever the user has loaded as the reference.
  • Pre-trimmed clean lap — the plugin doesn't need to know about the capture buffer or the lapStartMs/lapEndMs markers.

Files

plugins/panels.ts (new PluginSnapshot type, activeSnapshot + sessionSetup on PluginPanelProps), contexts/SessionContext.tsx, pages/Index.tsx, tabs/CoachTab.tsx, tabs/LabsTab.tsx, tabs/ProfileTab.tsx, plugins/README.md, CLAUDE.md, CHANGELOG.md.

Test plan

  • npm run lint, npm run typecheck, npm run test:run (737 passing), npm run build all green
  • Load a snapshot as the reference → activeSnapshot is populated for panels; clearing it → null
  • Assign a vehicle + setup to a log → sessionSetup is populated; clear the assignment → null
  • (After the coach plugin is updated separately) the Coach tab can read activeSnapshot.samples / engine / setup and sessionSetup

Follow-up: the external @perchwerks/eye-in-the-sky coach package needs a separate update to actually use these new props — this PR only opens the host-side contract.

https://claude.ai/code/session_01L9h3QDcyTEXmVe6tWMio6T

Plugin panels (the AI coach) only saw data/laps/selectedLapNumber/course/useKph,
so they had no awareness of lap snapshots even when one was loaded as the
reference. Add `activeSnapshot` to PluginPanelProps: the loaded reference
snapshot as a curated PluginSnapshot with clean-lap samples (capture buffer
trimmed) plus the frozen engine/course/vehicle/setup. Computed once in Index
from the active snapshot id and threaded through SessionContext to the Coach,
Labs, and Profile panel hosts.

https://claude.ai/code/session_01L9h3QDcyTEXmVe6tWMio6T
@github-actions
Copy link
Copy Markdown

github-actions Bot commented May 28, 2026

Coverage Summary

Lines: 35.53% (2397/6745) · Statements: 34.56% · Functions: 28.94% · Branches: 36.14%

Per-file coverage
File Lines Functions Branches
src/components/video-overlays/dataSourceResolver.ts 84.12% 70% 79.41%
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 0% 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 0% 0% 0%
src/hooks/useDocumentHead.ts 0% 0% 0%
src/hooks/useEngineManager.ts 0% 0% 0%
src/hooks/useFileManager.ts 0% 0% 0%
src/hooks/useKartManager.ts 100% 100% 100%
src/hooks/useLapManagement.ts 0% 0% 0%
src/hooks/useLapSnapshots.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/useStripePrices.ts 0% 0% 0%
src/hooks/useSubscription.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/integrations/lovable/index.ts 0% 0% 0%
src/lib/aimParser.ts 87.96% 100% 69.13%
src/lib/alfanoParser.ts 80.46% 100% 57.48%
src/lib/billing.ts 94.73% 100% 96.29%
src/lib/billingClient.ts 0% 0% 0%
src/lib/ble/test/mockBle.ts 100% 100% 50%
src/lib/ble/battery.ts 93.33% 100% 87.5%
src/lib/ble/connection.ts 0% 0% 0%
src/lib/ble/fileTransfer.ts 90.69% 95% 72.91%
src/lib/ble/format.ts 50% 100% 66.66%
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/brakingZones.ts 97.14% 100% 86.11%
src/lib/browserCompat.ts 0% 0% 0%
src/lib/channels.ts 100% 100% 84.61%
src/lib/chartColors.ts 100% 100% 100%
src/lib/chartUtils.ts 0% 0% 0%
src/lib/courseDetection.ts 99.01% 100% 84.14%
src/lib/datalogParser.ts 18.51% 50% 17.39%
src/lib/db/index.ts 0% 0% 0%
src/lib/db/supabaseAdapter.ts 0% 0% 0%
src/lib/db/types.ts 100% 100% 100%
src/lib/dbUtils.ts 3.12% 0% 0%
src/lib/deviceSettingsSchema.ts 93.33% 100% 96.42%
src/lib/deviceTrackSync.ts 100% 100% 90%
src/lib/doveParser.ts 89.6% 72.72% 73.63%
src/lib/dovexParser.ts 76.56% 76.92% 47.27%
src/lib/emailValidation.ts 100% 100% 100%
src/lib/engineStorage.ts 0% 0% 100%
src/lib/engineUtils.ts 100% 100% 91.66%
src/lib/fieldResolver.ts 100% 100% 83.33%
src/lib/fileStorage.ts 0% 0% 0%
src/lib/garageEvents.ts 100% 100% 100%
src/lib/gforceCalculation.ts 100% 100% 100%
src/lib/graphPrefsStorage.ts 0% 0% 0%
src/lib/kartStorage.ts 0% 0% 0%
src/lib/lapCalculation.ts 96.12% 100% 90.32%
src/lib/lapDelta.ts 98.96% 100% 82.35%
src/lib/lapSnapshot.ts 100% 100% 87.5%
src/lib/lapSnapshotStorage.ts 0% 0% 0%
src/lib/motecParser.ts 4.29% 3.44% 0.69%
src/lib/nmeaParser.ts 85.62% 92.85% 71.22%
src/lib/noteStorage.ts 0% 0% 100%
src/lib/overlayCanvasRenderer.ts 0% 0% 0%
src/lib/parserUtils.ts 100% 100% 98.52%
src/lib/pendingCheckout.ts 58.82% 25% 100%
src/lib/referenceUtils.ts 100% 100% 89.28%
src/lib/setupStorage.ts 0% 0% 0%
src/lib/speedBounds.ts 94.11% 66.66% 89.18%
src/lib/speedEvents.ts 86.56% 100% 76%
src/lib/templateStorage.ts 0% 0% 0%
src/lib/trackStorage.ts 3.33% 0% 0%
src/lib/trackUtils.ts 100% 100% 100%
src/lib/ubxParser.ts 5% 0% 0%
src/lib/utils.ts 100% 100% 100%
src/lib/vboParser.ts 83.2% 100% 60.97%
src/lib/vehicleStorage.ts 0% 0% 0%
src/lib/videoExport.ts 0% 0% 0%
src/lib/videoFileStorage.ts 0% 0% 0%
src/lib/videoStorage.ts 0% 0% 0%
src/lib/weatherService.ts 0% 0% 0%
src/plugins/cloud-sync/accountDeletion.ts 0% 0% 0%
src/plugins/cloud-sync/accountExport.ts 0% 0% 0%
src/plugins/cloud-sync/autoSync.ts 0% 0% 0%
src/plugins/cloud-sync/cloudClient.ts 0% 0% 0%
src/plugins/cloud-sync/CloudFilesSection.tsx 0% 0% 0%
src/plugins/cloud-sync/CloudLogsPanel.tsx 0% 0% 0%
src/plugins/cloud-sync/CloudSyncPanel.tsx 0% 0% 0%
src/plugins/cloud-sync/DataPrivacyPanel.tsx 0% 0% 0%
src/plugins/cloud-sync/DownloadAllCloudLogs.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 68.42% 38.46% 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/merge.ts 90.9% 66.66% 100%
src/plugins/cloud-sync/pendingSync.ts 0% 0% 0%
src/plugins/cloud-sync/profile.ts 0% 0% 0%
src/plugins/cloud-sync/snapshotSync.ts 0% 0% 0%
src/plugins/cloud-sync/snapshotTombstones.ts 0% 0% 0%
src/plugins/cloud-sync/StoragePanel.tsx 0% 0% 0%
src/plugins/cloud-sync/storageTypes.ts 100% 100% 100%
src/plugins/cloud-sync/storeAccessors.ts 0% 0% 0%
src/plugins/cloud-sync/syncEngine.ts 0% 0% 0%
src/plugins/cloud-sync/syncStores.ts 100% 100% 100%
src/plugins/index.ts 0% 0% 0%
src/plugins/mounts.ts 100% 100% 100%
src/plugins/panels.ts 100% 100% 100%
src/plugins/PluginMount.tsx 0% 0% 0%
src/plugins/PluginPanelHost.tsx 0% 0% 0%
src/plugins/registry.ts 100% 100% 100%
src/plugins/storage.ts 32.25% 8.33% 33.33%
src/plugins/types.ts 100% 100% 100%
src/types/racing.ts 100% 100% 100%

The active snapshot already carries its frozen setup (the baseline), but the
setup the driver is currently running wasn't being passed to plugins at all.
Add `sessionSetup: VehicleSetup | null` to PluginPanelProps, resolved once in
Index from the session's assigned setup id, threaded through SessionContext to
the Coach / Labs / Profile hosts. A coach panel can now compare the current
setup against the snapshot's frozen baseline.

https://claude.ai/code/session_01L9h3QDcyTEXmVe6tWMio6T
@TheAngryRaven TheAngryRaven changed the title Expose the active reference snapshot to plugin panels Expose active reference snapshot + session setup to plugin panels May 28, 2026
@TheAngryRaven TheAngryRaven merged commit 0ec83c9 into BETA May 28, 2026
5 checks passed
@TheAngryRaven TheAngryRaven deleted the claude/lap-snapshot-feature-VBWDI branch May 28, 2026 03:16
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