feat: lock production decisions and resource budgets

This commit is contained in:
2026-08-28 22:21:36 +03:00
parent 63e33510b3
commit 4ff1718307
6 changed files with 680 additions and 15 deletions
+42
View File
@@ -0,0 +1,42 @@
# Resource budget
## Measured feasibility baseline
Milestone 004's accepted ESP32-C6 run completed 20 games of 200 updates with
two players and eight spectators. Its measured values were 1,000,496 B flash,
38,204 B RAM, 249,616 B minimum free heap, 320 B largest state message, 154 us
maximum generation time, and 5,283 us maximum asynchronous delivery-enqueue
time. The application partition is 2,097,152 B and LittleFS is 2,031,616 B.
## Hard production limits
| Resource | Limit | Basis |
| ---------------------------- | ----------: | -------------------------------------------------------------------------- |
| Firmware image | 1,500,000 B | M004 fixed threshold, leaving 597,152 B app-partition reserve |
| LittleFS image | 250,000 B | M004 fixed threshold, leaving 1,781,616 B filesystem reserve |
| Minimum free heap | 96,000 B | M004 fixed threshold; observed minimum was 249,616 B |
| Largest role-safe state JSON | 512 B | Tested fixed serialization cap; production schema is compact strings |
| HTTP JSON request body | 192 B | Largest defined command (`join`) fits within this bound |
| WebSocket incoming frame | 192 B | `hello` is the largest defined incoming frame |
| HTTP request target/query | 128 B | `/api/state?version=4294967295` is below this bound |
| State generation | 100,000 us | M004 fixed threshold; observed maximum was 154 us |
| State delivery enqueue | 100,000 us | M004 fixed threshold; observed maximum was 5,283 us |
| Pending application commands | 16 | Fixed bounded queue; excess requests return `SERVER_BUSY` |
| Sessions | 10 | Two players and eight spectators |
| Open HTTP sockets | 12 | Ten clients plus two polling/transport headroom; LWIP is configured for 16 |
No handler may allocate a per-client complete JSON state. It serializes one
bounded snapshot at a time into the 512-byte transport buffer.
## Per-milestone budget gates
| Milestone | Firmware ceiling | LittleFS ceiling | Heap floor | Required check |
|---|---:|---:|---:|---|
| 006 architecture | 1,080,000 B | 250,000 B | 220,000 B | clean build and host tests |
| 007 game core | 1,180,000 B | 250,000 B | 190,000 B | fleet and rules tests |
| 008 sessions/API | 1,300,000 B | 250,000 B | 150,000 B | role filtering and malformed input |
| 009 transport/UI | 1,420,000 B | 250,000 B | 115,000 B | two players/eight spectators |
| MVP completion | 1,500,000 B | 250,000 B | 96,000 B | repeated on-board game test |
Each gate is a maximum permitted consumption or minimum required remaining
heap. A missed gate blocks the next milestone pending a documented decision.