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 00000000..ec6eb0d5 Binary files /dev/null and b/docs/testing/playback-qa-2-render-diagnostic.png differ diff --git a/docs/testing/playback-qa-2-render-gap.md b/docs/testing/playback-qa-2-render-gap.md new file mode 100644 index 00000000..fbd2a517 --- /dev/null +++ b/docs/testing/playback-qa-2-render-gap.md @@ -0,0 +1,167 @@ +# QA2: demonstrated cold-feed refresh gap (client7 routed) + +Dispatch16:08:41 classified this as a hard local-review blocker and routed a method-only actual-service +regression/fix to client-reliability-7. QA is product-read-only and holds browser closed until durable fix+ +refreshed built artifact. No forced refresh/render is an acceptable baseline substitute. + +## Trigger and observation + +Fresh actual app at1b3ef49c/build1834b6a9,empty browser cache,existing local mock relay preseeded3 synthetic +kind30078 video events. Hosted media is genuine local VP8 with real HEAD/GET/Range semantics;crypto uses genuine +canonical toolkit and local pinned Buffer mirror. Runtime artifact,external deny guard,inputs and3-card15s bound unchanged. + +Granted targeted passive run16:06:34.174→16:06:51.787Z(17.613s),Chromium154.0.8037.97,360×800: +- Actual local relay video REQ returns3 EVENTs plus EOSE;client and app caches contain3. +- Actual getFilteredActiveVideos returns3;all3 shouldIncludeVideo and canAccess decisions aretrue. +- No private,NSFW,deleted,invalid,author-blocked or event-blacklisted flags. Whitelistfalse,lockdownfalse,hydratedtrue. +- Passive service chronology:initial videos:updated cache count0,then videos:cache size3 and videos:updated subscription count3. +- View remains currentVideos0,renderedIDs0,last signature__EMPTY__,metadata.reason=cache;actualDOM cards0 after15s. +- View container connected and matches activevideoList;bodynotinert,documentvisible. This rules out the measured + access/private/NSFW/blacklist and mount/visibility candidates for this reproduction. + +[Actual empty styled Trending screenshot](playback-qa-2-render-diagnostic.png) + +First missing observed notification/render boundary is after allowed subscription data enters the service/appmap. +Source:js/services/nostrService.js loadVideos applyAndNotify invokes onVideos for cache/optimistic paths; +live subscription callback caches/emits but never invokes that callback. js/app/feedCoordinator.js onVideos owns +refreshFeed/render;applicationBootstrap binds subscription:changed but not videos:updated for main-feed rendering. +This is the minimal owner/file boundary sent to dispatch,not a product edit by QA. Client7 owns reproduction/fix. + +## Fidelity and interventions + +Original diagnostic seed omitted canonical s tag. Actual schema rejects that omission,while actual converter and +service eligibility accept all3,and wire/ingest/allow decisions are measured. Thus this schema mismatch did not +prevent the observed ingestion/eligibility and must not be presented as the empty-render cause. The post-fix +baseline should retain the established canonical fixture shape;no input or assertion was silently changed here. + +An early passive observer initScript had1 pageerror for relative module resolution on the initial document. +The observer subsequently DID attach on the actual app and captured the exact cache/subscription chronology below. +This is an instrumentation error,not a product error. Product methods were not wrapped/replaced;only event listeners +and read-only queries were added. No refresh/render invocation,manual card insertion,cache mutation,new seeds, +fake media events/health,extra mirror or product change. Existing earlier driver interventions remain preserved in +[second-pass history](playback-qa-2-second-pass.md). + +All owned browser/context/app+relay servers closed16:06:51.787Z,explicit RELEASE16:07:45Z;temporary dependency +symlink removed. Preview3000 and other processes untouched. No login/navigation/Profile/Upload/remaining viewport +checks were executed. Full core/mobile baseline is blocked,not done. QA will resume original assertions only after +client7 durable landing,integrated preview rebuild and dispatch browser clearance. + +## Exact captured decisions + +```json +{ + "started": "2026-10-20T16:06:34.174Z", + "ended": "2026-10-20T16:06:51.787Z", + "downstream": { + "activeVideos": 3, + "filteredVideos": 3, + "whitelistMode": false, + "lockdownActive": false, + "accessHydrated": true, + "decisions": [ + { + "id": "d8214f91f51180561f0fac563d163c4d3a049f53ea6dd24d0a3c892f918777e1", + "isPrivate": false, + "isNsfw": false, + "deleted": false, + "invalid": false, + "accessAllowed": true, + "serviceInclude": true, + "authorBlocked": false, + "eventBlacklisted": false + }, + { + "id": "1895c1e24ab449778121178f2301a2d5b9d296f6a76c2703900cd9141034058f", + "isPrivate": false, + "isNsfw": false, + "deleted": false, + "invalid": false, + "accessAllowed": true, + "serviceInclude": true, + "authorBlocked": false, + "eventBlacklisted": false + }, + { + "id": "11939f8c1f39254c8ff49905e9ec8c78c19d362e7f131d99eb0f2bb5eecaee22", + "isPrivate": false, + "isNsfw": false, + "deleted": false, + "invalid": false, + "accessAllowed": true, + "serviceInclude": true, + "authorBlocked": false, + "eventBlacklisted": false + } + ], + "viewExists": true, + "viewCurrentVideos": 0, + "viewRenderedIds": 0, + "viewLastSignature": "__EMPTY__", + "viewContainerConnected": true, + "viewContainerMatches": true, + "latestMetadata": { + "why": [], + "config": { + "timeWindow": null, + "actorFilters": [], + "tagFilters": [], + "sortOrder": "recent" + }, + "reason": "cache", + "preserveOrder": true + }, + "viewMetadata": { + "why": [], + "config": { + "timeWindow": null, + "actorFilters": [], + "tagFilters": [], + "sortOrder": "recent" + }, + "reason": "cache", + "preserveOrder": true + }, + "bodyInert": false, + "documentVisibility": "visible", + "passiveFeedEvents": [ + { + "type": "observer-attached", + "at": 1792512395999 + }, + { + "type": "videos:updated", + "at": 1792512396468, + "reason": "cache", + "count": 0 + }, + { + "type": "videos:cache", + "at": 1792512396487, + "size": 3 + }, + { + "type": "videos:updated", + "at": 1792512396487, + "reason": "subscription", + "count": 3 + } + ] + }, + "fixtureHttp": { + "head": 200, + "get": 200, + "range": 206, + "bytes": 1019, + "contentType": "video/webm" + }, + "pageErrors": [ + "Failed to resolve module specifier '/js/applicationContext.js'" + ], + "resourcesClosed": true +} +``` + +Diagnostic source SHA2567867eaced118cad69ae9f5e5dd0054149d71b8c892772a5a75fda2225d8b2715; +full report retained at own scratch render-result.json. Original822file runtime manifest remains +662fa755e3cde021058f5bf9a5bd2825698bad064ab80472a5ba70e651d764b1. +No actual WebTorrent/live peer/provider/signer/production/release qualification is implied.