REPOSITORY SOURCE

host-health-acceptance.json

docs/evidence/host-health-acceptance.json

1{
2  "recordedAt": "2026-10-25T16:21:43.942765+00:00",
3  "baseCommit": "1a0141f5c6d6cc253464762d59cb066f5bf78ce1",
4  "scope": "Bounded persistent-host health measurements, pressure-aware new admission, retained-room return compatibility and authenticated regional operator inspection. Full milestones remain open.",
5  "fullPlanEstimatePercent": 69,
6  "sourceSha256": {
7    "compose.rooms.yaml": "4449ca16d6ab9810866c9f6835c3afb98024e648bc28ef810d332aedbbae999d",
8    "services/control/postgres.ts": "b8f5e6843e09a6d63150b8ff164e9f8778173298b3895fb676d51f72e4aa396c",
9    "services/engine/registry.ts": "9d0ce5103aa7f1b3e35bdfc89825e902fe324da952112bed2dfce3ec7641bdf7",
10    "services/engine/runtime.ts": "f4b921499d5baae283d499e7452a85fdd9ed501c8c25873196a1d3596de111e9",
11    "services/observability/window.ts": "1c551268b91f15bbc2c9b6d845160d512c1e70d18b3a36022038eda067316c41",
12    "services/persistent/health.ts": "6cee1b65f9147f33b4fe5fec22a6f26a2518ac46a3011b07f86d6460c5d2b1a6",
13    "services/persistent/main.ts": "b90974c66ffa0eea09ae395e5cb029e18d19f0595cd544ee1d6dad24564f635b",
14    "services/persistent/server.ts": "da2d49ffd4f7bb585913a147319975c463fbf531bae119e0d4d7bc8c1be56ac8",
15    "services/routing/main.ts": "cd42e0dc80a95d95e7db2626bb35b715a27b92a2a21069ca1c2cea44e78445f9",
16    "services/routing/pool.ts": "c6d7066453979404069372a57f6f20f1e67dcf9fde7b4c970bd148cbd2ed85c1",
17    "services/routing/server.ts": "b480e8856debbecc60fb61bfd46af6739ebaa58544e2fb100746c2cf8197acbf",
18    "services/sim-host/motion.ts": "e1730e326c61d85f7180a03ec2839400289e0d41689243e6258126a4ebd083c2",
19    "tests/browser/room-routing.spec.ts": "9830af95278c41d008fc779a588c7777429f351f9cf23f92048b3f8f652c39c4",
20    "tests/fixtures/persistent-room-process.ts": "a0387f78bd2f59ec122cc1098920bea4dbe08e07f5c7ae76a3a1c10a4d3a27ab",
21    "tests/fixtures/regional-browser-host.ts": "79db74542fc4e16fbbf87853cdc6876a9f0d7570f8dc8496179700d88bc28bb7",
22    "tests/host-health.test.ts": "26cbccfdefabd59c6d1f471b3d277ed479cbc6b6c7578ee012c5eb1a42578b0c",
23    "tests/room-routing.test.ts": "c68ad0a065fcb607ce6eb6ad45e80486d72a13e3102e990f28af0f1f7550e96a",
24    "tools/cli/test-control.mjs": "74e745fef289ce1c2850a1da88c2a01fea06fb3fb2255188e74f3833a0412aa3"
25  },
26  "databaseSchema": 5,
27  "newDatabaseMigration": false,
28  "healthVersion": 1,
29  "typeAndImports": {
30    "command": "npm run check",
31    "result": "passed; 127 package source files"
32  },
33  "headless": {
34    "command": "npm test",
35    "tests": 691,
36    "pass": 635,
37    "fail": 0,
38    "skipped": 56,
39    "log": "host-health-headless.tap"
40  },
41  "control": {
42    "command": "npm run test:control",
43    "tests": 62,
44    "pass": 62,
45    "fail": 0,
46    "skipped": 0,
47    "log": "host-health-control.tap"
48  },
49  "regional": {
50    "command": "npm run test:browser:rooms",
51    "statistics": {
52      "startTime": "2026-10-25T16:15:00.344Z",
53      "duration": 62932.795,
54      "expected": 1,
55      "skipped": 0,
56      "unexpected": 0,
57      "flaky": 0
58    },
59    "scenarios": [
60      {
61        "title": "a polished doorway places friends together, opens a second room and recovers routed travelers",
62        "durationMs": 61091,
63        "attachments": [
64          {
65            "name": "regional-journey.json",
66            "data": {
67              "roomA": "route:test-west:hearth:1",
68              "roomB": "route:test-west:hearth:2",
69              "players": 3,
70              "capacity": 2,
71              "sharedRoom": true,
72              "isolatedInventory": true,
73              "isolatedStall": true,
74              "routerRestart": true,
75              "keptPages": 2,
76              "returnCredential": true,
77              "addedRoundTripLatencyMs": 150,
78              "errors": []
79            }
80          }
81        ]
82      }
83    ],
84    "operatorSnapshot": "host-health-regional.json"
85  },
86  "cooperative": {
87    "command": "npm run test:browser:lifecycle:cooperative",
88    "statistics": {
89      "startTime": "2026-10-25T16:16:14.239Z",
90      "duration": 39898.553,
91      "expected": 1,
92      "skipped": 0,
93      "unexpected": 0,
94      "flaky": 0
95    },
96    "scenarios": [
97      {
98        "title": "two travelers recover from graceful restart, lease failure and a stopped runtime without reloading",
99        "durationMs": 38150,
100        "attachments": [
101          {
102            "name": "lifecycle-journey.json",
103            "data": {
104              "profile": "cooperative",
105              "reconnectMs": 2603.7335010000006,
106              "stallExitMs": 5914.285864000001,
107              "actor": "2c44ff8b-0e56-4444-8a17-b113258b3cc1",
108              "companion": "505d7d67-f424-4f35-9115-65a02e200dd3",
109              "keptPage": true,
110              "keptPages": 2,
111              "gracefulExit": 0,
112              "failedExit": 1,
113              "stalledExit": 1,
114              "addedRoundTripLatencyMs": 150,
115              "errors": [],
116              "history": [
117                {
118                  "time": 1116.5999999642372,
119                  "status": "connecting",
120                  "draining": false,
121                  "epoch": "0"
122                },
123                {
124                  "time": 1288.5999999642372,
125                  "status": "connected",
126                  "draining": false,
127                  "epoch": "1"
128                },
129                {
130                  "time": 9874,
131                  "status": "reconnecting",
132                  "draining": true,
133                  "epoch": "1"
134                },
135                {
136                  "time": 12731.199999988079,
137                  "status": "connected",
138                  "draining": false,
139                  "epoch": "2"
140                },
141                {
142                  "time": 16931.19999998808,
143                  "status": "reconnecting",
144                  "draining": false,
145                  "epoch": "2"
146                },
147                {
148                  "time": 18753.099999964237,
149                  "status": "connected",
150                  "draining": false,
151                  "epoch": "3"
152                },
153                {
154                  "time": 24290,
155                  "status": "reconnecting",
156                  "draining": false,
157                  "epoch": "3"
158                },
159                {
160                  "time": 26832.899999976158,
161                  "status": "connected",
162                  "draining": false,
163                  "epoch": "4"
164                }
165              ]
166            }
167          }
168        ]
169      }
170    ]
171  },
172  "trusted": {
173    "command": "npm run test:browser:trusted",
174    "statistics": {
175      "startTime": "2026-10-25T16:19:10.781Z",
176      "duration": 106026.73700000001,
177      "expected": 1,
178      "skipped": 0,
179      "unexpected": 0,
180      "flaky": 0
181    },
182    "scenarios": [
183      {
184        "title": "persistent players share objects and restore committed travel without local position saves",
185        "durationMs": 104338,
186        "attachments": [
187          {
188            "name": "persistent-journey.json",
189            "data": {
190              "transport": {
191                "sent": 74,
192                "received": 169,
193                "minSendDelayMs": 75,
194                "minReceiveDelayMs": 75,
195                "droppedCaptures": 0,
196                "closes": []
197              },
198              "privateKeepsakes": 1,
199              "privateTrafficVerified": true,
200              "gardenTravelMs": 5592.606218000001,
201              "addedRoundTripLatencyMs": 150,
202              "actor": "6ccf6a54-a46c-42b9-aa35-79f99d4a6c22",
203              "place": "sanctuary",
204              "revision": "20",
205              "inventory": [
206                "keeper-lantern"
207              ],
208              "otherTraveler": "05042486-502e-494a-a61d-db51489d3365",
209              "errors": []
210            }
211          }
212        ]
213      }
214    ],
215    "earlierFailedAttempt": "host-health-trusted-first.json"
216  },
217  "compose": {
218    "command": "docker compose -f compose.rooms.yaml config --quiet",
219    "result": "passed with placeholder required environment and operator token; containers not executed"
220  },
221  "environment": {
222    "node": "22.23.4",
223    "browser": "Chromium 141.0.7390.37 headless shell; SwiftShader Vulkan",
224    "playwright": "1.56.1",
225    "host": "Linux 7.2.8-9-omarchy x86_64",
226    "database": "isolated native PostgreSQL; fsync and synchronous_commit enabled"
227  },
228  "contracts": [
229    "Fixed memory: sixty one-second buckets per metric, fixed histogram boundaries, bounded recognition of repeat successful hellos and no per-actor metric labels.",
230    "COMMIT latency is observed only after PostgreSQL acknowledges; callback failure after commit does not become a failed database transaction.",
231    "Queue age includes executing work and is visible while an actual PostgreSQL row lock blocks the transaction.",
232    "New admission pauses for recent timer delay, slow trusted ticks/transactions, durable queue pressure or RSS over its soft budget. It does not terminate live players or abandon already admitted work.",
233    "A real responsive but pressured room is skipped in favor of a healthy compatible room; its saved traveler still reconnects.",
234    "An older private health envelope without measurements is excluded from new matching but still accepts its saved traveler. New slot creation requires the health ABI before creating room state.",
235    "The separate operator bearer secret gates aggregate inspection. Room passphrases fail authentication; reports omit actors and credentials; reads never start rooms.",
236    "Real three-traveler regional recovery, standalone cooperative lifecycle, trusted inventory/rewards/travel and worker recovery remain functional."
237  ],
238  "observations": {
239    "twoTravelerTickMeanMs": 5.21,
240    "otherRoomTimerDelayMaxMs": 421.4,
241    "interpretation": "A local software-rendered fixture sample. The latter room paused new admission while its connected traveler continued; this is not a production capacity result."
242  },
243  "developmentFindings": [
244    "The initial 16 focused native checks passed; the full final native suite additionally covers held queue work and missing retained health metadata.",
245    "The first trusted browser attempt timed out on the existing 5s sanctuary poll. Its immediate report had already reached sanctuary with both travelers connected and no graphics incident; software-rendered frame p95 was about 617ms. The unchanged repeat passed. This timing reliability limit is retained rather than hidden or addressed by increasing a deadline."
246  ],
247  "limits": [
248    "Rounded full-program estimate remains 69%; no numbered milestone closed.",
249    "Admission thresholds are initial policy, not qualified capacity/SLO limits. RSS is a soft admission budget; OS/container hard resource isolation is separate.",
250    "Measurements reset per process. They do not provide historical monitoring, alerting, complete support bundles or general session analytics.",
251    "Duration p95 values are histogram upper bounds; one-second buckets introduce up to one-second boundary quantization.",
252    "Saved returns remain eligible under pressure but still obey capacity and durable lease checks. Old retained engines require explicit upgrades for measured new admission.",
253    "Docker/Coolify execution, automatic container restart timing, remote CI, load/long-soak and physical device/GPU qualification remain open.",
254    "Software-rendered transition timing remains variable; one unchanged browser retry was needed during this increment.",
255    "Character models and shared-arrival camera overlap remain in the requested final polish backlog."
256  ]
257}
258