yggvault ratatoskr-space connected via regular web
Color theme
also available via yggdrasil mesh http://[203:b338:2a84:a18f:986:47ae:1a4:d8d3]/pkg/ruview/node-diagnostics-and-fusion-fixes-2026-09-09
vault / ruview / node-diagnostics-and-fusion-fixes-2026-09-09

ruview @ node-diagnostics-and-fusion-fixes-2026-09-09

integrity

size
60.1 MiB
downloaded
last checked
detected
raw version: universal archives only
source https://github.com/ruvnet/RuView · available · github

release notes

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:

download

unix · zip
curl -fL -o node-diagnostics-and-fusion-fixes-2026-09-09.zip https://ratatoskr.space/pkg/ruview/node-diagnostics-and-fusion-fixes-2026-09-09.zip
                    printf '%s  %s\n' 'f6b1c3a0b1316759dc11ee0852a4d10756911a250f2d53891618c9771c82728e' 'node-diagnostics-and-fusion-fixes-2026-09-09.zip' | sha256sum -c -
windows · zip
$url = "https://ratatoskr.space/pkg/ruview/node-diagnostics-and-fusion-fixes-2026-09-09.zip"
$out = "node-diagnostics-and-fusion-fixes-2026-09-09.zip"
Invoke-WebRequest -Uri $url -OutFile $out
if ((Get-FileHash $out -Algorithm SHA256).Hash.ToLowerInvariant() -ne "f6b1c3a0b1316759dc11ee0852a4d10756911a250f2d53891618c9771c82728e") { throw "sha256 mismatch" }
unix · tar.gz
curl -fL -o node-diagnostics-and-fusion-fixes-2026-09-09.tar.gz https://ratatoskr.space/pkg/ruview/node-diagnostics-and-fusion-fixes-2026-09-09.tar.gz
                    printf '%s  %s\n' 'cab3e08f0ef9a96f7c6554f847541887c10085ba9f4da3622a1c65b6aaef7d43' 'node-diagnostics-and-fusion-fixes-2026-09-09.tar.gz' | sha256sum -c -
windows · tar.gz
$url = "https://ratatoskr.space/pkg/ruview/node-diagnostics-and-fusion-fixes-2026-09-09.tar.gz"
$out = "node-diagnostics-and-fusion-fixes-2026-09-09.tar.gz"
Invoke-WebRequest -Uri $url -OutFile $out
if ((Get-FileHash $out -Algorithm SHA256).Hash.ToLowerInvariant() -ne "cab3e08f0ef9a96f7c6554f847541887c10085ba9f4da3622a1c65b6aaef7d43") { throw "sha256 mismatch" }
download via yggdrasil mesh
unix · zip
curl -fL -o node-diagnostics-and-fusion-fixes-2026-09-09.zip http://14cc7d57b5e70f679b851fe5b272ce17c70632ff4beb5b35ab64bc706b2485af.pk.ygg/pkg/ruview/node-diagnostics-and-fusion-fixes-2026-09-09.zip
                    printf '%s  %s\n' 'f6b1c3a0b1316759dc11ee0852a4d10756911a250f2d53891618c9771c82728e' 'node-diagnostics-and-fusion-fixes-2026-09-09.zip' | sha256sum -c -
windows · zip
$url = "http://14cc7d57b5e70f679b851fe5b272ce17c70632ff4beb5b35ab64bc706b2485af.pk.ygg/pkg/ruview/node-diagnostics-and-fusion-fixes-2026-09-09.zip"
$out = "node-diagnostics-and-fusion-fixes-2026-09-09.zip"
Invoke-WebRequest -Uri $url -OutFile $out
if ((Get-FileHash $out -Algorithm SHA256).Hash.ToLowerInvariant() -ne "f6b1c3a0b1316759dc11ee0852a4d10756911a250f2d53891618c9771c82728e") { throw "sha256 mismatch" }
unix · tar.gz
curl -fL -o node-diagnostics-and-fusion-fixes-2026-09-09.tar.gz http://14cc7d57b5e70f679b851fe5b272ce17c70632ff4beb5b35ab64bc706b2485af.pk.ygg/pkg/ruview/node-diagnostics-and-fusion-fixes-2026-09-09.tar.gz
                    printf '%s  %s\n' 'cab3e08f0ef9a96f7c6554f847541887c10085ba9f4da3622a1c65b6aaef7d43' 'node-diagnostics-and-fusion-fixes-2026-09-09.tar.gz' | sha256sum -c -
windows · tar.gz
$url = "http://14cc7d57b5e70f679b851fe5b272ce17c70632ff4beb5b35ab64bc706b2485af.pk.ygg/pkg/ruview/node-diagnostics-and-fusion-fixes-2026-09-09.tar.gz"
$out = "node-diagnostics-and-fusion-fixes-2026-09-09.tar.gz"
Invoke-WebRequest -Uri $url -OutFile $out
if ((Get-FileHash $out -Algorithm SHA256).Hash.ToLowerInvariant() -ne "cab3e08f0ef9a96f7c6554f847541887c10085ba9f4da3622a1c65b6aaef7d43") { throw "sha256 mismatch" }
artifact format size hashes
node-diagnostics-and-fusion-fixes-2026-09-09.zip zip 60.3 MiB
blake3-24 be1fef0e168e165f9afcc9121578af960674196e3679c26a
sha256 f6b1c3a0b1316759dc11ee0852a4d10756911a250f2d53891618c9771c82728e
sha1 96f24c3d06cc4060a5415ab10694b08b0f651cf0
node-diagnostics-and-fusion-fixes-2026-09-09.tar.gz tar.gz 57.9 MiB
blake3-24 7da90642672d11c9def3e5fcc496a13ac01e384d6fada80c
sha256 cab3e08f0ef9a96f7c6554f847541887c10085ba9f4da3622a1c65b6aaef7d43
sha1 72d6a69d8927902e2c53e5f16db6cb4a78ce553e

install

bazel
http_archive(
    name = "ruview",
    urls = ["https://ratatoskr.space/pkg/ruview/node-diagnostics-and-fusion-fixes-2026-09-09.tar.gz"],
    integrity = "sha256-yrPgjw75qW98ZVT4R1QYh8EAhbqfTaNiKhxltqrvfUM=",
    strip_prefix = "ruview-node-diagnostics-and-fusion-fixes-2026-09-09",
)
zig
.url = "https://ratatoskr.space/pkg/ruview/node-diagnostics-and-fusion-fixes-2026-09-09.tar.gz",
install via yggdrasil mesh
bazel
http_archive(
    name = "ruview",
    urls = ["http://14cc7d57b5e70f679b851fe5b272ce17c70632ff4beb5b35ab64bc706b2485af.pk.ygg/pkg/ruview/node-diagnostics-and-fusion-fixes-2026-09-09.tar.gz"],
    integrity = "sha256-yrPgjw75qW98ZVT4R1QYh8EAhbqfTaNiKhxltqrvfUM=",
    strip_prefix = "ruview-node-diagnostics-and-fusion-fixes-2026-09-09",
)
zig
.url = "http://14cc7d57b5e70f679b851fe5b272ce17c70632ff4beb5b35ab64bc706b2485af.pk.ygg/pkg/ruview/node-diagnostics-and-fusion-fixes-2026-09-09.tar.gz",
← v2624v2617 →