room-capacity-acceptance.json
docs/evidence/room-capacity-acceptance.json
1{
2 "recordedAt": "2026-10-25T16:57:52.123756+00:00",
3 "baseCommit": "916326ff9340c8e73a72de6733c2ea1080a37d09",
4 "scope": "Prepared immutable content per trusted room, independent mutable traveler simulations, and a repeatable native regional capacity/cost trial. Full milestones 0\u201318 remain open.",
5 "fullPlanEstimatePercent": 70,
6 "sourceSha256": {
7 "package.json": "8fb7e6b94432f768e7af76551fb23852623b74bcbb6e49fdf8faf1725d96bebe",
8 "packages/simulation/index.ts": "d3a67abde21028eb9600baed6365ce6d107e2b8aa2c0157bae781b5ef131c306",
9 "services/persistent/health.ts": "647e12de873173635af872e2697af2f12dd960811b69d5bf1ddeeb4e8fd77d8a",
10 "services/persistent/server.ts": "b698fd4c0d85f8546ca0ea381cb67096e307e21e075348be93161a2b3a878afe",
11 "services/sim-host/motion.ts": "4415f83f75f18f1c26357123821585899697d60ec0f72f05e79c76fcd2ae2479",
12 "tools/cli/benchmark-rooms.mjs": "e1960aef527c29283db8135a9e713df27211e607ddd6107b04f8d77d47611a73",
13 "tools/bench/room-capacity.ts": "8198ba94d5c83bbcadf3a4b0e906ffaedea1ae3adeee70a7ce718b69bf5c7288",
14 "tools/bench/room-bot.ts": "d3d19286dda4669f857c89f1db07fb870969d2da6b7eb0ab557abe17b1f166c2",
15 "tools/bench/process-cpu.ts": "80173bfbc3be333fd03a433c80a27aaf9372e2611eeb5e6080389cf6747cb0ec",
16 "tests/prepared-simulation.test.ts": "70633bd5151c002236323613a1ce5eccc591465e809c4965328f7cb558fbcbcd",
17 "tests/simulation-behavior.test.ts": "65768169d3b80c95fdcf9cdafae40d0aa745a3cf1cffe301acf5d7bc7c806d42",
18 "tests/room-capacity-bot.test.ts": "c333c854b232b434432f22f9cf90a55497cf2116a66712f179a901e861c96ea8",
19 "tests/process-cpu.test.ts": "7467a46fd65e339749bb6ab17e13032e6f4e10fc98e46b8b8063cbb0630fb8d5",
20 "tests/browser/room-routing.spec.ts": "9830af95278c41d008fc779a588c7777429f351f9cf23f92048b3f8f652c39c4",
21 "tests/browser/persistent.spec.ts": "0523ffc4d90da127df5fdde2995d0e2ac69c1829301511183448c61ac71fd57f",
22 "tests/browser/persistent-lifecycle.spec.ts": "547dcf75401b1ffb0ba4912fa0d91bae7a97a890afe9e38f49240ac144acb5ef"
23 },
24 "databaseSchema": 5,
25 "newDatabaseMigration": false,
26 "roomRssBudgetMiB": 512,
27 "typeAndImports": {
28 "command": "npm run check",
29 "result": "passed; 127 package source files"
30 },
31 "headless": {
32 "command": "npm test",
33 "tests": 700,
34 "pass": 644,
35 "fail": 0,
36 "skipped": 56,
37 "log": "room-capacity-headless.tap"
38 },
39 "control": {
40 "command": "npm run test:control",
41 "tests": 62,
42 "pass": 62,
43 "fail": 0,
44 "skipped": 0,
45 "log": "room-capacity-control.tap"
46 },
47 "baseline": {
48 "result": "inconclusive-or-overloaded",
49 "engine": "0c215a3379f1796e00eb90ade0c997e402a07708c8af14d51692a1b7ce67ce6d",
50 "phases": [
51 {
52 "target": 1,
53 "admitted": 1,
54 "occupancy": [
55 {
56 "room": "route:capacity:hearth:1",
57 "players": 1
58 }
59 ],
60 "elapsedSeconds": 20.000902027999995,
61 "peakRoomRssMiB": 477.3046875,
62 "worstRecentTickP95Ms": 4,
63 "minimumAckHz": 29.998647019021345,
64 "worstAckP95Ms": 219.82,
65 "gatewayAndRoomsCpuSeconds": {
66 "seconds": 2.95,
67 "complete": true
68 },
69 "databaseCpuSeconds": {
70 "seconds": 0.07,
71 "complete": true
72 },
73 "databaseDelta": {
74 "transactions": 41,
75 "rollbacks": 0,
76 "inserted": 10,
77 "updated": 31,
78 "walBytes": 15413,
79 "durableReceipts": 5
80 },
81 "sentPayloadBytes": 91737,
82 "receivedPayloadBytes": 212115
83 },
84 {
85 "target": 2,
86 "admitted": 2,
87 "occupancy": [
88 {
89 "room": "route:capacity:hearth:1",
90 "players": 2
91 }
92 ],
93 "elapsedSeconds": 20.002822224999996,
94 "peakRoomRssMiB": 502.421875,
95 "worstRecentTickP95Ms": 7.46,
96 "minimumAckHz": 29.995767259787268,
97 "worstAckP95Ms": 295.06,
98 "gatewayAndRoomsCpuSeconds": {
99 "seconds": 4.14,
100 "complete": true
101 },
102 "databaseCpuSeconds": {
103 "seconds": 0.15,
104 "complete": true
105 },
106 "databaseDelta": {
107 "transactions": 67,
108 "rollbacks": 0,
109 "inserted": 46,
110 "updated": 109,
111 "walBytes": 264602,
112 "durableReceipts": 10
113 },
114 "sentPayloadBytes": 184360,
115 "receivedPayloadBytes": 500721
116 },
117 {
118 "target": 4,
119 "admitted": 4,
120 "occupancy": [
121 {
122 "room": "route:capacity:hearth:1",
123 "players": 3
124 },
125 {
126 "room": "route:capacity:hearth:2",
127 "players": 1
128 }
129 ],
130 "elapsedSeconds": 20.00912116699999,
131 "peakRoomRssMiB": 518.4765625,
132 "worstRecentTickP95Ms": 8.86,
133 "minimumAckHz": 30.036301693809435,
134 "worstAckP95Ms": 293.32,
135 "gatewayAndRoomsCpuSeconds": {
136 "seconds": 7.63,
137 "complete": true
138 },
139 "databaseCpuSeconds": {
140 "seconds": 0.25,
141 "complete": true
142 },
143 "databaseDelta": {
144 "transactions": 105,
145 "rollbacks": 0,
146 "inserted": 40,
147 "updated": 80,
148 "walBytes": 55517,
149 "durableReceipts": 20
150 },
151 "sentPayloadBytes": 368789,
152 "receivedPayloadBytes": 1075518
153 },
154 {
155 "target": 8,
156 "admitted": 8,
157 "occupancy": [
158 {
159 "room": "route:capacity:hearth:1",
160 "players": 3
161 },
162 {
163 "room": "route:capacity:hearth:2",
164 "players": 5
165 }
166 ],
167 "elapsedSeconds": 20.004278335999988,
168 "peakRoomRssMiB": 515.8046875,
169 "worstRecentTickP95Ms": 13.49,
170 "minimumAckHz": 29.993583868518332,
171 "worstAckP95Ms": 296.1,
172 "gatewayAndRoomsCpuSeconds": {
173 "seconds": 10.72,
174 "complete": true
175 },
176 "databaseCpuSeconds": {
177 "seconds": 0.45,
178 "complete": true
179 },
180 "databaseDelta": {
181 "transactions": 165,
182 "rollbacks": 0,
183 "inserted": 80,
184 "updated": 120,
185 "walBytes": 124449,
186 "durableReceipts": 40
187 },
188 "sentPayloadBytes": 736747,
189 "receivedPayloadBytes": 2684910
190 },
191 {
192 "target": 16,
193 "admitted": 11,
194 "occupancy": [
195 {
196 "room": "route:capacity:hearth:1",
197 "players": 3
198 },
199 {
200 "room": "route:capacity:hearth:2",
201 "players": 8
202 }
203 ],
204 "elapsedSeconds": 20.002293326000014,
205 "peakRoomRssMiB": 519.3046875,
206 "worstRecentTickP95Ms": 14.51,
207 "minimumAckHz": 29.996560405405564,
208 "worstAckP95Ms": 295.68,
209 "gatewayAndRoomsCpuSeconds": {
210 "seconds": 12.62,
211 "complete": true
212 },
213 "databaseCpuSeconds": {
214 "seconds": 0.57,
215 "complete": true
216 },
217 "databaseDelta": {
218 "transactions": 223,
219 "rollbacks": 0,
220 "inserted": 128,
221 "updated": 173,
222 "walBytes": 199606,
223 "durableReceipts": 55
224 },
225 "sentPayloadBytes": 1014081,
226 "receivedPayloadBytes": 4669237
227 },
228 {
229 "target": 11,
230 "admitted": 11,
231 "occupancy": [
232 {
233 "room": "route:capacity:hearth:1",
234 "players": 3
235 },
236 {
237 "room": "route:capacity:hearth:2",
238 "players": 8
239 }
240 ],
241 "elapsedSeconds": 20.003157261000016,
242 "peakRoomRssMiB": 526.77734375,
243 "worstRecentTickP95Ms": 14.7,
244 "minimumAckHz": 29.995264856004248,
245 "worstAckP95Ms": 225.62,
246 "gatewayAndRoomsCpuSeconds": {
247 "seconds": 11.17,
248 "complete": true
249 },
250 "databaseCpuSeconds": {
251 "seconds": 0.51,
252 "complete": true
253 },
254 "databaseDelta": {
255 "transactions": 210,
256 "rollbacks": 0,
257 "inserted": 110,
258 "updated": 150,
259 "walBytes": 143474,
260 "durableReceipts": 55
261 },
262 "sentPayloadBytes": 1008700,
263 "receivedPayloadBytes": 4652583
264 }
265 ],
266 "reconnectStorm": {
267 "players": 11,
268 "milliseconds": 1507.618524999998,
269 "failed": [],
270 "sameIdentities": true,
271 "sameInventory": true
272 },
273 "extraArrival": {
274 "status": 503,
275 "atPlayers": 11
276 },
277 "shutdown": {
278 "code": 0,
279 "signal": null
280 }
281 },
282 "final": {
283 "result": "measured-target",
284 "engine": "f179f3de893f26a6ace0ce2f07ec6ac8e10b4e1ef5467a6d3a10b2f77c290c8c",
285 "phases": [
286 {
287 "target": 1,
288 "admitted": 1,
289 "occupancy": [
290 {
291 "room": "route:capacity:hearth:1",
292 "players": 1
293 }
294 ],
295 "elapsedSeconds": 20.006507578,
296 "peakRoomRssMiB": 389.12890625,
297 "worstRecentTickP95Ms": 4,
298 "minimumAckHz": 30.040225544456593,
299 "worstAckP95Ms": 226.06,
300 "gatewayAndRoomsCpuSeconds": {
301 "seconds": 3.1,
302 "complete": true
303 },
304 "databaseCpuSeconds": {
305 "seconds": 0.08,
306 "complete": true
307 },
308 "databaseDelta": {
309 "transactions": 39,
310 "rollbacks": 0,
311 "inserted": 10,
312 "updated": 29,
313 "walBytes": 15094,
314 "durableReceipts": 5
315 },
316 "sentPayloadBytes": 91739,
317 "receivedPayloadBytes": 212319
318 },
319 {
320 "target": 2,
321 "admitted": 2,
322 "occupancy": [
323 {
324 "room": "route:capacity:hearth:1",
325 "players": 2
326 }
327 ],
328 "elapsedSeconds": 20.002077824999994,
329 "peakRoomRssMiB": 389.73046875,
330 "worstRecentTickP95Ms": 7.92,
331 "minimumAckHz": 30.04687839224524,
332 "worstAckP95Ms": 293.2,
333 "gatewayAndRoomsCpuSeconds": {
334 "seconds": 4.14,
335 "complete": true
336 },
337 "databaseCpuSeconds": {
338 "seconds": 0.14,
339 "complete": true
340 },
341 "databaseDelta": {
342 "transactions": 68,
343 "rollbacks": 0,
344 "inserted": 46,
345 "updated": 110,
346 "walBytes": 264874,
347 "durableReceipts": 10
348 },
349 "sentPayloadBytes": 184355,
350 "receivedPayloadBytes": 500128
351 },
352 {
353 "target": 4,
354 "admitted": 4,
355 "occupancy": [
356 {
357 "room": "route:capacity:hearth:1",
358 "players": 4
359 }
360 ],
361 "elapsedSeconds": 20.002145285999998,
362 "peakRoomRssMiB": 412.64453125,
363 "worstRecentTickP95Ms": 11.4,
364 "minimumAckHz": 29.996782416131886,
365 "worstAckP95Ms": 303.46,
366 "gatewayAndRoomsCpuSeconds": {
367 "seconds": 6.79,
368 "complete": true
369 },
370 "databaseCpuSeconds": {
371 "seconds": 0.25,
372 "complete": true
373 },
374 "databaseDelta": {
375 "transactions": 83,
376 "rollbacks": 0,
377 "inserted": 38,
378 "updated": 57,
379 "walBytes": 50315,
380 "durableReceipts": 20
381 },
382 "sentPayloadBytes": 368202,
383 "receivedPayloadBytes": 1300551
384 },
385 {
386 "target": 8,
387 "admitted": 8,
388 "occupancy": [
389 {
390 "room": "route:capacity:hearth:1",
391 "players": 8
392 }
393 ],
394 "elapsedSeconds": 20.001838925999998,
395 "peakRoomRssMiB": 462.56640625,
396 "worstRecentTickP95Ms": 13.42,
397 "minimumAckHz": 29.997241864600348,
398 "worstAckP95Ms": 305.64,
399 "gatewayAndRoomsCpuSeconds": {
400 "seconds": 7.83,
401 "complete": true
402 },
403 "databaseCpuSeconds": {
404 "seconds": 0.43,
405 "complete": true
406 },
407 "databaseDelta": {
408 "transactions": 138,
409 "rollbacks": 0,
410 "inserted": 76,
411 "updated": 95,
412 "walBytes": 117169,
413 "durableReceipts": 40
414 },
415 "sentPayloadBytes": 737875,
416 "receivedPayloadBytes": 3826305
417 },
418 {
419 "target": 16,
420 "admitted": 16,
421 "occupancy": [
422 {
423 "room": "route:capacity:hearth:1",
424 "players": 8
425 },
426 {
427 "room": "route:capacity:hearth:2",
428 "players": 8
429 }
430 ],
431 "elapsedSeconds": 20.002331507000026,
432 "peakRoomRssMiB": 473.02734375,
433 "worstRecentTickP95Ms": 12.21,
434 "minimumAckHz": 29.996503147146807,
435 "worstAckP95Ms": 314.43,
436 "gatewayAndRoomsCpuSeconds": {
437 "seconds": 15.25,
438 "complete": true
439 },
440 "databaseCpuSeconds": {
441 "seconds": 0.8,
442 "complete": true
443 },
444 "databaseDelta": {
445 "transactions": 293,
446 "rollbacks": 0,
447 "inserted": 164,
448 "updated": 205,
449 "walBytes": 211688,
450 "durableReceipts": 80
451 },
452 "sentPayloadBytes": 1474814,
453 "receivedPayloadBytes": 7648508
454 },
455 {
456 "target": 16,
457 "admitted": 16,
458 "occupancy": [
459 {
460 "room": "route:capacity:hearth:1",
461 "players": 8
462 },
463 {
464 "room": "route:capacity:hearth:2",
465 "players": 8
466 }
467 ],
468 "elapsedSeconds": 20.002023362000006,
469 "peakRoomRssMiB": 487.15625,
470 "worstRecentTickP95Ms": 13.68,
471 "minimumAckHz": 29.996965264018463,
472 "worstAckP95Ms": 250,
473 "gatewayAndRoomsCpuSeconds": {
474 "seconds": 13.88,
475 "complete": true
476 },
477 "databaseCpuSeconds": {
478 "seconds": 0.73,
479 "complete": true
480 },
481 "databaseDelta": {
482 "transactions": 298,
483 "rollbacks": 0,
484 "inserted": 176,
485 "updated": 221,
486 "walBytes": 249200,
487 "durableReceipts": 80
488 },
489 "sentPayloadBytes": 1467200,
490 "receivedPayloadBytes": 7602063
491 }
492 ],
493 "reconnectStorm": {
494 "players": 16,
495 "milliseconds": 1028.093531999999,
496 "failed": [],
497 "sameIdentities": true,
498 "sameInventory": true
499 },
500 "extraArrival": {
501 "status": 409,
502 "atPlayers": 16
503 },
504 "shutdown": {
505 "code": 0,
506 "signal": null
507 }
508 },
509 "regionalBrowser": {
510 "statistics": {
511 "startTime": "2026-10-25T16:53:09.761Z",
512 "duration": 64185.824,
513 "expected": 1,
514 "skipped": 0,
515 "unexpected": 0,
516 "flaky": 0
517 },
518 "scenarios": [
519 {
520 "title": "a polished doorway places friends together, opens a second room and recovers routed travelers",
521 "status": "passed",
522 "durationMs": 62585,
523 "errors": [],
524 "attachments": [
525 {
526 "name": "regional-health.json",
527 "data": {
528 "version": 1,
529 "capturedAt": "2026-10-25T16:53:32.698Z",
530 "ready": true,
531 "region": "test-west",
532 "activeRooms": 2,
533 "maxActiveRooms": 2,
534 "rooms": [
535 {
536 "room": "route:test-west:hearth:1",
537 "engine": "25506cbfb6c45e7cdca1b1101a3cae62ac0aa6f1b71e3d87a268a3bd2da2259a",
538 "release": "4ea2693f7232f7c99b4a94a813270f6ac13c1741d244e5425691b502e9b70508",
539 "state": "ready",
540 "epoch": "1",
541 "leaseRemainingMs": 4748,
542 "players": 2,
543 "playerCap": 2,
544 "acceptingNew": true,
545 "metrics": {
546 "version": 1,
547 "windowSeconds": 60,
548 "recent": {
549 "windowSeconds": 10,
550 "eventLoop": {
551 "count": 48,
552 "mean": 0.57,
553 "max": 5.45,
554 "p95": 4
555 },
556 "tick": {
557 "count": 289,
558 "mean": 5.57,
559 "max": 16.17,
560 "p95": 16
561 },
562 "storage": {
563 "count": 14,
564 "mean": 19.29,
565 "max": 75.51,
566 "p95": 75.51
567 }
568 },
569 "admission": {
570 "accepting": true,
571 "reasons": [],
572 "windowSeconds": 10
573 },
574 "eventLoopMs": {
575 "count": 99,
576 "mean": 3.08,
577 "max": 135.4,
578 "p95": 8
579 },
580 "tickMs": {
581 "count": 564,
582 "mean": 4.77,
583 "max": 18.97,
584 "p95": 16
585 },
586 "droppedSimulationSeconds": 0.087,
587 "queue": {
588 "pending": 0,
589 "oldestWorkMs": 0,
590 "waitMs": {
591 "count": 14,
592 "mean": 0.04,
593 "max": 0.14,
594 "p95": 0.14
595 },
596 "inputQueued": 9
597 },
598 "storage": {
599 "transactionMs": {
600 "count": 48,
601 "mean": 17.74,
602 "max": 106.54,
603 "p95": 100
604 },
605 "commitMs": {
606 "count": 48,
607 "mean": 0.31,
608 "max": 4.85,
609 "p95": 2
610 },
611 "failures": 0
612 },
613 "connections": {
614 "players": 2,
615 "joinsLastMinute": 2,
616 "reconnectsLastMinute": 0
617 },
618 "memory": {
619 "rssBytes": 312598528,
620 "heapUsedBytes": 93242984,
621 "externalBytes": 12386589,
622 "arrayBufferBytes": 7337411,
623 "rssLimitBytes": 536870912
624 }
625 }
626 },
627 {
628 "room": "route:test-west:hearth:2",
629 "engine": "25506cbfb6c45e7cdca1b1101a3cae62ac0aa6f1b71e3d87a268a3bd2da2259a",
630 "release": "4ea2693f7232f7c99b4a94a813270f6ac13c1741d244e5425691b502e9b70508",
631 "state": "ready",
632 "epoch": "1",
633 "leaseRemainingMs": 4925,
634 "players": 1,
635 "playerCap": 2,
636 "acceptingNew": false,
637 "metrics": {
638 "version": 1,
639 "windowSeconds": 60,
640 "recent": {
641 "windowSeconds": 10,
642 "eventLoop": {
643 "count": 46,
644 "mean": 6.43,
645 "max": 269.45,
646 "p95": 4
647 },
648 "tick": {
649 "count": 277,
650 "mean": 3.62,
651 "max": 12.08,
652 "p95": 8
653 },
654 "storage": {
655 "count": 16,
656 "mean": 20.94,
657 "max": 70.29,
658 "p95": 70.29
659 }
660 },
661 "admission": {
662 "accepting": false,
663 "reasons": [
664 "event-loop"
665 ],
666 "windowSeconds": 10
667 },
668 "eventLoopMs": {
669 "count": 59,
670 "mean": 5.69,
671 "max": 269.45,
672 "p95": 8
673 },
674 "tickMs": {
675 "count": 277,
676 "mean": 3.62,
677 "max": 12.08,
678 "p95": 8
679 },
680 "droppedSimulationSeconds": 0.278,
681 "queue": {
682 "pending": 0,
683 "oldestWorkMs": 0,
684 "waitMs": {
685 "count": 6,
686 "mean": 0.05,
687 "max": 0.09,
688 "p95": 0.09
689 },
690 "inputQueued": 1
691 },
692 "storage": {
693 "transactionMs": {
694 "count": 29,
695 "mean": 20.3,
696 "max": 70.29,
697 "p95": 70.29
698 },
699 "commitMs": {
700 "count": 29,
701 "mean": 0.41,
702 "max": 2.44,
703 "p95": 2
704 },
705 "failures": 0
706 },
707 "connections": {
708 "players": 1,
709 "joinsLastMinute": 1,
710 "reconnectsLastMinute": 0
711 },
712 "memory": {
713 "rssBytes": 299855872,
714 "heapUsedBytes": 76402304,
715 "externalBytes": 10806598,
716 "arrayBufferBytes": 5822956,
717 "rssLimitBytes": 536870912
718 }
719 }
720 }
721 ]
722 }
723 },
724 {
725 "name": "regional-journey.json",
726 "data": {
727 "roomA": "route:test-west:hearth:1",
728 "roomB": "route:test-west:hearth:2",
729 "players": 3,
730 "capacity": 2,
731 "sharedRoom": true,
732 "isolatedInventory": true,
733 "isolatedStall": true,
734 "routerRestart": true,
735 "keptPages": 2,
736 "returnCredential": true,
737 "addedRoundTripLatencyMs": 150,
738 "errors": []
739 }
740 }
741 ]
742 }
743 ]
744 },
745 "cooperativeBrowser": {
746 "statistics": {
747 "startTime": "2026-10-25T16:54:29.546Z",
748 "duration": 39543.94,
749 "expected": 1,
750 "skipped": 0,
751 "unexpected": 0,
752 "flaky": 0
753 },
754 "scenarios": [
755 {
756 "title": "two travelers recover from graceful restart, lease failure and a stopped runtime without reloading",
757 "status": "passed",
758 "durationMs": 37902,
759 "errors": [],
760 "attachments": [
761 {
762 "name": "lifecycle-journey.json",
763 "data": {
764 "profile": "cooperative",
765 "reconnectMs": 2210.4791459999997,
766 "stallExitMs": 6949.156109000003,
767 "actor": "20292fdc-9d6b-4746-9d83-67c4aded240f",
768 "companion": "e0096ee5-5fa6-44a4-83ae-48c00617ad02",
769 "keptPage": true,
770 "keptPages": 2,
771 "gracefulExit": 0,
772 "failedExit": 1,
773 "stalledExit": 1,
774 "addedRoundTripLatencyMs": 150,
775 "errors": [],
776 "history": [
777 {
778 "time": 1081.199999988079,
779 "status": "connecting",
780 "draining": false,
781 "epoch": "0"
782 },
783 {
784 "time": 1260.5,
785 "status": "connected",
786 "draining": false,
787 "epoch": "1"
788 },
789 {
790 "time": 9761.399999976158,
791 "status": "reconnecting",
792 "draining": true,
793 "epoch": "1"
794 },
795 {
796 "time": 12522.599999964237,
797 "status": "connected",
798 "draining": false,
799 "epoch": "2"
800 },
801 {
802 "time": 16817.599999964237,
803 "status": "reconnecting",
804 "draining": false,
805 "epoch": "2"
806 },
807 {
808 "time": 18729,
809 "status": "connected",
810 "draining": false,
811 "epoch": "3"
812 },
813 {
814 "time": 25216.69999998808,
815 "status": "reconnecting",
816 "draining": false,
817 "epoch": "3"
818 },
819 {
820 "time": 27743.099999964237,
821 "status": "connected",
822 "draining": false,
823 "epoch": "4"
824 }
825 ]
826 }
827 }
828 ]
829 }
830 ]
831 },
832 "trustedBrowser": {
833 "statistics": {
834 "startTime": "2026-10-25T16:55:23.343Z",
835 "duration": 99786.355,
836 "expected": 1,
837 "skipped": 0,
838 "unexpected": 0,
839 "flaky": 0
840 },
841 "scenarios": [
842 {
843 "title": "persistent players share objects and restore committed travel without local position saves",
844 "status": "passed",
845 "durationMs": 98118,
846 "errors": [],
847 "attachments": [
848 {
849 "name": "persistent-garden-report.json",
850 "data": {
851 "engine": "0.1.0",
852 "world": "darkwind",
853 "release": "lantern-house.storage.1",
854 "playtest": null,
855 "pinnedEngine": null,
856 "development": null,
857 "time": "2026-10-25T16:56:15.099Z",
858 "browser": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/141.0.7390.37 Safari/537.36",
859 "webgpu": true,
860 "quality": "high",
861 "startupStages": {
862 "started": 406,
863 "admission": 890.5999999642372,
864 "graphics": 4072.099999964237,
865 "simulation": 2339.5,
866 "presentation": 4073,
867 "room": 2863.399999976158,
868 "ready": 4780.599999964237,
869 "failed": null
870 },
871 "graphicsLifecycle": [
872 {
873 "stage": "probe",
874 "generation": 0,
875 "at": 890.2999999523163
876 },
877 {
878 "stage": "device",
879 "generation": 1,
880 "at": 1793.199999988079
881 },
882 {
883 "stage": "adapter-request",
884 "generation": 1,
885 "at": 1793.3999999761581
886 },
887 {
888 "stage": "device-request",
889 "generation": 1,
890 "at": 1794.1000000238419
891 },
892 {
893 "stage": "resources",
894 "generation": 1,
895 "at": 1795.8999999761581
896 },
897 {
898 "stage": "shader-modules",
899 "generation": 1,
900 "at": 1808.300000011921
901 },
902 {
903 "stage": "shader-validation",
904 "generation": 1,
905 "at": 1808.800000011921
906 },
907 {
908 "stage": "shader-pipelines",
909 "generation": 1,
910 "at": 2085
911 },
912 {
913 "stage": "shader-identity",
914 "generation": 1,
915 "at": 2434
916 },
917 {
918 "stage": "initial-upload",
919 "generation": 1,
920 "at": 2435.600000023842
921 },
922 {
923 "stage": "catalog",
924 "generation": 1,
925 "at": 2440.5
926 },
927 {
928 "stage": "model-prepare",
929 "generation": 1,
930 "at": 2440.899999976158
931 },
932 {
933 "stage": "model-allocate",
934 "generation": 1,
935 "at": 3286.399999976158
936 },
937 {
938 "stage": "model-upload",
939 "generation": 1,
940 "at": 3375.699999988079
941 },
942 {
943 "stage": "model-install",
944 "generation": 1,
945 "at": 3377.199999988079
946 },
947 {
948 "stage": "actors",
949 "generation": 1,
950 "at": 3379.699999988079
951 },
952 {
953 "stage": "ready",
954 "generation": 1,
955 "at": 4069.399999976158
956 }
957 ],
958 "renderPlacement": "worker",
959 "viewport": [
960 960,
961 640,
962 1
963 ],
964 "place": "garden",
965 "tick": "67",
966 "position": [
967 -8.882930160325486e-06,
968 0.7850872278213501,
969 5.999992370605469
970 ],
971 "frameInterval": {
972 "p50": 216.59999999999945,
973 "p95": 516.5999999999995
974 },
975 "tickMs": 0.8999999761581421,
976 "renderObservedAtMs": 7200.899999976158,
977 "render": {
978 "instances": 578,
979 "triangles": 91980,
980 "visibleInstances": 367,
981 "shadowInstances": 578,
982 "visibleTriangles": 61044,
983 "shadowTriangles": 91980,
984 "drawCalls": 9,
985 "buffers": 53,
986 "textures": 4,
987 "targetBytes": 24150016,
988 "targetGeneration": 1,
989 "width": 960,
990 "height": 640,
991 "frameMs": 3.900000035762787,
992 "submittedFrames": 6,
993 "completedFrames": 5,
994 "failedFrames": 0,
995 "cancelledFrames": 0,
996 "pendingFrames": 1,
997 "skippedFrames": 157,
998 "completionWaitMs": 508.30000001192093,
999 "maxCompletionWaitMs": 546.7999999523163,
1000 "lastSubmittedAtMs": 6710.5,
1001 "lastCompletedAtMs": 6694.199999988079
1002 },
1003 "actors": {
1004 "states": {},
1005 "rigged": 0,
1006 "walking": 0,
1007 "airborne": 0,
1008 "stalled": 0,
1009 "samples": 0,
1010 "matrices": 0
1011 },
1012 "audio": {
1013 "context": "inactive",
1014 "enabled": false,
1015 "paused": false,
1016 "levels": {
1017 "master": 0.65,
1018 "music": 0.7,
1019 "ambience": 0.6,
1020 "dialogue": 1,
1021 "effects": 0.7
1022 }
1023 },
1024 "controller": {
1025 "connected": false,
1026 "active": false
1027 },
1028 "presentationTransport": {
1029 "route": "direct",
1030 "received": 1,
1031 "returned": 1,
1032 "capacity": 4194304
1033 },
1034 "renderGraph": {
1035 "plan": {
1036 "textures": [
1037 {
1038 "name": "depth",
1039 "format": "depth24plus",
1040 "extent": {
1041 "kind": "viewport"
1042 },
1043 "external": false,
1044 "sampled": false,
1045 "attachment": true,
1046 "firstUse": 1,
1047 "lastUse": 1,
1048 "writer": "scene"
1049 },
1050 {
1051 "name": "hdr",
1052 "format": "rgba16float",
1053 "extent": {
1054 "kind": "viewport"
1055 },
1056 "external": false,
1057 "sampled": true,
1058 "attachment": true,
1059 "firstUse": 1,
1060 "lastUse": 2,
1061 "writer": "scene"
1062 },
1063 {
1064 "name": "output",
1065 "format": "bgra8unorm",
1066 "extent": {
1067 "kind": "viewport"
1068 },
1069 "external": true,
1070 "sampled": false,
1071 "attachment": true,
1072 "firstUse": 2,
1073 "lastUse": 2,
1074 "writer": "post"
1075 },
1076 {
1077 "name": "shadow",
1078 "format": "depth32float",
1079 "extent": {
1080 "kind": "fixed",
1081 "width": 2048,
1082 "height": 2048
1083 },
1084 "external": false,
1085 "sampled": true,
1086 "attachment": true,
1087 "firstUse": 0,
1088 "lastUse": 1,
1089 "writer": "shadow"
1090 }
1091 ],
1092 "passes": [
1093 {
1094 "name": "shadow",
1095 "after": [],
1096 "reads": [],
1097 "colors": [],
1098 "depth": {
1099 "resource": "shadow",
1100 "load": "clear",
1101 "store": "store"
1102 }
1103 },
1104 {
1105 "name": "scene",
1106 "after": [],
1107 "reads": [
1108 "shadow"
1109 ],
1110 "colors": [
1111 {
1112 "resource": "hdr",
1113 "load": "clear",
1114 "store": "store"
1115 }
1116 ],
1117 "depth": {
1118 "resource": "depth",
1119 "load": "clear",
1120 "store": "discard"
1121 }
1122 },
1123 {
1124 "name": "post",
1125 "after": [],
1126 "reads": [
1127 "hdr"
1128 ],
1129 "colors": [
1130 {
1131 "resource": "output",
1132 "load": "clear",
1133 "store": "store"
1134 }
1135 ]
1136 }
1137 ]
1138 },
1139 "census": {
1140 "generation": 1,
1141 "textures": 3,
1142 "estimatedBytes": 24150016,
1143 "width": 960,
1144 "height": 640
1145 }
1146 },
1147 "shaders": {
1148 "requestedRevision": "1",
1149 "activeRevision": "1",
1150 "hash": "039684b97282110739cbee452249807ac2ff2e2cbcefe32a87cf2da1454a8297",
1151 "compilingRevision": null,
1152 "pendingRevision": null,
1153 "retainedSourceBytes": 0,
1154 "disposed": false,
1155 "last": {
1156 "revision": "1",
1157 "status": "applied",
1158 "diagnostics": []
1159 }
1160 },
1161 "graphicsRecovery": {
1162 "status": "idle",
1163 "attempts": 0,
1164 "limit": 2,
1165 "timeoutMs": 20000,
1166 "inFlight": false
1167 },
1168 "graphicsIncidents": [],
1169 "simulationWatchdog": {
1170 "status": "healthy",
1171 "probes": 5,
1172 "acknowledged": 5,
1173 "graceResets": 0
1174 },
1175 "simulationRecovery": {
1176 "status": "idle",
1177 "attempts": 0,
1178 "limit": 2,
1179 "timeoutMs": 45000,
1180 "inFlight": false
1181 },
1182 "simulationCheckpoint": {
1183 "available": true,
1184 "tick": "51",
1185 "received": 7159.799999952316,
1186 "captureMs": 97.89999997615814,
1187 "pending": false,
1188 "issue": ""
1189 },
1190 "canonicalEntities": 1500,
1191 "modelResidency": {
1192 "hash": "c27f3b6d1093484b36e2263b8f7deffdc9fb50d8583f122cb4dba0d9fb77c6f9",
1193 "buffers": 47,
1194 "bytes": 1981492,
1195 "textures": 1,
1196 "update": {
1197 "status": "ready",
1198 "attempts": 1,
1199 "limit": 1,
1200 "timeoutMs": 20000,
1201 "inFlight": false
1202 }
1203 },
1204 "save": "postgresql",
1205 "room": {
1206 "status": "connected",
1207 "players": 2,
1208 "peerRows": 1,
1209 "interest": {
1210 "place": "garden",
1211 "sequence": "28",
1212 "total": 2
1213 },
1214 "epoch": "1",
1215 "revision": "26",
1216 "durableRelease": "01983259a283bb144e74c092ab300031e06dfb8d08fe6b46dab343d1fa637180",
1217 "playerRevision": "14"
1218 },
1219 "knownLimits": [
1220 "Trusted static-world preview",
1221 "Single room process",
1222 "Original traveler rig; environment uses procedural geometry",
1223 "Desktop WebGPU only"
1224 ]
1225 }
1226 },
1227 {
1228 "name": "persistent-journey.json",
1229 "data": {
1230 "transport": {
1231 "sent": 60,
1232 "received": 121,
1233 "minSendDelayMs": 75,
1234 "minReceiveDelayMs": 75,
1235 "droppedCaptures": 0,
1236 "closes": []
1237 },
1238 "privateKeepsakes": 1,
1239 "privateTrafficVerified": true,
1240 "gardenTravelMs": 4104.724003000003,
1241 "addedRoundTripLatencyMs": 150,
1242 "actor": "8140b025-646b-4ae0-a02c-0bf5cb0dc1ab",
1243 "place": "sanctuary",
1244 "revision": "21",
1245 "inventory": [
1246 "keeper-lantern"
1247 ],
1248 "otherTraveler": "ec4f57d1-a6de-40ce-8815-b7f289788297",
1249 "errors": []
1250 }
1251 }
1252 ]
1253 }
1254 ]
1255 },
1256 "cancellation": {
1257 "command": "SIGTERM isolated benchmark after first room ready",
1258 "exitCode": 1,
1259 "directoryRemoved": true,
1260 "liveOwnedProcessesAfterExit": [],
1261 "partialResult": "failed",
1262 "gatewayShutdown": {
1263 "code": 0,
1264 "signal": null
1265 },
1266 "partialError": "Error: Benchmark cancelled\n at process.<anonymous> (/home/jason/coding/dw-web/tools/bench/room-capacity.ts:16:124)\n at process.emit (node:events:519:28)"
1267 },
1268 "investigation": [
1269 {
1270 "record": "room-capacity-baseline.json",
1271 "finding": "Before prepared sharing, only eleven travelers admitted (3 + 8); sampled first-room RSS exceeded unchanged 512 MiB policy. Movement and reconnect checks passed; overall capacity criteria did not."
1272 },
1273 {
1274 "record": "room-capacity-first-prepared.json",
1275 "finding": "Prepared sharing reached eight travelers in each room within movement and health budgets. Eleven reconnects failed because the bot sent heartbeat before admission; unlike the real client. A held-baseline socket test reproduced the incorrect heartbeat and passed after gating on baseline. No host limits or deadlines changed."
1276 },
1277 {
1278 "record": "room-capacity-cpu-gap.json",
1279 "finding": "Corrected bots preserved all sixteen identities/inventories and refused overflow. A short-lived PostgreSQL child left incomplete CPU coverage at the four-traveler stage. Accounting now includes reaped descendant CPU; real child/grandchild process tests verify retention and missing/replaced root rejection."
1280 }
1281 ],
1282 "limits": [
1283 "Local 20-second stages after 12-second warmup; not long-soak stability or a universal production player limit.",
1284 "Protocol movement and autosaves with one pickup per room; no dense rendered crowd, cross-place travel load or adversarial traffic qualification.",
1285 "Payload byte counts exclude WebSocket/TLS framing, HTTP assets and operator requests.",
1286 "Linux CPU samples are bounded process-tree observations, not atomic kernel snapshots; database counters include observation overhead and can lag.",
1287 "No Docker/Coolify execution, remote CI, physical device matrix or cloud cost qualification.",
1288 "No numbered roadmap milestone closed. Character and shared-arrival camera polish remains deferred."
1289 ]
1290}
1291