REPOSITORY SOURCE

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}