live-render-worker-acceptance.json
docs/evidence/live-render-worker-acceptance.json
1{
2 "sourceBase": "d269c034c4022d4ba968bc650773b8383e15c272",
3 "sourceFilesSha256": {
4 "apps/player/main.ts": "91a38c2bc6b2a4342ddf56ba14a6717c28c8b2dedfebfa6c002ceee8bf90e629",
5 "apps/player/graphics.ts": "d2157dcdf2cd27433d6fdfa55bb456b9a44ed14ff9f2341c098e5b6172797ab5",
6 "apps/player/graphics.worker.ts": "d5074015361efe9b3d3df122502a54943a10e3672c8f95ee869ee9939356c51a",
7 "apps/player/graphics-protocol.ts": "70ad742b512dc4de8544b29e16ab65f093aeda5c045b2c448b878e2deb15f092",
8 "apps/player/simulation.worker.ts": "8972bbfa8446c33b372a82546a7c25fec44e05d0d697aec1b12c9ac8489ec6af",
9 "packages/render-webgpu/index.ts": "5b8bea4abccd1a0385c91cfeb3c50959d7e9430bba5f12598ca985b6ea59c16a",
10 "packages/render/transfer.ts": "56cb5d3125f475e6990632deb9f7136f12833d8a20c38196fbc149e0dd1ab2be",
11 "packages/render/recovery.ts": "ac6f5e99fe1e437fcb24fcdfe1ef1c234ac23dc7e48b749d78d466fb102db5ec",
12 "tests/browser/player.spec.ts": "5cba93d4daf077a303be0f7424cf601fd807961914f72c76fc076433a2c48e80",
13 "tests/browser/multiplayer.spec.ts": "dc3727dc6faba19d0030d83bc8c348442093bc6f871591eb830e761dee0dc021",
14 "tests/browser/graphics-fault.ts": "34ac45cdb1f75fda97fe2dc9da94e9f1cce626d2883945a07cb43b369984364a",
15 "tests/browser/runtime-probe.ts": "42d81c5daa77ea9c8e027f91b7406ba4cc8dbc5f7050889f8e5be7ccf6b69891"
16 },
17 "scope": "Live owned WebGPU in one render worker with pre-transfer main-thread placement fallback, reusable presentation buffer admission, coalesced view requests, generation fencing and bounded GPU recovery. Main-thread camera and simulation-to-render forwarding remain.",
18 "checks": {
19 "typecheck": true,
20 "sourceBoundaries": 73,
21 "headless": {
22 "passed": 329,
23 "failed": 0,
24 "skipped": 0
25 },
26 "contentFingerprintsUnchanged": true
27 },
28 "browser": {
29 "command": "npm run test:browser -- tests/browser/player.spec.ts tests/browser/multiplayer.spec.ts",
30 "stats": {
31 "startTime": "2026-10-25T03:22:04.359Z",
32 "duration": 329057.397,
33 "expected": 26,
34 "skipped": 0,
35 "unexpected": 0,
36 "flaky": 0
37 },
38 "cases": [
39 {
40 "title": "two real browsers share doors and chat, then the guest takes over when the host leaves",
41 "status": "expected",
42 "durationMs": 19204
43 },
44 {
45 "title": "simultaneous real-browser pickups grant one lantern, including across host handoff",
46 "status": "expected",
47 "durationMs": 43479
48 },
49 {
50 "title": "travelers see each other move in the rendered world",
51 "status": "expected",
52 "durationMs": 14864
53 },
54 {
55 "title": "rigged travelers walk, settle when pose delivery stalls, and resume without leaking actors",
56 "status": "expected",
57 "durationMs": 27748
58 },
59 {
60 "title": "travelers keep walking with slow GPU completion and settle when real movement stops",
61 "status": "expected",
62 "durationMs": 19251
63 },
64 {
65 "title": "graphics recovery keeps the shared room and receives door changes during restoration",
66 "status": "expected",
67 "durationMs": 18927
68 },
69 {
70 "title": "world pixel checks use completed presentation and reject an invisible canvas despite visible UI",
71 "status": "expected",
72 "durationMs": 3645
73 },
74 {
75 "title": "slow GPU completion keeps one pending frame, responsive controls and measured recovery",
76 "status": "expected",
77 "durationMs": 12735
78 },
79 {
80 "title": "canonical ECS frames stay bounded while acknowledgements stall and then catch up",
81 "status": "expected",
82 "durationMs": 4576
83 },
84 {
85 "title": "new checkpoints save without animation frames",
86 "status": "expected",
87 "durationMs": 5614
88 },
89 {
90 "title": "restored checkpoints save without animation frames",
91 "status": "expected",
92 "durationMs": 4683
93 },
94 {
95 "title": "held movement and keyboard look continue without animation frames and release on pause",
96 "status": "expected",
97 "durationMs": 6220
98 },
99 {
100 "title": "front lawn supports leaving the porch and walking back up",
101 "status": "expected",
102 "durationMs": 12286
103 },
104 {
105 "title": "renders, walks, pauses, releases input, and restores the local checkpoint",
106 "status": "expected",
107 "durationMs": 13510
108 },
109 {
110 "title": "keeper dialogue pauses movement and updates the journal",
111 "status": "expected",
112 "durationMs": 4922
113 },
114 {
115 "title": "place travel, pickup conditions, beacon state, and render resources remain coherent",
116 "status": "expected",
117 "durationMs": 13029
118 },
119 {
120 "title": "unsupported GPU and malformed saves fail safely",
121 "status": "expected",
122 "durationMs": 3973
123 },
124 {
125 "title": "legacy saves are preserved while exact uint64 saves advance and reload from the new key",
126 "status": "expected",
127 "durationMs": 11113
128 },
129 {
130 "title": "graphics recovery preserves the world, releases held movement and bounds repeated losses",
131 "status": "expected",
132 "durationMs": 19773
133 },
134 {
135 "title": "graphics recovery reports a failed replacement and preserves the paused save",
136 "status": "expected",
137 "durationMs": 3919
138 },
139 {
140 "title": "graphics placement falls back when canvas-transfer is unavailable",
141 "status": "expected",
142 "durationMs": 7908
143 },
144 {
145 "title": "graphics placement falls back when worker-construction is unavailable",
146 "status": "expected",
147 "durationMs": 7364
148 },
149 {
150 "title": "graphics placement falls back when worker-gpu is unavailable",
151 "status": "expected",
152 "durationMs": 8080
153 },
154 {
155 "title": "render worker continues completed frames while page animation frames are withheld",
156 "status": "expected",
157 "durationMs": 5331
158 },
159 {
160 "title": "render worker crash releases ownership and preserves the local journey",
161 "status": "expected",
162 "durationMs": 6741
163 },
164 {
165 "title": "silent render worker reaches its deadline and releases the transferred canvas owner",
166 "status": "expected",
167 "durationMs": 24674
168 }
169 ]
170 },
171 "focusedBeforeFinalCleanupAndReplyFencing": {
172 "startTime": "2026-10-25T03:20:33.254Z",
173 "duration": 83117.25200000001,
174 "expected": 8,
175 "skipped": 0,
176 "unexpected": 0,
177 "flaky": 0
178 },
179 "initialRegression": "Initial recovery test read a worker-only device counter after the expected terminal cleanup had terminated that worker. Corrected to assert three device requests and one render worker before the third loss, then assert termination after the error.",
180 "runtime": {
181 "motion-observed-events.json": {
182 "placement": "worker",
183 "pageOrigin": 1792898605323.9,
184 "graphicsOrigin": 1792898605805.9,
185 "maxFrameGap": 560.8000000119209,
186 "maxWorkerGap": 334.2000000178814,
187 "maxTimerGap": 519,
188 "maxLongTask": 309,
189 "maxObservedQueueWait": 893.0999999940395
190 },
191 "slow-render-observed-events.json": {
192 "placement": "worker",
193 "pageOrigin": 1792898632888,
194 "graphicsOrigin": 1792898633377.2,
195 "maxFrameGap": 434.90000000596046,
196 "maxWorkerGap": 299.5,
197 "maxTimerGap": 562.2000000178814,
198 "maxLongTask": 296,
199 "maxObservedQueueWait": 754.6999999880791
200 },
201 "recovery-observed-events.json": {
202 "placement": "worker",
203 "pageOrigin": 1792898652317.8,
204 "graphicsOrigin": 1792898652785.5,
205 "maxFrameGap": 625.4000000059605,
206 "maxWorkerGap": 311.39999997615814,
207 "maxTimerGap": 563.5,
208 "maxLongTask": 287,
209 "maxObservedQueueWait": 725.6999999880791
210 },
211 "recovery-peer-events.json": {
212 "placement": "worker",
213 "pageOrigin": 1792898654491.3,
214 "graphicsOrigin": 1792898654910.2,
215 "maxFrameGap": 555.8000000119209,
216 "maxWorkerGap": 506,
217 "maxTimerGap": 725.1000000238419,
218 "maxLongTask": 487,
219 "maxObservedQueueWait": 702.2999999821186
220 }
221 },
222 "reports": "live-render-worker-reports.json",
223 "limitations": [
224 "Software-WebGPU behavioral acceptance only; no hardware performance claim.",
225 "Prior remote multiplayer scheduling/capture failures remain open until current-source CI is inspected.",
226 "Main-thread forwarding and camera updates remain dependencies; withheld page animation frames do not prove immunity to every page stall.",
227 "UTF-8 JSON presentation payload is not a compact binary codec.",
228 "Full roadmap milestones 0\u201318 remain open; final character art remains deferred."
229 ],
230 "precedingSourceCi": {
231 "source": "d269c034c4022d4ba968bc650773b8383e15c272",
232 "run": 40157457964,
233 "url": "https://github.com/jasona/darkwind-web/actions/runs/40157457964",
234 "conclusion": "failure",
235 "passedJobs": [
236 "core",
237 "container",
238 "browser (probe)"
239 ],
240 "player": {
241 "passed": 13,
242 "failed": 1,
243 "failure": "Post-recovery rendered-world pixel predicate exceeded 60 seconds."
244 },
245 "multiplayer": {
246 "passed": 4,
247 "failed": 2,
248 "failures": [
249 "Initial walking metric remained 0 instead of 1 through the 30-second observation.",
250 "Shared recovery reached failed instead of ready; the test also exceeded its 120-second overall deadline."
251 ]
252 },
253 "note": "This source predates live worker placement. The logs establish failing boundaries, not their root cause; retained earlier screenshot findings must not be substituted for this recovery failure."
254 }
255}
256