Files
ytplayer/plans/phase4-verification.md

120 lines
6.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Phase 4 verification
The served frontend is build `c3dbdd7039db`, source delivery commit `2c50035`.
`phase4-final-2026-10-08.json` records parent b335f95 because the review fix was
uncommitted when its scratch tree was copied; that tree includes exactly the
frontend subsequently committed as 2c50035. The isolated cold result records both
2c50035 and the build tag. Earlier phase result files were restored after harnesses
wrote their default paths; Phase 4 copies retain the actual new run evidence.
## Six green seams
| Commit | Seam | Original bytes moved | Frontend tests | Server tests | Both-engine cached smoke / hidden timers |
|---|---|---:|---:|---:|---|
| 3c9a24a | Eager shell/views/section rail | 98,378 | 192 | 183 | Pass |
| 5fb9564 | Presenter | 9,492 | 193 | 183 | Pass |
| 8e7fa19 | Remote client | 30,421 | 194 | 183 | Pass |
| 94ea211 | Watch party | 22,833 | 195 | 183 | Pass |
| 0475a18 | Share/External | 13,334 | 196 | 183 | Pass |
| b335f95 | Stats view | 7,074 | 197 | 183 | Pass |
| 2c50035 | Lazy-entry rejection handling | — | 198 | 183 | Pass |
After every seam, `node --test frontend/*.test.js`, `bun install` then `bun run test`
in server, `node perf/hidden-timers.mjs`, and `node perf/seams.mjs --browser all`
ran. Server tests used PATH="$PWD/../perf/.tmp/test-venv/bin:$PATH" so yt-dlp
worker tests also ran, without skips. Logs are in gitignored perf/.tmp; representative
actual output:
```
ℹ tests 198
ℹ pass 198
ℹ fail 0
ℹ skipped 0
```
Server totals across its isolated test processes: 183 pass, 0 fail, 0 skip.
```
chromium {"browser":"chromium","checked":["shell","presenter","remote","party","share","stats"],"offlineNetworkRequests":0,"errors":[]}
webkit {"browser":"webkit","checked":["shell","presenter","remote","party","share","stats"],"offlineNetworkRequests":0,"errors":[]}
Result: ALL ASSERTIONS PASSED
```
The cache smoke stops Bun and blocks its proxy, then tests home playlists and eager
Settings, Presenter blank/pair validation, Remote pair form/close, Party local UI,
Share timestamp editing, External uploaded-media sheet/M3U, populated Stats view,
and a rejected entry action. Network relays are still required to connect parties
or remotes; offline verification proves cached code/UI, not offline relay service.
Existing lazy harness passes offline layouts, first-use, Settings extensions,
contract guards, pinned instances and update-during-playback on both engines.
One review smoke WebKit process terminated during concurrent browser checks; an
isolated rerun and the final expanded both-engine smoke passed. Initial harness
fixture errors (incorrect Settings selector, absent VM helper, timestamp format,
hidden list pane) were corrected to exercise actual UI; no product tests were
removed or weakened.
## Measurements
Actual commands:
```
node perf/baseline.mjs --runs 1 --browser all --profile lte --scenario all --out perf/results/phase4-final-2026-10-08.json --compare perf/results/after-phase0-2026-10-07.json
node perf/baseline.mjs --runs 3 --browser chromium --profile lte --scenario cold --out perf/results/phase4-cold-isolated-2026-10-08.json --compare perf/results/after-phase0-2026-10-07.json
```
Full reduced run overlapped other checks; its Chromium long tasks were 495 ms.
Repeat cold-only runs with no concurrent tests produced 297/274/275 ms (median
275). Keep both results: neither is rewritten. WebKit lacks the long-task API.
Historical Phase 0 is five-run data; these reduced measurements are directional.
| Metric | Phase 0 Chromium / WebKit | Phase 3 Chromium / WebKit | Phase 4 Chromium / WebKit |
|---|---:|---:|---:|
| Initial compressed JS/CSS | 276,414 / 338,940* | 221,307 / 274,813 | 210,419 / 255,200 |
| Cold boot ms | 10,480 / 3,290 | 7,193 / 3,293 | 7,010** / 2,977 |
| Cold FCP ms | 1,572 / 1,100 | 1,356 / 2,467 | 1,352** / 2,401 |
| Cold long-task ms | 454 / unavailable | 287 / unavailable | 275** / unavailable |
| Warm boot ms | 692 / 139 | 419 / 81 | 467 / 132 |
| Offline boot ms | 259 / 137 | 166 / 84 | 180 / 90 |
| Core app update wire bytes | 611,338 / 680,822 | 159,905 / 194,026 | 125,795 / 147,259 |
| Inactive CSS blocking-readiness bytes | 611,476 / 680,831 | 29,724 / 28,082 | 30,263 / 28,713 |
| Feature edit through actual idle cache fill | — | — | 33,408 / 41,364 |
*Matched Phase 0 source reconstructed in Phase 3; historical JSON lacks initial
bytes. **Isolated three-run Chromium cold median. Other Phase 4 numbers are the
one-run both-browser suite. Warm counters include unfinished initial idle caching.
CSS readiness excludes its later background payload; it is not full update cost.
WebKit first paint still fails the master no-regression target. Full five-run
comparisons belong to Phase 5. Native iPhone timing/audio/quota is unverified.
Actual feature-update output:
```
run 1/1: 33408 bytes, 8 reqs, dur=1376ms
run 1/1: 41364 bytes, 7 reqs, dur=1358ms
```
Only presenter.js application payload transfers (3,118 / 3,587 compressed bytes).
Totals include changed stamped index, manifest, version checks, sw.js checks and
WebKit's 1,954-byte sync-core worker import. No app.js, unchanged core views,
fonts, icons or CSS transfer. The benchmark asserts this rather than inferring it
from the lower total. Final app.js is 408,473 versus 587,029 bytes: −178,556,
−30.4169%; original code moved totals 181,532, facade overhead 2,976 bytes.
## Migration, rollback and owner checks
Both engines pass b77938a migration with lossy/stalling and unthrottled proxies:
122 cached SHELL entries, one banner and exactly one user-initiated reload,
21 legacy URL checks, N-1 open-tab continuity, offline boot, playback guard,
eviction repair and incremental refresh. Result JSON records the real runs.
No automatic activation/reload or live singleton replacement is added.
Rollback ASSET_SYNC=0 and ASSET_HASHING=0 use the existing legacy path; commands
and results are in perf/README.md and perf/results. No new feature flag.
Revert an individual seam to restore its previous parsing behavior.
Owner must verify a real iPhone PWA: warm feature first-use, selected/offline layout,
Presenter/Remote/Party sessions, update guard/override, locked audio 30 minutes,
interruption/resume, saved OPFS music surviving cache quota pressure. Nothing was
pushed, merged or deployed.