Merge branch 'unstable' into area/client-reliability

This commit is contained in:
thePR0M3TH3AN committed 2026-10-20 12:14:40 -04:00
commit f39622da3b
10 files changed
+904 -5

No files matched your search

+2 -2
View File
@@ -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": "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": "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": "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."
}
+2 -2
View File
@@ -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.
+4
View File
@@ -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`.
Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

@@ -0,0 +1,154 @@
# QA2 measured pipeline boundary: ingested3, rendered0
Diagnostic authorized by dispatch15:58:27 and interpreter15:59:09;START16:00:28 before browser/server launch.
Actual run16:00:32.126→16:00:50.999Z(18.873s),Chromium154.0.8037.97,360×800.
Unchanged original3 seeded notes(no s tag),genuine media overlay,real Buffer mirror,immutable822 built app;
no refresh/card injection/cache edit/crypto stub/product change or assertion relaxation.
**First evidenced gap is after ingestion/app map and before DOM cards.** Actual local WS connected and sent a
video REQ kinds30078/#tvideo/limit200. Received3 distinct EVENT ids and EOSE for that subscription.
Client rawEvents/allEvents/activeMap all3;app.videosMap3;initialized true,pool one relay,app service shares same client.
Actual DOM has0 data-testid=video-card and0 data-video-id. Styled Trending view displays no public videos.
No navigation/login/modal/390/1280/UI assertions executed;baseline remains incomplete. This is not yet a product-defect
attribution:filtering/visibility/render decisions have not been measured. Configured relay health alone is no longer
the only evidence;the actual wire delivery and ingest counts were observed passively.
Missing s tag causes actual schema validation failure but did NOT prevent delivery/ingestion of these3 notes;
actual converter accepted them. Do not fix that gap blindly and claim it explains this render boundary.
It remains a known difference from the canonical existing fixture to disclose in any later baseline.
Earlier mode-filter speculation is unsupported and withdrawn. Startup-ready correction also did not move0/3.
Genuine HTTP fixture checks passed HEAD200/GET2001019bytes/Range206;real canonical toolkit/signature/tamper proofs passed.
Buffer fulfilled locally once;all other non-local HTTP attempts blocked10,non-localWS0,local404=0,pageerrors0.
Only browser warning:service worker blocked intentionally by the harness context. Guards do not fake media events/health.
All owned browser/app/relay servers closed16:00:50.999Z;explicit RELEASE16:01:25Z. Preview3000 untouched.
No further browser or fix was started from this result. Next routing must measure actual filtering/render boundary,
not reduce the3-card requirement,change toolkit/crypto logic,or turn this into a boot-only success.
[Actual empty styled Trending screenshot](playback-qa-2-pipeline-diagnostic.png)
Reproduction uses own scratch diagnostic.mjs(versionSHA2563b758e6695eecb438f53344512fed186f4d1c459ca70ba49722a0177afcf39f5),
node execution against the documented frozen artifact/genuine media/real existing mock relay with external deny guard.
It attaches only passive page WebSocket/frame and console listeners,then reads cache/DOM counts after the unchanged
3-card15s wait. Full filters for unrelated built-in admin-list subscriptions are omitted below;they contain no video
seed response and do not alter the identified video path. Exact raw trace remains in own scratch pipeline-result.json.
```json
{
"started": "2026-10-20T16:00:32.126Z",
"ended": "2026-10-20T16:00:50.999Z",
"browser": "154.0.8037.97",
"localWsRouteHits": [
"ws://127.0.0.1:31848/"
],
"frameCounts": {
"sent:REQ": 15,
"received:EOSE": 15,
"sent:CLOSE": 12,
"received:EVENT": 3
},
"videoSubscriptionTraffic": [
{
"at": "2026-10-20T16:00:35.756Z",
"direction": "sent",
"url": "ws://127.0.0.1:31848/",
"type": "REQ",
"subId": "sub:13",
"filters": [
{
"#t": [
"video"
],
"kinds": [
30078
],
"limit": 200
}
]
},
{
"at": "2026-10-20T16:00:35.764Z",
"direction": "received",
"url": "ws://127.0.0.1:31848/",
"type": "EVENT",
"subId": "sub:13",
"eventId": "e5464da7e3278076a0d3030ee3b9f233495d98b3159ec4e801b7651076b41c21",
"kind": 30078
},
{
"at": "2026-10-20T16:00:35.765Z",
"direction": "received",
"url": "ws://127.0.0.1:31848/",
"type": "EVENT",
"subId": "sub:13",
"eventId": "696fe1a6e5cfe784dc4a883f6c32cc9c3a15f9770a9403e0600d57cfe69d705a",
"kind": 30078
},
{
"at": "2026-10-20T16:00:35.765Z",
"direction": "received",
"url": "ws://127.0.0.1:31848/",
"type": "EVENT",
"subId": "sub:13",
"eventId": "e48da2722113d312388399e7af346bcf1e8fd0edad2b7e8446e0e379e645d28b",
"kind": 30078
},
{
"at": "2026-10-20T16:00:35.765Z",
"direction": "received",
"url": "ws://127.0.0.1:31848/",
"type": "EOSE",
"subId": "sub:13"
}
],
"failureDiagnostics": {
"appPresent": true,
"relayHealth": {
"relays": [
"ws://127.0.0.1:31848"
],
"unreachable": [],
"backoff": {}
},
"feedItems": [],
"rawEvents": 3,
"allEvents": 3,
"activeMap": 3,
"appVideoMap": 3,
"clientInitialized": true,
"poolExists": true,
"poolRelayCount": 1,
"subscriptionManagerKeys": [
"subscribe",
"list",
"handleReconnect",
"closeAll",
"getActiveKeys"
],
"appServiceClientMatches": true,
"domCardTestids": 0,
"domVideoIds": 0,
"body": "Switch to dark theme\nTrending\n\nNo public videos available yet. Be the first to upload one!\n\nseed. zap. subscribe.\nv: 1834b6a9 \u2022 2026-10-20"
},
"consoleWarnings": [
"Service Worker registration blocked by Playwright"
],
"fixtureHttp": {
"head": 200,
"get": 200,
"range": 206,
"bytes": 1019,
"contentType": "video/webm"
},
"bufferMirrorHits": 1,
"otherNonlocalHttpBlocked": 10,
"nonlocalWsBlocked": 0,
"local404": 0,
"pageErrors": [],
"resourcesClosed": true
}
```
Runtime snapshot manifest remains662fa755e3cde021058f5bf9a5bd2825698bad064ab80472a5ba70e651d764b1;
build1834b6a9/index5095c3f1326b035ef93267ad77663ea641edb1acaae6d18e88085eff08c5d6d3.
No full suite/build/native Firefox/production/live-peer/cloud/signer qualification is implied.
Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

+167
View File
@@ -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.
Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

+574
View File
@@ -0,0 +1,574 @@
# 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/[email protected]/+esm"
],
"blockedHttp": [
"https://esm.sh/@aws-sdk/[email protected]?bundle",
"https://cdn.jsdelivr.net/npm/[email protected]/+esm",
"https://esm.sh/[email protected]",
"https://esm.sh/[email protected]?target=es2022&exports=nip04",
"https://esm.sh/[email protected]/nip44?target=es2022",
"https://cdn.jsdelivr.net/npm/[email protected]/lib/nostr.bundle.min.js",
"https://cdn.jsdelivr.net/npm/[email protected]/lib/nostr.bundle.min.js",
"https://cdn.jsdelivr.net/npm/[email protected]/lib/nostr.bundle.min.js",
"https://cdn.jsdelivr.net/npm/[email protected]/lib/nostr.bundle.min.js",
"https://cdn.jsdelivr.net/npm/[email protected]/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/[email protected]/+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.
## 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/[email protected]/+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;}
```
## 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<start)return {status:416,headers:{'Content-Range':`bytes */${length}`,'Content-Length':'0'},body:null};
return {status:206,headers:{...headers,'Content-Length':String(end-start+1),'Content-Range':`bytes ${start}-${end}/${length}`},body:bytes.subarray(start,end+1)};
}
```
Exact socket-free preflight:
```js
import assert from 'node:assert/strict';
import {readFile} from 'node:fs/promises';
import {mediaResponse} from './media-fixture.mjs';
const bytes=await readFile(new URL('./fixtures/qa2-unplayed.webm',import.meta.url));
const head=mediaResponse('HEAD',null,bytes);assert.equal(head.status,200);assert.equal(head.headers['Content-Type'],'video/webm');assert.equal(head.headers['Content-Length'],String(bytes.length));assert.equal(head.body,null);
const get=mediaResponse('GET',null,bytes);assert.equal(get.status,200);assert.deepEqual(get.body,bytes);assert.equal(get.headers['Content-Length'],String(bytes.length));
for(const [range,start,end] of [['bytes=0-31',0,31],['bytes=32-',32,bytes.length-1],['bytes=-16',bytes.length-16,bytes.length-1]]){const r=mediaResponse('GET',range,bytes);assert.equal(r.status,206);assert.equal(r.headers['Content-Range'],`bytes ${start}-${end}/${bytes.length}`);assert.equal(r.headers['Content-Length'],String(end-start+1));assert.deepEqual(r.body,bytes.subarray(start,end+1));}
const bad=mediaResponse('GET','bytes=999999-',bytes);assert.equal(bad.status,416);assert.equal(bad.headers['Content-Range'],`bytes */${bytes.length}`);assert.equal(bad.body,null);
const method=mediaResponse('POST',null,bytes);assert.equal(method.status,405);assert.equal(method.body,null);
console.log('local media fixture preflight7/7 pass (HEAD,GET,3ranges,416,405), no sockets');
```
## Final-grant attempt and authorized runner contract correction
Explicit dispatch grant15:44:58.082Z,START15:45:33 before launch.
Run15:45:39.511→15:45:46.059Z (6.548s),Chromium154.0.8037.97:actual local fixture wire
HEAD200/GET200(1019 genuine bytes)/Range206 all passed. Buffer mirror1hit,local404=0,pageerror=0,externalguardunchanged.
Stopped first readiness assertion;no3-card/login/UI actions executed. Screenshot:playback-qa-2-resumed-stop.png.
Avoidable scratch-contract error: runner asserted `(await nostrToolsReady).ok === true`. Actual source
`js/nostrToolsBootstrap.js` success returns `frozenCanonical` (toolkit),while failure returns `{ok:false,...}`.
This is **not a demonstrated app/toolkit defect**. Original exact failed source/report retained in own scratch
noninteractive-attempt-3.mjs/attempt-3-result.json;baseline remains incomplete. All owned resources closed15:45:46.059Z,
RELEASE/intervention sent15:46:53Z. No retries or false app-success claim.
Interpreter15:46:29 and dispatch15:47:12 explicitly authorized only this scratch specification correction and one
bounded rerun after cheap offline proof. Corrected equally stronger check requires:actual returned toolkit callable
getPublicKey/finalizeEvent/verifyEvent;identity with immutable canonical global;no mock flag;Node-signed seeded
event verifies;independent tampered event rejects;synthetic key derives expected pubkey;browser-produced signature
independently verifies with Node's real nostr-tools. No application/toolkit/crypto methods are replaced.
All3-card/UI assertions and genuine fixture/artifact/traffic pins remain unchanged.
Offline proof evaluated the genuine unchanged vendored bundle in a Node vm:callable APIs/sign/verify/tampered rejection/
pubkey match/independent Node verification6/6,exit0. Initial vm-preflight plumbing required a newline after the bundle
sourceMappingURL comment and creating challenge events in that vm's own realm;those probe setup errors were corrected
without library/app mutation. This proof does not qualify browser loader/global identity until actual run.
Prepared corrected runner SHA256731cc9073f3c6594fa2b77735cac34415f1f034729c2dc48dd3b5bf702592864,syntax-check0.
```yaml
test_integrity_note:
change_type: ["spec_correction"]
scope: "own scratch runner only; no registered test or product change"
scenarios:
- id: SCN-QA2-real-toolkit-readiness
given: "actual bootstrap resolves its frozen canonical toolkit, or an explicit failure"
when: "baseline checks readiness before real UI actions"
then: "require canonical real callable APIs and positive/negative synthetic cryptographic proofs"
observable_outcomes:
- "valid event verifies, tampered event rejects, actual generated signature independently verifies"
determinism_controls: ["fixed synthetic key/event; genuine vendored toolkit; no network or stubs"]
anti_cheat_rationale:
prevents: ["always-true verifier", "no-op signer", "mock toolkit mistaken for readiness"]
relaxation:
did_relax_any_assertion: true
if_true_explain_spec_basis: "Replaced invalid ok:true envelope assumption with source-defined actual toolkit contract and stronger crypto proofs; UI assertions unchanged."
```
## Corrected cryptographic readiness passed; zero-card setup failure
Dispatch15:47:12 approved corrected bounded rerun;START15:49:25 before launch.
Run15:49:29.399→15:49:48.277Z (18.878s),real local media wire200/200/206 passed,real canonical toolkit checks
all passed(including browser-produced signature independently verified). Next documented harness prerequisite
`waitForFeedItems(3,15000)` failed with0 cards. No login/navigation/modal/390/1280 checks executed.
Owned resources closed15:49:48.277Z;explicit RELEASE sent15:50:24Z. No app defect attribution or relaxed count/timeout.
Read-only source-backed setup gaps identified under dispatch15:50:54 route: `js/index.js:startApplication` assigns
`setApplication(application)` before awaiting `application.init()`/`application.start()`. Previous runner waited
for instance presence only;actual exported `getApplicationReady()` is the startup-completion boundary.
Also existing fixture explicitly reapplies `setTestRelays` after harness installation;runner relied only on initial
query/storage/install override. Install itself applies overrides,so absence of reapply is not claimed as sole cause.
Earlier seed-mode dev/live speculation was not supported by an observed filtering rule and is NOT attributed.
Cheap socket-free source ordering3/3 and genuine synthetic signature/filter match3/3 passed. Source subscription
filter kinds30078/#tvideo matches all3 inputs. This verifies fixture input/filter compatibility,not full-app hydration.
Routine authorized correction only awaits the real exported ready promise with15s bound and invokes existing
fixture relay API after readiness. Exact3-card count and15s card timer,UI assertions,artifact/fixture/Buffer pins
and external deny guard remain unchanged. Read-only failure diagnostics add actual relay health/feed count/body.
Source gap is proven;whether it caused the previous0 cards is not claimed without the next measured result.
Corrected prepared driver8fb7bad44a79bf4abfe9d7b4febdb64cc30dad30e78c2cd18dbb9da94c01f6dd,syntax0.
Saved zero-card result:
```json
{
"driver": "noninteractive bounded actions",
"started": "2026-10-20T15:49:29.399Z",
"mirrorHits": [
"https://cdn.jsdelivr.net/npm/[email protected]/+esm"
],
"blockedHttp": [
"https://esm.sh/@aws-sdk/[email protected]?bundle",
"https://cdn.jsdelivr.net/npm/[email protected]/+esm",
"https://esm.sh/[email protected]",
"https://esm.sh/[email protected]?target=es2022&exports=nip04",
"https://esm.sh/[email protected]/nip44?target=es2022",
"https://cdn.jsdelivr.net/npm/[email protected]/lib/nostr.bundle.min.js",
"https://cdn.jsdelivr.net/npm/[email protected]/lib/nostr.bundle.min.js",
"https://cdn.jsdelivr.net/npm/[email protected]/lib/nostr.bundle.min.js",
"https://cdn.jsdelivr.net/npm/[email protected]/lib/nostr.bundle.min.js",
"https://cdn.jsdelivr.net/npm/[email protected]/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": [
{
"name": "actual toolkit ready",
"at": "2026-10-20T15:49:32.995Z",
"result": {
"callable": true,
"canonicalIdentity": true,
"frozen": true,
"mockFlag": false,
"validSeed": true,
"tamperedRejected": true,
"pubkeyMatches": true,
"independentSignatureVerified": true
},
"ok": true
},
{
"name": "three synthetic relay cards hydrate",
"at": "2026-10-20T15:49:33.045Z",
"ok": false,
"error": "page.evaluate: Error: [testHarness] Timed out waiting for 3 feed items (found 0)\n at check (http://127.0.0.1:31847/js/testHarness.js:571:11)"
},
{
"screenshot": "playback-qa-2-resumed-stop.png"
}
],
"fixtureHttp": {
"head": 200,
"get": 200,
"range": 206,
"bytes": 1019,
"contentType": "video/webm"
},
"browserVersion": "154.0.8037.97",
"boot": "passed",
"baseline": "blocked-or-failed",
"failedStep": "three synthetic relay cards hydrate",
"failure": "page.evaluate: Error: [testHarness] Timed out waiting for 3 feed items (found 0)\n at check (http://127.0.0.1:31847/js/testHarness.js:571:11)",
"ended": "2026-10-20T15:49:48.277Z",
"resourcesClosed": true
}
```
## Startup-complete correction measured: still zero cards
Dispatch15:54:23 confirmed conditional route;START15:54:58 before browser.
Actual run15:55:01.326→15:55:18.667Z (17.341s) passed real toolkit cryptographic proofs,local media wire200/200/206,
and actual `getApplicationReady()` completion. Official existing `setTestRelays` returnedok and local31848.
Unchanged3-card15s wait still found0,so readiness correction is **not demonstrated as the cause/fix**.
Failure diagnostics:appPresent true,relayHealth.relays=[ws://127.0.0.1:31848],unreachable=[],backoff={},feedItems=[];
actual styled Trending page empty,version1834b6a9. These are configured health/cache observations,not proof of an
actual WS subscription or delivered EVENT/EOSE. That boundary was not traced in this run.
No login/nav/modal/remaining viewport action ran. No product defect is established. Resources closed15:55:18.667Z;
explicit RELEASE15:55:33Z. Screenshotplayback-qa-2-resumed-stop.png SHA256e065fd4216da5cefbc9bde4b5773a4bd3ac64e9aeb642996d936755482598fab.
Dispatch15:55:53 now routes narrow read-only boundary measurement,not more speculative corrections.
Interpreter15:55:45 identified missing canonical s tag. Cheap **actual source** validation confirms:
- validateEventStructure(videoPost,without s)→validfalse,Missing required tag for videoPost:s.
- Same real signed note plus[s,nostr:dTag]→validtrue.
- Actual convertEventToVideo returnsinvalidfalse for BOTH,so schema gap is real but not proven as feed failure cause.
No seed/runtime/assertion/browser change followed this probe. Both signatures and actual relayfilter match already passed.
The scratch seed differs from canonical existing fixture's s tag;this gap must remain explicit in fidelity claims.
Missing saved boundary evidence:actual localWS creation/REQfilters,relaymatching EVENT/EOSE traffic,then ingest and
render cachecounts. Proposed one diagnostic-only pass uses passive page websocket/frame listeners+warn/errors;
read-only rawEvents/allEvents/activeMap/appvideosMap counts and actualDOMcard selectors at first failure.
Original seed stays unchanged for measurement;no manual data injection,render invocation,health fakery,crypto stub,
new mirrors or timeout/count relaxation. Requires dispatch's explicit diagnostic grant before another browser.
Latest failed-run report:
```json
{
"driver": "noninteractive bounded actions",
"started": "2026-10-20T15:55:01.326Z",
"mirrorHits": [
"https://cdn.jsdelivr.net/npm/[email protected]/+esm"
],
"blockedHttp": [
"https://esm.sh/@aws-sdk/[email protected]?bundle",
"https://cdn.jsdelivr.net/npm/[email protected]/+esm",
"https://esm.sh/[email protected]",
"https://esm.sh/[email protected]?target=es2022&exports=nip04",
"https://esm.sh/[email protected]/nip44?target=es2022",
"https://cdn.jsdelivr.net/npm/[email protected]/lib/nostr.bundle.min.js",
"https://cdn.jsdelivr.net/npm/[email protected]/lib/nostr.bundle.min.js",
"https://cdn.jsdelivr.net/npm/[email protected]/lib/nostr.bundle.min.js",
"https://cdn.jsdelivr.net/npm/[email protected]/lib/nostr.bundle.min.js",
"https://cdn.jsdelivr.net/npm/[email protected]/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": [
{
"name": "actual toolkit ready",
"at": "2026-10-20T15:55:03.441Z",
"result": {
"callable": true,
"canonicalIdentity": true,
"frozen": true,
"mockFlag": false,
"validSeed": true,
"tamperedRejected": true,
"pubkeyMatches": true,
"independentSignatureVerified": true
},
"ok": true
},
{
"name": "actual application startup completes",
"at": "2026-10-20T15:55:03.484Z",
"result": {
"readyPromiseCompleted": true,
"relays": [
"ws://127.0.0.1:31848"
]
},
"ok": true
},
{
"name": "three synthetic relay cards hydrate",
"at": "2026-10-20T15:55:03.491Z",
"ok": false,
"error": "page.evaluate: Error: [testHarness] Timed out waiting for 3 feed items (found 0)\n at check (http://127.0.0.1:31847/js/testHarness.js:571:11)"
},
{
"screenshot": "playback-qa-2-resumed-stop.png"
}
],
"fixtureHttp": {
"head": 200,
"get": 200,
"range": 206,
"bytes": 1019,
"contentType": "video/webm"
},
"browserVersion": "154.0.8037.97",
"boot": "passed",
"baseline": "blocked-or-failed",
"failedStep": "three synthetic relay cards hydrate",
"failure": "page.evaluate: Error: [testHarness] Timed out waiting for 3 feed items (found 0)\n at check (http://127.0.0.1:31847/js/testHarness.js:571:11)",
"failureDiagnostics": {
"appPresent": true,
"relayHealth": {
"relays": [
"ws://127.0.0.1:31848"
],
"unreachable": [],
"backoff": {}
},
"feedItems": [],
"body": "Switch to dark theme\nTrending\n\nNo public videos available yet. Be the first to upload one!\n\nseed. zap. subscribe.\nv: 1834b6a9 \u2022 2026-10-20"
},
"ended": "2026-10-20T15:55:18.667Z",
"resourcesClosed": true
}
```
+1 -1
View File
@@ -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.