live-render-worker-ci-multiplayer.json
docs/evidence/live-render-worker-ci-multiplayer.json
1{
2 "source": "cace9811b9cc8d35d7821e1ca3513a5bdba3c262",
3 "run": 40158326952,
4 "job": 121064368852,
5 "url": "https://github.com/jasona/darkwind-web/actions/runs/40158326952",
6 "jobConclusion": "failure",
7 "suite": "multiplayer",
8 "stats": {
9 "startTime": "2026-10-25T03:28:58.873Z",
10 "duration": 370905.653,
11 "expected": 2,
12 "skipped": 0,
13 "unexpected": 4,
14 "flaky": 0
15 },
16 "failures": [
17 "two real browsers share doors and chat, then the guest takes over when the host leaves",
18 "travelers see each other move in the rendered world",
19 "rigged travelers walk, settle when pose delivery stalls, and resume without leaking actors",
20 "graphics recovery keeps the shared room and receives door changes during restoration"
21 ],
22 "observedBoundaries": [
23 "Three scenarios waited 30 seconds for Enter to become enabled.",
24 "The retained mover panel in the walking-stall scenario reports the room startup deadline.",
25 "Shared recovery reached failed and its panel reports Graphics recovery timed out."
26 ],
27 "reports": {
28 "motion-failed-observer-events.json": {
29 "at": 33746.59999999998,
30 "panel": "",
31 "metrics": "Engine0.1.0RendererOwned WebGPURender placementworkerPresentationCanonical ECSCanonical entities1481Rigged travelers0Walking travelers0Stalled travelers0Motion samples0PhysicsRapier 0.21.0Placelantern-houseSimulation1.00 ms / 30 HzFrame interval p502449.9 msFrame interval p952799.9 msRender CPU1.30 msFrames submitted / completed12 / 11Pending GPU frames1Frames skipped while busy1755Queue notification wait2502.1 msLongest queue wait2799.7 msLast completed frame age2736 msInstances674Visible / shadow instances562 / 378Triangles47,016Draw calls9GPU buffers / textures53 / 4Target texels (estimate)23.0 MiBRender passesshadow \u2192 scene \u2192 postShader revision1Graphics recoveries0Render size960 \u00d7 640Position0.00, 0.74, 4.80RoomconnectedPlayers1Authority epoch9Room revision4RoleRoom hostPersistenceRelay checkpoint",
32 "graphicsPlacement": "worker",
33 "graphics": {
34 "at": 33357.5,
35 "probe": {
36 "origin": 1792899109090.8,
37 "graphics": [
38 {
39 "at": 90,
40 "kind": "device-request",
41 "adapter": {
42 "vendor": "google",
43 "architecture": "swiftshader",
44 "device": "",
45 "description": ""
46 }
47 },
48 {
49 "at": 91.10000000003492,
50 "kind": "device-ready"
51 }
52 ],
53 "queue": [
54 {
55 "at": 278.29999999998836,
56 "kind": "complete",
57 "queue": 1,
58 "start": 278.1000000000349,
59 "wait": 0.19999999995343387
60 },
61 {
62 "at": 690.1000000000349,
63 "kind": "complete",
64 "queue": 1,
65 "start": 689.4000000000233,
66 "wait": 0.7000000000116415
67 },
68 {
69 "at": 1476,
70 "kind": "submit",
71 "queue": 1,
72 "start": 1474.100000000035,
73 "duration": 1.8999999999650754
74 },
75 {
76 "at": 4150.100000000035,
77 "kind": "complete",
78 "queue": 1,
79 "start": 1476,
80 "wait": 2674.100000000035
81 },
82 {
83 "at": 4164.200000000012,
84 "kind": "submit",
85 "queue": 1,
86 "start": 4164.200000000012,
87 "duration": 0
88 },
89 {
90 "at": 6257.299999999988,
91 "kind": "complete",
92 "queue": 1,
93 "start": 4164.200000000012,
94 "wait": 2093.0999999999767
95 },
96 {
97 "at": 6259.900000000023,
98 "kind": "submit",
99 "queue": 1,
100 "start": 6259.900000000023,
101 "duration": 0
102 },
103 {
104 "at": 8701.400000000023,
105 "kind": "complete",
106 "queue": 1,
107 "start": 6259.900000000023,
108 "wait": 2441.5
109 },
110 {
111 "at": 8708,
112 "kind": "submit",
113 "queue": 1,
114 "start": 8707.900000000023,
115 "duration": 0.09999999997671694
116 },
117 {
118 "at": 11092.900000000023,
119 "kind": "complete",
120 "queue": 1,
121 "start": 8708,
122 "wait": 2384.9000000000233
123 },
124 {
125 "at": 11107.900000000023,
126 "kind": "submit",
127 "queue": 1,
128 "start": 11107.900000000023,
129 "duration": 0
130 },
131 {
132 "at": 13369.600000000035,
133 "kind": "complete",
134 "queue": 1,
135 "start": 11107.900000000023,
136 "wait": 2261.7000000000116
137 },
138 {
139 "at": 13384.200000000012,
140 "kind": "submit",
141 "queue": 1,
142 "start": 13379.900000000023,
143 "duration": 4.2999999999883585
144 },
145 {
146 "at": 15733,
147 "kind": "complete",
148 "queue": 1,
149 "start": 13384.200000000012,
150 "wait": 2348.7999999999884
151 },
152 {
153 "at": 15749.799999999988,
154 "kind": "submit",
155 "queue": 1,
156 "start": 15749.700000000012,
157 "duration": 0.09999999997671694
158 },
159 {
160 "at": 18549.5,
161 "kind": "complete",
162 "queue": 1,
163 "start": 15749.799999999988,
164 "wait": 2799.7000000000116
165 },
166 {
167 "at": 18563.79999999999,
168 "kind": "submit",
169 "queue": 1,
170 "start": 18563.79999999999,
171 "duration": 0
172 },
173 {
174 "at": 21239.600000000035,
175 "kind": "complete",
176 "queue": 1,
177 "start": 18563.900000000023,
178 "wait": 2675.7000000000116
179 },
180 {
181 "at": 21251.70000000001,
182 "kind": "submit",
183 "queue": 1,
184 "start": 21251.70000000001,
185 "duration": 0
186 },
187 {
188 "at": 23918.5,
189 "kind": "complete",
190 "queue": 1,
191 "start": 21251.70000000001,
192 "wait": 2666.7999999999884
193 },
194 {
195 "at": 23923.70000000001,
196 "kind": "submit",
197 "queue": 1,
198 "start": 23923.600000000035,
199 "duration": 0.09999999997671694
200 },
201 {
202 "at": 26722.79999999999,
203 "kind": "complete",
204 "queue": 1,
205 "start": 23923.70000000001,
206 "wait": 2799.0999999999767
207 },
208 {
209 "at": 26739.70000000001,
210 "kind": "submit",
211 "queue": 1,
212 "start": 26739.70000000001,
213 "duration": 0
214 },
215 {
216 "at": 29241.79999999999,
217 "kind": "complete",
218 "queue": 1,
219 "start": 26739.70000000001,
220 "wait": 2502.0999999999767
221 },
222 {
223 "at": 29253.100000000035,
224 "kind": "submit",
225 "queue": 1,
226 "start": 29253.100000000035,
227 "duration": 0
228 },
229 {
230 "at": 31582.70000000001,
231 "kind": "complete",
232 "queue": 1,
233 "start": 29253.100000000035,
234 "wait": 2329.5999999999767
235 },
236 {
237 "at": 31588.100000000035,
238 "kind": "submit",
239 "queue": 1,
240 "start": 31588.100000000035,
241 "duration": 0
242 }
243 ]
244 }
245 },
246 "pageTiming": {
247 "origin": 1792899108581.6,
248 "maxFrameGap": 3274.7000000000116,
249 "maxWorkerGap": 2715,
250 "maxTimerGap": 4520.099999999977,
251 "maxLongTask": 2712
252 }
253 },
254 "motion-failed-mover-events.json": {
255 "at": 31745,
256 "panel": "A moment by the fireA light went out.The world has paused safely. Your last local save is kept. You can retry without starting over.The room took too long to start. Check the local relay and retry.Try again This build needs WebGPU on a desktop browser. Localhost or HTTPS is required.",
257 "metrics": "",
258 "graphicsPlacement": "main",
259 "graphics": {
260 "at": 31769.900000000023,
261 "probe": {
262 "origin": 1792899110762.4,
263 "graphics": [],
264 "queue": []
265 }
266 },
267 "pageTiming": {
268 "origin": 1792899110762.4,
269 "maxFrameGap": 2411.2000000000116,
270 "maxWorkerGap": 0,
271 "maxTimerGap": 242.79999999998836,
272 "maxLongTask": 69
273 }
274 },
275 "motion-failed-report.json": {
276 "renderPlacement": "worker",
277 "renderObservedAtMs": 34118.29999999999,
278 "render": {
279 "instances": 674,
280 "triangles": 47016,
281 "visibleInstances": 562,
282 "shadowInstances": 378,
283 "visibleTriangles": 40560,
284 "shadowTriangles": 30732,
285 "drawCalls": 9,
286 "buffers": 53,
287 "textures": 4,
288 "targetBytes": 24150016,
289 "targetGeneration": 1,
290 "width": 960,
291 "height": 640,
292 "frameMs": 1.7000000000116415,
293 "submittedFrames": 13,
294 "completedFrames": 12,
295 "failedFrames": 0,
296 "cancelledFrames": 0,
297 "pendingFrames": 1,
298 "skippedFrames": 1892,
299 "completionWaitMs": 2329.5999999999767,
300 "maxCompletionWaitMs": 2799.7000000000116,
301 "lastSubmittedAtMs": 32097.29995117191,
302 "lastCompletedAtMs": 32091.899951171887
303 },
304 "graphicsRecovery": {
305 "status": "idle",
306 "attempts": 0,
307 "limit": 2,
308 "timeoutMs": 20000,
309 "inFlight": false
310 },
311 "graphicsIncidents": [],
312 "room": {
313 "status": "connected",
314 "players": 1,
315 "epoch": "9",
316 "revision": "4"
317 },
318 "tick": "1059"
319 },
320 "recovery-failed-observer-events.json": {
321 "at": 59126.79999999999,
322 "panel": "A moment by the fireA light went out.The world has paused safely. Your last local save is kept. You can retry without starting over.Graphics recovery timed out. Your saved place is kept.Try again This build needs WebGPU on a desktop browser. Localhost or HTTPS is required.",
323 "metrics": "Engine0.1.0RendererOwned WebGPURender placementworkerPresentationCanonical ECSCanonical entities1482Rigged travelers0Walking travelers0Stalled travelers0Motion samples0PhysicsRapier 0.21.0Placelantern-houseSimulation0.00 ms / 30 HzFrame interval p502366.6 msFrame interval p952633.2 msRender CPU0.00 msFrames submitted / completed0 / 0Pending GPU frames0Frames skipped while busy0Queue notification wait0.0 msLongest queue wait0.0 msLast completed frame ageNo completed frameInstances0Visible / shadow instances0 / 0Triangles0Draw calls0GPU buffers / textures53 / 1Target texels (estimate)0.0 MiBRender passesshadow \u2192 scene \u2192 postShader revision1Graphics recoveries1Render size0 \u00d7 0Position0.00, 0.74, -4.65RoomconnectedPlayers2Authority epoch14Room revision5RoleRoom hostPersistenceRelay checkpoint",
324 "graphicsPlacement": "main",
325 "graphics": {
326 "at": 59280.79999999999,
327 "probe": {
328 "origin": 1792899234578.4,
329 "graphics": [],
330 "queue": []
331 }
332 },
333 "pageTiming": {
334 "origin": 1792899234578.4,
335 "maxFrameGap": 3299,
336 "maxWorkerGap": 2467.2000000000116,
337 "maxTimerGap": 2523.100000000035,
338 "maxLongTask": 2451
339 }
340 },
341 "recovery-failed-peer-events.json": {
342 "at": 60912,
343 "panel": "",
344 "metrics": "Engine0.1.0RendererOwned WebGPURender placementworkerPresentationCanonical ECSCanonical entities1482Rigged travelers1Walking travelers0Stalled travelers0Motion samples8PhysicsRapier 0.21.0Placelantern-houseSimulation0.40 ms / 30 HzFrame interval p502583.3 msFrame interval p953349.9 msRender CPU8.50 msFrames submitted / completed13 / 12Pending GPU frames1Frames skipped while busy2348Queue notification wait2961.3 msLongest queue wait4950.4 msLast completed frame age3434 msInstances685Visible / shadow instances98 / 388Triangles75,232Draw calls19GPU buffers / textures53 / 4Target texels (estimate)23.0 MiBRender passesshadow \u2192 scene \u2192 postShader revision1Graphics recoveries0Render size960 \u00d7 640Position0.60, 0.75, -4.65RoomconnectedPlayers2Authority epoch14Room revision5RoleGuestPersistenceRelay checkpoint",
345 "graphicsPlacement": "worker",
346 "graphics": {
347 "at": 60484.70000000001,
348 "probe": {
349 "origin": 1792899237403.4,
350 "graphics": [
351 {
352 "at": 3824.7000000000116,
353 "kind": "device-request",
354 "adapter": {
355 "vendor": "google",
356 "architecture": "swiftshader",
357 "device": "",
358 "description": ""
359 }
360 },
361 {
362 "at": 6213.299999999988,
363 "kind": "device-ready"
364 }
365 ],
366 "queue": [
367 {
368 "at": 12763.5,
369 "kind": "complete",
370 "queue": 1,
371 "start": 12756.599999999977,
372 "wait": 6.900000000023283
373 },
374 {
375 "at": 15245.799999999988,
376 "kind": "complete",
377 "queue": 1,
378 "start": 15243.200000000012,
379 "wait": 2.599999999976717
380 },
381 {
382 "at": 18367.70000000001,
383 "kind": "submit",
384 "queue": 1,
385 "start": 18367.70000000001,
386 "duration": 0
387 },
388 {
389 "at": 23318,
390 "kind": "complete",
391 "queue": 1,
392 "start": 18367.70000000001,
393 "wait": 4950.299999999988
394 },
395 {
396 "at": 23337.900000000023,
397 "kind": "submit",
398 "queue": 1,
399 "start": 23337.900000000023,
400 "duration": 0
401 },
402 {
403 "at": 25744.900000000023,
404 "kind": "complete",
405 "queue": 1,
406 "start": 23337.900000000023,
407 "wait": 2407
408 },
409 {
410 "at": 25768.70000000001,
411 "kind": "submit",
412 "queue": 1,
413 "start": 25768.70000000001,
414 "duration": 0
415 },
416 {
417 "at": 27855.400000000023,
418 "kind": "complete",
419 "queue": 1,
420 "start": 25768.70000000001,
421 "wait": 2086.7000000000116
422 },
423 {
424 "at": 27872.599999999977,
425 "kind": "submit",
426 "queue": 1,
427 "start": 27863.900000000023,
428 "duration": 8.699999999953434
429 },
430 {
431 "at": 30303.900000000023,
432 "kind": "complete",
433 "queue": 1,
434 "start": 27872.599999999977,
435 "wait": 2431.3000000000466
436 },
437 {
438 "at": 30317.70000000001,
439 "kind": "submit",
440 "queue": 1,
441 "start": 30317.70000000001,
442 "duration": 0
443 },
444 {
445 "at": 33030.59999999998,
446 "kind": "complete",
447 "queue": 1,
448 "start": 30317.70000000001,
449 "wait": 2712.899999999965
450 },
451 {
452 "at": 33053.59999999998,
453 "kind": "submit",
454 "queue": 1,
455 "start": 33053.59999999998,
456 "duration": 0
457 },
458 {
459 "at": 36251.79999999999,
460 "kind": "complete",
461 "queue": 1,
462 "start": 33053.59999999998,
463 "wait": 3198.2000000000116
464 },
465 {
466 "at": 36267.20000000001,
467 "kind": "submit",
468 "queue": 1,
469 "start": 36267.20000000001,
470 "duration": 0
471 },
472 {
473 "at": 39617.40000000002,
474 "kind": "complete",
475 "queue": 1,
476 "start": 36267.20000000001,
477 "wait": 3350.2000000000116
478 },
479 {
480 "at": 39640.29999999999,
481 "kind": "submit",
482 "queue": 1,
483 "start": 39623,
484 "duration": 17.29999999998836
485 },
486 {
487 "at": 42665,
488 "kind": "complete",
489 "queue": 1,
490 "start": 39640.29999999999,
491 "wait": 3024.7000000000116
492 },
493 {
494 "at": 42690.59999999998,
495 "kind": "submit",
496 "queue": 1,
497 "start": 42690.59999999998,
498 "duration": 0
499 },
500 {
501 "at": 45215.20000000001,
502 "kind": "complete",
503 "queue": 1,
504 "start": 42690.59999999998,
505 "wait": 2524.600000000035
506 },
507 {
508 "at": 45229.79999999999,
509 "kind": "submit",
510 "queue": 1,
511 "start": 45229.70000000001,
512 "duration": 0.09999999997671694
513 },
514 {
515 "at": 49980.09999999998,
516 "kind": "complete",
517 "queue": 1,
518 "start": 45229.79999999999,
519 "wait": 4750.299999999988
520 },
521 {
522 "at": 49995.09999999998,
523 "kind": "submit",
524 "queue": 1,
525 "start": 49995.09999999998,
526 "duration": 0
527 },
528 {
529 "at": 52565,
530 "kind": "complete",
531 "queue": 1,
532 "start": 49995.09999999998,
533 "wait": 2569.9000000000233
534 },
535 {
536 "at": 52583.70000000001,
537 "kind": "submit",
538 "queue": 1,
539 "start": 52583.59999999998,
540 "duration": 0.1000000000349246
541 },
542 {
543 "at": 55545,
544 "kind": "complete",
545 "queue": 1,
546 "start": 52583.70000000001,
547 "wait": 2961.2000000000116
548 },
549 {
550 "at": 55563.5,
551 "kind": "submit",
552 "queue": 1,
553 "start": 55563.5,
554 "duration": 0
555 },
556 {
557 "at": 58470.29999999999,
558 "kind": "complete",
559 "queue": 1,
560 "start": 55563.59999999998,
561 "wait": 2906.600000000035
562 },
563 {
564 "at": 58490.79999999999,
565 "kind": "submit",
566 "queue": 1,
567 "start": 58490.79999999999,
568 "duration": 0
569 }
570 ]
571 }
572 },
573 "pageTiming": {
574 "origin": 1792899236772.7,
575 "maxFrameGap": 5296.300000000047,
576 "maxWorkerGap": 3464.2999999999884,
577 "maxTimerGap": 5954.700000000012,
578 "maxLongTask": 3430
579 }
580 },
581 "recovery-failed-report.json": {
582 "renderPlacement": null,
583 "renderObservedAtMs": 63384.5,
584 "render": null,
585 "graphicsRecovery": {
586 "status": "failed",
587 "attempts": 1,
588 "limit": 2,
589 "timeoutMs": 20000,
590 "inFlight": false
591 },
592 "graphicsIncidents": [
593 {
594 "atMs": 27316.899999999965,
595 "kind": "device-lost",
596 "reason": "Device was destroyed.",
597 "render": {
598 "instances": 0,
599 "triangles": 0,
600 "visibleInstances": 0,
601 "shadowInstances": 0,
602 "visibleTriangles": 0,
603 "shadowTriangles": 0,
604 "drawCalls": 0,
605 "buffers": 0,
606 "textures": 0,
607 "targetBytes": 0,
608 "targetGeneration": 1,
609 "width": 960,
610 "height": 640,
611 "frameMs": 16.70000000001164,
612 "submittedFrames": 10,
613 "completedFrames": 9,
614 "failedFrames": 0,
615 "cancelledFrames": 1,
616 "pendingFrames": 0,
617 "skippedFrames": 1502,
618 "completionWaitMs": 2623.8000000000466,
619 "maxCompletionWaitMs": 2830.0999999999767,
620 "lastSubmittedAtMs": 23558.200146484363,
621 "lastCompletedAtMs": 23531.400146484375
622 }
623 }
624 ],
625 "room": {
626 "status": "connected",
627 "players": 2,
628 "epoch": "14",
629 "revision": "5"
630 },
631 "tick": "855"
632 }
633 },
634 "limitations": [
635 "The root cause of startup and recovery delays is unproven. These are not equivalent to the older 64-second screenshot failure.",
636 "The old runtime helper falls back to evaluating the page after its graphics worker has terminated; graphicsPlacement=main in a failure attachment does not prove main-thread renderer fallback.",
637 "These results predate the direct MessagePort channel. Local direct-channel passes do not establish remote resolution."
638 ]
639}
640