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}