Skip to content

Releases: merajmehrabi/RuView

Release v11

13 Jun 13:26
29e937e

Choose a tag to compare

Automated release from CI pipeline

Changes:
Merge pull request ruvnet#1044 from ruvnet/feat/edge-skills-synthetic-validation

feat(wasm-edge): unified EdgePipeline (all ~64 skills) + honest synthetic validation harness

Docker Image:
ghcr.io/merajmehrabi/RuView:29e937ef526552beb50aee193258964e6339ab0e

Release v2

09 Jun 19:33
992c2b2

Choose a tag to compare

Automated release from CI pipeline

Changes:
fix(firmware): correct ESP32 edge heart rate — sample-rate + harmonic lock (ruvnet#987) (ruvnet#988)

  • fix(firmware): correct heart-rate estimation — sample-rate + harmonic lock

The edge vitals HR was stuck at ~45 BPM regardless of true heart rate
(Apple Watch ground truth 87 BPM read as ~45) and "dropped a lot" between
frames. Two root causes:

  1. Stale fixed sample rate. estimate_bpm_zero_crossing() used a hardcoded
    sample_rate = 10.0f (and the biquads a separate fs = 20.0f). That
    constant was correct when CSI came from ~10 Hz beacons, but ruvnet#985's
    self-ping raised the callback rate to a VARIABLE ~13-19 Hz. BPM scales as
    (assumed_rate / actual_rate) x true, so a true 87 read ~45, and because
    the real rate fluctuates with CSI yield while the code assumed a fixed
    value, the reported HR swung frame-to-frame (the "drops").

  2. Breathing-harmonic lock. Zero-crossing HR estimation locked onto a
    breathing harmonic — a 0.25 Hz breathing fundamental puts its 3rd
    harmonic at ~0.74 Hz ~= 44 BPM, right in the HR band — so it parked at
    ~45 BPM independent of the real heartbeat.

Fix:

  • Measure the real sample rate from inter-frame timestamps (EMA-smoothed,
    clamped 8-30 Hz); use it for both BPM conversion and biquad design, and
    re-tune the filters when the rate drifts >15% so the passbands stay in
    real Hz.
  • Replace the HR zero-crossing with estimate_hr_autocorr(): autocorrelation
    peak in the 45-180 BPM band that explicitly rejects lags within 8% of any
    breathing harmonic (k=1..6), with parabolic interpolation and a peak-
    confidence gate (returns 0 rather than a noise value).
  • Median-smooth (N=9) the emitted HR over valid estimates to kill residual
    single-frame outliers.

Validated on hardware (ESP32-S3, COM8/192.168.1.80) vs an unmodified board
(192.168.1.67) and an Apple Watch (87 BPM):

  • old firmware: HR pegged 40-52 BPM (median ~45)
  • fixed firmware: HR reaches the true 88-91 BPM range (peak 88.5, vs 87 GT)

Known limitation: under subject motion (motion=Y) HR is still noisy because
the breathing estimate degrades and misguides harmonic rejection; motion
gating + breathing robustness are follow-ups.

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

  • fix(firmware): robust HR harmonic rejection via autocorr breathing period (ruvnet#987)

Follow-up to 332c2a98d. The HR harmonic rejection was fed the noisy
zero-crossing breathing estimate, which under motion notched the wrong
frequencies and let the autocorr lock onto the ~0.75 Hz breathing harmonic
(~45 BPM). Generalize estimate_hr_autocorr -> estimate_periodicity_autocorr
and drive HR harmonic rejection from a robust autocorrelation breathing
period instead; widen the HR median smoother to N=13.

Hardware A/B (fixed .80 vs unmodified control .67, both edge_tier=2, subject
in motion 100% of frames):

  • control (old fw): HR pegged 40-43 BPM (median 40.6)
  • fixed: HR 60-91 BPM (median 71.9) — sub-60 harmonic locks
    eliminated, spread 42->31 BPM vs previous build

Reported breathing is unchanged (still zero-crossing); the autocorr breathing
period is used only internally for HR harmonic rejection.

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

  • docs(changelog): record ESP32 heart-rate fix (ruvnet#987)

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

Docker Image:
ghcr.io/merajmehrabi/RuView:992c2b25cb6c6fcf3ba4d80d2be906920831f54c

Release v1

23 May 11:35
004a63e

Choose a tag to compare

Automated release from CI pipeline

Changes:
fix(security): audit — fix RUSTSEC vulns, clippy warnings, dead code (ruvnet#769)

  • Upgrade openssl to 0.10.78 (CVE-2026-41676), jsonwebtoken to 9.4
  • Suppress unmaintained-only/no-CVE advisories in .cargo/audit.toml
    with per-entry rationale
  • Fix all cargo clippy --all-targets -- -D warnings errors across
    35 crates: derivable_impls, needless_range_loop, map_or→is_some_and/
    is_none_or, await_holding_lock (drop MutexGuard before .await),
    ptr_arg (&mut Vec→&mut [T]), useless_conversion, approximate_constant
    (2.718→E, 3.14→PI), field_reassign_with_default, manual_inspect,
    useless_vec, lines_filter_map_ok, print_literal, dead_code
  • Apply cargo fmt --all
  • Pre-existing test failure in wifi-densepose-signal
    (test_estimate_occupancy_noise_only) is not introduced by this PR

Docker Image:
ghcr.io/merajmehrabi/RuView:004a63e82dea170ad303939d7cf6e7fc3fb3a146