Added
- Passive remote-state synchronization: OEM remote key-presses overheard on air now update the confirmed fan state, with verification queries and passive-evidence consensus guarding against misclassification (#37).
- Periodic heartbeat queries with deterministic jitter: the controller re-confirms the fan's true state every few minutes, so any missed RF evidence self-corrects without operator action (#37).
- SX127x RX watchdog in
quietcool-cpp-lora32.yaml: bounds the variable-length packet-engine wedge (phantom packet from a truncated burst tail or corrupted length byte) to seconds by re-arming RX (standby → rx) after 5 s of radio silence. Diagnosed and validated on a production unit (#39).
Fixed
- Passive-epoch response handling: incomplete or abandoned passive responses recover instead of stalling the confirmation state machine; stale passive ambiguity and expired responses are cleaned up at epoch boundaries.
- Passive evidence and response consensus isolated from each other; abandoned observations publish their authority loss.
- Terminal OEM recovery re-arms after passive activity.
- Heartbeat scheduling survives degradation and passive-sync interleavings.
Full changelog: v0.2.0...v0.3.0