docs(24): create phase plan

Phase 24: Fix Recording Crash
- 1 plan in 1 wave
- 1 parallel, 0 sequential
- Ready for execution

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
Nuwan 2026-02-19 15:13:27 +05:30
parent 1512f646ea
commit 94ae383267
2 changed files with 207 additions and 12 deletions

View File

@ -6,11 +6,11 @@
## Overview
| # | Phase | Goal | Requirements | Success Criteria |
|---|-------|------|--------------|------------------|
| 24 | Fix Recording Crash | Fix C++ client crash on Start Recording | CRASH-01, CRASH-02, CRASH-03, CRASH-04 | 4 |
| 25 | Verify Basic Controls | Verify Start/Stop/Pause work like desktop native app | CTRL-01, CTRL-02, CTRL-03 | 3 |
| 26 | Memory Leak Audit | Audit and fix memory leaks in recording modal | MEM-01, MEM-02, MEM-03 | 3 |
| # | Phase | Goal | Requirements | Plans | Success Criteria |
|---|-------|------|--------------|-------|------------------|
| 24 | Fix Recording Crash | Fix C++ client crash on Start Recording | CRASH-01, CRASH-02, CRASH-03, CRASH-04 | 1 | 4 |
| 25 | Verify Basic Controls | Verify Start/Stop/Pause work like desktop native app | CTRL-01, CTRL-02, CTRL-03 | TBD | 3 |
| 26 | Memory Leak Audit | Audit and fix memory leaks in recording modal | MEM-01, MEM-02, MEM-03 | TBD | 3 |
**Total:** 3 phases | 10 requirements | 10 success criteria
@ -20,8 +20,13 @@
**Goal:** Fix C++ client crash when Start Recording is clicked
**Plans:** 1 plan
Plans:
- [ ] 24-01-PLAN.md — Fix method names and parameters in useRecordingHelpers.js and JKSessionScreen.js
**Requirements:**
- CRASH-01: Call RegisterRecordingCallbacks before recording operations
- CRASH-01: Call RegisterRecordingCallbacks before recording operations (ALREADY DONE in JKSessionScreen.js line 500)
- CRASH-02: Use correct method name StartRecording (not StartMediaRecording)
- CRASH-03: Use correct method name StopRecording (not FrontStopRecording)
- CRASH-04: Pass individual parameters to StartRecording (not settings object)
@ -36,8 +41,8 @@
**Key Files:**
- `jam-ui/src/hooks/useRecordingHelpers.js`
- Recording modal component
- Session initialization code
- `jam-ui/src/components/client/JKSessionScreen.js`
- `jam-ui/src/components/client/JKSessionRecordingModal.js`
---
@ -45,6 +50,8 @@
**Goal:** Verify Start/Stop/Pause work like desktop native app
**Plans:** (created by /gsd:plan-phase)
**Requirements:**
- CTRL-01: Start recording works - initiates recording like desktop native app
- CTRL-02: Stop recording works - ends recording like desktop native app
@ -67,6 +74,8 @@
**Goal:** Audit and fix memory leaks in recording modal
**Plans:** (created by /gsd:plan-phase)
**Requirements:**
- MEM-01: Audit recording modal useEffect cleanup functions
- MEM-02: Audit timer/interval cleanup during recording lifecycle
@ -91,10 +100,11 @@
See: `.planning/research/RECORDING-ANALYSIS.md`
Key findings:
- Missing `RegisterRecordingCallbacks` call is primary crash cause
- Wrong method names in jam-ui vs legacy
- Parameter format mismatch
- `RegisterRecordingCallbacks` is ALREADY called in JKSessionScreen.js line 500 (not a gap)
- Wrong method names in jam-ui vs legacy (`StartMediaRecording` vs `StartRecording`)
- Wrong method names (`FrontStopRecording` vs `StopRecording`)
- Parameter format mismatch (object vs unpacked params)
---
*Roadmap created: 2026-02-19*
*Last updated: 2026-02-19 after initial creation*
*Last updated: 2026-02-19 after Phase 24 planning*

View File

@ -0,0 +1,185 @@
---
phase: 24-fix-recording-crash
plan: 01
type: execute
wave: 1
depends_on: []
files_modified:
- jam-ui/src/hooks/useRecordingHelpers.js
- jam-ui/src/components/client/JKSessionScreen.js
autonomous: true
must_haves:
truths:
- "Clicking Start Recording does not crash the C++ client"
- "Recording starts successfully after clicking Start Recording"
- "Recording stops successfully after clicking Stop Recording"
- "Recording callbacks are invoked correctly by C++ client"
artifacts:
- path: "jam-ui/src/hooks/useRecordingHelpers.js"
provides: "Recording start/stop with correct jamClient method calls"
contains: "StartRecording"
- path: "jam-ui/src/components/client/JKSessionScreen.js"
provides: "Session recording with correct method call"
contains: "StartRecording"
key_links:
- from: "jam-ui/src/hooks/useRecordingHelpers.js"
to: "jamClient.StartRecording"
via: "jamClient proxy call with unpacked parameters"
pattern: "jamClient\\.StartRecording\\("
- from: "jam-ui/src/hooks/useRecordingHelpers.js"
to: "jamClient.StopRecording"
via: "jamClient proxy call"
pattern: "jamClient\\.StopRecording\\("
---
<objective>
Fix C++ client crash when Start Recording is clicked by correcting method names and parameter format.
Purpose: The recording feature crashes because jam-ui uses wrong method names (`StartMediaRecording` instead of `StartRecording`) and passes a settings object instead of unpacked individual parameters. This makes the C++ client unable to process the call correctly.
Output: Working recording start/stop that matches the legacy implementation pattern.
</objective>
<execution_context>
@/Users/nuwan/.claude/get-shit-done/workflows/execute-plan.md
@/Users/nuwan/.claude/get-shit-done/templates/summary.md
</execution_context>
<context>
@.planning/PROJECT.md
@.planning/ROADMAP.md
@.planning/STATE.md
@.planning/research/RECORDING-ANALYSIS.md
# Key source files
@jam-ui/src/hooks/useRecordingHelpers.js
@jam-ui/src/components/client/JKSessionScreen.js
# Reference: Legacy implementation (working pattern)
@web/app/assets/javascripts/recordingModel.js (lines 99, 141)
</context>
<tasks>
<task type="auto">
<name>Task 1: Fix useRecordingHelpers.js method names and parameters</name>
<files>jam-ui/src/hooks/useRecordingHelpers.js</files>
<action>
Fix the recording method calls to match the legacy implementation:
1. **Fix startRecording function (around line 101):**
- Change `jamClient.StartMediaRecording(recording.id, groupedTracks, recordSettings)`
- To: `jamClient.StartRecording(recording.id, groupedTracks, recordVideo, recordChat, recordFramerate)`
- Unpack `recordSettings` into individual parameters:
- `recordVideo` = `recordSettings.videoType || 0` (integer, 0 means no video)
- `recordChat` = `recordSettings.recordChat ? 1 : 0` (integer flag)
- `recordFramerate` = `0` (default, matches legacy)
- The `recordVideo` variable already exists at line 83: `const recordVideo = recordSettings.recordingType === RECORD_TYPE_BOTH;`
- This boolean needs to be converted to the videoType integer for the C++ call
2. **Fix stopRecording function (around line 166):**
- Change `jamClient.FrontStopRecording(recording.id, groupedTracks)`
- To: `jamClient.StopRecording(recording.id, groupedTracks)`
**Legacy signatures for reference:**
```javascript
// Start: recordingModel.js line 99
jamClient.StartRecording(recording["id"], groupedTracks, recordVideo, recordChat, recordFramerate);
// Stop: recordingModel.js line 141
jamClient.StopRecording(recording.id, groupedTracks);
```
**Note:** Keep the existing error handling and state management logic unchanged. Only modify the jamClient method calls.
</action>
<verify>
1. Grep for `StartMediaRecording` in useRecordingHelpers.js returns no results
2. Grep for `FrontStopRecording` in useRecordingHelpers.js returns no results
3. Grep for `StartRecording` in useRecordingHelpers.js returns the new call
4. Grep for `StopRecording` in useRecordingHelpers.js returns the new call
5. No TypeScript/ESLint errors when running `npm run lint` (if applicable)
</verify>
<done>
- `useRecordingHelpers.js` calls `jamClient.StartRecording(id, tracks, videoType, chatFlag, framerate)` with unpacked parameters
- `useRecordingHelpers.js` calls `jamClient.StopRecording(id, tracks)` with correct method name
- No references to `StartMediaRecording` or `FrontStopRecording` in useRecordingHelpers.js
</done>
</task>
<task type="auto">
<name>Task 2: Fix JKSessionScreen.js doStartRecording method</name>
<files>jam-ui/src/components/client/JKSessionScreen.js</files>
<action>
Fix the doStartRecording function (around line 880) to use the correct method name and parameters:
1. **Current code (line 880):**
```javascript
await jamClient.StartMediaRecording(currentRecordingId, groupedTracks, params);
```
2. **Change to:**
```javascript
const recordVideo = params.videoType || 0;
const recordChat = params.recordChat ? 1 : 0;
const recordFramerate = 0;
await jamClient.StartRecording(currentRecordingId, groupedTracks, recordVideo, recordChat, recordFramerate);
```
**Note:** The `params` object coming into doStartRecording contains:
- `recordVideo` (boolean from modal)
- `recordChat` (boolean)
- `videoType` (integer for video source)
Extract and convert these to match the legacy C++ client expectations.
</action>
<verify>
1. Grep for `StartMediaRecording` in JKSessionScreen.js returns no results in doStartRecording
2. Grep for `StartRecording` in JKSessionScreen.js shows the corrected call
3. No syntax errors - file parses correctly
</verify>
<done>
- `JKSessionScreen.js` `doStartRecording` function calls `jamClient.StartRecording` with correct parameters
- No references to `StartMediaRecording` in the recording-related code paths
</done>
</task>
</tasks>
<verification>
After both tasks are complete:
1. **Code verification:**
```bash
# Should return 0 results for old method names in recording code
grep -n "StartMediaRecording\|FrontStopRecording" jam-ui/src/hooks/useRecordingHelpers.js
grep -n "StartMediaRecording" jam-ui/src/components/client/JKSessionScreen.js | grep doStartRecording
# Should show new correct calls
grep -n "jamClient.StartRecording\|jamClient.StopRecording" jam-ui/src/hooks/useRecordingHelpers.js
```
2. **Build verification:**
```bash
cd jam-ui && npm run build
```
Build should complete without errors.
3. **Manual testing (for human verification in Phase 25):**
- Start jam-ui with `npm run start`
- Join a session
- Open recording modal
- Click Start Recording
- Expected: No crash, recording starts
</verification>
<success_criteria>
1. Method names corrected: `StartRecording` and `StopRecording` used instead of `StartMediaRecording` and `FrontStopRecording`
2. Parameters unpacked: Individual params (id, tracks, videoType, chatFlag, framerate) passed instead of settings object
3. Build passes without errors
4. No regressions in existing code (state management, error handling unchanged)
</success_criteria>
<output>
After completion, create `.planning/phases/24-fix-recording-crash/24-01-SUMMARY.md`
</output>