docs: anchor the product-doc citations to symbols, not line numbers
Ten more were already pointing at unrelated code. Vendor SDK and SWELL citations left alone — those files don't move.
This commit is contained in:
@@ -25,7 +25,8 @@ with its reasoning stated; contradict it in review with an argument, not a prefe
|
||||
|
||||
**Slug convention.** `Λ → l`, so tracks dispatch into `pl-w<wave>-t<track>-<slug>` —
|
||||
Λ-W2-T1 into `pl-w2-t1-linux-compile-blockers`. The two audits already ran under
|
||||
`pl-w1-t1-build-toolchain-audit` and `pl-w1-t2-source-runtime-audit`. **`docs/PLAN.md:33–36`
|
||||
`pl-w1-t1-build-toolchain-audit` and `pl-w1-t2-source-runtime-audit`. **`docs/PLAN.md`'s
|
||||
"Worktree slug convention" paragraph
|
||||
lists the transliterations for Θ / Ξ / Γ / Ψ / Ε / Ρ and does not yet carry Λ — adding it
|
||||
is a plan-doc edit this phase's PLAN.md entry must make.**
|
||||
|
||||
@@ -77,21 +78,21 @@ this doc re-read against the tree while writing.
|
||||
**The extension is close — two one-line compile blockers stand between the tree and a
|
||||
GCC/Clang build.**
|
||||
|
||||
- `src/shell/panel/draw_kit.cpp:73` passes `DEFAULT_PITCH | FF_DONTCARE` to `CreateFont`.
|
||||
- `src/shell/panel/draw_kit.cpp`'s `loadFont` passes `DEFAULT_PITCH | FF_DONTCARE` to `CreateFont`.
|
||||
`FF_DONTCARE` has zero occurrences anywhere in `vendor/WDL/` (L2-01); the file is not
|
||||
platform-guarded, only its include is (`:70–77`). `draw_kit` links into both modules, so
|
||||
platform-guarded, only its include is (`loadFont`'s whole body). `draw_kit` links into both modules, so
|
||||
nothing builds.
|
||||
- `src/shell/actions/instrument_drop_win.cpp:59` calls `GetCurrentProcessId()` inside
|
||||
`writeTempPreset` with no platform branch anywhere in the TU. SWELL exports
|
||||
- `src/shell/actions/instrument_drop_win.cpp`'s `writeTempPreset` calls `GetCurrentProcessId()`
|
||||
with no platform branch anywhere in the TU. SWELL exports
|
||||
`GetCurrentThreadId` and not this (L2-02). The PID exists only to keep two concurrent
|
||||
REAPER instances from colliding in the shared temp dir; the atomic counter at `:52`
|
||||
REAPER instances from colliding in the shared temp dir; the atomic counter in the same function
|
||||
already carries the intra-process half.
|
||||
|
||||
**`core/` is genuinely pure, and it was verified rather than assumed.** Every `#include`
|
||||
under `src/core/**` is a `core/` sibling, one of 26 standard headers, or the generated
|
||||
`version_generated.h` — zero REAPER, SWELL, WDL, LICE, VST3 or `windows.h` (T2 §1.1). The
|
||||
whole directory contains nine preprocessor conditional lines, exactly one of which is a
|
||||
platform fork, and that one (`capture_paths.cpp:18–20`, the Windows case-fold) is *correct*
|
||||
platform fork, and that one (`capture_paths.cpp`'s `normalizeSlashes`, the Windows case-fold) is *correct*
|
||||
for Linux with both branches already asserted by `tests/test_capture_paths.cpp`. All 91
|
||||
test TUs under `tests/` are platform-neutral.
|
||||
|
||||
@@ -100,24 +101,25 @@ double-buffered LICE `WM_PAINT`, mouse/wheel/capture, `WM_CAPTURECHANGED` rollba
|
||||
seven cursors, menus, the keyboard accelerator path, modifier reads, tooltips, drag-out and
|
||||
`DragQueryFile`/`DragFinish` were each checked by name against `swell-functions.h` /
|
||||
`swell-types.h` and are present (T2 §1.5). The Windows-only escapes are three:
|
||||
`DragAcceptFiles` (`panel_window.cpp:148–150`, `#ifdef _WIN32`), `SHFileOperationW`
|
||||
`DragAcceptFiles` (`panel_window.cpp`'s `openPanel`, under `#ifdef _WIN32`), `SHFileOperationW`
|
||||
(prune), and OLE `DoDragDrop` (drag-out) — each already carrying a non-Windows branch or a
|
||||
documented reason it does not. **This is the audits' single most load-bearing finding.**
|
||||
|
||||
**The dock panel will not appear until the dialog-resource question is answered.**
|
||||
`panel_window.cpp:135` is `CreateDialogParam(g_hInst, MAKEINTRESOURCE(IDD_BANK_PANEL), …)`,
|
||||
`panel_window.cpp`'s `openPanel` calls `CreateDialogParam(g_hInst, MAKEINTRESOURCE(IDD_BANK_PANEL), …)`,
|
||||
which SWELL resolves out of a per-module registry populated by a **resgen-generated source
|
||||
file that is not in the Linux target**: `src/app/CMakeLists.txt:97` has the `target_sources`
|
||||
line commented out (and `:86` for macOS). The registry head stays null, `SWELL_CreateDialog`
|
||||
returns null, `panel_window.cpp:137` returns, and the toggle action is a silent no-op with
|
||||
file that is not in the Linux target**: `src/app/CMakeLists.txt`'s `else()` (Linux) branch has the `target_sources`
|
||||
line commented out (and the `elseif(APPLE)` branch's own copy for macOS). The registry head stays null, `SWELL_CreateDialog`
|
||||
returns null, `openPanel`'s `if (!g_panel.hwnd) return;` guard returns, and the toggle action is a silent no-op with
|
||||
no console line and no Actions-list checkmark (Λ-01, L2-06). Three defects stack in the
|
||||
commented-out instructions themselves: the script named at `:96` (`mac_resgen.php`) does
|
||||
commented-out instructions themselves: the script named in the `elseif(APPLE)`/`else()` branches' comment lines (`mac_resgen.php`) does
|
||||
not exist, the output filename is wrong, and the output is an `#include`-only artifact that
|
||||
cannot be a `target_sources` entry at all (Λ-01). Λ-F2 decides the route.
|
||||
|
||||
**The instrument's Linux editor is a from-scratch X11 job, and today the target does not
|
||||
configure at all.** `src/shell/instrument/CMakeLists.txt:9` is
|
||||
`if(WIN32 AND EXISTS "${VST3_SDK}/…/pluginfactory.cpp")` — a conjunction, so a Linux
|
||||
configure at all.** `src/shell/instrument/CMakeLists.txt`'s
|
||||
`if(WIN32 AND EXISTS "${VST3_SDK}/…/pluginfactory.cpp")` gate is
|
||||
a conjunction, so a Linux
|
||||
configure silently omits `reasampler_vst` even with the submodule slice fully initialised.
|
||||
Beyond the gate: the wrong module entry point is compiled, the artifact is a file where
|
||||
Linux wants a directory bundle, nothing hands a VST3 plugin the SWELL function table, and
|
||||
@@ -127,7 +129,7 @@ drawing survives a window-system change intact. It is the window and event plumb
|
||||
is entirely absent.
|
||||
|
||||
**Nothing about the build is optimized, and the documented ship command is a no-op on
|
||||
Linux.** Root `CMakeLists.txt:28–30` is the complete list of language settings — there is
|
||||
Linux.** Root `CMakeLists.txt`'s `set(CMAKE_CXX_STANDARD ...)`/`set(CMAKE_CXX_STANDARD_REQUIRED ...)`/`set(CMAKE_POSITION_INDEPENDENT_CODE ...)` block is the complete list of language settings — there is
|
||||
no `CMAKE_BUILD_TYPE`, no `CMAKE_CXX_FLAGS`, no IPO/LTO, and no `target_compile_options`
|
||||
anywhere in the tree. `--config Release` is accepted and ignored by Ninja and Make, so the
|
||||
README's ship incantation produces a binary with no `-O` flag at all, on a tree whose
|
||||
@@ -214,7 +216,7 @@ meaning the same edit covers both. **Those edits still get made in their shared
|
||||
noted as shared** — a `#ifdef _WIN32` / `#else` that is right for both costs nothing extra
|
||||
and does not require a mac. What is out is: macOS as a phase deliverable, any macOS
|
||||
verification, the `swell-modstub.mm`-under-a-CXX-only-`project()` question (root
|
||||
`CMakeLists.txt:26` is `LANGUAGES CXX`), signing and notarization, and the macOS-only
|
||||
`CMakeLists.txt`'s `project(...)` call is `LANGUAGES CXX`), signing and notarization, and the macOS-only
|
||||
half of L2-11 (`normalizeSlashes` under-folds on case-insensitive APFS — a real pre-existing
|
||||
defect this phase surfaces and does not own).
|
||||
|
||||
@@ -283,7 +285,7 @@ Route B3a (Λ-D2) is the ruled route. It must be reached without the stub's own
|
||||
|
||||
1. **Never define `SWELL_LOAD_SWELL_DYLIB`.** Compile
|
||||
`swell-modstub-generic.cpp` in its default branch — the same branch the extension already
|
||||
uses (`src/app/CMakeLists.txt:91–92`) — which exports `SWELL_dllMain(hInst, callMode,
|
||||
uses (`src/app/CMakeLists.txt`'s `else()` (Linux) branch's `target_sources`/`target_compile_definitions` pair) — which exports `SWELL_dllMain(hInst, callMode,
|
||||
GetFunc)` (`:135`) and calls `doinit` on the pointer it is handed. The whole file is
|
||||
inside `#ifdef SWELL_PROVIDED_BY_APP` (`:21`), so the VST3 target must define that
|
||||
symbol too; today it does not.
|
||||
@@ -422,8 +424,8 @@ audits and verified in Λ-W3; T4 is verifiable on the current box.
|
||||
**Goal.** The extension compiles and links under GCC/Clang, and when it refuses to load it
|
||||
says why instead of vanishing.
|
||||
|
||||
**Surface boundary — owns:** `src/shell/panel/draw_kit.cpp` (`loadFont`, `:70–77`),
|
||||
`src/shell/actions/instrument_drop_win.cpp` (`writeTempPreset`, `:50–61`), `src/app/main.cpp`
|
||||
**Surface boundary — owns:** `src/shell/panel/draw_kit.cpp` (`loadFont`),
|
||||
`src/shell/actions/instrument_drop_win.cpp` (`writeTempPreset`), `src/app/main.cpp`
|
||||
(the `REAPERAPI_LoadAPI` failure branch only). **Does not own:** any `CMakeLists.txt`,
|
||||
`panel_window.cpp`, or any `core/` file.
|
||||
|
||||
@@ -432,7 +434,7 @@ says why instead of vanishing.
|
||||
**Do not add `windows.h`** (L2-01's stated direction). The family bits are advisory to
|
||||
Windows' font mapper and meaningless to fontconfig.
|
||||
- Replace `GetCurrentProcessId()` with a platform-neutral uniqueness source behind a guard;
|
||||
the atomic counter at `:52` already carries the intra-process half (L2-02).
|
||||
the atomic counter in `writeTempPreset` already carries the intra-process half (L2-02).
|
||||
- On the load-failure branch, either switch `main.cpp` to `REAPERAPI_MINIMAL` plus an
|
||||
explicit `WANT` list — the pattern `panel_window.cpp` and `panel_audition.cpp` already
|
||||
use — or keep the full load and print the failure count via
|
||||
@@ -507,8 +509,8 @@ only; the `WIN32` gate is Λ-W6-T1's), `README.md` and root `CLAUDE.md` §"Build
|
||||
**Goal.** The docked bank panel opens on Linux, and if it ever fails to, it says so.
|
||||
|
||||
**Surface boundary — owns:** `src/shell/panel/panel_window.cpp` (the `CreateDialogParam`
|
||||
call at `:135–137`, the dialog proc's platform contract, the drop-accept opt-in at
|
||||
`:145–150`), `src/resource.rc`, `src/resource.h`, and — **under the resgen route only** —
|
||||
call and its `if (!g_panel.hwnd) return;` guard, both in `openPanel`, the dialog proc's platform contract, the drop-accept opt-in
|
||||
also in `openPanel`), `src/resource.rc`, `src/resource.h`, and — **under the resgen route only** —
|
||||
one `target_sources` line in `src/app/CMakeLists.txt`'s `else()` branch plus a new
|
||||
include-shim TU. **Does not own:** any other panel TU, `draw_kit`, or any CMake target
|
||||
property.
|
||||
@@ -685,7 +687,7 @@ as the Linux defaults, following SWELL's own no-fontconfig fallback list
|
||||
(LiberationSans/DejaVuSans, LiberationMono/DejaVuSansMono) as precedent. **One code path**,
|
||||
shared with macOS's eventual San Francisco/Menlo (Λ-D4: made in shared form, not verified).
|
||||
|
||||
The subtlety worth carrying into the work: `draw_kit.cpp:74`'s `if (!hf) return` guard does
|
||||
The subtlety worth carrying into the work: `draw_kit.cpp`'s `loadFont`'s `if (!hf) return` guard does
|
||||
**not** catch the failure mode here. SWELL's `CreateFont` always returns a non-null handle
|
||||
even when the face never resolved — the failure is recorded internally as a null
|
||||
`typedata`, not as a null return. So a wrong or missing face is not observable at the call
|
||||
@@ -706,7 +708,7 @@ cosmetic or a readability regression. **Discharges:** L2-09.
|
||||
**Goal.** The build's source list stops relying on every TU's own `#ifdef` discipline, and
|
||||
the invariants Linux weakens are stated where a reviewer will read them.
|
||||
|
||||
**Surface boundary — owns:** the `target_sources` list in `src/app/CMakeLists.txt:8–51`
|
||||
**Surface boundary — owns:** the `add_library(reaper_reasampler MODULE ...)` source list in `src/app/CMakeLists.txt`
|
||||
(the *list*; the property blocks are Λ-W2-T2's), any new platform-sibling TU the sweep
|
||||
showed was needed, `src/shell/actions/drag_out_win.h`'s invariant comment, and the
|
||||
corresponding `src/shell/**/CLAUDE.md` invariant passages. **Does not own:** any behaviour
|
||||
@@ -718,7 +720,7 @@ change in a shipped code path.
|
||||
`arrange_drop_win.cpp` and `instrument_drop_win.cpp` are `_win`-suffixed for the surface
|
||||
they serve, not for a platform dependency, and the audits found them portable by
|
||||
inspection — confirm against the actual compile rather than re-inspecting.
|
||||
- **L2-10** — make `drag_out_win.h:7–11` the doc a Linux reviewer is pointed at, and treat
|
||||
- **L2-10** — make `drag_out_win.h`'s file-header invariant comment the doc a Linux reviewer is pointed at, and treat
|
||||
"MOVE is structurally impossible" as a Windows-scoped claim. **The wording is Λ-F3's
|
||||
ruling**; the edit is this track's regardless of which way it goes.
|
||||
- **L2-11** — no Linux action. If the predicate is touched at all it becomes
|
||||
@@ -808,7 +810,7 @@ modstub TU), and the three D5 passages in `src/core/instrument/CLAUDE.md`,
|
||||
includes `<windows.h>` with no `SMTG_OS_*` guard; `linuxmain.cpp` exports `ModuleEntry`
|
||||
and `ModuleExit`, **both mandatory** — the SDK's own loader refuses the module without
|
||||
either. Both files are already vendored; this is a source swap plus a platform `if()`.
|
||||
- **Split the `WIN32 AND EXISTS` conjunction** at `src/shell/instrument/CMakeLists.txt:9`.
|
||||
- **Split the `WIN32 AND EXISTS` conjunction** in `src/shell/instrument/CMakeLists.txt`'s `if(WIN32 AND EXISTS ...)` gate.
|
||||
The `EXISTS` half stays (a fresh clone with no VST3 slice must still configure); the
|
||||
`WIN32` half becomes a Windows-or-Linux predicate.
|
||||
- **B2** — the artifact becomes a directory:
|
||||
@@ -1001,7 +1003,7 @@ the strict reading:
|
||||
| File | Tracks | Nature |
|
||||
|---|---|---|
|
||||
| `src/app/CMakeLists.txt` | Λ-W2-T2 (property + platform blocks), Λ-W2-T3 (one `target_sources` line, **resgen route only**), Λ-W4-T3 (the source list), Λ-W5-T1 (the `install()` rule) | Four disjoint regions of one file. Λ-W2-T2 and Λ-W2-T3 are the only pair in the same wave; one line each. |
|
||||
| `src/shell/panel/draw_kit.cpp` | Λ-W2-T1 (`loadFont`'s `CreateFont` args, `:73`), Λ-W4-T2 (the five call sites, `:154–158`) | Different waves. |
|
||||
| `src/shell/panel/draw_kit.cpp` | Λ-W2-T1 (`loadFont`'s `CreateFont` args), Λ-W4-T2 (`kitFontsInit`'s five `loadFont` call sites) | Different waves. |
|
||||
| `src/shell/instrument/CMakeLists.txt` | Λ-W2-T2 (thread linkage), Λ-W6-T1 (gate, entry point, bundle, install), Λ-W7-T1 (one added TU) | Different waves. |
|
||||
| `src/shell/panel/panel_window.cpp` | Λ-W2-T3 alone | **Deliberately not split.** The L2-06 diagnostic and the Λ-01 resource route are the same function; under the resource-id-0 route they are the same *line*. Splitting them would be semantic contention. |
|
||||
| `src/shell/instrument/editor_platform.cpp` | Λ-W6-T2 (the refusal branch), Λ-W8-T1 (the real branch) | Different waves; the second replaces the first's computation without touching its call sites. |
|
||||
@@ -1125,7 +1127,7 @@ carried. Nothing is gated on it before Λ-W5.
|
||||
0, which creates an opaque child window, provided a `WNDPROC` returning `LRESULT` (cast to
|
||||
`DLGPROC`) is passed instead of a real `DLGPROC`. The implementation confirms both halves —
|
||||
`swell-dlg-generic.cpp` skips the resource lookup entirely when `resid` is 0. And
|
||||
`IDD_BANK_PANEL` is precisely the case it was written for: `src/resource.rc:18–22` is a
|
||||
`IDD_BANK_PANEL` is precisely the case it was written for: `src/resource.rc`'s `IDD_BANK_PANEL` dialog block is a
|
||||
`WS_CHILD` dialog with an empty `BEGIN`/`END` body and zero controls, whose own header
|
||||
comment says "the bank_panel shell owns every pixel and draws the sample grid with LICE in
|
||||
`WM_PAINT`". **Taking this route deletes the entire resgen pipeline from the non-Windows
|
||||
|
||||
Reference in New Issue
Block a user