From b84050578b3d75e9adb0b7b6632cbf7b276ba37a Mon Sep 17 00:00:00 2001 From: Jonathan Sykes Date: Thu, 8 Oct 2026 04:19:02 +0800 Subject: [PATCH] Verify staged lazy loading and record Phase 3 measurements --- perf/README.md | 63 +- perf/baseline.mjs | 47 +- perf/lazy.mjs | 135 + perf/migration.mjs | 5 +- perf/results/phase3-final-2026-10-08.json | 2349 ++++++++++++++++ .../phase3-hashing-rollback-2026-10-08.json | 132 + perf/results/phase3-lazy-2026-10-08.json | 79 + .../phase3-migration-lossy-2026-10-08.json | 41 + ...ase3-migration-unthrottled-2026-10-08.json | 41 + .../phase3-phase0-initial-2026-10-08.json | 2420 +++++++++++++++++ .../phase3-sync-rollback-2026-10-08.json | 132 + plans/phase3-staged-apply-decision.md | 64 +- 12 files changed, 5462 insertions(+), 46 deletions(-) create mode 100644 perf/lazy.mjs create mode 100644 perf/results/phase3-final-2026-10-08.json create mode 100644 perf/results/phase3-hashing-rollback-2026-10-08.json create mode 100644 perf/results/phase3-lazy-2026-10-08.json create mode 100644 perf/results/phase3-migration-lossy-2026-10-08.json create mode 100644 perf/results/phase3-migration-unthrottled-2026-10-08.json create mode 100644 perf/results/phase3-phase0-initial-2026-10-08.json create mode 100644 perf/results/phase3-sync-rollback-2026-10-08.json diff --git a/perf/README.md b/perf/README.md index 32a4606..90fbbb7 100644 --- a/perf/README.md +++ b/perf/README.md @@ -209,6 +209,65 @@ inspect individual responses to distinguish those from app asset downloads. Migration results are `phase2-migration--2026-10-07.json`. `ASSET_SYNC=0` selects the legacy path while preserving the persistent utility cache. `ASSET_HASHING=0` also selects legacy sync because single-tag URLs cannot -pass per-file hash checks. Current assets.json groups all block; idle loading and -lazy parsing await Phase 3. Incremental mode now caches the manifested +pass per-file hash checks. In Phase 2 all assets.json groups blocked; Phase 3 selects core plus the active +layout and warms background groups at idle. Incremental mode now caches the manifested `piano-engine.mjs` even though it remains absent from the legacy SHELL. + + +## Phase 3 lazy loading and staged apply + +```bash +node perf/lazy.mjs --browser all +node perf/migration.mjs --browser all --profile lossy +node perf/migration.mjs --browser all --profile unthrottled +node perf/baseline.mjs --runs 1 --browser all --profile lte --scenario all \ + --out perf/results/phase3-final-2026-10-08.json \ + --compare perf/results/after-phase0-2026-10-07.json +node perf/baseline.mjs --runs 1 --browser all --profile lte --scenario cold \ + --frontend-commit 7bc5b4f8b50d78ece3cca5100d54a97fece2748a \ + --out perf/results/phase3-phase0-initial-2026-10-08.json +ASSET_SYNC=0 node perf/baseline.mjs --runs 1 --browser all --profile lte \ + --scenario offline --out perf/results/phase3-sync-rollback-2026-10-08.json +ASSET_HASHING=0 node perf/baseline.mjs --runs 1 --browser all --profile lte \ + --scenario offline --out perf/results/phase3-hashing-rollback-2026-10-08.json +``` + +`initialJsCss` sums compressed Resource Timing bodies for page JS/CSS initiated +before DOMContentLoaded, excluding SW precache and later idle feature parsing. +The saved Phase 0 results lack that metric: `--frontend-commit` reconstructs its +frontend in scratch using the current delivery backend for a matched initial-byte +comparison. Historical boot/FCP comparisons still use `after-phase0`. Reduced +single-run measurements are directional; Phase 5 supplies repeated medians. +Update scenarios now wait for every build-N group to finish idle caching before +starting the counter, excluding unfinished initial downloads. Waiting-worker +bytes represent blocking readiness; an inactive layout's changed CSS downloads +later at idle after activation. + +The browser harness checks pre-body layout selection, immediate offline reload, +four distinct Car mode controls, optional Settings search, all extension panels, +zero network for warmed first use/layout switches, contract guards and pinned +instances. Known WebKit disconnected API transport errors are recorded separately; +script errors still fail. Save-Data prevents automatic warming. + +The index contains inert JSON and an external head bootstrap under unchanged +CSP. Source JSON mirrors assets.json for native/static shells; the server replaces +it with hashed build-local URLs. No boot-time manifest network request is added. +Shared layout visibility defaults remain eager in layout-base.css. +Pure EQ settings metadata and DeviceDB remain eager to preserve synchronous +player defaults and offline file bookkeeping. P2P/direct parse on actual use or +the existing eight-second sharing startup. Searching Settings explicitly loads +optional panels so their original labels remain searchable. + +| JS-requested assets | Phase 3 URL treatment | +|---|---| +| opfs-worker.js, hash-worker.js, direct-recv-worker.js, p2p-recv-worker.js | Lazy.worker uses embedded per-file URL | +| Workers' sha256.js, resume-core.js, sha256-wasm.js | First postMessage carries originating build URLs; importScripts uses them | +| piano-engine.mjs | Dynamic import uses Lazy.url; incremental cache warms it | +| vendor/framework7-swipe.min.js | Ordered layout group and fallback use Lazy.url | +| loudness-wasm.js | Remains an eager stamped script; embedded binary needs no separate URL | +| fonts/fonts.css and font preloads; webmanifest/icons | Plain URLs stay aligned with CSS/manifest references; all belong to manifested cache groups | + +Legacy pages cannot report their selected layout. Their one-time migration blocks +all layouts to preserve immediate offline selection; modern pages block only the +reported layout and its shared controls. Executing groups never re-evaluate live. +See plans/phase3-staged-apply-decision.md: Phase 4 must add disposal/state handoff. diff --git a/perf/baseline.mjs b/perf/baseline.mjs index b4c893c..f3d4bbf 100755 --- a/perf/baseline.mjs +++ b/perf/baseline.mjs @@ -25,7 +25,7 @@ * --compare Compare results against a previous baseline JSON */ -import { spawn, spawnSync } from 'node:child_process'; +import { spawn, spawnSync, execFileSync } from 'node:child_process'; import { existsSync, mkdirSync, rmSync, cpSync, appendFileSync, statSync, writeFileSync, readFileSync, symlinkSync, unlinkSync } from 'node:fs'; import path from 'node:path'; import { fileURLToPath } from 'node:url'; @@ -58,6 +58,7 @@ function parseArgs() { scenario: 'all', // 'cold', 'warm', 'offline', 'update-js', 'update-css', or 'all' out: null, compare: null, + frontendCommit: null, }; for (let i = 0; i < args.length; i++) { @@ -67,6 +68,7 @@ function parseArgs() { else if (a === '--profile' && i + 1 < args.length) options.profile = args[++i]; else if (a === '--scenario' && i + 1 < args.length) options.scenario = args[++i]; else if (a === '--out' && i + 1 < args.length) options.out = args[++i]; + else if (a === '--frontend-commit' && i + 1 < args.length) options.frontendCommit = args[++i]; else if (a === '--compare' && i + 1 < args.length) options.compare = args[++i]; } @@ -365,6 +367,8 @@ async function runColdScenario({ browserType, server, proxy, profile }) { const fcp = paint.find((p) => p.name === 'first-contentful-paint'); return { + initialJsCss: performance.getEntriesByType('resource').filter(entry=>/\.(?:js|css)(?:[?#]|$)/.test(entry.name)&&entry.startTime <= nav.domContentLoadedEventEnd&&['script','link','css'].includes(entry.initiatorType)).reduce((sum,entry)=>sum+entry.encodedBodySize,0), + initialAssetRequests: performance.getEntriesByType('resource').filter(entry=>/\.(?:js|css)(?:[?#]|$)/.test(entry.name)&&entry.startTime <= nav.domContentLoadedEventEnd&&['script','link','css'].includes(entry.initiatorType)).map(entry=>({url:entry.name,bytes:entry.encodedBodySize})), fcp: fcp ? Math.round(fcp.startTime) : null, lcp: window.__lcp ? Math.round(window.__lcp) : null, domContentLoaded: nav ? Math.round(nav.domContentLoadedEventEnd - nav.startTime) : null, @@ -393,6 +397,8 @@ async function runColdScenario({ browserType, server, proxy, profile }) { bootDone: pageMetrics.bootDone, longTaskTotal: pageMetrics.longTaskTotal, requests: stats.requests, + initialJsCss: pageMetrics.initialJsCss, + initialAssetRequests: pageMetrics.initialAssetRequests, swInstallDuration, swInstallBytes: stats.totalWireBytes, storageEstimate: storage, @@ -465,6 +471,8 @@ async function runWarmScenario({ browserType, server, proxy, profile }) { const fcp = paint.find((p) => p.name === 'first-contentful-paint'); return { + initialJsCss: performance.getEntriesByType('resource').filter(entry=>/\.(?:js|css)(?:[?#]|$)/.test(entry.name)&&entry.startTime <= nav.domContentLoadedEventEnd&&['script','link','css'].includes(entry.initiatorType)).reduce((sum,entry)=>sum+entry.encodedBodySize,0), + initialAssetRequests: performance.getEntriesByType('resource').filter(entry=>/\.(?:js|css)(?:[?#]|$)/.test(entry.name)&&entry.startTime <= nav.domContentLoadedEventEnd&&['script','link','css'].includes(entry.initiatorType)).map(entry=>({url:entry.name,bytes:entry.encodedBodySize})), fcp: fcp ? Math.round(fcp.startTime) : null, lcp: window.__lcp ? Math.round(window.__lcp) : null, domContentLoaded: nav ? Math.round(nav.domContentLoadedEventEnd - nav.startTime) : null, @@ -542,6 +550,8 @@ async function runOfflineScenario({ browserType, server, proxy, profile }) { const fcp = paint.find((p) => p.name === 'first-contentful-paint'); return { + initialJsCss: performance.getEntriesByType('resource').filter(entry=>/\.(?:js|css)(?:[?#]|$)/.test(entry.name)&&entry.startTime <= nav.domContentLoadedEventEnd&&['script','link','css'].includes(entry.initiatorType)).reduce((sum,entry)=>sum+entry.encodedBodySize,0), + initialAssetRequests: performance.getEntriesByType('resource').filter(entry=>/\.(?:js|css)(?:[?#]|$)/.test(entry.name)&&entry.startTime <= nav.domContentLoadedEventEnd&&['script','link','css'].includes(entry.initiatorType)).map(entry=>({url:entry.name,bytes:entry.encodedBodySize})), fcp: fcp ? Math.round(fcp.startTime) : null, lcp: window.__lcp ? Math.round(window.__lcp) : null, domContentLoaded: nav ? Math.round(nav.domContentLoadedEventEnd - nav.startTime) : null, @@ -602,6 +612,27 @@ async function runUpdateScenario({ browserType, server, proxy, profile, updateKi await sleep(50); } + // Phase 3 activation precedes idle feature caching. Measure updates from a + // genuinely warm build, rather than counting unfinished first-install bytes. + if (await page.evaluate(()=>!!window.Lazy && !!window.Lazy.warm)) { + await page.evaluate(()=>Lazy.warm()); + const end=Date.now()+90000; + while (true) { + const ready=await page.evaluate(async()=>{ + const c=await caches.open('ytplayer-assets'),r=await c.match('/__ytp_asset_state'); + if(!r)return false; + const m=(await r.json()).current; + return (await Promise.all(Object.values(m.groups).flatMap(g=>g.files).map(async p=>{ + const response=await c.match(p+'?v='+m.files[p].h); + return response?.headers.get('X-Asset-Hash')===m.files[p].h; + }))).every(Boolean); + }); + if(ready)break; + if(Date.now()>end)throw Error('Idle warm did not complete before update benchmark'); + await sleep(100); + } + } + // Switch server to Tree N+1 (app.js or theme-glass.css modification) const targetTree = updateKind === 'js' ? trees.treeUpdateJs : trees.treeUpdateCss; await server.restartWithPublic(targetTree); @@ -666,9 +697,14 @@ async function main() { const treeUpdateJs = path.join(tmpRoot, 'tree-update-js'); const treeUpdateCss = path.join(tmpRoot, 'tree-update-css'); - cpSync(path.join(REPO_ROOT, 'frontend'), treeBase, { recursive: true }); - cpSync(path.join(REPO_ROOT, 'frontend'), treeUpdateJs, { recursive: true }); - cpSync(path.join(REPO_ROOT, 'frontend'), treeUpdateCss, { recursive: true }); + let frontendSource=path.join(REPO_ROOT,'frontend'); + if(options.frontendCommit) { + const archive=path.join(tmpRoot,'frontend.tar'); + writeFileSync(archive,execFileSync('git',['archive',options.frontendCommit,'frontend'],{cwd:REPO_ROOT,maxBuffer:20*1024*1024})); + execFileSync('tar',['-xf',archive,'-C',tmpRoot]); + frontendSource=path.join(tmpRoot,'frontend'); + } + for(const tree of [treeBase,treeUpdateJs,treeUpdateCss])cpSync(frontendSource,tree,{recursive:true}); // Append 1 comment line to app.js in treeUpdateJs appendFileSync(path.join(treeUpdateJs, 'app.js'), '\n// baseline bench: 1-line app.js comment\n'); @@ -684,6 +720,7 @@ async function main() { const results = { date: new Date().toISOString(), + frontendCommit: options.frontendCommit, commit: spawnSync('git', ['rev-parse', 'HEAD'], { cwd: REPO_ROOT }).stdout.toString().trim(), runsConfigured: options.runs, browsers: {}, @@ -729,6 +766,8 @@ async function main() { autoplayBlocked: coldRuns.some((r) => r.autoplayBlocked), wireBytesByType: coldRuns[0]?.wireBytesByType || {}, requests: coldRuns[0]?.requests || [], + initialJsCss: summarizeList(coldRuns.map(r=>r.initialJsCss)), + initialAssetRequests: coldRuns[0]?.initialAssetRequests || [], }; } diff --git a/perf/lazy.mjs b/perf/lazy.mjs new file mode 100644 index 0000000..6b6092a --- /dev/null +++ b/perf/lazy.mjs @@ -0,0 +1,135 @@ +#!/usr/bin/env node +// Phase 3 checks against the real Bun server, a same-origin restart and real workers. +import assert from 'node:assert/strict'; +import { spawn } from 'node:child_process'; +import { mkdtempSync, cpSync, mkdirSync, symlinkSync, readFileSync, writeFileSync, rmSync } from 'node:fs'; +import { resolve, join } from 'node:path'; +import { createServer } from 'node:net'; +import { chromium, webkit } from 'playwright'; +import { createThrottleProxy } from './proxy.mjs'; +const repo=resolve(new URL('..',import.meta.url).pathname), scratch=mkdtempSync(join(repo,'perf/.tmp/lazy-')); +const sleep=ms=>new Promise(r=>setTimeout(r,ms)); +async function wait(page,fn,arg,timeout=90000){const end=Date.now()+timeout;while(Date.now(){ + await Lazy.load('layout:'+Lazy.layout); + const settle=()=>new Promise(resolve=>setTimeout(resolve,300));await settle(); + const nodes=[...document.querySelectorAll('body,body *')],props=['display','position','color','background-color','font-family','font-size','padding','margin','border-radius','--bg','--text','--radius']; + const snapshot=()=>nodes.map(n=>props.map(p=>getComputedStyle(n).getPropertyValue(p))); + const links=[...document.querySelectorAll('link[data-lazy-css]')],positions=links.map(n=>[n,n.nextSibling]),before=snapshot(); + const loaded=()=>new Promise((resolve,reject)=>{let tries=0;function poll(){if(links.every(n=>n.sheet))return resolve();if(tries++>120)return reject(Error('Reordered CSS did not load'));requestAnimationFrame(poll);}poll();}); + links.forEach(n=>document.head.append(n));await loaded();await settle();const after=snapshot(); + for(const [n,next] of positions.reverse())document.head.insertBefore(n,next); + await loaded();await settle(); + return before.flatMap((values,i)=>values.flatMap((v,j)=>v===after[i][j]?[]:[{element:nodes[i].id||nodes[i].className,property:props[j],before:v,after:after[i][j]}])); + }); + assert.deepEqual(changes,[],'requesting scoped layout CSS earlier preserves its computed appearance'); +} +const args=process.argv.slice(2), requested=args.includes('--browser')?args[args.indexOf('--browser')+1]:'all'; +const results=[]; +async function run(name){ + const cwd=join(scratch,name);mkdirSync(cwd);cpSync(join(repo,'frontend'),join(cwd,'public'),{recursive:true}); + const portServer=createServer();await new Promise(r=>portServer.listen(0,'127.0.0.1',r));const port=portServer.address().port;await new Promise(r=>portServer.close(r)); + let child,browser,proxy,log=''; + async function stop(){if(!child)return;const p=child;child=null;if(p.exitCode===null){p.kill('SIGTERM');await new Promise(r=>p.once('exit',r));}} + async function start(){log='';child=spawn('bun',[join(repo,'server/server.js')],{cwd,env:{...process.env,PORT:String(port),ASSET_HASHING:'1',ASSET_SYNC:'1',BUILD_TAG:'',DB_PATH:join(cwd,'db.sqlite'),DATA_DIR:join(cwd,'data'),MEDIA_DIR:join(cwd,'media'),UPLOAD_DIR:join(cwd,'uploads')},stdio:['ignore','pipe','pipe']});for(const stream of [child.stdout,child.stderr])stream.on('data',c=>log=(log+c).slice(-15000));for(let i=0;i<200;i++){if(child.exitCode!==null)throw Error(log);try{if((await fetch('http://127.0.0.1:'+port+'/api/version')).ok)return;}catch{}await sleep(100);}throw Error(log);} + try { + await start();proxy=createThrottleProxy({targetPort:port,profile:'unthrottled'});const origin='http://127.0.0.1:'+await proxy.listen();proxy.startTracking(); + browser=await ({chromium,webkit}[name]).launch({headless:true});const context=await browser.newContext();let disconnected=false; + await context.route('**/*',r=>r.request().url().startsWith(origin)?r.continue():r.abort()); + await context.addInitScript(()=>{window.__saveData=localStorage.getItem('perf-save-data')==='1';const observer=new MutationObserver(()=>{if(document.body){window.__firstBodyLayout=document.documentElement.dataset.layout;observer.disconnect();}});observer.observe(document,{childList:true,subtree:true});Object.defineProperty(navigator,'onLine',{configurable:true,get:()=>localStorage.getItem('perf-offline')!=='1'});Object.defineProperty(navigator,'connection',{configurable:true,value:{get saveData(){return window.__saveData;}}});}); + const page=await context.newPage(),errors=[],failedRequests=[];page.on('requestfailed',request=>{if(disconnected)failedRequests.push(request.url());});page.on('pageerror',e=>errors.push({message:e.message,disconnected}));page.on('console',m=>{if(m.type()==='error')console.log(name,'console:',m.text());}); + console.log(name,'initial boot');await page.goto(origin);await page.waitForFunction(()=>typeof data!=='undefined'&&document.querySelector('#carModeBtn')); + await wait(page,async()=>!!(await navigator.serviceWorker.getRegistration())?.active); + await page.evaluate(()=>Lazy.warm()); + await wait(page,async()=>{const c=await caches.open('ytplayer-assets'),r=await c.match('/__ytp_asset_state');if(!r)return false;const s=await r.json();return !(await Promise.all(Object.values(s.current.groups).flatMap(g=>g.files).map(async p=>!!await c.match(p+'?v='+s.current.files[p].h)))).includes(false);}); + console.log(name,'warm complete');assert.equal(await page.evaluate(()=>Lazy.loaded('feature:car-mode')),false); + assert.equal(await page.evaluate(()=>[...document.querySelectorAll('.stg-overlay,.deck-chips,.vol-pct,.mode-name,.stg-bot,.ch-badge,.upnext-clear,.list-sub,.p2p-strip,.sleep-status .sl-ic,.sleep-status .sl-sub,.mc-tune')].every(n=>getComputedStyle(n).display==='none')),true,'classic retains shared visibility defaults without loading Glass CSS'); + await checkCssOrder(page); + assert.equal(await page.evaluate(()=>Lazy.loaded('feature:piano')),false); + assert.equal(await page.evaluate(()=>[typeof newPlaylist,typeof renderSettings,typeof enterServiceMode,typeof Notes.load,typeof LyricsCore.fromText].every(type=>type==='function')),true,'playlist, settings, service mode and lyric core remain in RAM'); + // Profile/imported settings use applyAppearance, not the Settings select handler. + await page.evaluate(()=>{data.settings.layout='glass-stage';applyAppearance();}); + await wait(page,()=>document.documentElement.dataset.layout==='glass-stage'&&Lazy.layout==='glass-stage'); + await page.evaluate(()=>{data.settings.layout='classic';applyAppearance();}); + await wait(page,()=>document.documentElement.dataset.layout==='classic'&&Lazy.layout==='classic'); + // Eager application panels stay usable without executing optional settings modules. + await page.click('[data-view="settings"]');await page.click('[data-section="appearance"]');await page.waitForSelector('#setLayout'); + assert.equal(await page.evaluate(()=>Lazy.loaded('feature:piano')),false); + await page.selectOption('#setLayout','glass-stage');await page.waitForFunction(()=>document.documentElement.dataset.layout==='glass-stage'); + await page.evaluate(()=>{window.__saveData=true;localStorage.setItem('perf-save-data','1');localStorage.setItem('perf-offline','1');}); + await stop();disconnected=true;await proxy.setOffline(true); + console.log(name,'offline reload');await page.reload();await page.waitForFunction(()=>typeof data!=='undefined'&&document.querySelector('#carModeBtn')); + assert.equal(await page.evaluate(()=>document.documentElement.dataset.layout),'glass-stage'); + assert.equal(await page.evaluate(()=>window.__firstBodyLayout),'glass-stage','selected layout is established before body/first paint'); + await checkCssOrder(page); + const before=proxy.getStats().requestCount; + await page.getByRole('button',{name:'Car mode',exact:true}).click();await page.waitForSelector('.car-mode'); + assert.equal(await page.locator('.car-controls button').count(),4,'all transport controls survive lazy setup'); + assert.equal(await page.locator('.car-controls #voiceSearchBtn').count(),0,'voice search stays outside transport'); + await page.getByRole('button',{name:'Exit Car mode'}).click(); + assert.equal(proxy.getStats().requestCount,before,'warmed feature first use reaches no network'); + await page.click('[data-view="settings"]');await page.click('[data-section="appearance"]');await page.selectOption('#setLayout','bento-hub');await page.waitForFunction(()=>document.documentElement.dataset.layout==='bento-hub'); + await page.selectOption('#setLayout','f7-swipe');await page.waitForFunction(()=>document.documentElement.dataset.layout==='f7-swipe'&&!!window.Framework7); + await page.selectOption('#setLayout','classic');await page.waitForFunction(()=>document.documentElement.dataset.layout==='classic'); + assert.equal(proxy.getStats().requestCount,before,'offline layout changes reach no network'); + await page.getByRole('searchbox',{name:'Search settings and controls'}).fill('Enable piano transcription'); + await page.locator('.settings-results button').first().waitFor(); + await page.getByRole('searchbox',{name:'Search settings and controls'}).fill(''); + // Every extension panel renders from disk without executing other panels eagerly. + for(const id of ['piano','midi','floating-lyrics','vocal-reducer','equalizer','setlist-import','broadcast']) { + await page.evaluate(id=>document.querySelector('[data-section="'+id+'"]').click(),id); + await wait(page,async id=>{const section=SettingsSections.get(id);return !section.lazyGroup;},id); + } + await page.evaluate(async()=>{await Lazy.load('feature:export');await Lazy.load('feature:video-edit');}); + assert.equal(proxy.getStats().requestCount,before,'all warmed extension assets stay offline'); + await start();disconnected=false;await proxy.setOffline(false);await page.evaluate(()=>localStorage.removeItem('perf-offline')); + // Keep an old tab whose core and group contracts remain those of build N. + const old=await context.newPage();old.on('pageerror',e=>errors.push({message:e.message,disconnected}));await old.goto(origin);await old.waitForSelector('#carModeBtn'); + await old.evaluate(async()=>{window.__saveData=true;await Lazy.load('feature:setlist-import');window.__pinned=window.SetlistImport;}); + await page.evaluate(()=>window.__saveData=true); + const previous=await page.evaluate(()=>Lazy.manifest); + await stop(); + for(const file of ['video-edit.js','setlist-import.js','car-mode.js'])writeFileSync(join(cwd,'public',file),readFileSync(join(cwd,'public',file),'utf8')+'\n// phase3 new file\n'); + const defs=JSON.parse(readFileSync(join(cwd,'public/assets.json')));defs.groups['feature:car-mode'].contract=2;writeFileSync(join(cwd,'public/assets.json'),JSON.stringify(defs)); + // Production stamping replaces the source-only native map with these updated groups. + await start();const target=await(await fetch(origin+'/api/manifest')).json(); + await page.evaluate(async()=>{window.__saveData=true;const r=await navigator.serviceWorker.getRegistration();await r.update();}); + await wait(page,async target=>{const r=await navigator.serviceWorker.getRegistration();if(!r?.waiting)return false;return(await SwUpdate.askCacheStatus(r.waiting))?.version===target;},target.buildTag); + // No automatic navigation; a real playing flag blocks the real apply flow. + let navs=0;page.on('framenavigated',f=>{if(f===page.mainFrame())navs++;}); + await sleep(1000);assert.equal(navs,0); + await page.evaluate(()=>Player._wantsPlaying=true); + page.once('dialog',d=>d.dismiss()); + const guard=await page.evaluate(async()=>{try{await SwUpdate.applyUpdate({getRegistration:()=>navigator.serviceWorker.getRegistration(),askStatus:SwUpdate.askCacheStatus,reload:()=>location.reload()});return false;}catch{return true;}}); + assert.equal(guard,true);assert.equal(navs,0); + await page.evaluate(()=>Player._wantsPlaying=false); + // Explicit worker message, then explicit navigation into new stamped core. + await page.evaluate(async()=>{const r=await navigator.serviceWorker.getRegistration();r.waiting.postMessage({type:'SKIP_WAITING'});}); + await wait(page,async tag=>{const c=await caches.open('ytplayer-assets');return(await(await c.match('/__ytp_asset_state')).json()).current.buildTag===tag;},target.buildTag); + await page.reload();await page.waitForSelector('#carModeBtn');assert.equal(await page.evaluate(()=>Lazy.manifest.buildTag),target.buildTag); + // No warm: the new page gets a same-contract N-1 file immediately from disk. + const cacheKey='/video-edit.js?v='+target.files['/video-edit.js'].h; + assert.equal(await page.evaluate(async key=>!!await(await caches.open('ytplayer-assets')).match(key),cacheKey),false); + const stale=await page.evaluate(async key=>{const r=await fetch(key);return {h:r.headers.get('X-Asset-Hash'),body:await r.text()};},cacheKey); + assert.equal(stale.h,previous.files['/video-edit.js'].h);assert.ok(!stale.body.includes('// phase3 new file')); + await page.evaluate(()=>Lazy.load('feature:video-edit'));const pinned=await page.evaluate(()=>{window.__videoPinned=VideoEdit;return Lazy.loaded('feature:video-edit');});assert.equal(pinned,true); + // Different contract is already downloaded before commit, but the old core must keep N-1. + const oldRequests=[];old.on('request',r=>oldRequests.push(r.url())); + await old.evaluate(()=>Lazy.load('feature:car-mode'));assert.equal(await old.evaluate(()=>Lazy.reloadRequired),true); + await old.getByRole('button',{name:'Refresh UI',exact:true}).waitFor(); + assert.ok(oldRequests.some(u=>u.includes('/car-mode.js?v='+previous.files['/car-mode.js'].h))); + await old.evaluate(()=>Lazy.load('feature:setlist-import'));assert.equal(await old.evaluate(()=>window.SetlistImport===window.__pinned),true); + // Warm new files explicitly; compatible, unexecuted old-page group selects new cached URL. + await page.evaluate(async()=>{const r=await navigator.serviceWorker.getRegistration();r.active.postMessage({type:'WARM_ASSETS',saveData:false});}); + await wait(page,async key=>!!await(await caches.open('ytplayer-assets')).match(key),cacheKey); + await old.evaluate(()=>Lazy.load('feature:video-edit'));assert.ok(oldRequests.some(u=>u.includes(cacheKey))); + await page.evaluate(()=>Lazy.load('feature:video-edit'));assert.equal(await page.evaluate(()=>window.VideoEdit===window.__videoPinned),true); + const offlineTransportErrors=errors.filter(error=>name==='webkit'&&error.disconnected&&(error.message==='TypeError: Load failed'||/\/api\/(?:recommendations\?[^\s]*|version)\.$/.test(error.message))); + assert.deepEqual(errors.filter(error=>!offlineTransportErrors.includes(error)),[]); + if(offlineTransportErrors.length)assert.ok(failedRequests.some(url=>/\/api\/(?:recommendations|version)/.test(url))); + results.push({browser:name,sourceBuildTag:previous.buildTag,classicSharedDefaults:true,cssOrderPreserved:true,settingsSearch:true,carControls:4,offlineFeature:true,firstUseNetwork:0,layoutsOffline:['glass-stage','bento-hub','f7-swipe','classic'],pinned:true,compatibleUnexecutedNewURL:true,incompatibleN1ReloadRequired:true,stagedN1:true,playbackGuard:true,prePaintLayout:true,offlineSettingsPanels:true,scriptErrors:[],offlineTransportErrors}); + console.log(name,'PASS'); + } finally {await browser?.close();await proxy?.close();await stop();} +} +try{for(const name of requested==='all'?['chromium','webkit']:[requested])await run(name);writeFileSync(join(repo,'perf/results/phase3-lazy-2026-10-08.json'),JSON.stringify({results},null,2)+'\n');}finally{rmSync(scratch,{recursive:true,force:true});} diff --git a/perf/migration.mjs b/perf/migration.mjs index 1a455b0..18b2683 100644 --- a/perf/migration.mjs +++ b/perf/migration.mjs @@ -153,6 +153,9 @@ async function run(name) { assert.equal(banners, 1, 'no banner after applying the current build'); assert.equal(await oldTab.evaluate(async()=>await (await fetch('/app.js')).text()),oldBytes,'open legacy tab keeps N-1 plain assets'); await oldTab.close(); + // Phase 3 commits core + layout first; idle warming must fill the retained full shell before offline feature checks. + await page.evaluate(()=>Lazy.warm()); + await waitAsync(page,async files=>{const cache=await caches.open('ytplayer-assets');return (await Promise.all(Object.keys(files).map(async path=>{const response=await cache.match(path+'?v='+files[path].h);return !!response&&response.headers.get('X-Asset-Hash')===files[path].h;}))).every(Boolean);},Object.fromEntries(shell.map(path=>[path==='/'?'/index.html':path,manifest.files[path==='/'?'/index.html':path]]))); const cacheResult = await page.evaluate(async ({ tag, shell, files }) => { const cache = await caches.open('ytplayer-assets'); const missing = [], incorrect = []; @@ -231,5 +234,5 @@ async function run(name) { try { const results = []; for (const name of browserName === 'all' ? ['chromium', 'webkit'] : [browserName]) results.push(await run(name)); - writeFileSync(join(repo, `perf/results/phase2-migration-${profile}-2026-10-07.json`), JSON.stringify({ commit, results }, null, 2) + '\n'); + writeFileSync(join(repo, `perf/results/phase3-migration-${profile}-2026-10-08.json`), JSON.stringify({ commit, results }, null, 2) + '\n'); } finally { rmSync(scratch, { recursive: true, force: true }); } diff --git a/perf/results/phase3-final-2026-10-08.json b/perf/results/phase3-final-2026-10-08.json new file mode 100644 index 0000000..ba2015f --- /dev/null +++ b/perf/results/phase3-final-2026-10-08.json @@ -0,0 +1,2349 @@ +{ + "date": "2026-10-07T20:12:26.084Z", + "frontendCommit": null, + "commit": "fab444b7b88435e07c017d9d561d1bed27077340", + "runsConfigured": 1, + "browsers": { + "chromium": { + "lte": { + "cold": { + "requestCount": { + "median": 107, + "min": 107, + "max": 107, + "values": [ + 107 + ] + }, + "wireBytes": { + "median": 637636, + "min": 637636, + "max": 637636, + "values": [ + 637636 + ] + }, + "fcp": { + "median": 1356, + "min": 1356, + "max": 1356, + "values": [ + 1356 + ] + }, + "lcp": { + "median": 1356, + "min": 1356, + "max": 1356, + "values": [ + 1356 + ] + }, + "domContentLoaded": { + "median": 7171, + "min": 7171, + "max": 7171, + "values": [ + 7171 + ] + }, + "bootDone": { + "median": 7193, + "min": 7193, + "max": 7193, + "values": [ + 7193 + ] + }, + "longTaskTotal": { + "median": 287, + "min": 287, + "max": 287, + "values": [ + 287 + ] + }, + "swInstallDuration": { + "median": 36696, + "min": 36696, + "max": 36696, + "values": [ + 36696 + ] + }, + "swInstallBytes": { + "median": 637636, + "min": 637636, + "max": 637636, + "values": [ + 637636 + ] + }, + "storageEstimate": { + "usage": 2905100, + "quota": 5371614220 + }, + "mediaReady": { + "median": null, + "min": null, + "max": null, + "values": [ + null + ] + }, + "autoplayBlocked": true, + "wireBytesByType": { + "html": 22486, + "js": 283987, + "css": 65916, + "fonts": 254048, + "images": 6278, + "media": 0, + "api": 4290, + "other": 631 + }, + "requests": [ + { + "url": "http://127.0.0.1:6134/?v=benchmedia01", + "status": 200, + "bytes": 11243 + }, + { + "url": "http://127.0.0.1:6134/fonts/BricolageGrotesque-latin.woff2", + "status": 200, + "bytes": 76888 + }, + { + "url": "http://127.0.0.1:6134/fonts/HankenGrotesk-latin.woff2", + "status": 200, + "bytes": 34704 + }, + { + "url": "http://127.0.0.1:6134/lazy.js?v=98f6a419c3", + "status": 200, + "bytes": 2534 + }, + { + "url": "http://127.0.0.1:6134/theme-classic.css?v=d420fcfb12", + "status": 200, + "bytes": 3529 + }, + { + "url": "http://127.0.0.1:6134/fonts/fonts.css?v=dda3dfb804", + "status": 200, + "bytes": 391 + }, + { + "url": "http://127.0.0.1:6134/styles.css?v=9f3a5dea41", + "status": 200, + "bytes": 27364 + }, + { + "url": "http://127.0.0.1:6134/service-ui.css?v=b9bf96a3a8", + "status": 200, + "bytes": 3736 + }, + { + "url": "http://127.0.0.1:6134/refresh.css?v=62498384f1", + "status": 200, + "bytes": 5027 + }, + { + "url": "http://127.0.0.1:6134/layout-base.css?v=4f3307cd3b", + "status": 200, + "bytes": 278 + }, + { + "url": "http://127.0.0.1:6134/recommendations.css?v=055101368d", + "status": 200, + "bytes": 790 + }, + { + "url": "http://127.0.0.1:6134/settings-sections.css?v=055507ab85", + "status": 200, + "bytes": 873 + }, + { + "url": "http://127.0.0.1:6134/offline-pages.css?v=2889456261", + "status": 200, + "bytes": 859 + }, + { + "url": "http://127.0.0.1:6134/saved-page.css?v=3ff576a784", + "status": 200, + "bytes": 537 + }, + { + "url": "http://127.0.0.1:6134/fullscreen-orientation.css?v=91f2d84453", + "status": 200, + "bytes": 1415 + }, + { + "url": "http://127.0.0.1:6134/related-videos.css?v=5a616b1be8", + "status": 200, + "bytes": 404 + }, + { + "url": "http://127.0.0.1:6134/download-actions.css?v=12d3bcfe3e", + "status": 200, + "bytes": 430 + }, + { + "url": "http://127.0.0.1:6134/fingerprint.js?v=a635143269", + "status": 200, + "bytes": 1034 + }, + { + "url": "http://127.0.0.1:6134/opfs.js?v=df7a8d0391", + "status": 200, + "bytes": 3920 + }, + { + "url": "http://127.0.0.1:6134/lyrics-core.js?v=4dcdac2edd", + "status": 200, + "bytes": 2632 + }, + { + "url": "http://127.0.0.1:6134/lyrics-display.js?v=48e8550175", + "status": 200, + "bytes": 571 + }, + { + "url": "http://127.0.0.1:6134/flag-ui.js?v=eeae1c1d1a", + "status": 200, + "bytes": 2036 + }, + { + "url": "http://127.0.0.1:6134/sha256-wasm.js?v=393c50ba56", + "status": 200, + "bytes": 1521 + }, + { + "url": "http://127.0.0.1:6134/sha256.js?v=cd9b980e6f", + "status": 200, + "bytes": 2733 + }, + { + "url": "http://127.0.0.1:6134/loudness-wasm.js?v=c6102d7844", + "status": 200, + "bytes": 1130 + }, + { + "url": "http://127.0.0.1:6134/loudness.js?v=01b3da88dd", + "status": 200, + "bytes": 1818 + }, + { + "url": "http://127.0.0.1:6134/device-db.js?v=880c5cd70e", + "status": 200, + "bytes": 1050 + }, + { + "url": "http://127.0.0.1:6134/async-guard.js?v=e4afa1f2be", + "status": 200, + "bytes": 725 + }, + { + "url": "http://127.0.0.1:6134/asset-sync-core.js?v=155be9339b", + "status": 200, + "bytes": 1690 + }, + { + "url": "http://127.0.0.1:6134/sw-update.js?v=772c123c20", + "status": 200, + "bytes": 4411 + }, + { + "url": "http://127.0.0.1:6134/related-videos.js?v=3eec0ebd4c", + "status": 200, + "bytes": 545 + }, + { + "url": "http://127.0.0.1:6134/audio-continuity.js?v=63b5464dd5", + "status": 200, + "bytes": 583 + }, + { + "url": "http://127.0.0.1:6134/fullscreen-orientation.js?v=c8e44eb66b", + "status": 200, + "bytes": 2494 + }, + { + "url": "http://127.0.0.1:6134/settings-sections.js?v=1101425859", + "status": 200, + "bytes": 2690 + }, + { + "url": "http://127.0.0.1:6134/download-actions.js?v=388c7edecb", + "status": 200, + "bytes": 550 + }, + { + "url": "http://127.0.0.1:6134/download-errors.js?v=bb6a4c887a", + "status": 200, + "bytes": 727 + }, + { + "url": "http://127.0.0.1:6134/downloads.js?v=f2d3e7d212", + "status": 200, + "bytes": 1764 + }, + { + "url": "http://127.0.0.1:6134/downloads-page.js?v=c1a3a218c0", + "status": 200, + "bytes": 3103 + }, + { + "url": "http://127.0.0.1:6134/saved-page.js?v=f1518c50fb", + "status": 200, + "bytes": 652 + }, + { + "url": "http://127.0.0.1:6134/server-backfill.js?v=294b103023", + "status": 200, + "bytes": 918 + }, + { + "url": "http://127.0.0.1:6134/visible-timer.js?v=5322e86ef4", + "status": 200, + "bytes": 380 + }, + { + "url": "http://127.0.0.1:6134/prewarm-next.js?v=ed16a51424", + "status": 200, + "bytes": 567 + }, + { + "url": "http://127.0.0.1:6134/eq-parameters.js?v=dc2c6a8e8d", + "status": 200, + "bytes": 722 + }, + { + "url": "http://127.0.0.1:6134/feature-bootstrap.js?v=33779ecef7", + "status": 200, + "bytes": 2056 + }, + { + "url": "http://127.0.0.1:6134/app.js?v=1d399bd3ef", + "status": 200, + "bytes": 130118 + }, + { + "url": "http://127.0.0.1:6134/api/recommendations?fp=c83c12c79b483c87", + "status": 200, + "bytes": 24 + }, + { + "url": "http://127.0.0.1:6134/api/version", + "status": 200, + "bytes": 62 + }, + { + "url": "http://127.0.0.1:6134/sw.js", + "status": 200, + "bytes": 7729 + }, + { + "url": "http://127.0.0.1:6134/api/user/sync", + "status": 200, + "bytes": 11 + }, + { + "url": "http://127.0.0.1:6134/asset-sync-core.js?v=155be9339b", + "status": 304, + "bytes": 0 + }, + { + "url": "http://127.0.0.1:6134/api/manifest", + "status": 200, + "bytes": 2990 + }, + { + "url": "http://127.0.0.1:6134/assets.json?v=aa3952024e", + "status": 200, + "bytes": 964 + }, + { + "url": "http://127.0.0.1:6134/fonts/BricolageGrotesque-latin-ext.woff2", + "status": 200, + "bytes": 30736 + }, + { + "url": "http://127.0.0.1:6134/fonts/HankenGrotesk-latin-ext.woff2", + "status": 200, + "bytes": 19588 + }, + { + "url": "http://127.0.0.1:6134/fonts/JetBrainsMono-latin-ext.woff2", + "status": 200, + "bytes": 11624 + }, + { + "url": "http://127.0.0.1:6134/fonts/JetBrainsMono-latin.woff2", + "status": 200, + "bytes": 31432 + }, + { + "url": "http://127.0.0.1:6134/fonts/fonts.css", + "status": 200, + "bytes": 391 + }, + { + "url": "http://127.0.0.1:6134/icons/icon-192.png", + "status": 200, + "bytes": 1669 + }, + { + "url": "http://127.0.0.1:6134/icons/icon-512.png", + "status": 200, + "bytes": 4609 + }, + { + "url": "http://127.0.0.1:6134/index.html?v=b9eda89698", + "status": 200, + "bytes": 11243 + }, + { + "url": "http://127.0.0.1:6134/api/recommendations?fp=c83c12c79b483c87", + "status": 200, + "bytes": 24 + }, + { + "url": "http://127.0.0.1:6134/manifest.webmanifest", + "status": 200, + "bytes": 631 + }, + { + "url": "http://127.0.0.1:6134/opfs-worker.js?v=17cfe8fb26", + "status": 200, + "bytes": 3487 + }, + { + "url": "http://127.0.0.1:6134/resume-core.js?v=df42e94600", + "status": 200, + "bytes": 762 + }, + { + "url": "http://127.0.0.1:6134/sw.js", + "status": 200, + "bytes": 7729 + }, + { + "url": "http://127.0.0.1:6134/asset-sync-core.js?v=155be9339b", + "status": 304, + "bytes": 0 + }, + { + "url": "http://127.0.0.1:6134/bento-hub.js?v=c867882d7e", + "status": 200, + "bytes": 1294 + }, + { + "url": "http://127.0.0.1:6134/car-mode.css?v=7d421630b3", + "status": 200, + "bytes": 385 + }, + { + "url": "http://127.0.0.1:6134/car-mode.js?v=ebd6588f35", + "status": 200, + "bytes": 1727 + }, + { + "url": "http://127.0.0.1:6134/direct-media.css?v=19b8428bfd", + "status": 200, + "bytes": 291 + }, + { + "url": "http://127.0.0.1:6134/direct-media.js?v=035420e8fb", + "status": 200, + "bytes": 3697 + }, + { + "url": "http://127.0.0.1:6134/direct-protocol.js?v=87a73be90f", + "status": 200, + "bytes": 1079 + }, + { + "url": "http://127.0.0.1:6134/eq-core.js?v=cb6d079933", + "status": 200, + "bytes": 875 + }, + { + "url": "http://127.0.0.1:6134/direct-recv-worker.js?v=caa45eb981", + "status": 200, + "bytes": 1050 + }, + { + "url": "http://127.0.0.1:6134/direct-stream.js?v=d7f9871605", + "status": 200, + "bytes": 1249 + }, + { + "url": "http://127.0.0.1:6134/f7-layout.js?v=fe7e94a4a9", + "status": 200, + "bytes": 4158 + }, + { + "url": "http://127.0.0.1:6134/fonts/PlusJakartaSans-latin-ext.woff2?v=38e3b8fd80", + "status": 200, + "bytes": 21728 + }, + { + "url": "http://127.0.0.1:6134/export.js?v=5b7cdcd7a3", + "status": 200, + "bytes": 1305 + }, + { + "url": "http://127.0.0.1:6134/fonts/PlusJakartaSans-latin.woff2?v=153fc85b70", + "status": 200, + "bytes": 27348 + }, + { + "url": "http://127.0.0.1:6134/glass-controls.js?v=a60ed1fe84", + "status": 200, + "bytes": 2763 + }, + { + "url": "http://127.0.0.1:6134/glass-panel-layout.js?v=d5417786d0", + "status": 200, + "bytes": 965 + }, + { + "url": "http://127.0.0.1:6134/hash-worker.js?v=5cccc78057", + "status": 200, + "bytes": 542 + }, + { + "url": "http://127.0.0.1:6134/lower-third.css?v=031f8e0ead", + "status": 200, + "bytes": 375 + }, + { + "url": "http://127.0.0.1:6134/lower-third.js?v=7705dcbfb4", + "status": 200, + "bytes": 927 + }, + { + "url": "http://127.0.0.1:6134/lyrics-window.js?v=8f333e2442", + "status": 200, + "bytes": 2048 + }, + { + "url": "http://127.0.0.1:6134/midi.js?v=dbecfa74e1", + "status": 200, + "bytes": 1713 + }, + { + "url": "http://127.0.0.1:6134/p2p-client.js?v=74fbd79661", + "status": 200, + "bytes": 3850 + }, + { + "url": "http://127.0.0.1:6134/p2p-recv-worker.js?v=9d435c6cbb", + "status": 200, + "bytes": 1267 + }, + { + "url": "http://127.0.0.1:6134/p2p-core.js?v=168a879219", + "status": 200, + "bytes": 989 + }, + { + "url": "http://127.0.0.1:6134/p2p-transfer.js?v=e508302618", + "status": 200, + "bytes": 2431 + }, + { + "url": "http://127.0.0.1:6134/piano-core.js?v=77c8269761", + "status": 200, + "bytes": 756 + }, + { + "url": "http://127.0.0.1:6134/setlist-import.js?v=13bc5cc4a4", + "status": 200, + "bytes": 2462 + }, + { + "url": "http://127.0.0.1:6134/piano-engine.mjs?v=2d2f29b38e", + "status": 200, + "bytes": 2580 + }, + { + "url": "http://127.0.0.1:6134/piano.js?v=e82bc30884", + "status": 200, + "bytes": 3453 + }, + { + "url": "http://127.0.0.1:6134/party-dj.js?v=1677c38a88", + "status": 200, + "bytes": 1184 + }, + { + "url": "http://127.0.0.1:6134/stats-core.js?v=3de0591d83", + "status": 200, + "bytes": 2336 + }, + { + "url": "http://127.0.0.1:6134/theme-glass-controls.css?v=3354ad9631", + "status": 200, + "bytes": 1480 + }, + { + "url": "http://127.0.0.1:6134/theme-f7.css?v=02ba226f82", + "status": 200, + "bytes": 4727 + }, + { + "url": "http://127.0.0.1:6134/theme-glass-panel.css?v=25aadb0bb7", + "status": 200, + "bytes": 848 + }, + { + "url": "http://127.0.0.1:6134/theme-bento-hub.css?v=f529dc4bb7", + "status": 200, + "bytes": 6718 + }, + { + "url": "http://127.0.0.1:6134/vendor/framework7-swipe.min.js?v=22b954749c", + "status": 200, + "bytes": 38592 + }, + { + "url": "http://127.0.0.1:6134/video-edit.js?v=90c5dd1eb6", + "status": 200, + "bytes": 2168 + }, + { + "url": "http://127.0.0.1:6134/vocal-reducer.js?v=ddb2fc1bbe", + "status": 200, + "bytes": 1146 + }, + { + "url": "http://127.0.0.1:6134/theme-glass.css?v=09feb15c53", + "status": 200, + "bytes": 5068 + }, + { + "url": "http://127.0.0.1:6134/api/p2p/config", + "status": 200, + "bytes": 40 + }, + { + "url": "http://127.0.0.1:6134/api/p2p/device", + "status": 200, + "bytes": 121 + }, + { + "url": "http://127.0.0.1:6134/api/p2p/holdings", + "status": 200, + "bytes": 54 + } + ], + "initialJsCss": { + "median": 221307, + "min": 221307, + "max": 221307, + "values": [ + 221307 + ] + }, + "initialAssetRequests": [ + { + "url": "http://127.0.0.1:6134/lazy.js?v=98f6a419c3", + "bytes": 2534 + }, + { + "url": "http://127.0.0.1:6134/theme-classic.css?v=d420fcfb12", + "bytes": 3529 + }, + { + "url": "http://127.0.0.1:6134/fonts/fonts.css?v=dda3dfb804", + "bytes": 391 + }, + { + "url": "http://127.0.0.1:6134/styles.css?v=9f3a5dea41", + "bytes": 27364 + }, + { + "url": "http://127.0.0.1:6134/service-ui.css?v=b9bf96a3a8", + "bytes": 3736 + }, + { + "url": "http://127.0.0.1:6134/refresh.css?v=62498384f1", + "bytes": 5027 + }, + { + "url": "http://127.0.0.1:6134/layout-base.css?v=4f3307cd3b", + "bytes": 278 + }, + { + "url": "http://127.0.0.1:6134/recommendations.css?v=055101368d", + "bytes": 790 + }, + { + "url": "http://127.0.0.1:6134/settings-sections.css?v=055507ab85", + "bytes": 873 + }, + { + "url": "http://127.0.0.1:6134/offline-pages.css?v=2889456261", + "bytes": 859 + }, + { + "url": "http://127.0.0.1:6134/saved-page.css?v=3ff576a784", + "bytes": 537 + }, + { + "url": "http://127.0.0.1:6134/fullscreen-orientation.css?v=91f2d84453", + "bytes": 1415 + }, + { + "url": "http://127.0.0.1:6134/related-videos.css?v=5a616b1be8", + "bytes": 404 + }, + { + "url": "http://127.0.0.1:6134/download-actions.css?v=12d3bcfe3e", + "bytes": 430 + }, + { + "url": "http://127.0.0.1:6134/fingerprint.js?v=a635143269", + "bytes": 1034 + }, + { + "url": "http://127.0.0.1:6134/opfs.js?v=df7a8d0391", + "bytes": 3920 + }, + { + "url": "http://127.0.0.1:6134/lyrics-core.js?v=4dcdac2edd", + "bytes": 2632 + }, + { + "url": "http://127.0.0.1:6134/lyrics-display.js?v=48e8550175", + "bytes": 571 + }, + { + "url": "http://127.0.0.1:6134/flag-ui.js?v=eeae1c1d1a", + "bytes": 2036 + }, + { + "url": "http://127.0.0.1:6134/sha256-wasm.js?v=393c50ba56", + "bytes": 1521 + }, + { + "url": "http://127.0.0.1:6134/sha256.js?v=cd9b980e6f", + "bytes": 2733 + }, + { + "url": "http://127.0.0.1:6134/loudness-wasm.js?v=c6102d7844", + "bytes": 1130 + }, + { + "url": "http://127.0.0.1:6134/loudness.js?v=01b3da88dd", + "bytes": 1818 + }, + { + "url": "http://127.0.0.1:6134/device-db.js?v=880c5cd70e", + "bytes": 1050 + }, + { + "url": "http://127.0.0.1:6134/async-guard.js?v=e4afa1f2be", + "bytes": 725 + }, + { + "url": "http://127.0.0.1:6134/asset-sync-core.js?v=155be9339b", + "bytes": 1690 + }, + { + "url": "http://127.0.0.1:6134/sw-update.js?v=772c123c20", + "bytes": 4411 + }, + { + "url": "http://127.0.0.1:6134/related-videos.js?v=3eec0ebd4c", + "bytes": 545 + }, + { + "url": "http://127.0.0.1:6134/audio-continuity.js?v=63b5464dd5", + "bytes": 583 + }, + { + "url": "http://127.0.0.1:6134/fullscreen-orientation.js?v=c8e44eb66b", + "bytes": 2494 + }, + { + "url": "http://127.0.0.1:6134/settings-sections.js?v=1101425859", + "bytes": 2690 + }, + { + "url": "http://127.0.0.1:6134/download-actions.js?v=388c7edecb", + "bytes": 550 + }, + { + "url": "http://127.0.0.1:6134/download-errors.js?v=bb6a4c887a", + "bytes": 727 + }, + { + "url": "http://127.0.0.1:6134/downloads.js?v=f2d3e7d212", + "bytes": 1764 + }, + { + "url": "http://127.0.0.1:6134/downloads-page.js?v=c1a3a218c0", + "bytes": 3103 + }, + { + "url": "http://127.0.0.1:6134/saved-page.js?v=f1518c50fb", + "bytes": 652 + }, + { + "url": "http://127.0.0.1:6134/server-backfill.js?v=294b103023", + "bytes": 918 + }, + { + "url": "http://127.0.0.1:6134/visible-timer.js?v=5322e86ef4", + "bytes": 380 + }, + { + "url": "http://127.0.0.1:6134/prewarm-next.js?v=ed16a51424", + "bytes": 567 + }, + { + "url": "http://127.0.0.1:6134/eq-parameters.js?v=dc2c6a8e8d", + "bytes": 722 + }, + { + "url": "http://127.0.0.1:6134/feature-bootstrap.js?v=33779ecef7", + "bytes": 2056 + }, + { + "url": "http://127.0.0.1:6134/app.js?v=1d399bd3ef", + "bytes": 130118 + } + ] + }, + "warm": { + "requestCount": { + "median": 42, + "min": 42, + "max": 42, + "values": [ + 42 + ] + }, + "wireBytes": { + "median": 165400, + "min": 165400, + "max": 165400, + "values": [ + 165400 + ] + }, + "fcp": { + "median": 132, + "min": 132, + "max": 132, + "values": [ + 132 + ] + }, + "lcp": { + "median": 168, + "min": 168, + "max": 168, + "values": [ + 168 + ] + }, + "domContentLoaded": { + "median": 401, + "min": 401, + "max": 401, + "values": [ + 401 + ] + }, + "bootDone": { + "median": 419, + "min": 419, + "max": 419, + "values": [ + 419 + ] + }, + "longTaskTotal": { + "median": 59, + "min": 59, + "max": 59, + "values": [ + 59 + ] + } + }, + "offline": { + "requestCount": { + "median": 0, + "min": 0, + "max": 0, + "values": [ + 0 + ] + }, + "wireBytes": { + "median": 0, + "min": 0, + "max": 0, + "values": [ + 0 + ] + }, + "fcp": { + "median": 52, + "min": 52, + "max": 52, + "values": [ + 52 + ] + }, + "lcp": { + "median": 52, + "min": 52, + "max": 52, + "values": [ + 52 + ] + }, + "domContentLoaded": { + "median": 163, + "min": 163, + "max": 163, + "values": [ + 163 + ] + }, + "bootDone": { + "median": 166, + "min": 166, + "max": 166, + "values": [ + 166 + ] + }, + "reloadDuration": { + "median": 187, + "min": 187, + "max": 187, + "values": [ + 187 + ] + } + }, + "updateJs": { + "requestCount": { + "median": 8, + "min": 8, + "max": 8, + "values": [ + 8 + ] + }, + "wireBytes": { + "median": 159905, + "min": 159905, + "max": 159905, + "values": [ + 159905 + ] + }, + "duration": { + "median": 964, + "min": 964, + "max": 964, + "values": [ + 964 + ] + }, + "wireBytesByType": { + "html": 11229, + "js": 145619, + "css": 0, + "fonts": 0, + "images": 0, + "media": 0, + "api": 3057, + "other": 0 + }, + "requests": [ + { + "url": "http://127.0.0.1:6134/sw.js", + "status": 200, + "bytes": 7720 + }, + { + "url": "http://127.0.0.1:6134/asset-sync-core.js?v=155be9339b", + "status": 304, + "bytes": 0 + }, + { + "url": "http://127.0.0.1:6134/api/manifest", + "status": 200, + "bytes": 2995 + }, + { + "url": "http://127.0.0.1:6134/app.js?v=4d214d16f1", + "status": 200, + "bytes": 130179 + }, + { + "url": "http://127.0.0.1:6134/index.html?v=98e7f379a2", + "status": 200, + "bytes": 11229 + }, + { + "url": "http://127.0.0.1:6134/api/version", + "status": 200, + "bytes": 62 + }, + { + "url": "http://127.0.0.1:6134/sw.js", + "status": 200, + "bytes": 7720 + }, + { + "url": "http://127.0.0.1:6134/asset-sync-core.js?v=155be9339b", + "status": 304, + "bytes": 0 + } + ] + }, + "updateCss": { + "requestCount": { + "median": 7, + "min": 7, + "max": 7, + "values": [ + 7 + ] + }, + "wireBytes": { + "median": 29724, + "min": 29724, + "max": 29724, + "values": [ + 29724 + ] + }, + "duration": { + "median": 218, + "min": 218, + "max": 218, + "values": [ + 218 + ] + }, + "wireBytesByType": { + "html": 11233, + "js": 15440, + "css": 0, + "fonts": 0, + "images": 0, + "media": 0, + "api": 3051, + "other": 0 + }, + "requests": [ + { + "url": "http://127.0.0.1:6134/sw.js", + "status": 200, + "bytes": 7720 + }, + { + "url": "http://127.0.0.1:6134/asset-sync-core.js?v=155be9339b", + "status": 304, + "bytes": 0 + }, + { + "url": "http://127.0.0.1:6134/api/manifest", + "status": 200, + "bytes": 2989 + }, + { + "url": "http://127.0.0.1:6134/index.html?v=3a342efd0b", + "status": 200, + "bytes": 11233 + }, + { + "url": "http://127.0.0.1:6134/api/version", + "status": 200, + "bytes": 62 + }, + { + "url": "http://127.0.0.1:6134/sw.js", + "status": 200, + "bytes": 7720 + }, + { + "url": "http://127.0.0.1:6134/asset-sync-core.js?v=155be9339b", + "status": 304, + "bytes": 0 + } + ] + } + } + }, + "webkit": { + "lte": { + "cold": { + "requestCount": { + "median": 148, + "min": 148, + "max": 148, + "values": [ + 148 + ] + }, + "wireBytes": { + "median": 1108218, + "min": 1108218, + "max": 1108218, + "values": [ + 1108218 + ] + }, + "fcp": { + "median": 2467, + "min": 2467, + "max": 2467, + "values": [ + 2467 + ] + }, + "lcp": { + "median": 2539, + "min": 2539, + "max": 2539, + "values": [ + 2539 + ] + }, + "domContentLoaded": { + "median": 3287, + "min": 3287, + "max": 3287, + "values": [ + 3287 + ] + }, + "bootDone": { + "median": 3293, + "min": 3293, + "max": 3293, + "values": [ + 3293 + ] + }, + "longTaskTotal": { + "median": 0, + "min": 0, + "max": 0, + "values": [ + 0 + ] + }, + "swInstallDuration": { + "median": 32729, + "min": 32729, + "max": 32729, + "values": [ + 32729 + ] + }, + "swInstallBytes": { + "median": 1108218, + "min": 1108218, + "max": 1108218, + "values": [ + 1108218 + ] + }, + "storageEstimate": { + "usage": null, + "quota": null + }, + "mediaReady": { + "median": null, + "min": null, + "max": null, + "values": [ + null + ] + }, + "autoplayBlocked": true, + "wireBytesByType": { + "html": 27456, + "js": 568878, + "css": 133708, + "fonts": 365640, + "images": 6278, + "media": 0, + "api": 4692, + "other": 1566 + }, + "requests": [ + { + "url": "http://127.0.0.1:6134/?v=benchmedia01", + "status": 200, + "bytes": 13728 + }, + { + "url": "http://127.0.0.1:6134/fonts/BricolageGrotesque-latin.woff2", + "status": 200, + "bytes": 76888 + }, + { + "url": "http://127.0.0.1:6134/fonts/HankenGrotesk-latin.woff2", + "status": 200, + "bytes": 34704 + }, + { + "url": "http://127.0.0.1:6134/lazy.js?v=98f6a419c3", + "status": 200, + "bytes": 3007 + }, + { + "url": "http://127.0.0.1:6134/fonts/fonts.css?v=dda3dfb804", + "status": 200, + "bytes": 457 + }, + { + "url": "http://127.0.0.1:6134/styles.css?v=9f3a5dea41", + "status": 200, + "bytes": 33412 + }, + { + "url": "http://127.0.0.1:6134/service-ui.css?v=b9bf96a3a8", + "status": 200, + "bytes": 4417 + }, + { + "url": "http://127.0.0.1:6134/layout-base.css?v=4f3307cd3b", + "status": 200, + "bytes": 336 + }, + { + "url": "http://127.0.0.1:6134/refresh.css?v=62498384f1", + "status": 200, + "bytes": 5828 + }, + { + "url": "http://127.0.0.1:6134/recommendations.css?v=055101368d", + "status": 200, + "bytes": 983 + }, + { + "url": "http://127.0.0.1:6134/settings-sections.css?v=055507ab85", + "status": 200, + "bytes": 1076 + }, + { + "url": "http://127.0.0.1:6134/offline-pages.css?v=2889456261", + "status": 200, + "bytes": 1069 + }, + { + "url": "http://127.0.0.1:6134/saved-page.css?v=3ff576a784", + "status": 200, + "bytes": 673 + }, + { + "url": "http://127.0.0.1:6134/fullscreen-orientation.css?v=91f2d84453", + "status": 200, + "bytes": 1721 + }, + { + "url": "http://127.0.0.1:6134/related-videos.css?v=5a616b1be8", + "status": 200, + "bytes": 517 + }, + { + "url": "http://127.0.0.1:6134/download-actions.css?v=12d3bcfe3e", + "status": 200, + "bytes": 560 + }, + { + "url": "http://127.0.0.1:6134/fingerprint.js?v=a635143269", + "status": 200, + "bytes": 1269 + }, + { + "url": "http://127.0.0.1:6134/opfs.js?v=df7a8d0391", + "status": 200, + "bytes": 4571 + }, + { + "url": "http://127.0.0.1:6134/lyrics-core.js?v=4dcdac2edd", + "status": 200, + "bytes": 3038 + }, + { + "url": "http://127.0.0.1:6134/lyrics-display.js?v=48e8550175", + "status": 200, + "bytes": 750 + }, + { + "url": "http://127.0.0.1:6134/flag-ui.js?v=eeae1c1d1a", + "status": 200, + "bytes": 2469 + }, + { + "url": "http://127.0.0.1:6134/sha256-wasm.js?v=393c50ba56", + "status": 200, + "bytes": 1748 + }, + { + "url": "http://127.0.0.1:6134/sha256.js?v=cd9b980e6f", + "status": 200, + "bytes": 3209 + }, + { + "url": "http://127.0.0.1:6134/loudness-wasm.js?v=c6102d7844", + "status": 200, + "bytes": 1279 + }, + { + "url": "http://127.0.0.1:6134/loudness.js?v=01b3da88dd", + "status": 200, + "bytes": 2068 + }, + { + "url": "http://127.0.0.1:6134/device-db.js?v=880c5cd70e", + "status": 200, + "bytes": 1230 + }, + { + "url": "http://127.0.0.1:6134/async-guard.js?v=e4afa1f2be", + "status": 200, + "bytes": 887 + }, + { + "url": "http://127.0.0.1:6134/asset-sync-core.js?v=155be9339b", + "status": 200, + "bytes": 1954 + }, + { + "url": "http://127.0.0.1:6134/sw-update.js?v=772c123c20", + "status": 200, + "bytes": 5195 + }, + { + "url": "http://127.0.0.1:6134/related-videos.js?v=3eec0ebd4c", + "status": 200, + "bytes": 642 + }, + { + "url": "http://127.0.0.1:6134/audio-continuity.js?v=63b5464dd5", + "status": 200, + "bytes": 677 + }, + { + "url": "http://127.0.0.1:6134/fullscreen-orientation.js?v=c8e44eb66b", + "status": 200, + "bytes": 2916 + }, + { + "url": "http://127.0.0.1:6134/settings-sections.js?v=1101425859", + "status": 200, + "bytes": 3174 + }, + { + "url": "http://127.0.0.1:6134/download-actions.js?v=388c7edecb", + "status": 200, + "bytes": 669 + }, + { + "url": "http://127.0.0.1:6134/download-errors.js?v=bb6a4c887a", + "status": 200, + "bytes": 959 + }, + { + "url": "http://127.0.0.1:6134/downloads.js?v=f2d3e7d212", + "status": 200, + "bytes": 2088 + }, + { + "url": "http://127.0.0.1:6134/downloads-page.js?v=c1a3a218c0", + "status": 200, + "bytes": 3642 + }, + { + "url": "http://127.0.0.1:6134/saved-page.js?v=f1518c50fb", + "status": 200, + "bytes": 820 + }, + { + "url": "http://127.0.0.1:6134/server-backfill.js?v=294b103023", + "status": 200, + "bytes": 1105 + }, + { + "url": "http://127.0.0.1:6134/visible-timer.js?v=5322e86ef4", + "status": 200, + "bytes": 474 + }, + { + "url": "http://127.0.0.1:6134/prewarm-next.js?v=ed16a51424", + "status": 200, + "bytes": 665 + }, + { + "url": "http://127.0.0.1:6134/eq-parameters.js?v=dc2c6a8e8d", + "status": 200, + "bytes": 832 + }, + { + "url": "http://127.0.0.1:6134/feature-bootstrap.js?v=33779ecef7", + "status": 200, + "bytes": 2430 + }, + { + "url": "http://127.0.0.1:6134/app.js?v=1d399bd3ef", + "status": 200, + "bytes": 165918 + }, + { + "url": "http://127.0.0.1:6134/theme-classic.css?v=d420fcfb12", + "status": 200, + "bytes": 4079 + }, + { + "url": "http://127.0.0.1:6134/manifest.webmanifest", + "status": 200, + "bytes": 783 + }, + { + "url": "http://127.0.0.1:6134/api/recommendations?fp=163577c02a53bc40", + "status": 200, + "bytes": 24 + }, + { + "url": "http://127.0.0.1:6134/api/version", + "status": 200, + "bytes": 62 + }, + { + "url": "http://127.0.0.1:6134/api/user/sync", + "status": 200, + "bytes": 11 + }, + { + "url": "http://127.0.0.1:6134/sw.js", + "status": 200, + "bytes": 8941 + }, + { + "url": "http://127.0.0.1:6134/api/recommendations?fp=163577c02a53bc40", + "status": 200, + "bytes": 24 + }, + { + "url": "http://127.0.0.1:6134/asset-sync-core.js?v=155be9339b", + "status": 200, + "bytes": 1954 + }, + { + "url": "http://127.0.0.1:6134/api/manifest", + "status": 200, + "bytes": 3459 + }, + { + "url": "http://127.0.0.1:6134/app.js?v=1d399bd3ef", + "status": 200, + "bytes": 165918 + }, + { + "url": "http://127.0.0.1:6134/asset-sync-core.js?v=155be9339b", + "status": 200, + "bytes": 1954 + }, + { + "url": "http://127.0.0.1:6134/assets.json?v=aa3952024e", + "status": 200, + "bytes": 1112 + }, + { + "url": "http://127.0.0.1:6134/async-guard.js?v=e4afa1f2be", + "status": 200, + "bytes": 887 + }, + { + "url": "http://127.0.0.1:6134/audio-continuity.js?v=63b5464dd5", + "status": 200, + "bytes": 677 + }, + { + "url": "http://127.0.0.1:6134/device-db.js?v=880c5cd70e", + "status": 200, + "bytes": 1230 + }, + { + "url": "http://127.0.0.1:6134/download-actions.css?v=12d3bcfe3e", + "status": 200, + "bytes": 560 + }, + { + "url": "http://127.0.0.1:6134/downloads-page.js?v=c1a3a218c0", + "status": 200, + "bytes": 3642 + }, + { + "url": "http://127.0.0.1:6134/download-actions.js?v=388c7edecb", + "status": 200, + "bytes": 669 + }, + { + "url": "http://127.0.0.1:6134/download-errors.js?v=bb6a4c887a", + "status": 200, + "bytes": 959 + }, + { + "url": "http://127.0.0.1:6134/downloads.js?v=f2d3e7d212", + "status": 200, + "bytes": 2088 + }, + { + "url": "http://127.0.0.1:6134/eq-parameters.js?v=dc2c6a8e8d", + "status": 200, + "bytes": 832 + }, + { + "url": "http://127.0.0.1:6134/feature-bootstrap.js?v=33779ecef7", + "status": 200, + "bytes": 2430 + }, + { + "url": "http://127.0.0.1:6134/fingerprint.js?v=a635143269", + "status": 200, + "bytes": 1269 + }, + { + "url": "http://127.0.0.1:6134/flag-ui.js?v=eeae1c1d1a", + "status": 200, + "bytes": 2469 + }, + { + "url": "http://127.0.0.1:6134/fonts/BricolageGrotesque-latin-ext.woff2", + "status": 200, + "bytes": 30736 + }, + { + "url": "http://127.0.0.1:6134/fonts/BricolageGrotesque-latin.woff2", + "status": 200, + "bytes": 76888 + }, + { + "url": "http://127.0.0.1:6134/fonts/HankenGrotesk-latin-ext.woff2", + "status": 200, + "bytes": 19588 + }, + { + "url": "http://127.0.0.1:6134/fonts/HankenGrotesk-latin.woff2", + "status": 200, + "bytes": 34704 + }, + { + "url": "http://127.0.0.1:6134/fonts/JetBrainsMono-latin-ext.woff2", + "status": 200, + "bytes": 11624 + }, + { + "url": "http://127.0.0.1:6134/fonts/JetBrainsMono-latin.woff2", + "status": 200, + "bytes": 31432 + }, + { + "url": "http://127.0.0.1:6134/fonts/fonts.css", + "status": 200, + "bytes": 457 + }, + { + "url": "http://127.0.0.1:6134/fullscreen-orientation.css?v=91f2d84453", + "status": 200, + "bytes": 1721 + }, + { + "url": "http://127.0.0.1:6134/fullscreen-orientation.js?v=c8e44eb66b", + "status": 200, + "bytes": 2916 + }, + { + "url": "http://127.0.0.1:6134/icons/icon-192.png", + "status": 200, + "bytes": 1669 + }, + { + "url": "http://127.0.0.1:6134/icons/icon-512.png", + "status": 200, + "bytes": 4609 + }, + { + "url": "http://127.0.0.1:6134/index.html?v=3a342efd0b", + "status": 200, + "bytes": 13728 + }, + { + "url": "http://127.0.0.1:6134/layout-base.css?v=4f3307cd3b", + "status": 200, + "bytes": 336 + }, + { + "url": "http://127.0.0.1:6134/lazy.js?v=98f6a419c3", + "status": 200, + "bytes": 3007 + }, + { + "url": "http://127.0.0.1:6134/loudness-wasm.js?v=c6102d7844", + "status": 200, + "bytes": 1279 + }, + { + "url": "http://127.0.0.1:6134/loudness.js?v=01b3da88dd", + "status": 200, + "bytes": 2068 + }, + { + "url": "http://127.0.0.1:6134/lyrics-core.js?v=4dcdac2edd", + "status": 200, + "bytes": 3038 + }, + { + "url": "http://127.0.0.1:6134/lyrics-display.js?v=48e8550175", + "status": 200, + "bytes": 750 + }, + { + "url": "http://127.0.0.1:6134/manifest.webmanifest", + "status": 200, + "bytes": 783 + }, + { + "url": "http://127.0.0.1:6134/offline-pages.css?v=2889456261", + "status": 200, + "bytes": 1069 + }, + { + "url": "http://127.0.0.1:6134/opfs-worker.js?v=17cfe8fb26", + "status": 200, + "bytes": 4042 + }, + { + "url": "http://127.0.0.1:6134/opfs.js?v=df7a8d0391", + "status": 200, + "bytes": 4571 + }, + { + "url": "http://127.0.0.1:6134/prewarm-next.js?v=ed16a51424", + "status": 200, + "bytes": 665 + }, + { + "url": "http://127.0.0.1:6134/recommendations.css?v=055101368d", + "status": 200, + "bytes": 983 + }, + { + "url": "http://127.0.0.1:6134/refresh.css?v=62498384f1", + "status": 200, + "bytes": 5828 + }, + { + "url": "http://127.0.0.1:6134/related-videos.css?v=5a616b1be8", + "status": 200, + "bytes": 517 + }, + { + "url": "http://127.0.0.1:6134/related-videos.js?v=3eec0ebd4c", + "status": 200, + "bytes": 642 + }, + { + "url": "http://127.0.0.1:6134/resume-core.js?v=df42e94600", + "status": 200, + "bytes": 915 + }, + { + "url": "http://127.0.0.1:6134/saved-page.css?v=3ff576a784", + "status": 200, + "bytes": 673 + }, + { + "url": "http://127.0.0.1:6134/saved-page.js?v=f1518c50fb", + "status": 200, + "bytes": 820 + }, + { + "url": "http://127.0.0.1:6134/server-backfill.js?v=294b103023", + "status": 200, + "bytes": 1105 + }, + { + "url": "http://127.0.0.1:6134/service-ui.css?v=b9bf96a3a8", + "status": 200, + "bytes": 4417 + }, + { + "url": "http://127.0.0.1:6134/settings-sections.css?v=055507ab85", + "status": 200, + "bytes": 1076 + }, + { + "url": "http://127.0.0.1:6134/settings-sections.js?v=1101425859", + "status": 200, + "bytes": 3174 + }, + { + "url": "http://127.0.0.1:6134/sha256-wasm.js?v=393c50ba56", + "status": 200, + "bytes": 1748 + }, + { + "url": "http://127.0.0.1:6134/sha256.js?v=cd9b980e6f", + "status": 200, + "bytes": 3209 + }, + { + "url": "http://127.0.0.1:6134/styles.css?v=9f3a5dea41", + "status": 200, + "bytes": 33412 + }, + { + "url": "http://127.0.0.1:6134/sw-update.js?v=772c123c20", + "status": 200, + "bytes": 5195 + }, + { + "url": "http://127.0.0.1:6134/theme-classic.css?v=d420fcfb12", + "status": 200, + "bytes": 4079 + }, + { + "url": "http://127.0.0.1:6134/visible-timer.js?v=5322e86ef4", + "status": 200, + "bytes": 474 + }, + { + "url": "http://127.0.0.1:6134/sw.js", + "status": 200, + "bytes": 8941 + }, + { + "url": "http://127.0.0.1:6134/asset-sync-core.js?v=155be9339b", + "status": 200, + "bytes": 1954 + }, + { + "url": "http://127.0.0.1:6134/bento-hub.js?v=c867882d7e", + "status": 200, + "bytes": 1523 + }, + { + "url": "http://127.0.0.1:6134/car-mode.css?v=7d421630b3", + "status": 200, + "bytes": 504 + }, + { + "url": "http://127.0.0.1:6134/car-mode.js?v=ebd6588f35", + "status": 200, + "bytes": 2080 + }, + { + "url": "http://127.0.0.1:6134/direct-media.css?v=19b8428bfd", + "status": 200, + "bytes": 370 + }, + { + "url": "http://127.0.0.1:6134/direct-media.js?v=035420e8fb", + "status": 200, + "bytes": 4252 + }, + { + "url": "http://127.0.0.1:6134/direct-protocol.js?v=87a73be90f", + "status": 200, + "bytes": 1245 + }, + { + "url": "http://127.0.0.1:6134/direct-recv-worker.js?v=caa45eb981", + "status": 200, + "bytes": 1216 + }, + { + "url": "http://127.0.0.1:6134/direct-stream.js?v=d7f9871605", + "status": 200, + "bytes": 1457 + }, + { + "url": "http://127.0.0.1:6134/eq-core.js?v=cb6d079933", + "status": 200, + "bytes": 1071 + }, + { + "url": "http://127.0.0.1:6134/export.js?v=5b7cdcd7a3", + "status": 200, + "bytes": 1536 + }, + { + "url": "http://127.0.0.1:6134/f7-layout.js?v=fe7e94a4a9", + "status": 200, + "bytes": 4763 + }, + { + "url": "http://127.0.0.1:6134/fonts/PlusJakartaSans-latin-ext.woff2?v=38e3b8fd80", + "status": 200, + "bytes": 21728 + }, + { + "url": "http://127.0.0.1:6134/fonts/PlusJakartaSans-latin.woff2?v=153fc85b70", + "status": 200, + "bytes": 27348 + }, + { + "url": "http://127.0.0.1:6134/glass-controls.js?v=a60ed1fe84", + "status": 200, + "bytes": 3227 + }, + { + "url": "http://127.0.0.1:6134/glass-panel-layout.js?v=d5417786d0", + "status": 200, + "bytes": 1173 + }, + { + "url": "http://127.0.0.1:6134/hash-worker.js?v=5cccc78057", + "status": 200, + "bytes": 624 + }, + { + "url": "http://127.0.0.1:6134/lower-third.css?v=031f8e0ead", + "status": 200, + "bytes": 502 + }, + { + "url": "http://127.0.0.1:6134/lower-third.js?v=7705dcbfb4", + "status": 200, + "bytes": 1153 + }, + { + "url": "http://127.0.0.1:6134/lyrics-window.js?v=8f333e2442", + "status": 200, + "bytes": 2474 + }, + { + "url": "http://127.0.0.1:6134/midi.js?v=dbecfa74e1", + "status": 200, + "bytes": 2014 + }, + { + "url": "http://127.0.0.1:6134/p2p-client.js?v=74fbd79661", + "status": 200, + "bytes": 4444 + }, + { + "url": "http://127.0.0.1:6134/p2p-core.js?v=168a879219", + "status": 200, + "bytes": 1137 + }, + { + "url": "http://127.0.0.1:6134/p2p-recv-worker.js?v=9d435c6cbb", + "status": 200, + "bytes": 1475 + }, + { + "url": "http://127.0.0.1:6134/p2p-transfer.js?v=e508302618", + "status": 200, + "bytes": 2773 + }, + { + "url": "http://127.0.0.1:6134/party-dj.js?v=1677c38a88", + "status": 200, + "bytes": 1444 + }, + { + "url": "http://127.0.0.1:6134/piano-core.js?v=77c8269761", + "status": 200, + "bytes": 867 + }, + { + "url": "http://127.0.0.1:6134/piano-engine.mjs?v=2d2f29b38e", + "status": 200, + "bytes": 2580 + }, + { + "url": "http://127.0.0.1:6134/piano.js?v=e82bc30884", + "status": 200, + "bytes": 4003 + }, + { + "url": "http://127.0.0.1:6134/setlist-import.js?v=13bc5cc4a4", + "status": 200, + "bytes": 2879 + }, + { + "url": "http://127.0.0.1:6134/stats-core.js?v=3de0591d83", + "status": 200, + "bytes": 2619 + }, + { + "url": "http://127.0.0.1:6134/theme-bento-hub.css?v=f529dc4bb7", + "status": 200, + "bytes": 7731 + }, + { + "url": "http://127.0.0.1:6134/theme-f7.css?v=02ba226f82", + "status": 200, + "bytes": 5579 + }, + { + "url": "http://127.0.0.1:6134/theme-glass-panel.css?v=25aadb0bb7", + "status": 200, + "bytes": 1045 + }, + { + "url": "http://127.0.0.1:6134/theme-glass-controls.css?v=3354ad9631", + "status": 200, + "bytes": 1782 + }, + { + "url": "http://127.0.0.1:6134/theme-glass.css?v=253e56cfb3", + "status": 200, + "bytes": 5939 + }, + { + "url": "http://127.0.0.1:6134/vendor/framework7-swipe.min.js?v=22b954749c", + "status": 200, + "bytes": 44829 + }, + { + "url": "http://127.0.0.1:6134/video-edit.js?v=90c5dd1eb6", + "status": 200, + "bytes": 2506 + }, + { + "url": "http://127.0.0.1:6134/vocal-reducer.js?v=ddb2fc1bbe", + "status": 200, + "bytes": 1397 + } + ], + "initialJsCss": { + "median": 274813, + "min": 274813, + "max": 274813, + "values": [ + 274813 + ] + }, + "initialAssetRequests": [ + { + "url": "http://127.0.0.1:6134/fonts/fonts.css?v=dda3dfb804", + "bytes": 457 + }, + { + "url": "http://127.0.0.1:6134/lazy.js?v=98f6a419c3", + "bytes": 3007 + }, + { + "url": "http://127.0.0.1:6134/layout-base.css?v=4f3307cd3b", + "bytes": 336 + }, + { + "url": "http://127.0.0.1:6134/service-ui.css?v=b9bf96a3a8", + "bytes": 4417 + }, + { + "url": "http://127.0.0.1:6134/refresh.css?v=62498384f1", + "bytes": 5828 + }, + { + "url": "http://127.0.0.1:6134/recommendations.css?v=055101368d", + "bytes": 983 + }, + { + "url": "http://127.0.0.1:6134/styles.css?v=9f3a5dea41", + "bytes": 33412 + }, + { + "url": "http://127.0.0.1:6134/settings-sections.css?v=055507ab85", + "bytes": 1076 + }, + { + "url": "http://127.0.0.1:6134/offline-pages.css?v=2889456261", + "bytes": 1069 + }, + { + "url": "http://127.0.0.1:6134/saved-page.css?v=3ff576a784", + "bytes": 673 + }, + { + "url": "http://127.0.0.1:6134/fullscreen-orientation.css?v=91f2d84453", + "bytes": 1721 + }, + { + "url": "http://127.0.0.1:6134/related-videos.css?v=5a616b1be8", + "bytes": 517 + }, + { + "url": "http://127.0.0.1:6134/download-actions.css?v=12d3bcfe3e", + "bytes": 560 + }, + { + "url": "http://127.0.0.1:6134/fingerprint.js?v=a635143269", + "bytes": 1269 + }, + { + "url": "http://127.0.0.1:6134/opfs.js?v=df7a8d0391", + "bytes": 4571 + }, + { + "url": "http://127.0.0.1:6134/lyrics-core.js?v=4dcdac2edd", + "bytes": 3038 + }, + { + "url": "http://127.0.0.1:6134/lyrics-display.js?v=48e8550175", + "bytes": 750 + }, + { + "url": "http://127.0.0.1:6134/flag-ui.js?v=eeae1c1d1a", + "bytes": 2469 + }, + { + "url": "http://127.0.0.1:6134/sha256-wasm.js?v=393c50ba56", + "bytes": 1748 + }, + { + "url": "http://127.0.0.1:6134/sha256.js?v=cd9b980e6f", + "bytes": 3209 + }, + { + "url": "http://127.0.0.1:6134/loudness-wasm.js?v=c6102d7844", + "bytes": 1279 + }, + { + "url": "http://127.0.0.1:6134/loudness.js?v=01b3da88dd", + "bytes": 2068 + }, + { + "url": "http://127.0.0.1:6134/device-db.js?v=880c5cd70e", + "bytes": 1230 + }, + { + "url": "http://127.0.0.1:6134/async-guard.js?v=e4afa1f2be", + "bytes": 887 + }, + { + "url": "http://127.0.0.1:6134/asset-sync-core.js?v=155be9339b", + "bytes": 1954 + }, + { + "url": "http://127.0.0.1:6134/related-videos.js?v=3eec0ebd4c", + "bytes": 642 + }, + { + "url": "http://127.0.0.1:6134/sw-update.js?v=772c123c20", + "bytes": 5195 + }, + { + "url": "http://127.0.0.1:6134/audio-continuity.js?v=63b5464dd5", + "bytes": 677 + }, + { + "url": "http://127.0.0.1:6134/fullscreen-orientation.js?v=c8e44eb66b", + "bytes": 2916 + }, + { + "url": "http://127.0.0.1:6134/download-actions.js?v=388c7edecb", + "bytes": 669 + }, + { + "url": "http://127.0.0.1:6134/settings-sections.js?v=1101425859", + "bytes": 3174 + }, + { + "url": "http://127.0.0.1:6134/download-errors.js?v=bb6a4c887a", + "bytes": 959 + }, + { + "url": "http://127.0.0.1:6134/downloads.js?v=f2d3e7d212", + "bytes": 2088 + }, + { + "url": "http://127.0.0.1:6134/downloads-page.js?v=c1a3a218c0", + "bytes": 3642 + }, + { + "url": "http://127.0.0.1:6134/saved-page.js?v=f1518c50fb", + "bytes": 820 + }, + { + "url": "http://127.0.0.1:6134/server-backfill.js?v=294b103023", + "bytes": 1105 + }, + { + "url": "http://127.0.0.1:6134/visible-timer.js?v=5322e86ef4", + "bytes": 474 + }, + { + "url": "http://127.0.0.1:6134/prewarm-next.js?v=ed16a51424", + "bytes": 665 + }, + { + "url": "http://127.0.0.1:6134/eq-parameters.js?v=dc2c6a8e8d", + "bytes": 832 + }, + { + "url": "http://127.0.0.1:6134/feature-bootstrap.js?v=33779ecef7", + "bytes": 2430 + }, + { + "url": "http://127.0.0.1:6134/app.js?v=1d399bd3ef", + "bytes": 165918 + }, + { + "url": "http://127.0.0.1:6134/theme-classic.css?v=d420fcfb12", + "bytes": 4079 + } + ] + }, + "warm": { + "requestCount": { + "median": 0, + "min": 0, + "max": 0, + "values": [ + 0 + ] + }, + "wireBytes": { + "median": 0, + "min": 0, + "max": 0, + "values": [ + 0 + ] + }, + "fcp": { + "median": 52, + "min": 52, + "max": 52, + "values": [ + 52 + ] + }, + "lcp": { + "median": 79, + "min": 79, + "max": 79, + "values": [ + 79 + ] + }, + "domContentLoaded": { + "median": 78, + "min": 78, + "max": 78, + "values": [ + 78 + ] + }, + "bootDone": { + "median": 81, + "min": 81, + "max": 81, + "values": [ + 81 + ] + }, + "longTaskTotal": { + "median": 0, + "min": 0, + "max": 0, + "values": [ + 0 + ] + } + }, + "offline": { + "requestCount": { + "median": 0, + "min": 0, + "max": 0, + "values": [ + 0 + ] + }, + "wireBytes": { + "median": 0, + "min": 0, + "max": 0, + "values": [ + 0 + ] + }, + "fcp": { + "median": 54, + "min": 54, + "max": 54, + "values": [ + 54 + ] + }, + "lcp": { + "median": 82, + "min": 82, + "max": 82, + "values": [ + 82 + ] + }, + "domContentLoaded": { + "median": 81, + "min": 81, + "max": 81, + "values": [ + 81 + ] + }, + "bootDone": { + "median": 84, + "min": 84, + "max": 84, + "values": [ + 84 + ] + }, + "reloadDuration": { + "median": 100, + "min": 100, + "max": 100, + "values": [ + 100 + ] + } + }, + "updateJs": { + "requestCount": { + "median": 5, + "min": 5, + "max": 5, + "values": [ + 5 + ] + }, + "wireBytes": { + "median": 194026, + "min": 194026, + "max": 194026, + "values": [ + 194026 + ] + }, + "duration": { + "median": 2313, + "min": 2313, + "max": 2313, + "values": [ + 2313 + ] + }, + "wireBytesByType": { + "html": 13730, + "js": 176837, + "css": 0, + "fonts": 0, + "images": 0, + "media": 0, + "api": 3459, + "other": 0 + }, + "requests": [ + { + "url": "http://127.0.0.1:6134/sw.js", + "status": 200, + "bytes": 8942 + }, + { + "url": "http://127.0.0.1:6134/asset-sync-core.js?v=155be9339b", + "status": 200, + "bytes": 1954 + }, + { + "url": "http://127.0.0.1:6134/api/manifest", + "status": 200, + "bytes": 3459 + }, + { + "url": "http://127.0.0.1:6134/app.js?v=4d214d16f1", + "status": 200, + "bytes": 165941 + }, + { + "url": "http://127.0.0.1:6134/index.html?v=98e7f379a2", + "status": 200, + "bytes": 13730 + } + ] + }, + "updateCss": { + "requestCount": { + "median": 4, + "min": 4, + "max": 4, + "values": [ + 4 + ] + }, + "wireBytes": { + "median": 28082, + "min": 28082, + "max": 28082, + "values": [ + 28082 + ] + }, + "duration": { + "median": 931, + "min": 931, + "max": 931, + "values": [ + 931 + ] + }, + "wireBytesByType": { + "html": 13728, + "js": 10895, + "css": 0, + "fonts": 0, + "images": 0, + "media": 0, + "api": 3459, + "other": 0 + }, + "requests": [ + { + "url": "http://127.0.0.1:6134/sw.js", + "status": 200, + "bytes": 8941 + }, + { + "url": "http://127.0.0.1:6134/asset-sync-core.js?v=155be9339b", + "status": 200, + "bytes": 1954 + }, + { + "url": "http://127.0.0.1:6134/api/manifest", + "status": 200, + "bytes": 3459 + }, + { + "url": "http://127.0.0.1:6134/index.html?v=3a342efd0b", + "status": 200, + "bytes": 13728 + } + ] + } + } + } + } +} \ No newline at end of file diff --git a/perf/results/phase3-hashing-rollback-2026-10-08.json b/perf/results/phase3-hashing-rollback-2026-10-08.json new file mode 100644 index 0000000..535e017 --- /dev/null +++ b/perf/results/phase3-hashing-rollback-2026-10-08.json @@ -0,0 +1,132 @@ +{ + "date": "2026-10-07T20:10:25.561Z", + "frontendCommit": null, + "commit": "46ec9ab2ca0f1b5365b5b05b08052df967d6fcfc", + "runsConfigured": 1, + "browsers": { + "chromium": { + "lte": { + "offline": { + "requestCount": { + "median": 0, + "min": 0, + "max": 0, + "values": [ + 0 + ] + }, + "wireBytes": { + "median": 0, + "min": 0, + "max": 0, + "values": [ + 0 + ] + }, + "fcp": { + "median": 48, + "min": 48, + "max": 48, + "values": [ + 48 + ] + }, + "lcp": { + "median": 48, + "min": 48, + "max": 48, + "values": [ + 48 + ] + }, + "domContentLoaded": { + "median": 165, + "min": 165, + "max": 165, + "values": [ + 165 + ] + }, + "bootDone": { + "median": 170, + "min": 170, + "max": 170, + "values": [ + 170 + ] + }, + "reloadDuration": { + "median": 187, + "min": 187, + "max": 187, + "values": [ + 187 + ] + } + } + } + }, + "webkit": { + "lte": { + "offline": { + "requestCount": { + "median": 0, + "min": 0, + "max": 0, + "values": [ + 0 + ] + }, + "wireBytes": { + "median": 0, + "min": 0, + "max": 0, + "values": [ + 0 + ] + }, + "fcp": { + "median": 80, + "min": 80, + "max": 80, + "values": [ + 80 + ] + }, + "lcp": { + "median": 136, + "min": 136, + "max": 136, + "values": [ + 136 + ] + }, + "domContentLoaded": { + "median": 134, + "min": 134, + "max": 134, + "values": [ + 134 + ] + }, + "bootDone": { + "median": 140, + "min": 140, + "max": 140, + "values": [ + 140 + ] + }, + "reloadDuration": { + "median": 163, + "min": 163, + "max": 163, + "values": [ + 163 + ] + } + } + } + } + } +} \ No newline at end of file diff --git a/perf/results/phase3-lazy-2026-10-08.json b/perf/results/phase3-lazy-2026-10-08.json new file mode 100644 index 0000000..8a9e836 --- /dev/null +++ b/perf/results/phase3-lazy-2026-10-08.json @@ -0,0 +1,79 @@ +{ + "results": [ + { + "browser": "chromium", + "sourceBuildTag": "bea1f63eba85", + "classicSharedDefaults": true, + "cssOrderPreserved": true, + "settingsSearch": true, + "carControls": 4, + "offlineFeature": true, + "firstUseNetwork": 0, + "layoutsOffline": [ + "glass-stage", + "bento-hub", + "f7-swipe", + "classic" + ], + "pinned": true, + "compatibleUnexecutedNewURL": true, + "incompatibleN1ReloadRequired": true, + "stagedN1": true, + "playbackGuard": true, + "prePaintLayout": true, + "offlineSettingsPanels": true, + "scriptErrors": [], + "offlineTransportErrors": [] + }, + { + "browser": "webkit", + "sourceBuildTag": "bea1f63eba85", + "classicSharedDefaults": true, + "cssOrderPreserved": true, + "settingsSearch": true, + "carControls": 4, + "offlineFeature": true, + "firstUseNetwork": 0, + "layoutsOffline": [ + "glass-stage", + "bento-hub", + "f7-swipe", + "classic" + ], + "pinned": true, + "compatibleUnexecutedNewURL": true, + "incompatibleN1ReloadRequired": true, + "stagedN1": true, + "playbackGuard": true, + "prePaintLayout": true, + "offlineSettingsPanels": true, + "scriptErrors": [], + "offlineTransportErrors": [ + { + "message": "TypeError: Load failed", + "disconnected": true + }, + { + "message": "/127.0.0.1:38845/api/version.", + "disconnected": true + }, + { + "message": "TypeError: Load failed", + "disconnected": true + }, + { + "message": "/127.0.0.1:38845/api/recommendations?fp=163577c02a53bc40.", + "disconnected": true + }, + { + "message": "TypeError: Load failed", + "disconnected": true + }, + { + "message": "/127.0.0.1:38845/api/version.", + "disconnected": true + } + ] + } + ] +} diff --git a/perf/results/phase3-migration-lossy-2026-10-08.json b/perf/results/phase3-migration-lossy-2026-10-08.json new file mode 100644 index 0000000..7ec206f --- /dev/null +++ b/perf/results/phase3-migration-lossy-2026-10-08.json @@ -0,0 +1,41 @@ +{ + "commit": "b77938a", + "results": [ + { + "browser": "chromium", + "oldTag": "1175f1a1d2c1", + "newTag": "bea1f63eba85", + "banners": 1, + "updateReloads": 1, + "cachedFiles": 114, + "durationMs": 24356, + "wireBytes": 607853, + "offline": true, + "legacyURLs": 21, + "profile": "lossy", + "userInitiatedOnly": true, + "playbackGuard": true, + "evictionRepair": true, + "incrementalRefresh": true, + "offlineTransportErrors": 0 + }, + { + "browser": "webkit", + "oldTag": "1175f1a1d2c1", + "newTag": "bea1f63eba85", + "banners": 1, + "updateReloads": 1, + "cachedFiles": 114, + "durationMs": 20402, + "wireBytes": 729652, + "offline": true, + "legacyURLs": 21, + "profile": "lossy", + "userInitiatedOnly": true, + "playbackGuard": true, + "evictionRepair": true, + "incrementalRefresh": true, + "offlineTransportErrors": 4 + } + ] +} diff --git a/perf/results/phase3-migration-unthrottled-2026-10-08.json b/perf/results/phase3-migration-unthrottled-2026-10-08.json new file mode 100644 index 0000000..c01239f --- /dev/null +++ b/perf/results/phase3-migration-unthrottled-2026-10-08.json @@ -0,0 +1,41 @@ +{ + "commit": "b77938a", + "results": [ + { + "browser": "chromium", + "oldTag": "1175f1a1d2c1", + "newTag": "bea1f63eba85", + "banners": 1, + "updateReloads": 1, + "cachedFiles": 114, + "durationMs": 10864, + "wireBytes": 625216, + "offline": true, + "legacyURLs": 21, + "profile": "unthrottled", + "userInitiatedOnly": true, + "playbackGuard": true, + "evictionRepair": true, + "incrementalRefresh": true, + "offlineTransportErrors": 0 + }, + { + "browser": "webkit", + "oldTag": "1175f1a1d2c1", + "newTag": "bea1f63eba85", + "banners": 1, + "updateReloads": 1, + "cachedFiles": 114, + "durationMs": 9584, + "wireBytes": 743322, + "offline": true, + "legacyURLs": 21, + "profile": "unthrottled", + "userInitiatedOnly": true, + "playbackGuard": true, + "evictionRepair": true, + "incrementalRefresh": true, + "offlineTransportErrors": 4 + } + ] +} diff --git a/perf/results/phase3-phase0-initial-2026-10-08.json b/perf/results/phase3-phase0-initial-2026-10-08.json new file mode 100644 index 0000000..c7ce2e6 --- /dev/null +++ b/perf/results/phase3-phase0-initial-2026-10-08.json @@ -0,0 +1,2420 @@ +{ + "date": "2026-10-07T20:04:55.178Z", + "frontendCommit": "7bc5b4f8b50d78ece3cca5100d54a97fece2748a", + "commit": "46ec9ab2ca0f1b5365b5b05b08052df967d6fcfc", + "runsConfigured": 1, + "browsers": { + "chromium": { + "lte": { + "cold": { + "requestCount": { + "median": 166, + "min": 166, + "max": 166, + "values": [ + 166 + ] + }, + "wireBytes": { + "median": 1041605, + "min": 1041605, + "max": 1041605, + "values": [ + 1041605 + ] + }, + "fcp": { + "median": 1564, + "min": 1564, + "max": 1564, + "values": [ + 1564 + ] + }, + "lcp": { + "median": 1920, + "min": 1920, + "max": 1920, + "values": [ + 1920 + ] + }, + "domContentLoaded": { + "median": 10770, + "min": 10770, + "max": 10770, + "values": [ + 10770 + ] + }, + "bootDone": { + "median": 10902, + "min": 10902, + "max": 10902, + "values": [ + 10902 + ] + }, + "longTaskTotal": { + "median": 432, + "min": 432, + "max": 432, + "values": [ + 432 + ] + }, + "swInstallDuration": { + "median": 40411, + "min": 40411, + "max": 40411, + "values": [ + 40411 + ] + }, + "swInstallBytes": { + "median": 1041605, + "min": 1041605, + "max": 1041605, + "values": [ + 1041605 + ] + }, + "storageEstimate": { + "usage": 3486392, + "quota": 5372195512 + }, + "mediaReady": { + "median": null, + "min": null, + "max": null, + "values": [ + null + ] + }, + "autoplayBlocked": true, + "wireBytesByType": { + "html": 28461, + "js": 478109, + "css": 130718, + "fonts": 397072, + "images": 6278, + "media": 0, + "api": 336, + "other": 631 + }, + "requests": [ + { + "url": "http://127.0.0.1:5271/?v=benchmedia01", + "status": 200, + "bytes": 9487 + }, + { + "url": "http://127.0.0.1:5271/fonts/HankenGrotesk-latin.woff2", + "status": 200, + "bytes": 34704 + }, + { + "url": "http://127.0.0.1:5271/fonts/BricolageGrotesque-latin.woff2", + "status": 200, + "bytes": 76888 + }, + { + "url": "http://127.0.0.1:5271/styles.css?v=9f3a5dea41", + "status": 200, + "bytes": 27364 + }, + { + "url": "http://127.0.0.1:5271/fonts/fonts.css?v=dda3dfb804", + "status": 200, + "bytes": 391 + }, + { + "url": "http://127.0.0.1:5271/refresh.css?v=62498384f1", + "status": 200, + "bytes": 5027 + }, + { + "url": "http://127.0.0.1:5271/service-ui.css?v=b9bf96a3a8", + "status": 200, + "bytes": 3736 + }, + { + "url": "http://127.0.0.1:5271/theme-glass.css?v=2c482caf77", + "status": 200, + "bytes": 5180 + }, + { + "url": "http://127.0.0.1:5271/theme-classic.css?v=d420fcfb12", + "status": 200, + "bytes": 3529 + }, + { + "url": "http://127.0.0.1:5271/recommendations.css?v=055101368d", + "status": 200, + "bytes": 790 + }, + { + "url": "http://127.0.0.1:5271/settings-sections.css?v=055507ab85", + "status": 200, + "bytes": 873 + }, + { + "url": "http://127.0.0.1:5271/direct-media.css?v=19b8428bfd", + "status": 200, + "bytes": 291 + }, + { + "url": "http://127.0.0.1:5271/lower-third.css?v=031f8e0ead", + "status": 200, + "bytes": 375 + }, + { + "url": "http://127.0.0.1:5271/car-mode.css?v=7d421630b3", + "status": 200, + "bytes": 385 + }, + { + "url": "http://127.0.0.1:5271/offline-pages.css?v=2889456261", + "status": 200, + "bytes": 859 + }, + { + "url": "http://127.0.0.1:5271/saved-page.css?v=3ff576a784", + "status": 200, + "bytes": 537 + }, + { + "url": "http://127.0.0.1:5271/theme-glass-controls.css?v=3354ad9631", + "status": 200, + "bytes": 1480 + }, + { + "url": "http://127.0.0.1:5271/theme-glass-panel.css?v=25aadb0bb7", + "status": 200, + "bytes": 848 + }, + { + "url": "http://127.0.0.1:5271/fullscreen-orientation.css?v=91f2d84453", + "status": 200, + "bytes": 1415 + }, + { + "url": "http://127.0.0.1:5271/related-videos.css?v=5a616b1be8", + "status": 200, + "bytes": 404 + }, + { + "url": "http://127.0.0.1:5271/download-actions.css?v=12d3bcfe3e", + "status": 200, + "bytes": 430 + }, + { + "url": "http://127.0.0.1:5271/theme-bento-hub.css?v=f529dc4bb7", + "status": 200, + "bytes": 6718 + }, + { + "url": "http://127.0.0.1:5271/theme-f7.css?v=02ba226f82", + "status": 200, + "bytes": 4727 + }, + { + "url": "http://127.0.0.1:5271/fingerprint.js?v=a635143269", + "status": 200, + "bytes": 1034 + }, + { + "url": "http://127.0.0.1:5271/fonts/JetBrainsMono-latin.woff2", + "status": 200, + "bytes": 31432 + }, + { + "url": "http://127.0.0.1:5271/opfs.js?v=0922d5004c", + "status": 200, + "bytes": 3905 + }, + { + "url": "http://127.0.0.1:5271/video-edit.js?v=90c5dd1eb6", + "status": 200, + "bytes": 2168 + }, + { + "url": "http://127.0.0.1:5271/lyrics-core.js?v=4dcdac2edd", + "status": 200, + "bytes": 2632 + }, + { + "url": "http://127.0.0.1:5271/lyrics-display.js?v=48e8550175", + "status": 200, + "bytes": 571 + }, + { + "url": "http://127.0.0.1:5271/flag-ui.js?v=eeae1c1d1a", + "status": 200, + "bytes": 2036 + }, + { + "url": "http://127.0.0.1:5271/export.js?v=5b7cdcd7a3", + "status": 200, + "bytes": 1305 + }, + { + "url": "http://127.0.0.1:5271/stats-core.js?v=3de0591d83", + "status": 200, + "bytes": 2336 + }, + { + "url": "http://127.0.0.1:5271/sha256-wasm.js?v=393c50ba56", + "status": 200, + "bytes": 1521 + }, + { + "url": "http://127.0.0.1:5271/sha256.js?v=68566d2e65", + "status": 200, + "bytes": 2718 + }, + { + "url": "http://127.0.0.1:5271/loudness-wasm.js?v=c6102d7844", + "status": 200, + "bytes": 1130 + }, + { + "url": "http://127.0.0.1:5271/loudness.js?v=01b3da88dd", + "status": 200, + "bytes": 1818 + }, + { + "url": "http://127.0.0.1:5271/device-db.js?v=880c5cd70e", + "status": 200, + "bytes": 1050 + }, + { + "url": "http://127.0.0.1:5271/p2p-client.js?v=0c59fc208b", + "status": 200, + "bytes": 3822 + }, + { + "url": "http://127.0.0.1:5271/p2p-core.js?v=168a879219", + "status": 200, + "bytes": 989 + }, + { + "url": "http://127.0.0.1:5271/p2p-transfer.js?v=2186d77fae", + "status": 200, + "bytes": 2420 + }, + { + "url": "http://127.0.0.1:5271/async-guard.js?v=e4afa1f2be", + "status": 200, + "bytes": 725 + }, + { + "url": "http://127.0.0.1:5271/sw-update.js?v=1c30917179", + "status": 200, + "bytes": 3549 + }, + { + "url": "http://127.0.0.1:5271/related-videos.js?v=3eec0ebd4c", + "status": 200, + "bytes": 545 + }, + { + "url": "http://127.0.0.1:5271/audio-continuity.js?v=63b5464dd5", + "status": 200, + "bytes": 583 + }, + { + "url": "http://127.0.0.1:5271/fullscreen-orientation.js?v=c8e44eb66b", + "status": 200, + "bytes": 2494 + }, + { + "url": "http://127.0.0.1:5271/settings-sections.js?v=870249a743", + "status": 200, + "bytes": 2373 + }, + { + "url": "http://127.0.0.1:5271/direct-protocol.js?v=87a73be90f", + "status": 200, + "bytes": 1079 + }, + { + "url": "http://127.0.0.1:5271/direct-stream.js?v=d7f9871605", + "status": 200, + "bytes": 1249 + }, + { + "url": "http://127.0.0.1:5271/direct-media.js?v=5c93a4508c", + "status": 200, + "bytes": 3684 + }, + { + "url": "http://127.0.0.1:5271/download-actions.js?v=388c7edecb", + "status": 200, + "bytes": 550 + }, + { + "url": "http://127.0.0.1:5271/download-errors.js?v=bb6a4c887a", + "status": 200, + "bytes": 727 + }, + { + "url": "http://127.0.0.1:5271/downloads.js?v=f2d3e7d212", + "status": 200, + "bytes": 1764 + }, + { + "url": "http://127.0.0.1:5271/downloads-page.js?v=c1a3a218c0", + "status": 200, + "bytes": 3103 + }, + { + "url": "http://127.0.0.1:5271/saved-page.js?v=f1518c50fb", + "status": 200, + "bytes": 652 + }, + { + "url": "http://127.0.0.1:5271/server-backfill.js?v=294b103023", + "status": 200, + "bytes": 918 + }, + { + "url": "http://127.0.0.1:5271/glass-controls.js?v=a60ed1fe84", + "status": 200, + "bytes": 2763 + }, + { + "url": "http://127.0.0.1:5271/bento-hub.js?v=c867882d7e", + "status": 200, + "bytes": 1294 + }, + { + "url": "http://127.0.0.1:5271/f7-layout.js?v=99c11c557b", + "status": 200, + "bytes": 4138 + }, + { + "url": "http://127.0.0.1:5271/glass-panel-layout.js?v=d5417786d0", + "status": 200, + "bytes": 965 + }, + { + "url": "http://127.0.0.1:5271/party-dj.js?v=1677c38a88", + "status": 200, + "bytes": 1184 + }, + { + "url": "http://127.0.0.1:5271/lyrics-window.js?v=68591e0c78", + "status": 200, + "bytes": 2024 + }, + { + "url": "http://127.0.0.1:5271/midi.js?v=dbecfa74e1", + "status": 200, + "bytes": 1713 + }, + { + "url": "http://127.0.0.1:5271/lower-third.js?v=7705dcbfb4", + "status": 200, + "bytes": 927 + }, + { + "url": "http://127.0.0.1:5271/vocal-reducer.js?v=ddb2fc1bbe", + "status": 200, + "bytes": 1146 + }, + { + "url": "http://127.0.0.1:5271/eq-core.js?v=e9769cb594", + "status": 200, + "bytes": 1341 + }, + { + "url": "http://127.0.0.1:5271/piano-core.js?v=77c8269761", + "status": 200, + "bytes": 756 + }, + { + "url": "http://127.0.0.1:5271/piano.js?v=79b13f0de0", + "status": 200, + "bytes": 3436 + }, + { + "url": "http://127.0.0.1:5271/setlist-import.js?v=13bc5cc4a4", + "status": 200, + "bytes": 2462 + }, + { + "url": "http://127.0.0.1:5271/car-mode.js?v=19f187c23f", + "status": 200, + "bytes": 1678 + }, + { + "url": "http://127.0.0.1:5271/visible-timer.js?v=5322e86ef4", + "status": 200, + "bytes": 380 + }, + { + "url": "http://127.0.0.1:5271/app.js?v=341e4a973f", + "status": 200, + "bytes": 129398 + }, + { + "url": "http://127.0.0.1:5271/api/recommendations?fp=c83c12c79b483c87", + "status": 200, + "bytes": 24 + }, + { + "url": "http://127.0.0.1:5271/api/version", + "status": 200, + "bytes": 62 + }, + { + "url": "http://127.0.0.1:5271/sw.js", + "status": 200, + "bytes": 5236 + }, + { + "url": "http://127.0.0.1:5271/api/user/sync", + "status": 200, + "bytes": 11 + }, + { + "url": "http://127.0.0.1:5271/", + "status": 200, + "bytes": 9487 + }, + { + "url": "http://127.0.0.1:5271/index.html", + "status": 200, + "bytes": 9487 + }, + { + "url": "http://127.0.0.1:5271/styles.css", + "status": 200, + "bytes": 27364 + }, + { + "url": "http://127.0.0.1:5271/service-ui.css", + "status": 200, + "bytes": 3736 + }, + { + "url": "http://127.0.0.1:5271/refresh.css", + "status": 200, + "bytes": 5027 + }, + { + "url": "http://127.0.0.1:5271/theme-glass.css", + "status": 200, + "bytes": 5180 + }, + { + "url": "http://127.0.0.1:5271/theme-bento-hub.css", + "status": 200, + "bytes": 6718 + }, + { + "url": "http://127.0.0.1:5271/theme-f7.css", + "status": 200, + "bytes": 4727 + }, + { + "url": "http://127.0.0.1:5271/fonts/PlusJakartaSans-latin.woff2", + "status": 200, + "bytes": 27348 + }, + { + "url": "http://127.0.0.1:5271/fonts/PlusJakartaSans-latin-ext.woff2", + "status": 200, + "bytes": 21728 + }, + { + "url": "http://127.0.0.1:5271/theme-glass-panel.css", + "status": 200, + "bytes": 848 + }, + { + "url": "http://127.0.0.1:5271/glass-panel-layout.js", + "status": 200, + "bytes": 965 + }, + { + "url": "http://127.0.0.1:5271/theme-classic.css", + "status": 200, + "bytes": 3529 + }, + { + "url": "http://127.0.0.1:5271/recommendations.css", + "status": 200, + "bytes": 790 + }, + { + "url": "http://127.0.0.1:5271/flag-ui.js", + "status": 200, + "bytes": 2036 + }, + { + "url": "http://127.0.0.1:5271/export.js", + "status": 200, + "bytes": 1305 + }, + { + "url": "http://127.0.0.1:5271/async-guard.js", + "status": 200, + "bytes": 725 + }, + { + "url": "http://127.0.0.1:5271/visible-timer.js", + "status": 200, + "bytes": 380 + }, + { + "url": "http://127.0.0.1:5271/sw-update.js", + "status": 200, + "bytes": 3549 + }, + { + "url": "http://127.0.0.1:5271/fingerprint.js", + "status": 200, + "bytes": 1034 + }, + { + "url": "http://127.0.0.1:5271/opfs.js", + "status": 200, + "bytes": 3905 + }, + { + "url": "http://127.0.0.1:5271/opfs-worker.js", + "status": 200, + "bytes": 3418 + }, + { + "url": "http://127.0.0.1:5271/video-edit.js", + "status": 200, + "bytes": 2168 + }, + { + "url": "http://127.0.0.1:5271/lyrics-core.js", + "status": 200, + "bytes": 2632 + }, + { + "url": "http://127.0.0.1:5271/lyrics-display.js", + "status": 200, + "bytes": 571 + }, + { + "url": "http://127.0.0.1:5271/stats-core.js", + "status": 200, + "bytes": 2336 + }, + { + "url": "http://127.0.0.1:5271/sha256.js", + "status": 200, + "bytes": 2718 + }, + { + "url": "http://127.0.0.1:5271/resume-core.js", + "status": 200, + "bytes": 762 + }, + { + "url": "http://127.0.0.1:5271/loudness-wasm.js", + "status": 200, + "bytes": 1130 + }, + { + "url": "http://127.0.0.1:5271/loudness.js", + "status": 200, + "bytes": 1818 + }, + { + "url": "http://127.0.0.1:5271/sha256-wasm.js", + "status": 200, + "bytes": 1521 + }, + { + "url": "http://127.0.0.1:5271/device-db.js", + "status": 200, + "bytes": 1050 + }, + { + "url": "http://127.0.0.1:5271/hash-worker.js", + "status": 200, + "bytes": 496 + }, + { + "url": "http://127.0.0.1:5271/p2p-client.js", + "status": 200, + "bytes": 3822 + }, + { + "url": "http://127.0.0.1:5271/p2p-core.js", + "status": 200, + "bytes": 989 + }, + { + "url": "http://127.0.0.1:5271/direct-media.css", + "status": 200, + "bytes": 291 + }, + { + "url": "http://127.0.0.1:5271/direct-protocol.js", + "status": 200, + "bytes": 1079 + }, + { + "url": "http://127.0.0.1:5271/direct-media.js", + "status": 200, + "bytes": 3684 + }, + { + "url": "http://127.0.0.1:5271/direct-stream.js", + "status": 200, + "bytes": 1249 + }, + { + "url": "http://127.0.0.1:5271/direct-recv-worker.js", + "status": 200, + "bytes": 1012 + }, + { + "url": "http://127.0.0.1:5271/api/recommendations?fp=c83c12c79b483c87", + "status": 200, + "bytes": 24 + }, + { + "url": "http://127.0.0.1:5271/p2p-transfer.js", + "status": 200, + "bytes": 2420 + }, + { + "url": "http://127.0.0.1:5271/p2p-recv-worker.js", + "status": 200, + "bytes": 1247 + }, + { + "url": "http://127.0.0.1:5271/settings-sections.js", + "status": 200, + "bytes": 2373 + }, + { + "url": "http://127.0.0.1:5271/related-videos.js", + "status": 200, + "bytes": 545 + }, + { + "url": "http://127.0.0.1:5271/related-videos.css", + "status": 200, + "bytes": 404 + }, + { + "url": "http://127.0.0.1:5271/audio-continuity.js", + "status": 200, + "bytes": 583 + }, + { + "url": "http://127.0.0.1:5271/fullscreen-orientation.js", + "status": 200, + "bytes": 2494 + }, + { + "url": "http://127.0.0.1:5271/fullscreen-orientation.css", + "status": 200, + "bytes": 1415 + }, + { + "url": "http://127.0.0.1:5271/download-actions.js", + "status": 200, + "bytes": 550 + }, + { + "url": "http://127.0.0.1:5271/download-actions.css", + "status": 200, + "bytes": 430 + }, + { + "url": "http://127.0.0.1:5271/download-errors.js", + "status": 200, + "bytes": 727 + }, + { + "url": "http://127.0.0.1:5271/downloads.js", + "status": 200, + "bytes": 1764 + }, + { + "url": "http://127.0.0.1:5271/downloads-page.js", + "status": 200, + "bytes": 3103 + }, + { + "url": "http://127.0.0.1:5271/offline-pages.css", + "status": 200, + "bytes": 859 + }, + { + "url": "http://127.0.0.1:5271/saved-page.js", + "status": 200, + "bytes": 652 + }, + { + "url": "http://127.0.0.1:5271/server-backfill.js", + "status": 200, + "bytes": 918 + }, + { + "url": "http://127.0.0.1:5271/glass-controls.js", + "status": 200, + "bytes": 2763 + }, + { + "url": "http://127.0.0.1:5271/bento-hub.js", + "status": 200, + "bytes": 1294 + }, + { + "url": "http://127.0.0.1:5271/f7-layout.js", + "status": 200, + "bytes": 4138 + }, + { + "url": "http://127.0.0.1:5271/vendor/framework7-swipe.min.js", + "status": 200, + "bytes": 38592 + }, + { + "url": "http://127.0.0.1:5271/theme-glass-controls.css", + "status": 200, + "bytes": 1480 + }, + { + "url": "http://127.0.0.1:5271/saved-page.css", + "status": 200, + "bytes": 537 + }, + { + "url": "http://127.0.0.1:5271/party-dj.js", + "status": 200, + "bytes": 1184 + }, + { + "url": "http://127.0.0.1:5271/lyrics-window.js", + "status": 200, + "bytes": 2024 + }, + { + "url": "http://127.0.0.1:5271/midi.js", + "status": 200, + "bytes": 1713 + }, + { + "url": "http://127.0.0.1:5271/lower-third.js", + "status": 200, + "bytes": 927 + }, + { + "url": "http://127.0.0.1:5271/vocal-reducer.js", + "status": 200, + "bytes": 1146 + }, + { + "url": "http://127.0.0.1:5271/eq-core.js", + "status": 200, + "bytes": 1341 + }, + { + "url": "http://127.0.0.1:5271/piano-core.js", + "status": 200, + "bytes": 756 + }, + { + "url": "http://127.0.0.1:5271/piano.js", + "status": 200, + "bytes": 3436 + }, + { + "url": "http://127.0.0.1:5271/setlist-import.js", + "status": 200, + "bytes": 2462 + }, + { + "url": "http://127.0.0.1:5271/car-mode.js", + "status": 200, + "bytes": 1678 + }, + { + "url": "http://127.0.0.1:5271/car-mode.css", + "status": 200, + "bytes": 385 + }, + { + "url": "http://127.0.0.1:5271/lower-third.css", + "status": 200, + "bytes": 375 + }, + { + "url": "http://127.0.0.1:5271/settings-sections.css", + "status": 200, + "bytes": 873 + }, + { + "url": "http://127.0.0.1:5271/app.js", + "status": 200, + "bytes": 129398 + }, + { + "url": "http://127.0.0.1:5271/manifest.webmanifest", + "status": 200, + "bytes": 631 + }, + { + "url": "http://127.0.0.1:5271/icons/icon-192.png", + "status": 200, + "bytes": 1669 + }, + { + "url": "http://127.0.0.1:5271/icons/icon-512.png", + "status": 200, + "bytes": 4609 + }, + { + "url": "http://127.0.0.1:5271/fonts/fonts.css", + "status": 200, + "bytes": 391 + }, + { + "url": "http://127.0.0.1:5271/fonts/BricolageGrotesque-latin-ext.woff2", + "status": 200, + "bytes": 30736 + }, + { + "url": "http://127.0.0.1:5271/fonts/BricolageGrotesque-latin.woff2", + "status": 200, + "bytes": 76888 + }, + { + "url": "http://127.0.0.1:5271/fonts/HankenGrotesk-latin-ext.woff2", + "status": 200, + "bytes": 19588 + }, + { + "url": "http://127.0.0.1:5271/fonts/HankenGrotesk-latin.woff2", + "status": 200, + "bytes": 34704 + }, + { + "url": "http://127.0.0.1:5271/fonts/JetBrainsMono-latin-ext.woff2", + "status": 200, + "bytes": 11624 + }, + { + "url": "http://127.0.0.1:5271/fonts/JetBrainsMono-latin.woff2", + "status": 200, + "bytes": 31432 + }, + { + "url": "http://127.0.0.1:5271/sw.js", + "status": 200, + "bytes": 5236 + }, + { + "url": "http://127.0.0.1:5271/api/p2p/config", + "status": 200, + "bytes": 40 + }, + { + "url": "http://127.0.0.1:5271/api/p2p/device", + "status": 200, + "bytes": 121 + }, + { + "url": "http://127.0.0.1:5271/api/p2p/holdings", + "status": 200, + "bytes": 54 + } + ], + "initialJsCss": { + "median": 276414, + "min": 276414, + "max": 276414, + "values": [ + 276414 + ] + }, + "initialAssetRequests": [ + { + "url": "http://127.0.0.1:5271/fonts/fonts.css?v=dda3dfb804", + "bytes": 391 + }, + { + "url": "http://127.0.0.1:5271/styles.css?v=9f3a5dea41", + "bytes": 27364 + }, + { + "url": "http://127.0.0.1:5271/service-ui.css?v=b9bf96a3a8", + "bytes": 3736 + }, + { + "url": "http://127.0.0.1:5271/refresh.css?v=62498384f1", + "bytes": 5027 + }, + { + "url": "http://127.0.0.1:5271/theme-glass.css?v=2c482caf77", + "bytes": 5180 + }, + { + "url": "http://127.0.0.1:5271/theme-classic.css?v=d420fcfb12", + "bytes": 3529 + }, + { + "url": "http://127.0.0.1:5271/recommendations.css?v=055101368d", + "bytes": 790 + }, + { + "url": "http://127.0.0.1:5271/settings-sections.css?v=055507ab85", + "bytes": 873 + }, + { + "url": "http://127.0.0.1:5271/direct-media.css?v=19b8428bfd", + "bytes": 291 + }, + { + "url": "http://127.0.0.1:5271/lower-third.css?v=031f8e0ead", + "bytes": 375 + }, + { + "url": "http://127.0.0.1:5271/car-mode.css?v=7d421630b3", + "bytes": 385 + }, + { + "url": "http://127.0.0.1:5271/offline-pages.css?v=2889456261", + "bytes": 859 + }, + { + "url": "http://127.0.0.1:5271/saved-page.css?v=3ff576a784", + "bytes": 537 + }, + { + "url": "http://127.0.0.1:5271/theme-glass-controls.css?v=3354ad9631", + "bytes": 1480 + }, + { + "url": "http://127.0.0.1:5271/theme-glass-panel.css?v=25aadb0bb7", + "bytes": 848 + }, + { + "url": "http://127.0.0.1:5271/fullscreen-orientation.css?v=91f2d84453", + "bytes": 1415 + }, + { + "url": "http://127.0.0.1:5271/related-videos.css?v=5a616b1be8", + "bytes": 404 + }, + { + "url": "http://127.0.0.1:5271/download-actions.css?v=12d3bcfe3e", + "bytes": 430 + }, + { + "url": "http://127.0.0.1:5271/theme-bento-hub.css?v=f529dc4bb7", + "bytes": 6718 + }, + { + "url": "http://127.0.0.1:5271/theme-f7.css?v=02ba226f82", + "bytes": 4727 + }, + { + "url": "http://127.0.0.1:5271/fingerprint.js?v=a635143269", + "bytes": 1034 + }, + { + "url": "http://127.0.0.1:5271/opfs.js?v=0922d5004c", + "bytes": 3905 + }, + { + "url": "http://127.0.0.1:5271/video-edit.js?v=90c5dd1eb6", + "bytes": 2168 + }, + { + "url": "http://127.0.0.1:5271/lyrics-core.js?v=4dcdac2edd", + "bytes": 2632 + }, + { + "url": "http://127.0.0.1:5271/lyrics-display.js?v=48e8550175", + "bytes": 571 + }, + { + "url": "http://127.0.0.1:5271/flag-ui.js?v=eeae1c1d1a", + "bytes": 2036 + }, + { + "url": "http://127.0.0.1:5271/export.js?v=5b7cdcd7a3", + "bytes": 1305 + }, + { + "url": "http://127.0.0.1:5271/stats-core.js?v=3de0591d83", + "bytes": 2336 + }, + { + "url": "http://127.0.0.1:5271/sha256-wasm.js?v=393c50ba56", + "bytes": 1521 + }, + { + "url": "http://127.0.0.1:5271/sha256.js?v=68566d2e65", + "bytes": 2718 + }, + { + "url": "http://127.0.0.1:5271/loudness-wasm.js?v=c6102d7844", + "bytes": 1130 + }, + { + "url": "http://127.0.0.1:5271/loudness.js?v=01b3da88dd", + "bytes": 1818 + }, + { + "url": "http://127.0.0.1:5271/device-db.js?v=880c5cd70e", + "bytes": 1050 + }, + { + "url": "http://127.0.0.1:5271/p2p-client.js?v=0c59fc208b", + "bytes": 3822 + }, + { + "url": "http://127.0.0.1:5271/p2p-core.js?v=168a879219", + "bytes": 989 + }, + { + "url": "http://127.0.0.1:5271/p2p-transfer.js?v=2186d77fae", + "bytes": 2420 + }, + { + "url": "http://127.0.0.1:5271/async-guard.js?v=e4afa1f2be", + "bytes": 725 + }, + { + "url": "http://127.0.0.1:5271/sw-update.js?v=1c30917179", + "bytes": 3549 + }, + { + "url": "http://127.0.0.1:5271/related-videos.js?v=3eec0ebd4c", + "bytes": 545 + }, + { + "url": "http://127.0.0.1:5271/audio-continuity.js?v=63b5464dd5", + "bytes": 583 + }, + { + "url": "http://127.0.0.1:5271/fullscreen-orientation.js?v=c8e44eb66b", + "bytes": 2494 + }, + { + "url": "http://127.0.0.1:5271/settings-sections.js?v=870249a743", + "bytes": 2373 + }, + { + "url": "http://127.0.0.1:5271/direct-protocol.js?v=87a73be90f", + "bytes": 1079 + }, + { + "url": "http://127.0.0.1:5271/direct-stream.js?v=d7f9871605", + "bytes": 1249 + }, + { + "url": "http://127.0.0.1:5271/direct-media.js?v=5c93a4508c", + "bytes": 3684 + }, + { + "url": "http://127.0.0.1:5271/download-actions.js?v=388c7edecb", + "bytes": 550 + }, + { + "url": "http://127.0.0.1:5271/download-errors.js?v=bb6a4c887a", + "bytes": 727 + }, + { + "url": "http://127.0.0.1:5271/downloads.js?v=f2d3e7d212", + "bytes": 1764 + }, + { + "url": "http://127.0.0.1:5271/downloads-page.js?v=c1a3a218c0", + "bytes": 3103 + }, + { + "url": "http://127.0.0.1:5271/saved-page.js?v=f1518c50fb", + "bytes": 652 + }, + { + "url": "http://127.0.0.1:5271/server-backfill.js?v=294b103023", + "bytes": 918 + }, + { + "url": "http://127.0.0.1:5271/glass-controls.js?v=a60ed1fe84", + "bytes": 2763 + }, + { + "url": "http://127.0.0.1:5271/bento-hub.js?v=c867882d7e", + "bytes": 1294 + }, + { + "url": "http://127.0.0.1:5271/f7-layout.js?v=99c11c557b", + "bytes": 4138 + }, + { + "url": "http://127.0.0.1:5271/glass-panel-layout.js?v=d5417786d0", + "bytes": 965 + }, + { + "url": "http://127.0.0.1:5271/party-dj.js?v=1677c38a88", + "bytes": 1184 + }, + { + "url": "http://127.0.0.1:5271/lyrics-window.js?v=68591e0c78", + "bytes": 2024 + }, + { + "url": "http://127.0.0.1:5271/midi.js?v=dbecfa74e1", + "bytes": 1713 + }, + { + "url": "http://127.0.0.1:5271/lower-third.js?v=7705dcbfb4", + "bytes": 927 + }, + { + "url": "http://127.0.0.1:5271/vocal-reducer.js?v=ddb2fc1bbe", + "bytes": 1146 + }, + { + "url": "http://127.0.0.1:5271/eq-core.js?v=e9769cb594", + "bytes": 1341 + }, + { + "url": "http://127.0.0.1:5271/piano-core.js?v=77c8269761", + "bytes": 756 + }, + { + "url": "http://127.0.0.1:5271/piano.js?v=79b13f0de0", + "bytes": 3436 + }, + { + "url": "http://127.0.0.1:5271/setlist-import.js?v=13bc5cc4a4", + "bytes": 2462 + }, + { + "url": "http://127.0.0.1:5271/car-mode.js?v=19f187c23f", + "bytes": 1678 + }, + { + "url": "http://127.0.0.1:5271/visible-timer.js?v=5322e86ef4", + "bytes": 380 + }, + { + "url": "http://127.0.0.1:5271/app.js?v=341e4a973f", + "bytes": 129398 + } + ] + } + } + }, + "webkit": { + "lte": { + "cold": { + "requestCount": { + "median": 164, + "min": 164, + "max": 164, + "values": [ + 164 + ] + }, + "wireBytes": { + "median": 1182513, + "min": 1182513, + "max": 1182513, + "values": [ + 1182513 + ] + }, + "fcp": { + "median": 1025, + "min": 1025, + "max": 1025, + "values": [ + 1025 + ] + }, + "lcp": { + "median": 1207, + "min": 1207, + "max": 1207, + "values": [ + 1207 + ] + }, + "domContentLoaded": { + "median": 3114, + "min": 3114, + "max": 3114, + "values": [ + 3114 + ] + }, + "bootDone": { + "median": 3136, + "min": 3136, + "max": 3136, + "values": [ + 3136 + ] + }, + "longTaskTotal": { + "median": 0, + "min": 0, + "max": 0, + "values": [ + 0 + ] + }, + "swInstallDuration": { + "median": 32582, + "min": 32582, + "max": 32582, + "values": [ + 32582 + ] + }, + "swInstallBytes": { + "median": 1182513, + "min": 1182513, + "max": 1182513, + "values": [ + 1182513 + ] + }, + "storageEstimate": { + "usage": null, + "quota": null + }, + "mediaReady": { + "median": null, + "min": null, + "max": null, + "values": [ + null + ] + }, + "autoplayBlocked": true, + "wireBytesByType": { + "html": 34392, + "js": 586396, + "css": 156688, + "fonts": 397072, + "images": 6278, + "media": 0, + "api": 121, + "other": 1566 + }, + "requests": [ + { + "url": "http://127.0.0.1:5271/?v=benchmedia01", + "status": 200, + "bytes": 11464 + }, + { + "url": "http://127.0.0.1:5271/fonts/BricolageGrotesque-latin.woff2", + "status": 200, + "bytes": 76888 + }, + { + "url": "http://127.0.0.1:5271/fonts/fonts.css?v=dda3dfb804", + "status": 200, + "bytes": 457 + }, + { + "url": "http://127.0.0.1:5271/styles.css?v=9f3a5dea41", + "status": 200, + "bytes": 33412 + }, + { + "url": "http://127.0.0.1:5271/service-ui.css?v=b9bf96a3a8", + "status": 200, + "bytes": 4417 + }, + { + "url": "http://127.0.0.1:5271/refresh.css?v=62498384f1", + "status": 200, + "bytes": 5828 + }, + { + "url": "http://127.0.0.1:5271/theme-glass.css?v=2c482caf77", + "status": 200, + "bytes": 6039 + }, + { + "url": "http://127.0.0.1:5271/theme-classic.css?v=d420fcfb12", + "status": 200, + "bytes": 4079 + }, + { + "url": "http://127.0.0.1:5271/recommendations.css?v=055101368d", + "status": 200, + "bytes": 983 + }, + { + "url": "http://127.0.0.1:5271/settings-sections.css?v=055507ab85", + "status": 200, + "bytes": 1076 + }, + { + "url": "http://127.0.0.1:5271/direct-media.css?v=19b8428bfd", + "status": 200, + "bytes": 370 + }, + { + "url": "http://127.0.0.1:5271/lower-third.css?v=031f8e0ead", + "status": 200, + "bytes": 502 + }, + { + "url": "http://127.0.0.1:5271/car-mode.css?v=7d421630b3", + "status": 200, + "bytes": 504 + }, + { + "url": "http://127.0.0.1:5271/offline-pages.css?v=2889456261", + "status": 200, + "bytes": 1069 + }, + { + "url": "http://127.0.0.1:5271/saved-page.css?v=3ff576a784", + "status": 200, + "bytes": 673 + }, + { + "url": "http://127.0.0.1:5271/theme-glass-controls.css?v=3354ad9631", + "status": 200, + "bytes": 1782 + }, + { + "url": "http://127.0.0.1:5271/theme-glass-panel.css?v=25aadb0bb7", + "status": 200, + "bytes": 1045 + }, + { + "url": "http://127.0.0.1:5271/fullscreen-orientation.css?v=91f2d84453", + "status": 200, + "bytes": 1721 + }, + { + "url": "http://127.0.0.1:5271/related-videos.css?v=5a616b1be8", + "status": 200, + "bytes": 517 + }, + { + "url": "http://127.0.0.1:5271/download-actions.css?v=12d3bcfe3e", + "status": 200, + "bytes": 560 + }, + { + "url": "http://127.0.0.1:5271/theme-bento-hub.css?v=f529dc4bb7", + "status": 200, + "bytes": 7731 + }, + { + "url": "http://127.0.0.1:5271/theme-f7.css?v=02ba226f82", + "status": 200, + "bytes": 5579 + }, + { + "url": "http://127.0.0.1:5271/fingerprint.js?v=a635143269", + "status": 200, + "bytes": 1269 + }, + { + "url": "http://127.0.0.1:5271/opfs.js?v=0922d5004c", + "status": 200, + "bytes": 4553 + }, + { + "url": "http://127.0.0.1:5271/video-edit.js?v=90c5dd1eb6", + "status": 200, + "bytes": 2506 + }, + { + "url": "http://127.0.0.1:5271/lyrics-core.js?v=4dcdac2edd", + "status": 200, + "bytes": 3038 + }, + { + "url": "http://127.0.0.1:5271/lyrics-display.js?v=48e8550175", + "status": 200, + "bytes": 750 + }, + { + "url": "http://127.0.0.1:5271/flag-ui.js?v=eeae1c1d1a", + "status": 200, + "bytes": 2469 + }, + { + "url": "http://127.0.0.1:5271/export.js?v=5b7cdcd7a3", + "status": 200, + "bytes": 1536 + }, + { + "url": "http://127.0.0.1:5271/stats-core.js?v=3de0591d83", + "status": 200, + "bytes": 2619 + }, + { + "url": "http://127.0.0.1:5271/sha256-wasm.js?v=393c50ba56", + "status": 200, + "bytes": 1748 + }, + { + "url": "http://127.0.0.1:5271/sha256.js?v=68566d2e65", + "status": 200, + "bytes": 3187 + }, + { + "url": "http://127.0.0.1:5271/loudness-wasm.js?v=c6102d7844", + "status": 200, + "bytes": 1279 + }, + { + "url": "http://127.0.0.1:5271/loudness.js?v=01b3da88dd", + "status": 200, + "bytes": 2068 + }, + { + "url": "http://127.0.0.1:5271/device-db.js?v=880c5cd70e", + "status": 200, + "bytes": 1230 + }, + { + "url": "http://127.0.0.1:5271/p2p-client.js?v=0c59fc208b", + "status": 200, + "bytes": 4410 + }, + { + "url": "http://127.0.0.1:5271/p2p-core.js?v=168a879219", + "status": 200, + "bytes": 1137 + }, + { + "url": "http://127.0.0.1:5271/p2p-transfer.js?v=2186d77fae", + "status": 200, + "bytes": 2758 + }, + { + "url": "http://127.0.0.1:5271/async-guard.js?v=e4afa1f2be", + "status": 200, + "bytes": 887 + }, + { + "url": "http://127.0.0.1:5271/sw-update.js?v=1c30917179", + "status": 200, + "bytes": 4191 + }, + { + "url": "http://127.0.0.1:5271/related-videos.js?v=3eec0ebd4c", + "status": 200, + "bytes": 642 + }, + { + "url": "http://127.0.0.1:5271/audio-continuity.js?v=63b5464dd5", + "status": 200, + "bytes": 677 + }, + { + "url": "http://127.0.0.1:5271/fullscreen-orientation.js?v=c8e44eb66b", + "status": 200, + "bytes": 2916 + }, + { + "url": "http://127.0.0.1:5271/settings-sections.js?v=870249a743", + "status": 200, + "bytes": 2811 + }, + { + "url": "http://127.0.0.1:5271/direct-protocol.js?v=87a73be90f", + "status": 200, + "bytes": 1245 + }, + { + "url": "http://127.0.0.1:5271/direct-stream.js?v=d7f9871605", + "status": 200, + "bytes": 1457 + }, + { + "url": "http://127.0.0.1:5271/direct-media.js?v=5c93a4508c", + "status": 200, + "bytes": 4232 + }, + { + "url": "http://127.0.0.1:5271/download-actions.js?v=388c7edecb", + "status": 200, + "bytes": 669 + }, + { + "url": "http://127.0.0.1:5271/download-errors.js?v=bb6a4c887a", + "status": 200, + "bytes": 959 + }, + { + "url": "http://127.0.0.1:5271/downloads.js?v=f2d3e7d212", + "status": 200, + "bytes": 2088 + }, + { + "url": "http://127.0.0.1:5271/downloads-page.js?v=c1a3a218c0", + "status": 200, + "bytes": 3642 + }, + { + "url": "http://127.0.0.1:5271/saved-page.js?v=f1518c50fb", + "status": 200, + "bytes": 820 + }, + { + "url": "http://127.0.0.1:5271/server-backfill.js?v=294b103023", + "status": 200, + "bytes": 1105 + }, + { + "url": "http://127.0.0.1:5271/glass-controls.js?v=a60ed1fe84", + "status": 200, + "bytes": 3227 + }, + { + "url": "http://127.0.0.1:5271/bento-hub.js?v=c867882d7e", + "status": 200, + "bytes": 1523 + }, + { + "url": "http://127.0.0.1:5271/f7-layout.js?v=99c11c557b", + "status": 200, + "bytes": 4747 + }, + { + "url": "http://127.0.0.1:5271/glass-panel-layout.js?v=d5417786d0", + "status": 200, + "bytes": 1173 + }, + { + "url": "http://127.0.0.1:5271/party-dj.js?v=1677c38a88", + "status": 200, + "bytes": 1444 + }, + { + "url": "http://127.0.0.1:5271/lyrics-window.js?v=68591e0c78", + "status": 200, + "bytes": 2447 + }, + { + "url": "http://127.0.0.1:5271/midi.js?v=dbecfa74e1", + "status": 200, + "bytes": 2014 + }, + { + "url": "http://127.0.0.1:5271/lower-third.js?v=7705dcbfb4", + "status": 200, + "bytes": 1153 + }, + { + "url": "http://127.0.0.1:5271/vocal-reducer.js?v=ddb2fc1bbe", + "status": 200, + "bytes": 1397 + }, + { + "url": "http://127.0.0.1:5271/eq-core.js?v=e9769cb594", + "status": 200, + "bytes": 1567 + }, + { + "url": "http://127.0.0.1:5271/piano-core.js?v=77c8269761", + "status": 200, + "bytes": 867 + }, + { + "url": "http://127.0.0.1:5271/piano.js?v=79b13f0de0", + "status": 200, + "bytes": 3986 + }, + { + "url": "http://127.0.0.1:5271/setlist-import.js?v=13bc5cc4a4", + "status": 200, + "bytes": 2879 + }, + { + "url": "http://127.0.0.1:5271/car-mode.js?v=19f187c23f", + "status": 200, + "bytes": 2029 + }, + { + "url": "http://127.0.0.1:5271/visible-timer.js?v=5322e86ef4", + "status": 200, + "bytes": 474 + }, + { + "url": "http://127.0.0.1:5271/app.js?v=341e4a973f", + "status": 200, + "bytes": 164771 + }, + { + "url": "http://127.0.0.1:5271/fonts/HankenGrotesk-latin.woff2", + "status": 200, + "bytes": 34704 + }, + { + "url": "http://127.0.0.1:5271/fonts/JetBrainsMono-latin.woff2", + "status": 200, + "bytes": 31432 + }, + { + "url": "http://127.0.0.1:5271/manifest.webmanifest", + "status": 200, + "bytes": 783 + }, + { + "url": "http://127.0.0.1:5271/api/recommendations?fp=163577c02a53bc40", + "status": 200, + "bytes": 24 + }, + { + "url": "http://127.0.0.1:5271/api/version", + "status": 200, + "bytes": 62 + }, + { + "url": "http://127.0.0.1:5271/api/user/sync", + "status": 200, + "bytes": 11 + }, + { + "url": "http://127.0.0.1:5271/sw.js", + "status": 200, + "bytes": 6162 + }, + { + "url": "http://127.0.0.1:5271/api/recommendations?fp=163577c02a53bc40", + "status": 200, + "bytes": 24 + }, + { + "url": "http://127.0.0.1:5271/", + "status": 200, + "bytes": 11464 + }, + { + "url": "http://127.0.0.1:5271/index.html", + "status": 200, + "bytes": 11464 + }, + { + "url": "http://127.0.0.1:5271/styles.css", + "status": 200, + "bytes": 33412 + }, + { + "url": "http://127.0.0.1:5271/service-ui.css", + "status": 200, + "bytes": 4417 + }, + { + "url": "http://127.0.0.1:5271/refresh.css", + "status": 200, + "bytes": 5828 + }, + { + "url": "http://127.0.0.1:5271/theme-glass.css", + "status": 200, + "bytes": 6039 + }, + { + "url": "http://127.0.0.1:5271/theme-bento-hub.css", + "status": 200, + "bytes": 7731 + }, + { + "url": "http://127.0.0.1:5271/theme-f7.css", + "status": 200, + "bytes": 5579 + }, + { + "url": "http://127.0.0.1:5271/fonts/PlusJakartaSans-latin.woff2", + "status": 200, + "bytes": 27348 + }, + { + "url": "http://127.0.0.1:5271/fonts/PlusJakartaSans-latin-ext.woff2", + "status": 200, + "bytes": 21728 + }, + { + "url": "http://127.0.0.1:5271/theme-glass-panel.css", + "status": 200, + "bytes": 1045 + }, + { + "url": "http://127.0.0.1:5271/glass-panel-layout.js", + "status": 200, + "bytes": 1173 + }, + { + "url": "http://127.0.0.1:5271/theme-classic.css", + "status": 200, + "bytes": 4079 + }, + { + "url": "http://127.0.0.1:5271/recommendations.css", + "status": 200, + "bytes": 983 + }, + { + "url": "http://127.0.0.1:5271/flag-ui.js", + "status": 200, + "bytes": 2469 + }, + { + "url": "http://127.0.0.1:5271/export.js", + "status": 200, + "bytes": 1536 + }, + { + "url": "http://127.0.0.1:5271/async-guard.js", + "status": 200, + "bytes": 887 + }, + { + "url": "http://127.0.0.1:5271/visible-timer.js", + "status": 200, + "bytes": 474 + }, + { + "url": "http://127.0.0.1:5271/sw-update.js", + "status": 200, + "bytes": 4191 + }, + { + "url": "http://127.0.0.1:5271/fingerprint.js", + "status": 200, + "bytes": 1269 + }, + { + "url": "http://127.0.0.1:5271/opfs.js", + "status": 200, + "bytes": 4553 + }, + { + "url": "http://127.0.0.1:5271/opfs-worker.js", + "status": 200, + "bytes": 3957 + }, + { + "url": "http://127.0.0.1:5271/video-edit.js", + "status": 200, + "bytes": 2506 + }, + { + "url": "http://127.0.0.1:5271/lyrics-core.js", + "status": 200, + "bytes": 3038 + }, + { + "url": "http://127.0.0.1:5271/lyrics-display.js", + "status": 200, + "bytes": 750 + }, + { + "url": "http://127.0.0.1:5271/stats-core.js", + "status": 200, + "bytes": 2619 + }, + { + "url": "http://127.0.0.1:5271/sha256.js", + "status": 200, + "bytes": 3187 + }, + { + "url": "http://127.0.0.1:5271/resume-core.js", + "status": 200, + "bytes": 915 + }, + { + "url": "http://127.0.0.1:5271/loudness-wasm.js", + "status": 200, + "bytes": 1279 + }, + { + "url": "http://127.0.0.1:5271/loudness.js", + "status": 200, + "bytes": 2068 + }, + { + "url": "http://127.0.0.1:5271/sha256-wasm.js", + "status": 200, + "bytes": 1748 + }, + { + "url": "http://127.0.0.1:5271/device-db.js", + "status": 200, + "bytes": 1230 + }, + { + "url": "http://127.0.0.1:5271/hash-worker.js", + "status": 200, + "bytes": 576 + }, + { + "url": "http://127.0.0.1:5271/p2p-client.js", + "status": 200, + "bytes": 4410 + }, + { + "url": "http://127.0.0.1:5271/p2p-core.js", + "status": 200, + "bytes": 1137 + }, + { + "url": "http://127.0.0.1:5271/direct-media.css", + "status": 200, + "bytes": 370 + }, + { + "url": "http://127.0.0.1:5271/direct-protocol.js", + "status": 200, + "bytes": 1245 + }, + { + "url": "http://127.0.0.1:5271/direct-media.js", + "status": 200, + "bytes": 4232 + }, + { + "url": "http://127.0.0.1:5271/direct-stream.js", + "status": 200, + "bytes": 1457 + }, + { + "url": "http://127.0.0.1:5271/direct-recv-worker.js", + "status": 200, + "bytes": 1174 + }, + { + "url": "http://127.0.0.1:5271/p2p-transfer.js", + "status": 200, + "bytes": 2758 + }, + { + "url": "http://127.0.0.1:5271/p2p-recv-worker.js", + "status": 200, + "bytes": 1429 + }, + { + "url": "http://127.0.0.1:5271/settings-sections.js", + "status": 200, + "bytes": 2811 + }, + { + "url": "http://127.0.0.1:5271/related-videos.js", + "status": 200, + "bytes": 642 + }, + { + "url": "http://127.0.0.1:5271/related-videos.css", + "status": 200, + "bytes": 517 + }, + { + "url": "http://127.0.0.1:5271/audio-continuity.js", + "status": 200, + "bytes": 677 + }, + { + "url": "http://127.0.0.1:5271/fullscreen-orientation.js", + "status": 200, + "bytes": 2916 + }, + { + "url": "http://127.0.0.1:5271/fullscreen-orientation.css", + "status": 200, + "bytes": 1721 + }, + { + "url": "http://127.0.0.1:5271/download-actions.js", + "status": 200, + "bytes": 669 + }, + { + "url": "http://127.0.0.1:5271/download-actions.css", + "status": 200, + "bytes": 560 + }, + { + "url": "http://127.0.0.1:5271/download-errors.js", + "status": 200, + "bytes": 959 + }, + { + "url": "http://127.0.0.1:5271/downloads.js", + "status": 200, + "bytes": 2088 + }, + { + "url": "http://127.0.0.1:5271/downloads-page.js", + "status": 200, + "bytes": 3642 + }, + { + "url": "http://127.0.0.1:5271/offline-pages.css", + "status": 200, + "bytes": 1069 + }, + { + "url": "http://127.0.0.1:5271/saved-page.js", + "status": 200, + "bytes": 820 + }, + { + "url": "http://127.0.0.1:5271/server-backfill.js", + "status": 200, + "bytes": 1105 + }, + { + "url": "http://127.0.0.1:5271/glass-controls.js", + "status": 200, + "bytes": 3227 + }, + { + "url": "http://127.0.0.1:5271/bento-hub.js", + "status": 200, + "bytes": 1523 + }, + { + "url": "http://127.0.0.1:5271/f7-layout.js", + "status": 200, + "bytes": 4747 + }, + { + "url": "http://127.0.0.1:5271/vendor/framework7-swipe.min.js", + "status": 200, + "bytes": 44829 + }, + { + "url": "http://127.0.0.1:5271/theme-glass-controls.css", + "status": 200, + "bytes": 1782 + }, + { + "url": "http://127.0.0.1:5271/saved-page.css", + "status": 200, + "bytes": 673 + }, + { + "url": "http://127.0.0.1:5271/party-dj.js", + "status": 200, + "bytes": 1444 + }, + { + "url": "http://127.0.0.1:5271/lyrics-window.js", + "status": 200, + "bytes": 2447 + }, + { + "url": "http://127.0.0.1:5271/midi.js", + "status": 200, + "bytes": 2014 + }, + { + "url": "http://127.0.0.1:5271/lower-third.js", + "status": 200, + "bytes": 1153 + }, + { + "url": "http://127.0.0.1:5271/vocal-reducer.js", + "status": 200, + "bytes": 1397 + }, + { + "url": "http://127.0.0.1:5271/eq-core.js", + "status": 200, + "bytes": 1567 + }, + { + "url": "http://127.0.0.1:5271/piano-core.js", + "status": 200, + "bytes": 867 + }, + { + "url": "http://127.0.0.1:5271/piano.js", + "status": 200, + "bytes": 3986 + }, + { + "url": "http://127.0.0.1:5271/setlist-import.js", + "status": 200, + "bytes": 2879 + }, + { + "url": "http://127.0.0.1:5271/car-mode.js", + "status": 200, + "bytes": 2029 + }, + { + "url": "http://127.0.0.1:5271/car-mode.css", + "status": 200, + "bytes": 504 + }, + { + "url": "http://127.0.0.1:5271/lower-third.css", + "status": 200, + "bytes": 502 + }, + { + "url": "http://127.0.0.1:5271/settings-sections.css", + "status": 200, + "bytes": 1076 + }, + { + "url": "http://127.0.0.1:5271/app.js", + "status": 200, + "bytes": 164771 + }, + { + "url": "http://127.0.0.1:5271/manifest.webmanifest", + "status": 200, + "bytes": 783 + }, + { + "url": "http://127.0.0.1:5271/icons/icon-192.png", + "status": 200, + "bytes": 1669 + }, + { + "url": "http://127.0.0.1:5271/icons/icon-512.png", + "status": 200, + "bytes": 4609 + }, + { + "url": "http://127.0.0.1:5271/fonts/fonts.css", + "status": 200, + "bytes": 457 + }, + { + "url": "http://127.0.0.1:5271/fonts/BricolageGrotesque-latin-ext.woff2", + "status": 200, + "bytes": 30736 + }, + { + "url": "http://127.0.0.1:5271/fonts/BricolageGrotesque-latin.woff2", + "status": 200, + "bytes": 76888 + }, + { + "url": "http://127.0.0.1:5271/fonts/HankenGrotesk-latin-ext.woff2", + "status": 200, + "bytes": 19588 + }, + { + "url": "http://127.0.0.1:5271/fonts/HankenGrotesk-latin.woff2", + "status": 200, + "bytes": 34704 + }, + { + "url": "http://127.0.0.1:5271/fonts/JetBrainsMono-latin-ext.woff2", + "status": 200, + "bytes": 11624 + }, + { + "url": "http://127.0.0.1:5271/fonts/JetBrainsMono-latin.woff2", + "status": 200, + "bytes": 31432 + }, + { + "url": "http://127.0.0.1:5271/sw.js", + "status": 200, + "bytes": 6162 + } + ], + "initialJsCss": { + "median": 338940, + "min": 338940, + "max": 338940, + "values": [ + 338940 + ] + }, + "initialAssetRequests": [ + { + "url": "http://127.0.0.1:5271/fonts/fonts.css?v=dda3dfb804", + "bytes": 457 + }, + { + "url": "http://127.0.0.1:5271/service-ui.css?v=b9bf96a3a8", + "bytes": 4417 + }, + { + "url": "http://127.0.0.1:5271/refresh.css?v=62498384f1", + "bytes": 5828 + }, + { + "url": "http://127.0.0.1:5271/theme-glass.css?v=2c482caf77", + "bytes": 6039 + }, + { + "url": "http://127.0.0.1:5271/styles.css?v=9f3a5dea41", + "bytes": 33412 + }, + { + "url": "http://127.0.0.1:5271/theme-classic.css?v=d420fcfb12", + "bytes": 4079 + }, + { + "url": "http://127.0.0.1:5271/recommendations.css?v=055101368d", + "bytes": 983 + }, + { + "url": "http://127.0.0.1:5271/settings-sections.css?v=055507ab85", + "bytes": 1076 + }, + { + "url": "http://127.0.0.1:5271/direct-media.css?v=19b8428bfd", + "bytes": 370 + }, + { + "url": "http://127.0.0.1:5271/lower-third.css?v=031f8e0ead", + "bytes": 502 + }, + { + "url": "http://127.0.0.1:5271/car-mode.css?v=7d421630b3", + "bytes": 504 + }, + { + "url": "http://127.0.0.1:5271/offline-pages.css?v=2889456261", + "bytes": 1069 + }, + { + "url": "http://127.0.0.1:5271/saved-page.css?v=3ff576a784", + "bytes": 673 + }, + { + "url": "http://127.0.0.1:5271/theme-glass-controls.css?v=3354ad9631", + "bytes": 1782 + }, + { + "url": "http://127.0.0.1:5271/theme-glass-panel.css?v=25aadb0bb7", + "bytes": 1045 + }, + { + "url": "http://127.0.0.1:5271/fullscreen-orientation.css?v=91f2d84453", + "bytes": 1721 + }, + { + "url": "http://127.0.0.1:5271/related-videos.css?v=5a616b1be8", + "bytes": 517 + }, + { + "url": "http://127.0.0.1:5271/download-actions.css?v=12d3bcfe3e", + "bytes": 560 + }, + { + "url": "http://127.0.0.1:5271/theme-bento-hub.css?v=f529dc4bb7", + "bytes": 7731 + }, + { + "url": "http://127.0.0.1:5271/theme-f7.css?v=02ba226f82", + "bytes": 5579 + }, + { + "url": "http://127.0.0.1:5271/fingerprint.js?v=a635143269", + "bytes": 1269 + }, + { + "url": "http://127.0.0.1:5271/video-edit.js?v=90c5dd1eb6", + "bytes": 2506 + }, + { + "url": "http://127.0.0.1:5271/lyrics-core.js?v=4dcdac2edd", + "bytes": 3038 + }, + { + "url": "http://127.0.0.1:5271/opfs.js?v=0922d5004c", + "bytes": 4553 + }, + { + "url": "http://127.0.0.1:5271/lyrics-display.js?v=48e8550175", + "bytes": 750 + }, + { + "url": "http://127.0.0.1:5271/flag-ui.js?v=eeae1c1d1a", + "bytes": 2469 + }, + { + "url": "http://127.0.0.1:5271/export.js?v=5b7cdcd7a3", + "bytes": 1536 + }, + { + "url": "http://127.0.0.1:5271/sha256-wasm.js?v=393c50ba56", + "bytes": 1748 + }, + { + "url": "http://127.0.0.1:5271/stats-core.js?v=3de0591d83", + "bytes": 2619 + }, + { + "url": "http://127.0.0.1:5271/sha256.js?v=68566d2e65", + "bytes": 3187 + }, + { + "url": "http://127.0.0.1:5271/loudness-wasm.js?v=c6102d7844", + "bytes": 1279 + }, + { + "url": "http://127.0.0.1:5271/loudness.js?v=01b3da88dd", + "bytes": 2068 + }, + { + "url": "http://127.0.0.1:5271/device-db.js?v=880c5cd70e", + "bytes": 1230 + }, + { + "url": "http://127.0.0.1:5271/p2p-core.js?v=168a879219", + "bytes": 1137 + }, + { + "url": "http://127.0.0.1:5271/p2p-transfer.js?v=2186d77fae", + "bytes": 2758 + }, + { + "url": "http://127.0.0.1:5271/p2p-client.js?v=0c59fc208b", + "bytes": 4410 + }, + { + "url": "http://127.0.0.1:5271/async-guard.js?v=e4afa1f2be", + "bytes": 887 + }, + { + "url": "http://127.0.0.1:5271/sw-update.js?v=1c30917179", + "bytes": 4191 + }, + { + "url": "http://127.0.0.1:5271/related-videos.js?v=3eec0ebd4c", + "bytes": 642 + }, + { + "url": "http://127.0.0.1:5271/audio-continuity.js?v=63b5464dd5", + "bytes": 677 + }, + { + "url": "http://127.0.0.1:5271/fullscreen-orientation.js?v=c8e44eb66b", + "bytes": 2916 + }, + { + "url": "http://127.0.0.1:5271/settings-sections.js?v=870249a743", + "bytes": 2811 + }, + { + "url": "http://127.0.0.1:5271/direct-protocol.js?v=87a73be90f", + "bytes": 1245 + }, + { + "url": "http://127.0.0.1:5271/direct-stream.js?v=d7f9871605", + "bytes": 1457 + }, + { + "url": "http://127.0.0.1:5271/direct-media.js?v=5c93a4508c", + "bytes": 4232 + }, + { + "url": "http://127.0.0.1:5271/download-actions.js?v=388c7edecb", + "bytes": 669 + }, + { + "url": "http://127.0.0.1:5271/download-errors.js?v=bb6a4c887a", + "bytes": 959 + }, + { + "url": "http://127.0.0.1:5271/downloads.js?v=f2d3e7d212", + "bytes": 2088 + }, + { + "url": "http://127.0.0.1:5271/downloads-page.js?v=c1a3a218c0", + "bytes": 3642 + }, + { + "url": "http://127.0.0.1:5271/saved-page.js?v=f1518c50fb", + "bytes": 820 + }, + { + "url": "http://127.0.0.1:5271/server-backfill.js?v=294b103023", + "bytes": 1105 + }, + { + "url": "http://127.0.0.1:5271/glass-controls.js?v=a60ed1fe84", + "bytes": 3227 + }, + { + "url": "http://127.0.0.1:5271/bento-hub.js?v=c867882d7e", + "bytes": 1523 + }, + { + "url": "http://127.0.0.1:5271/f7-layout.js?v=99c11c557b", + "bytes": 4747 + }, + { + "url": "http://127.0.0.1:5271/glass-panel-layout.js?v=d5417786d0", + "bytes": 1173 + }, + { + "url": "http://127.0.0.1:5271/party-dj.js?v=1677c38a88", + "bytes": 1444 + }, + { + "url": "http://127.0.0.1:5271/lyrics-window.js?v=68591e0c78", + "bytes": 2447 + }, + { + "url": "http://127.0.0.1:5271/midi.js?v=dbecfa74e1", + "bytes": 2014 + }, + { + "url": "http://127.0.0.1:5271/lower-third.js?v=7705dcbfb4", + "bytes": 1153 + }, + { + "url": "http://127.0.0.1:5271/vocal-reducer.js?v=ddb2fc1bbe", + "bytes": 1397 + }, + { + "url": "http://127.0.0.1:5271/eq-core.js?v=e9769cb594", + "bytes": 1567 + }, + { + "url": "http://127.0.0.1:5271/piano-core.js?v=77c8269761", + "bytes": 867 + }, + { + "url": "http://127.0.0.1:5271/piano.js?v=79b13f0de0", + "bytes": 3986 + }, + { + "url": "http://127.0.0.1:5271/car-mode.js?v=19f187c23f", + "bytes": 2029 + }, + { + "url": "http://127.0.0.1:5271/setlist-import.js?v=13bc5cc4a4", + "bytes": 2879 + }, + { + "url": "http://127.0.0.1:5271/visible-timer.js?v=5322e86ef4", + "bytes": 474 + }, + { + "url": "http://127.0.0.1:5271/app.js?v=341e4a973f", + "bytes": 164771 + } + ] + } + } + } + } +} \ No newline at end of file diff --git a/perf/results/phase3-sync-rollback-2026-10-08.json b/perf/results/phase3-sync-rollback-2026-10-08.json new file mode 100644 index 0000000..27c179d --- /dev/null +++ b/perf/results/phase3-sync-rollback-2026-10-08.json @@ -0,0 +1,132 @@ +{ + "date": "2026-10-07T20:10:14.094Z", + "frontendCommit": null, + "commit": "46ec9ab2ca0f1b5365b5b05b08052df967d6fcfc", + "runsConfigured": 1, + "browsers": { + "chromium": { + "lte": { + "offline": { + "requestCount": { + "median": 0, + "min": 0, + "max": 0, + "values": [ + 0 + ] + }, + "wireBytes": { + "median": 0, + "min": 0, + "max": 0, + "values": [ + 0 + ] + }, + "fcp": { + "median": 44, + "min": 44, + "max": 44, + "values": [ + 44 + ] + }, + "lcp": { + "median": 44, + "min": 44, + "max": 44, + "values": [ + 44 + ] + }, + "domContentLoaded": { + "median": 135, + "min": 135, + "max": 135, + "values": [ + 135 + ] + }, + "bootDone": { + "median": 140, + "min": 140, + "max": 140, + "values": [ + 140 + ] + }, + "reloadDuration": { + "median": 158, + "min": 158, + "max": 158, + "values": [ + 158 + ] + } + } + } + }, + "webkit": { + "lte": { + "offline": { + "requestCount": { + "median": 0, + "min": 0, + "max": 0, + "values": [ + 0 + ] + }, + "wireBytes": { + "median": 0, + "min": 0, + "max": 0, + "values": [ + 0 + ] + }, + "fcp": { + "median": 64, + "min": 64, + "max": 64, + "values": [ + 64 + ] + }, + "lcp": { + "median": 105, + "min": 105, + "max": 105, + "values": [ + 105 + ] + }, + "domContentLoaded": { + "median": 103, + "min": 103, + "max": 103, + "values": [ + 103 + ] + }, + "bootDone": { + "median": 107, + "min": 107, + "max": 107, + "values": [ + 107 + ] + }, + "reloadDuration": { + "median": 124, + "min": 124, + "max": 124, + "values": [ + 124 + ] + } + } + } + } + } +} \ No newline at end of file diff --git a/plans/phase3-staged-apply-decision.md b/plans/phase3-staged-apply-decision.md index bd7bee6..d6935c2 100644 --- a/plans/phase3-staged-apply-decision.md +++ b/plans/phase3-staged-apply-decision.md @@ -1,43 +1,29 @@ -# Phase 3 — decision required before live module replacement +# Phase 3 staged apply — accepted owner decision -COMMON.md says: "If you hit a decision that changes user-visible behaviour or -risks data loss that the documents do not answer, write QUESTION ... and end your -turn instead." This concerns §2c.5's instruction to switch stale modules when -new bytes arrive, after a new build has booted using a same-contract fallback. +The owner accepted this decision on 2026-10-08. It refines master §2c.5: +background downloading never implies that an executing classic script can be +safely replaced. -Concrete finding: direct-media.js creates private rooms, pending, transfers and -waiting maps at module evaluation (lines 4–6). Its public API has no busy, -dispose or state handoff method. Re-evaluation replaces window.DirectMedia, -while WebRTC callbacks/workers still close over the old maps. Later messages -routed by app.js through the new DirectMedia.handle can no longer find those -in-flight transfers. p2p-client.js similarly replaces its public singleton but -retains old sockets, timers and its visibility listener; P2PTransfer exposes -start/download without disposal. Matching contract numbers do not establish -safe runtime state migration. Piano/MIDI/floating-window UI also retains closures. +1. Already executing groups stay pinned until the session ends or the next + user-initiated, playback-guarded reload. P2P/direct and every stateful instance + are never re-evaluated live. Phase 4 must provide disposal and state handoff + before live replacement is allowed. +2. A group that has not executed can immediately use newer verified cached URLs + only when its contract and dependency contracts equal those expected by the + running core's embedded manifest. For a different contract, keep the running + build's N-1 URLs, set `Lazy.reloadRequired`, and request the existing Refresh UI + banner through the unchanged meta-build versus `/api/version` comparison. +3. New core boot may receive a verified N-1 response for an uncached new URL only + when group contracts match. The response retains its actual hash; it is never + stored under the new hash. Contract changes join the blocking download set. -Recommended owner decision: background-download and verify the new URLs -immediately, but pin an already-executing stale module until its feature session -closes and can be safely recreated. Keep P2P/direct instances until the next -explicit user-initiated, playback-guarded page reload. Groups never executed use -the newest cached version immediately. In Phase 4, introduce explicit teardown -and state handoff seams before enabling live replacement of these instances. -This narrows "switch when the new one arrives" for stateful modules; it requires -owner approval rather than silently claiming that caching new bytes replaces -running code. +Reason: direct-media.js owns private room, pending transfer and waiting maps; +WebRTC callbacks retain these closures. Re-evaluating the singleton redirects +messages away from those transfers. P2P sockets/timers and piano/MIDI/floating +windows have similar state. Contract equality alone does not migrate it. -Completed safe prerequisites: plan commit 895f20a; pure contract fallback and -background-group synchronization commit f804a23; ordered build-local loader with -unit tests (not yet wired into index.html). No layout or feature was removed -from the current eager path. Full browser/layout/performance acceptance remains -outstanding. This is a QUESTION checkpoint, not a completed phase report. - -## Accepted owner decision - -The owner accepted pinning on 2026-10-08. Already executing stale groups remain -pinned until their session ends or the next explicit playback-guarded reload. -P2P/direct and other stateful instances are never re-evaluated live; Phase 4 must -add disposal/state handoff before permitting replacement. An unexecuted group -may use newly cached URLs only when its contract equals the running core's -embedded contract. A different contract keeps the running build's N-1 URLs, -marks reload required and prompts the existing build-tag-based Refresh UI banner. -Unit tests cover all three cases. Continue Phase 3 under these rules. +Implemented in 4853c2c and 5d6a154. Node loader tests cover pinned execution, +compatible unexecuted selection, incompatible N-1 plus reload-required, and +incompatible dependencies. Worker tests cover same-contract fallback without +cache poisoning and changed-contract readiness before commit. `perf/lazy.mjs` +checks these decisions with real workers on Chromium and WebKit.