From ee588ba6a1fd043c3aab81b7bcb53993590fa436 Mon Sep 17 00:00:00 2001 From: thePR0M3TH3AN Date: Tue, 20 Oct 2026 11:29:01 -0400 Subject: [PATCH 1/7] docs(playback): playback-qa-2 record incomplete second pass and driver correction --- docs/agents/backlog/playback-qa-2.json | 4 +- docs/testing/playback-qa-2-second-pass.md | 146 ++++++++++++++++++++++ 2 files changed, 148 insertions(+), 2 deletions(-) create mode 100644 docs/testing/playback-qa-2-second-pass.md diff --git a/docs/agents/backlog/playback-qa-2.json b/docs/agents/backlog/playback-qa-2.json index 6ea2d9f0..6005f918 100644 --- a/docs/agents/backlog/playback-qa-2.json +++ b/docs/agents/backlog/playback-qa-2.json @@ -3,8 +3,8 @@ "area": "playback-qa", "status": "blocked", "title": "Capture actual-app local core-flow/mobile baseline before UI changes", - "blockedOn": "Await explicit second browser-only grant after storage release; approved genuine mirror/frozen actual built app ready.", + "blockedOn": "Dispatch resumption direction after driver stdin EOF; fresh integrated snapshot and genuine mirror ready, browser slot released; no demonstrated new app blocker.", "addedOn": "2026-10-20", "filedAt": "1bb3a4fc452969f060c09a286b72b8cd7ac4123e", - "notes": "First actual source-app pass blocked360x800(15s harness timeout,CDNBuffer denied+CSS404); no UI/viewports success claim. Dispatch approved preparation/doc-only normal submission15:14:36. Copied real prepared Buffer6.0.3 mirror SHA256507a593508c51d1397a9a5818ad0b8dbf7e3ad810feaa87cabff87ff56cf3984 plus verified genuine tarballs/provenance into own read-only /tmp/bitvid-playback-qa-2-snapshot; own Buffer APIprobes4/4 exit0. Frozen dispatch actual verifieddist811files/16145338B,manifestSHA2569997b48049fd01d7c7627c009373296c9a4203683522d31bc5ee82ff98e8599b;CSS283d0464…;465runtime/buildinputsidentical. No QA build/browser/install/fetch/productchanges; not byte-identicalCDN or independentlyrebundled/metafileverified. Only exactBufferURL localfulfillment proposed next; allothernonlocalblocked;actualapp remainsBLOCKEDpending2ndgrant." + "notes": "Second actualapp attempt grant15:24:20.735/pickup15:24:27,START15:26:26,run15:26:29.558→15:26:32.207. Freshbuilt1b3ef49c/v1834b6a9 verified index5095c3f1/CSS283d0464/822filemanifest662fa755;realBuffer507a5935 localfulfillment1hit. Actual harness+Application+video-list ready360x800,no local404/pageerrors;10othernonlocalHTTP denied,0nonlocalWS. Interactive nonPTY stdinEOF closedrunner beforeactions/cardsreadiness:baselineINCOMPLETE,notappdefect or hardblocker claim. Closedbrowser/ownservers/released beforefurtherwork;no390/1280/nav/modal/focus/cardvalidation. Correctedtransport browser-freePTY handshake exit0;await boundedresumptiongrant/no unauthorizedrerun. Exactreport/controller/intervention in docs/testing/playback-qa-2-second-pass.md. No newruntime/toolkit/productchanges." } diff --git a/docs/testing/playback-qa-2-second-pass.md b/docs/testing/playback-qa-2-second-pass.md new file mode 100644 index 00000000..b87e2fb1 --- /dev/null +++ b/docs/testing/playback-qa-2-second-pass.md @@ -0,0 +1,146 @@ +# QA2 second browser attempt: shell ready, baseline incomplete + +Actual dispatch-built app:1b3ef49c,version1834b6a9. QA source HEAD at execution:c5818cfe67c2f986138e8322951d99bcb94a5c47. +Authoritative browser grant15:24:20.735Z,consumed15:24:27Z; START15:26:26Z before browser/server launch. +Prior blocker/asset docs submission25942a15 landed1b3ef49c at15:22:48.832Z; durable status verified. + +Fresh own frozen snapshot822 files,manifest SHA256662fa755e3cde021058f5bf9a5bd2825698bad064ab80472a5ba70e651d764b1; +index5095c3f1326b035ef93267ad77663ea641edb1acaae6d18e88085eff08c5d6d3, +CSS283d04642d201edba1e9bd5cbc3ede8d74fbd11b50ff0cd2732d463847d2adf3. +Copied integrated r2Service bytes matched merged current source, SHA2564719aecfeae3355a7dc933eec0d55d2e664e427bf425dedf7d3bd324dd682658. +Real pinned Buffer ESM65405 bytes,SHA256507a593508c51d1397a9a5818ad0b8dbf7e3ad810feaa87cabff87ff56cf3984; +local fulfillment occurred exactly once at its original CDN import URL. No other non-local request was permitted. +This remains a genuine npm-source repackaging,not byte-identical CDN/transitive resolution or production-offline proof. + +## Measured result and driver intervention + +`node /tmp/bitvid-playback-qa-2-integrated/controller.mjs` in a non-PTY exec session: exit0, +15:26:29.558→15:26:32.207Z (2.649s),Chromium154.0.8037.97,360×800. +App harness object,actual getApplication() object and visible video-list became ready. Initial emitted BOOTED/boot=passed +meant these three readiness checks only; it **does not mean baseline passed**. The retained report corrects that label to +shell-and-harness-ready-only/INCOMPLETE. Actual page body:Trending/No public videos available yet/footer version1834b6a9. +No pageerror or local404. Guard blocked10 non-local HTTP attempts(AWS SDK and parallel Nostr fallback imports),0 non-localWS. +These attempts alone do not establish a hard boot blocker:the bootstrap also tries the existing real local Nostr bundle. +No later toolkit readiness or seeded-card hydration was measured before closure. + +The runner's interactive stdin was immediately EOF in the non-PTY tool session. Its for-await command loop ended, +then finally closed all resources before any planned UI actions ran. `actions=[]`. This is an avoidable runner mistake, +not a demonstrated app defect. No second-attempt screenshot was captured; the first-attempt screenshot documents only +its unstyled source-checkout blocker and must not stand in for this integrated snapshot. + +Browser/context/app31847+existing mockrelay31848/31849 closed15:26:32.207Z;explicit RELEASE/intervention reported +15:27:26Z. Own temporary dependency symlink removed;preview3000 and other processes untouched. This pass seeded only3 +synthetic local video events with real test-key signing through the existing mockrelay API;no production identity/signing, +real media,peers,buckets or outgoing external publishing. Their appearance in the feed was not verified. + +## Unverified work and concrete correction + +390×844/1280×720,3-card hydration,navigation,Profile/Upload interactions,required-field validation,touch controls, +focus and overflow remain unverified. Do not classify parallel blocked imports as a product regression without observation. +Concrete runner correction: use the same isolated controller in a PTY(`tty:true`) so stdin remains available; +wait for actual seeded-card/toolkit readiness,then execute bounded UI actions. Requires dispatch resumption/browser grant. +No further browser/build/asset mirroring/product changes have been performed under this note. + +## Saved report + +```json +{ + "started": "2026-10-20T15:26:29.558Z", + "mirrorHits": [ + "https://cdn.jsdelivr.net/npm/buffer@6.0.3/+esm" + ], + "blockedHttp": [ + "https://esm.sh/@aws-sdk/client-s3@3.637.0?bundle", + "https://cdn.jsdelivr.net/npm/nostr-tools@2.17.0/+esm", + "https://esm.sh/nostr-tools@2.17.0", + "https://esm.sh/nostr-tools@2.17.0?target=es2022&exports=nip04", + "https://esm.sh/nostr-tools@2.17.0/nip44?target=es2022", + "https://cdn.jsdelivr.net/npm/nostr-tools@2.17.0/lib/nostr.bundle.min.js", + "https://cdn.jsdelivr.net/npm/nostr-tools@2.17.0/lib/nostr.bundle.min.js", + "https://cdn.jsdelivr.net/npm/nostr-tools@2.17.0/lib/nostr.bundle.min.js", + "https://cdn.jsdelivr.net/npm/nostr-tools@2.17.0/lib/nostr.bundle.min.js", + "https://cdn.jsdelivr.net/npm/nostr-tools@2.17.0/lib/nostr.bundle.min.js" + ], + "blockedWs": [], + "failedLocal": [], + "pageErrors": [], + "consoleErrors": [ + "Failed to load resource: net::ERR_BLOCKED_BY_CLIENT.Inspector", + "Failed to load resource: net::ERR_BLOCKED_BY_CLIENT.Inspector", + "Failed to load resource: net::ERR_BLOCKED_BY_CLIENT.Inspector", + "Failed to load resource: net::ERR_BLOCKED_BY_CLIENT.Inspector", + "Failed to load resource: net::ERR_BLOCKED_BY_CLIENT.Inspector", + "Failed to load resource: net::ERR_BLOCKED_BY_CLIENT.Inspector", + "Failed to load resource: net::ERR_BLOCKED_BY_CLIENT.Inspector", + "Failed to load resource: net::ERR_BLOCKED_BY_CLIENT.Inspector", + "Failed to load resource: net::ERR_BLOCKED_BY_CLIENT.Inspector", + "Failed to load resource: net::ERR_BLOCKED_BY_CLIENT.Inspector" + ], + "actions": [], + "browserVersion": "154.0.8037.97", + "boot": "shell-and-harness-ready-only", + "ended": "2026-10-20T15:26:32.207Z", + "resourcesClosed": true, + "baseline": "INCOMPLETE", + "driverIssue": "stdin EOF closed interactive controller before any actions; not a demonstrated app blocker" +} +``` + +## Exact controller used (non-PTY invocation caused early EOF) + +```js +import {createServer} from 'node:http'; +import {readFile,writeFile} from 'node:fs/promises'; +import {resolve,extname} from 'node:path'; +import {createInterface} from 'node:readline'; +import {createRequire} from 'node:module'; +import {chromium} from '/home/user/Documents/GitHub/bitvid/node_modules/playwright/index.mjs'; +import {startRelay} from '/home/user/Documents/GitHub/bitvid-playback-qa/scripts/agent/simple-relay.mjs'; +const require=createRequire('/home/user/Documents/GitHub/bitvid/package.json'); +const {finalizeEvent}=require('nostr-tools'); +const base='/tmp/bitvid-playback-qa-2-integrated',root=base+'/dist'; +const evidence='/home/user/Documents/GitHub/bitvid-playback-qa/docs/testing'; +const report={started:new Date().toISOString(),mirrorHits:[],blockedHttp:[],blockedWs:[],failedLocal:[],pageErrors:[],consoleErrors:[],actions:[]}; +const sk=new Uint8Array(32).fill(0x7b); +const server=createServer(async(req,res)=>{ + let path=decodeURIComponent(new URL(req.url,'http://127.0.0.1:31847').pathname);if(path==='/')path='/index.html';const f=resolve(root,'.'+path); + if(!f.startsWith(root+'/')||path.includes('/.')){res.writeHead(404);res.end();return;} + try{const b=await readFile(f);res.setHeader('Content-Type',({'.html':'text/html','.js':'text/javascript','.mjs':'text/javascript','.css':'text/css','.json':'application/json','.svg':'image/svg+xml','.wasm':'application/wasm','.png':'image/png','.webmanifest':'application/manifest+json'})[extname(f)]||'application/octet-stream');res.end(b);}catch{res.writeHead(404);res.end();} +}); +let browser,relay,context,page,closed=false; +async function finish(){if(closed)return;closed=true;if(context)await context.close();if(browser)await browser.close();if(relay)await relay.close();await new Promise(ok=>server.close(ok));report.ended=new Date().toISOString();report.resourcesClosed=true;await writeFile(base+'/result.json',JSON.stringify(report,null,2));console.log(JSON.stringify({type:'CLOSED',ended:report.ended,mirrorHits:report.mirrorHits.length,blockedHttp:report.blockedHttp,blockedWs:report.blockedWs,failedLocal:report.failedLocal,pageErrors:report.pageErrors}));} +try{ + await new Promise((ok,no)=>{server.once('error',no);server.listen(31847,'127.0.0.1',ok);}); + relay=startRelay(31848,{httpPort:31849}); + for(let i=0;i<3;i++){const title=i===0?'QA local synthetic video with a deliberately long title to inspect narrow-card wrapping and controls':'QA local synthetic video '+i;relay.seedEvent(finalizeEvent({kind:30078,created_at:Math.floor(Date.now()/1000)-i,tags:[['d','qa2-'+i],['t','video'],['title',title],['url','http://127.0.0.1:31847/qa2-unplayed.webm']],content:JSON.stringify({version:3,title,url:'http://127.0.0.1:31847/qa2-unplayed.webm',videoRootId:'qa2-'+i,mode:'dev',isPrivate:false,deleted:false})},sk));} + browser=await chromium.launch({headless:true,executablePath:'/usr/bin/google-chrome',args:['--no-sandbox']});report.browserVersion=browser.version(); + context=await browser.newContext({viewport:{width:360,height:800},serviceWorkers:'block'}); + const mirror=await readFile(base+'/buffer-6.0.3-local.mjs'); + await context.route('**/*',r=>{const url=r.request().url();if(url==='https://cdn.jsdelivr.net/npm/buffer@6.0.3/+esm'){report.mirrorHits.push(url);return r.fulfill({body:mirror,contentType:'text/javascript',headers:{'Access-Control-Allow-Origin':'*'}});}const u=new URL(url);if(['127.0.0.1','localhost','[::1]'].includes(u.hostname))return r.continue();report.blockedHttp.push(url);return r.abort('blockedbyclient');}); + await context.routeWebSocket('**/*',ws=>{const u=new URL(ws.url());if(['127.0.0.1','localhost','[::1]'].includes(u.hostname))ws.connectToServer();else{report.blockedWs.push(ws.url());ws.close();}}); + await context.addInitScript(()=>{localStorage.setItem('hasSeenDisclaimer','true');localStorage.setItem('__bitvidTestMode__','1');localStorage.setItem('__bitvidTestRelays__',JSON.stringify(['ws://127.0.0.1:31848']));window.__bitvidTestRelays__=['ws://127.0.0.1:31848'];localStorage.setItem('bitvid_admin_whitelist_mode','false');}); + page=await context.newPage();page.setDefaultTimeout(10000); + page.on('pageerror',e=>report.pageErrors.push(e.message));page.on('console',m=>{if(m.type()==='error')report.consoleErrors.push(m.text().slice(0,700));});page.on('response',r=>{if(r.status()>=400&&new URL(r.url()).hostname==='127.0.0.1')report.failedLocal.push({url:r.url(),status:r.status()});}); + await page.goto('http://127.0.0.1:31847/?__test__=1&__testRelays__=ws%3A%2F%2F127.0.0.1%3A31848',{waitUntil:'domcontentloaded'}); + try{await page.waitForFunction(()=>typeof window.__bitvidTest__==='object',null,{timeout:15000});await page.waitForFunction(async()=>{const m=await import('/js/applicationContext.js');return !!m.getApplication();},null,{timeout:15000});await page.locator('[data-testid="video-list"]').waitFor({state:'visible',timeout:15000});report.boot='passed';console.log(JSON.stringify({type:'BOOTED',viewport:{width:360,height:800},body:(await page.locator('body').innerText()).slice(0,3000)}));} + catch(e){report.boot='blocked';report.bootError=e.message;await page.screenshot({path:evidence+'/playback-qa-2-second-boot-blocker.png',fullPage:true});console.log(JSON.stringify({type:'BLOCKED',error:e.message,body:(await page.locator('body').innerText()).slice(0,1500)}));await finish();process.exit(0);} + const lines=createInterface({input:process.stdin}); + for await(const line of lines){if(!line.trim())continue;try{const c=JSON.parse(line);let result; + if(c.type==='done'){report.actions.push(c);await finish();break;} + if(c.type==='eval'){const fn=Function('return ('+c.script+')')();result=await page.evaluate(fn,c.arg);} + if(c.type==='click'){await page.locator(c.selector).click();result='clicked';} + if(c.type==='fill'){await page.locator(c.selector).fill(c.value);result='filled';} + if(c.type==='press'){await page.keyboard.press(c.key);result='pressed';} + if(c.type==='viewport'){await page.setViewportSize(c.viewport);result=c.viewport;} + if(c.type==='screenshot'){await page.screenshot({path:evidence+'/'+c.name,fullPage:true});result=c.name;} + if(c.type==='wait'){await page.locator(c.selector).waitFor({state:c.state||'visible',timeout:c.timeout||10000});result='ready';} + report.actions.push({at:new Date().toISOString(),command:c,result});console.log(JSON.stringify({type:'RESULT',id:c.id,result})); + }catch(e){report.actions.push({error:e.message});console.log(JSON.stringify({type:'ACTION_ERROR',error:e.message}));}} + await finish(); +}catch(e){report.runError=e.stack;console.log(JSON.stringify({type:'ERROR',error:e.stack}));await finish();process.exitCode=1;} +``` + +A browser-free PTY stdin handshake was independently checked after the driver failure: +Node printed PTY_READY and stayed running; a later write_stdin sent qa2-driver-ack; +process printed PTY_HANDSHAKE_PASS and exited0. This verifies the proposed terminal transport correction +without opening another browser/server or changing app behavior. It is not a resumed UI baseline. From 4b74da7372f668fd56d8abed1f882c1443e302b7 Mon Sep 17 00:00:00 2001 From: thePR0M3TH3AN Date: Tue, 20 Oct 2026 11:33:46 -0400 Subject: [PATCH 2/7] docs(playback): playback-qa-2 preserve noninteractive baseline action plan --- docs/agents/backlog/playback-qa-2.json | 4 +- docs/testing/playback-qa-2-second-pass.md | 83 +++++++++++++++++++++++ 2 files changed, 85 insertions(+), 2 deletions(-) diff --git a/docs/agents/backlog/playback-qa-2.json b/docs/agents/backlog/playback-qa-2.json index 6005f918..ea94dfbd 100644 --- a/docs/agents/backlog/playback-qa-2.json +++ b/docs/agents/backlog/playback-qa-2.json @@ -3,8 +3,8 @@ "area": "playback-qa", "status": "blocked", "title": "Capture actual-app local core-flow/mobile baseline before UI changes", - "blockedOn": "Dispatch resumption direction after driver stdin EOF; fresh integrated snapshot and genuine mirror ready, browser slot released; no demonstrated new app blocker.", + "blockedOn": "Client6 exclusive full/browser gate; await dispatch explicit final browser grant after durable history release. Noninteractive runner prepared, syntax-check only.", "addedOn": "2026-10-20", "filedAt": "1bb3a4fc452969f060c09a286b72b8cd7ac4123e", - "notes": "Second actualapp attempt grant15:24:20.735/pickup15:24:27,START15:26:26,run15:26:29.558→15:26:32.207. Freshbuilt1b3ef49c/v1834b6a9 verified index5095c3f1/CSS283d0464/822filemanifest662fa755;realBuffer507a5935 localfulfillment1hit. Actual harness+Application+video-list ready360x800,no local404/pageerrors;10othernonlocalHTTP denied,0nonlocalWS. Interactive nonPTY stdinEOF closedrunner beforeactions/cardsreadiness:baselineINCOMPLETE,notappdefect or hardblocker claim. Closedbrowser/ownservers/released beforefurtherwork;no390/1280/nav/modal/focus/cardvalidation. Correctedtransport browser-freePTY handshake exit0;await boundedresumptiongrant/no unauthorizedrerun. Exactreport/controller/intervention in docs/testing/playback-qa-2-second-pass.md. No newruntime/toolkit/productchanges." + "notes": "BaselineINCOMPLETE: second actual1b3/v1834b6a9 shell/harness/listready360x800 but priorstdinEOF closed beforeanyUI; resourcesreleased15:26:32.207,interventionrecorded. Latestdispatch15:30:36+interpreter15:30:06 hold:client6ownsfull/browser,onlyownscratchnoninteractivecorrection. Driverf60065c2 prepared,no stdin/PTY dependency,120s cleanupdeadline,realtoolkit+3cards prerequisites,threeviewportnav/Profile/Uploadrequiredvalidation/focus/overflow/screenshots,unchangedexternalguard/realBuffer/artifactpins. node --check exit0 ONLY; UIactionsunexecuted,nobrowser/server/build/full/productchanges. Exactsource/evidence docs/testing/playback-qa-2-second-pass.md; await explicit grant/finalruntimediff,no newmirroring/expectationweakening." } diff --git a/docs/testing/playback-qa-2-second-pass.md b/docs/testing/playback-qa-2-second-pass.md index b87e2fb1..bef046b7 100644 --- a/docs/testing/playback-qa-2-second-pass.md +++ b/docs/testing/playback-qa-2-second-pass.md @@ -144,3 +144,86 @@ A browser-free PTY stdin handshake was independently checked after the driver fa Node printed PTY_READY and stayed running; a later write_stdin sent qa2-driver-ack; process printed PTY_HANDSHAKE_PASS and exited0. This verifies the proposed terminal transport correction without opening another browser/server or changing app behavior. It is not a resumed UI baseline. + +## Noninteractive correction prepared under interpreter hold + +Interpreter15:30:06 confirms history/client6 owns full/browser resource; no browser/server/build may launch +until dispatch explicitly grants the next attempt after release. Only read-only scratch preparation performed. +The corrected runner removes stdin entirely, has a120s resource-cleaning hard deadline and existing bounded +locator/card-readiness waits. It requires real toolkit readiness(no __TEST_MODE__ mock flag),exactly3 synthetic +relay video cards,then test-only login through the unchanged harness. For each360×800/390×844/1280×720 viewport: +actual Trending/Explore/ForYou link routing; feed/card/document width observations; Profile open→6Tab focus containment +→close→trigger focus restoration; Upload external-link mode open→native missing-title validity→title-only missing +source error→no additional kind30078 video published→close/focus restoration. It captures feed/profile/validation +screenshots,small-control dimensions against44px as observations only,and all network guard outcomes. +No source/toolkit/crypto override,new public resource mirror,or expectation change. Syntax-check exit0 only; +**none of these prepared UI actions has yet been executed**. First unavailable prerequisite or failed assertion +stops this pass and captures evidence; no retry/sleep masking. Guard and genuine Buffer/artifact pins unchanged. +The per-validation publication check counts video events specifically,excluding unrelated asynchronous list events. + +Dispatch15:30:36 explicitly approved the same own-scratch noninteractive correction only,while client6 holds +full/browser. Final browser requires a later explicit grant and runtime diff check after test-only history landing. +Prepared runner SHA256:`f60065c2a45b4b20485acaecd91bc5c5c937069cea4db095727c2838895588e0`. +Exact prepared source below is evidence,not a registered/retained test or a claim of successful UI execution. + +```js +import {createServer} from 'node:http'; +import {readFile,writeFile} from 'node:fs/promises'; +import {resolve,extname} from 'node:path'; +import {createInterface} from 'node:readline'; +import {createRequire} from 'node:module'; +import {chromium} from '/home/user/Documents/GitHub/bitvid/node_modules/playwright/index.mjs'; +import {startRelay} from '/home/user/Documents/GitHub/bitvid-playback-qa/scripts/agent/simple-relay.mjs'; +const require=createRequire('/home/user/Documents/GitHub/bitvid/package.json'); +const {finalizeEvent}=require('nostr-tools'); +const base='/tmp/bitvid-playback-qa-2-integrated',root=base+'/dist'; +const evidence='/home/user/Documents/GitHub/bitvid-playback-qa/docs/testing'; +const report={driver:'noninteractive bounded actions',started:new Date().toISOString(),mirrorHits:[],blockedHttp:[],blockedWs:[],failedLocal:[],pageErrors:[],consoleErrors:[],actions:[]}; +const sk=new Uint8Array(32).fill(0x7b); +const server=createServer(async(req,res)=>{ + let path=decodeURIComponent(new URL(req.url,'http://127.0.0.1:31847').pathname);if(path==='/')path='/index.html';const f=resolve(root,'.'+path); + if(!f.startsWith(root+'/')||path.includes('/.')){res.writeHead(404);res.end();return;} + try{const b=await readFile(f);res.setHeader('Content-Type',({'.html':'text/html','.js':'text/javascript','.mjs':'text/javascript','.css':'text/css','.json':'application/json','.svg':'image/svg+xml','.wasm':'application/wasm','.png':'image/png','.webmanifest':'application/manifest+json'})[extname(f)]||'application/octet-stream');res.end(b);}catch{res.writeHead(404);res.end();} +}); +let browser,relay,context,page,closed=false,hardDeadline; +async function finish(){if(closed)return;closed=true;clearTimeout(hardDeadline);if(context)await context.close();if(browser)await browser.close();if(relay)await relay.close();await new Promise(ok=>server.close(ok));report.ended=new Date().toISOString();report.resourcesClosed=true;await writeFile(base+'/result.json',JSON.stringify(report,null,2));console.log(JSON.stringify({type:'CLOSED',ended:report.ended,mirrorHits:report.mirrorHits.length,blockedHttp:report.blockedHttp,blockedWs:report.blockedWs,failedLocal:report.failedLocal,pageErrors:report.pageErrors}));} +hardDeadline=setTimeout(()=>{report.deadlineFailure='120s bounded runner deadline';void finish().finally(()=>process.exit(1));},120000); +try{ + await new Promise((ok,no)=>{server.once('error',no);server.listen(31847,'127.0.0.1',ok);}); + relay=startRelay(31848,{httpPort:31849}); + for(let i=0;i<3;i++){const title=i===0?'QA local synthetic video with a deliberately long title to inspect narrow-card wrapping and controls':'QA local synthetic video '+i;relay.seedEvent(finalizeEvent({kind:30078,created_at:Math.floor(Date.now()/1000)-i,tags:[['d','qa2-'+i],['t','video'],['title',title],['url','http://127.0.0.1:31847/qa2-unplayed.webm']],content:JSON.stringify({version:3,title,url:'http://127.0.0.1:31847/qa2-unplayed.webm',videoRootId:'qa2-'+i,mode:'dev',isPrivate:false,deleted:false})},sk));} + browser=await chromium.launch({headless:true,executablePath:'/usr/bin/google-chrome',args:['--no-sandbox']});report.browserVersion=browser.version(); + context=await browser.newContext({viewport:{width:360,height:800},serviceWorkers:'block'}); + const mirror=await readFile(base+'/buffer-6.0.3-local.mjs'); + await context.route('**/*',r=>{const url=r.request().url();if(url==='https://cdn.jsdelivr.net/npm/buffer@6.0.3/+esm'){report.mirrorHits.push(url);return r.fulfill({body:mirror,contentType:'text/javascript',headers:{'Access-Control-Allow-Origin':'*'}});}const u=new URL(url);if(['127.0.0.1','localhost','[::1]'].includes(u.hostname))return r.continue();report.blockedHttp.push(url);return r.abort('blockedbyclient');}); + await context.routeWebSocket('**/*',ws=>{const u=new URL(ws.url());if(['127.0.0.1','localhost','[::1]'].includes(u.hostname))ws.connectToServer();else{report.blockedWs.push(ws.url());ws.close();}}); + await context.addInitScript(()=>{localStorage.setItem('hasSeenDisclaimer','true');localStorage.setItem('__bitvidTestMode__','1');localStorage.setItem('__bitvidTestRelays__',JSON.stringify(['ws://127.0.0.1:31848']));window.__bitvidTestRelays__=['ws://127.0.0.1:31848'];localStorage.setItem('bitvid_admin_whitelist_mode','false');}); + page=await context.newPage();page.setDefaultTimeout(10000); + page.on('pageerror',e=>report.pageErrors.push(e.message));page.on('console',m=>{if(m.type()==='error')report.consoleErrors.push(m.text().slice(0,700));});page.on('response',r=>{if(r.status()>=400&&new URL(r.url()).hostname==='127.0.0.1')report.failedLocal.push({url:r.url(),status:r.status()});}); + await page.goto('http://127.0.0.1:31847/?__test__=1&__testRelays__=ws%3A%2F%2F127.0.0.1%3A31848',{waitUntil:'domcontentloaded'}); + try{await page.waitForFunction(()=>typeof window.__bitvidTest__==='object',null,{timeout:15000});await page.waitForFunction(async()=>{const m=await import('/js/applicationContext.js');return !!m.getApplication();},null,{timeout:15000});await page.locator('[data-testid="video-list"]').waitFor({state:'visible',timeout:15000});report.boot='passed';console.log(JSON.stringify({type:'BOOTED',viewport:{width:360,height:800},body:(await page.locator('body').innerText()).slice(0,3000)}));} + catch(e){report.boot='blocked';report.bootError=e.message;await page.screenshot({path:evidence+'/playback-qa-2-second-boot-blocker.png',fullPage:true});console.log(JSON.stringify({type:'BLOCKED',error:e.message,body:(await page.locator('body').innerText()).slice(0,1500)}));await finish();process.exit(0);} + + // Noninteractive: no stdin/readline loop; each action is awaited exactly once. + const check=(condition,message)=>{if(!condition)throw new Error(message);}; + const step=async(name,action)=>{const item={name,at:new Date().toISOString()};report.actions.push(item);try{item.result=await action();item.ok=true;console.log(JSON.stringify({type:'STEP',name,ok:true,result:item.result}));return item.result;}catch(e){item.ok=false;item.error=e.message;console.log(JSON.stringify({type:'STEP',name,ok:false,error:e.message}));throw e;}}; + const capture=async(name)=>{await page.screenshot({path:evidence+'/'+name,fullPage:true});report.actions.push({screenshot:name});}; + const layout=async()=>page.evaluate(()=>({width:innerWidth,documentWidth:document.documentElement.scrollWidth,cardBounds:[...document.querySelectorAll('[data-testid="video-card"]')].map(e=>{const r=e.getBoundingClientRect();return {x:r.x,right:r.right,width:r.width};}),smallControls:[...document.querySelectorAll('button,a,input')].filter(e=>e.getClientRects().length&&getComputedStyle(e).visibility!=='hidden').map(e=>{const r=e.getBoundingClientRect();return {id:e.id,label:(e.getAttribute('aria-label')||e.textContent||'').trim().slice(0,80),width:r.width,height:r.height};}).filter(x=>x.width>0&&x.height>0&&(x.width<44||x.height<44))})); + const modalFocus=async(root)=>{const samples=[];for(let i=0;i<6;i++){await page.keyboard.press('Tab');samples.push(await page.evaluate(selector=>{const el=document.activeElement;return {inside:!!document.querySelector(selector)?.contains(el),id:el?.id,tag:el?.tagName,outline:getComputedStyle(el).outlineStyle,shadow:getComputedStyle(el).boxShadow};},root));}check(samples.every(x=>x.inside),'keyboard focus escaped '+root);return samples;}; + try{ + await step('actual toolkit ready',async()=>{const ready=await page.evaluate(async()=>{const m=await import('/js/nostrToolsBootstrap.js');const r=await m.nostrToolsReady;return {ok:r?.ok,reason:r?.reason,mockFlag:!!window.__TEST_MODE__};});check(ready.ok===true&&!ready.mockFlag,'real toolkit unavailable: '+JSON.stringify(ready));return ready;}); + await step('three synthetic relay cards hydrate',async()=>{await page.evaluate(()=>window.__bitvidTest__.waitForFeedItems(3,15000));const items=await page.evaluate(()=>window.__bitvidTest__.getFeedItems());check(items.length===3,'expected exactly3 local cards,got'+items.length);return items.map(x=>({title:x.title,dTag:x.dTag}));}); + await step('local test identity login',async()=>{await page.evaluate(()=>window.__bitvidTest__.loginWithNsec('7b'.repeat(32)));await page.locator('[data-testid="profile-button"]').waitFor({state:'visible'});await page.locator('[data-testid="upload-button"]').waitFor({state:'visible'});return {profileVisible:true,uploadVisible:true};}); + for(const viewport of [{width:360,height:800},{width:390,height:844},{width:1280,height:720}]){ + await page.setViewportSize(viewport);const prefix=String(viewport.width); + await step(prefix+' trending navigation/feed',async()=>{await page.locator('#trendingLink').click();await page.waitForFunction(()=>location.hash.includes('view=trending'));await page.evaluate(()=>window.__bitvidTest__.waitForFeedItems(3,15000));const r=await layout();check(r.documentWidth<=r.width,'horizontal document overflow');check(r.cardBounds.every(x=>x.x>=0&&x.right<=r.width),'card extends beyond viewport');return r;}); + await capture('playback-qa-2-'+prefix+'-feed.png'); + for(const [id,view] of [['#exploreLink','explore'],['#forYouLink','for-you'],['#trendingLink','trending']])await step(prefix+' navigation '+view,async()=>{await page.locator(id).click();await page.waitForFunction(v=>location.hash.includes('view='+v),view);return {hash:await page.evaluate(()=>location.hash),headings:await page.locator('h1,h2').allTextContents()};}); + await step(prefix+' Profile open/focus/close',async()=>{await page.locator('[data-testid="profile-button"]').click();await page.locator('#profileModal').waitFor({state:'visible'});const focus=await modalFocus('#profileModal');await capture('playback-qa-2-'+prefix+'-profile.png');await page.locator('#closeProfileModal').click();await page.locator('#profileModal').waitFor({state:'hidden'});const restored=await page.evaluate(()=>document.activeElement?.id);check(restored==='profileButton','Profile close did not restore trigger focus');return {focus,restored};}); + await step(prefix+' Upload required fields/focus/close',async()=>{const videoCount=()=>[...relay.getEvents().values()].filter(e=>e.kind===30078).length;const before=videoCount();await page.locator('[data-testid="upload-button"]').click();await page.locator('#uploadModal').waitFor({state:'visible'});await page.locator('#btn-mode-external').click();const focus=await modalFocus('#uploadModal');await page.locator('#input-title').fill('');await page.locator('#input-url').fill('');await page.locator('#input-magnet').fill('');await page.locator('#btn-submit').click();const missingTitle=await page.locator('#input-title').evaluate(e=>e.validity.valueMissing);check(missingTitle,'empty title not rejected by native validation');await page.locator('#input-title').fill('QA invalid local form');await page.locator('#btn-submit').click();await page.waitForFunction(()=>document.querySelector('#errorContainer')?.textContent.includes('Please provide at least a Video URL or Magnet Link.'));check(videoCount()===before,'invalid form published video event');await capture('playback-qa-2-'+prefix+'-upload-validation.png');const l=await layout();check(l.documentWidth<=l.width,'Upload horizontal document overflow');await page.locator('#closeUploadModal').click();await page.locator('#uploadModal').waitFor({state:'hidden'});const restored=await page.evaluate(()=>document.activeElement?.id);check(restored==='uploadButton','Upload close did not restore trigger focus');return {focus,missingTitle,noSourceRejected:true,noRelayPublish:true,restored,layout:l};}); + } + report.baseline='completed'; + }catch(e){report.baseline='blocked-or-failed';report.failedStep=report.actions.findLast(x=>x.ok===false)?.name;report.failure=e.message;await capture('playback-qa-2-resumed-stop.png');} + await finish(); +}catch(e){report.runError=e.stack;console.log(JSON.stringify({type:'ERROR',error:e.stack}));await finish();process.exitCode=1;} +``` From fa358eb4c16bd08a6d0d97b6cf8edc5d84040870 Mon Sep 17 00:00:00 2001 From: thePR0M3TH3AN Date: Tue, 20 Oct 2026 11:40:16 -0400 Subject: [PATCH 3/7] docs(playback): playback-qa-2 verify genuine local media fixture --- docs/agents/backlog/playback-qa-2.json | 2 +- docs/testing/playback-qa-2-second-pass.md | 70 +++++++++++++++++++++++ 2 files changed, 71 insertions(+), 1 deletion(-) diff --git a/docs/agents/backlog/playback-qa-2.json b/docs/agents/backlog/playback-qa-2.json index ea94dfbd..0980df09 100644 --- a/docs/agents/backlog/playback-qa-2.json +++ b/docs/agents/backlog/playback-qa-2.json @@ -6,5 +6,5 @@ "blockedOn": "Client6 exclusive full/browser gate; await dispatch explicit final browser grant after durable history release. Noninteractive runner prepared, syntax-check only.", "addedOn": "2026-10-20", "filedAt": "1bb3a4fc452969f060c09a286b72b8cd7ac4123e", - "notes": "BaselineINCOMPLETE: second actual1b3/v1834b6a9 shell/harness/listready360x800 but priorstdinEOF closed beforeanyUI; resourcesreleased15:26:32.207,interventionrecorded. Latestdispatch15:30:36+interpreter15:30:06 hold:client6ownsfull/browser,onlyownscratchnoninteractivecorrection. Driverf60065c2 prepared,no stdin/PTY dependency,120s cleanupdeadline,realtoolkit+3cards prerequisites,threeviewportnav/Profile/Uploadrequiredvalidation/focus/overflow/screenshots,unchangedexternalguard/realBuffer/artifactpins. node --check exit0 ONLY; UIactionsunexecuted,nobrowser/server/build/full/productchanges. Exactsource/evidence docs/testing/playback-qa-2-second-pass.md; await explicit grant/finalruntimediff,no newmirroring/expectationweakening." + "notes": "BaselineINCOMPLETE and client6exclusivehold respected. Noninteractive ownrunner prepared,syntax-only;no browser/server/build/full since15:26:32 release. Interpreter15:36:55 identified missinglocalmediaendpoint;generated genuine VP8 64x64/2s1019B,ffprobe20frames,SHA256d911005a5bca7fb1f3e5aa2fbee701b6476c9baf93460264c2aa5105dd0b3c69 outsidefrozenapp. Own HEAD/GET/Range handler contract7/7inmemory,3 brokenvariants fail/restored7/7;no sockets. Futuregrantedrun realHTTPpreflight beforebrowser,all822apphashes+mediahash checked,unchangedrealBuffer/externaldeny/3card+UIassertions/loginfirstactualnav. Exactfixture/handler/preflight+updatedrunnerhash docs/testing/playback-qa-2-second-pass.md. Await explicitdispatchfinalbrowsergrant afterhistoryrelease;no product/vendor/config/test changes,no appdefectclaim." } diff --git a/docs/testing/playback-qa-2-second-pass.md b/docs/testing/playback-qa-2-second-pass.md index bef046b7..76d5295b 100644 --- a/docs/testing/playback-qa-2-second-pass.md +++ b/docs/testing/playback-qa-2-second-pass.md @@ -227,3 +227,73 @@ try{ await finish(); }catch(e){report.runError=e.stack;console.log(JSON.stringify({type:'ERROR',error:e.stack}));await finish();process.exitCode=1;} ``` + +## Genuine media fixture preflight (no browser/server launch) + +Interpreter15:36:55 correctly identified that all3 synthetic notes referenced absent `/qa2-unplayed.webm`. +This was fixture incompleteness,not a reproduced app defect. Provisioned only own scratch,not frozen dist/product: + +```sh +ffmpeg -hide_banner -loglevel error -f lavfi -i color=c=blue:s=64x64:r=10 -t 2 -an -c:v libvpx -y /tmp/bitvid-playback-qa-2-integrated/fixtures/qa2-unplayed.webm +ffprobe -v error -count_frames -select_streams v:0 -show_entries stream=codec_name,width,height,nb_read_frames -of json /tmp/bitvid-playback-qa-2-integrated/fixtures/qa2-unplayed.webm +``` + +ffmpeg6.1.1-3ubuntu5; genuine generated VP8,64×64,2.000s,1019 bytes; ffprobe read20 frames,exit0. +Actual fixture SHA256:`d911005a5bca7fb1f3e5aa2fbee701b6476c9baf93460264c2aa5105dd0b3c69`. +No source media downloaded/copied from another user. The generation recipe fixes content,not necessarily container +random identifiers across regenerated files;this exact frozen input is pinned by its measured hash. No product build ran. + +Standalone own media handler serves exact path before static-file lookup,with video/webm/Content-Length/Accept-Ranges: +HEAD200,no body;GET200,full genuine bytes;single prefix/open/suffix Range206 with exact bytes/Content-Range; +unsatisfiable416;unsupported method405. In-memory contract preflight7/7,exit0. Three own-scratch broken variants +(wrong Content-Length,truncated GET,ignored Range) each exited1; originals restored and7/7 passed again. +No socket/browser/server was started. These checks validate fixture IO,not app/controller behavior or native-browser playback. + +The next explicitly granted run includes real local HTTP HEAD/GET/Range checks **before** opening Chromium. +No response/app/controller state is faked. All822 frozen app file hashes rechecked unchanged;future runner also +verifies the manifest and every file plus exact media hash before opening a server. Existing real Buffer/external-deny +guard and3-card/UI assertions retained. ForYou/Explore remain observed through real post-login visibility;no forced clicks. + +Input data:3 actual signed synthetic kind30078 notes from existing fixture test identity,local URL only,one deliberately +long title for narrow-card wrapping. No valid publication is attempted;invalid Upload submissions must not add a video +event. Local media does not qualify HTTPS/CORS,live peers or production content playback. + +Updated prepared runner SHA256:`dc10bf51310ea0c2138367219f28212471c994efab2886ed35eb6fd10e874ad7`. +Prior f60065c2 source above is historical;current difference is standalone genuine fixture transport+wire preflight+ +stronger snapshot/input pins only. `node --check` exit0;UI sequence still unexecuted pending dispatch grant. + +Exact standalone handler: + +```js +import {createHash} from 'node:crypto'; +export function mediaResponse(method, range, bytes) { + const length=bytes.length; + const headers={'Content-Type':'video/webm','Content-Length':String(length),'Accept-Ranges':'bytes','ETag':'"'+createHash('sha256').update(bytes).digest('hex')+'"'}; + if(!['GET','HEAD'].includes(method))return {status:405,headers:{Allow:'GET, HEAD','Content-Length':'0'},body:null}; + if(method==='HEAD')return {status:200,headers,body:null}; + if(!range)return {status:200,headers,body:bytes}; + const m=/^bytes=(\d*)-(\d*)$/.exec(range); + let start,end; + if(m&&(m[1]||m[2])){ + if(!m[1]){const suffix=Number(m[2]);if(suffix>0){start=Math.max(0,length-suffix);end=length-1;}} + else {start=Number(m[1]);end=m[2]?Math.min(Number(m[2]),length-1):length-1;} + } + if(!Number.isSafeInteger(start)||!Number.isSafeInteger(end)||start<0||start>=length||end Date: Tue, 20 Oct 2026 11:59:28 -0400 Subject: [PATCH 4/7] docs(playback): playback-qa-2 record measured zero-card pipeline blocker --- docs/agents/backlog/playback-qa-2.json | 4 +- docs/testing/playback-qa-2-resumed-stop.png | Bin 0 -> 27340 bytes docs/testing/playback-qa-2-second-pass.md | 275 ++++++++++++++++++++ 3 files changed, 277 insertions(+), 2 deletions(-) create mode 100644 docs/testing/playback-qa-2-resumed-stop.png diff --git a/docs/agents/backlog/playback-qa-2.json b/docs/agents/backlog/playback-qa-2.json index 0980df09..39bd0365 100644 --- a/docs/agents/backlog/playback-qa-2.json +++ b/docs/agents/backlog/playback-qa-2.json @@ -3,8 +3,8 @@ "area": "playback-qa", "status": "blocked", "title": "Capture actual-app local core-flow/mobile baseline before UI changes", - "blockedOn": "Client6 exclusive full/browser gate; await dispatch explicit final browser grant after durable history release. Noninteractive runner prepared, syntax-check only.", + "blockedOn": "Dispatch grant/routing for narrow actual relay/filter/EOSE/ingest/render boundary measurement; app startup+crypto/media passed but unchanged 3-card wait still0.", "addedOn": "2026-10-20", "filedAt": "1bb3a4fc452969f060c09a286b72b8cd7ac4123e", - "notes": "BaselineINCOMPLETE and client6exclusivehold respected. Noninteractive ownrunner prepared,syntax-only;no browser/server/build/full since15:26:32 release. Interpreter15:36:55 identified missinglocalmediaendpoint;generated genuine VP8 64x64/2s1019B,ffprobe20frames,SHA256d911005a5bca7fb1f3e5aa2fbee701b6476c9baf93460264c2aa5105dd0b3c69 outsidefrozenapp. Own HEAD/GET/Range handler contract7/7inmemory,3 brokenvariants fail/restored7/7;no sockets. Futuregrantedrun realHTTPpreflight beforebrowser,all822apphashes+mediahash checked,unchangedrealBuffer/externaldeny/3card+UIassertions/loginfirstactualnav. Exactfixture/handler/preflight+updatedrunnerhash docs/testing/playback-qa-2-second-pass.md. Await explicitdispatchfinalbrowsergrant afterhistoryrelease;no product/vendor/config/test changes,no appdefectclaim." + "notes": "Latestsource-correctedactualrun15:55:01.326→15:55:18.667:realcanonicalcrypto,HEAD/GET/Range200/200/206,getApplicationReady completion andofficiallocalrelayAPI allPASS;3cards15s still0. No login/UI/other2viewports;noappdefectclaim. Browser/privateapp+relayCLOSED/RELEASE,depsremoved. Savedhealthlocal31848/unreachable[]/backoff{},noactuallocalWSframe/EOSEtrace;nextrootroute15:55:53 is measurementONLY,notnewfix. Cheapactualschemaprobe missing s invalid/addcanonical s valid,but actualconvertEventToVideo acceptsBOTH;gapnotproven0cardcause. ProposedpassiveWSREQ/EVENT/EOSE+warns/cache/DOMcounts,unchangedinputs/3cardguard/runtime/media/Buffer;awaitspecificdiagnosticgrant. Originaldrivererror/specfixesfullyrecorded;no product/test/full/build/newmirrors." } diff --git a/docs/testing/playback-qa-2-resumed-stop.png b/docs/testing/playback-qa-2-resumed-stop.png new file mode 100644 index 0000000000000000000000000000000000000000..ec6eb0d552c05d354de6a5b94c1243643d833fe2 GIT binary patch literal 27340 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 IC;aJIiFwt`X^daaa;$<~Y<^B|51NlXpp1?#R7 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 u)?Zl1H4qQ)<_0NOj5C+w5&b Date: Tue, 20 Oct 2026 12:03:13 -0400 Subject: [PATCH 5/7] docs(playback): playback-qa-2 locate actual feed pipeline render boundary --- docs/agents/backlog/playback-qa-2.json | 4 +- .../playback-qa-2-pipeline-diagnostic.png | Bin 0 -> 27340 bytes .../playback-qa-2-pipeline-evidence.md | 154 ++++++++++++++++++ 3 files changed, 156 insertions(+), 2 deletions(-) create mode 100644 docs/testing/playback-qa-2-pipeline-diagnostic.png create mode 100644 docs/testing/playback-qa-2-pipeline-evidence.md diff --git a/docs/agents/backlog/playback-qa-2.json b/docs/agents/backlog/playback-qa-2.json index 39bd0365..e202b996 100644 --- a/docs/agents/backlog/playback-qa-2.json +++ b/docs/agents/backlog/playback-qa-2.json @@ -3,8 +3,8 @@ "area": "playback-qa", "status": "blocked", "title": "Capture actual-app local core-flow/mobile baseline before UI changes", - "blockedOn": "Dispatch grant/routing for narrow actual relay/filter/EOSE/ingest/render boundary measurement; app startup+crypto/media passed but unchanged 3-card wait still0.", + "blockedOn": "Measured actual pipeline delivers3 video events+EOSE and ingest/appmaps3 but DOMcards0; dispatch routing for read-only filtering/visibility/render boundary, no defect attribution yet.", "addedOn": "2026-10-20", "filedAt": "1bb3a4fc452969f060c09a286b72b8cd7ac4123e", - "notes": "Latestsource-correctedactualrun15:55:01.326→15:55:18.667:realcanonicalcrypto,HEAD/GET/Range200/200/206,getApplicationReady completion andofficiallocalrelayAPI allPASS;3cards15s still0. No login/UI/other2viewports;noappdefectclaim. Browser/privateapp+relayCLOSED/RELEASE,depsremoved. Savedhealthlocal31848/unreachable[]/backoff{},noactuallocalWSframe/EOSEtrace;nextrootroute15:55:53 is measurementONLY,notnewfix. Cheapactualschemaprobe missing s invalid/addcanonical s valid,but actualconvertEventToVideo acceptsBOTH;gapnotproven0cardcause. ProposedpassiveWSREQ/EVENT/EOSE+warns/cache/DOMcounts,unchangedinputs/3cardguard/runtime/media/Buffer;awaitspecificdiagnosticgrant. Originaldrivererror/specfixesfullyrecorded;no product/test/full/build/newmirrors." + "notes": "Passive diagnostic16:00:32.126→16:00:50.999 onUNCHANGEDoriginal3seeds:localWSvideoREQ kinds30078/#tvideo/limit200,3EVENTids+EOSE;rawEvents/allEvents/activeMap/appVideoMapall3,initializedtrue,pool1,sharedclient. DOMtestidcards0/data-video-id0,Trendingempty. Firstmissingboundaryafteringest/appmap→DOM;no render/filterdecisioncausalityyet. s-tag schemafailure REAL but notpreventingingest/converter;notblindlycorrected. Startup+realcrypto/genuinemedia200/200/206/822pins/denyguardPASS;10otherHTTPblocked,0local404/pageerror. NoUI/remainingviewports. Ownedbrowser/serverclosed+RELEASE,depsremoved;awaitnarrowrouting,no product/test/full/build/newmirrors/assertionchange. Evidence docs/testing/playback-qa-2-pipeline-evidence.md+actualscreenshot;actualUIbaselinestillrequired." } diff --git a/docs/testing/playback-qa-2-pipeline-diagnostic.png b/docs/testing/playback-qa-2-pipeline-diagnostic.png new file mode 100644 index 0000000000000000000000000000000000000000..ec6eb0d552c05d354de6a5b94c1243643d833fe2 GIT binary patch literal 27340 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 IC;aJIiFwt`X^daaa;$<~Y<^B|51NlXpp1?#R7 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 u)?Zl1H4qQ)<_0NOj5C+w5&b Date: Tue, 20 Oct 2026 12:09:59 -0400 Subject: [PATCH 6/7] docs(playback): playback-qa-2 preserve demonstrated cold feed render gap --- docs/agents/backlog/playback-qa-2.json | 4 +- docs/testing/playback-qa-2-evidence.md | 4 + .../playback-qa-2-render-diagnostic.png | Bin 0 -> 27340 bytes docs/testing/playback-qa-2-render-gap.md | 167 ++++++++++++++++++ 4 files changed, 173 insertions(+), 2 deletions(-) create mode 100644 docs/testing/playback-qa-2-render-diagnostic.png create mode 100644 docs/testing/playback-qa-2-render-gap.md diff --git a/docs/agents/backlog/playback-qa-2.json b/docs/agents/backlog/playback-qa-2.json index e202b996..1e193570 100644 --- a/docs/agents/backlog/playback-qa-2.json +++ b/docs/agents/backlog/playback-qa-2.json @@ -3,8 +3,8 @@ "area": "playback-qa", "status": "blocked", "title": "Capture actual-app local core-flow/mobile baseline before UI changes", - "blockedOn": "Measured actual pipeline delivers3 video events+EOSE and ingest/appmaps3 but DOMcards0; dispatch routing for read-only filtering/visibility/render boundary, no defect attribution yet.", + "blockedOn": "Client7 routed cold-feed subscription refresh fix; await durable landing + rebuilt integrated artifact + dispatch browser clearance to finish original mobile/UI baseline.", "addedOn": "2026-10-20", "filedAt": "1bb3a4fc452969f060c09a286b72b8cd7ac4123e", - "notes": "Passive diagnostic16:00:32.126→16:00:50.999 onUNCHANGEDoriginal3seeds:localWSvideoREQ kinds30078/#tvideo/limit200,3EVENTids+EOSE;rawEvents/allEvents/activeMap/appVideoMapall3,initializedtrue,pool1,sharedclient. DOMtestidcards0/data-video-id0,Trendingempty. Firstmissingboundaryafteringest/appmap→DOM;no render/filterdecisioncausalityyet. s-tag schemafailure REAL but notpreventingingest/converter;notblindlycorrected. Startup+realcrypto/genuinemedia200/200/206/822pins/denyguardPASS;10otherHTTPblocked,0local404/pageerror. NoUI/remainingviewports. Ownedbrowser/serverclosed+RELEASE,depsremoved;awaitnarrowrouting,no product/test/full/build/newmirrors/assertionchange. Evidence docs/testing/playback-qa-2-pipeline-evidence.md+actualscreenshot;actualUIbaselinestillrequired." + "notes": "Measured hard localreviewblocker16:06:34.174→16:06:51.787:transport3EVENT+EOSE/client+appmaps3/actualfiltered3,all3allow/serviceInclude=true,notprivate/nsfw/blocked;whitelistfalse/lockdownfalse/bodynotinert/docvisible/containerconnected. Passivecache0→subscriptionupdate3;viewcurrent0/rendered0/signature__EMPTY__/lastmetadata.reasoncache/DOM0after15s. SourceNostrService.loadVideos livecallback caches/emitswithoutonVideos usedbyfeedrefresh. Dispatch16:08:41 routedclient7method-onlyactualservicefix,QAproductread-only/browserHOLD. Originalschema s mismatch disclosed(notpreventingingest/eligibility),observerrelativeimportpageerrorseparatefromproduct;allinterventionsretained. Ownedresourcesreleased,noUIflowsorother2viewportsverified. Rendergaptrace/screenshot docs/testing/playback-qa-2-render-gap.md;finishdocs-onlyevidencequeue thenwaitfix/artifact/clearance,notbaselineclosure." } diff --git a/docs/testing/playback-qa-2-evidence.md b/docs/testing/playback-qa-2-evidence.md index af0b8a84..a7f20a14 100644 --- a/docs/testing/playback-qa-2-evidence.md +++ b/docs/testing/playback-qa-2-evidence.md @@ -1,3 +1,7 @@ +> Latest checkpoint16:08:41: [measured cold-feed render gap](playback-qa-2-render-gap.md) routed to client7. +> Actual app now boots and ingests/admits3 videos,but no cards render. Core/mobile baseline remains blocked; +> the source-checkout failure below is historical and no longer the active prerequisite. + # playback-qa-2: actual-app offline baseline blocked Baseline HEAD: `ac99ae9a6bdbeae555a30f659b0720ae67e777e8`. diff --git a/docs/testing/playback-qa-2-render-diagnostic.png b/docs/testing/playback-qa-2-render-diagnostic.png new file mode 100644 index 0000000000000000000000000000000000000000..ec6eb0d552c05d354de6a5b94c1243643d833fe2 GIT binary patch literal 27340 zcmZ^~byS;8^e#$U3M~|ADW$l(d+<_DelGH-HN*f3GVI=NeCRi zbJp*!d)Ha_zgasw^S(2)XU{Xwv){0`%xy`Xya{K?`^ z;8=`?hL0xyMe>_x+R-xR_xG9)m}i3eQvz*7?_SZN%gMbW-+vyE#l*ytP-Ber@xBS) z799s4%wHcBG8Hlf{JkYbSk=18=|Mmj&a@oA#{AP#temP8Fe`!WCW1KEt;%+J)l7`sdH=V*p`RLePn zA4y3_Qm_7We&346YEsApX%vZyE`3v=-?x4v;{eI`%u!H8%PML9NX8&pI5TT|cpwzb zWX_|~*HogJagsJjH}SX+YDNTO#C>YzH(D{uFa%iL+MT=XK3+qvI=U)#o=<2y3B9}^ zgg8S^Hin8Di}gN3m?RwiAJE~idHc_`$KU_`9CipY2h3V+4YQV*kufHEK%wi(fAIHC z3%(A>kN>y?eD_{WHZo#=bSS$=N;HYd%Jl_XqR=K>2aB; zwAKv6|Bj8TCowUd)$y7(S!rkUSb33e>z<`VU3S#wRFaxsvIB+vd?N650M)AZr}KeS z1B5eFGyl9BPIR)~k8|qcTNzb6p%TTBi^0vPV(2F(bh@{gt6qCcTj*`%$nlA{GcrH; zqOYJij^vMBzvT7?<5ude;xOIOM;2URhreYdw98rN7wX2FbX&+wSovZlEg#)k5aX$- zw~4Ow%;tETq@$?Qt+Esb9?0{m&O=-z!OiB|P^E~2(HDb*b4a_ImKHy9BjSUBK*WBS z?X3NS^EGgVBu4Pz8sP8nOTcm47C4ZJ`f)>E&mEE|qRW-ua`Fz!8HtX38^y@X!Pq3d z^^eO*;{N${lCAi)$aml+XGfM91QEM8 z;M6sc1)E}olJYMI3^i;rs!YnhxHo*nr4;|I`Slx*-2hcrVPWH+^4}FP!Jo8sS)b2m zwrq{Js> zU?f>YB^vd@@0}BrGp)FZ{MLO5_V@@oJ$R79Tu%zpYO;4C=4eD+#_XPR*FLhiBpw(YB?<&9B=z z?csQDU}5B(`(lKwP%UPtd`#}U{*#?>R{5)zT_V=i;rasaRhsMUbe7<^hR3++g~VjZ z_N4_6Ih*Is8G5~KaD4eNA_uQ>`oO)0{pH756x{zkv5G}VO{X#6MGv9X_UAELRgX<5 zy?r}t0APCg24w8(LOSKM0)V7ec1UriJEW3?Q$GAT7Pk`wf|wdMUEfiBXa z$_T!3`a(hbUnDs^oHg=nO$96+g$&KOhTJLWI7}4CzTCIIHu%10c?Zb^pKmBuSk<{1 z8D%&)IA8>3=jKks`WdPItuBwIkA3|G{76hF*{rajlv|~~ZCTQ|WU?sRq?$<`Xu1Hl zFsgETwB7o|z+6rhh;VK&P&w%+KmOAU#?@`gxNjY-9-(C<%q-(s@_xzf5$mo8y86*3 zG@fTu=CWhhBmJgiRlra*0hA1IpjBubO${OlPxc0F5=tyyVv+dAE-r0mh6 zx8kaANmpYp=c-Tf5x%#z&kN1bWmKJ7^}!=+KR!)x{H^b(18|sjq8*nw>**jRaVr{> zI&I!gQGrEh1>uRIT*~U#HwH~Bbe)*3A%L6y83@HFKuynRa&B6NXf6(Kh1&1Vth(J5 zUjQd`@ublQRxW02obA|(Q2%1qqZ#o5^A6eexB@9qNv0dUJia*9F2DEcy3~f_GMOy0#YObH-e53^_`VQ4Jaep80>T?_|wQh9ZQNJrd5_Fhp zBad_V*$DO92XRv$fh(-zGbMU48IwSND%M4q@OoXc{D|y$F4vhB2)^8WY`yK3IB5^N zGLr;12OIWi8k|cDgU&ul0QA@bI6znHeW%|u5Z&&CG$73+?XD7ZH7 z^afT(iXEY7YKkxvbxY%;claI&3e@5lZhs8Iwf1ZBosoL<;N73-2i|{zsAh1nG^0$A zQ6Azo`7-$I(KOv=X`3zU^JBudMx3p8SjthP6&)va+KXCoz%8*lbbm?ILrBJ#~E)a_=jTP~EYmMH+*ym%UPjEnNZjz>fie z%pNh{oCz|rtDr60dIf3B{nE~jl(nqwt4%yM_$?{rb->Y{vH9ht>V4bjK7XB?Bjk+U z9(&?Q2Y%R0`oVBz$4=Y8yXyMp;VQ?(=}l201)6D$_N$JbyeO0J!^gy(n zHv90fd$Q~!0Y5XewZXsab3eZ-0z%;XsuHM+3W&I3vvU1y;WFxmgn9Zr&7IQ5%H}rP zU#kv}WfrJO%-bY<2fd&xG{R6rdzK_h=K#y_1PYuT* z58y)tyNGqb*4Bq#4lQ2i0hC&(@~Qm}eYid*GI#0&4l13;cVMFP_=GVf709&Q_*kAQ zEEgqiu^m&gCwK;Bq|ABwvJE-E3q*hUax7h>Usy`htxi2VcR8=NhE_b0 z6Iwi2oD=N8-h`hx*fd|C%*7>WfBhmnwGSq%wcUggYk=W?FOH4c_M2I!Su_t}VzKEp zt}%^)ORMEA0ksu{jo+HNX{-l=YBGECNA;~kn92a5O^=?3_2hzV?OIrGtsev*E`fD= z*V6ePUCSC3xi58HA};8@7dCJB(6mIus5-trw3cPR z*-fmgDq5Kvl8?cCigq)wI-tvdj;PC+t2@8{m4$|ADJnv766_|>Hf{I4YdX&GJHQI0P|nPGv>P8>JuLmaVOMEsY0joHic`ZwLs2rOX1RHI zh2`ZBO;6wso(NQINEE*Y9LIU@F5hNC*7MR^Zd&guc1z*V&WqHJ1N|W!Z`lM(L3~A# zeK{W)oa`KDd$LCXA5rI&E0?kNt0p22yw|>RJ z&Omg0|Bjp(eE!E7V!r@?%2I}Yy>>yUf~MNiin$J3`|=s3ti# zx2T2&^M>?rtSbBoPyO~m>&q>~VTIxOrfO}G%M=bwUTi*s2#DO)UggkrQ9PV>!d*5| zu64E-EDKza+?2P7r0zHc84M9lgh2}Tr8v31X`V z!SS9ffVP}6Iq7rS?xy*^zVi&nE;*?BbAYLQCm*E&lTl8#K$y&yIXQ0;s&Z zlHM+QP~NR-v+f%4%pl-dhLsX!4{@P>h1x7zV%z9dVhSK7B?R^GGuqBh$=c|F;o*jK zZKVLcBcSq@A#cyMU6{N4A zOnwdv#;HH%&r_ctCGdKO#Gq=k$EsS@=PanqVVp{Q?B7UeS;^Q+7=De7aG4#UA+ML= ztTY@8yay4chLtqB9p0n060k#7mSDZHCtxyr995;PoHA=nUUB$AND+bT6tl80N|04+ ziWJ74wwr%)AM;xPulXT;wpPX(C8S;c2(P|dkgn)BpH<}SXurU823`#BjCvjH?}8sU zE9Mg$scgsv)DFes{2U9<4nLe+Fz3F|tYdH3N3%D4F}40}HqrH?zBLNZZ{6_uZ(Q`o zgMt!zF_cL`M}&fc$T5(O3(wcv)<9Ij?eH3V?=;es@wOnWh4--)p(;H6Ipkd)t%mTn zy|{01xv#vgbieC|56Q6AlEiEDI%XOg-@)Sshxz7XvN>|5xn))|J4}C2l$;( z);|3r!SV?j-&@~btJtflgufvW3AEy`a@&27-&`cWW8+|#@YHENG062QKqLCQOa>ac z-r8>+Z-<9zQ3BZ?gH#MW=h-NC5#HV1?1pQHf~N+)Gp#okwpMlvtx`+24Ar|HV4>Z8 zM#|+Dk5xZB(bDsq{GdMUafwUFt=QQuMD%JBdHSnH%41*pgwuDa8s-(B;Cr3w`6Fy5 z;YC-mvPsrfZC%ayxxxAk(ZDiitaT1Rn8Ro0O-SJR%f%Xh=Pw@H-!{^)*#IDn`Gc~b zvDQwI4fS*9gqQ7ieIa#qZoK)?+KYntR{3_Tu4~<@9lRGC@VI8D>T#82=V5+42^7{b zz2DQm3F^(OmAXPmCknxr=8~A2yJ}Up{)0wX?kn^f_IT^@WB|{rI8I2GU-{Ni>7!S+ zdQpNO3T~dr*?8{QVAQgA&~nmx98KTgcQ?tnEwD@1`9EBMIblV|&FKR-ch5}Z3nZ~D z9aHXMLdxrL-+zXJ`oh{-PN&0L>8B#V@J_jhIp+JSIMH*ChC|oibNAzF>XPCQRoitk zbZ4EJ;` zYp#cbdIsfRgNEtK1^l3M;8WglR0iVcH`4FeRbfOiuB^WvWj5S3AwW)ze%4j{D7Q*$%@8F%&Tmon+4WLbE;c zXV}zf>t_9;W1A4$Nbhz$_y&D(jjE}4tITmgN)Vd56pHRo+XHX&B}tLft-H=R8_>^f zAG`?~iF%)yG0<1=W2)<<&Mn7H2bB(bxw)f zv-v%P+~L;a;2_0E6mb8fOpxunH^L2j_d;e=(KP4!_<$Tkk_tG0*Wr0Y%HQX7Yc#HJ4ay#D>Xvp4 z#GkX1?Iq4P(z#rkr-h_CZBBhTU9xa{bgLaTX=>Zxyx4Y}mAwN~Uj><|K%i-D2sq>Ok1@e}m(Jsyr>CeVplM5F7rn?P4I;mjB^VX=CXAZHlSNw9{sQ*1|=I{UT z)|fg+mTp1C(T|2wzoUHl>v!?ejC#LN0xOX{2(UaW-Pr#DjLmtv7r+b}$=df)km=n* zb6LCWYUN%Ej-cz0Xs`y(g~DXE7ecu9vO*h}r+g z5%H5D=rAxaDdsB^a|PGONE;FgmtbcDM2O(Q6-youA7D)sZ=V*BC2K=YwzJCMDmC$? zM#_2b%fEmSKuAfISEF;qvTB0Ce6=N-;aHfc%hjJd5$j)frXrE*dd#Az_Uk{u1WPMX z7O;0WfNeI7gr`YqmW;HAzms}$mj9d9%*0n04d(6iUQASt_2L(<*AHNEk_rl^0X9E< zR+|OCKOZ#2{fuK?>_wsb;7VhnZZsX2NS(Sh>%9>C zd)}tCh?xPr8nVwAle_5RvmMMYV#ke%$(=|MKf_-uo6eDuK!KGUsbdsF@c6a!ON*B^ zGP&MiZ&elZ;NH(~?9uJunRk7{rbe!}6qUM@-17L9AP&KJj21!^skS&?u)0A+A16=S z82bHu&j;e@ysElDA(TXKr^;B;pr@)}SF$rtf35hzDQ(2Sejs+a5Jvg_N^qI^lCCWOO=9h$Hy#;&zSy>m=uBuQkzlmNcXo~4RTOQ7bm#+#v z&l=WC7yQMCDXU0SMD>BHRg{&}Y7l$q$QP;^{OqlHrsyc%0V7exKQm^*1>1sO^#PmD z7oUw7j;>m?yL^G{u=c)4)Bk)K%=)mpWRq1y?J)0a0GeEA5bJ<1-{w$m2W=~1Z+Abp zNifiD@D$iRaX9(3CVV_*HT6=<8SU!(aa5U{bjUaGM7WeylkLUB4PMNuho_zLA!r?k zK;vLnrL@Hx!_qp&X-6-oNjs-$iA!QZzDW|F3{6b7WH#JBFt2G?O5ts%Srp;9M3nN0 zPfYW%Q1KA+x1A5H(2nAmj(^}KtpC}>u+CUk zcQWVhf-j*F2?0+EAt)T4*0&+!5Jnu5E_yVK=?V;+u9*ByQr~GJ{(USDv+3DCp?`JG zDXNkSiJxV<1CmPTJDpwhtR~cAcQ7LE{><*KS#ywuPRqrrOEudzb?Ub8rP<`l{Wr!x zqwcJ;Bz)v{HQi~PJePSa=*;4|fg3N8C4YYEo|Qa)SDiz)4lo7a47Psq9;dheCy*CHPsH}ROTG@nl01Ssn#ieEWUlA; z+Z#jT`XHGCFXNy!w7oFBcv3ABSg>-sF@-{`Jn!(rJ{kXR^x9VsCw7s71#RN79?Ylt z4yhi+&5lx>b4sfV>2Adf;Tv_AtA~e+jvf=VKm+liz0*{$aDQZ!1|H$tzEYG3UH)Wu zs77eQ%cOYZ!`+-fg5LRTqPy;3$4V^ldQt$3V60l7$hrnugB?pP>4bLm+}_;_Fio4g ze4J@Zj*mM`9r-jjZGm-HR4RX{?Zq257nS}q$RFNOjnT{LD<_pdvF=ym^|6vV>RGA( zXC%F30a@uNfC1jqqdd~`lB}ZEn-$Q|-u+)3{r}C{|8I*(L`xbr!?3w)nMN+k*c?mf z*^iZ@QuL58!DLUPX1_7_49p*{eR-YK6D)xY7^^#ha`->QyWKje@mH+=l&3^RqU|jj zyeH%1e}f?@yj;zyqJ)7amdq-nnW7PhPgBc_{SG~g(^;}tQlDvddXJ9+{W)5jkq0a8 zQ(j9#@`noX3y;2hPl4w5>B$y1Y1PIKaNcqIM)qWAV8QiwobMgS;>9)nmo;qf(7@7Q3Yw|G2<25dgXw#wXz9 zb$38b8~a$NO#-XTd&`F`D10*F8x_# zexGec+wZirYFA{2V+Sg`zTSN-O;1p2xjl?=$h5S1J!k~KH4wPJr-I`l~I^j>JeQpK){xDLdohm|G z88h?A6q?UDlXEKXNBZkukG}36{4XH&8|sad4O%Ds?akj(O6Vxy=->D_eV2%~Feg1t z|Ft9`-t<_TmulPlx>-YF$!Boyfp&KZdF)Is1XE(ju565am>@;Zl3Es~#AHl#_Fa@* zn^0M2>+f~h-A#&L@EZsEEm{^V`iZW0ZcDI-X~$ibvbpx}Oo2*^oh}iZ=GuL-86|`Y zA|N}|&T^1+UMu{Lw#neb+Yh3y3qO0PU%dXL-|Ry}+4R}i$H_0Xlu-5(@TQjC>driZ zkpdV?*?yK1E4fR@e{ewBVOX^zw=)>aELEUNEJ7t5pduQt?{sH1%Lpu2Qi<$9gzIKd zoS^?R@(2u!o8-Vw9^8?epS82WnTHnvrq_8Ln{^GTPCWmzt~P8GZ0dQlayfUV(OupY zg_Bb_tqkKRkPBT;s^*I;jHR2eR*Z47HSONmZkXhh5oo;I+#lbY?x{$uc-RS9b?C6B zepa~~09II-GA^QD5Yx`8^Vk$6*RQ~(^f~s65x=Uua~-{tyX2esp?LB;Ulg?3#hp?M z+nG8EzAKR!Eo4_ky6-C|svc2Fpt9Mwcf8!pTOghfC(=apP>!(49FC^-Y|fi_T@mUb zFp%fBN~Y(jV~}|P81h)Pm_OALHnqEiI%w9=Yndq&t39IJ35rZ}9hERLj4jew?AJU_ z$Rp~FXrmw!tFIby9~xLpNM{*etv(uD+=)?8iq7QP&4-|VtJxyI*)KH27;)R1_}=eD zl(!?{lz7{g94&pV^)O$b=C+gH={|TCWD;(d8}Qj_D=WLd642w$Kof^ni z0h&*FV>uS1fKKF2w(juHg!A|QT6Cj^_PZ4uPAL!5(S(o7jT^(=JM7|1`b*VyE#l2S zgNGrhyq|zz#Muy$<6`{7JrSqjhsEk`TUZ;|Lr+r0f7?NN2Vw4UB=pdAd&)uaJwx8( zehTvhzN>X%V1!0-kD^hLX{t^j=(s2g zAwVPLAR*ok{aj>c=sZ!SZHp<^e|kQdBAWqdX8=hf2;H)QY?1Y2BnH6&Kd z*W4`2GGI*fW6!oCc7Q?ksxwp5p&ucaHRBzq9`iwxVW`%GnHWHz_6_#z-Y zny66lV}#;xTyXEaN^Y#NGLAg7@~&$`Jwxy<8fke8Ivt}?uo2g5hE&^r0ocd-O=dB1 zk>~v#XD62tae1RPzL)(XDq(^qA0#|iMY-|19KCMZ4KEWNCT%=WZmmbqv#bP541?RF zOGU;>#xat=ENPcV;)wXnOkEwt-vM&Q3&4aFdU&U5yUy<~*g*@+6-KU`)k>Byn*%6B zf?t&l_jl_s5y}t8P{-?`$YuFs)X8+8A@qk@&oo}g{kW2F%*j=?kAts`t!xu$Co;*K z8`Wjccp~ET=SC+=PNh;M>Lr)8H)okdgT27PVKwx z=<;HXjH~sIr+svEFv36mS!9YNV6=YMSD-_~LM0%%uyDQ8{YKti(zyK!(QTP0H;TJZ zz{}Vk=l-inbovmdehSwz1CSIuW5WS;-W4?XF*c-Eo^O3$1u<=IkmXb^9LP;_di^KyiHWTd6-T7kOe(R zSkZj_*xt~!uEB$G^NZTs>?;pRHR}-9x57K0A+j>T|1GXTzw4?RZTvLD3iY7LA!#MOB!9Kp?In|j;WJE?;1ht?PNpn^Z z*~$+gVgv~OEyk5g&d8l_R#m*xH-a3=A8!o$7r^|g>^v-K^T*C8xcKuPtCbcc^eWE> z`+-a?4Dt=TA-5f@M^|A4{ZW7vuZxoH4xmYh3O|cwj(k5c-kM&Z;fA9fd&%L z=A@iJT_W%?SjKSE{(02PFD=M|29HNGKf0YU+caRL@C`KN6bMOeqzt*a8-gX4=T7mh zzu*fhNTd91??Fg#s>kEDyh&;urq*uRtKp+HVZFgYqrwJ9NME);9Z+qm2{B5MyS!sr~txw(QOxbr>(2thdRm!QTrl%8jP4s-+l8- z3_#0^!~v0q1dqgi@a-&e)j^3BPbsy$e?u+Tzibb3zMIw3H0_>U{MQd*nVRqj3Aiqrz}RX4IYP&S5#97Etj>$XR2pT zbu}N!0_5?n;I=+tx~|XIGzMNbCe`21MLR|xS7v?`zwH!Z#C(gE7$s zrEcR?#$g=e8r_`KMa#tXrED##IT&#u2FK6 z5WgHUq@6|*4e^fX8<~lOm8%Vi1h3Hq^AqL7a(Eza)~iuVul+kS(pn@fFYk+>|Ln(W zl}&}=-R6hnDU2RVUW)^2%mpef8*(mafQn{9vgfPS5N*uk_bF74ZP%HO?Yc6Kwyiq2 zZ(jVMC?Z8Vzv?N3EuL)581+_JU*->Uq)Mf-JSpLXg#1uK%V$})2j07d-z`!}?1i0a zY|l5Op%3KT+$iVQazDhg4wVTzcSd09B6)62Y8o1@z43{M*N8SB+@Hb0H!)$VyZ1yWU^O2}$2ZvhU;`v$Km0X)2z9WV6#i>i;B&-RWDD9NOy zgEko>nK?N-)`LlN{vvdDJv3UDy%*mBfxu+4-A%N;<>r-dvA_SioyzP~ney@PMOCyT zpzF+4RWEjd&M%++Fe*O;J|s+e)!7s%WeT*ZEYhK-Vf(q6c;a_S;_oRajEsyV|9f*8 zr=)STx$}&j*+tOTga_O=Sj|^ZU34_>rW1^ixWvqHkvLh`tyozKQI{>Q|GE|Fl+5|z z%D}%TDkLNXx^q8X;P+TXLH_%P1CEp2ixLCNU98-=v9!S)L5uN>%OTbZ0<^vDW}gJt zoR#kljas{Wi6@?3MH=cdrTPt>-QDDgvS@q9%{~X8nm%`uiiA;+P-i}zMnqVS+Ot9IM*vm4|wVY&&kl^1*6gX z+4TX~P8z=5N%jWX-nGG!>fj)tN!|GPVM`AIK)-t0C&c9~d$l;u1?tHLN9*`X0x(Z0 zceJawmh=ENKov01R*VqMTj)sr8QRFxCF0+k&i~(r(!;cd;@~{>3I9;4QmZ_dF1Tk{ zCWRyG(s@q-n(+9$EP9`)(7{red7;wVBg4ZiGWhzy{kk9KxS(|?!8N^nvOFE{U{uGg zLC8MpkLMq6nby7kzvedPK@z!HJ<4V^iwM&qOTaxn2;}@}g zp##N>q3LYyPFszaSrryPeG=6=OXlr=Cy$keGC(3_@Z!S!HPXjg~Vr z^L-(Yz#l}@Fe)vQ!qi>`tnt;XvU|A2tjw;7ulwa^#Wzn8q>Q64#vr-nqMliGX%!ot z2En==@JDrvz7lEj`1W}BkArSZr~o%K=2Ukzp+_e(70gz%G_kJaqI^}DnrPrRu3WPl z6SGz`C1|E4Lv-Z9YdM8_lkxVFE<>y|g)f=49ytENiJ z-Qf0=`9D%%jC!uS_>GTClZTRlmDgDC6&Sl89kA6{mCa;ti)i;{KRuxop)>BPeAS}r zE7jRtCky``GnBS*A@esZGF8ajDmNs}O7-#nkh^1liZLYg5n9LCPzKl&@^J|7xJ%0~ zC5PCLS4_Wa2>rR0oP!kNID<)<-CrfEu|U7p`e}H}#Mb*W7FTWs)occgxRMOlfQ?cK z1YC#EFT1R_JA4iIf6eF2_|)gVjMV32_#{bkId$tG$63Cy{JcA0S{QmyJ(Wl&T(A=OIQaNDvx#CgN(@W$pl56yFN)Egs+2i7jG?h6KvdAR_A(p%>XbcH~q{;(>(1D<%o;@4O&>7t>y9%GN$ms0&M7 zE0mMXqN^uYCn_!BkaZRoljfn;s{BG)8|;l7Go8;{z-W^Fax`JRiBR08sNh^_7hvru z^!K=pA{DdIYt8J&oNmp~ozKG}YDsUXJuurpGgue0?wqUa%2|wgzcU3<$Xuf~RSy~D)h-j!>?J^adB=6vJRCPd zN!?$kC(5m}a=yFtnga_rg#_cpap$iwDy#G*T7sVriITMahuV$`BJX*vzl9$6H<{cn z81^q?j_c!ZE`M$GJIo-Q$stk>tHkkX&lYZ(hV+fh#~vJ9l_6mc7Y1CsvmJp%B_*X; zs_9Bnq<*B6TU67(r2zb}Nwn>{u??41-&%yY9`c6{O|7POfJIU1@gETp&8dnzS= zm{HdxF4-T^rQ>#+eBV$Ui6Wgn)gB=wvMqvrGj@J^a4jU{hWhPm{U^~pe!!FgQBqQ) z-QcY-bR}O`;xUVxDeRb~0o>|qh8mRVoBfqp-WQHc=4x?9xqBV_4KqVh0+~?H-p;_lilw&q(sI1Xl0_KFA4{S zD-J8sK)0$&(P7h#NZDRxx!Gw8qFTdKfo~S^Nq=PvawoJ3KbPNBS_d+R!yxWO4IKkj-OKXSUhCpo;V8G6sX0dice%-#AbEiDPA z1;%G;Y`^6d;_q7R=4BK2`dnHKC~530yZ|xQUdz-Kbo6Dvq`Sp^jo%SFT}uSh zE}NRYyvUk+C1EdFe%B!Q!Cd>-894UJwc_jz_IW;~au9>(r=(Oh{Z$9oiEd7|2}8-P zjAz-CB5&kuengql}N^*vUsxq6bjopK^^6st|Io39v!Q|4?Ijlb8S;@R)JT~&aSUw z!pVsbt?hD8U$1W0{dH^r9<4RvSCxFucDYO-9l96}Ke)oebA;eoB4O$9G>@T|gqZf( zuLLZY_jFW+9uvF782FhHFjOjUAfuooL#;<2lgFi&?!&Wb5>-6)G6JNn-GlrVPhAMT z{Wb-NmU-&Hb7MljGgZ$bv1B@-=I@{wpM#63Mq7qwgC05U>bG&$Kt6lCAkUC~^gK!t z&9YlYFCm%L*!8QH>~^@Mm|@leY_vMuB`-v8mP*;tu6Srwp=4@D^Bi{Wou0sWlCt9> zb8>trqmT;18mFEr@G+xUXagU+Ywiu4Gc&6Rv{~^5^5EG^7#J8>p1eN`&&~ucY!mOM zDmOsCXliJ^4kM$a0|WWLku5- IC;aJIiFwt`X^daaa;$<~Y<^B|51NlXpp1?#R7 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 u)?Zl1H4qQ)<_0NOj5C+w5&b Date: Tue, 20 Oct 2026 12:11:31 -0400 Subject: [PATCH 7/7] dispatch-2 require current-consumer lifecycle controls for client7 --- docs/agents/prompts/client-reliability.md | 4 ++-- fleet/RULE-CHANGES.md | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/agents/prompts/client-reliability.md b/docs/agents/prompts/client-reliability.md index 14c5c726..949b3c30 100644 --- a/docs/agents/prompts/client-reliability.md +++ b/docs/agents/prompts/client-reliability.md @@ -4,9 +4,9 @@ QA actual-app passive reproduction at386cc60e: fresh Trending/cache0, local relay delivers3 valid signed VIDEO events+EOSE; raw/all/active/appvideo maps3,actual filtered3 and every access/include true,whitelist/lockdown false. Connected visible view remains current0/rendered0/signatureEMPTY/DOM0 after15s;metadata reasoncache. Service emits videos:cache3 then videos:updated(subscription3),but app refresh owner is onVideos callback. Source loadVideos cache/optimistic paths call onVideos;live subscription branch does not. This is a demonstrated local-review blocker,not optional work. -Temporary item ownership: ONLY js/services/nostrService.js loadVideos live-subscription notification path;new focused regression (prefer tests/nostr-service-live-feed-notification.test.mjs),unique integrity/evidence/backlog. Read app/feed/bootstrap and existing tests;do not edit them or sharedTODO without routing. No app.js,cache/filter policy,signer/protocol,runner/config/kit/styling changes. Current service area exclusion is overridden only for this method/item. +Temporary item ownership: ONLY js/services/nostrService.js loadVideos live-subscription notification path plus minimal service-owned current-consumer state/subscription-clear lifecycle if needed to prevent stale consumer delivery;new focused regression (prefer tests/nostr-service-live-feed-notification.test.mjs),unique integrity/evidence/backlog. Read app/feed/bootstrap and existing tests;do not edit them or sharedTODO without routing. No app.js,cache/filter policy,signer/protocol,runner/config/kit/styling changes. Current service area exclusion is overridden only for this method/item. -Merge unstable non-destructively,claimitem7,read currentrules/KNOWN_ISSUES/test-integrity/localNIP/schema docs. Before edits reproduce actual service coldcache→controlled subscribeVideos callback→actualonVideos consumer notification absent;prove cache0 theneligible updates/deletion callbacks,not event-string assertions. Preserve filtered full-list ordering,deleted updates,tombstone removal,existing videos:updated payload and persistence,callbackthrow isolation/no event loss,optimistic/cache semantics. After natural failing regression,implement smallest method-only callback delivery fix and restored failing mutants. Retain no product-policy change or forced refresh substitute. +Merge unstable non-destructively,claimitem7,read currentrules/KNOWN_ISSUES/test-integrity/localNIP/schema docs. Before edits reproduce actual service coldcache→controlled subscribeVideos callback→actualonVideos consumer notification absent;prove cache0 theneligible updates/deletion callbacks,not event-string assertions. Preserve filtered full-list ordering,deleted updates,tombstone removal,existing videos:updated payload and persistence,callbackthrow isolation/no event loss,optimistic/cache semantics. Reused subscription must notify latest consumer after subsequent load/feed switch; forceFetch/clear must not let late obsolete callbacks notify old or replacement consumers. Include event-only consumer compatibility; do not blindly close over first onVideos. After natural failing regression,implement smallest method-only callback delivery fix and restored failing mutants. Retain no product-policy change or forced refresh substitute. Cheap focused tests and lint now;no browser/full/build until slot grant. QA owns actual-app execution and will verify cold feed plus original core/mobile baseline after durable fix/preview rebuild. Send reproduction/controls/files before widening;ready event with focused counts/mutants/lint. One unchanged normal full gate can be authoritative after merged focused/lint;avoid duplicate full solely for logs. Normal commit/merge/queue/ancestry/closure rules apply. No external operations/newoptional tasks;idle once local-review blocker is closed. diff --git a/fleet/RULE-CHANGES.md b/fleet/RULE-CHANGES.md index d925321d..718b1adb 100644 --- a/fleet/RULE-CHANGES.md +++ b/fleet/RULE-CHANGES.md @@ -9,7 +9,7 @@ a landing rule changes. ## 2026-10-20 -- Local-review hard blocker measured: coldTrending cache0 then relayEVENT3/EOSE ingests eligible3 but view remainsEMPTY/DOM0. client-reliability-7 temporary ownership ONLY nostrService.loadVideos subscription notification path + new focused regression/integrity/evidence; reproduce current method before minimal fix. Existing app/feed modules read-only unless additional evidence/routing. Preserve access/filter/deletion/cache/event semantics; no forcedrefresh baseline substitute. QA retains actual-app/browser qualification; client cheapfocused until explicit fullslot. +- Local-review hard blocker measured: coldTrending cache0 then relayEVENT3/EOSE ingests eligible3 but view remainsEMPTY/DOM0. client-reliability-7 temporary ownership ONLY nostrService.loadVideos subscription notification path, minimal service-owned current-consumer state/subscription-clear lifecycle where proven necessary, + new focused regression/integrity/evidence; reproduce current method before minimal fix. Existing app/feed modules read-only unless additional evidence/routing. Preserve access/filter/deletion/cache/event semantics; no forcedrefresh baseline substitute. QA retains actual-app/browser qualification; client cheapfocused until explicit fullslot. - Owner stopmilestone is Ready for me to review and test locally. Finish current storage2/history6/faithful actual-app baseline+preview/handoff,then no new optional tasks before review. Reconcile upstream docs-only8d4622bb via area merge+normal queue;new playback promises stay explicit/open,do not churn current scope or declare them done from partial/static evidence. Genuine cached offline dependency mirror is testprep only,not CDN/deployed/offline production proof.