From cd4a25ae23f0dd8034b012e4606dec8bf5337de5 Mon Sep 17 00:00:00 2001 From: Jonathan Sykes Date: Thu, 8 Oct 2026 04:26:10 +0800 Subject: [PATCH] Document Phase 3 delivery and remaining paint regression --- plans/phase3-report.md | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 plans/phase3-report.md diff --git a/plans/phase3-report.md b/plans/phase3-report.md new file mode 100644 index 0000000..df53441 --- /dev/null +++ b/plans/phase3-report.md @@ -0,0 +1,42 @@ +# Phase 3 report + +Shipped on `codex/phase3`: plan `895f20a`; contract synchronization `f804a23`; +pinned loader `4853c2c`; server embedding `d98d444`; integration `5d6a154`; +review fixes `ccfb7d9` through `fab444b`; browser verification/results `b840505`. + +The CSP-safe external head loader reads saved appearance before body creation. +Modern clients block core plus their active layout/dependencies; Settings loads before switching +and saves immediately. Imported settings also report their layout. Shared markup +visibility remains eager. Rare features, stats/export and layout scripts load on +intent; playlist/settings/service mode/lyrics editor remain in RAM. Idle warming +honours Save-Data and shares one six-download pool across tabs. Legacy migration +blocks all layouts because old pages cannot report selection. P2P/direct preserve +eight-second startup; EQ metadata/DeviceDB stay eager. + +Accepted decision: executing groups stay pinned until a playback-guarded user +reload. Unexecuted groups use newer cached URLs only with matching core/dependency +contracts; otherwise retain N-1, mark reload-required and request the existing +Refresh UI banner. Changed contracts block activation. Phase 4 must supply +state disposal/handoff before live replacement; app.js splitting remains there. + +Verification: 190 frontend/183 server tests, no skips. Chromium/WebKit pass warmed +feature first-use with zero network, offline layouts, pre-body selection, +Settings search/extensions, Car controls, imported appearance, stale fallback, +contract/pinning guards and playback protection. Actual b77938a migration passes +both proxy profiles: one user-initiated reload/banner, N-1 tab and offline boot. +Both rollback flags pass offline checks. + +Reduced one-run LTE, Chromium/WebKit (`phase3-final-2026-10-08.json`): initial compressed JS/CSS +221,307/274,813 bytes versus reconstructed Phase 0 276,414/338,940 (−19.9%/−18.9%). +Historical Phase 0 boot 10,480/3,290 ms becomes 7,193/3,293; warm 419/81; +offline 166/84. FCP 1,356/2,467 versus 1,572/1,100: WebKit first paint regresses, +so the paint target remains unmet despite bootstrap/preload reordering. Core JS +updates transfer 159,905/194,026 bytes; inactive CSS readiness 29,724/28,082, +with that CSS downloaded after activation. Warm counters include idle downloads. +WebKit still duplicates cold app transfer; repeated medians await Phase 5. + +Workers/importScripts/WASM, piano engine and F7 now use hashed URLs; fonts/icons/ +webmanifest remain plain and cached (exact matrix in perf/README.md). External +piano model downloads remain on request. Owner iPhone checks: installed/offline +layouts, feature first-use, update guard/override, locked playback 30 minutes, +OPFS/quota coexistence. No deployment.