RuView diagnostics, node memory, and fusion fixes — 2026-09-09
Five changes landed today, split across two themes: giving field nodes a memory that survives a power cycle, and tightening up two more places where sensor data was quietly wrong without anyone noticing.
What actually changes
A hung or crashed field node can finally tell you what happened to it.
Until now, if a node in the field wedged or rebooted unexpectedly, the only diagnostic evidence — a line printed to its serial console — was destroyed the instant it lost power, which is exactly when you'd want to read it. Nodes now keep a persistent, crash-surviving health log on their own flash storage: a compact rolling history (about 208 days' worth) of temperature, WiFi signal, frame rates, and disconnect events, plus a dedicated boot record that captures the one failure mode a crash dump can't — a hang followed by a watchdog reset. The write rate is deliberately capped so the log can never wear out the flash faster than the hardware could anyway last for centuries. Reading it is on-demand only: nothing is streamed or polled automatically, so the diagnostic tool doesn't itself eat the airtime it's trying to diagnose.
A new flash layout for boards with more room to work with.
Some field boards ship with 16MB of flash instead of the usual 4MB, but the repo had no ready-made configuration for that size — building for one meant hand-editing settings on a workstation, which is exactly the kind of untracked, easy-to-lose configuration this project tries to avoid. There's now a proper 16MB profile with two full-size update slots, room for a crash dump, and 8MB of on-board storage for the new health log above.
A carefully-run experiment that says "no" — and that's the useful result.
One theory for why sensors sometimes fail to pair their readings was that a node could be listening to a different WiFi access point than its neighbor, so their clocks never lined up. Forcing the whole fleet onto one shared access point was tested directly on live hardware, and it does fix the pairing rate — but the total number of usable paired readings per second actually drops, because far less data comes in overall. The experiment is documented in full, including the raw measurements, specifically so this shortcut doesn't get quietly reattempted later without knowing why it doesn't help.
A stray signal reading is no longer allowed to poison the room-wide average.
One sensor's signal-strength report was occasionally sending a placeholder value — something a phone's WiFi radio sends when it hasn't taken a real reading yet — and the system was treating it as if it were a genuine measurement. For one reading out of many, that placeholder would drag the whole room's reported signal strength down to an impossible number. It's now recognized as "not a real reading" and quietly ignored, the same way the system already ignores an outright missing value.
macOS can now do its own signal-strength sensing.
The Mac-based sensor path previously only worked on Windows. It's now been ported to macOS's native WiFi framework, with two things fixed along the way that only show up in real-world testing: the helper process is now killed automatically if it hangs instead of blocking the sensor indefinitely, and two different networks that both hide their identity are no longer mistaken for the same network just because they're on the same channel.
Thank you
Three contributions from clonea1 (persistent node health logging, the 16MB flash profile, and the single-access-point experiment write-up) turn "the node went quiet, we'll never know why" into an actual diagnostic trail — exactly the kind of unglamorous infrastructure work that pays for itself the first time a field node misbehaves.
Full changes:
- #1878 — persistent on-node log and coredump-to-flash (clonea1)
- #1877 — 16MB flash profile for the C6 fleet (clonea1)
- #1876 — single-transmitter pairing experiment, documented negative result (clonea1)
- #1882 — fix a firmware sentinel value from poisoning room-wide signal averages
- #1880 — fix node positions being dropped from the streaming fusion engine