Files
maze32/docs/RESOURCE_BUDGET.md

2.6 KiB

Runtime resource budget

Milestone 010 fixes and exposes the following production limits. They are compile-time bounds, not targets that may grow with match duration.

Resource Limit Defensive behavior
WebSocket connections 6 A seventh WebSocket handshake is rejected.
LwIP sockets 16 ESP-IDF remains configured by sdkconfig.defaults.
Client message 512 bytes An oversized frame is counted and disconnected.
Outgoing message 768 bytes An over-limit message cannot enter the queue.
Outgoing queue 12 entries Queue overflow is counted; memory cannot grow.
Game command queue 16 entries Excess commands receive queue_full.
Input rate 20 messages/second Excess messages are rejected; sustained abuse above 40 in the same window is disconnected.
Player response budget 500 ms The physical stress client fails above this round-trip threshold.
Observer update policy Latest bounded projection A busy observer may lose intermediate dynamic chunks and recover on a newer projection. Failed or stalled required sends close the socket.
Reconnect deadline 60,000 ms Gameplay pauses, then ends in a draw at expiry.

Build-time measurements

The Milestone 010 production build on 2026-09-05 reported 124,276 of 327,680 static RAM bytes and 1,028,600 of 2,097,152 application bytes. The independent binary check measured 1,029,232 bytes in the 2 MiB factory partition, leaving 1,067,920 bytes of application margin. The compressed web payload totals 19,253 bytes against its 1.5 MiB budget, leaving 1,553,611 bytes of payload margin. LittleFS remains the fixed 1,984 KiB partition and its image is checked against partitions.csv on every build.

The global authoritative gateway, including its one maze, one projection buffer, fixed queues, sessions, timers, and metrics, occupies 86,840 bytes of static storage in the production ELF. It does not allocate a maze or projection per client. No production source or test requires PSRAM or a GPIO.

Runtime measurements

GET /diagnostics returns current and minimum internal 8-bit heap values and the largest internal free block. It deliberately samples MALLOC_CAP_INTERNAL | MALLOC_CAP_8BIT, so external RAM cannot make a failing internal-memory result appear healthy. Serial samples use the same capability mask.

Final six-client, slow-client, repeated-match, and network-recovery samples belong in the active milestone evidence in PLANS.md. Build-time numbers in this document must be refreshed if the production image changes before that evidence is recorded.