Docs: record Phase Upsilon W1; carry forward W2/W3 constraints; SEPT_VERIFY section 7

This commit is contained in:
2026-09-25 15:06:44 -04:00
parent 17711adc3b
commit a6d7440b2f
3 changed files with 53 additions and 5 deletions
+16
View File
@@ -1833,3 +1833,19 @@ project sample-rate change while the plugin is inactive re-stamps in place rathe
reloading from disk.
Not DAW-verified — checks are tracked in `docs/SEPT_VERIFY.md` §6.
### Υ-W1 — The bank-root seam, and the instrument's own project
**T1 `bank-root-seam`:** a pure `capture::bankRootFor(rppPath, unsavedRoot)` and one shell
resolver, `bankRootOf(ReaProject*)` (`src/shell/persist/bank_root`), now carry every
extension-side bank-directory lookup; `session` stores `lastBankRoot_` for Save-As
relocation. No behaviour change — the only visible delta is that the refused-render console
path prints lowercase on Windows. Detail: `src/shell/persist/CLAUDE.md`.
**T2 `instrument-own-project`:** ReaSampler 9000 now resolves bank-relative sample paths
against its OWN project (`getReaperParent(3)`, matched among the open projects) rather than
the focused tab — fixing an instance in a background tab reading the wrong project's folder.
It falls back to the focused tab only when REAPER reports no parent project. The ordered
candidate-root list (`src/core/instrument/map/sample_roots`) is ready for Υ-W2's temp-bank
root. Detail: `src/shell/instrument/CLAUDE.md`. Not DAW-verified — checks are tracked in
`docs/SEPT_VERIFY.md` §7.
+24 -5
View File
@@ -425,12 +425,11 @@ built.
| **E4** | Where do items pointing at temp files end up after save, with copy ticked and with it unticked? |
| **E5** | Does save-at-close give the extension no tick? (If so, the load-time trigger is the only one that catches that case) |
### Υ-W1 — The bank-root seam *(IN PROGRESS — dispatched 2026-09-25)*
### Υ-W1 — The bank-root seam *(complete)*
| Track | Owns |
|---|---|
| **T1** `bank-root-seam` | Pure `bankRootFor` plus ONE shell resolver, `bankRootOf(ReaProject*)`. It replaces the extension's ~12 copies of "EnumProjects → `.rpp` dir". **No behaviour change** |
| **T2** `instrument-own-project` | The instrument resolves ITS OWN project instead of the active tab (**a real bug fix**: today it reads the active tab), with an ordered list of candidate roots |
Both tracks landed 2026-09-25 — **T1 `bank-root-seam`** (`bankRootFor` / `bankRootOf`) and
**T2 `instrument-own-project`** (the instrument resolves its own project; ordered candidate
roots in `sample_roots`). See `docs/COMPLETED.md`. Nothing to dispatch.
### Υ-W2 — Unsaved ext state, and the migration *(gated on E1; E2 shapes it)*
@@ -439,6 +438,20 @@ built.
| **T1** `unsaved-ext-state` | Lift the ext-state refusal for unsaved projects; create the temp root lazily; add the `unsaved_bank_root` key; update the ext-state contract text (Υ-D4, Υ-D5) |
| **T2** `first-save-migration` | `migrateUnsavedBank` and both of its triggers (timer-poll transition, load-time breadcrumb); the console notice for items still pointing into temp (Υ-D1, Υ-D2, Υ-D3) |
Carry-forward constraints from Υ-W1:
- **T1 must not make `bankRootOf` return the temp root before T2's `migrateUnsavedBank` owns
the first-save path.** Today's `session.cpp` Save-As branch classifies first save as
`SaveAsRelocate` and would call `relocateBankFolder`, which copies with `overwrite_existing`
(A1) — violating "never overwrites silently". Either land T1 and T2 together, or guard
`SaveAsRelocate` when the old root came from the unsaved branch.
- **T1: keep the unsaved branch cheap.** `bankRootOf(nullptr)` runs on every panel paint and
audition start; once it reads `unsaved_bank_root` ext state, keep that lookup cheap or cache
it on the session, invalidated on the project-change transition.
- **Instrument side:** `readFromFirstRoot` falls through on a zero-byte read, not only a
missing file — decide deliberately whether an empty project-folder file should fall back to a
same-named temp-root file.
### Υ-W3 — Lift the refusals, then the leftovers
| Track | Owns |
@@ -446,6 +459,12 @@ built.
| **T1** `lift-unsaved-refusals` | Every refusal on an unsaved-project surface (Υ-D7, Υ-D8). Closes the `docs/TODO.md` entries "The capture path ignores `saveToActiveProject`'s return at four sites" and "`RunCaptureItemAssign`'s undo point does not follow the pattern its comment claims" |
| **T2** `reclaim-unsaved-leftovers` *(later)* | Υ-D6's confirmed, dry-run-first reclaim action in the prune family |
Carry-forward constraint from Υ-W1:
- **T1: prune's own saved-project check (`prune_fs.cpp`) is not named by any track.** Decide
explicitly whether prune refuses on an unsaved project or re-keys on `bankRootOf` — an open
question for Daniel.
### Pre-existing issues the design pass found — for awareness, NOT in scope
| # | Issue |
+13
View File
@@ -111,3 +111,16 @@ project rate 48000, unless a check says otherwise.
one is available) — the editor title shows the refusal message, the sample plays silent, the
message clears when another sample is loaded, and a bake shows "cannot render"
- [ ] The refusal text is not truncated at the default editor width
## 7. ReaSampler 9000 finds samples in its own project (landed Sept 2026)
- [ ] Open two projects in tabs, each with a ReaSampler 9000 on a different bank sample; switch
tabs — each instance plays its own sample, including the one in the background tab
- [ ] Open a saved project containing ReaSampler 9000 into a NEW tab — the instance plays (not
silent)
- [ ] Same, via File → Open into the CURRENT tab
- [ ] Render the project via the render queue — the instrument is audible in the render
- [ ] Render a project that is used as a subproject — the instrument is audible
For the last four: if any comes up silent until the sample is re-selected, report it (a retry is
the planned fix).