docs: archive Phase L L5 to COMPLETED; reconcile CLAUDE.md + CONTEXT.md + PLAN.md

This commit is contained in:
2026-07-27 00:14:38 -04:00
parent 5009cafc59
commit 7961458edd
4 changed files with 97 additions and 133 deletions
+8 -2
View File
@@ -4,7 +4,7 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co
## Repo identity and current state
The CMake project and binary are now named `reaper_reasampler`. This is **ReaSampler** — a per-project audio sample-bank capture tool. The MPE modules (`mpe_model`, `mpe_view`) have been removed. M0M8 are complete (bank_model, peaks, capture offline+realtime, persist, bank_panel, insert, capture action family, RealtimeRecordBackend, tail T1+T2+T1-followons). Phase B multi-bank (B1B5, B-cap), Phase D1/D2 Design View (D1D5, D2-W1W3-B), Phase V versioning/beta-channel (V1/V3, V4), M10 provenance + re-capture from source, Phase R Reclaim (R1R3: prune-reconcile core, dry-run shell, guarded deletion + action + panel button), M11 in full (batch capture, action-button strip + keybinding labels, conform-on-insert verified-extant, native OS drag-out), Phase L L1 (shared LICE drawing kit: `theme`/palette module, `component_geometry` geometry helpers, `draw_kit` shell, GDI DrawText retired in `bank_panel`), Phase L L2 (dock-panel layout redesign: `action_bar` pure task-grouped layout module, full M11-aware button inventory placed by task cluster, `bank_panel` redesigned through the L1 kit), and Phase L L4 (dock-panel button layout enhancement: three-zone layout — top capture/placement/maintenance toolbar, bottom Design-View tagging/switching toolbar, footer narrow-toggle + Tail-button + Prune; `footer_bar` pure module + `footer_bar_tests`; `ActionCluster::Tagging`/`Switching` in `action_bar`) have all landed. M9 slots deferred indefinitely. The *discipline* — pure REAPER-free testable core split from REAPER-facing shells — is **preserved** throughout.
The CMake project and binary are now named `reaper_reasampler`. This is **ReaSampler** — a per-project audio sample-bank capture tool. The MPE modules (`mpe_model`, `mpe_view`) have been removed. M0M8 are complete (bank_model, peaks, capture offline+realtime, persist, bank_panel, insert, capture action family, RealtimeRecordBackend, tail T1+T2+T1-followons). Phase B multi-bank (B1B5, B-cap), Phase D1/D2 Design View (D1D5, D2-W1W3-B), Phase V versioning/beta-channel (V1/V3, V4), M10 provenance + re-capture from source, Phase R Reclaim (R1R3: prune-reconcile core, dry-run shell, guarded deletion + action + panel button), M11 in full (batch capture, action-button strip + keybinding labels, conform-on-insert verified-extant, native OS drag-out), Phase L L1 (shared LICE drawing kit: `theme`/palette module, `component_geometry` geometry helpers, `draw_kit` shell, GDI DrawText retired in `bank_panel`), Phase L L2 (dock-panel layout redesign: `action_bar` pure task-grouped layout module, full M11-aware button inventory placed by task cluster, `bank_panel` redesigned through the L1 kit), Phase L L4 (dock-panel button layout enhancement: three-zone layout — top capture/placement/maintenance toolbar, bottom Design-View tagging/switching toolbar, footer narrow-toggle + Tail-button + Prune; `footer_bar` pure module + `footer_bar_tests`; `ActionCluster::Tagging`/`Switching` in `action_bar`), and Phase L L5 (dock-panel button refinements: top-bar overflow menu for Batch Items/Batch Razor/Capture RT via `overflow_menu` pure module; custom LICE-kit hover-delay tooltips via `tooltip` pure module; four opposite-mode Item/Track tag buttons + Show Both on the bottom toolbar; Toggle + Activate-Arrange/Design buttons removed; grouping spacing widened — `mode_enable` pure opposite-mode enablement predicate) have all landed. M9 slots deferred indefinitely. The *discipline* — pure REAPER-free testable core split from REAPER-facing shells — is **preserved** throughout.
CONTEXT.md is the authoritative spec and build roadmap. Read it first for any non-trivial task. Every REAPER API name cited there is correct-by-intent; verify argument order, types, and flag values against `vendor/reaper-sdk/sdk/reaper_plugin_functions.h` before use.
@@ -46,6 +46,9 @@ Key targets (see CMakeLists.txt for the full list):
| `component_geometry_tests` | executable | Pure unit tests for `component_geometry` — no REAPER, no DAW. |
| `action_bar_tests` | executable | Pure unit tests for `action_bar` — no REAPER, no DAW. |
| `footer_bar_tests` | executable | Pure unit tests for `footer_bar` — no REAPER, no DAW. |
| `overflow_menu_tests` | executable | Pure unit tests for `overflow_menu` — no REAPER, no DAW. |
| `mode_enable_tests` | executable | Pure unit tests for `mode_enable` — no REAPER, no DAW. |
| `tooltip_tests` | executable | Pure unit tests for `tooltip` — no REAPER, no DAW. |
| `reaper_reasampler` | loadable module | The actual extension binary (`.dll` / `.dylib` / `.so`). |
### Beta channel build (Phase V, V4)
@@ -91,11 +94,14 @@ There is no hot-reload. Copy the built binary into REAPER's `UserPlugins/` folde
- `component_geometry` — Phase L pure component geometry/hit-test helpers (L1): button/slider/list-row geometry + hover hit-test. No LICE or REAPER types. Mirror of `mode_switch`/`bank_grid`.
- `action_bar` — Phase L pure task-grouped action-bar layout/hit-test (L2 + L4): clusters (Capture / Placement / Maintenance / Tagging / Switching), per-button label + keybinding micro sub-rects, whole-trailing-button overflow, point→index hit-test. `ActionCluster::Tagging` and `ActionCluster::Switching` added in L4 for the bottom Design-View toolbar. No LICE or REAPER types. Mirror of `mode_switch`/`bank_grid`/`action_buttons`.
- `footer_bar` — Phase L pure footer layout/hit-test (L4): narrow `[Arrange|Design]` mode-toggle geometry + per-mode count label, Tail button, and Prune placement in the panel footer strip. No LICE or REAPER types. Mirror of `mode_switch` / `prune_button`.
- `overflow_menu` — Phase L pure overflow-menu-button geometry/reserve/hit-test (L5): right-anchored More (⋯) button rect computation and hit-test for the top-toolbar overflow. No LICE or REAPER types. Mirror of `prune_button`.
- `mode_enable` — Phase L pure opposite-mode enablement predicate (L5): given the active mode, computes per-button live/disabled state for the four Item/Track × Arrange/Design tag buttons on the bottom toolbar. No LICE or REAPER types.
- `tooltip` — Phase L pure tooltip placement + prefix-strip (L5): custom LICE-kit hover-delay tooltip geometry and text derivation — strips the `ReaSampler:` display prefix from the registered action phrase; tooltip box width clamped to the client rect. No LICE or REAPER types.
**REAPER-facing shells:**
- `capture``ICaptureBackend` interface; `OfflineRenderBackend` (deterministic default) and `RealtimeRecordBackend`. Input: `CaptureRequest`. Output: finished file + populated `Sample` handed to `bank_model`.
- `insert` — placement via `InsertMedia`; conform-to-project-tempo is an explicit opt-in flag, never silent stretching.
- `bank_panel` — docked LICE-drawn grid: thumbnails, audition, multi-select, keyboard navigation; three-zone layout (L4): **top toolbar** = capture cluster (capture item, capture track, batch items, batch razor, capture RT) + placement cluster (insert, insert-conform) + maintenance cluster (re-capture, cancel-realtime) via `action_bar`, firing each action via `NamedCommandLookup` + `Main_OnCommand` and showing live keybinding labels via `kbd_getTextFromCmd`; **bottom toolbar** = Design View tagging + switching verbs (`ActionCluster::Tagging` / `ActionCluster::Switching`) firing the registered `VIEW_*` actions; **footer** = narrow `[Arrange|Design]` toggle · per-mode count · Tail button (cycles tail on click, proper kit button states) · set-apart `warn` Prune (rightmost) via `footer_bar`; entire panel draws through the L1 kit by palette role with hover on interactive elements, single `KitColor→LICE_pixel` boundary via `draw_kit`; OS drag-out hook (M11) initiating an OS-level copy drag when the pointer leaves the panel client rect, via `drag_out` + `drag_out_win`.
- `bank_panel` — docked LICE-drawn grid: thumbnails, audition, multi-select, keyboard navigation; three-zone layout (L4/L5): **top toolbar** = capture cluster (Capture Item, Capture Track) + placement cluster (Insert, Insert Conform) + maintenance cluster (Re-capture, Cancel RT) via `action_bar`, each firing via `NamedCommandLookup` + `Main_OnCommand` with live keybinding labels via `kbd_getTextFromCmd`; a right-anchored **More (⋯) overflow menu button** (`overflow_menu`) opens a `TrackPopupMenu` listing Batch Items / Batch Razor / Capture RT; **hover tooltips** (`tooltip`) show the full action name with the `ReaSampler:` prefix stripped, sourced from the registered action phrase; **bottom toolbar** = four opposite-mode tag buttons (Item: Arrange / Item: Design / Track: Arrange / Track: Design — live only for the opposite of the active mode, `Disabled` otherwise via `mode_enable`) + set-apart Show Both (`VIEW_SHOW_BOTH`); Toggle and Activate-Arrange/Activate-Design buttons removed (actions stay registered); grouping `clusterGap` 24 / `buttonGap` 4; **footer** = narrow `[Arrange|Design]` toggle · per-mode count · Tail button (cycles tail on click, proper kit button states) · set-apart `warn` Prune (rightmost) via `footer_bar`; entire panel draws through the L1 kit by palette role with hover on interactive elements, single `KitColor→LICE_pixel` boundary via `draw_kit`; OS drag-out hook (M11) initiating an OS-level copy drag when the pointer leaves the panel client rect, via `drag_out` + `drag_out_win`.
- `persist` — project ext state (`SetProjExtState` / `GetProjExtState`, namespace `"reasampler"`) ↔ `BankBook` JSON (`"banks"` key) + `ViewModeModel` JSON (`"view_state"` key) + `TailSetting` JSON (`"tail_setting"` key) + `OwnedManifest` JSON (`"owned_files"` key) + writing-version stamp (`"version"` key, written via `stampVersion()` on every `saveToActiveProject()`); project-relative path resolution. A `projectconfig` hook (`BeginLoadProjectState(isUndo)`) triggers a deferred session reload on undo/redo so Ctrl-Z/redo visibly restores book/view/tail/manifest in-session. Hosts `ReaSamplerSession::pruneDryRun()` (read-only orphan enumeration via M4 project-relative resolution) and `pruneOrphanSet()` (full-set query for the R3 delete path); supplies `referencedPaths()` + `owned().paths()` to the `prune_reconcile` pure core.
- `view` — Design View shell: reads the folder tree via `view_tree`, snapshots flag values before parking, drives hide + CPU-park on inactive-mode leaves (`B_SHOWINTCP`/`B_SHOWINMIXER`/`B_MAINSEND`/`I_FXEN` + per-FX offline) and derived visibility on parents; restores from snapshot. Never touches master or `B_MUTE`/`I_SOLO`.
- `track_guid` — shared `MediaTrack*` → canonical GUID-string formatter; single source of truth for membership keys used by both the view shell and the actions layer.
+53
View File
@@ -1348,3 +1348,56 @@ never auto-insert (the buttons only fire the existing, unchanged actions).
Tail button + Prune); no LICE or REAPER types. New CTest target `footer_bar_tests`.
- `action_bar` gained `ActionCluster::Tagging` and `ActionCluster::Switching` for the
bottom-toolbar Design View verb groups.
---
## L5 — dock-panel button refinements
**Goal:** Refine the L4 three-zone toolbar so the button faces read cleanly and group
legibly — an overflow menu for the rare capture variants, short faces with full-name
tooltips (no `ReaSampler:` prefix), an opposite-mode tag-button set, removal of the now-
redundant Toggle and Activate-Arrange/Design buttons, and semantic-grouping spacing.
**No new capture/placement behavior**; every button fires an existing registered action
(the "capture ≠ placement" principle is untouched). Ungated by Phase S; sequences after L4.
**Verify (in DAW):** the top bar shows only frequent capture/placement/maintenance buttons +
a right-anchored More (⋯) menu that fires Batch Items / Batch Razor / Capture RT; hover
tooltip shows the full action name with `ReaSampler:` prefix stripped; the bottom bar shows
four Item/Track × Arrange/Design tag buttons with only the opposite-mode pair live (disabled
pair visibly greyed via the kit `Disabled` state) and no Toggle button; cluster groups read
as groups. All buttons fire the same actions their keybindings do.
- [x] Top-toolbar overflow: Batch Items / Batch Razor / Capture RT pulled off the visible bar
into a right-anchored **More (⋯) menu button** (kit-drawn button + `TrackPopupMenu` popup);
each entry fires its existing command id. Pure layout owns the menu-button rect + hit-test
(`overflow_menu` pure module); the popup + dispatch is shell.
- [x] Short faces + drop `ReaSampler:` prefix on the button *face*; keep the keybinding micro
sub-row.
- [x] **Hover tooltip carrying the full action name (prefix stripped)** via a **custom LICE-kit
hover-delay tooltip** (`tooltip` pure module): sourced from the registered action phrase
(not `kbd_getTextFromCmd`); `ReaSampler:` prefix stripped at draw time; tooltip box width
clamped to the client so it never overhangs a narrow dock. The keybinding sub-row still uses
the live binding from `kbd_getTextFromCmd`.
- [x] Bottom-toolbar four tag buttons: **Item: Arrange / Item: Design / Track: Arrange /
Track: Design**, wired to the existing item-move (`VIEW_MOVE_ITEMS_ARRANGE` /
`VIEW_MOVE_ITEMS_DESIGN`) + track-tag (`VIEW_TAG_ARRANGE` / `VIEW_TAG_DESIGN`) actions.
- [x] **Opposite-mode enablement:** a button is live iff its target mode ≠ the active mode;
otherwise drawn `Disabled` (kit disabled state, `TextDim`) and its click is a no-op. Pure
predicate (`mode_enable` pure module) unit-tested; shell reads `view().activeModeId()` once
per draw and applies.
- [x] **Activate-Arrange / Activate-Design / Toggle buttons removed** from the bottom toolbar
(all three actions stay registered; footer toggle owns mode switching). **Show Both** kept
as a set-apart button on the bottom toolbar.
- [x] Semantic-grouping spacing widened: `clusterGap` 16→24 (`buttonGap` remains 4; 6:1 ratio)
on both toolbars so clusters read as groups.
**Notes/decisions:**
- **Activate-Arrange / Activate-Design / Toggle FORK resolved (Daniel):** all three removed
from the bottom toolbar. The footer `[Arrange|Design]` toggle is the single mode-switch
affordance; the bottom bar is tagging + Show Both only.
- **Tooltip mechanism resolved as custom LICE-kit hover-delay tooltip** (DS-1 "keep drawing in
the kit"): avoids attaching a SWELL tooltip control to non-child LICE rects. SWELL is the
Win32-emulation layer for macOS/Linux and is not the mechanism used here; on Windows the
path is native, and the chosen implementation is a custom kit-drawn tooltip.
- New pure modules: `src/overflow_menu.{h,cpp}` (menu-button geometry/reserve/hit-test),
`src/mode_enable.{h,cpp}` (opposite-mode enablement predicate), `src/tooltip.{h,cpp}`
(placement + prefix-strip). New CTest targets `overflow_menu_tests`, `mode_enable_tests`,
`tooltip_tests`.
+17 -25
View File
@@ -1583,12 +1583,12 @@ adds a **hover tooltip showing the FULL action name with the `ReaSampler:` displ
stripped.** Note the prefix (`actionDisplayPrefix()`) is baked into the *registered gaccel
action name*, not the button face — so the tooltip derives the full name and strips the prefix
for display; the button face never carried the prefix. The keybinding stays on the existing
`micro` sub-row. **Tooltip mechanism is a build-time choice (staff-engineer):** SWELL's tooltip
control vs. a custom hover-delay kit tooltip. **Recommended: a custom hover-delay kit tooltip**
it owns its own hover timer + LICE overlay draw, stays inside the L1 kit (DS-1 "keep drawing in
the kit"), and avoids attaching a SWELL tooltip control to non-child LICE rects (awkward for
dynamically-tiled buttons). The hover-timer threshold + overlay draw are the only DAW-bound
pieces; the "which button, what text" decision stays pure.
`micro` sub-row. **Tooltip mechanism: custom LICE-kit hover-delay tooltip** (`tooltip` pure
module) — owns its own hover timer + LICE overlay draw, stays inside the L1 kit (DS-1 "keep
drawing in the kit"). Sourced from the registered action phrase (not `kbd_getTextFromCmd`);
`ReaSampler:` prefix stripped at draw time; tooltip box width clamped to the client so it never
overhangs a narrow dock. The hover-timer threshold + overlay draw are the only DAW-bound pieces;
the "which button, what text" decision stays pure.
**3. Bottom-toolbar Item/Track × Arrange/Design tag buttons, opposite-mode-only.** The current
`Tag Design` / `Untag` pair is replaced by **four buttons — "Item: Arrange", "Item: Design",
@@ -1618,21 +1618,15 @@ bodies exactly (no selection semantics change).
`[Arrange|Design]` toggle (L4) already covers mode switching. **The action stays registered**
(keybinding-bound, FOREVER-STABLE id unchanged); only its *button home* is removed.
**Fate of Activate-Arrange / Activate-Design / Show-Both (FORK — Daniel's call).** These three
`Switching`-cluster buttons overlap the footer toggle to varying degrees:
- `VIEW_ACTIVATE_ARRANGE` / `VIEW_ACTIVATE_DESIGN`**direct** mode jumps. With the footer
toggle present, they are largely redundant on the bar (the toggle *is* an Arrange/Design
switch). **Recommendation: DROP both from the bottom toolbar** (actions stay registered), so
the footer toggle is the single mode-switch affordance and the bottom bar is tagging-only.
- `VIEW_SHOW_BOTH` — the cross-mode "pin visible in every mode" escape hatch. It is **not**
covered by the footer toggle (it is a per-track pin, not a mode switch). **Recommendation:
KEEP it** — as a lone button, or folded into a small `⋯` bottom-bar menu alongside any other
rare view verbs.
- **Recommended final bottom-toolbar inventory:** `[ Item: Arrange | Item: Design ] · [ Track:
Arrange | Track: Design ] ⟩⟩ [ Show Both ]` — Tagging cluster (four opposite-mode buttons)
set apart from a lone `Show Both`. No Toggle, no Activate-Arrange/Design (footer toggle owns
switching). **Daniel decides whether to keep Activate-Arrange/Design as bar buttons and
whether Show-Both stays a button or moves to a menu.**
**Fate of Activate-Arrange / Activate-Design / Show-Both (FORK — RESOLVED, Daniel's call).**
- `VIEW_ACTIVATE_ARRANGE` / `VIEW_ACTIVATE_DESIGN`**dropped from the bottom toolbar** (actions
stay registered, FOREVER-STABLE ids unchanged). The footer `[Arrange|Design]` toggle is the
single mode-switch affordance; the bottom bar is tagging + Show Both only.
- `VIEW_SHOW_BOTH`**kept** as a set-apart button on the bottom toolbar. It is the cross-mode
"pin visible in every mode" escape hatch and is not covered by the footer toggle.
- **Landed bottom-toolbar inventory:** `[ Item: Arrange | Item: Design ] · [ Track: Arrange |
Track: Design ] ⟩⟩ [ Show Both ]` — Tagging cluster (four opposite-mode buttons) set apart
from a lone `Show Both`. No Toggle, no Activate-Arrange/Design (footer toggle owns switching).
**5. Semantic-grouping spacing.** L4's `kBarSpec` is `buttonGap=4` / `clusterGap=16` (4:1). With
the bottom bar's cluster boundary now more meaningful (four tag buttons vs. the `Show Both`
@@ -1654,10 +1648,8 @@ editor (`IPlugView` LICE surface), the S6 embed strip, and the keyboard strip li
Phase S, which is **not on dev yet** (it exists on the phase-s worktree). L3 cannot be
built on dev until Phase S's editor/embed surfaces (≈ S1 / S6 / S10) merge to dev — **the
Phase L team must not chase these files on dev; they are not there.** Until then L3 is a
planned, blocked point; L1, L2, and **L4 (dock-panel button layout enhancement) have all
landed**. L4 is independent of the L3 gate. **L5 (dock-panel button refinements — §L5 above)
is the live forward Phase L point**: ungated by Phase S, sequences after L4, also independent
of the L3 gate.
planned, blocked point; L1, L2, L4, and **L5 have all landed** — see `COMPLETED.md`. L4 and L5
are independent of the L3 gate.
**Coordination contract (load-bearing):** Phase S's S10S13 build their interaction UX with
the **current** drawing and **adopt the L1 kit when it is available — they are NOT gated on
+19 -106
View File
@@ -284,17 +284,18 @@ build:** the `IReaperUIEmbedInterface` contract + embed message/lifecycle agains
> directions: `docs/product/visual-design-language.md`. When a point lands, doc-keeper
> moves it to `COMPLETED.md`.
>
> **L1 (shared LICE drawing kit — the foundation), L2 (dock-panel layout redesign), and L4
> (dock-panel button layout enhancement) have landed** — `theme`/palette module,
> `component_geometry` geometry/hit-test helpers, `draw_kit` shell, GDI `DrawText` retirement
> in `bank_panel` (L1); `action_bar` pure task-grouped layout module, full M11-aware button
> inventory placed by task cluster, `bank_panel` redesigned through the L1 kit (L2); three-zone
> layout (top capture/placement/maintenance toolbar, bottom Design-View toolbar, footer toggle +
> Tail button + Prune), `footer_bar` pure module, `ActionCluster::Tagging`/`Switching` in
> `action_bar` (L4). See `COMPLETED.md`. **L5 (dock-panel button refinements — overflow menu,
short-face+tooltip labels, opposite-mode Item/Track tag buttons, Toggle removal, grouping
spacing) is the live forward point** — ungated by Phase S, sequences after L4. **L3 remains**
L3 gated on Phase S landing on dev.
> **L1 (shared LICE drawing kit — the foundation), L2 (dock-panel layout redesign), L4
> (dock-panel button layout enhancement), and L5 (dock-panel button refinements) have landed** —
> `theme`/palette module, `component_geometry` geometry/hit-test helpers, `draw_kit` shell, GDI
> `DrawText` retirement in `bank_panel` (L1); `action_bar` pure task-grouped layout module, full
> M11-aware button inventory placed by task cluster, `bank_panel` redesigned through the L1 kit
> (L2); three-zone layout (top capture/placement/maintenance toolbar, bottom Design-View toolbar,
> footer toggle + Tail button + Prune), `footer_bar` pure module, `ActionCluster::Tagging`/
> `Switching` in `action_bar` (L4); top-bar overflow menu (`overflow_menu` pure module),
> custom LICE-kit hover-delay tooltips (`tooltip` pure module), opposite-mode Item/Track tag
> buttons + Show Both, Toggle + Activate-Arrange/Design buttons removed, grouping spacing
> widened (`mode_enable` pure module) (L5). See `COMPLETED.md`. **L3 remains** — L3 gated on
> Phase S landing on dev.
>
> **This section is self-contained for a team without Phase S context.** Where a point
> touches a Phase S surface (the VST editor, the embed strip, the keyboard strip), the
@@ -371,101 +372,16 @@ work.
state — never a pulse, per the speed constraint) as the signature surface; VST3 class UID
unchanged. (Gated.)
## L5 — dock-panel button refinements (ungated; sequences after L4)
**Goal:** Refine the L4 three-zone toolbar so the button faces read cleanly and group
legibly — an overflow menu for the rare capture variants, short faces with full-name
tooltips (no `ReaSampler:` prefix), an opposite-mode tag-button set, removal of the now-
redundant Toggle, and semantic-grouping spacing. **No new capture/placement behavior**;
every button fires an existing registered action (the "capture ≠ placement" principle is
untouched). **Ungated by Phase S** (the dock panel is on dev) and **independent of the L3
gate.** Drawn through the L1 kit in the DS-2 grey-neutral + three-accent-pastel palette
(prune stays `warn`); **no palette or font decision is re-opened here.** Authoritative
contract: CONTEXT.md §L5.
**The five refinements:**
1. **Top-toolbar overflow menu.** The three less-frequent capture variants — **Batch Items,
Batch Razor, Capture RT** — move OFF the visible top bar into a **"⋯ / More" menu button
at the far right of the top toolbar** (a REAPER `TrackPopupMenu` popup listing the three,
each firing its existing command id). The frequent acts stay on the bar: **Capture Item,
Capture Track** (Capture), **Insert, Insert Conform** (Placement), **Re-capture, Cancel RT**
(Maintenance). This is a re-home of existing rows into a menu — no action changes.
2. **Short faces + full-name tooltips; drop the `ReaSampler:` prefix.** Button *faces*
already carry a terse label (`ActionBarRow.shortLabel`) — this formalizes them and adds a
**hover tooltip carrying the FULL action name** (without the `ReaSampler:` display prefix,
which `actionDisplayPrefix()` bakes into the registered gaccel name — the tooltip strips
it). The keybinding stays on the existing `micro` sub-row. Tooltip *mechanism* is an
implementation choice flagged for staff-engineer (see the sub-item below).
3. **Bottom-toolbar tag buttons — Item/Track × Arrange/Design, opposite-mode-only.** Replace
the current `Tag Design` / `Untag` pair with **four buttons: "Item: Arrange", "Item:
Design", "Track: Arrange", "Track: Design".** Each is **live only for the OPPOSITE of the
active mode** and drawn `Disabled` otherwise: when **Design is active**, only the "…:
Arrange" buttons are live (they send the selection to Arrange) and the "…: Design" buttons
are disabled; when **Arrange is active**, the reverse. Item buttons fire the existing
item-move actions (`VIEW_MOVE_ITEMS_ARRANGE` / a Design item-move); Track buttons fire the
existing track-tag actions (`VIEW_TAG_ARRANGE` (= untag) / `VIEW_TAG_DESIGN`). **Both action
families already exist** (research confirmed) — this is layout + enablement wiring, not new
feature work.
4. **Remove the redundant Toggle button.** `VIEW_TOGGLE_MODE` leaves the bottom toolbar — the
footer's `[Arrange|Design]` toggle switch (landed in L4) already covers it. The action stays
registered (keybinding-bound); only its button home is removed. **Fate of Activate-Arrange /
Activate-Design / Show-Both is a FORK for Daniel** (see below) — recommended resolution
captured in CONTEXT.md §L5.
5. **Semantic-grouping spacing.** Inter-cluster gaps must read visibly wider than intra-cluster
gaps so clusters parse as groups. Current `kBarSpec` is `buttonGap=4` / `clusterGap=16`
(a 4:1 ratio). With the bottom bar's cluster boundaries now more meaningful (four tag
buttons vs. the switching remnant), widen the ratio if the groups still don't read — target
`buttonGap=4` / `clusterGap=24` (6:1) as the starting point, tuned in-DAW.
**Verify (in DAW):** the top bar shows only frequent capture/placement/maintenance buttons +
a right-anchored More menu that fires Batch Items / Batch Razor / Capture RT; button faces
are short with no `ReaSampler:` prefix and a hover tooltip shows the full action name; the
bottom bar shows four Item/Track × Arrange/Design tag buttons with only the opposite-mode
pair live (disabled pair visibly greyed via the kit `Disabled` state) and no Toggle button;
cluster groups read as groups. All buttons fire the same actions their keybindings do.
**Depends on:** L1 (the kit — `Disabled` interaction state, `kitText`) **AND** L4 (the
`action_bar` two-toolbar + `footer_bar` layout this refines). **Sequences after L4.** Ungated
by Phase S; independent of the L3 gate.
- [ ] Top-toolbar overflow: pull Batch Items / Batch Razor / Capture RT off the visible bar
into a right-anchored **More menu button** (kit-drawn button + `TrackPopupMenu` popup);
each entry fires its existing command id. Pure layout owns the menu-button rect + hit-test
(extend/mirror `action_bar` / `prune_button`); the popup + dispatch is shell.
- [ ] Short faces + drop `ReaSampler:` prefix on the button *face*; keep the keybinding micro
sub-row. Define/confirm the terse face label per button.
- [ ] **Hover tooltip carrying the full action name (prefix stripped).** *Mechanism is a
build-time choice for staff-engineer* — SWELL tooltip API vs. a custom hover-delay kit
tooltip draw. **Recommend: a custom hover-delay kit tooltip** (owns its own timing + draw,
consistent with the LICE kit and DS-1's "keep drawing in the kit"; SWELL's tooltip control
is awkward to attach to non-child LICE rects). Final call at build.
- [ ] Bottom-toolbar four tag buttons: **Item: Arrange / Item: Design / Track: Arrange /
Track: Design**, wired to the existing item-move + track-tag actions (no new actions).
- [ ] **Opposite-mode enablement rule:** a button is live iff its target mode ≠ the active
mode; otherwise drawn `Disabled` (kit disabled state, `TextDim`) and its click is a no-op.
Pure predicate (active mode → per-button live/disabled) unit-tested; shell reads the active
mode and applies. (Layout over existing actions — NOT flagged feature work; item-level
tagging already exists in the model.)
- [ ] Remove the `VIEW_TOGGLE_MODE` button from the bottom toolbar (action stays registered).
- [ ] Resolve the **Activate-Arrange / Activate-Design / Show-Both** fate per Daniel's call
(FORK — see §Handoff / CONTEXT.md §L5); apply the chosen bottom-toolbar inventory.
- [ ] Semantic-grouping spacing: widen `clusterGap` relative to `buttonGap` so clusters read
as groups (start ≈ 24 / 4; tune in-DAW).
## Phase L — sequencing
```
L1 (shared kit) ──► L2 (dock-panel layout redesign) [LANDED]
├─────────► L3 (VST editor + embed-strip restyle; GATED on Phase S landing on dev)
└─────────► L4 (dock-panel button layout enhancement) [LANDED]
└────► L5 (dock-panel button refinements; ungated, after L4)
└────► L5 (dock-panel button refinements; ungated, after L4) [LANDED]
Phase S (separate team, ungated): S-work builds with current drawing, adopts L1 when it lands.
```
L1, L2, and L4 have landed. L5 sequences after L4 (ungated). L3 waits for Phase S to reach dev.
L1, L2, L4, and L5 have landed. L3 waits for Phase S to reach dev.
Phase S feature work runs in parallel, ungated by Phase L.
## Phase L — must-verify-before-build
@@ -486,14 +402,11 @@ Phase S feature work runs in parallel, ungated by Phase L.
- **L4 re-home surface (L4)** — resolved at L4 build: three-zone layout confirmed against the
post-palette-revision `bank_panel`; `action_bar` extended with `ActionCluster::Tagging` +
`Switching`; new pure `footer_bar` module covers footer layout/hit-test.
- **L5 refinement surface (L5)** — resolve at L5 build: (a) confirm `TrackPopupMenu` popup +
right-anchored menu-button geometry for the top-bar overflow; (b) **tooltip mechanism**
(SWELL tooltip vs. custom hover-delay kit tooltip — recommended custom) — pick and confirm
the hover-timer + LICE overlay draw at build; (c) confirm the item-move action ids the four
tag buttons fire (`VIEW_MOVE_ITEMS_ARRANGE` + the Design item-move; `VIEW_TAG_ARRANGE` /
`VIEW_TAG_DESIGN` for track) resolve on this channel; (d) confirm the active-mode read the
opposite-mode enablement predicate consumes is the same `view().activeModeId()` the footer
toggle reads (one source of truth for "which mode is active").
- **L5 refinement surface (L5)** — resolved at L5 build: `TrackPopupMenu` overflow menu
confirmed; tooltip mechanism resolved as **custom LICE-kit hover-delay tooltip** (`tooltip`
pure module; sourced from the registered action phrase, prefix stripped at draw time); item-move
and track-tag action ids confirmed; active-mode read confirmed via the same
`view().activeModeId()` the footer toggle uses.
---