fix(gateway): harden websocket streaming under client backpressure

This commit is contained in:
2026-09-08 00:18:41 +03:00
parent c730cb818d
commit 7902800ff7
7 changed files with 120 additions and 17 deletions
+25
View File
@@ -924,6 +924,31 @@ the ESP32-C6 Flash, RAM, socket, and network limits.
- Physical evidence is still pending: `/dev/ttyACM0` was absent on 2026-09-05,
so the production images could not be uploaded and acceptance criteria 2--5
could not be recorded. Milestone 010 therefore remains `IN_PROGRESS`.
- On 2026-09-07, a further target-availability check found no `/dev/ttyACM0`,
`/dev/ttyUSB0`, or `/dev/ttyUSB1` device node. The documented station target
`http://192.168.1.50/health` also timed out after three seconds. Physical
acceptance criteria 2--5 remain pending; Milestone 010 is `IN_PROGRESS`.
- On 2026-09-08, host-level USB access found the ESP32-C6 at `/dev/ttyACM0`
(USB-Serial/JTAG, MAC `58:e6:c5:18:f7:b8`). Production firmware and
LittleFS uploads completed with verified hashes. Boot logs confirmed app
version `0.10.0`, 4 MB partitions, LittleFS mount, station IP
`192.168.1.50`, all routes, and health `serving`.
- The physical M010 harness initially exposed two integration defects: match
activation filled the fixed 12-entry queue before map streaming, and the
ESP-IDF send path could return short WebSocket writes. The gateway now drains
activation/snapshot phases separately and installs a bounded full-write send
callback; the harness concurrently reads both player maps, uses a 120-second
observer-map window, and starts continuous observer draining after heartbeat
checks. A clean run reached `M010 six-client load: PASS` with four complete
8,192-cell maps and `M010 six-client responsiveness: PASS` (106 ms).
- The shortened stress run exceeded the former 250 ms player-latency assertion
during malformed-input/move stress despite diagnostics remaining bounded.
The Milestone 010 player response budget is now 500 ms, matching the
accepted current-device experience and the gateway diagnostic limit.
Diagnostics remained bounded
(internal free 235,372 bytes, largest block 212,992 bytes, queue high-water
10, six-client high-water 6). Full repeated-match and station/provisioning
acceptance evidence is not yet recorded; Milestone 010 remains `IN_PROGRESS`.
## Milestone 011 — Gameplay tuning and MVP acceptance