REPOSITORY SOURCE

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