# Phase 1 report Shipped: `6cb00d5` adds asset groups/contracts, boot snapshots, per-file hashes, HTML stamping, `/api/manifest`, ETag/304, hash headers and `ASSET_HASHING=0`. `d18d17c` preserves the exact legacy index/binary cache rules and pins SW bytes. Plan: `ad85cb6`; `84546ee` groups Glass Stage dependencies together. Migration harness/results: `7c45d09`. Verification: 156 frontend and 178 server tests pass. Server tests used an isolated scratch Python environment with yt-dlp installed; none were skipped. Both service-worker sources, index source, playback and timers remain unchanged. Production fixture: `b77938a` → `1175f1a1d2c1`, reproduced without production calls. Chromium/WebKit migration passes through the lossy/stalling proxy: one banner, one update reload, all 87 shell entries verified, 21 legacy URL/body checks, and offline boot with Bun stopped. Migration took 19.4/15.3 s respectively. WebKit's known disconnected API transport errors are checked separately; script errors during installation/update fail the harness. Reduced Chromium LTE: three-run cold median before final regrouping 10,466 ms vs 10,480 ms. Final standalone single-run cold: 11,137 ms (+6.3%); FCP 1,564 ms vs 1,572 ms; wire bytes 1,042,858 (+0.3%). Warm/offline boots: 641/232 ms vs 692/259 ms. Overlapped-run timings are retained separately. JS-requested assets receiving hashed URLs: **none**. HTML CSS/JS references are hashed, including sha256-wasm.js/loudness-wasm.js (embedded WASM; no standalone .wasm fetch). Plain worker URLs: opfs-worker.js, hash-worker.js, direct-recv-worker.js, p2p-recv-worker.js. Plain worker imports: sha256.js, resume-core.js, sha256-wasm.js. Plain dynamic loads: piano-engine.mjs, vendor/framework7-swipe.min.js. Propagating URL maps safely needs caller/worker changes and a cached bootstrap; retain the unchanged client protocol this phase. All are manifested; piano-engine.mjs is historically absent from SHELL, an existing offline limitation deferred to the loader phase. Also plain: manifest.webmanifest; icons/icon-{192,512}.png; fonts/{BricolageGrotesque,HankenGrotesk,JetBrainsMono,PlusJakartaSans}-{latin,latin-ext}.woff2. Font preloads must match fonts.css URLs; manifest icon paths remain unchanged. Build identity hashes sorted canonical metadata with the index build-meta placeholder intact; published index/SW hashes describe final served bytes, avoiding self-reference. Restart after frontend edits; hashing mode ignores BUILD_TAG overrides. Incremental downloads/lazy parsing await later phases. Owner iPhone checks: install/update, offline launch, active layout, then 30-minute locked playback, dropouts, battery use and resume. No push, merge or deployment.