REPOSITORY SOURCE

renderer-startup-browser.json

docs/evidence/renderer-startup-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": "day-cycle.spec.ts",
66      "file": "day-cycle.spec.ts",
67      "column": 0,
68      "line": 0,
69      "specs": [
70        {
71          "title": "main shared-time daylight loops, restores, lights portals and recovers exactly",
72          "ok": true,
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": "passed",
86                  "duration": 2491,
87                  "errors": [],
88                  "stdout": [],
89                  "stderr": [],
90                  "retry": 0,
91                  "startTime": "2026-10-26T04:15:38.066Z",
92                  "annotations": [],
93                  "attachments": [
94                    {
95                      "name": "day-cycle-main.json",
96                      "contentType": "application/json",
97                      "body": "eyJob3VycyI6WzYuNSwxMiwxNy41LDBdLCJzYW1wbGVzIjpbeyJob3VyIjo2LjUsInNreSI6eyJ6ZW5pdGgiOlswLjA0MDAxODkwODc1NDk2NDAzNSwwLjE5MzQzNDE4MDAyNjQ3NDksMC4zNzk1NTA0ODYxMDc5NjkxNV0sImhvcml6b24iOlswLjgwODkwMDkwMDUzNTMwNjQsMC4zNDQ2NzQ0NzE4MDU5MzA3NSwwLjE2MzAxNzE4ODI1ODk1ODU2XSwiZ3JvdW5kIjpbMC4wODgyNDk3MzM0NzMyNDg0OSwwLjEzMjYzMDA0MDc4NjU0MTI1LDAuMDkwNDIwOTc4Mzc0OTMwODVdLCJzdW5Db2xvciI6WzAuODE0ODkyNzkwNTM4MjQ3NywwLjQxNzc1MTI3MTEwMzcxMjQsMC4xNjU0NzU4MTE2MzUzMDkzNl0sInN1blNpemUiOjAuNjUsInN1bkdsb3ciOjAuODUsImludGVuc2l0eSI6MC4zMjkzNDcxMzA3OTk3Nzg3fSwic3VuIjpbMC45MjI1NzYzOTY3NDA4NTAzLDAuMTMzNDQ3MTg5NTk1MTY3MTMsLTAuMzYyMDAwODgzNjUzMzY5NV0sInN1bkludGVuc2l0eSI6MS43OTI3NjQxMzkxODQxNDUxLCJhbWJpZW50IjpbMC4xOTYzNzE3NDY2NTgxNjI3NiwwLjI1OTk4NTczMjI0MTQ1LDAuMjgzMTc4NzM5NDQ5ODA2MzddLCJmb2ciOlswLjUzNDUzNTU4NTM0Nzk0OTIsMC4yMzgwMzg0MDY2NzM4NTUsMC4xMzM5NjExNzIzNjgzMjMwNl19LHsiaG91ciI6MTIsInNreSI6eyJ6ZW5pdGgiOlswLjA0NSwwLjIyLDAuNDMwMDAwMDAwMDAwMDAwMDVdLCJob3Jpem9uIjpbMC41NSwwLjc1LDAuODNdLCJncm91bmQiOlswLjEsMC4xNSwwLjFdLCJzdW5Db2xvciI6WzEsMC45NSwwLjc4XSwic3VuU2l6ZSI6MC42NSwic3VuR2xvdyI6MC44NSwiaW50ZW5zaXR5IjowLjM2fSwic3VuIjpbNS4zNjk4NTYyMjI2NzI3MDY2ZS0xNywwLjk2MzUxNzkwOTYyOTk0MDUsMC4yNjc2NDM4NjM3ODYwOTQ1Nl0sInN1bkludGVuc2l0eSI6Mi4yLCJhbWJpZW50IjpbMC4yMiwwLjI5LDAuMzFdLCJmb2ciOlswLjM2NjI1MDAwMDAwMDAwMDEsMC41MDE1LDAuNTY3NV19LHsiaG91ciI6MTcuNSwic2t5Ijp7Inplbml0aCI6WzAuMDQwMDE4OTA4NzU0OTY0MDc2LDAuMTkzNDM0MTgwMDI2NDc1MDgsMC4zNzk1NTA0ODYxMDc5Njk1XSwiaG9yaXpvbiI6WzAuODA4OTAwOTAwNTM1MzA2OSwwLjM0NDY3NDQ3MTgwNTkzMTMsMC4xNjMwMTcxODgyNTg5NTkwOF0sImdyb3VuZCI6WzAuMDg4MjQ5NzMzNDczMjQ4NiwwLjEzMjYzMDA0MDc4NjU0MTQsMC4wOTA0MjA5NzgzNzQ5MzA5M10sInN1bkNvbG9yIjpbMC44MTQ4OTI3OTA1MzgyNTA2LDAuNDE3NzUxMjcxMTAzNzE0MTMsMC4xNjU0NzU4MTE2MzUzMTAzM10sInN1blNpemUiOjAuNjUsInN1bkdsb3ciOjAuODUsImludGVuc2l0eSI6MC4zMjkzNDcxMzA3OTk3Nzg5NX0sInN1biI6Wy0wLjcwMDY0NTcwODcyNTExMDMsMC4xMDEzNDU3NTQxOTYxNjM0LDAuNzA2Mjc1MTc5MzM5ODIyNV0sInN1bkludGVuc2l0eSI6MS43OTI3NjQxMzkxODQxNTEzLCJhbWJpZW50IjpbMC4xOTYzNzE3NDY2NTgxNjI5MywwLjI1OTk4NTczMjI0MTQ1MDIsMC4yODMxNzg3Mzk0NDk4MDY1NF0sImZvZyI6WzAuNTM0NTM1NTg1MzQ3OTQ5NSwwLjIzODAzODQwNjY3Mzg1NTM3LDAuMTMzOTYxMTcyMzY4MzIzNDJdfSx7ImhvdXIiOjAsInNreSI6eyJ6ZW5pdGgiOlswLjAwNiwwLjAxMiwwLjAzNV0sImhvcml6b24iOlswLjAzNSwwLjA1NSwwLjEyXSwiZ3JvdW5kIjpbMC4wMDgsMC4wMTQsMC4wMjVdLCJzdW5Db2xvciI6WzAuNDgsMC42NCwxXSwic3VuU2l6ZSI6MC4zNSwic3VuR2xvdyI6MC4zLCJpbnRlbnNpdHkiOjAuMTJ9LCJzdW4iOlstNS4zNjk4NTYyMjI2NzI3MDY2ZS0xNywwLjk2MzUxNzkwOTYyOTk0MDUsLTAuMjY3NjQzODYzNzg2MDk0NTZdLCJzdW5JbnRlbnNpdHkiOjAuMTYsImFtYmllbnQiOlswLjAzNSwwLjA1NSwwLjFdLCJmb2ciOlswLjAzMTUsMC4wNDk3NSwwLjEwNl19XSwibHVtaW5hbmNlIjp7ImRhd24iOjE0Ni40MTg0NiwiZGF5IjoxODguNDgzNzUxNjY2NjY2NjgsImR1c2siOjE0Ni4yMTAyNiwibmlnaHQiOjU1LjUwMjg0MDgzMzMzMzMzfSwibG9vcEV4YWN0Ijp0cnVlLCJ1bmRvRXhhY3QiOnRydWUsInJlY292ZXJ5RXhhY3QiOnRydWUsInBvcnRhbCI6eyJtYXhpbXVtSW50ZXJpb3JFcnJvciI6MSwiZGlmZmVyZW50Ijp0cnVlfSwiYm91bmRlZCI6dHJ1ZSwicmVzb3VyY2VzIjp7ImJ1ZmZlcnMiOjcsInRleHR1cmVzIjozfSwiZGlzcG9zZWQiOnsiYnVmZmVycyI6MCwidGV4dHVyZXMiOjB9LCJlcnJvcnMiOltdfQ=="
98                    }
99                  ]
100                }
101              ],
102              "status": "expected"
103            }
104          ],
105          "id": "3d099c8259a4c2a5f5cf-67d409aa54e1e8387eb9",
106          "file": "day-cycle.spec.ts",
107          "line": 21,
108          "column": 51
109        },
110        {
111          "title": "worker shared-time daylight loops, restores, lights portals and recovers exactly",
112          "ok": true,
113          "tags": [],
114          "tests": [
115            {
116              "timeout": 60000,
117              "annotations": [],
118              "expectedStatus": "passed",
119              "projectId": "",
120              "projectName": "",
121              "results": [
122                {
123                  "workerIndex": 0,
124                  "parallelIndex": 0,
125                  "status": "passed",
126                  "duration": 2209,
127                  "errors": [],
128                  "stdout": [],
129                  "stderr": [],
130                  "retry": 0,
131                  "startTime": "2026-10-26T04:15:40.738Z",
132                  "annotations": [],
133                  "attachments": [
134                    {
135                      "name": "day-cycle-worker.json",
136                      "contentType": "application/json",
137                      "body": "eyJob3VycyI6WzYuNSwxMiwxNy41LDBdLCJzYW1wbGVzIjpbeyJob3VyIjo2LjUsInNreSI6eyJ6ZW5pdGgiOlswLjA0MDAxODkwODc1NDk2NDAzNSwwLjE5MzQzNDE4MDAyNjQ3NDksMC4zNzk1NTA0ODYxMDc5NjkxNV0sImhvcml6b24iOlswLjgwODkwMDkwMDUzNTMwNjQsMC4zNDQ2NzQ0NzE4MDU5MzA3NSwwLjE2MzAxNzE4ODI1ODk1ODU2XSwiZ3JvdW5kIjpbMC4wODgyNDk3MzM0NzMyNDg0OSwwLjEzMjYzMDA0MDc4NjU0MTI1LDAuMDkwNDIwOTc4Mzc0OTMwODVdLCJzdW5Db2xvciI6WzAuODE0ODkyNzkwNTM4MjQ3NywwLjQxNzc1MTI3MTEwMzcxMjQsMC4xNjU0NzU4MTE2MzUzMDkzNl0sInN1blNpemUiOjAuNjUsInN1bkdsb3ciOjAuODUsImludGVuc2l0eSI6MC4zMjkzNDcxMzA3OTk3Nzg3fSwic3VuIjpbMC45MjI1NzYzOTY3NDA4NTAzLDAuMTMzNDQ3MTg5NTk1MTY3MTMsLTAuMzYyMDAwODgzNjUzMzY5NV0sInN1bkludGVuc2l0eSI6MS43OTI3NjQxMzkxODQxNDUxLCJhbWJpZW50IjpbMC4xOTYzNzE3NDY2NTgxNjI3NiwwLjI1OTk4NTczMjI0MTQ1LDAuMjgzMTc4NzM5NDQ5ODA2MzddLCJmb2ciOlswLjUzNDUzNTU4NTM0Nzk0OTIsMC4yMzgwMzg0MDY2NzM4NTUsMC4xMzM5NjExNzIzNjgzMjMwNl19LHsiaG91ciI6MTIsInNreSI6eyJ6ZW5pdGgiOlswLjA0NSwwLjIyLDAuNDMwMDAwMDAwMDAwMDAwMDVdLCJob3Jpem9uIjpbMC41NSwwLjc1LDAuODNdLCJncm91bmQiOlswLjEsMC4xNSwwLjFdLCJzdW5Db2xvciI6WzEsMC45NSwwLjc4XSwic3VuU2l6ZSI6MC42NSwic3VuR2xvdyI6MC44NSwiaW50ZW5zaXR5IjowLjM2fSwic3VuIjpbNS4zNjk4NTYyMjI2NzI3MDY2ZS0xNywwLjk2MzUxNzkwOTYyOTk0MDUsMC4yNjc2NDM4NjM3ODYwOTQ1Nl0sInN1bkludGVuc2l0eSI6Mi4yLCJhbWJpZW50IjpbMC4yMiwwLjI5LDAuMzFdLCJmb2ciOlswLjM2NjI1MDAwMDAwMDAwMDEsMC41MDE1LDAuNTY3NV19LHsiaG91ciI6MTcuNSwic2t5Ijp7Inplbml0aCI6WzAuMDQwMDE4OTA4NzU0OTY0MDc2LDAuMTkzNDM0MTgwMDI2NDc1MDgsMC4zNzk1NTA0ODYxMDc5Njk1XSwiaG9yaXpvbiI6WzAuODA4OTAwOTAwNTM1MzA2OSwwLjM0NDY3NDQ3MTgwNTkzMTMsMC4xNjMwMTcxODgyNTg5NTkwOF0sImdyb3VuZCI6WzAuMDg4MjQ5NzMzNDczMjQ4NiwwLjEzMjYzMDA0MDc4NjU0MTQsMC4wOTA0MjA5NzgzNzQ5MzA5M10sInN1bkNvbG9yIjpbMC44MTQ4OTI3OTA1MzgyNTA2LDAuNDE3NzUxMjcxMTAzNzE0MTMsMC4xNjU0NzU4MTE2MzUzMTAzM10sInN1blNpemUiOjAuNjUsInN1bkdsb3ciOjAuODUsImludGVuc2l0eSI6MC4zMjkzNDcxMzA3OTk3Nzg5NX0sInN1biI6Wy0wLjcwMDY0NTcwODcyNTExMDMsMC4xMDEzNDU3NTQxOTYxNjM0LDAuNzA2Mjc1MTc5MzM5ODIyNV0sInN1bkludGVuc2l0eSI6MS43OTI3NjQxMzkxODQxNTEzLCJhbWJpZW50IjpbMC4xOTYzNzE3NDY2NTgxNjI5MywwLjI1OTk4NTczMjI0MTQ1MDIsMC4yODMxNzg3Mzk0NDk4MDY1NF0sImZvZyI6WzAuNTM0NTM1NTg1MzQ3OTQ5NSwwLjIzODAzODQwNjY3Mzg1NTM3LDAuMTMzOTYxMTcyMzY4MzIzNDJdfSx7ImhvdXIiOjAsInNreSI6eyJ6ZW5pdGgiOlswLjAwNiwwLjAxMiwwLjAzNV0sImhvcml6b24iOlswLjAzNSwwLjA1NSwwLjEyXSwiZ3JvdW5kIjpbMC4wMDgsMC4wMTQsMC4wMjVdLCJzdW5Db2xvciI6WzAuNDgsMC42NCwxXSwic3VuU2l6ZSI6MC4zNSwic3VuR2xvdyI6MC4zLCJpbnRlbnNpdHkiOjAuMTJ9LCJzdW4iOlstNS4zNjk4NTYyMjI2NzI3MDY2ZS0xNywwLjk2MzUxNzkwOTYyOTk0MDUsLTAuMjY3NjQzODYzNzg2MDk0NTZdLCJzdW5JbnRlbnNpdHkiOjAuMTYsImFtYmllbnQiOlswLjAzNSwwLjA1NSwwLjFdLCJmb2ciOlswLjAzMTUsMC4wNDk3NSwwLjEwNl19XSwibHVtaW5hbmNlIjp7ImRhd24iOjE0Ni40MTg0NiwiZGF5IjoxODguNDgzNzUxNjY2NjY2NjgsImR1c2siOjE0Ni4yMTAyNiwibmlnaHQiOjU1LjUwMjg0MDgzMzMzMzMzfSwibG9vcEV4YWN0Ijp0cnVlLCJ1bmRvRXhhY3QiOnRydWUsInJlY292ZXJ5RXhhY3QiOnRydWUsInBvcnRhbCI6eyJtYXhpbXVtSW50ZXJpb3JFcnJvciI6MSwiZGlmZmVyZW50Ijp0cnVlfSwiYm91bmRlZCI6dHJ1ZSwicmVzb3VyY2VzIjp7ImJ1ZmZlcnMiOjcsInRleHR1cmVzIjozfSwiZGlzcG9zZWQiOnsiYnVmZmVycyI6MCwidGV4dHVyZXMiOjB9LCJlcnJvcnMiOltdfQ=="
138                    }
139                  ]
140                }
141              ],
142              "status": "expected"
143            }
144          ],
145          "id": "3d099c8259a4c2a5f5cf-9ba4f4c900f1e037b30b",
146          "file": "day-cycle.spec.ts",
147          "line": 21,
148          "column": 51
149        }
150      ]
151    },
152    {
153      "title": "editor-restoration.spec.ts",
154      "file": "editor-restoration.spec.ts",
155      "column": 0,
156      "line": 0,
157      "specs": [
158        {
159          "title": "archived invitations stay shared while restoring an older world previews, saves and undoes a new draft",
160          "ok": false,
161          "tags": [],
162          "tests": [
163            {
164              "timeout": 60000,
165              "annotations": [],
166              "expectedStatus": "passed",
167              "projectId": "",
168              "projectName": "",
169              "results": [
170                {
171                  "workerIndex": 0,
172                  "parallelIndex": 0,
173                  "status": "failed",
174                  "duration": 49780,
175                  "error": {
176                    "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",
177                    "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",
178                    "location": {
179                      "file": "/home/jason/coding/dw-web/tests/browser/editor-restoration.spec.ts",
180                      "column": 60,
181                      "line": 17
182                    },
183                    "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();"
184                  },
185                  "errors": [
186                    {
187                      "location": {
188                        "file": "/home/jason/coding/dw-web/tests/browser/editor-restoration.spec.ts",
189                        "column": 60,
190                        "line": 17
191                      },
192                      "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"
193                    }
194                  ],
195                  "stdout": [],
196                  "stderr": [],
197                  "retry": 0,
198                  "startTime": "2026-10-26T04:15:42.963Z",
199                  "annotations": [],
200                  "attachments": [
201                    {
202                      "name": "screenshot",
203                      "contentType": "image/png",
204                      "path": "/home/jason/coding/dw-web/test-results/editor-restoration-archive-36897-aves-and-undoes-a-new-draft/test-failed-1.png"
205                    },
206                    {
207                      "name": "screenshot",
208                      "contentType": "image/png",
209                      "path": "/home/jason/coding/dw-web/test-results/editor-restoration-archive-36897-aves-and-undoes-a-new-draft/test-failed-2.png"
210                    },
211                    {
212                      "name": "screenshot",
213                      "contentType": "image/png",
214                      "path": "/home/jason/coding/dw-web/test-results/editor-restoration-archive-36897-aves-and-undoes-a-new-draft/test-failed-3.png"
215                    },
216                    {
217                      "name": "error-context",
218                      "contentType": "text/markdown",
219                      "path": "/home/jason/coding/dw-web/test-results/editor-restoration-archive-36897-aves-and-undoes-a-new-draft/error-context.md"
220                    },
221                    {
222                      "name": "trace",
223                      "contentType": "application/zip",
224                      "path": "/home/jason/coding/dw-web/test-results/editor-restoration-archive-36897-aves-and-undoes-a-new-draft/trace.zip"
225                    }
226                  ],
227                  "errorLocation": {
228                    "file": "/home/jason/coding/dw-web/tests/browser/editor-restoration.spec.ts",
229                    "column": 60,
230                    "line": 17
231                  }
232                }
233              ],
234              "status": "unexpected"
235            }
236          ],
237          "id": "178bc8e657061e97f7be-abacc12fb836466fd33f",
238          "file": "editor-restoration.spec.ts",
239          "line": 4,
240          "column": 1
241        }
242      ]
243    },
244    {
245      "title": "renderer-initialization.spec.ts",
246      "file": "renderer-initialization.spec.ts",
247      "column": 0,
248      "line": 0,
249      "specs": [
250        {
251          "title": "failed renderer startup drains sibling builds before releasing the device, then retries",
252          "ok": true,
253          "tags": [],
254          "tests": [
255            {
256              "timeout": 60000,
257              "annotations": [],
258              "expectedStatus": "passed",
259              "projectId": "",
260              "projectName": "",
261              "results": [
262                {
263                  "workerIndex": 1,
264                  "parallelIndex": 0,
265                  "status": "passed",
266                  "duration": 3238,
267                  "errors": [],
268                  "stdout": [],
269                  "stderr": [],
270                  "retry": 0,
271                  "startTime": "2026-10-26T04:16:34.013Z",
272                  "annotations": [],
273                  "attachments": [
274                    {
275                      "name": "startup-cleanup.json",
276                      "contentType": "application/json",
277                      "body": "eyJoZWxkIjp7InN0YXJ0ZWQiOjIyLCJmaW5pc2hlZCI6MjEsImRlc3Ryb3llZCI6MCwicmVsZWFzZWQiOmZhbHNlfSwiZHJhaW5lZCI6eyJmaW5pc2hlZCI6MjIsImRlc3Ryb3llZCI6MSwicmVsZWFzZWQiOnRydWV9LCJyZXRyeSI6dHJ1ZSwiZXJyb3JzIjpbXX0="
278                    }
279                  ]
280                }
281              ],
282              "status": "expected"
283            }
284          ],
285          "id": "ecc5a041e862aa6a1764-3f151790e83856ae3c9a",
286          "file": "renderer-initialization.spec.ts",
287          "line": 3,
288          "column": 1
289        }
290      ]
291    },
292    {
293      "title": "weather.spec.ts",
294      "file": "weather.spec.ts",
295      "column": 0,
296      "line": 0,
297      "specs": [
298        {
299          "title": "main shared weather animates, occludes, respects quality and recovers exactly",
300          "ok": true,
301          "tags": [],
302          "tests": [
303            {
304              "timeout": 60000,
305              "annotations": [],
306              "expectedStatus": "passed",
307              "projectId": "",
308              "projectName": "",
309              "results": [
310                {
311                  "workerIndex": 1,
312                  "parallelIndex": 0,
313                  "status": "passed",
314                  "duration": 3731,
315                  "errors": [],
316                  "stdout": [],
317                  "stderr": [],
318                  "retry": 0,
319                  "startTime": "2026-10-26T04:16:37.432Z",
320                  "annotations": [],
321                  "attachments": [
322                    {
323                      "name": "weather-main.json",
324                      "contentType": "application/json",
325                      "body": "eyJzYW1wbGVIYXNoIjoiZjc4ODU3ZWYxYjM4YjY3NTQ2MWY3ZTA3YTkxODI4OGVhYzQ2ZDFjMmNiNDU3M2EzYWZhMjQ2NDM1N2M2NzI4YSIsInBvcnRhbEFuaW1hdGVkIjp0cnVlLCJwb3J0YWxMb29wRXhhY3QiOnRydWUsInZpc2libGUiOnRydWUsInNub3dEaWZmZXJlbnQiOnRydWUsImFuaW1hdGVkIjp0cnVlLCJsb29wRXhhY3QiOnRydWUsInVuZG9FeGFjdCI6dHJ1ZSwicmVjb3ZlcnlFeGFjdCI6dHJ1ZSwicmVkdWNlZE1vdGlvbkV4YWN0Ijp0cnVlLCJvY2NsdXNpb25FeGFjdCI6dHJ1ZSwiY291bnRzIjpbMjA0OCwxMDI0LDUxMl0sImJvdW5kZWQiOnRydWUsInJlc291cmNlcyI6eyJleHRyYUJ1ZmZlcnMiOjEsImV4dHJhVGV4dHVyZXMiOjB9LCJkaXNwb3NlZCI6eyJidWZmZXJzIjowLCJ0ZXh0dXJlcyI6MH0sImVycm9ycyI6W119"
326                    }
327                  ]
328                }
329              ],
330              "status": "expected"
331            }
332          ],
333          "id": "d5f1906f292cab0ebdcd-cb6b19432f91ceadd9ee",
334          "file": "weather.spec.ts",
335          "line": 22,
336          "column": 51
337        },
338        {
339          "title": "worker shared weather animates, occludes, respects quality and recovers exactly",
340          "ok": true,
341          "tags": [],
342          "tests": [
343            {
344              "timeout": 60000,
345              "annotations": [],
346              "expectedStatus": "passed",
347              "projectId": "",
348              "projectName": "",
349              "results": [
350                {
351                  "workerIndex": 1,
352                  "parallelIndex": 0,
353                  "status": "passed",
354                  "duration": 3621,
355                  "errors": [],
356                  "stdout": [],
357                  "stderr": [],
358                  "retry": 0,
359                  "startTime": "2026-10-26T04:16:41.341Z",
360                  "annotations": [],
361                  "attachments": [
362                    {
363                      "name": "weather-worker.json",
364                      "contentType": "application/json",
365                      "body": "eyJzYW1wbGVIYXNoIjoiZjc4ODU3ZWYxYjM4YjY3NTQ2MWY3ZTA3YTkxODI4OGVhYzQ2ZDFjMmNiNDU3M2EzYWZhMjQ2NDM1N2M2NzI4YSIsInBvcnRhbEFuaW1hdGVkIjp0cnVlLCJwb3J0YWxMb29wRXhhY3QiOnRydWUsInZpc2libGUiOnRydWUsInNub3dEaWZmZXJlbnQiOnRydWUsImFuaW1hdGVkIjp0cnVlLCJsb29wRXhhY3QiOnRydWUsInVuZG9FeGFjdCI6dHJ1ZSwicmVjb3ZlcnlFeGFjdCI6dHJ1ZSwicmVkdWNlZE1vdGlvbkV4YWN0Ijp0cnVlLCJvY2NsdXNpb25FeGFjdCI6dHJ1ZSwiY291bnRzIjpbMjA0OCwxMDI0LDUxMl0sImJvdW5kZWQiOnRydWUsInJlc291cmNlcyI6eyJleHRyYUJ1ZmZlcnMiOjEsImV4dHJhVGV4dHVyZXMiOjB9LCJkaXNwb3NlZCI6eyJidWZmZXJzIjowLCJ0ZXh0dXJlcyI6MH0sImVycm9ycyI6W119"
366                    }
367                  ]
368                }
369              ],
370              "status": "expected"
371            }
372          ],
373          "id": "d5f1906f292cab0ebdcd-86ef9854331fe7921ca4",
374          "file": "weather.spec.ts",
375          "line": 22,
376          "column": 51
377        }
378      ]
379    }
380  ],
381  "errors": [],
382  "stats": {
383    "startTime": "2026-10-26T04:15:35.002Z",
384    "duration": 70040.09999999999,
385    "expected": 5,
386    "skipped": 0,
387    "unexpected": 1,
388    "flaky": 0
389  }
390}