Decision: ESP32-S3 as the Spine for logging and Bluetooth LE to the phone, fed by the Reflex over a one way UART (Reflex TX to Spine RX, no wire back into the Reflex). The Spine never writes into the safety path.
T.E.K.-Link 0.1, project internal, 20 bytes, little endian, one frame per control tick:
| Offset | Bytes | Field | Notes |
|---|---|---|---|
| 0 | 1 | SYNC | frame start marker |
| 1 | 1 | VER | protocol version, 0x01 |
| 2 | 1 | SEQ | rolling counter |
| 3 | 1 | FLAGS | drop off, mover present, fault bits |
| 4 | 8 | COLS | eight belt column nearest distances |
| 12 | 1 | HEAD | collar nearest distance |
| 13 | 2 | GND | ground and drop off state |
| 15 | 2 | MOVER | nearest mover range and bearing |
| 17 | 1 | AMPL | global amplitude summary |
| 18 | 1 | STATE | reflex state machine code |
| 19 | 1 | CRC8 | over bytes 0 to 18 |
This is the team's own format, not a standard, and is labeled as such.
Bluetooth realities: iOS minimum connection interval 15 ms with about 4 packets per interval, Android down to 7.5 ms with wide device variance, practical MTU about 185 bytes on iOS, realistic sustained notify throughput far below the 2 Mbps PHY. A 20 byte frame per tick fits easily. The phone link adds tens of milliseconds that never touch the warning path.