- Use FTUESave(true) instead of TrackSaveAssignments() to properly
persist VST assignments to the profile file
- Always call VSTLoad() when modal opens if VST not already loaded,
removing unreliable hasVstAssignment() check
- Pass correct trackIndex to JKSessionPluginModal for multi-track support
- Add trackIndex prop to track data in useMixerHelper for VST operations
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add mixType prop to JKSessionAudioInputs to select master/personal mixer
- Store both masterMixers and personalMixers in myTracks for each track
- Fix async state issue in fillTrackVolumeObject by returning volumeObj directly
- Change SessionTrackGain to use useLayoutEffect for synchronous visual updates
- Fix controlGroup to null for individual track controls (fixes persistence)
- Prevent fader reset when mixer temporarily becomes undefined during re-renders
Audio Inputs now uses master mixer, Session Mix uses personal mixer,
matching the legacy app behavior. Both faders persist independently.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
On page load, instrument_id from server is already a string ("piano").
After user selection, it's a numeric client_id (61) that needs conversion.
Now checks type before converting to handle both cases correctly.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
instrument_id is stored as numeric client_id (e.g., 61 for Piano)
but the icon map uses server format strings ("piano"). Added conversion
using convertClientInstrumentToServer before passing to icon lookup.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add updateParticipantTrackInstrument reducer to update sessionData.participants
- Dispatch both participant track and userTracks updates on instrument save
- Fix syncTracksToServer call to pass clientId instead of jamClient object
- UI now reflects instrument changes without needing page refresh
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- User verified 15+ minute session stability
- No freezes or performance bottlenecks observed
- All memory leak fixes from Phases 20-22 confirmed working
- Add registeredCallbacksRef alongside registeredCallbacks state
- Update unregisterMessageCallbacks to read from ref for cleanup
- Store callbacks to both state and ref during registration
- Ensures cleanup works reliably on all exit paths (browser close, navigation)
- Add acknowledgment that SESS-02/SESS-03 were verified clean in Phase 19
- Merge Task 2 (verification-only) into Task 1's verify section
- Plan now has 1 auto task producing code artifacts
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Phase 22: Session Screen Fixes
- 1 plan in 1 wave
- SESS-01: Harden callback cleanup with useRef pattern
- Defensive improvement for reliable cleanup on all exit paths
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Destructure removeVuState from useVuContext alongside updateVU3
- Add previousMixerIdsRef to track mixer IDs between renders
- Add cleanup useEffect that detects removed mixers
- Call removeVuState when mixer is removed from allMixers
- Only run cleanup when mixers are ready (isReadyRedux is true)
This prevents unbounded growth of vuStates object as tracks join/leave.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add removeVuState callback to clean up vuStates entries
- Export removeVuState alongside updateVuState
- Uses functional setState for React state batching compatibility
- Maintains immutability by creating shallow copy before deletion
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Task 2: Changed from 'auto' to 'checkpoint:pass' (no code changes needed)
- Task 3: Explicitly state line 111 destructuring modification
- Added VUMTR-01 deferral note in objective section
- Updated files_modified to exclude VuContext.js (auto-exposes via pattern)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Phase 20: VU Meter Fixes
- 1 plan in 1 wave
- Addresses VUMTR-02 (unbounded vuStates growth)
- Addresses VUMTR-03 (no per-mixer cleanup)
- Adds removeVuState function to useVuHelpers
- Integrates cleanup with mixer lifecycle in useMixerHelper
- Ready for execution
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Audited JKSessionChatWindow.js, JKChatMessageList.js, sessionChatSlice.js
- Found CHAT-01: Messages accumulate without limit (HIGH)
- Found CHAT-02: chatState in useEffect dependencies (LOW)
- Found CHAT-03: No message cleanup on session leave (MEDIUM)
- Verified WebSocket callback cleanup in useSessionWebSocket.js
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Audited SessionTrackVU.js, useMixerStore.js, useVuHelpers.js
- Found VUMTR-01: VU callback throttling disabled (MEDIUM)
- Found VUMTR-02: vuStates object grows unbounded (HIGH)
- Found VUMTR-03: No per-mixer cleanup on track leave (HIGH)
- Documented all timer/callback patterns with line numbers
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Phase 19: Audit and Discovery
- 1 plan in 1 wave
- 3 tasks covering VU meters, chat, session screen
- Produces 19-AUDIT.md with prioritized findings for Phases 20-22
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Tasks completed: 3/3
- INT-01: Settings button opens modal
- INT-02: Save settings makes PUT /sessions/{id} API call
- INT-03: Cancel closes modal without API call
SUMMARY: .planning/phases/18-integration-tests-playwright/18-01-SUMMARY.md
- Add test verifying Cancel button closes modal without making API call
- Fill description field before cancel to verify changes are discarded
- Use page.route() to track any PUT requests (should be none)
- Verify modal closes by checking privacy select visibility
- Add test for save button making PUT /sessions/{id} API call
- Verify payload includes description and privacy fields (musician_access, approval_required)
- Use page.route() to intercept and capture API request
- Verify modal closes after successful save
- Fix locators to use privacy select instead of modal header text (avoids toast collision)
Plan 18-01: Create integration tests covering:
- INT-01: Settings button opens modal
- INT-02: Save makes PUT /sessions/{id} API call
- INT-03: Cancel closes modal without API call
Plan verification passed.
Tasks completed: 3/3
- Task 1: Create test file with setup and mocks
- Task 2: Write tests for all three requirements
- Task 3: Verify full test suite and clean up
SUMMARY: .planning/phases/17-unit-tests-jest/17-01-SUMMARY.md
UNIT-01: Modal renders with currentSession props
- Test privacy value displayed from currentSession
- Test description value displayed from currentSession
- Test modal title renders
UNIT-02: Save functionality
- Test onSave called with correct payload on save click
- Test onSave called with updated values after user changes
UNIT-03: Loading state
- Test save button disabled when loading
- Test cancel button disabled when loading
- Test description textarea disabled when loading
- Test "Saving..." text shown when loading
- Create __tests__ directory for client components
- Add test file with imports and mocks for react-i18next
- Create renderModal helper function with default props
- Add placeholder test verifying setup works