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.
This commit is contained in:
rUv
2026-04-25 21:28:13 -04:00
committed by GitHub
parent 2a58fe478b
commit f49c722764
626 changed files with 240 additions and 363 deletions
@@ -216,4 +216,4 @@ full = ["mincut-matching", "attn-mincut", "temporal-compress", "solver-interpola
- [Elastic Weight Consolidation](https://arxiv.org/abs/1612.00796)
- [Raft Consensus](https://raft.github.io/raft.pdf)
- [ML-DSA (FIPS 204)](https://csrc.nist.gov/pubs/fips/204/final)
- [WiFi-DensePose Rust ADR-001: Workspace Structure](../rust-port/wifi-densepose-rs/docs/adr/ADR-001-workspace-structure.md)
- [WiFi-DensePose Rust ADR-001: Workspace Structure](../v2/docs/adr/ADR-001-workspace-structure.md)
@@ -510,7 +510,7 @@ impl CompressedHeartbeatSpectrogram {
## Dependency Changes Required
Add to `rust-port/wifi-densepose-rs/Cargo.toml` workspace (already present from ADR-016):
Add to `v2/Cargo.toml` workspace (already present from ADR-016):
```toml
ruvector-mincut = "2.0.4" # already present
ruvector-attn-mincut = "2.0.4" # already present
+1 -1
View File
@@ -11,7 +11,7 @@
The WiFi-DensePose UI was originally built to require the full FastAPI DensePose backend (`localhost:8000`) for all functionality. This backend depends on heavy Python packages (PyTorch ~2GB, torchvision, OpenCV, SQLAlchemy, Redis) making it impractical for lightweight sensing-only deployments where the user simply wants to visualize live WiFi signal data from ESP32 CSI or Windows RSSI collectors.
A Rust port exists (`rust-port/wifi-densepose-rs`) using Axum with lighter runtime footprint (~10MB binary, ~5MB RAM), but it still requires libtorch C++ bindings and OpenBLAS for compilation—a non-trivial build.
A Rust port exists (`v2`) using Axum with lighter runtime footprint (~10MB binary, ~5MB RAM), but it still requires libtorch C++ bindings and OpenBLAS for compilation—a non-trivial build.
Users need a way to run the UI with **only the sensing pipeline** active, without installing the full DensePose backend stack.
@@ -22,7 +22,7 @@ The current Python DensePose backend requires ~2GB+ of dependencies:
This makes the DensePose backend impractical for edge deployments, CI pipelines, and developer laptops where users only need WiFi sensing + pose estimation.
Meanwhile, the Rust port at `rust-port/wifi-densepose-rs/` already has:
Meanwhile, the Rust port at `v2/` already has:
- **12 workspace crates** covering core, signal, nn, api, db, config, hardware, wasm, cli, mat, train
- **5 RuVector crates** (v2.0.4, published on crates.io) integrated into signal, mat, and train crates
@@ -143,7 +143,7 @@ The `wifi-densepose-nn::onnx` module loads `.onnx` files directly.
```bash
# Build the Rust workspace (ONNX-only, no libtorch)
cd rust-port/wifi-densepose-rs
cd v2
cargo check --workspace 2>&1
# Build release binary
@@ -34,7 +34,7 @@ The `vendor/ruvector` codebase provides a rich set of signal processing primitiv
### Current Project State
The Rust port (`rust-port/wifi-densepose-rs/`) already contains:
The Rust port (`v2/`) already contains:
- **`wifi-densepose-signal`**: CSI processing, BVP extraction, phase sanitization, Hampel filter, spectrogram generation, Fresnel geometry, motion detection, subcarrier selection
- **`wifi-densepose-sensing-server`**: Axum server receiving ESP32 CSI frames (UDP 5005), WebSocket broadcasting sensing updates, signal field generation, with three data source modes:
@@ -108,7 +108,7 @@ ESP32 CSI (UDP:5005) ──▶│ ┌──────────────
### Module Structure
```
rust-port/wifi-densepose-rs/crates/wifi-densepose-vitals/
v2/crates/wifi-densepose-vitals/
├── Cargo.toml
└── src/
├── lib.rs # Public API and re-exports
@@ -592,7 +592,7 @@ impl FrameBuilder {
### 3.3 Module Structure
```
rust-port/wifi-densepose-rs/crates/wifi-densepose-wifiscan/
v2/crates/wifi-densepose-wifiscan/
├── Cargo.toml
└── src/
├── lib.rs # Public API, re-exports
@@ -699,28 +699,28 @@ let dashboard = container.load_dashboard()?;
| File | Purpose |
|------|---------|
| `rust-port/.../wifi-densepose-train/src/dataset_mmfi.rs` | MM-Fi dataset loader with subcarrier resampling |
| `rust-port/.../wifi-densepose-train/src/dataset_wipose.rs` | Wi-Pose dataset loader |
| `rust-port/.../wifi-densepose-train/src/graph_transformer.rs` | Graph transformer integration |
| `rust-port/.../wifi-densepose-train/src/body_gnn.rs` | GNN body graph reasoning |
| `rust-port/.../wifi-densepose-train/src/adaptation.rs` | SONA LoRA + EWC++ adaptation |
| `rust-port/.../wifi-densepose-train/src/trainer.rs` | Training loop with multi-term loss |
| `v2/.../wifi-densepose-train/src/dataset_mmfi.rs` | MM-Fi dataset loader with subcarrier resampling |
| `v2/.../wifi-densepose-train/src/dataset_wipose.rs` | Wi-Pose dataset loader |
| `v2/.../wifi-densepose-train/src/graph_transformer.rs` | Graph transformer integration |
| `v2/.../wifi-densepose-train/src/body_gnn.rs` | GNN body graph reasoning |
| `v2/.../wifi-densepose-train/src/adaptation.rs` | SONA LoRA + EWC++ adaptation |
| `v2/.../wifi-densepose-train/src/trainer.rs` | Training loop with multi-term loss |
| `scripts/generate_densepose_labels.py` | Teacher-student UV label generation |
| `scripts/benchmark_inference.py` | Inference latency benchmarking |
| `rust-port/.../wifi-densepose-train/src/rvf_builder.rs` | RVF container build pipeline |
| `rust-port/.../wifi-densepose-train/src/bin/build_rvf.rs` | CLI binary for building `.rvf` containers |
| `rust-port/.../wifi-densepose-train/src/bin/verify_rvf.rs` | CLI binary for verifying `.rvf` containers |
| `v2/.../wifi-densepose-train/src/rvf_builder.rs` | RVF container build pipeline |
| `v2/.../wifi-densepose-train/src/bin/build_rvf.rs` | CLI binary for building `.rvf` containers |
| `v2/.../wifi-densepose-train/src/bin/verify_rvf.rs` | CLI binary for verifying `.rvf` containers |
### Modified Files
| File | Change |
|------|--------|
| `rust-port/.../wifi-densepose-train/Cargo.toml` | Add ruvector-gnn, graph-transformer, sona, sparse-inference, math, rvf-types, rvf-wire, rvf-manifest, rvf-index, rvf-quant, rvf-crypto, rvf-runtime deps |
| `rust-port/.../wifi-densepose-train/src/model.rs` | Integrate graph transformer + GNN layers |
| `rust-port/.../wifi-densepose-train/src/losses.rs` | Add optimal transport + GNN edge consistency loss terms |
| `rust-port/.../wifi-densepose-train/src/config.rs` | Add training hyperparameters for new components |
| `rust-port/.../sensing-server/Cargo.toml` | Add rvf-runtime, rvf-types, rvf-index, rvf-quant deps |
| `rust-port/.../sensing-server/src/main.rs` | Add `--model` flag, load `.rvf` container, progressive startup, serve embedded dashboard |
| `v2/.../wifi-densepose-train/Cargo.toml` | Add ruvector-gnn, graph-transformer, sona, sparse-inference, math, rvf-types, rvf-wire, rvf-manifest, rvf-index, rvf-quant, rvf-crypto, rvf-runtime deps |
| `v2/.../wifi-densepose-train/src/model.rs` | Integrate graph transformer + GNN layers |
| `v2/.../wifi-densepose-train/src/losses.rs` | Add optimal transport + GNN edge consistency loss terms |
| `v2/.../wifi-densepose-train/src/config.rs` | Add training hyperparameters for new components |
| `v2/.../sensing-server/Cargo.toml` | Add rvf-runtime, rvf-types, rvf-index, rvf-quant deps |
| `v2/.../sensing-server/src/main.rs` | Add `--model` flag, load `.rvf` container, progressive startup, serve embedded dashboard |
## Consequences
@@ -371,7 +371,7 @@ ESP32 SRAM budget: 520 KB. Model at INT8: 53-60 KB = 10-12% of SRAM. Ample margi
### 2.6 Concrete Module Additions
All new/modified files in `rust-port/wifi-densepose-rs/crates/wifi-densepose-sensing-server/src/`:
All new/modified files in `v2/crates/wifi-densepose-sensing-server/src/`:
#### 2.6.1 `embedding.rs` (NEW, ~450 lines)
@@ -107,7 +107,7 @@ Implement a **macOS CoreWLAN sensing adapter** as a Swift helper binary + Rust a
### 3.2 Swift Helper Binary
**File:** `rust-port/wifi-densepose-rs/tools/macos-wifi-scan/main.swift`
**File:** `v2/tools/macos-wifi-scan/main.swift`
```swift
// Modes:
+7 -7
View File
@@ -198,16 +198,16 @@ When a `.rvf` model is loaded:
### New Files
- `ui/components/ModelPanel.js` — Model library, inspector, load/unload controls
- `ui/components/TrainingPanel.js` — Recording controls, training progress, metric charts
- `rust-port/.../sensing-server/src/recording.rs` — CSI recording API handlers
- `rust-port/.../sensing-server/src/training_api.rs` — Training API handlers + WS progress stream
- `rust-port/.../sensing-server/src/model_manager.rs` — Model loading, hot-swap, 32LoRA activation
- `v2/.../sensing-server/src/recording.rs` — CSI recording API handlers
- `v2/.../sensing-server/src/training_api.rs` — Training API handlers + WS progress stream
- `v2/.../sensing-server/src/model_manager.rs` — Model loading, hot-swap, 32LoRA activation
- `data/models/` — Default model storage directory
### Modified Files
- `rust-port/.../sensing-server/src/main.rs` — Wire recording, training, and model APIs
- `rust-port/.../train/src/trainer.rs` — Add WebSocket progress callback, LoRA training mode
- `rust-port/.../train/src/dataset.rs` — MM-Fi and Wi-Pose dataset loaders
- `rust-port/.../nn/src/onnx.rs` — LoRA weight injection, INT8 quantization support
- `v2/.../sensing-server/src/main.rs` — Wire recording, training, and model APIs
- `v2/.../train/src/trainer.rs` — Add WebSocket progress callback, LoRA training mode
- `v2/.../train/src/dataset.rs` — MM-Fi and Wi-Pose dataset loaders
- `v2/.../nn/src/onnx.rs` — LoRA weight injection, INT8 quantization support
- `ui/components/LiveDemoTab.js` — Model selector, LoRA dropdown, A/B spsplit view
- `ui/components/SettingsPanel.js` — Model and training configuration sections
- `ui/components/PoseDetectionCanvas.js` — Pose trail rendering, confidence heatmap overlay
+1 -1
View File
@@ -128,7 +128,7 @@ All configurable via `provision.py --edge-tier 2 --pres-thresh 0.05 ...`
- `firmware/esp32-csi-node/main/edge_processing.h` — Types and API
- `firmware/esp32-csi-node/main/ota_update.c/h` — HTTP OTA endpoint
- `firmware/esp32-csi-node/main/power_mgmt.c/h` — Power management
- `rust-port/.../wifi-densepose-sensing-server/src/main.rs` — Vitals parser + REST endpoint
- `v2/.../wifi-densepose-sensing-server/src/main.rs` — Vitals parser + REST endpoint
- `scripts/provision.py` — Edge config CLI arguments
- `.github/workflows/firmware-ci.yml` — CI build + size gate (updated to 950 KB for Tier 3)
@@ -164,8 +164,8 @@ Core 1 (DSP Task)
- `firmware/esp32-csi-node/main/wasm_runtime.c/h` — Runtime host with 12 API bindings + manifest
- `firmware/esp32-csi-node/main/wasm_upload.c/h` — HTTP REST endpoints (RVF-aware)
- `firmware/esp32-csi-node/main/rvf_parser.c/h` — RVF container parser and verifier
- `rust-port/.../wifi-densepose-wasm-edge/` — Rust WASM crate (gesture, coherence, adversarial, rvf, occupancy, vital_trend, intrusion)
- `rust-port/.../wifi-densepose-sensing-server/src/main.rs``0xC5110004` parser
- `v2/.../wifi-densepose-wasm-edge/` — Rust WASM crate (gesture, coherence, adversarial, rvf, occupancy, vital_trend, intrusion)
- `v2/.../wifi-densepose-sensing-server/src/main.rs``0xC5110004` parser
- `docs/adr/ADR-039-esp32-edge-intelligence.md` — Updated with Tier 3 reference
---
@@ -289,7 +289,7 @@ Startup creates `data/models/` and `data/recordings/` directories and populates
```bash
# 1. Start sensing server with auto source (simulated fallback)
cd rust-port/wifi-densepose-rs
cd v2
cargo run -p wifi-densepose-sensing-server -- --http-port 3000 --source auto
# 2. Verify model endpoints return 200
@@ -312,11 +312,11 @@ curl -s http://localhost:3000/api/v1/models/lora/profiles | jq '.'
# Navigate to http://localhost:3000/ui/
# 7. Run mobile tests
cd ../../ui/mobile
cd ../ui/mobile
npx jest --no-coverage
# 8. Run Rust workspace tests (must pass, 1031+ tests)
cd ../../rust-port/wifi-densepose-rs
cd ../../v2
cargo test --workspace --no-default-features
```
+5 -5
View File
@@ -52,7 +52,7 @@ Build a Tauri v2 desktop application as a new crate in the Rust workspace. The f
Add a new crate to the workspace:
```
rust-port/wifi-densepose-rs/
v2/
Cargo.toml # Add "crates/wifi-densepose-desktop" to members
crates/
wifi-densepose-desktop/ # NEW — Tauri app crate
@@ -621,11 +621,11 @@ chrono = { version = "0.4", features = ["serde"] }
```bash
# Prerequisites
cargo install tauri-cli@^2
cd rust-port/wifi-densepose-rs/crates/wifi-densepose-desktop/frontend
cd v2/crates/wifi-densepose-desktop/frontend
npm install
# Development (hot-reload frontend + Rust rebuild)
cd rust-port/wifi-densepose-rs/crates/wifi-densepose-desktop
cd v2/crates/wifi-densepose-desktop
cargo tauri dev
# Production build
@@ -805,6 +805,6 @@ Total estimated effort: ~11 weeks for a single developer.
- ADR-051: Sensing Server Decomposition
- `firmware/esp32-csi-node/` — ESP32 firmware source
- `firmware/esp32-csi-node/provision.py` — Current provisioning script
- `rust-port/wifi-densepose-rs/crates/wifi-densepose-sensing-server/` — Sensing server
- `rust-port/wifi-densepose-rs/crates/wifi-densepose-hardware/` — Hardware crate
- `v2/crates/wifi-densepose-sensing-server/` — Sensing server
- `v2/crates/wifi-densepose-hardware/` — Hardware crate
- `ui/` — Existing web UI
@@ -214,7 +214,7 @@ examples/wasm-browser-pose/
set -e
# Build wifi-densepose-wasm (CSI processing)
wasm-pack build ../../rust-port/wifi-densepose-rs/crates/wifi-densepose-wasm \
wasm-pack build ../../v2/crates/wifi-densepose-wasm \
--target web --out-dir "$(pwd)/pkg/wifi_densepose_wasm" --no-typescript
# Build ruvector-cnn-wasm (CNN inference for both video and CSI)
+1 -1
View File
@@ -191,5 +191,5 @@ Also does not give per-person subcarrier assignments.
- Stoer, M. & Wagner, F. (1997). "A Simple Min-Cut Algorithm." JACM 44(4).
- `vendor/ruvector/crates/ruvector-mincut/src/algorithm/mod.rs` — DynamicMinCut API
- `rust-port/.../sig_mincut_person_match.rs` — current (broken) WASM edge matcher
- `v2/.../sig_mincut_person_match.rs` — current (broken) WASM edge matcher
- `scripts/rf-scan.js` — CSI packet parsing and subcarrier classification
@@ -481,7 +481,7 @@ make check
# → test_rv_mesh: 27/27 pass, HEALTH roundtrip = 1.0 µs
# Rust-side radio_ops trait + mesh decoder tests
cd rust-port/wifi-densepose-rs
cd v2
cargo test -p wifi-densepose-hardware --no-default-features --lib radio_ops
# → 8 passed; verifies MockRadio, CRC32 parity with firmware vectors,
# HEALTH encode/decode roundtrip, bad-magic/short/CRC rejection,