- Reconnect and re-subscribe on every (re)connect; log the subscribe result.
- Heartbeat every 5 min on voice/audio_stream (valid silent PCM frame) so the
Directive-1 watchdog can tell "device dead" from "nobody spoke". voice_bridge
treats it as silence and ignores it.
- Retained LWT "offline" / "online" presence on voice/status for layer
attribution in the watchdog.
- LED: green now means MQTT connected AND publishing. Wi-Fi down = red blink,
Wi-Fi up but MQTT down = amber blink. Never green without MQTT.
- Log the reason on every drop: PubSubClient state code, or the Wi-Fi
disconnect reason from the Wi-Fi event.
- Bound the I2S read (50 ms) so Wi-Fi/MQTT housekeeping cannot stall; reset a
stale streaming state on disconnect (the stuck-green bug).
- Document the MQTT/LED contract in README; flag config.h and led_control.h as
stale drafts so they cannot creep back as a second config.
- Credentials stay placeholders; nothing secret is committed.
Not flashed/tested: no ESP32 and no arduino-cli is reachable from the build
environment. Hardware-in-the-loop verification needs a human at the device.
Co-Authored-By: Paperclip <noreply@paperclip.ing>