Commit Graph

3 Commits

Author SHA1 Message Date
ruv be068748b3 fix(signal): revive dead CIR coherence gate + NaN bypass + window div0 (ADR-154 M0)
Milestone-0 correctness/security fixes for the beyond-SOTA signal/DSP sweep.
Every fix ships with a committed regression test (proof, not adjectives).

CRITICAL — ADR-134 CIR coherence gate was DEAD in production
  MultistaticFuser fuses canonical-56 frames (hardware_norm.rs resamples every
  chipset onto a 56-tone grid), but the gate was wired to CirConfig::ht20()
  which expects 64/52. Every estimate() returned SubcarrierMismatch and
  cir_gate_coherence silently fell back to freq-domain coherence — use_cir_gate
  was indistinguishable from false. Fixes:
   - new CirConfig::canonical56() (64-bin HT20 framing, 56 active tones, 168 taps)
   - new MultistaticFuser::with_cir_canonical56() (correct default); ht20 kept,
     now doc-warned
   - active_indices() handles (64,56) + length-matched fallback (no silent
     fall-through to the 52-index slice)
   - SubcarrierMismatch in the gate now debug_assert!s loudly (config error can
     no longer hide as a graceful degrade)
   - cir_estimate_first() exposes the Ok/Err verdict for tests
  PROOF (ruvsense::multistatic::tests): ht20 → 8/8 Err (dead); canonical56 →
  8/8 Ok (alive); coherence(gate on) != coherence(gate off).

CRITICAL — adversarial.rs NaN/inf detector bypass
  One non-finite link energy bypassed the whole detector (every `e>thresh`
  false on NaN; score clamp returns NaN). A non-finite input is itself the
  strongest spoof — now short-circuits to a definite anomaly (score 1.0,
  affected link reported) and does not poison the temporal-continuity state.
  PROOF: nan_link_energy_flags_anomaly, inf_link_energy_flags_anomaly.

CORRECTNESS — divide-by-(n-1) window trio
  csi_processor hamming_window (n=0 usize underflow, n=1 div0), bvp Hann,
  spectrogram make_window all guarded for n<=1 (empty / constant-1.0 window).
  Python deterministic proof still PASS, same pipeline hash (reference uses n>=2).
  PROOF: *_degenerate_sizes / *_size_one_is_finite / make_window_size_0_and_1.

CLARITY — calibration.rs subtract_in_place
  Removed the vacuous `if active_input {ki} else {ki}` branch that implied a
  full-FFT->bin remap that never existed; documented the sequential
  active-index convention (matches sibling extract_first_stream). No behavior
  change.

Tests: cargo test -p wifi-densepose-signal --no-default-features (+--features cir)
green; full workspace green; verify.py VERDICT: PASS.

Co-Authored-By: claude-flow <ruv@ruv.net>
2026-06-11 19:20:37 -04:00
rUv 004a63e82d fix(security): audit — fix RUSTSEC vulns, clippy warnings, dead code (#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
2026-05-23 05:36:13 -04:00
rUv f49c722764 chore(repo): rename rust-port/wifi-densepose-rs → v2/ (flatten to one level) (#427)
The Rust port lived two directories deep (rust-port/wifi-densepose-rs/)
without any sibling under rust-port/ that warranted the extra level.
Move the whole workspace up to v2/ to match v1/ (Python) at the same
depth and shorten every cd / build command across the repo.

git mv preserves history for all tracked files. 60 files updated for
path references (CI workflows, ADRs, docs, scripts, READMEs, internal
.claude-flow state). Two manual fixes for relative-cd paths in
CLAUDE.md and ADR-043 that became wrong after the depth change
(cd ../.. → cd ..).

Validated:
- cargo check --workspace --no-default-features → clean (after target/
  nuke; the gitignored target/ was carried by the OS rename and had
  hard-coded old paths in build scripts)
- cargo test --workspace --no-default-features → 1,539 passed, 0 failed,
  8 ignored (same totals as pre-rename)
- ESP32-S3 on COM7 → still streaming live CSI (cb #40300, RSSI -64 dBm)

After-merge follow-up: contributors should `rm -rf v2/target` once and
let cargo regenerate from the new path.
2026-04-25 21:28:13 -04:00