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
+15 -15
View File
@@ -1688,9 +1688,8 @@ id→slot map) is settled at build; the *contract* below holds either way.
slot** (append). It never fills an earlier gap automatically — a gap is a user's deliberate
layout, not a hole to be plugged.
- **Delete / remove / prune:** removing a sample **leaves its slot empty** (does not re-pack) so
every other sample keeps its position. Define at build whether a purely-empty trailing tail is
trimmed for content-height purposes (the recommendation: trim trailing empties for scroll
extent, keep interior gaps).
every other sample keeps its position. Trailing empty tail is trimmed for scroll-extent
purposes; interior gaps are preserved (confirmed at build).
- **Reorder:** the user drags a card to a target slot within its bank; the pure reorder mutator
moves that sample's position to the target slot, gap-preserving. **Drop-into-empty-slot places
there; drop-onto-occupied inserts-before and shifts the tail** (matching common file-manager
@@ -1739,8 +1738,8 @@ kit draw is shell.
requires a **tempo + time-signature** reference. `Sample` already carries `captureTempo` (BPM at
capture) and `lengthBeats`, but **no time-signature.** **Decision: capture-time stamp** — add
`captureTimeSigNum` / `captureTimeSigDenom` to `Sample` + its JSON round-trip, stamped on the
capture path (read the project meter at capture via the REAPER meter API — verify
`TimeMap_GetTimeSigAtTime` / equivalent against the SDK at build). bars.beats.subdivisions renders
capture path (read the project meter at capture via `TimeMap_GetTimeSigAtTime` — confirmed
at build against the SDK). bars.beats.subdivisions renders
from the stamped tempo + meter, **stable under later project tempo/meter changes** — a bank sample
outlives the project state it was captured under, matching the existing `captureTempo` stamp
philosophy. This is a **capture-path write beyond draw work** (its own checkbox in the PLAN, now
@@ -1812,8 +1811,8 @@ precisely:
pool's rules forbid. The consistent rule the model enforces: **the replace's index-removal step
is the same operation as remove-from-bank, and it must pass the same pool-privilege guard that
remove already applies — if remove-from-pool would be rejected for that sample, Alt+Replace over
it is rejected too** (the drop falls back to a no-op or the default insert-shift; settle the
exact rejection UX at build). No special pool-only replace path; one rule, guarded by the
it is rejected too** (the drop falls back to a no-op; the pool-privilege guard is reused
as-is — confirmed at build). No special pool-only replace path; one rule, guarded by the
existing pool invariants.
**Drop-result cursor cues (SETTLED 2026-07-27 — REAPER-idiomatic special cursors).** During a
@@ -1828,12 +1827,13 @@ distinct action cursors. The cue set:
occupied slot** (i.e. only when precedence resolves to the Alt+replace case). It must not appear
over an empty slot or when Alt is not held.
**Shell mechanism:** the shell sets the cursor via Win32/SWELL `SetCursor` (REAPER ships its own
action-cursor idiom as the visual reference — match its feel; load or synthesize kit-consistent
cursors at build). **The *decision* of which cue applies stays in the pure gesture/disambiguation
helper** — the same helper that resolves precedence returns the resolved gesture (reorder / move /
copy / os-drag-out / replace), and the shell maps that pure result to a cursor. No cue logic in
the shell; the shell only owns the `SetCursor` call and the cursor resources.
**Shell mechanism:** the shell sets the cursor via Win32/SWELL `SetCursor`. SWELL stock cursors
were chosen at build (Reorder→`IDC_SIZEALL`, Move→`IDC_HAND`, Copy→`IDC_UPARROW`,
Replace→`IDC_SIZEWE`; no custom cursor load/synthesis required). **The *decision* of which cue
applies stays in the pure gesture/disambiguation helper** — the same helper that resolves
precedence returns the resolved gesture (reorder / move / copy / os-drag-out / replace), and the
shell maps that pure result to a cursor. No cue logic in the shell; the shell only owns the
`SetCursor` call and the cursor resources.
### Pure/shell discipline (L7)
@@ -1856,8 +1856,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, L4, and **L5 have all landed** — see `COMPLETED.md`. L4 and L5
are independent of the L3 gate.
planned, blocked point; L1, L2, L4, L5, L6, and **L7 have all landed** — see `COMPLETED.md`.
L4, L5, L6, and L7 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