docs(phase-q): record Q-W0 close + Q-W1 landing — points moved to COMPLETED.md; skipped riders and bank_book nameKey residual preserved

This commit is contained in:
2026-07-29 09:50:37 -04:00
parent 0ce3f4894a
commit 9dd3440b75
2 changed files with 101 additions and 68 deletions
+72
View File
@@ -2883,3 +2883,75 @@ now covered by the same mechanism.
- [x] `reasampler_processor`: `reloadInstrument` decodes from `SampleRefs_` (bank-free); `SampleRefs` table added to `ComponentState` v10; heal timer + poll-to-play removed; preview summing removed; `PreviewCard` member removed. - [x] `reasampler_processor`: `reloadInstrument` decodes from `SampleRefs_` (bank-free); `SampleRefs` table added to `ComponentState` v10; heal timer + poll-to-play removed; preview summing removed; `PreviewCard` member removed.
- [x] `sample_map`: `SampleRefs` type + `SampleRefEntry` struct; `refreshRefsFromBank`, `retainRefs`, `resolvePerformanceFromRefs` (decodes directly from refs, no bank blob required); `kComponentStateVersion` bumped to 10; pre-v10 lift to empty refs. - [x] `sample_map`: `SampleRefs` type + `SampleRefEntry` struct; `refreshRefsFromBank`, `retainRefs`, `resolvePerformanceFromRefs` (decodes directly from refs, no bank blob required); `kComponentStateVersion` bumped to 10; pre-v10 lift to empty refs.
- [x] `ComponentState` v10 serialization round-trip: new `sampleRefs` field; pre-v10 blobs migrate on load. - [x] `ComponentState` v10 serialization round-trip: new `sampleRefs` field; pre-v10 blobs migrate on load.
---
## Q-W0 fix-now remediations — closes Q-W0 (2026-07-28)
> **Merged to `phase-q` 2026-07-28 (commit `546927e`).** Closes the Q-W0 sub-gate — Q-W0
> (pre-restructure functional + DSP quality audit) is now fully closed. Part of the phase-q
> integration that later reached 60/60 green with Q-W1.
**Goal:** Land the six Daniel-approved fix-now remediations from the Q-W0 audit triage, plus
seven review riders surfaced during their review, before any structural Q-wave begins.
**Verify:** Each remediation lands with its module's CTest target green; the audible DSP fixes
carry a stated before/after listening check.
- [x] **T1-01** — linked-lag stereo SOLA + follower self-heal fallback.
- [x] **T1-03** — playable-span prime bound.
- [x] **T1-09** — declick dead-state removal.
- [x] **T2-01a** — provenance wire-cursor hardening backport.
- [x] **T3-01** — rate-derived gain ramp.
- [x] **T3-03** — rate-derived fade ceiling.
- [x] Seven additional review riders landed in the same merge (not individually itemized in
this entry).
**Notes/decisions:**
- Landing these six fix-nows (plus the review riders) closes Q-W0 entirely — audit, triage,
sign-off, and remediation are all complete — and opens Q-W1.
---
## Q-W1 — safe opener: `core/json` extraction + directory/namespace layout (2026-07-29)
> **Merged to `phase-q` 2026-07-29. Integrated suite 60/60 green.** First structural wave of
> Phase Q; unblocked by the Q-W0 fix-now remediations closing 2026-07-28.
**Goal:** The zero-god-module-risk opener. Extract a pure `core/json` module (parser +
serializer) and delete the five hand-rolled JSON decoders — the four `Parser`s in `bank_model`
/ `bank_book` / `view_mode_model` / `owned_manifest` plus `tail_control`'s fifth decoder; impose
the settled `core/`/`shell/`/`app/` directory layout + sub-namespaces on the clean pure libs,
clean shells, and clean VST pure libs — pure relocation, no logic change.
**Verify:** CTest green at every commit (60/60). The five duplicate JSON decoders are gone,
replaced by one `core/json` consumed by all five former consumers; round-trip serialization is
byte-identical to before. Every relocated clean module compiles and its test executable passes
unmoved. No REAPER type crosses into any `core/` file.
- [x] `core/json` extracted (`json::Reader`/`json::Writer`); `bank_model`, `bank_book`,
`view_mode_model`, `owned_manifest`, and `tail_control` rewired onto it; the five hand-rolled
JSON decoders deleted.
- [x] Wire-`Cursor` family collapsed into `core/wire` — one hardened survivor codec.
- [x] Shared `readFileBytes` pure helper added; linked by both artifacts.
- [x] `slot_map` extracted from `bank_book`, with its own `slot_map_tests`.
- [x] ~50 clean modules relocated into `core/{model,view,capture,audio,ui,reclaim,version,json,
util,wire}/`, `core/instrument/{engine,map,ui}/`, `shell/{capture,panel,view,persist,actions,
instrument}/`; `main.cpp` moved to `app/`. Sub-namespaces applied to every relocated clean
module.
- [x] Rect unification: one concrete `ui::Rect` + `contains()` + per-role aliases — the
XYWH-vs-LTRB fork retired, `footer_bar.h`'s "NAME NOTE" collision workaround gone.
- [x] `clamp01` deduplicated.
- [x] Naming riders: survivor JSON parser minted as `json::Reader`/`json::Writer`; `BankIndex`
renamed to `BankModel` (verified by `bank_model_tests`).
- [x] `reasampler_uid.h` relocated to `core/wire/`.
- [x] Interim `core/namespaces.h` shim added for the six not-yet-split god TUs; each downstream
split wave (Q-W2 onward) retires its own includes of it as that module splits.
**Notes/decisions:**
- **Riders explicitly skipped/deferred:** T4-22 (`hitIndex` hit-test template) — not trivial,
deferred as an opportunistic follow-on once the rect unification is in use downstream; T4-06
(`view_mode_model` planner split) — optional, deferred; T4-09 (`view_lanes` split) —
deferred (in scope only if a later wave touches `view.cpp` anyway).
- **Open residual — `bank_book.cpp` still 737 LOC.** The serialize/deserialize seam is
identified but blocked on a `nameKey` linkage design decision, escalated to Daniel and
**pending** as of 2026-07-29. Downstream waves touching `bank_book` should check this
residual before assuming the split is finished.
+29 -68
View File
@@ -315,11 +315,13 @@ panel adopts knob deck + curve popup, `param_slider` slider rows retired on that
> the reorg is risk-ordered waves (W1 safe opener → W2/W2vW5 god-module splits → W6 OCP finish). > the reorg is risk-ordered waves (W1 safe opener → W2/W2vW5 god-module splits → W6 OCP finish).
## Q-W0 — pre-restructure functional + DSP quality audit (runs FIRST; gates Q-W1) ## Q-W0 — pre-restructure functional + DSP quality audit (runs FIRST; gates Q-W1)
**STATUS (2026-07-28): audit COMPLETE, triage COMPLETE, sign-off COMPLETE.** The findings report **STATUS (2026-07-29): audit COMPLETE, triage COMPLETE, sign-off COMPLETE, fix-now
is committed (`docs/product/code-quality-audit.md`; track appendices in remediations LANDED — Q-W0 is fully closed.** The findings report is committed
`docs/product/audit-notes/` — T1 DSP, T2 architecture, T3 env-constants, T4 sizing/placement; 59 (`docs/product/code-quality-audit.md`; track appendices in `docs/product/audit-notes/` — T1
findings). Daniel approved every disposition 2026-07-28. **The Q-W1 sub-gate is satisfied once DSP, T2 architecture, T3 env-constants, T4 sizing/placement; 59 findings). Daniel approved
the six approved fix-now remediations land** (final point below; in flight on `pq-w0-fixes`). every disposition 2026-07-28. The six approved fix-now remediations plus seven review riders
landed 2026-07-28 (merge `546927e`) — see `COMPLETED.md`. **Q-W1 has since landed on top of
this closure** (see `COMPLETED.md`).
**Goal:** Before a single structural point moves, perform a **thorough static/functional audit** of **Goal:** Before a single structural point moves, perform a **thorough static/functional audit** of
the codebase and produce a **written, triaged findings report**. This is the *functional-correctness the codebase and produce a **written, triaged findings report**. This is the *functional-correctness
and algorithm-quality* complement to the grep-verified SOLID/naming audit that already grounds and algorithm-quality* complement to the grep-verified SOLID/naming audit that already grounds
@@ -376,72 +378,31 @@ before/after listening or null check. **The gate to Q-W1 is: triage complete + D
begin until this is done; fold any new/reshaped downstream points the audit surfaces into begin until this is done; fold any new/reshaped downstream points the audit surfaces into
Q-W1..Q-W6 before starting them. **DONE (Daniel, 2026-07-28): all 59 dispositions approved as Q-W1..Q-W6 before starting them. **DONE (Daniel, 2026-07-28): all 59 dispositions approved as
proposed; the §3 plan reshape and §4 decisions are folded into Q-W1..Q-W6 + Q-W2v below.** proposed; the §3 plan reshape and §4 decisions are folded into Q-W1..Q-W6 + Q-W2v below.**
- [ ] **Fix-now remediations (approved 2026-07-28; Q-W0-scoped; in flight on branch
`pq-w0-fixes`):** T1-01 linked-lag stereo splice alignment, T1-03 Preserve prime bound +
immediate `freezeTail()`, T1-09 `declickR_` dead-state removal (rider on the `sampler_core`
edits), T2-01(a) provenance wire-cursor hardening backport, T3-01 gain-ramp seconds, T3-03
fade-ceiling seconds. Each lands with its module's CTest target green; the audible DSP fixes
with a stated before/after listening check. **Landing these closes Q-W0 and opens Q-W1.**
## Q-W1 — safe opener: extract `core/json` + impose the directory/namespace layout on clean modules ## Q-W1 — safe opener: extract `core/json` + impose the directory/namespace layout on clean modules
**Goal:** The zero-god-module-risk opener. Two moves: (1) extract a pure **`core/json`** module
(parser + serializer) and **delete the five hand-rolled JSON decoders** — the four `Parser`s in
`bank_model` / `bank_book` / `view_mode_model` / `owned_manifest` **plus `tail_control`'s fifth
decoder** (T2-02, Q-W0's undercount fix — the wave's one-JSON-path goal is not met without it) —
the single largest DRY+SRP violation, entirely off the hot paths; (2) impose the settled
`core/`/`shell/`/`app/` directory layout + sub-namespaces
(`reasampler::model`/`view`/`capture`/`audio`/`ui`/`reclaim`/`version`/`json` + the `instrument`
family) on the **30 clean pure libs + the clean shells that need no splitting + the ~20 clean
VST pure libs** (T4 §1.5, under the settled T4-18 `core/instrument/{engine,map,ui}` +
`shell/instrument/` shape) — pure relocation, no logic change. **Q-W0 additions (SETTLED
2026-07-28):** the shared `readFileBytes` pure helper (T2-03); the wire-`Cursor` collapse into
one shared codec beside `core/json` (T2-01(b)); the rect unification — one **concrete**
`ui::Rect` + `contains()` + per-role aliases, NOT a template (T2-05 ≡ T4-21). Proves the wave
discipline (relocate + encapsulate, CTest-green) before any god-module surgery. CONTEXT.md
§Phase Q (json extraction; directory + namespace map).
**Verify:** CTest green at every commit. The five duplicate JSON decoders are gone, replaced by
one `core/json` consumed by all five consumers; round-trip serialization is byte-identical to before
(no format change — a *structural* dedupe, not a behavior change). Every relocated clean module
compiles and its test executable passes unmoved. `Sample` (model) vs `AudioSample` (audio) vs
unified `Parser` (json) do not collide once sub-namespaced. No REAPER type crosses into any
`core/` file; the CMake pure/shell enforcement still holds.
**Depends on:** the GATE (tree quiescent) **and Q-W0 closed** (audit triaged + Daniel signed off;
any fix-now findings the audit assigned to Q-W1 folded in). First structural wave.
- [ ] Extract `core/json` (pure parser + serializer: parseString/parseInt/parseKey/skipValue + > **Landed on `phase-q` (2026-07-29). Integrated suite 60/60 green.** `core/json`
escape, plus emit helpers); unify under `reasampler::json`; guard the `Parser` name against > (`json::Reader`/`json::Writer`) extracted; the five hand-rolled JSON decoders (incl.
cross-lib collision. Off all hot paths — safe to abstract freely. > `tail_control`'s) deleted; the wire-`Cursor` family collapsed into `core/wire`; the shared
- [ ] Rewire `bank_model`, `bank_book`, `view_mode_model`, `owned_manifest`, **and > `readFileBytes` helper added; ~50 clean modules relocated into `core/{model,view,capture,
`tail_control` (T2-02)** onto `core/json`; **delete the five duplicate decoders.** Round-trip > audio,ui,reclaim,version,json,util,wire}/`, `core/instrument/{engine,map,ui}/`,
output byte-identical (dedupe, not reformat). > `shell/{capture,panel,view,persist,actions,instrument}/`, `app/main.cpp`; sub-namespaces
- [ ] Add the shared `readFileBytes` pure helper to the `core/` utility home; both artifacts > applied; one concrete `ui::Rect` + aliases (LTRB fork + `footer_bar` NAME NOTE retired);
link it (T2-03). > `slot_map` extracted from `bank_book`; `clamp01` deduped; `BankIndex``BankModel`;
- [ ] Collapse the length-prefixed wire-`Cursor` family into one shared wire codec beside > `reasampler_uid.h` relocated to `core/wire/`. See `COMPLETED.md` for the full narrative.
`core/json`, consumed by `provenance` / `assignment_request` / `sample_usage` / >
`parseBankGeneration` (T2-01(b) — the structural half; the hardening backport lands in Q-W0). > **Skipped/deferred riders:** T4-22 (`hitIndex` hit-test template) — not trivial, deferred as
- [ ] Riders on files this wave already opens: `slot_map` extraction from `bank_book` (T4-05); > an opportunistic follow-on once the rect unification is in use downstream; T4-06
`view_mode_model` planner split (T4-06 — optional if the wave wants to stay minimal); > (`view_mode_model` planner split) — optional, deferred; T4-09 (`view_lanes` split) —
`view_lanes` split only if relocation touches `view.cpp` anyway (T4-09). > deferred (in scope only if a later wave touches `view.cpp` anyway).
- [ ] Relocate the 30 clean pure libs into `core/{model,view,capture,audio,ui,reclaim,version, >
json}/` **+ the ~20 clean VST pure libs into `core/instrument/{engine,map,ui}/` (T4-18 > **Open residual — `bank_book.cpp` still 737 LOC.** The serialize/deserialize seam is
SETTLED, Daniel 2026-07-28)**, and the clean shells into > identified but blocked on a `nameKey` linkage design decision, escalated to Daniel and
`shell/{capture,panel,view,persist,actions,instrument}/`; move `main.cpp` to `app/`. Update > **pending** as of 2026-07-29. Downstream waves touching `bank_book` should check this
`CMakeLists.txt` `src/` paths only (no target-graph change). > residual before assuming the split is finished.
- [ ] Apply sub-namespaces matching the directories on every relocated *clean* module (the >
god-modules re-namespace their own new TUs as they split, W2/W2vW5). Resolve `Sample`/ > An interim `core/namespaces.h` shim covers the six not-yet-split god TUs; each downstream
`AudioSample`/`Parser` homes. **This alone resolves the naming *collisions*** (§2b.2): the > split wave (Q-W2 onward) retires its own includes of it as that module splits.
shared pure-UI rect types (`FooterRect`/`ButtonRect`/`Selection`/`CellRect`) get one `ui::`
owner — one **concrete** `ui::Rect` + `contains()` + per-role aliases, retiring the
XYWH-vs-LTRB fork and folding in `editor_geometry`'s `Rect` (T2-05 ≡ T4-21 — explicitly NOT a
template); retire the hand-collision "NAME NOTE" in `footer_bar.h`. Riders: `clamp01` dedup
(T4-24); the `hitIndex` hit-test template only as an opportunistic follow-on once the rect
unification lands (T4-22).
- [ ] **Naming riders (Q-8 — SETTLED, Daniel 2026-07-28: both renames):** the survivor JSON
parser is minted as **`json::Reader`/`json::Writer`**; land **`BankIndex``BankModel`** here
(mechanical class rename, verified by `bank_model_tests`). No rename on a file this wave isn't
already relocating (Q-7).
- [ ] Confirm CTest green + no hot-path change: `peaks`/audition/realtime-tick untouched by this
wave (pure relocation of clean modules; `peaks` stays a free function).
## Q-W2 — split `bank_panel.cpp` (the biggest extension god-module — 3459 LOC at the Q-W0 census) ## Q-W2 — split `bank_panel.cpp` (the biggest extension god-module — 3459 LOC at the Q-W0 census)
**Goal:** Split the largest extension god-module (8+ responsibilities) along the audit's named **Goal:** Split the largest extension god-module (8+ responsibilities) along the audit's named