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/v2634
vault / ruview / v2634

ruview @ v2634

integrity

size
59.8 MiB
downloaded
last checked
source https://github.com/ruvnet/RuView · available · github

release notes

Automated release from CI pipeline

Changes: feat(firmware): persistent on-node log and coredump-to-flash (#1878)

The 4MB and display layouts have 1.875MB and 2MB OTA slots, sized for 4MB and 8MB parts. A 16MB C6 (DevKitC-1 N16) has no layout in the tree at all, so building for one meant hand-editing sdkconfig -- and a smaller table written over a deployed 16MB node relocates NVS and destroys its provisioning, which is why this belongs in the repo rather than in a workstation's untracked sdkconfig.

Two 4MB OTA slots, plus a 64K coredump partition and an 8000K FAT volume for on-node storage. Rollback is enabled so an OTA'd image that cannot confirm itself is reverted by the bootloader.

Layered, not inherited: sdkconfig.defaults.esp32c6 keeps its 4MB layout so the common 4MB devkit is never silently repartitioned.

Co-Authored-By: claude-flow ruv@ruv.net Claude-Session: https://claude.ai/code/session_01PVWMiHQifoYXL7uL3bphrZ

A remote fault currently leaves no post-mortem. main.c decodes the reset reason at boot and logs it to the CONSOLE -- which is exactly what a power cycle destroys, and a power cycle is how a wedged node gets recovered.

The flash was already provisioned for this and the features were simply off: partitions_16mb.csv has reserved a 64K coredump partition and an 8000K storage FAT volume since the 16MB layout was written, neither had ever been mounted or written, and the build defaulted to CONFIG_ESP_COREDUMP_ENABLE_TO_NONE.

node_log_init failing is non-fatal by design -- the module disables itself and every entry point becomes a no-op. A logging volume that will not mount must never take the fleet down with it.

csi_collector gains two gate accessors. This build selects its frame gate at compile time, so both return CSI_GATE_NOT_CONFIGURABLE rather than a plausible number: the log keeps a field of fixed width and meaning either way, and an explicit "not applicable" is stored instead of something a reader would later reason from as a real setting.

Built with ESP-IDF v5.4 for esp32c6 using defaults + .esp32c6 + .16mb. Verified from the resulting artifacts: 16MB table with coredump and storage present, COREDUMP_ENABLE_TO_FLASH set, rollback enabled, image 0x10abd0 bytes in a 4M slot. NOT flashed to hardware from this branch -- the equivalent code was exercised on a node-3 pilot, but that is not evidence for this build.

Co-Authored-By: claude-flow ruv@ruv.net Claude-Session: https://claude.ai/code/session_01PVWMiHQifoYXL7uL3bphrZ

The log engine lands with no consumer, so the access pattern was open. Records the decision to pull a node's log only when a human asks -- after a hang or a crash, or while troubleshooting that node -- and to keep nothing server-side.

The reasoning that decided it: the ring already survives a power cycle on the node (~208 days of retention), so a server copy duplicates a durability property that is already met; and airtime is this fleet's binding constraint, measured at 91% consumed by two slow nodes, so a periodic drain across nine boards would spend exactly the resource whose exhaustion you would open the log to investigate. An instrument must not perturb what it measures.

Leaves the decode-where question open on purpose, with the argument for a raw proxy stated: decoding server-side defines the record layout in both C and Rust, and the pilot already paid once for a host/firmware disagreement about a field's meaning.

Co-Authored-By: claude-flow ruv@ruv.net Claude-Session: https://claude.ai/code/session_01PVWMiHQifoYXL7uL3bphrZ


Co-authored-by: Joe joe@GitDev.hedgehog Co-authored-by: claude-flow ruv@ruv.net

Docker Image: ghcr.io/ruvnet/RuView:500cfe47875705b47e08e6d79cd4b4066a70e445

download

unix · zip
curl -fL -o v2634.zip https://ratatoskr.space/pkg/ruview/v2634.zip
                    printf '%s  %s\n' '589fbb2bacbc52aed593eff5e3fbb40a9c230b3563ac5a983de1386c6c17caa9' 'v2634.zip' | sha256sum -c -
windows · zip
$url = "https://ratatoskr.space/pkg/ruview/v2634.zip"
$out = "v2634.zip"
Invoke-WebRequest -Uri $url -OutFile $out
if ((Get-FileHash $out -Algorithm SHA256).Hash.ToLowerInvariant() -ne "589fbb2bacbc52aed593eff5e3fbb40a9c230b3563ac5a983de1386c6c17caa9") { throw "sha256 mismatch" }
unix · tar.gz
curl -fL -o v2634.tar.gz https://ratatoskr.space/pkg/ruview/v2634.tar.gz
                    printf '%s  %s\n' '89a724e2b2db5266b9e4e65bd0159c3598e7d8e31293a156e75b4848fe634e9c' 'v2634.tar.gz' | sha256sum -c -
windows · tar.gz
$url = "https://ratatoskr.space/pkg/ruview/v2634.tar.gz"
$out = "v2634.tar.gz"
Invoke-WebRequest -Uri $url -OutFile $out
if ((Get-FileHash $out -Algorithm SHA256).Hash.ToLowerInvariant() -ne "89a724e2b2db5266b9e4e65bd0159c3598e7d8e31293a156e75b4848fe634e9c") { throw "sha256 mismatch" }
download via yggdrasil mesh
unix · zip
curl -fL -o v2634.zip http://14cc7d57b5e70f679b851fe5b272ce17c70632ff4beb5b35ab64bc706b2485af.pk.ygg/pkg/ruview/v2634.zip
                    printf '%s  %s\n' '589fbb2bacbc52aed593eff5e3fbb40a9c230b3563ac5a983de1386c6c17caa9' 'v2634.zip' | sha256sum -c -
windows · zip
$url = "http://14cc7d57b5e70f679b851fe5b272ce17c70632ff4beb5b35ab64bc706b2485af.pk.ygg/pkg/ruview/v2634.zip"
$out = "v2634.zip"
Invoke-WebRequest -Uri $url -OutFile $out
if ((Get-FileHash $out -Algorithm SHA256).Hash.ToLowerInvariant() -ne "589fbb2bacbc52aed593eff5e3fbb40a9c230b3563ac5a983de1386c6c17caa9") { throw "sha256 mismatch" }
unix · tar.gz
curl -fL -o v2634.tar.gz http://14cc7d57b5e70f679b851fe5b272ce17c70632ff4beb5b35ab64bc706b2485af.pk.ygg/pkg/ruview/v2634.tar.gz
                    printf '%s  %s\n' '89a724e2b2db5266b9e4e65bd0159c3598e7d8e31293a156e75b4848fe634e9c' 'v2634.tar.gz' | sha256sum -c -
windows · tar.gz
$url = "http://14cc7d57b5e70f679b851fe5b272ce17c70632ff4beb5b35ab64bc706b2485af.pk.ygg/pkg/ruview/v2634.tar.gz"
$out = "v2634.tar.gz"
Invoke-WebRequest -Uri $url -OutFile $out
if ((Get-FileHash $out -Algorithm SHA256).Hash.ToLowerInvariant() -ne "89a724e2b2db5266b9e4e65bd0159c3598e7d8e31293a156e75b4848fe634e9c") { throw "sha256 mismatch" }
artifact format size hashes
v2634.zip zip 60.0 MiB
blake3-24 36d08b0ab1f5aa3d6bdeb63522ac89702a360c7bb6d5f53f
sha256 589fbb2bacbc52aed593eff5e3fbb40a9c230b3563ac5a983de1386c6c17caa9
sha1 2314ce1d151d322ffe5839347d6c9904134bd885
v2634.tar.gz tar.gz 57.9 MiB
blake3-24 144cbea8d4cd41e7d595239ec5fc9a35759127119767b76f
sha256 89a724e2b2db5266b9e4e65bd0159c3598e7d8e31293a156e75b4848fe634e9c
sha1 ae59520c8f5232f4260f3547524270b79b43edaf

install

bazel
http_archive(
    name = "ruview",
    urls = ["https://ratatoskr.space/pkg/ruview/v2634.tar.gz"],
    integrity = "sha256-iack4rLbUma55OZb0BWcNZjn2OMSk6FW51tISP5jTpw=",
    strip_prefix = "ruview-v2634",
)
zig
.url = "https://ratatoskr.space/pkg/ruview/v2634.tar.gz",
install via yggdrasil mesh
bazel
http_archive(
    name = "ruview",
    urls = ["http://14cc7d57b5e70f679b851fe5b272ce17c70632ff4beb5b35ab64bc706b2485af.pk.ygg/pkg/ruview/v2634.tar.gz"],
    integrity = "sha256-iack4rLbUma55OZb0BWcNZjn2OMSk6FW51tISP5jTpw=",
    strip_prefix = "ruview-v2634",
)
zig
.url = "http://14cc7d57b5e70f679b851fe5b272ce17c70632ff4beb5b35ab64bc706b2485af.pk.ygg/pkg/ruview/v2634.tar.gz",
← v2635v2631 →