Files
ytplayer/plans/phase2-report.md

44 lines
2.5 KiB
Markdown

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