Files
ytplayer/plans/phase2-report.md

2.5 KiB

Phase 2 report

Shipped on codex/phase2: plan a1f16f2; incremental sync/playback guards 54a07a0; atomic state, exact hash rejection and retention 5b25cca; single-tag rollback compatibility bb446c7; migration verification 5d1e5ec; fail-closed status handling 9240456.

Persistent ytplayer-assets stores verified exact URLs and current/previous manifests. Downloads resume, use six workers/three attempts, and publish only complete blocking sets. Activation retains N-1 changed/removed files, prunes N-2, then deletes legacy caches; quota is logged. All current groups block; lazy parsing/background warming await Phase 3.

Server gaps addressed: inject ASSET_SYNC and the hashed sync-core import, hash final worker bytes, compress manifest responses while preserving build ETags. ASSET_SYNC=0 selects legacy sync; ASSET_HASHING=0 also selects legacy.

Verification: 168 frontend/181 server tests pass without skips. Chromium/WebKit migration passes with and without stalls using actual b77938a code: ready:true, zero legacy refresh downloads, one banner/user-triggered reload, N-1 open tab, eviction repair, incremental refresh and offline boot. Both rollback flags pass offline browser checks. Async polling fixes the Playwright harness race.

Accepted legacy exception: b77938a retains its four-second timer after the USER presses Refresh UI and does not report playback. New pages guard playback, offer explicit override and post PLAYING; workers defer known-playing requests and never call skipWaiting during installation.

Final one-run LTE measurements (phase2-final-2026-10-07.json, Chromium/WebKit): JS updates 155,648/189,354 bytes versus 611,338/680,822; CSS 31,476/30,545 versus 611,476/680,831. Sync fetches changed app/style + index/manifest; fonts/icons transfer zero bytes. Browser worker checks add overhead: Chromium downloads sw.js twice; WebKit also downloads the unchanged imported core. Thus total CSS exceeds 30,000 bytes.

Cold bytes: 624,762/1,191,130 versus 1,040,158/1,180,749. Chromium transfers app.js once; WebKit transfers it twice despite HTTP-cache reuse attempts. Cache sharing remains unresolved. Cold boot: 11,155/4,327 ms versus 10,480/3,290; warm: 671/121 versus 692/139; offline: 264/133 versus 259/137. Single-run cold regressions need further investigation; no claim that every performance target was met.

Owner iPhone checks: locked playback, override/cancel, stall recovery, offline launch and OPFS/quota coexistence. No push, merge or deployment.