ruview @ v1428
integrity
- size
- 60.4 MiB
- downloaded
- last checked
release notes
Automated release from CI pipeline
Changes: feat(signal): ADR-134 CSI→CIR via ISTA + NeumannSolver warm-start (#837)
- feat(signal): ADR-134 — CSI→CIR via ISTA + NeumannSolver warm-start
End-to-end first-class Channel Impulse Response estimation in the Rust
workspace. Bridges CSI (frequency domain) to CIR (delay domain) so
multistatic coherence gating, NLOS/LOS classification, and (at HT40+)
ToF ranging become tractable in wifi-densepose-signal.
Algorithm: ISTA L1 sparse recovery over a normalized DFT sub-matrix
sensing operator Φ ∈ ℂ^(K×G) with G = 3K (3× super-resolution). The
Tikhonov-regularised warm start re-uses ruvector_solver::neumann:: NeumannSolver — same call pattern as fresnel.rs:280 and
train/subcarrier.rs:225 — so no new crate dependencies.
Tiers supported: HT20 / HT40 / HE20 (Tier A-HE, C6) / HE40. The C6 HE-LTF tier is the preferred Tier A target whenever an 11ax AP is in range; firmware substrate already shipped at v0.7.0-esp32 per ADR-110.
Measured performance (release, single CirEstimator shared across 12 links): HT20 2.72 ms / HE20 3.20 ms / HT40 13.43 ms / HE40 9.71 ms per estimate(). HT20 12-link multistatic 17.7 ms — fits the 50 ms RuvSense cycle; HT40 12-link 74 ms exceeds it and is flagged in ADR-134 §2.7 as requiring Rayon parallelism or G=2K super-res reduction.
Measured Φ conditioning: κ(Φ) ≈ 1.00 identically across all tiers. ADR-134 §2.3 was corrected — the C6 advantage is statistical SNR gain (√(242/52) ≈ 2.16×) from more independent measurements, not improved conditioning.
Witness: bit-deterministic SHA-256 over CirEstimator output on the synthetic ADR-028 reference signal (100 frames, top-5 taps, 1e-6 quantization). Hash committed to expected_cir_features.sha256; verify-cir-proof.sh wires the check into the existing witness bundle.
CI: cargo test --features cir + verify-cir-proof.sh added as separate steps under the Rust Workspace Tests job; regressions are unambiguously attributable.
Files:
- ADR + WITNESS-LOG-028 row 34 + CLAUDE.md module count (14 → 15)
- src/ruvsense/cir.rs (~540 LOC) + lib.rs re-exports + multistatic.rs
wire-up (reversible via
use_cir_gate=false) - 3 integration tests + Criterion bench + 3 deterministic fixtures
- cir_proof_runner binary + sha256 + verify-cir-proof.sh
Test rate: 395 pass / 6 ignored (P2 ISTA hyperparameter tuning; see #[ignore] reasons) / 0 fail. cargo check clean; verify-cir-proof.sh VERDICT: PASS.
Co-Authored-By: claude-flow ruv@ruv.net
- fix(signal): make CIR witness cross-platform-deterministic
The first witness (Windows-generated hash 89704bfd…) failed on Linux CI
with a different hash (b36741bf…). Root cause: hashing re/im parts of
top-5 taps at 1e-6 precision is too tight against libm differences in
sin/cos/sqrt across glibc, MSVC, and Apple-clang. The previous
"top-5 sorted by magnitude" form also suffered from rank instability when
taps are near-tied — libm jitter could shuffle the ordering even when the
algorithm is unchanged.
New canonical form: full per-tap quantised-magnitude profile in natural index order, no sort.
- 156 taps × 2 bytes (u16 le) per frame = 312 bytes/frame.
- Quantisation 1e-2 — robust to ~1e-3 float drift while still tripping on real algorithmic changes (e.g., a 10× lambda shift moves magnitudes by >1e-2).
- No top-K selection — eliminates the unstable magnitude-sort step.
Regenerated expected_cir_features.sha256 — new hash 120bd7b1…
If the next CI run still mismatches, the cause is structural (rustfft SIMD code path selection or NeumannSolver internal ordering), not magnitudes, and the witness needs further coarsening or to be made platform-tagged.
Co-Authored-By: claude-flow ruv@ruv.net
Docker Image:
ghcr.io/ruvnet/RuView:9e7fa83210cdf05bc245610b732ad2a9c93cc985
download
curl -fL -o v1428.zip https://ratatoskr.space/pkg/ruview/v1428.zip
printf '%s %s\n' '4c3baa6b1514b813dcd23db147d19e8d56404d75bf5e49a32575784b13e5356e' 'v1428.zip' | sha256sum -c -
$url = "https://ratatoskr.space/pkg/ruview/v1428.zip"
$out = "v1428.zip"
Invoke-WebRequest -Uri $url -OutFile $out
if ((Get-FileHash $out -Algorithm SHA256).Hash.ToLowerInvariant() -ne "4c3baa6b1514b813dcd23db147d19e8d56404d75bf5e49a32575784b13e5356e") { throw "sha256 mismatch" }
curl -fL -o v1428.tar.gz https://ratatoskr.space/pkg/ruview/v1428.tar.gz
printf '%s %s\n' 'cb31d1ed83a3ad1ea0ad3ce7dee8f21e67aed27bf354d9e888914f2cee1bdb78' 'v1428.tar.gz' | sha256sum -c -
$url = "https://ratatoskr.space/pkg/ruview/v1428.tar.gz"
$out = "v1428.tar.gz"
Invoke-WebRequest -Uri $url -OutFile $out
if ((Get-FileHash $out -Algorithm SHA256).Hash.ToLowerInvariant() -ne "cb31d1ed83a3ad1ea0ad3ce7dee8f21e67aed27bf354d9e888914f2cee1bdb78") { throw "sha256 mismatch" }
download via yggdrasil mesh
curl -fL -o v1428.zip http://14cc7d57b5e70f679b851fe5b272ce17c70632ff4beb5b35ab64bc706b2485af.pk.ygg/pkg/ruview/v1428.zip
printf '%s %s\n' '4c3baa6b1514b813dcd23db147d19e8d56404d75bf5e49a32575784b13e5356e' 'v1428.zip' | sha256sum -c -
$url = "http://14cc7d57b5e70f679b851fe5b272ce17c70632ff4beb5b35ab64bc706b2485af.pk.ygg/pkg/ruview/v1428.zip"
$out = "v1428.zip"
Invoke-WebRequest -Uri $url -OutFile $out
if ((Get-FileHash $out -Algorithm SHA256).Hash.ToLowerInvariant() -ne "4c3baa6b1514b813dcd23db147d19e8d56404d75bf5e49a32575784b13e5356e") { throw "sha256 mismatch" }
curl -fL -o v1428.tar.gz http://14cc7d57b5e70f679b851fe5b272ce17c70632ff4beb5b35ab64bc706b2485af.pk.ygg/pkg/ruview/v1428.tar.gz
printf '%s %s\n' 'cb31d1ed83a3ad1ea0ad3ce7dee8f21e67aed27bf354d9e888914f2cee1bdb78' 'v1428.tar.gz' | sha256sum -c -
$url = "http://14cc7d57b5e70f679b851fe5b272ce17c70632ff4beb5b35ab64bc706b2485af.pk.ygg/pkg/ruview/v1428.tar.gz"
$out = "v1428.tar.gz"
Invoke-WebRequest -Uri $url -OutFile $out
if ((Get-FileHash $out -Algorithm SHA256).Hash.ToLowerInvariant() -ne "cb31d1ed83a3ad1ea0ad3ce7dee8f21e67aed27bf354d9e888914f2cee1bdb78") { throw "sha256 mismatch" }
| artifact | format | size | hashes |
|---|---|---|---|
| v1428.zip | zip | 60.4 MiB |
blake3-24 f11440ff5d0b0538eee2c59ad9892a1a068249a2f5237cd2
sha256 4c3baa6b1514b813dcd23db147d19e8d56404d75bf5e49a32575784b13e5356e
sha1 7012389af24ef16562ce7b78a1d31d2f6a63b5d7
|
| v1428.tar.gz | tar.gz | 58.8 MiB |
blake3-24 95e7eed0f83e04cc0d2e0a61c653ac1dc388c07e4c4a3710
sha256 cb31d1ed83a3ad1ea0ad3ce7dee8f21e67aed27bf354d9e888914f2cee1bdb78
sha1 6cc0abdb52df84eca30a1a3f6941858525012214
|
install
http_archive(
name = "ruview",
urls = ["https://ratatoskr.space/pkg/ruview/v1428.tar.gz"],
integrity = "sha256-yzHR7YOjrR6grTzn3ujyHmeu0nvzVNnoiJFPLO4b23g=",
strip_prefix = "ruview-v1428",
)
.url = "https://ratatoskr.space/pkg/ruview/v1428.tar.gz",
install via yggdrasil mesh
http_archive(
name = "ruview",
urls = ["http://14cc7d57b5e70f679b851fe5b272ce17c70632ff4beb5b35ab64bc706b2485af.pk.ygg/pkg/ruview/v1428.tar.gz"],
integrity = "sha256-yzHR7YOjrR6grTzn3ujyHmeu0nvzVNnoiJFPLO4b23g=",
strip_prefix = "ruview-v1428",
)
.url = "http://14cc7d57b5e70f679b851fe5b272ce17c70632ff4beb5b35ab64bc706b2485af.pk.ygg/pkg/ruview/v1428.tar.gz",