diff --git a/.planning/phases/23-verification/23-UAT.md b/.planning/phases/23-verification/23-UAT.md new file mode 100644 index 000000000..18b0c8698 --- /dev/null +++ b/.planning/phases/23-verification/23-UAT.md @@ -0,0 +1,286 @@ +--- +phase: 23-verification +type: uat +status: pending +--- + +# Phase 23: Memory Leak Verification UAT + +## Prerequisites + +- **Browser:** Chrome (recommended for DevTools memory profiling) +- **DevTools:** Open with Performance Monitor and Memory tabs visible +- **jam-ui:** Running locally (`npm run start`) +- **web backend:** Running (`./runweb`) +- **Native client:** Running and connected + +## Quick Verification (5 minutes) + +Before full verification, confirm basic stability: + +1. Join a session +2. Open/close chat window 3 times +3. Show/hide VU meters 3 times +4. Leave session +5. Verify no console errors + +**Quick check pass:** [ ] + +--- + +## Section 1: VU Meter Verification (Phase 20 fixes) + +**Purpose:** Verify vuStates cleanup when tracks are removed (VUMTR-02, VUMTR-03) + +### Test Steps + +1. **Open React DevTools** + - Press F12 > Components tab + - Find VuContext provider in the component tree + +2. **Join Session with Tracks** + - Join a session with at least one other participant + - Note the initial vuStates keys in VuContext + +3. **Record Initial State** + - Inspect VuContext state + - Record number of mixer IDs in vuStates: ______ + +4. **Simulate Track Changes** + - If possible, have participants join/leave + - OR: Navigate away and back to session (triggers track refresh) + - Repeat 3 times + +5. **Verify Cleanup** + - Check vuStates keys in VuContext + - vuStates should ONLY contain active mixer IDs + - No orphaned entries from removed tracks + +### Expected Results + +| Check | Expected | Actual | +|-------|----------|--------| +| vuStates keys match active mixers | Yes | | +| No orphaned mixer IDs | Yes | | +| Console errors | None | | + +**Section 1 Pass:** [ ] + +--- + +## Section 2: Chat Memory Verification (Phase 21 fixes) + +**Purpose:** Verify bounded message storage and cleanup on session leave (CHAT-02, CHAT-03) + +### Test Steps + +1. **Open Session and Chat Window** + - Join any session + - Click the chat button to open chat window + +2. **Send Messages** + - Send at least 10 test messages + - Messages should appear in chat list + +3. **Verify Bounded Storage** + - Open Redux DevTools (requires Redux DevTools extension) + - Navigate to state > sessionChat > messagesByChannel + - Note message count: ______ + - Verify messages array length is reasonable (max 500 per channel) + +4. **Leave Session** + - Click the leave button to exit session + - Navigate to dashboard + +5. **Verify Chat Cleanup** + - Open Redux DevTools + - Check sessionChat.messagesByChannel + - Should be empty object `{}` + +### Expected Results + +| Check | Expected | Actual | +|-------|----------|--------| +| Messages bounded (< 500) | Yes | | +| Chat cleared on leave | Yes | | +| lastReadAt preserved | Yes | | +| Console errors | None | | + +**Section 2 Pass:** [ ] + +--- + +## Section 3: Session Screen Verification (Phase 22 fixes) + +**Purpose:** Verify callback cleanup on session leave (SESS-01) + +### Test Steps + +1. **Join Session** + - Join any session + - Wait for session screen to fully load + +2. **Leave Session** + - Click the leave button + - Navigate to dashboard + +3. **Check Console** + - Open browser console (F12 > Console) + - Look for any warnings about duplicate callbacks + - Look for any "cleanup" or "unregister" errors + +4. **Rejoin Session** + - Join the same or different session + - Verify app works normally + +5. **Verify No Duplicate Callbacks** + - Check console for "already registered" warnings + - Check for duplicate WebSocket event handlers + +### Expected Results + +| Check | Expected | Actual | +|-------|----------|--------| +| Clean leave (no errors) | Yes | | +| Rejoin works normally | Yes | | +| No duplicate callback warnings | Yes | | +| Console errors | None | | + +**Section 3 Pass:** [ ] + +--- + +## Section 4: 15-Minute Stability Test (VRFY-01) + +**Purpose:** Verify app remains stable during extended session use + +### Test Steps + +1. **Join Session** + - Join any active session + - Note start time: ______ + +2. **Perform Repeated Actions** + - Open/close chat window: 5 times + - Show/hide VU meters (if available): 5 times + - Leave and rejoin session: 3 times + - Send chat messages: 10 messages + +3. **Wait and Observe** + - Keep session active for 15+ minutes + - Check for app responsiveness every 5 minutes: + - 5 min: Responsive? [ ] + - 10 min: Responsive? [ ] + - 15 min: Responsive? [ ] + +4. **Final Check** + - Note end time: ______ + - Total duration: ______ minutes + - App responsive at end: [ ] + +### Expected Results + +| Check | Expected | Actual | +|-------|----------|--------| +| No freezes | Yes | | +| No memory alerts | Yes | | +| App responsive throughout | Yes | | +| UI renders correctly | Yes | | + +**Section 4 Pass:** [ ] + +--- + +## Section 5: Memory Growth Check (VRFY-02) + +**Purpose:** Verify memory doesn't grow unbounded during usage + +### Test Steps + +1. **Open Performance Monitor** + - Chrome DevTools > More tools > Performance monitor + - Note initial JS heap size: ______ MB + +2. **Record Baseline** + - Wait 30 seconds for app to stabilize + - Record baseline heap size: ______ MB + +3. **Perform Test Actions** + - Complete all actions from Section 4 (15-minute test) + - OR: At minimum, perform: + - 5 chat open/close cycles + - 5 VU meter visibility toggles + - 3 session leave/rejoin cycles + +4. **Take Heap Snapshot** + - DevTools > Memory tab > Take heap snapshot + - Note heap snapshot size: ______ MB + +5. **Analyze Growth** + - Calculate growth: (Final - Baseline) = ______ MB + - Growth percentage: ______% + - Expected: < 50% growth, heap should stabilize + +### Expected Results + +| Check | Expected | Actual | +|-------|----------|--------| +| Initial heap size | < 200 MB | | +| Final heap size | < 300 MB | | +| Growth < 50% | Yes | | +| Heap stabilizes | Yes | | + +**Section 5 Pass:** [ ] + +--- + +## Verification Results Summary + +| Section | Status | Notes | +|---------|--------|-------| +| Quick Verification | | | +| Section 1: VU Meters | | | +| Section 2: Chat Memory | | | +| Section 3: Session Callbacks | | | +| Section 4: 15-min Stability | | | +| Section 5: Memory Growth | | | + +**Overall UAT Status:** [ ] PASS / [ ] FAIL + +**Verifier:** ______________________ + +**Date:** ______________________ + +**Notes:** + +--- + +## Troubleshooting + +If any section fails: + +### VU Meter Issues +- Check React DevTools for VuContext +- Look for mixer IDs that don't correspond to active tracks +- Review `useVuHelpers.js` removeVuState function + +### Chat Issues +- Verify Redux DevTools shows proper state structure +- Check clearAllMessages is called on session leave +- Review `sessionChatSlice.js` for bounded array logic + +### Session Callback Issues +- Check console for "unregister" related errors +- Verify cleanup effect runs on unmount +- Review `JKSessionScreen.js` for registeredCallbacksRef usage + +### Memory Growth Issues +- Take multiple heap snapshots to identify retained objects +- Look for arrays/objects that grow without bound +- Check for detached DOM nodes in memory snapshot + +--- + +*UAT Template Version: 1.0* +*Created: 2026-02-10* +*For: v1.4 Memory Leak Prevention Milestone*