diff --git a/COMPLETED.md b/COMPLETED.md index deef77d..72542b4 100644 --- a/COMPLETED.md +++ b/COMPLETED.md @@ -614,3 +614,43 @@ flips to fixed-lane mode, and whether the leftover empty default lane 0 is silen closed with no label (discarded by REAPER) when the plan is non-empty but every write was already satisfied, so no phantom undo points accumulate. - **Review passed** with no Critical or Major findings. + +--- + +## D2-W3-B — item-level mode actions + W3-A polish +**Goal:** Item-level lane/mode-management actions mirroring the track-level Design +View tag family (bindable in the Actions list), plus the three code-review polish +items carried from D2-W3-A. The persist slice and lane-ownership index round-trip +were completed in D2-W3-A; this wave closes the remaining action surface and +cleans up the implementation. +See CONTEXT.md §Two-canvas sub-phase (Module architecture — persistence). +**Verify (in DAW):** Item mode actions registered and MIDI-bindable in the Actions +list; re-drive mint/apply so each item lands on its mode's managed lane; manual-lane +items exempt; one undo block per action. ctest 14/14 green. +**Depends on:** D2-W3-A. + +- [x] "Move selected items → Design" action (`CEREBELLUM_REASAMPLER_VIEW_` family): + retags selected items' membership to Design mode, re-drives the existing mint/apply + so each item lands on its mode's managed lane; manual-lane items exempt; one undo + block. +- [x] "Move selected items → Arrange" action: retags selected items' membership to + Arrange mode, re-drives mint/apply; manual-lane items exempt; one undo block. +- [x] "Untag selected items" action: removes selected items' membership, re-drives + mint/apply; manual-lane items exempt; one undo block. +- [x] All three registered (`command_id`/`gaccel`/`hookcommand`); MIDI-bindable. +- [x] W3-A polish — simplified `applyMintPlan`'s redundant `I_NUMFIXEDLANES` re-read: + single grow-and-track pass removes the second `GetMediaTrackInfo_Value` call inside + the mint loop. +- [x] W3-A polish — extracted shared item-read seam (`src/item_read.{h,cpp}`): + removes duplicated `itemGuid`/`itemLaneName` read logic from `view.cpp` and + `bank_panel.cpp`. +- [x] W3-A polish — added reconcile guard in `reconcileManagedLanes`: skips lanes + encoding an unregistered mode id (log and skip rather than silently recording an + orphaned ownership entry). + +**Notes/decisions:** +- ctest 14/14 green; review passed with no Critical or Major findings. +- **Panel UI indicator explicitly deferred** (Daniel's decision): a per-track + lane-split marker has no natural cheap home in the bank panel; the mode switch + already shows the active mode. Preserved as a deferred/backlog note in PLAN.md + Phase D2 — not silently dropped. diff --git a/PLAN.md b/PLAN.md index 4273d95..12a08ab 100644 --- a/PLAN.md +++ b/PLAN.md @@ -119,32 +119,14 @@ landed milestone. > point lands, doc-keeper moves it to `COMPLETED.md`. > > **D2-W1 (pure lane extension), D2-W2 (shell: lane application + new-content -> detection), and D2-W3-A (lane minting + item→lane assignment + persist -> round-trip) have landed** — see `COMPLETED.md`. - -## D2-W3-B — two-canvas actions + panel UI indicators -**Goal:** Any new lane/mode-management actions (bindable in the Actions list), and -any panel UI indicator for lane/mode state. The persist slice and the -lane-ownership index round-trip were completed in D2-W3-A; this wave closes the -remaining UI and action surface. -See CONTEXT.md §Two-canvas sub-phase (Module architecture — persistence). -**Verify (in DAW):** Lane/mode-management actions are registered and bindable in -the Actions list; the panel UI indicator reflects the current lane/mode state. -**Depends on:** D2-W3-A. - -- [ ] Any new lane/mode-management actions (`command_id`/`gaccel`/`hookcommand`); - bindable in the Actions list. -- [ ] Any panel UI indicator for lane/mode state. - -**D2-W3-A code-review polish (fold into this wave):** -- [ ] Simplify the redundant per-mint `I_NUMFIXEDLANES` re-read in `view.cpp` - (`applyMintPlan`): a single grow-and-track pass removes the second - `GetMediaTrackInfo_Value` call inside the mint loop. -- [ ] Optional shared item-read helper to remove duplicated `itemGuid`/`itemLaneName` - read logic between `view.cpp` and `bank_panel.cpp`. -- [ ] Optional defensive note/check in `reconcileManagedLanes` for the edge case - where a managed lane name encodes an unregistered mode id (log and skip rather - than silently record an orphaned ownership entry). +> detection), D2-W3-A (lane minting + item→lane assignment + persist round-trip), +> and D2-W3-B (item-level mode actions + W3-A polish) have all landed** — see +> `COMPLETED.md`. **Phase D2 is functionally complete.** +> +> **Deferred:** panel UI indicator for per-track lane/mode state (a per-track +> lane-split marker). The mode switch already shows the active mode; no natural +> cheap home for a per-track indicator was found in the bank panel. Explicitly +> deferred — not silently dropped. Can be picked up later if wanted. ---