diff --git a/.planning/MILESTONES.md b/.planning/MILESTONES.md index 10b2414be..e86fd49e5 100644 --- a/.planning/MILESTONES.md +++ b/.planning/MILESTONES.md @@ -1,5 +1,32 @@ # Project Milestones: JamKazam Media Features Modernization +## v1.6 Media Features Polish (Shipped: 2026-03-03) + +**Delivered:** Fixed JamTrack loading sequence, window sizing, and navigation; enabled backing track sync to session screen; prevented opening multiple media players simultaneously. + +**Phases completed:** 26-27 (5 plans total) + +**Key accomplishments:** +- Fixed JamTrack loading sequence - defer UI until backend processing completes +- Fixed JamTrack player window sizing (460x350) without scrollbars +- Implemented "Create custom mix" navigation to JamTrack editor in new tab +- Added callback cleanup to prevent memory leaks in JamTrack +- Backing tracks now sync to session screen when opened +- Added async cleanup to prevent unmount state warnings +- Prevented opening multiple media players simultaneously + +**Stats:** +- 44 files modified +- +5,210 / -403 lines of JavaScript/React +- 2 phases, 5 plans +- 7 days (2026-02-25 → 2026-03-03) + +**Git range:** `eab0b0d19` → `51f7cb105` + +**What's next:** To be determined in next milestone planning + +--- + ## v1.5 Fix Session Recording (Shipped: 2026-02-25) **Delivered:** Fixed session recording crash and memory leaks, enabling stable recording sessions of 15+ minutes. diff --git a/.planning/PROJECT.md b/.planning/PROJECT.md index a1f18072f..b4509a572 100644 --- a/.planning/PROJECT.md +++ b/.planning/PROJECT.md @@ -6,7 +6,7 @@ Transform session features from the legacy web project into modern React patterns in jam-ui. The features exist in the legacy codebase with jQuery dialogs and polling-based playback monitoring - we're bringing them into the React architecture with proper component structure, hooks, and Redux integration where appropriate. -**Completed Features (v1.0 - v1.5):** +**Completed Features (v1.0 - v1.6):** 1. ✅ **Backing Track** - File-based audio playback with player controls 2. ✅ **JamTrack** - Collaborative track loading with mixdown selection 3. ✅ **Session Chat** - Real-time chat with message history and read/unread tracking @@ -14,9 +14,7 @@ Transform session features from the legacy web project into modern React pattern 5. ✅ **Session Settings Tests** - Jest unit tests and Playwright integration tests 6. ✅ **Memory Leak Prevention** - Fixed memory leaks causing session screen freezes (shipped 2026-02-10) 7. ✅ **Fix Session Recording** - Fixed C++ client crash and memory leaks (shipped 2026-02-25) - -**Current Milestone (v1.6):** -8. 🔧 **Media Features Polish** - Fix Metronome UI, Backing Track sync, JamTrack loading sequence +8. ✅ **Media Features Polish** - Fixed JamTrack loading, Backing Track sync, multiple media prevention (shipped 2026-03-03) **Future Work:** - Additional recording controls (track selection, playback, management) @@ -25,6 +23,15 @@ Transform session features from the legacy web project into modern React pattern ### Current State +**v1.6 Media Features Polish (SHIPPED 2026-03-03):** +- ✅ JamTrack loading sequence fixed (defer UI until backend ready) +- ✅ JamTrack player window sizing (460x350) without scrollbars +- ✅ "Create custom mix" navigation to JamTrack editor +- ✅ JamTrack callback cleanup (memory leak prevention) +- ✅ Backing track sync to session screen via Redux +- ✅ Async cleanup pattern for unmount state warnings +- ✅ Prevent opening multiple media players simultaneously + **v1.5 Fix Session Recording (SHIPPED 2026-02-25):** - ✅ Fixed C++ client crash on Start Recording (JSON parsing fix) - ✅ Timer cleanup for recording hook (waitingOnStopTimer) @@ -97,6 +104,15 @@ Transform session features from the legacy web project into modern React pattern - ✓ Conditional callback cleanup — v1.5 - ✓ 15+ minute recording stability — v1.5 +**Media Features Polish:** +- ✓ JamTrack defer UI until backend ready — v1.6 +- ✓ JamTrack window sizing (460x350) — v1.6 +- ✓ JamTrack "Create custom mix" navigation — v1.6 +- ✓ JamTrack callback cleanup — v1.6 +- ✓ Backing track sync to session screen — v1.6 +- ✓ Async cleanup for unmount warnings — v1.6 +- ✓ Prevent multiple media players — v1.6 + ### Out of Scope - **Additional recording controls** - Track selection, playback, management deferred @@ -118,6 +134,10 @@ Transform session features from the legacy web project into modern React pattern | Both test types | Jest for unit tests, Playwright for integration | Confirmed (v1.3) | | Conditional callback cleanup | Multiple hook instances share window.JK callbacks | Validated (v1.5) | | Ignore flag pattern | Prevents state updates on unmounted components | Validated (v1.5) | +| Defer JamTrack UI until synchronized | Prevents empty controls showing before backend ready | Validated (v1.6) | +| WindowPortal sizing 460x350 | Matches content dimensions plus padding for JamTrack | Validated (v1.6) | +| openBackingTrack action for sync | Centralized Redux + server sync for backing tracks | Validated (v1.6) | +| Prevent multiple media players | Only one media type (JamTrack/BackingTrack/Metronome) at a time | Validated (v1.6) | ## Constraints @@ -147,4 +167,4 @@ Transform session features from the legacy web project into modern React pattern - `jam-ui/src/store/features/mixersSlice.js` - Mixer state with removeVuState --- -*Last updated: 2026-02-25 after v1.5 Fix Session Recording milestone shipped* +*Last updated: 2026-03-03 after v1.6 Media Features Polish milestone shipped* diff --git a/.planning/ROADMAP.md b/.planning/ROADMAP.md deleted file mode 100644 index 23677aac6..000000000 --- a/.planning/ROADMAP.md +++ /dev/null @@ -1,61 +0,0 @@ -# Roadmap: JamKazam Media Features Modernization - -## Milestones - -- v1.0 Media Players (Phases 1-4) - SHIPPED 2026-01-14 -- v1.1 Music Session Chat (Phases 5-10) - SHIPPED 2026-01-27 -- v1.2 Session Attachments (Phases 11-14) - SHIPPED 2026-02-07 -- v1.3 Session Settings Tests (Phases 15-17) - SHIPPED 2026-02-08 -- v1.4 Memory Leak Prevention (Phases 18-22) - SHIPPED 2026-02-10 -- v1.5 Fix Session Recording (Phases 23-25) - SHIPPED 2026-02-25 -- **v1.6 Media Features Polish** (Phases 26-27) - IN PROGRESS - -## Overview - -v1.6 addresses usability issues in JamTrack (loading sequence bug, sizing, navigation) and Backing Track (sync integration). Metronome responsiveness was determined to be satisfactory after phases 26-27 improvements. - -## Phases - -- [x] **Phase 26: JamTrack Polish** - Fix loading sequence, sizing, navigation, and cleanup ✓ -- [x] **Phase 27: Backing Track Sync** - Enable track sync and async cleanup ✓ - -## Phase Details - -### Phase 26: JamTrack Polish -**Goal**: JamTrack player works correctly from selection through playback without freezes -**Depends on**: v1.5 complete -**Requirements**: JT-01, JT-02, JT-03, JT-04 -**Success Criteria** (what must be TRUE): - 1. User sees loading indicator while backend processes track (not premature stem UI) - 2. JamTrack player fits properly in popup window without scrollbars - 3. "Create custom mix" button opens JamTrack editor in new tab - 4. No console warnings about leaked callbacks when closing JamTrack or navigating away -**Plans**: 4 plans - -Plans: -- [x] 26-01-PLAN.md - Fix window sizing and create custom mix navigation ✓ -- [x] 26-02-PLAN.md - Add callback cleanup and defer controls rendering ✓ -- [x] 26-03-PLAN.md - Remove 'idle' from valid render states (gap closure) ✓ -- [x] 26-04-PLAN.md - Trigger loadJamTrack when not synchronized (gap closure) ✓ - -### Phase 27: Backing Track Sync -**Goal**: Backing Track appears in session screen when opened -**Depends on**: Nothing (independent of Phase 26) -**Requirements**: BT-01, BT-02 -**Success Criteria** (what must be TRUE): - 1. Opening a backing track file shows the track in session screen (not just popup) - 2. No "state update on unmounted component" warnings when closing backing track quickly -**Plans**: 1 plan - -Plans: -- [x] 27-01-PLAN.md - Use openBackingTrack action and add async cleanup ✓ - -## Progress - -| Phase | Milestone | Plans Complete | Status | Completed | -|-------|-----------|----------------|--------|-----------| -| 26. JamTrack Polish | v1.6 | 4/4 | Complete | 2026-02-25 | -| 27. Backing Track Sync | v1.6 | 1/1 | Complete | 2026-02-26 | - ---- -*v1.6 roadmap created 2026-02-25, updated 2026-03-03 (Phase 28 descoped)* diff --git a/.planning/STATE.md b/.planning/STATE.md index a040bf0f6..ef3e87552 100644 --- a/.planning/STATE.md +++ b/.planning/STATE.md @@ -2,30 +2,30 @@ ## Project Reference -See: .planning/PROJECT.md (updated 2026-02-25) +See: .planning/PROJECT.md (updated 2026-03-03) **Core value:** Modernize session features from legacy jQuery/Rails to React patterns -**Current focus:** v1.6 Media Features Polish - Phase 27 Backing Track Sync +**Current focus:** v1.6 complete — ready for next milestone planning ## Current Position -Phase: 27 of 28 (Backing Track Sync) -Plan: 1 of 1 in current phase (complete) -Status: Phase complete -Last activity: 2026-02-26 - Completed 27-01-PLAN.md +Phase: 27 of 27 (v1.6 complete) +Plan: All plans complete +Status: Milestone shipped +Last activity: 2026-03-03 — v1.6 Media Features Polish shipped -Progress: [████░░░░░░] 40% +Progress: [██████████] 100% ## Performance Metrics -**v1.0 - v1.5 Summary:** -- Total milestones shipped: 6 -- Total phases completed: 25 -- Total plans completed: 44 +**v1.0 - v1.6 Summary:** +- Total milestones shipped: 7 +- Total phases completed: 27 +- Total plans completed: 49 -**v1.6 Media Features Polish (In Progress):** -- Phases: 3 (phases 26-28) -- Requirements: 8 +**v1.6 Media Features Polish (SHIPPED 2026-03-03):** +- Phases: 2 (phases 26-27) +- Requirements: 6 shipped, 2 descoped - Plans completed: 5 (26-01, 26-02, 26-03, 26-04, 27-01) ## Accumulated Context @@ -35,16 +35,11 @@ Progress: [████░░░░░░] 40% See PROJECT.md Key Decisions table for full history. Recent decisions (v1.6): -- Keep WindowPortal for Metronome (consistency with JamTrack, BackingTrack, Chat) -- 300ms debounce for responsive UI while avoiding excessive native client calls -- WindowPortal sizing should match content dimensions plus padding (420px + 40px = 460px) -- Use noopener,noreferrer for security on window.open calls -- cleanupJamTrackCallbacks is a simple function (not thunk) since it only manipulates window globals -- Controls render when downloadState is 'synchronized' only (removed 'idle' from conditions) -- Call checkJamTrackSync BEFORE dispatching setSelectedJamTrack/setJamTrackStems -- Call loadJamTrack when syncResult.isSynchronized is false to trigger download flow -- Use openBackingTrack action instead of direct jamClient call for centralized sync -- Use ignore flag pattern (not AbortController) for simple async cleanup +- Defer JamTrack UI until synchronized (prevents empty controls) +- WindowPortal sizing 460x350 (matches content plus padding) +- openBackingTrack action for centralized Redux + server sync +- Prevent multiple media players (one at a time) +- Descope Metronome debounce (responsiveness satisfactory) ### Deferred Issues @@ -64,14 +59,13 @@ Recent decisions (v1.6): - **v1.3 Session Settings Tests** (Phases 17-18): Shipped 2026-02-08 - **v1.4 Memory Leak Prevention** (Phases 19-23): Shipped 2026-02-10 - **v1.5 Fix Session Recording** (Phases 24-25): Shipped 2026-02-25 -- **v1.6 Media Features Polish** (Phases 26-28): In Progress +- **v1.6 Media Features Polish** (Phases 26-27): Shipped 2026-03-03 ## Session Continuity -Last session: 2026-02-26 -Stopped at: Completed 27-01-PLAN.md (Phase 27 complete) +Last session: 2026-03-03 +Stopped at: v1.6 milestone complete Resume file: None **Next steps:** -1. `/gsd:verify-work 27` for manual UAT (recommended) -2. `/gsd:plan-phase 28` to plan next phase (if applicable) +1. `/gsd:new-milestone` — start next milestone (questioning → research → requirements → roadmap) diff --git a/.planning/REQUIREMENTS.md b/.planning/milestones/v1.6-REQUIREMENTS.md similarity index 77% rename from .planning/REQUIREMENTS.md rename to .planning/milestones/v1.6-REQUIREMENTS.md index 23be77607..c000ea2dd 100644 --- a/.planning/REQUIREMENTS.md +++ b/.planning/milestones/v1.6-REQUIREMENTS.md @@ -1,11 +1,17 @@ -# Requirements: v1.6 Media Features Polish +# Requirements Archive: v1.6 Media Features Polish -**Defined:** 2026-02-25 -**Core Value:** Fix usability issues in Backing Track and JamTrack features +**Archived:** 2026-03-03 +**Status:** ✅ SHIPPED + +This is the archived requirements specification for v1.6. +For current requirements, see `.planning/REQUIREMENTS.md` (created for next milestone). + +--- ## v1.6 Requirements -Requirements for polishing media player features. Each maps to roadmap phases. +**Defined:** 2026-02-25 +**Core Value:** Fix usability issues in Backing Track and JamTrack features ### JamTrack Fixes @@ -29,8 +35,6 @@ Requirements for polishing media player features. Each maps to roadmap phases. ## Out of Scope -Explicitly excluded for this milestone. - | Feature | Reason | |---------|--------| | Hide "about:blank" URL bar | Browser security constraint, cannot be changed | @@ -50,4 +54,12 @@ Explicitly excluded for this milestone. | BT-02 | Phase 27 | Complete | --- -*v1.6 requirements defined 2026-02-25, updated 2026-03-03 (Metronome fixes descoped)* + +## Milestone Summary + +**Shipped:** 6 of 6 v1.6 requirements (100%) +**Adjusted:** None +**Dropped:** MET-01, MET-02 (Metronome debounce) — descoped as responsiveness was satisfactory + +--- +*Archived: 2026-03-03 as part of v1.6 milestone completion* diff --git a/.planning/milestones/v1.6-ROADMAP.md b/.planning/milestones/v1.6-ROADMAP.md new file mode 100644 index 000000000..076d9ea0c --- /dev/null +++ b/.planning/milestones/v1.6-ROADMAP.md @@ -0,0 +1,81 @@ +# Milestone v1.6: Media Features Polish + +**Status:** ✅ SHIPPED 2026-03-03 +**Phases:** 26-27 +**Total Plans:** 5 + +## Overview + +v1.6 addressed usability issues in JamTrack (loading sequence bug, sizing, navigation) and Backing Track (sync integration). Metronome responsiveness was determined to be satisfactory after phases 26-27 improvements and was descoped. + +## Phases + +### Phase 26: JamTrack Polish +**Goal**: JamTrack player works correctly from selection through playback without freezes +**Depends on**: v1.5 complete +**Requirements**: JT-01, JT-02, JT-03, JT-04 +**Success Criteria** (what must be TRUE): + 1. User sees loading indicator while backend processes track (not premature stem UI) + 2. JamTrack player fits properly in popup window without scrollbars + 3. "Create custom mix" button opens JamTrack editor in new tab + 4. No console warnings about leaked callbacks when closing JamTrack or navigating away +**Plans**: 4 plans + +Plans: +- [x] 26-01-PLAN.md - Fix window sizing and create custom mix navigation ✓ +- [x] 26-02-PLAN.md - Add callback cleanup and defer controls rendering ✓ +- [x] 26-03-PLAN.md - Remove 'idle' from valid render states (gap closure) ✓ +- [x] 26-04-PLAN.md - Trigger loadJamTrack when not synchronized (gap closure) ✓ + +**Completed:** 2026-02-25 + +### Phase 27: Backing Track Sync +**Goal**: Backing Track appears in session screen when opened +**Depends on**: Nothing (independent of Phase 26) +**Requirements**: BT-01, BT-02 +**Success Criteria** (what must be TRUE): + 1. Opening a backing track file shows the track in session screen (not just popup) + 2. No "state update on unmounted component" warnings when closing backing track quickly +**Plans**: 1 plan + +Plans: +- [x] 27-01-PLAN.md - Use openBackingTrack action and add async cleanup ✓ + +**Completed:** 2026-02-26 + +--- + +## Milestone Summary + +**Descoped Phases:** +- Phase 28: Metronome Responsiveness — descoped as responsiveness was satisfactory after Phase 26-27 improvements + +**Key Decisions:** +- Keep WindowPortal for Metronome (consistency with JamTrack, BackingTrack, Chat) +- 300ms debounce for responsive UI while avoiding excessive native client calls +- WindowPortal sizing should match content dimensions plus padding (420px + 40px = 460px) +- Use noopener,noreferrer for security on window.open calls +- cleanupJamTrackCallbacks is a simple function (not thunk) since it only manipulates window globals +- Controls render when downloadState is 'synchronized' only (removed 'idle' from conditions) +- Call checkJamTrackSync BEFORE dispatching setSelectedJamTrack/setJamTrackStems +- Call loadJamTrack when syncResult.isSynchronized is false to trigger download flow +- Use openBackingTrack action instead of direct jamClient call for centralized sync +- Use ignore flag pattern (not AbortController) for simple async cleanup + +**Issues Resolved:** +- JamTrack player showed empty controls before backend processing complete +- JamTrack player window had scrollbars due to incorrect sizing +- "Create custom mix" button did nothing +- Memory leaks from unreleased JamTrack callbacks +- Backing track didn't appear in session screen (only popup) +- State update warnings when closing backing track quickly + +**Issues Deferred:** +- Metronome debounce (MET-01, MET-02) — responsiveness satisfactory + +**Technical Debt Incurred:** +- None identified + +--- +*For current project status, see .planning/ROADMAP.md* +*Archived: 2026-03-03*