parallel-startup-ci-multiplayer.json
docs/evidence/parallel-startup-ci-multiplayer.json
1{
2 "source": "4f85246c982d18a4b43cf525de7374997c61a57b",
3 "run": "https://github.com/jasona/darkwind-web/actions/runs/40159823500",
4 "job": 121068842452,
5 "conclusion": "failure",
6 "stats": {
7 "startTime": "2026-10-25T03:53:26.737Z",
8 "duration": 374980.544,
9 "expected": 0,
10 "skipped": 0,
11 "unexpected": 7,
12 "flaky": 0
13 },
14 "failures": [
15 {
16 "scenario": "two real browsers share doors and chat, then the guest takes over when the host leaves",
17 "status": "failed",
18 "error": "Error: expect(locator).toBeEnabled() failed\n\nLocator: locator('#enter')\nExpected: enabled\nReceived: disabled\nTimeout: 30000ms\n\nCall log:\n - Expect \"toBeEnabled\" with timeout 30000ms\n - waiting for locator('#enter')\n 31 \u00d7 locator resolved to <button disabled id=\"enter\" class=\"primary\">\u2026</button>\n - unexpected value \"disabled\"\n"
19 },
20 {
21 "scenario": "simultaneous real-browser pickups grant one lantern, including across host handoff",
22 "status": "failed",
23 "error": "Error: expect(locator).toBeEnabled() failed\n\nLocator: locator('#enter')\nExpected: enabled\nReceived: disabled\nTimeout: 30000ms\n\nCall log:\n - Expect \"toBeEnabled\" with timeout 30000ms\n - waiting for locator('#enter')\n 32 \u00d7 locator resolved to <button disabled id=\"enter\" class=\"primary\">\u2026</button>\n - unexpected value \"disabled\"\n"
24 },
25 {
26 "scenario": "travelers see each other move in the rendered world",
27 "status": "failed",
28 "error": "Error: expect(locator).toBeEnabled() failed\n\nLocator: locator('#enter')\nExpected: enabled\nReceived: disabled\nTimeout: 30000ms\n\nCall log:\n - Expect \"toBeEnabled\" with timeout 30000ms\n - waiting for locator('#enter')\n 30 \u00d7 locator resolved to <button disabled id=\"enter\" class=\"primary\">\u2026</button>\n - unexpected value \"disabled\"\n"
29 },
30 {
31 "scenario": "rigged travelers walk, settle when pose delivery stalls, and resume without leaking actors",
32 "status": "failed",
33 "error": "Error: expect(locator).toBeEnabled() failed\n\nLocator: locator('#enter')\nExpected: enabled\nReceived: disabled\nTimeout: 30000ms\n\nCall log:\n - Expect \"toBeEnabled\" with timeout 30000ms\n - waiting for locator('#enter')\n 32 \u00d7 locator resolved to <button disabled id=\"enter\" class=\"primary\">\u2026</button>\n - unexpected value \"disabled\"\n"
34 },
35 {
36 "scenario": "travelers keep walking with slow GPU completion and settle when real movement stops",
37 "status": "failed",
38 "error": "Error: expect(locator).toBeEnabled() failed\n\nLocator: locator('#enter')\nExpected: enabled\nReceived: disabled\nTimeout: 30000ms\n\nCall log:\n - Expect \"toBeEnabled\" with timeout 30000ms\n - waiting for locator('#enter')\n 31 \u00d7 locator resolved to <button disabled id=\"enter\" class=\"primary\">\u2026</button>\n - unexpected value \"disabled\"\n"
39 },
40 {
41 "scenario": "graphics recovery keeps the shared room and receives door changes during restoration",
42 "status": "failed",
43 "error": "Error: expect(locator).toBeEnabled() failed\n\nLocator: locator('#enter')\nExpected: enabled\nReceived: disabled\nTimeout: 30000ms\n\nCall log:\n - Expect \"toBeEnabled\" with timeout 30000ms\n - waiting for locator('#enter')\n 32 \u00d7 locator resolved to <button disabled id=\"enter\" class=\"primary\">\u2026</button>\n - unexpected value \"disabled\"\n"
44 },
45 {
46 "scenario": "direct scenes advance during withheld UI receipts and a blocked page task",
47 "status": "failed",
48 "error": "Error: expect(locator).toBeEnabled() failed\n\nLocator: locator('#enter')\nExpected: enabled\nReceived: disabled\nTimeout: 30000ms\n\nCall log:\n - Expect \"toBeEnabled\" with timeout 30000ms\n - waiting for locator('#enter')\n 31 \u00d7 locator resolved to <button disabled id=\"enter\" class=\"primary\">\u2026</button>\n - unexpected value \"disabled\"\n"
49 }
50 ],
51 "observerReports": {
52 "motion-failed-report.json": {
53 "startupStages": {
54 "started": 163.89999999999418,
55 "admission": 339.8999999999942,
56 "graphics": 3615.4000000000233,
57 "simulation": 2013.4000000000233,
58 "presentation": 3620.5999999999767,
59 "room": 2042,
60 "ready": 3620.7000000000116,
61 "failed": null
62 },
63 "graphicsLifecycle": [
64 {
65 "stage": "probe",
66 "generation": 0,
67 "at": 165
68 },
69 {
70 "stage": "device",
71 "generation": 1,
72 "at": 1370.90004882816
73 },
74 {
75 "stage": "catalog",
76 "generation": 1,
77 "at": 1963.7000488281483
78 },
79 {
80 "stage": "actors",
81 "generation": 1,
82 "at": 3000.90004882816
83 },
84 {
85 "stage": "ready",
86 "generation": 1,
87 "at": 3614.40004882816
88 }
89 ],
90 "renderPlacement": "worker",
91 "graphicsRecovery": {
92 "status": "idle",
93 "attempts": 0,
94 "limit": 2,
95 "timeoutMs": 20000,
96 "inFlight": false
97 },
98 "room": {
99 "status": "connected",
100 "players": 1,
101 "epoch": "7",
102 "revision": "0"
103 }
104 },
105 "slow-render-failed-report.json": {
106 "startupStages": {
107 "started": 156.59999999997672,
108 "admission": 378.3999999999651,
109 "graphics": 3685,
110 "simulation": 2004.6999999999534,
111 "presentation": 3695.5,
112 "room": 2023.5999999999767,
113 "ready": 3695.5,
114 "failed": null
115 },
116 "graphicsLifecycle": [
117 {
118 "stage": "probe",
119 "generation": 0,
120 "at": 157.79999999998836
121 },
122 {
123 "stage": "device",
124 "generation": 1,
125 "at": 1347.1999023437384
126 },
127 {
128 "stage": "catalog",
129 "generation": 1,
130 "at": 1915.299902343715
131 },
132 {
133 "stage": "actors",
134 "generation": 1,
135 "at": 2961.6999023437384
136 },
137 {
138 "stage": "ready",
139 "generation": 1,
140 "at": 3683.9999023437267
141 }
142 ],
143 "renderPlacement": "worker",
144 "graphicsRecovery": {
145 "status": "idle",
146 "attempts": 0,
147 "limit": 2,
148 "timeoutMs": 20000,
149 "inFlight": false
150 },
151 "room": {
152 "status": "connected",
153 "players": 1,
154 "epoch": "9",
155 "revision": "0"
156 }
157 },
158 "recovery-failed-report.json": {
159 "startupStages": {
160 "started": 164.79999999998836,
161 "admission": 392.29999999998836,
162 "graphics": 3630.6999999999534,
163 "simulation": 2005.399999999965,
164 "presentation": 3637.0999999999767,
165 "room": 2020,
166 "ready": 3637.0999999999767,
167 "failed": null
168 },
169 "graphicsLifecycle": [
170 {
171 "stage": "probe",
172 "generation": 0,
173 "at": 166.39999999996508
174 },
175 {
176 "stage": "device",
177 "generation": 1,
178 "at": 1348.5001464843517
179 },
180 {
181 "stage": "catalog",
182 "generation": 1,
183 "at": 1976.900146484375
184 },
185 {
186 "stage": "actors",
187 "generation": 1,
188 "at": 2999.30014648434
189 },
190 {
191 "stage": "ready",
192 "generation": 1,
193 "at": 3630.0001464843517
194 }
195 ],
196 "renderPlacement": "worker",
197 "graphicsRecovery": {
198 "status": "idle",
199 "attempts": 0,
200 "limit": 2,
201 "timeoutMs": 20000,
202 "inFlight": false
203 },
204 "room": {
205 "status": "connected",
206 "players": 1,
207 "epoch": "11",
208 "revision": "0"
209 }
210 }
211 },
212 "interpretation": "All seven cases fail at Enter. Exported reports belong to the already-running observer: they confirm simulation and room precede graphics readiness there. They do not identify the failing second client graphics phase. Do not claim parallel startup closes remote reliability.",
213 "nextEvidence": "Capture the playtest report on the actual failed Enter page, including startupStages and graphicsLifecycle, before context teardown.",
214 "otherJobsAtObservation": {
215 "core": "success",
216 "container": "success",
217 "probe": "in_progress",
218 "player": "in_progress"
219 }
220}
221