equipment-acceptance.json
docs/evidence/equipment-acceptance.json
1{
2 "sourceBase": "ce76f68f4f8556f863c478b927b4d1ac71f5161c",
3 "sourceSha256": {
4 "apps/player/main.ts": "161b65c8beb21a835c0f0e907a2828f8b75f2639679e5987437563f34234aa60",
5 "apps/player/simulation.worker.ts": "427f5640a0e3a0e55cd5aebb003b0b7517047338213e3c949ccfc03592d01433",
6 "compose.ferry.yaml": "1842f4d0e83f0a0cf59ab54c485e469a25e44abf94a5599c008406267ea09c4a",
7 "games/darkwind/garden-ferry.ts": "013d9de3393009eccf79fc198655c5cc17820bb2359d0f14f01296a042586307",
8 "games/darkwind/traveler.ts": "029d97f3f221a0b7e387342663817f3b13f09b6009b8b669b73df872370fba2c",
9 "packages/net/client.ts": "402fa4c304bf7257073d58ce7c5d28b852864cfddb32c8fb19e9717ad639effe",
10 "packages/net/packets.ts": "cec5635ff48b01356ace2ca6873423182997f2936b94131e9613272d23a7c81a",
11 "packages/net/protocol.ts": "f4d445697f04f97e22a995ebc2897ea59dab312ae33bd413881f1652949dbfd4",
12 "packages/presentation/index.ts": "aa749c3fe5d21b07b7cc077a8f2dc24d99c7f70687bbd6b2018732f9e7a8074d",
13 "packages/render-webgpu/index.ts": "d0de8f712217da9818bc8661b2cee4f6721f230fd36c7dd4a20817f409f9dc24",
14 "packages/render/actor-rig.ts": "3f52172da819884b1356435d9cb584128deac27b06a4652c44c054ec56e8bd55",
15 "packages/render/presentation.ts": "b8f64a988e74e59dcb660d26bda9953135bbf0016911abe9b3b2688f450e527e",
16 "packages/schema/actors.ts": "436f213f9ab8ebcffc56c75c971cece9248ab8a63abcebd797bdce3bd3bcffce",
17 "packages/schema/index.ts": "08c25bdaea03ac04239e6d78df4f27fe6339a5e9660780bb7a9eda01cfbd0f4a",
18 "packages/simulation/checkpoint.ts": "9e3ccce02fc03d17f44ed788c86794cd94e6232d26b5b87975b10a2bc03f228c",
19 "packages/simulation/index.ts": "2062ba9e63885d73caa5a574739adef965061fb33169726f33caadee28c8be8e",
20 "packages/simulation/remote-actors.ts": "68b3a6ac00f6275de5f24c782ffd0a8ccf14a744400c730bebafb2def085c293",
21 "services/relay/server.ts": "4f6a4f5e012a7b17574d4256cf46668e649414cf5f3cbaa16dca2588c029d23c",
22 "tests/browser/ferry.spec.ts": "6a410ad84a4ad49944140219c38e621197c9577dfb7a8dae0d6544b5d7914b11",
23 "tests/net.test.ts": "9290611e13a67d8c51bbaca1308087ac9e575abc084cf3cb36e62e9231694163",
24 "tests/remote-actors.test.ts": "6e54e087b64fbd981c551341dfcf3ba42cc2cbffbf35971932a4a275d38cf285",
25 "tools/cli/docker-smoke.ts": "3bdf080c5d27f826f8b618a1ccb5d2d831ad86e6e081297070416746d9736615",
26 "tools/cli/ferry.mjs": "ea31fe662647b66fa2e7c72f9a2fe1b053d7238dd02fda8c7f974ac319007cad",
27 "games/darkwind/lantern.ts": "ff3a8e9a7c6cfb90bf6ce56ddc16ce00c4a741257685a9a48ca3536ee507a4a4",
28 "games/engine-zoo/equipment.ts": "6e7e5241fac579a5b3415144a7db51b61f4c85c8856b6bb6b94af3bcbf0775e0",
29 "packages/schema/equipment.ts": "c9ca02c81ac7b7ebd7ac856359ad5b6caf294617ea7349e282bf1196cfb1226c",
30 "tests/equipment.test.ts": "dd2debedcb44edba00eefb59e9a8b08da53a6ab25f52782033aef3449d33f735"
31 },
32 "engine": "0.1.0",
33 "preview": "garden-ferry.4",
34 "protocol": 4,
35 "presentationFormat": 7,
36 "remoteActorVersion": 3,
37 "environment": {
38 "node": "22.23.4",
39 "playwright": "1.56.1",
40 "platform": "Linux",
41 "browser": "Chromium headless shell with SwiftShader WebGPU",
42 "viewport": [
43 960,
44 640
45 ],
46 "quality": "high"
47 },
48 "headless": {
49 "fullSuitePassed": 376,
50 "fullSuiteFailed": 0,
51 "equipmentFocusedPassed": 6,
52 "equipmentFocusedFailed": 0
53 },
54 "checks": {
55 "typescript": "passed",
56 "importBoundaries": 80,
57 "serverBuild": "passed in /tmp/dw-equipment-server",
58 "compose": "passed, independent garden-ferry-v4-room volume",
59 "preview": "8788 health ready and 5180 serves garden-ferry.4"
60 },
61 "browser": {
62 "combined": {
63 "stats": {
64 "startTime": "2026-10-25T05:26:05.408Z",
65 "duration": 130457.741,
66 "expected": 4,
67 "skipped": 0,
68 "unexpected": 1,
69 "flaky": 0
70 },
71 "cases": [
72 {
73 "title": "two travelers board and ride the garden ferry through pause, host handoff and reload",
74 "passed": true,
75 "results": [
76 {
77 "status": "passed",
78 "error": null
79 }
80 ]
81 },
82 {
83 "title": "a traveler visibly changes from idle to walking to airborne and lands again",
84 "passed": true,
85 "results": [
86 {
87 "status": "passed",
88 "error": null
89 }
90 ]
91 },
92 {
93 "title": "two travelers push the lantern home and retain the lit garden after host handoff and reload",
94 "passed": true,
95 "results": [
96 {
97 "status": "passed",
98 "error": null
99 }
100 ]
101 },
102 {
103 "title": "Mara patrols in both views, waits through conversation and host handoff, then resumes",
104 "passed": false,
105 "results": [
106 {
107 "status": "failed",
108 "error": "Error: \u001b[2mexpect(\u001b[22m\u001b[31mreceived\u001b[39m\u001b[2m).\u001b[22mtoBeLessThan\u001b[2m(\u001b[22m\u001b[32mexpected\u001b[39m\u001b[2m)\u001b[22m\n\nExpected: < \u001b[32m0.15\u001b[39m\nReceived: \u001b[31m10.96771410934196\u001b[39m\n\nCall Log:\n- Timeout 15000ms exceeded while waiting on the predicate"
109 }
110 ]
111 },
112 {
113 "title": "travelers equip a visible animated lantern, retain it through handoff and reload, then stow it",
114 "passed": true,
115 "results": [
116 {
117 "status": "passed",
118 "error": null
119 }
120 ]
121 }
122 ]
123 },
124 "correctedNPCAndEquipment": {
125 "stats": {
126 "startTime": "2026-10-25T05:29:08.884Z",
127 "duration": 53081.395000000004,
128 "expected": 2,
129 "skipped": 0,
130 "unexpected": 0,
131 "flaky": 0
132 },
133 "cases": [
134 {
135 "title": "Mara patrols in both views, waits through conversation and host handoff, then resumes",
136 "passed": true,
137 "results": [
138 {
139 "status": "passed",
140 "error": null
141 }
142 ]
143 },
144 {
145 "title": "travelers equip a visible animated lantern, retain it through handoff and reload, then stow it",
146 "passed": true,
147 "results": [
148 {
149 "status": "passed",
150 "error": null
151 }
152 ]
153 }
154 ]
155 },
156 "finalEquipment": {
157 "stats": {
158 "startTime": "2026-10-25T05:31:05.402Z",
159 "duration": 23856.922000000002,
160 "expected": 1,
161 "skipped": 0,
162 "unexpected": 0,
163 "flaky": 0
164 },
165 "cases": [
166 {
167 "title": "travelers equip a visible animated lantern, retain it through handoff and reload, then stow it",
168 "passed": true,
169 "results": [
170 {
171 "status": "passed",
172 "error": null
173 }
174 ]
175 }
176 ]
177 },
178 "distinctJourneysAccepted": 5
179 },
180 "observed": {
181 "holder": {
182 "inventory": [
183 "traveling-lantern"
184 ],
185 "equipped": [
186 "traveling-lantern"
187 ],
188 "position": [
189 3.8726232051849365,
190 0.7850940823554993,
191 3.6263222694396973
192 ],
193 "rendered": {
194 "authored:fedf0000-0000-4000-8000-eeeeeeeeeeee": {
195 "attachments": [],
196 "position": [
197 0,
198 0.785,
199 -3.7548140313373053
200 ],
201 "yaw": -3.141592653589793,
202 "walking": true,
203 "airborne": false,
204 "stalled": false
205 },
206 "ce397e89-1521-4b2a-b867-eb53db29880b": {
207 "attachments": [],
208 "position": [
209 4.500000476837158,
210 0.9033835999274646,
211 7.407780656391771
212 ],
213 "yaw": 0,
214 "walking": false,
215 "airborne": false,
216 "stalled": false
217 }
218 },
219 "room": {
220 "self": "a405a376-1f19-4692-a487-39547bd69846",
221 "host": "a405a376-1f19-4692-a487-39547bd69846",
222 "epoch": "4"
223 }
224 },
225 "observer": {
226 "inventory": [],
227 "equipped": [],
228 "position": [
229 4.500000476837158,
230 0.9015277028083801,
231 7.4095869064331055
232 ],
233 "rendered": {
234 "a405a376-1f19-4692-a487-39547bd69846": {
235 "attachments": [
236 "lantern"
237 ],
238 "position": [
239 3.8726232051849365,
240 0.7850940823554993,
241 3.6263222694396973
242 ],
243 "yaw": 0,
244 "walking": false,
245 "airborne": false,
246 "stalled": false
247 },
248 "authored:fedf0000-0000-4000-8000-eeeeeeeeeeee": {
249 "attachments": [],
250 "position": [
251 0,
252 0.785,
253 -3.585212953996027
254 ],
255 "yaw": -3.141592653589793,
256 "walking": true,
257 "airborne": false,
258 "stalled": false
259 }
260 },
261 "room": {
262 "self": "ce397e89-1521-4b2a-b867-eb53db29880b",
263 "host": "a405a376-1f19-4692-a487-39547bd69846",
264 "epoch": "4"
265 }
266 }
267 },
268 "corrections": [
269 "First observer was outside the garden wall. Repositioned the observer for an actual equipment capture.",
270 "The combined NPC test overshot a moving approach target while holding a single direction. The test now recomputes direction from observed position without weakening its distance assertion. The corrected NPC journey passes.",
271 "Later camera variants were inspected; retained the combined-run image where the held lantern is most visible. Production rendering/equipment code is identical across these browser runs."
272 ],
273 "visualReview": "Inspected actual rendered captures. The retained image clearly shows the brass/glowing lantern suspended at the animated right hand. Existing pine canopy overlaps the character head from this east-bank viewpoint; scene readability remains part of environment polish. Character art is unchanged and still deferred.",
274 "commands": [
275 "npm run check",
276 "npm test",
277 "node --import tsx --test tests/equipment.test.ts",
278 "node node_modules/vite/bin/vite.js build --ssr services/relay/main.ts --outDir /tmp/dw-equipment-server",
279 "DW_ALLOWED_ORIGINS=https://playtest.example docker compose -f compose.ferry.yaml config --quiet",
280 "CI=1 PLAYWRIGHT_EXECUTABLE_PATH=/tmp/dw-browser-test/chrome-linux/headless_shell npm run test:browser:ferry",
281 "CI=1 PLAYWRIGHT_EXECUTABLE_PATH=/tmp/dw-browser-test/chrome-linux/headless_shell npm run test:browser:ferry -- --grep \"Mara patrols|travelers equip\"",
282 "CI=1 PLAYWRIGHT_EXECUTABLE_PATH=/tmp/dw-browser-test/chrome-linux/headless_shell npm run test:browser:ferry -- --grep \"travelers equip\""
283 ],
284 "limits": [
285 "Trusted elected-browser game rules; server-authoritative equipment and persistent account inventory remain open.",
286 "Primitive socket attachments; imported equipment meshes, physical attachment collision and first-person held models remain open.",
287 "Emissive lantern, without moving point-light illumination.",
288 "New version-four preview storage; prior preview releases retained without automatic migration.",
289 "No physical-device performance claim, main-branch merge or Coolify deployment."
290 ]
291}
292