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

This commit is contained in:
2026-07-27 03:00:42 -04:00
parent 776be32dff
commit 9a1bcbcf7a
4 changed files with 97 additions and 169 deletions
+58
View File
@@ -1423,3 +1423,61 @@ targets, no capture/placement behavior change.
**Notes/decisions:**
- Icons were considered and deferred (not implemented in this pass).
---
## L7 — capture ordering, card metadata, and selection styling
**Goal:** Three grid-facing improvements to the dock panel, drawn through the L1 kit in the
settled DS-2 palette. (1) **Persisted deterministic capture order + drag-drop reorder + sparse
placement:** each bank (and the pool) carries an explicit, persisted per-sample order via a
per-`Bank` id→slot `SlotMap` in `bank_book`; a card may sit in a slot that leaves earlier slots
empty (gaps preserved; trailing empty tail trimmed for scroll extent). (2) **Decorative metadata
over the peaks:** each card overlays capture length as **bars.beats.subdivisions (bottom-left)**
and **seconds.ms (bottom-right)** in the kit's micro / value-mono type class, `text/dim`. (3)
**Selection restyle:** a selected card drops the inverted accent-fill and instead draws the
*normal* cell + an **`accent/tertiary` (pastel purple `#C2AAE8`) border**. No new capture /
placement behavior; the "capture ≠ placement" principle is untouched.
- [x] **`SlotMap` in `bank_book`:** gap-preserving per-`Bank` id→slot map — persisted
deterministic display order; interior gaps preserved / trailing tail trimmed; JSON rides
inside the existing `"banks"` blob; pre-L7 migration seeds dense insertion order via
`reconcileSlots()` on the load path. `bank_model` / `Sample` untouched by position (position
is a per-bank display concern).
- [x] **`BankBook` mutators:** `reorderSample` (insert-before-shift; same-slot = no-op),
`replaceSample` (occupant index-removal via the standard remove path + pool-guard inheritance;
no-op on reject), `orderedSampleIds`, `reconcileSlots`. All gap-preserving; deterministic;
CTest-covered.
- [x] **`Sample` meter stamp (ONE sanctioned `Sample` change):** `captureTimeSigNum` /
`captureTimeSigDenom` added to `Sample` + JSON round-trip; stamped on both capture paths and
refreshed on re-capture via `TimeMap_GetTimeSigAtTime` (API confirmed at build). Old samples
with no stamp fall back gracefully (blank musical read-out).
- [x] **`card_drag` pure module:** gesture precedence — leave-client → OS drag-out;
other-bank → move/copy; same-bank → reorder / Alt-over-occupied → replace. Cursor-cue map
returned as the pure resolved gesture. Sparse `computeSlotRects` / `hitTestSlot`. SWELL stock
cursors chosen at build: Reorder→`IDC_SIZEALL`, Move→`IDC_HAND`, Copy→`IDC_UPARROW`,
Replace→`IDC_SIZEWE`. New CTest target `card_drag_tests`.
- [x] **`card_meta` pure module:** bars.beats.subdivisions from the stamped tempo + meter;
seconds.milliseconds rounded. Both blank when the sample is unstamped. New CTest target
`card_meta_tests`.
- [x] **`bank_panel` sparse-grid render:** grid renders in sparse slot order; decorative
empty-gap cells drawn for unoccupied slots; every cell↔sample consumer remapped to
id-based occupied-ordinal space (selection, keyboard nav — arrows skip gaps, audition,
multi-select, delete / re-capture resolution, drags).
- [x] **`bank_panel` drop dispatch:** reorder / Alt-replace / move-copy drop with one-Ctrl-Z
undo via the existing batched undo pattern; per-slot drop highlight (`accent/hot`, doubled
outline for replace); SWELL stock cursor cues via `SetCursor` per the pure resolved gesture.
- [x] **`bank_panel` metadata overlay:** bars.beats bottom-left (Micro), s.ms bottom-right
(ValueMono), `TextDim`, decorative / non-interactive.
- [x] **Selection restyle:** normal cell + `accent/tertiary` purple border; inversion removed;
focus ring distinct from the selection border.
**Notes/decisions:**
- **M9 overlap (awareness note — unchanged intent).** M9 (capture-to-slot-N / insert-slot-N,
MIDI-bindable, MPC-style) remains **explicitly deferred (Daniel, 2026-07-26).** The
interchangeable-slot substrate L7 builds still eases a future M9 revival but L7 adds **no**
slot-numbered capture/insert actions and **no** MIDI bindings. The "plain vs. M9-shaped"
sub-fork is closed: plain gap-preserving substrate (F2).
- **Build-time choices confirmed:** `TimeMap_GetTimeSigAtTime` confirmed at build for the
meter stamp; SWELL stock cursors chosen (no custom cursor load/synthesis required);
gap navigation = skip gaps (arrow keys skip empty slots); same-slot reorder = no-op.
- New CTest targets `card_drag_tests`, `card_meta_tests`.