- RawPacket struct carries raw bytes, IP, port from AsyncUDP callback
- xQueueSendFromISR in callback (ISR-safe) — zero JSON parsing in callback
- parseTask runs in separate FreeRTOS task, drains rawQueue, parses JSON
- STATUS command handled immediately in parseTask with UDP response to sender
- commandQueue declared extern for animation engine (Plan 03) to consume
- main.cpp: include wifi_server.h, call startUdpServer() after WIFI_PS_NONE
- main.cpp: setup() initializes strips, shows green (connecting) then white (connected)
- esp_wifi_set_ps(WIFI_PS_NONE) called immediately after WiFi connects for RMT coexistence
- loop() toggles LED colors every 5s to confirm strip responsiveness
- Coexistence test procedure documented as comment block in main.cpp
- firmware/.gitignore excludes .pio/ and credentials.h