docs(plan): ground L3 readiness against landed Phase S surfaces

Both VST draw shells still draw flat off a local pre-L1 palette — L3
restyle confirmed live, not a born-in-kit no-op. Name the concrete gate
files, add the palette-reconcile point, enumerate the landed editor set.
This commit is contained in:
2026-07-27 03:42:24 -04:00
parent 40ee6bb6d1
commit a434ef47f8
2 changed files with 113 additions and 37 deletions
+61 -22
View File
@@ -350,31 +350,57 @@ components, the pastel spectral keyboard strip, working hover/pressed/drag; the
UID is unchanged (a visual refresh is not a compat event).
**Depends on:** L1 (the kit) **AND — GATE — Phase S landing on dev.** The VST editor, embed
strip, and keyboard strip live in 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 and L2 are the live Phase L
work.
phase-s worktree). **L3 cannot be built on dev until Phase S's drawing shells
(`src/vst/reasampler_editor.cpp` + `reasampler_embed.cpp`) 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 and L2 are the live Phase L work.
> **Coordination contract with Phase S (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 Phase L.** Whichever lands first (the L1 kit or the S10S13 UX),
> the kit is the **one source of drawing**: if S10S13 reach dev before L1, they draw in
> the current language and L3 restyles them; if L1 lands first, they are born in the kit.
> Either way there is one kit and one look, and L3 is the point that completes the VST/embed
> adoption and applies the settled B+spectral treatment.
> **Coordination contract with Phase S (load-bearing).** Phase S's editor/embed UX
> (S10S13, S15S18) build their interaction UX with the **current** drawing and **adopt the
> L1 kit when it is available — they are NOT gated on Phase L.** Whichever lands first (the
> L1 kit or the Phase S UX), the kit is the **one source of drawing**: if the Phase S
> surfaces reach dev before L1, they draw in the current language and L3 restyles them; if
> L1 lands first, they are born in the kit. **Reality check (product-designer, 2026-07-27,
> read-only against the phase-s worktree): the Phase S surfaces did NOT adopt the kit —
> `reasampler_editor.cpp` and `reasampler_embed.cpp` still draw flat `LICE_FillRect` blocks
> + raw GDI `DrawTextA`, off a local pre-L1 forest-green palette (`kColBackground` etc.),
> not `theme`/`draw_kit`.** So L3 lands as a **full restyle**, not a born-in-kit no-op — all
> three plan points below are live and confirmed still-needed. Either way there is one kit
> and one look, and L3 is the point that completes the VST/embed adoption and applies the
> settled B+spectral treatment.
>
> **Landed-scope note (product-designer, 2026-07-27).** All Phase S drawing is centralized
> in **exactly two shells** — `reasampler_editor.cpp` (the `IPlugView` editor) and
> `reasampler_embed.cpp` (the S6 embed strip). Every other `src/vst/` UI file
> (`editor_geometry`, `keyboard_strip`, `waveform_view`, `capture_browser`, `param_slider`,
> `browser_scroll`, `embed_strip`) is a **pure geometry/hit-test module — zero LICE, zero
> draw** (the house discipline held on the branch). So L3 touches two draw shells, but their
> rendered component set is broader than the original plan named: the editor draws a
> **capture-first browser** (search + tabs + thumbnails, S10), **channel toggles** (S7),
> **waveform + start/loop markers** (S11), the **keyboard strip + zone bars** (S10/S10-Z),
> and **ADSR / pitch sliders + mode toggles** (S12/S15/S16). Every one of these is on the
> restyle surface — enumerated in the points below.
- [ ] Route the VST editor's + embed strip's text through the kit's cached-font `text()`
(the kit's current face — §3.1, no font change); retire their raw GDI `DrawTextA` path.
(Gated — Phase S surfaces must be on dev.)
- [ ] Restyle the editor + embed components through the kit (buttons, sliders/ADSR, list
rows, waveform, segmented controls) in the B (Neon Console) palette — **REAPER-grey
neutrals** (`bg/base` `#2b2b2b` / `bg/panel` `#333333` / `bg/cell` `#3a3a3a`) with the
**three pastel accents** (primary lime = live layer; secondary teal / tertiary purple =
categorical); add hover/pressed/drag states. (Gated.)
- [ ] Apply **Direction C's pastel spectral treatment to the keyboard strip** (hue-mapped
zones as a pastel sweep anchored on the three accents, glow-on-active as a static drawn
state — never a pulse, per the speed constraint) as the signature surface; VST3 class UID
unchanged. (Gated.)
(the kit's current face — §3.1, no font change); retire their raw GDI `DrawTextA` path
(present in both shells today). (Gated — Phase S surfaces must be on dev.)
- [ ] Retire the shells' **local pre-L1 palette** — the `kColBackground`/`kColCardBg`/
`kColThumb`/… forest-green-on-charcoal constants block in `reasampler_editor.cpp` (and the
mirrored constants in `reasampler_embed.cpp`) — and draw every surface through the L1
`theme` roles instead. **This is the coordination-contract reconcile: today there are two
palettes (the landed `theme` kit + this local constants block); L3 collapses them to the
one kit.** (Gated.)
- [ ] Restyle the editor + embed components through the kit (browser search/tabs/thumbnails,
channel toggles, ADSR + pitch sliders, mode toggles, zone bars, list rows, waveform,
segmented controls) in the B (Neon Console) palette — **REAPER-grey neutrals** (`bg/base`
`#2b2b2b` / `bg/panel` `#333333` / `bg/cell` `#3a3a3a`) with the **three pastel accents**
(primary lime = live layer; secondary teal / tertiary purple = categorical); add
hover/pressed/drag states. (Gated.)
- [ ] Apply **Direction C's pastel spectral treatment to the keyboard strip + zone bars**
(hue-mapped zones as a pastel sweep anchored on the three accents, active zone lifting to
`accent/primary` + a static glow — never a pulse, per the speed constraint) as the
signature surface; also carry the waveform + loop/start markers onto the kit's
`drawWaveform` + `warn`/accent marker roles; VST3 class UID unchanged. (Gated.)
## Phase L — sequencing
```
@@ -416,6 +442,19 @@ feature work runs in parallel, ungated by Phase L.
cursors chosen for drop-result cues (Reorder→IDC_SIZEALL, Move→IDC_HAND, Copy→IDC_UPARROW,
Replace→IDC_SIZEWE); existing pool-privilege guard reused as-is for Alt-replace. Gap navigation
in the grid = skip gaps (arrow keys skip empty slots). See `COMPLETED.md` §L7.
- **L3 restyle surface (L3)** — **PRE-CONFIRMED read-only against the phase-s worktree
(product-designer, 2026-07-27); re-confirm against dev once Phase S merges.** (1) Both draw
shells (`reasampler_editor.cpp`, `reasampler_embed.cpp`) still draw flat — `LICE_FillRect` +
raw GDI `DrawTextA`, no `theme`/`draw_kit`/`LICE_CachedFont` include — so all three L3 points
are live (no born-in-kit no-op). (2) There is a **second palette** to reconcile: a local
`kCol*` forest-green-on-charcoal constants block in the editor shell, divergent from the
landed `theme` roles. (3) Draw is centralized in those two shells only; every other
`src/vst/` UI file is pure geometry (kit adoption is a shell-side change, no geometry
rework). (4) The phase-s branch carries an **older L1 kit** (its `action_bar` predates dev's
L4L7 `theme` palette revisions) — after Phase S merges, L3 draws against dev's current
`theme`/`draw_kit`, so re-confirm the palette roles L3 consumes are dev's, not the branch's
stale copy. **One genuine open question for Daniel** (see the assessment) — otherwise the
settled DS-1/2/3 spec forces the rest.
---
+52 -15
View File
@@ -584,26 +584,63 @@ not a forecast of them. If L2 starts before M11 lands, it designs against a movi
### 5.3 `L3` — VST editor + embed-strip restyle (GATED on Phase S landing on dev)
The ReaSampler 9000 VST editor (`IPlugView` LICE surface) and the S6 embed strip get the
full kit treatment: kit cached-font text (§3.1 — the kit's current face, no bundled font),
kit component draws, the **B palette with the three-accent pastel system**
(primary lime / secondary teal / tertiary purple), the **pastel spectral keyboard strip**
as the signature surface, hover/pressed/drag states everywhere.
The ReaSampler 9000 VST editor (`IPlugView` LICE surface, `reasampler_editor.cpp`) and the
S6 embed strip (`reasampler_embed.cpp`) get the full kit treatment: kit cached-font text
(§3.1 — the kit's current face, no bundled font), kit component draws, the **B palette with
the three-accent pastel system** (primary lime / secondary teal / tertiary purple), the
**pastel spectral keyboard strip** as the signature surface, hover/pressed/drag states
everywhere. The editor's landed component set (verified on the phase-s worktree) is broader
than an early "editor + keyboard strip" sketch: a **capture-first browser** (search box +
tabs + sample thumbnails, S10), **channel mono/stereo toggles** (S7), a **waveform pane with
start + loop markers** (S11), the **keyboard strip + zone bars** (S10/S10-Z), and **ADSR +
pitch sliders + Trigger/Gate & Varispeed/Preserve mode toggles** (S12/S15/S16) — every one of
these is on the restyle surface.
**L3 is explicitly GATED: these surfaces do not exist on dev yet.** The VST editor, the
embed strip, and the keyboard strip live in Phase S, which has landed on the phase-s
worktree but **not on dev**. L3 cannot be built on dev until Phase S (at least the editor
+ embed surfaces, S1/S6/S10) lands on dev. **The Phase L team must not chase these files
on dev** — the gate is stated so they don't. Until Phase S merges to dev, L3 is a planned,
blocked point; L1 and L2 are the live Phase L work.
worktree but **not on dev**. L3 cannot be built on dev until the two Phase S drawing shells
(`src/vst/reasampler_editor.cpp` + `reasampler_embed.cpp`) land on dev. **The Phase L team
must not chase these files on dev** — the gate is stated so they don't. Until Phase S merges
to dev, L3 is a planned, blocked point; L1 and L2 are the live Phase L work.
**Coordination contract (stated once, 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 Phase L.** Whichever lands first (L1 kit or S10S13 UX), the kit is
**Landed-reality check (product-designer, 2026-07-27 — read-only against the phase-s
worktree).** Verified against the actual landed Phase S surfaces so L3's scope is grounded,
not forecast:
- **All Phase S UI draw is in exactly two shells** — `reasampler_editor.cpp` (the
`IPlugView` editor) and `reasampler_embed.cpp` (the S6 embed strip). Every other
`src/vst/` UI file (`editor_geometry`, `keyboard_strip`, `waveform_view`,
`capture_browser`, `param_slider`, `browser_scroll`, `embed_strip`) is a **pure
geometry/hit-test module with zero LICE and zero draw** — the house pure/shell discipline
held on the branch. L3 is therefore a **shell-side restyle of two files**; no geometry
rework, and the pure hit-test coverage is already there to lean on.
- **Both shells still draw at the floor.** They fill flat `LICE_FillRect` rectangles and
pipe text through raw GDI `DrawTextA` — the exact "temple os" path §0/§1.1 describe. They
do **not** include `theme.h` / `draw_kit.h`, do **not** call any kit `draw*`/`text()`, and
use **no** `LICE_CachedFont`. So the coordination contract's "born in the kit" branch did
**not** happen for the VST surfaces — L3 lands as a **full restyle**, and all three build
points below are confirmed live (none is a no-op).
- **There is a second palette to reconcile.** The editor shell carries its own local
constants block — `kColBackground = RGB(28,28,30)`, accent `kColThumb/kColWaveform =
RGB(120,200,160)`, `kColTitleBg = RGB(20,20,22)`, etc. — the **pre-L1 forest-green-on-near-
black palette** this doc's §2 set out to replace, mirrored (partially) in the embed shell.
That is a live divergence from the landed `theme` roles. Collapsing these two palettes into
the one `theme` kit is the concrete "one kit, one look" reconcile L3 performs (§5.3 build
point 2, PLAN.md §L3).
- **The Phase S branch carries an *older* L1 kit.** The kit modules (`theme`, `draw_kit`,
`component_geometry`) are present on the branch, but its `theme` predates dev's L4L7
palette revisions (the branch has only L1+L2). After Phase S merges to dev, L3 draws
against **dev's** current `theme`/`draw_kit`, so the restyle consumes dev's pastel-on-grey
roles, not the branch's stale copy — a merge-hygiene note, not a scope change.
**Coordination contract (stated once, load-bearing).** Phase S's editor/embed UX build
their interaction UX with the *current* drawing and **adopt the L1 kit when it is available —
they are not gated on Phase L.** Whichever lands first (L1 kit or the Phase S UX), the kit is
the **one source of drawing**; when both exist, the Phase S surfaces draw through it, and
L3 is the point that completes that adoption + applies the settled B+spectral look. If
S10S13 land on dev before L1, they draw in the current language and L3 restyles them; if
L1 lands first, S10S13 are born in the kit. Either way there is one kit, one look.
L3 is the point that completes that adoption + applies the settled B+spectral look. **In the
event that actually occurred, the Phase S surfaces reached the worktree with the current
(flat, local-palette) drawing and did not adopt the kit — so L3 restyles them.** Either way
there is one kit, one look.
### 5.4 Sequencing summary