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

ruview @ v1596

integrity

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

release notes

Automated release from CI pipeline

Changes: fix: IDF v6.0 ESP-NOW callback compat (#944) + occupancy noise-floor anchor (#942) (#945)

ESP-IDF v6.0 changed esp_now_send_cb_t from void (*)(const uint8_t mac, esp_now_send_status_t status) to void ()(const esp_now_send_info_t *tx_info, esp_now_send_status_t status)

The C6 sync ESP-NOW path's on_recv was already version-guarded with #if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 0, 0) (lines 102-112) but the on_send sibling missed the equivalent guard. CI runs against IDF v5.4 so the regression slipped through; the reporter on IDF v6.0.1 with xtensa-esp-elf esp-15.2.0_20251204 hit:

c6_sync_espnow.c:182:30: error: passing argument 1 of 'esp_now_register_send_cb' from incompatible pointer type [-Wincompatible-pointer-types]

Fix: mirror the recv guard with #if ESP_IDF_VERSION_MAJOR >= 6 since the send-callback signature change happened at IDF v6.0 (not v5.x like the recv-callback). Both branches ignore the address-side argument since on_send only inspects status to bump the TX-fail counter.

Adds #include "esp_idf_version.h" so the macro is in scope.

Closes #944

Co-Authored-By: claude-flow ruv@ruv.net

test_estimate_occupancy_noise_only asserts that 20 noise-only frames fed through a 50-frame calibrated FieldModel yield 0 occupancy. Failure reported on the upstream Linux + BLAS build.

Root cause

Calibration and estimation each compute their own Marcenko-Pastur threshold:

threshold = noise_var · (1 + sqrt(p / N))²

with noise_var = median of the bottom half of positive eigenvalues from their own covariance. The MP ratio differs across the two phases:

calibration (50 frames, p=8): ratio = 0.16, factor ≈ 1.96 estimation (20 frames, p=8): ratio = 0.40, factor ≈ 2.66

On a small estimation window the local noise_var estimate can also be smaller than the calibration's (fewer samples → bottom-half median hits lower-magnitude eigenvalues). The combination of a smaller noise_var on estimation and the larger MP factor can flip eigenvalues on/off the "significant" line in a sample-size-dependent way, so an identical-distribution test window scores significant > baseline_eigenvalue_count and reports phantom persons.

Fix

Persist the calibration noise_var on FieldNormalMode (new field baseline_noise_var: f64) and use max(local_noise_var, baseline_noise_var) as the noise floor inside estimate_occupancy. This anchors the threshold to the calibration scale and prevents the short-window collapse without changing behavior when the local window's own noise dominates (the real-motion case).

baseline_noise_var defaults to 0.0 in the diagonal-fallback paths; the estimation code treats 0.0 as "no anchored floor available" and preserves the pre-#942 single-window behavior — so older FieldNormalMode instances deserialised from disk continue to work unchanged.

Test results

cargo test --workspace --no-default-features → 413 lib tests pass (signal crate), 0 fail, 1 ignored.

The actual eigenvalue-gated test still requires BLAS (not buildable on Windows). Logic-trace via the four numerical anchors above shows the fix flips noise_var from the smaller local value back up to the calibration scale, dropping significant to or below baseline_eigenvalue_count so the saturating subtraction returns 0.

Closes #942

Co-Authored-By: claude-flow ruv@ruv.net

Docker Image: ghcr.io/ruvnet/RuView:872d7593bbeeed63524386aa60e6805bb4e1b26c

download

unix · zip
curl -fL -o v1596.zip https://ratatoskr.space/pkg/ruview/v1596.zip
                    printf '%s  %s\n' '5762fe4900fd04a18cb5ba5d8374ab6c7f9baf61eb420ed403f5608170d88d30' 'v1596.zip' | sha256sum -c -
windows · zip
$url = "https://ratatoskr.space/pkg/ruview/v1596.zip"
$out = "v1596.zip"
Invoke-WebRequest -Uri $url -OutFile $out
if ((Get-FileHash $out -Algorithm SHA256).Hash.ToLowerInvariant() -ne "5762fe4900fd04a18cb5ba5d8374ab6c7f9baf61eb420ed403f5608170d88d30") { throw "sha256 mismatch" }
unix · tar.gz
curl -fL -o v1596.tar.gz https://ratatoskr.space/pkg/ruview/v1596.tar.gz
                    printf '%s  %s\n' '216e2f399eca15085dd39b174b10801300fc88209d76b6451b698c90523a5f13' 'v1596.tar.gz' | sha256sum -c -
windows · tar.gz
$url = "https://ratatoskr.space/pkg/ruview/v1596.tar.gz"
$out = "v1596.tar.gz"
Invoke-WebRequest -Uri $url -OutFile $out
if ((Get-FileHash $out -Algorithm SHA256).Hash.ToLowerInvariant() -ne "216e2f399eca15085dd39b174b10801300fc88209d76b6451b698c90523a5f13") { throw "sha256 mismatch" }
download via yggdrasil mesh
unix · zip
curl -fL -o v1596.zip http://14cc7d57b5e70f679b851fe5b272ce17c70632ff4beb5b35ab64bc706b2485af.pk.ygg/pkg/ruview/v1596.zip
                    printf '%s  %s\n' '5762fe4900fd04a18cb5ba5d8374ab6c7f9baf61eb420ed403f5608170d88d30' 'v1596.zip' | sha256sum -c -
windows · zip
$url = "http://14cc7d57b5e70f679b851fe5b272ce17c70632ff4beb5b35ab64bc706b2485af.pk.ygg/pkg/ruview/v1596.zip"
$out = "v1596.zip"
Invoke-WebRequest -Uri $url -OutFile $out
if ((Get-FileHash $out -Algorithm SHA256).Hash.ToLowerInvariant() -ne "5762fe4900fd04a18cb5ba5d8374ab6c7f9baf61eb420ed403f5608170d88d30") { throw "sha256 mismatch" }
unix · tar.gz
curl -fL -o v1596.tar.gz http://14cc7d57b5e70f679b851fe5b272ce17c70632ff4beb5b35ab64bc706b2485af.pk.ygg/pkg/ruview/v1596.tar.gz
                    printf '%s  %s\n' '216e2f399eca15085dd39b174b10801300fc88209d76b6451b698c90523a5f13' 'v1596.tar.gz' | sha256sum -c -
windows · tar.gz
$url = "http://14cc7d57b5e70f679b851fe5b272ce17c70632ff4beb5b35ab64bc706b2485af.pk.ygg/pkg/ruview/v1596.tar.gz"
$out = "v1596.tar.gz"
Invoke-WebRequest -Uri $url -OutFile $out
if ((Get-FileHash $out -Algorithm SHA256).Hash.ToLowerInvariant() -ne "216e2f399eca15085dd39b174b10801300fc88209d76b6451b698c90523a5f13") { throw "sha256 mismatch" }
artifact format size hashes
v1596.zip zip 61.1 MiB
blake3-24 cd394ff12c2936938ca09ddd1e37d882f017985ac4437af2
sha256 5762fe4900fd04a18cb5ba5d8374ab6c7f9baf61eb420ed403f5608170d88d30
sha1 6edefb2debb577dd4be7610c23b2c89df64b120f
v1596.tar.gz tar.gz 59.3 MiB
blake3-24 2bc9f00baea622b837717759a112054884b22147047d1398
sha256 216e2f399eca15085dd39b174b10801300fc88209d76b6451b698c90523a5f13
sha1 add5dc4e738f0260877ed1f2d34ab1f642082c5e

install

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