editor-startup-software-browser.json
docs/evidence/editor-startup-software-browser.json
1{
2 "config": {
3 "configFile": "/home/jason/coding/dw-web/playwright.config.ts",
4 "rootDir": "/home/jason/coding/dw-web/tests/browser",
5 "forbidOnly": false,
6 "fullyParallel": false,
7 "globalSetup": null,
8 "globalTeardown": null,
9 "globalTimeout": 0,
10 "grep": {},
11 "grepInvert": null,
12 "maxFailures": 0,
13 "metadata": {
14 "actualWorkers": 1
15 },
16 "preserveOutput": "always",
17 "reporter": [
18 [
19 "list",
20 null
21 ],
22 [
23 "json",
24 {
25 "outputFile": "test-results/browser-results.json"
26 }
27 ]
28 ],
29 "reportSlowTests": {
30 "max": 5,
31 "threshold": 300000
32 },
33 "quiet": false,
34 "projects": [
35 {
36 "outputDir": "/home/jason/coding/dw-web/test-results",
37 "repeatEach": 1,
38 "retries": 0,
39 "metadata": {
40 "actualWorkers": 1
41 },
42 "id": "",
43 "name": "",
44 "testDir": "/home/jason/coding/dw-web/tests/browser",
45 "testIgnore": [],
46 "testMatch": [
47 "**/*.@(spec|test).?(c|m)[jt]s?(x)"
48 ],
49 "timeout": 60000
50 }
51 ],
52 "shard": null,
53 "updateSnapshots": "missing",
54 "updateSourceMethod": "patch",
55 "version": "1.56.1",
56 "workers": 1,
57 "webServer": {
58 "command": "\"/home/jason/.local/share/mise/installs/node/22.23.4/bin/node\" tools/cli/test-server.mjs",
59 "url": "http://localhost:5174",
60 "reuseExistingServer": false
61 }
62 },
63 "suites": [
64 {
65 "title": "editor-restoration.spec.ts",
66 "file": "editor-restoration.spec.ts",
67 "column": 0,
68 "line": 0,
69 "specs": [
70 {
71 "title": "archived invitations stay shared while restoring an older world previews, saves and undoes a new draft",
72 "ok": false,
73 "tags": [],
74 "tests": [
75 {
76 "timeout": 60000,
77 "annotations": [],
78 "expectedStatus": "passed",
79 "projectId": "",
80 "projectName": "",
81 "results": [
82 {
83 "workerIndex": 0,
84 "parallelIndex": 0,
85 "status": "failed",
86 "duration": 46879,
87 "error": {
88 "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mlocator\u001b[39m\u001b[2m).\u001b[22mtoHaveAttribute\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m failed\n\nLocator: locator('#scene')\nExpected: \u001b[32m\"true\"\u001b[39m\nReceived: \u001b[31m\"\"\u001b[39m\nTimeout: 5000ms\n\nCall log:\n\u001b[2m - Expect \"toHaveAttribute\" with timeout 5000ms\u001b[22m\n\u001b[2m - waiting for locator('#scene')\u001b[22m\n\u001b[2m 8 × locator resolved to <canvas id=\"scene\" tabindex=\"0\" aria-label=\"World editor preview. Drag to orbit, Shift-drag to pan, scroll to zoom. Click an object to select it. Shift-click to add or remove it from the selection. Choose Select or press Q to drag a selection box.\"></canvas>\u001b[22m\n\u001b[2m - unexpected value \"null\"\u001b[22m\n",
89 "stack": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mlocator\u001b[39m\u001b[2m).\u001b[22mtoHaveAttribute\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m failed\n\nLocator: locator('#scene')\nExpected: \u001b[32m\"true\"\u001b[39m\nReceived: \u001b[31m\"\"\u001b[39m\nTimeout: 5000ms\n\nCall log:\n\u001b[2m - Expect \"toHaveAttribute\" with timeout 5000ms\u001b[22m\n\u001b[2m - waiting for locator('#scene')\u001b[22m\n\u001b[2m 8 × locator resolved to <canvas id=\"scene\" tabindex=\"0\" aria-label=\"World editor preview. Drag to orbit, Shift-drag to pan, scroll to zoom. Click an object to select it. Shift-click to add or remove it from the selection. Choose Select or press Q to drag a selection box.\"></canvas>\u001b[22m\n\u001b[2m - unexpected value \"null\"\u001b[22m\n\n at /home/jason/coding/dw-web/tests/browser/editor-restoration.spec.ts:17:60",
90 "location": {
91 "file": "/home/jason/coding/dw-web/tests/browser/editor-restoration.spec.ts",
92 "column": 60,
93 "line": 17
94 },
95 "snippet": " 15 | await row(first.sha256).locator('[data-restore]').click();await expect(page.locator('#published-worlds')).toBeHidden();await expect(page.locator('#status')).toContainText('Preview updated');await expect(page.locator('#draft-note')).toContainText('new editable revision');expect(await current()).toEqual(second);await expect(page.locator('#save')).toBeEnabled();await page.locator('#discard').click();await expect(page.locator('#status')).toContainText('discarded');expect(await current()).toEqual(second);\n 16 | await worlds();await page.locator('#published-filter').selectOption('archived');await row(first.sha256).locator('[data-restore]').click();await expect(page.locator('#status')).toContainText('Preview updated');await page.locator('#save').click();await expect(page.locator('#status')).toContainText('Saved revision');const restored=await current();expect(restored.world).toEqual(first.world);expect(BigInt(restored.revision)).toBeGreaterThan(BigInt(second.revision));expect(restored.sha256).not.toBe(first.sha256);expect(restored.prefabs).toEqual(first.prefabs);\n> 17 | await page.reload();await expect(page.locator('#scene')).toHaveAttribute('data-ready','true');await page.locator('#undo').click();await expect(page.locator('#status')).toContainText('Saved revision');expect((await current()).world).toEqual(second.world);await page.locator('#redo').click();await expect(page.locator('#status')).toContainText('Saved revision');expect((await current()).world).toEqual(first.world);\n | ^\n 18 | await worlds();await row(second.sha256).locator('[data-archive]').click();await expect(row(second.sha256)).toHaveCount(0);await page.locator('#published-filter').selectOption('archived');await expect(row(second.sha256)).toBeVisible();expect(await(await page.request.get(`/api/playtests/${second.sha256}/world`)).json()).toEqual(second);\n 19 | for(const player of players){await expect(player.locator('#world')).toHaveAttribute('data-playtest',second.sha256);await expect(player.locator('#save-status')).toContainText('2 travelers');await expect(player.locator('#error-detail')).toHaveCount(0);}\n 20 | await row(first.sha256).locator('[data-archive]').click();await expect(row(first.sha256)).toHaveCount(0);await page.locator('#published-filter').selectOption('active');await expect(row(first.sha256)).toBeVisible();await page.locator('#published-close').click();"
96 },
97 "errors": [
98 {
99 "location": {
100 "file": "/home/jason/coding/dw-web/tests/browser/editor-restoration.spec.ts",
101 "column": 60,
102 "line": 17
103 },
104 "message": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mlocator\u001b[39m\u001b[2m).\u001b[22mtoHaveAttribute\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m failed\n\nLocator: locator('#scene')\nExpected: \u001b[32m\"true\"\u001b[39m\nReceived: \u001b[31m\"\"\u001b[39m\nTimeout: 5000ms\n\nCall log:\n\u001b[2m - Expect \"toHaveAttribute\" with timeout 5000ms\u001b[22m\n\u001b[2m - waiting for locator('#scene')\u001b[22m\n\u001b[2m 8 × locator resolved to <canvas id=\"scene\" tabindex=\"0\" aria-label=\"World editor preview. Drag to orbit, Shift-drag to pan, scroll to zoom. Click an object to select it. Shift-click to add or remove it from the selection. Choose Select or press Q to drag a selection box.\"></canvas>\u001b[22m\n\u001b[2m - unexpected value \"null\"\u001b[22m\n\n\n 15 | await row(first.sha256).locator('[data-restore]').click();await expect(page.locator('#published-worlds')).toBeHidden();await expect(page.locator('#status')).toContainText('Preview updated');await expect(page.locator('#draft-note')).toContainText('new editable revision');expect(await current()).toEqual(second);await expect(page.locator('#save')).toBeEnabled();await page.locator('#discard').click();await expect(page.locator('#status')).toContainText('discarded');expect(await current()).toEqual(second);\n 16 | await worlds();await page.locator('#published-filter').selectOption('archived');await row(first.sha256).locator('[data-restore]').click();await expect(page.locator('#status')).toContainText('Preview updated');await page.locator('#save').click();await expect(page.locator('#status')).toContainText('Saved revision');const restored=await current();expect(restored.world).toEqual(first.world);expect(BigInt(restored.revision)).toBeGreaterThan(BigInt(second.revision));expect(restored.sha256).not.toBe(first.sha256);expect(restored.prefabs).toEqual(first.prefabs);\n> 17 | await page.reload();await expect(page.locator('#scene')).toHaveAttribute('data-ready','true');await page.locator('#undo').click();await expect(page.locator('#status')).toContainText('Saved revision');expect((await current()).world).toEqual(second.world);await page.locator('#redo').click();await expect(page.locator('#status')).toContainText('Saved revision');expect((await current()).world).toEqual(first.world);\n | ^\n 18 | await worlds();await row(second.sha256).locator('[data-archive]').click();await expect(row(second.sha256)).toHaveCount(0);await page.locator('#published-filter').selectOption('archived');await expect(row(second.sha256)).toBeVisible();expect(await(await page.request.get(`/api/playtests/${second.sha256}/world`)).json()).toEqual(second);\n 19 | for(const player of players){await expect(player.locator('#world')).toHaveAttribute('data-playtest',second.sha256);await expect(player.locator('#save-status')).toContainText('2 travelers');await expect(player.locator('#error-detail')).toHaveCount(0);}\n 20 | await row(first.sha256).locator('[data-archive]').click();await expect(row(first.sha256)).toHaveCount(0);await page.locator('#published-filter').selectOption('active');await expect(row(first.sha256)).toBeVisible();await page.locator('#published-close').click();\n at /home/jason/coding/dw-web/tests/browser/editor-restoration.spec.ts:17:60"
105 }
106 ],
107 "stdout": [],
108 "stderr": [],
109 "retry": 0,
110 "startTime": "2026-10-26T04:25:47.559Z",
111 "annotations": [],
112 "attachments": [
113 {
114 "name": "screenshot",
115 "contentType": "image/png",
116 "path": "/home/jason/coding/dw-web/test-results/editor-restoration-archive-36897-aves-and-undoes-a-new-draft/test-failed-1.png"
117 },
118 {
119 "name": "screenshot",
120 "contentType": "image/png",
121 "path": "/home/jason/coding/dw-web/test-results/editor-restoration-archive-36897-aves-and-undoes-a-new-draft/test-failed-2.png"
122 },
123 {
124 "name": "screenshot",
125 "contentType": "image/png",
126 "path": "/home/jason/coding/dw-web/test-results/editor-restoration-archive-36897-aves-and-undoes-a-new-draft/test-failed-3.png"
127 },
128 {
129 "name": "error-context",
130 "contentType": "text/markdown",
131 "path": "/home/jason/coding/dw-web/test-results/editor-restoration-archive-36897-aves-and-undoes-a-new-draft/error-context.md"
132 },
133 {
134 "name": "trace",
135 "contentType": "application/zip",
136 "path": "/home/jason/coding/dw-web/test-results/editor-restoration-archive-36897-aves-and-undoes-a-new-draft/trace.zip"
137 }
138 ],
139 "errorLocation": {
140 "file": "/home/jason/coding/dw-web/tests/browser/editor-restoration.spec.ts",
141 "column": 60,
142 "line": 17
143 }
144 }
145 ],
146 "status": "unexpected"
147 }
148 ],
149 "id": "178bc8e657061e97f7be-abacc12fb836466fd33f",
150 "file": "editor-restoration.spec.ts",
151 "line": 4,
152 "column": 1
153 }
154 ]
155 },
156 {
157 "title": "editor-startup.spec.ts",
158 "file": "editor-startup.spec.ts",
159 "column": 0,
160 "line": 0,
161 "specs": [
162 {
163 "title": "authenticated graphics prepare during document validation but cannot publish an unchecked scene",
164 "ok": true,
165 "tags": [],
166 "tests": [
167 {
168 "timeout": 60000,
169 "annotations": [],
170 "expectedStatus": "passed",
171 "projectId": "",
172 "projectName": "",
173 "results": [
174 {
175 "workerIndex": 1,
176 "parallelIndex": 0,
177 "status": "passed",
178 "duration": 1840,
179 "errors": [],
180 "stdout": [],
181 "stderr": [],
182 "retry": 0,
183 "startTime": "2026-10-26T04:26:35.566Z",
184 "annotations": [],
185 "attachments": [
186 {
187 "name": "editor-startup-overlap.json",
188 "contentType": "application/json",
189 "body": "eyJoZWxkIjp7InJlcXVlc3RzIjoxLCJhY3RpdmUiOjEsInBlYWsiOjEsImRlc3Ryb3llZCI6MCwicGlwZWxpbmVzIjoyMiwic3VibWl0dGVkIjowLCJoYXNoSGVsZCI6dHJ1ZSwiZGV2aWNlSGVsZCI6ZmFsc2V9LCJyZWFkeSI6eyJyZXF1ZXN0cyI6MSwiYWN0aXZlIjoxLCJwZWFrIjoxLCJkZXN0cm95ZWQiOjAsInBpcGVsaW5lcyI6MjIsInN1Ym1pdHRlZCI6MSwiaGFzaEhlbGQiOmZhbHNlLCJkZXZpY2VIZWxkIjpmYWxzZX0sImVycm9ycyI6W119"
190 }
191 ]
192 }
193 ],
194 "status": "expected"
195 }
196 ],
197 "id": "853945bf4f779842d7bd-db76e05b4711b91a99bf",
198 "file": "editor-startup.spec.ts",
199 "line": 26,
200 "column": 1
201 },
202 {
203 "title": "invalid document cancels its late device and a newer load waits for that allocation to drain",
204 "ok": true,
205 "tags": [],
206 "tests": [
207 {
208 "timeout": 60000,
209 "annotations": [],
210 "expectedStatus": "passed",
211 "projectId": "",
212 "projectName": "",
213 "results": [
214 {
215 "workerIndex": 1,
216 "parallelIndex": 0,
217 "status": "passed",
218 "duration": 2082,
219 "errors": [],
220 "stdout": [],
221 "stderr": [],
222 "retry": 0,
223 "startTime": "2026-10-26T04:26:37.462Z",
224 "annotations": [],
225 "attachments": [
226 {
227 "name": "editor-startup-invalid.json",
228 "contentType": "application/json",
229 "body": "eyJyZWFkeSI6eyJyZXF1ZXN0cyI6MiwiYWN0aXZlIjoxLCJwZWFrIjoxLCJkZXN0cm95ZWQiOjEsInBpcGVsaW5lcyI6NDQsInN1Ym1pdHRlZCI6MSwiaGFzaEhlbGQiOmZhbHNlLCJkZXZpY2VIZWxkIjpmYWxzZX0sImVycm9ycyI6W119"
230 }
231 ]
232 }
233 ],
234 "status": "expected"
235 }
236 ],
237 "id": "853945bf4f779842d7bd-95418ccd1d89c03c0678",
238 "file": "editor-startup.spec.ts",
239 "line": 35,
240 "column": 1
241 },
242 {
243 "title": "page closure during graphics preparation disposes the late result without publishing",
244 "ok": true,
245 "tags": [],
246 "tests": [
247 {
248 "timeout": 60000,
249 "annotations": [],
250 "expectedStatus": "passed",
251 "projectId": "",
252 "projectName": "",
253 "results": [
254 {
255 "workerIndex": 1,
256 "parallelIndex": 0,
257 "status": "passed",
258 "duration": 968,
259 "errors": [],
260 "stdout": [],
261 "stderr": [],
262 "retry": 0,
263 "startTime": "2026-10-26T04:26:39.557Z",
264 "annotations": [],
265 "attachments": [
266 {
267 "name": "editor-startup-closed.json",
268 "contentType": "application/json",
269 "body": "eyJjbG9zZWQiOnsicmVxdWVzdHMiOjEsImFjdGl2ZSI6MCwicGVhayI6MSwiZGVzdHJveWVkIjoxLCJwaXBlbGluZXMiOjIyLCJzdWJtaXR0ZWQiOjAsImhhc2hIZWxkIjpmYWxzZSwiZGV2aWNlSGVsZCI6ZmFsc2V9LCJlcnJvcnMiOltdfQ=="
270 }
271 ]
272 }
273 ],
274 "status": "expected"
275 }
276 ],
277 "id": "853945bf4f779842d7bd-b146f26de56a5a031413",
278 "file": "editor-startup.spec.ts",
279 "line": 44,
280 "column": 1
281 }
282 ]
283 },
284 {
285 "title": "editor.spec.ts",
286 "file": "editor.spec.ts",
287 "column": 0,
288 "line": 0,
289 "specs": [
290 {
291 "title": "browser editor previews, saves, undoes and exports durable transforms without changing identity",
292 "ok": true,
293 "tags": [],
294 "tests": [
295 {
296 "timeout": 60000,
297 "annotations": [],
298 "expectedStatus": "passed",
299 "projectId": "",
300 "projectName": "",
301 "results": [
302 {
303 "workerIndex": 1,
304 "parallelIndex": 0,
305 "status": "passed",
306 "duration": 11643,
307 "errors": [],
308 "stdout": [],
309 "stderr": [],
310 "retry": 0,
311 "startTime": "2026-10-26T04:26:40.541Z",
312 "annotations": [],
313 "attachments": []
314 }
315 ],
316 "status": "expected"
317 }
318 ],
319 "id": "d2f56d7d370f0ba02e91-4f97c02e3f979a6a20fe",
320 "file": "editor.spec.ts",
321 "line": 7,
322 "column": 1
323 },
324 {
325 "title": "two editors reject a stale save and preserve the unsaved local transform",
326 "ok": true,
327 "tags": [],
328 "tests": [
329 {
330 "timeout": 60000,
331 "annotations": [],
332 "expectedStatus": "passed",
333 "projectId": "",
334 "projectName": "",
335 "results": [
336 {
337 "workerIndex": 1,
338 "parallelIndex": 0,
339 "status": "passed",
340 "duration": 10590,
341 "errors": [],
342 "stdout": [],
343 "stderr": [],
344 "retry": 0,
345 "startTime": "2026-10-26T04:26:52.192Z",
346 "annotations": [],
347 "attachments": []
348 }
349 ],
350 "status": "expected"
351 }
352 ],
353 "id": "d2f56d7d370f0ba02e91-993083793267646171e9",
354 "file": "editor.spec.ts",
355 "line": 18,
356 "column": 1
357 },
358 {
359 "title": "atelier creates and duplicates solid shapes, stages deletion and restores exact identities through undo and reload",
360 "ok": true,
361 "tags": [],
362 "tests": [
363 {
364 "timeout": 60000,
365 "annotations": [],
366 "expectedStatus": "passed",
367 "projectId": "",
368 "projectName": "",
369 "results": [
370 {
371 "workerIndex": 1,
372 "parallelIndex": 0,
373 "status": "passed",
374 "duration": 18694,
375 "errors": [],
376 "stdout": [],
377 "stderr": [],
378 "retry": 0,
379 "startTime": "2026-10-26T04:27:02.797Z",
380 "annotations": [],
381 "attachments": []
382 }
383 ],
384 "status": "expected"
385 }
386 ],
387 "id": "d2f56d7d370f0ba02e91-1b7118cbb91444db57b4",
388 "file": "editor.spec.ts",
389 "line": 28,
390 "column": 1
391 }
392 ]
393 }
394 ],
395 "errors": [],
396 "stats": {
397 "startTime": "2026-10-26T04:25:44.714Z",
398 "duration": 96943.841,
399 "expected": 6,
400 "skipped": 0,
401 "unexpected": 1,
402 "flaky": 0
403 }
404}