Fixed critical bug where all tracks (Audio Inputs and Session Mix) disappeared
when user clicked "Open" → "Metronome".
Root cause: useEffect in JKSessionScreen.js depended on entire sessionHelper
object, which got new reference whenever currentSession updated (including when
metronome_open flag changed). This triggered unnecessary onSessionChange() calls
that refetched all mixers, causing race condition where myTracks became empty.
Changes:
1. **JKSessionScreen.js (line 540)**: Changed useEffect dependency from
`sessionHelper` to `sessionHelper.id()` (primitive value that only changes
when session ID changes, not on metadata updates)
2. **useMixerHelper.js (lines 63, 388-396, 453-454)**: Added previousMyTracksRef
to store last known good myTracks. Returns previous value instead of empty
array when allMixers is temporarily empty during state transitions.
3. **useMixerStore.js (lines 198-201, 213-220, 231)**: Added verification logging
to confirm onSessionChange is not called unnecessarily. Can be removed after
testing confirms fix works.
Expected behavior after fix:
- ✅ Tracks DO NOT disappear when metronome clicked
- ✅ onSessionChange only called on initial session join, not on metadata updates
- ✅ Audio Inputs and Session Mix remain visible throughout metronome operations
- ✅ Backing tracks and jam tracks still work correctly (regression test)
NOTE: This fix does NOT implement metronome UI display. Metronome audio will
play but no mixer controls will appear in session screen. That can be added
later as separate task.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>