parallel-startup-acceptance.json
docs/evidence/parallel-startup-acceptance.json
1{
2 "sourceBase": "9af1ebb7d4c4dd6f254a415aa1c13555bb713268",
3 "sourceFilesSha256": {
4 "apps/player/graphics-protocol.ts": "c4b771bab253abb5a57a43f57d849b7daea30464745ae0d62e2898b2cd2e3005",
5 "apps/player/graphics.ts": "f1a1de963e432ed7133f0589374c75b0840ab66606c490c845d2fb993b839435",
6 "apps/player/graphics.worker.ts": "c7e53e61970cfb22d9b4509f77811d4a2fa314703b65e47d76a68bad4756058c",
7 "apps/player/main.ts": "1d416013e0543d64238438a51012524b20679b096ba43eb929a835ab60949553",
8 "apps/player/simulation.worker.ts": "ce32574acf5a6c082610ec48c2eb6bdc25830a12947f342d9dfe956e0c6541c0",
9 "tests/browser/player.spec.ts": "e20d159fdec516997b2bce4afdf73217a82583f5418fde785da745bcafebed54"
10 },
11 "scope": "Parallel graphics and admission/simulation startup; late single presentation binding; bounded lifecycle diagnostics; admission failure, initial deadline and late native-device cleanup.",
12 "headless": {
13 "passed": 334,
14 "failed": 0,
15 "skipped": 0
16 },
17 "checks": {
18 "typecheck": true,
19 "sourceBoundaries": 74,
20 "worlds": [
21 {
22 "world": "darkwind",
23 "release": "lantern-house.1",
24 "places": 3,
25 "objects": 1480,
26 "sha256": "e900a87c1854ad85a8bdc79953bd3e4d4b64f7b15a1451da8209609c2b504888"
27 },
28 {
29 "world": "engine-zoo",
30 "release": "motor.1",
31 "places": 1,
32 "objects": 6,
33 "sha256": "9facac25f35d9a16926052dbcc41fa12d5164ae891528e3a5ff62010c9f5a9cb"
34 }
35 ]
36 },
37 "browser": {
38 "command": "CI=1 PLAYWRIGHT_EXECUTABLE_PATH=/tmp/dw-browser-test/chrome-linux/headless_shell npm run test:browser -- tests/browser/player.spec.ts tests/browser/multiplayer.spec.ts",
39 "initialFullStats": {
40 "startTime": "2026-10-25T03:45:52.439Z",
41 "duration": 364421.80000000005,
42 "expected": 32,
43 "skipped": 0,
44 "unexpected": 1,
45 "flaky": 0
46 },
47 "scenarios": [
48 {
49 "name": "two real browsers share doors and chat, then the guest takes over when the host leaves",
50 "status": "passed",
51 "durationMs": 12835
52 },
53 {
54 "name": "simultaneous real-browser pickups grant one lantern, including across host handoff",
55 "status": "passed",
56 "durationMs": 42254
57 },
58 {
59 "name": "travelers see each other move in the rendered world",
60 "status": "passed",
61 "durationMs": 13178
62 },
63 {
64 "name": "rigged travelers walk, settle when pose delivery stalls, and resume without leaking actors",
65 "status": "passed",
66 "durationMs": 26991
67 },
68 {
69 "name": "travelers keep walking with slow GPU completion and settle when real movement stops",
70 "status": "passed",
71 "durationMs": 18385
72 },
73 {
74 "name": "graphics recovery keeps the shared room and receives door changes during restoration",
75 "status": "passed",
76 "durationMs": 17740
77 },
78 {
79 "name": "direct scenes advance during withheld UI receipts and a blocked page task",
80 "status": "passed",
81 "durationMs": 13649
82 },
83 {
84 "name": "shared startup restores simulation before held worker graphics become ready",
85 "status": "passed",
86 "durationMs": 4303
87 },
88 {
89 "name": "shared startup restores simulation before held main graphics become ready",
90 "status": "passed",
91 "durationMs": 3175
92 },
93 {
94 "name": "rejected admission cancels startup with held worker graphics",
95 "status": "passed",
96 "durationMs": 849
97 },
98 {
99 "name": "rejected admission cancels startup with held main graphics",
100 "status": "passed",
101 "durationMs": 717
102 },
103 {
104 "name": "startup deadline closes an admitted simulation while initial graphics remain held",
105 "status": "passed",
106 "durationMs": 21115
107 },
108 {
109 "name": "world pixel checks use completed presentation and reject an invisible canvas despite visible UI",
110 "status": "passed",
111 "durationMs": 3144
112 },
113 {
114 "name": "slow GPU completion keeps one pending frame, responsive controls and measured recovery",
115 "status": "passed",
116 "durationMs": 9206
117 },
118 {
119 "name": "main fallback canonical ECS frames stay bounded while acknowledgements stall and then catch up",
120 "status": "failed",
121 "durationMs": 3106
122 },
123 {
124 "name": "new checkpoints save without animation frames",
125 "status": "passed",
126 "durationMs": 6129
127 },
128 {
129 "name": "restored checkpoints save without animation frames",
130 "status": "passed",
131 "durationMs": 3900
132 },
133 {
134 "name": "held movement and keyboard look continue without animation frames and release on pause",
135 "status": "passed",
136 "durationMs": 6417
137 },
138 {
139 "name": "front lawn supports leaving the porch and walking back up",
140 "status": "passed",
141 "durationMs": 12990
142 },
143 {
144 "name": "renders, walks, pauses, releases input, and restores the local checkpoint",
145 "status": "passed",
146 "durationMs": 14286
147 },
148 {
149 "name": "keeper dialogue pauses movement and updates the journal",
150 "status": "passed",
151 "durationMs": 5278
152 },
153 {
154 "name": "place travel, pickup conditions, beacon state, and render resources remain coherent",
155 "status": "passed",
156 "durationMs": 11706
157 },
158 {
159 "name": "unsupported GPU and malformed saves fail safely",
160 "status": "passed",
161 "durationMs": 3665
162 },
163 {
164 "name": "legacy saves are preserved while exact uint64 saves advance and reload from the new key",
165 "status": "passed",
166 "durationMs": 11061
167 },
168 {
169 "name": "graphics recovery preserves the world, releases held movement and bounds repeated losses",
170 "status": "passed",
171 "durationMs": 19836
172 },
173 {
174 "name": "graphics recovery reports a failed replacement and preserves the paused save",
175 "status": "passed",
176 "durationMs": 4503
177 },
178 {
179 "name": "graphics placement falls back when canvas-transfer is unavailable",
180 "status": "passed",
181 "durationMs": 7801
182 },
183 {
184 "name": "graphics placement falls back when worker-construction is unavailable",
185 "status": "passed",
186 "durationMs": 7439
187 },
188 {
189 "name": "graphics placement falls back when worker-gpu is unavailable",
190 "status": "passed",
191 "durationMs": 7878
192 },
193 {
194 "name": "render worker continues completed frames while page animation frames are withheld",
195 "status": "passed",
196 "durationMs": 6328
197 },
198 {
199 "name": "render worker crash releases ownership and preserves the local journey",
200 "status": "passed",
201 "durationMs": 6884
202 },
203 {
204 "name": "silent render worker reaches its deadline and releases the transferred canvas owner",
205 "status": "passed",
206 "durationMs": 25101
207 },
208 {
209 "name": "direct scene pressure leaves accepted state and autosaves responsive",
210 "status": "passed",
211 "durationMs": 9125
212 }
213 ],
214 "finalFollowup": {
215 "command": "npm run test:browser -- tests/browser/player.spec.ts --grep main.fallback.canonical",
216 "stats": {
217 "startTime": "2026-10-25T03:52:05.027Z",
218 "duration": 6327.912,
219 "expected": 1,
220 "skipped": 0,
221 "unexpected": 0,
222 "flaky": 0
223 },
224 "reason": "Parallel startup can emit UI state before graphics binding. The original test held that first state and incorrectly expected a presentation buffer. The corrected test holds the first actual scene packet, verifies no further combined frame escapes, checks native buffer detachment/return and verifies movement catchup. No production code changed after the full run began."
225 }
226 },
227 "environment": {
228 "node": "22.23.4",
229 "playwright": "1.56.1",
230 "browser": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/141.0.7390.37 Safari/537.36",
231 "gpu": "SwiftShader Vulkan",
232 "viewport": [
233 960,
234 640
235 ],
236 "quality": "high",
237 "build": "isolated production client/server under /tmp/darkwind-browser-*"
238 },
239 "behavior": [
240 "Both placements restore a seeded checkpoint and connect the actual shared room while the native GPU request is held. Enter stays disabled; no scene bytes are sent before binding.",
241 "Releasing the native GPU request yields visible rendered world geometry and ready controls in both placements.",
242 "Rejected admission terminates owned workers without initializing simulation. A late main-thread native device is destroyed before model catalog installation.",
243 "The actual 20-second startup deadline closes an already admitted simulation and held graphics worker while retaining the local checkpoint.",
244 "All seven multiplayer cases and the existing graphics recovery, travel and save cases pass in the full run. The fallback buffer-pressure assertion passes in the final targeted rerun after correcting its first-frame setup assumption."
245 ],
246 "diagnostics": {
247 "startupFields": [
248 "started",
249 "admission",
250 "graphics",
251 "simulation",
252 "presentation",
253 "room",
254 "ready",
255 "failed"
256 ],
257 "graphicsStages": [
258 "probe",
259 "device",
260 "catalog",
261 "actors",
262 "ready"
263 ],
264 "maxGraphicsEntries": 16,
265 "clock": "page performance.now; worker timestamps translated by time-origin difference"
266 },
267 "precedingEvidence": "startup-serial-investigation.json",
268 "limitations": [
269 "Software GPU behavior does not prove physical-device performance.",
270 "Parallelizing startup removes a verified serial dependency, but does not prove the underlying cause of slow GPU initialization on CI.",
271 "Remote CI acceptance for this source and the broader recovery investigation remain open.",
272 "No full roadmap milestone is closed; full-plan progress remains approximately 35%."
273 ]
274}
275