mirror of
https://github.com/ruvnet/RuView.git
synced 2026-10-18 21:00:22 -05:00
The per-node grid gate locked onto the densest CSI grid a node had ever sent and rejected every other grid. Real ESP32-S3 nodes interleave several grids: one node sent 192 bins on 88% of frames and 306 on 6%, so the gate locked onto the 306 minority and dropped about 90% of that node's frames. A node whose radio moved to a sparser grid for good was rejected forever; when every node did this, `tick` froze while /health still reported ok. The gate now votes over each node's last 64 frames and locks onto the grid the node sends most. A challenger must outnumber the active grid 3:2 to take over, so interleaved grids don't flap the lock. A switch clears the window as before. On an ESP32-C6 the HE-SU majority still wins and the HT minority is still rejected. /health keeps `status: "ok"` (the UI's server probe keys on it) and adds a `processing` block: a live/stalled/no_input/idle state, the age of the last published update, and lock-free UDP counters (datagrams, age of the last datagram, datagrams dropped by the source allowlist). A frozen pipeline can now be told apart from input that stopped arriving. Allowlist drops also log a warning on the 1st, 2nd, 4th, 8th... drop instead of only at debug level. Co-Authored-By: claude-flow <ruv@ruv.net>