Record JamesDSP integration verification results

This commit is contained in:
Jonathan Sykes
2026-10-09 21:08:58 +08:00
parent 6bb3271431
commit 7591c2d14c
3 changed files with 27595 additions and 2 deletions

View File

@@ -0,0 +1,29 @@
# JamesDSP integration report — 2026-10-09
Phases 1–5 are implemented in five focused commits. Standard remains the default and its EQ construction is byte-for-byte checked against the pre-refactor fixture. JamesDSP lives only in the lazy `feature:jamesdsp` group; the service worker shell has no DSP assets. The shared `AudioGraph` owns the sole context and one source per media element. Enabling JamesDSP creates one worklet and one WASM heap; errors restore Standard routing. iOS remains gated by `liveAudioIOS`. Uploaded impulse responses are session-only, and Liveprog/DDC/arbitrary text effects are excluded. The worklet uses a static, pinned relative module import because AudioWorkletGlobalScope rejects dynamic import.
Verification:
| Check | Result |
|---|---|
| Frontend tests | 266 passed, 0 failed |
| Server suite | Passed with the integration test venv on PATH |
| Offline completion | Chromium + WebKit: 109/109 runtime files, zero missing/failures; all four layouts |
| Lazy / hidden timers | Both engines pass; hidden-timers has no page errors |
| UI geometry / icons | 384 geometry cases and 24 icon cases pass |
| Settings persistence | 24 settings keys unchanged through old-client update; Chromium OPFS save/play passes before and after update. Linux WebKit lacks native OPFS. DSP preset persists while disabled. |
| DSP harness | Both engines pass all seven presets, Standard comparison, A/B bypass, track switch, offline reload and corrupt-WASM fallback. One heap, one worklet, two pre-existing media sources. |
| Migration | Both engines pass unthrottled: one banner/reload, 142 cached entries, offline reload and playback guard. Lossy Chromium repeatedly times out waiting for the new stamped page after the legacy user-triggered refresh, despite candidate install and `CACHE_STATUS ready:true`; WebKit lossy was not reached. |
Three-run cold medians versus `plans/integration-report.md`:
| Engine/profile | FCP before → after | Boot before → after | Cold wire before → after | Positive `app.js` bodies |
|---|---:|---:|---:|---:|
| Chromium LTE | 1360 → 1360 ms | 6457 → 6677 ms | 648 KB → 1.82 MB | 1 |
| Chromium lossy | 1992 → 1936 ms | 10407 → 10582 ms | 648 KB → 1.82 MB | 1 |
| WebKit LTE | 895 → 904 ms | 2307 → 2374 ms | 976 KB → 2.14 MB | 1 |
| WebKit lossy | 2744 → 2751 ms | 5642 → 5757 ms | 983 KB → 2.15 MB | 1 |
FCP/boot are within 4% of the integrated build. Cold-session wire grows by the approximately 1.2 MB upstream WASM, fetched after paint by the required completion job so JamesDSP remains available offline. This is a real first-install transfer cost. The cold results are in `perf/results/dsp-cold-check.json`.
No real iPhone, locked-screen playback, thermal/CPU timing, real-ear preset tuning, crossfade, P2P, or active-DSP saved/OPFS playback was verified. Phase 7 beta push/deploy was intentionally not run: this task explicitly forbids push/deploy. Do not merge or enable the engine by default until the lossy migration handoff is resolved and an iPhone beta check validates lock-screen expectations and CPU cost.