fix(31): revise plan based on checker feedback

- Updated must_haves.truths to clarify that grouping state IS derived data
- Made Task 2 verification precise: exactly 13 useSelector calls expected
- Added verification that old individual selectors (lines 72-92) are removed
- Changed vague 'around 9-12' to exact count verification
This commit is contained in:
Nuwan 2026-03-05 18:59:34 +05:30
parent 249cf75ec6
commit 3a9df2bef8
1 changed files with 46 additions and 25 deletions

View File

@ -12,8 +12,8 @@ autonomous: true
must_haves:
truths:
- "Single mixer field change triggers 1-3 selector runs instead of 18+"
- "useMixerHelper uses 3-5 composed selectors with shallowEqual"
- "Derived data is memoized via createSelector"
- "useMixerHelper uses 6 composed selectors with shallowEqual"
- "Composed selectors use createSelector to memoize grouped state objects (grouping IS derived data - creates new object from multiple inputs)"
artifacts:
- path: "jam-ui/src/store/features/mixersSlice.js"
provides: "Composed memoized selectors for mixer state"
@ -172,7 +172,7 @@ mixersSlice.js exports 6 composed selectors using createSelector:
<name>Task 2: Refactor useMixerHelper to use composed selectors with shallowEqual</name>
<files>jam-ui/src/hooks/useMixerHelper.js</files>
<action>
Replace 18+ individual useSelector calls with 6 composed selector calls using shallowEqual:
Replace 21 individual useSelector calls (lines 72-92) with 6 composed selector calls using shallowEqual:
1. Update imports at top of file:
@ -209,19 +209,36 @@ import {
} from '../store/features/mixersSlice';
```
2. Replace the 18+ individual useSelector calls (lines 72-92) with composed selector calls:
2. Replace the 21 individual useSelector calls (lines 72-92) with composed selector calls:
OLD (remove this block):
OLD (remove these 21 lines - lines 72-92):
```javascript
const chatMixer = useSelector(selectChatMixer);
const broadcastMixer = useSelector(selectBroadcastMixer);
const recordingMixer = useSelector(selectRecordingMixer);
// ... 15+ more individual selectors
const recordingTrackMixers = useSelector(selectRecordingTrackMixers);
const backingTrackMixers = useSelector(selectBackingTrackMixers);
const jamTrackMixers = useSelector(selectJamTrackMixers);
const metronomeTrackMixers = useSelector(selectMetronomeTrackMixers);
const adhocTrackMixers = useSelector(selectAdhocTrackMixers);
const masterMixers = useSelector(selectMasterMixers);
const personalMixers = useSelector(selectPersonalMixers);
const allMixers = useSelector(selectAllMixers);
const mixersByResourceId = useSelector(selectMixersByResourceId);
const mixersByTrackId = useSelector(selectMixersByTrackId);
const metronome = useSelector(selectMetronome);
const metronomeSettings = useSelector(selectMetronomeSettings);
const mediaSummary = useSelector(selectMediaSummary);
const noAudioUsers = useSelector(selectNoAudioUsers);
const clientsWithAudioOverride = useSelector(selectClientsWithAudioOverride);
const simulatedMusicCategoryMixers = useSelector(selectSimulatedMusicCategoryMixers);
const simulatedChatCategoryMixers = useSelector(selectSimulatedChatCategoryMixers);
const isReadyRedux = useSelector(selectMixersReady);
```
NEW (replace with):
```javascript
// Composed selectors with shallowEqual - reduces 18+ subscriptions to 6
// Composed selectors with shallowEqual - reduces 21 subscriptions to 6
const coreMixers = useSelector(selectCoreMixerState, shallowEqual);
const trackMixers = useSelector(selectTrackMixerState, shallowEqual);
const lookupTables = useSelector(selectMixerLookupTables, shallowEqual);
@ -240,9 +257,9 @@ const { metronome, metronomeSettings, mediaSummary, noAudioUsers,
const { simulatedMusicCategoryMixers, simulatedChatCategoryMixers } = simulatedMixers;
```
This preserves all existing variable names used throughout the hook while reducing selector subscriptions from 18+ to 6.
This preserves all existing variable names used throughout the hook while reducing selector subscriptions from 21 to 6.
IMPORTANT: Keep all other code in useMixerHelper.js unchanged - only modify imports and the selector calls section.
IMPORTANT: Keep all other code in useMixerHelper.js unchanged - only modify imports and the selector calls section. The remaining useSelector calls (lines 95-97 for tracks, 100-101 for mix mode, 109-110 for session) stay as-is.
</action>
<verify>
Run syntax check:
@ -250,10 +267,10 @@ Run syntax check:
cd jam-ui && node -c src/hooks/useMixerHelper.js
```
Verify shallowEqual usage:
Verify shallowEqual usage (should appear 7 times: 1 import + 6 useSelector calls):
```bash
grep -c "shallowEqual" jam-ui/src/hooks/useMixerHelper.js
# Should return 6 or more (imports + 6 useSelector calls)
# Expected: 7
```
Verify composed selector imports:
@ -263,22 +280,24 @@ grep "selectTrackMixerState" jam-ui/src/hooks/useMixerHelper.js
grep "selectMixerLookupTables" jam-ui/src/hooks/useMixerHelper.js
```
Count useSelector calls (should be significantly reduced):
Verify old individual selectors removed (lines 72-92 pattern should NOT exist):
```bash
grep -c "useSelector" jam-ui/src/hooks/useMixerHelper.js
# Should be around 9-12 (6 composed + a few remaining individual like selectMixMode)
grep -E "useSelector\(select(ChatMixer|BroadcastMixer|RecordingMixer|RecordingTrackMixers|BackingTrackMixers|JamTrackMixers|MetronomeTrackMixers|AdhocTrackMixers|MasterMixers|PersonalMixers|AllMixers|MixersByResourceId|MixersByTrackId|Metronome[^S]|MetronomeSettings|MediaSummary|NoAudioUsers|ClientsWithAudioOverride|SimulatedMusicCategoryMixers|SimulatedChatCategoryMixers|MixersReady)\)" jam-ui/src/hooks/useMixerHelper.js
# Expected: no matches (empty output)
```
Count total useSelector calls (should be exactly 13):
```bash
grep -c "= useSelector(" jam-ui/src/hooks/useMixerHelper.js
# Expected: 13 (6 composed + 3 track selectors + 2 mix mode + 2 session selectors)
```
</verify>
<done>
useMixerHelper.js uses 6 composed selectors with shallowEqual instead of 18+ individual selectors:
- coreMixers via selectCoreMixerState
- trackMixers via selectTrackMixerState
- lookupTables via selectMixerLookupTables
- masterPersonal via selectMasterPersonalMixers
- metadata via selectMixerMetadata
- simulatedMixers via selectSimulatedCategoryMixers
All existing variable names preserved via destructuring for backward compatibility.
useMixerHelper.js refactored:
- 21 individual selectors (lines 72-92) removed
- 6 composed selectors with shallowEqual added
- Total useSelector calls reduced from 28 to 13
- All existing variable names preserved via destructuring for backward compatibility
</done>
</task>
@ -299,8 +318,8 @@ cd jam-ui && npm run build 2>&1 | head -50
3. **Selector count verification:**
- mixersSlice.js should export 6 new composed selectors
- useMixerHelper.js should have 6 useSelector calls with shallowEqual
- Total useSelector calls in useMixerHelper reduced from 18+ to ~10-12
- useMixerHelper.js should have exactly 13 useSelector calls (6 composed + 7 other)
- Old individual selector pattern (lines 72-92) should be completely removed
4. **Pattern verification:**
```bash
@ -313,6 +332,8 @@ grep -E "createSelector|shallowEqual" jam-ui/src/store/features/mixersSlice.js j
- [ ] mixersSlice.js exports 6 composed selectors (selectCoreMixerState, selectTrackMixerState, selectMixerLookupTables, selectMasterPersonalMixers, selectMixerMetadata, selectSimulatedCategoryMixers)
- [ ] useMixerHelper.js imports shallowEqual from react-redux
- [ ] useMixerHelper.js uses 6 composed selectors with shallowEqual comparison
- [ ] Old individual selectors (lines 72-92) completely removed
- [ ] Total useSelector calls in useMixerHelper.js equals exactly 13
- [ ] All existing variable names preserved via destructuring
- [ ] Syntax validation passes for both files
- [ ] Build completes without errors