# 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.