Files
RuView/v2/Cargo.toml
T
Mathew Beaneandclaude-flow f44f25d596 feat(mtk-bridge): bridge MT7981 vendor CSI into MTC1
Adds `wifi-densepose-mtk-bridge`. It converts MediaTek mt76 vendor CSI
into ADR-267 MTC1 frames for the sensing server's UDP ingest.

Inputs:
- `--replay`: an `mt76-vendor dump csi` JSON file, or a `.mtkcap`
  recording. Records are grouped into frames by the driver's last-chain
  bit, per transmitter address, so HT 2x2 and legacy 1x2 runs from one
  radio each close with their real dimensions. Concatenated and duplicate
  dumps (the vendor tool appends) are reported, not hidden.
- `--listen`: MtkCSIdump UDP datagrams. They carry no packet identity, so
  each datagram becomes one 1x1 frame rather than a guessed pairing.
  Missing RSSI/noise is the -128 dBm sentinel, and PPDU type is `Unknown`.

Provenance:
- The bridge never sets CALIBRATED.
- A replayed file must be either attested (`--captured-on
  <model>/<firmware>`) or declared `--synthetic`, or the bridge refuses to
  start.
- Synthetic is sticky. It can come from a sidecar, a `.synthetic.` file
  name, or a capture header, and none of these can be overridden.
- `--listen` requires a `--listen-allow` CIDR list. Other sources are
  dropped and counted, never decoded.

Fixtures are fabricated and use locally administered addresses. The
assembler tests that model the two live dump loops use stand-in addresses,
not the real clients'. Captures written under the bridge's earlier format
tag still load.

Tests: 51 unit and 39 integration tests, plus clippy -D warnings.

Developed in whitsentry, a RuView-based project.

Co-Authored-By: claude-flow <ruv@ruv.net>
2026-10-02 18:30:00 -04:00

317 lines
15 KiB
TOML

[workspace]
resolver = "2"
members = [
"crates/wifi-densepose-core",
"crates/wifi-densepose-physics", # ADR-323 bounded pose assessment/correction
"crates/wifi-densepose-signal",
"crates/wifi-densepose-nn",
# wifi-densepose-api / -db / -config: removed in #578.
# The crate names were reserved early for an envisioned REST/database/config
# split, but no implementation followed and no code referenced them. The
# functionality they would provide is covered today by:
# - REST/WS: `wifi-densepose-sensing-server` (Axum)
# - Config: per-crate config + CLI args in `wifi-densepose-sensing-server`
# and `wifi-densepose-desktop`
# - DB: no persistent state; system is real-time
# If we ever need any of these as a published surface, they can be
# reintroduced with a real implementation.
"crates/wifi-densepose-hardware",
"crates/wifi-densepose-wasm",
"crates/wifi-densepose-cli",
"crates/wifi-densepose-mat",
"crates/wifi-densepose-train",
"crates/wifi-densepose-sensing-server",
# ADR-266/267: MT7981 vendor CSI (mt76) -> MTC1 bridge.
"crates/wifi-densepose-mtk-bridge",
"crates/wifi-densepose-aether", # ADR-185 §13 — AETHER pure-compute leaf (std-only)
"crates/wifi-densepose-privshield", # ADR-291 — VEIL privacy shield (compliant-waveform anti-sensing; std-only leaf)
"crates/wifi-densepose-wifiscan",
"crates/wifi-densepose-vitals",
"crates/wifi-densepose-ruvector",
"crates/wifi-densepose-desktop",
"crates/wifi-densepose-pointcloud",
# geo + worldgraph extracted to ruvnet/worldgraph submodule (see crates/worldgraph)
"crates/wifi-densepose-engine", # ADR-135..146 integration/composition layer
"crates/wifi-densepose-calibration", # ADR-151 — per-room calibration & specialist training
# ADR-271 — Cognitum OAuth access-token verification. RuView as an OAuth
# RESOURCE SERVER: offline ES256/JWKS verification of tokens issued by
# auth.cognitum.one, so a user signs in to their own sensing server with
# their Cognitum identity instead of a shared static bearer. No login flow
# and no outbound Cognitum API calls live here — verification only.
"crates/ruview-auth",
"crates/ruview-cognitum-spaces", # ADR-325 Cognitum Spaces read client
"crates/nvsim",
"crates/nvsim-server",
"crates/homecore", # ADR-127 — HOMECORE state machine
"crates/homecore-plugins", # ADR-128 — HOMECORE-PLUGINS WASM runtime (P1 scaffold)
"crates/homecore-api", # ADR-130 — HOMECORE REST + WS API
"crates/homecore-automation", # ADR-129 — HOMECORE automation engine
"crates/homecore-recorder", # ADR-132 — HOMECORE state recorder
"crates/homecore-migrate", # ADR-134 — HOMECORE migration from Python HA
# ADR-100/ADR-101: Cognitum Cog packaging — first Cog from this repo.
# Ships the wifi-densepose pose-estimation model as a signed binary +
# JSONL manifest installable by the Cognitum V0 appliance (cognitum-v0,
# cognitum-cluster-*, ruvultra). The companion appliance-side crate
# lives in cognitum-one/v0-appliance as `cognitum-pose-estimation`.
"crates/cog-pose-estimation",
# ADR-103: Learned multi-person counter (SOTA path) — replaces the
# PR #491 slot heuristic with a Candle network + Stoer-Wagner fusion.
# Motivated by #499 ghost-skeleton reports.
"crates/cog-person-count",
# ADR-116: Home Assistant + Matter Cognitum Seed cog. Wraps the
# ADR-115 MQTT publisher as a Seed-installable artifact with
# mDNS, embedded broker, RuVector thresholds, Ed25519 witness.
"crates/cog-ha-matter",
# ADR-118: BFLD — Beamforming Feedback Layer for Detection. The
# privacy/safety layer that measures and gates identity leakage from
# WiFi BFI captures. Sub-ADRs: 119 (frame), 120 (privacy class),
# 121 (identity risk), 122 (HA/Matter), 123 (capture path).
"crates/wifi-densepose-bfld",
# ADR-147: OccWorld thin-client bridge — WorldGraph PersonTrack history →
# OccWorld Python subprocess → TrajectoryPrior injection into pose tracker.
# worldmodel extracted to ruvnet/worldgraph submodule (consumed via path dep)
# ADR-147 (Phase 5): OccWorld TransVQVAE ported to Candle — native Rust
# inference without Python/IPC overhead. Loaded alongside the Python bridge
# as a faster alternative once Phase-5 weights are available.
"crates/wifi-densepose-occworld-candle",
# rvCSI — edge RF sensing runtime (ADR-095 platform, ADR-096 FFI/crate layout):
# lives in its own repo (https://github.com/ruvnet/rvcsi), vendored here as
# `vendor/rvcsi` and published to crates.io as `rvcsi-*` 0.3.x. Depend on the
# published crates (or the submodule's `crates/rvcsi-*` paths) — not as v2
# workspace members, since `vendor/rvcsi/Cargo.toml` is its own workspace.
"crates/homecore-hap", # ADR-125 — Apple Home HomeKit Accessory Protocol bridge
"crates/homecore-assist", # ADR-133 — HOMECORE voice assistant + ruflo bridge
"crates/homecore-server", # iter-9 — HOMECORE integration binary (all 8 crates wired together)
"crates/ruview-swarm", # ADR-148 — drone swarm control system
# ADR-273..277 — unified RF spatial world model: canonical RF tensor +
# hardware adapters, universal foundation encoder (masked-reconstruction
# pretraining, ≤1% task adapters), RF-aware Gaussian spatial memory,
# physics-guided synthetic RF worlds, edge sensing control plane.
"crates/ruview-unified",
# ADR-262 P1 — anti-corruption bridge converting RuView WiFi-CSI sensing
# output into signed RuField FieldEvents. Path-deps the `vendor/rufield`
# submodule crates (rufield-core/-provenance/-privacy/-fusion); single
# coupling point between RuView and the standalone RuField MFS spec.
"crates/wifi-densepose-rufield",
# ADR-287 — coherent wideband RF tomography research crate: synthetic
# stepped-frequency multi-position measurement simulation + delay-and-sum
# backprojection reconstruction. Standalone leaf (nvsim pattern), zero
# hardware coupling, every number SYNTHETIC/L0 until real wideband RF
# hardware exists.
"crates/wifi-densepose-sar",
# ADR-300 phase 1 — perception substrate spine (new first-party crates):
"crates/ruview-ontology", # ADR-306 canonical spatial ontology (Site..Event)
"crates/ruview-attest", # ADR-305 authenticated sensor identity / RF chain of custody
"crates/ruview-evidence", # ADR-304 evidence engine (per-room/device/subject ledger)
# ADR-300 phase 1 — dependent wave (build on the spine roots above):
"crates/ruview-ood", # ADR-302 OOD KNOWN/DEGRADED/UNKNOWN gating
"crates/ruview-witness", # ADR-319 witness chain (staged signed provenance)
"crates/ruview-certify", # ADR-318 capability certificate
"crates/ruview-scorecard", # ADR-317 multi-domain benchmark scorecard
"crates/ruview-policy", # ADR-321 decision policy / action authorization
# ADR-300 phase 2 — unified world-model core:
"crates/ruview-hal", # ADR-320 sensor HAL (any modality -> Observation)
"crates/ruview-groundtruth",# ADR-303 ground-truth synchronization / validation plane
"crates/ruview-track", # ADR-307 persistent privacy-preserving tracking
"crates/ruview-fusion", # ADR-311 uncertainty-aware fusion -> one world state
# ADR-300 phase 3 — higher-ceiling primitives (on the fused world state):
"crates/ruview-twin", # ADR-315 digital RF twin (per-deployment model)
"crates/ruview-placement", # ADR-308 sensor placement optimizer
"crates/ruview-memory", # ADR-312 long-term spatial memory / anomaly
"crates/ruview-spatial-memory",# ADR-326 tenant-scoped Cognitum Spaces history
"crates/ruview-counterfactual",# ADR-313 counterfactual spatial inference
"crates/ruview-infogain", # ADR-314 information-gain scheduler
"crates/ruview-active", # ADR-309 active sensing control
# ADR-324 — clean-room Kooima off-axis (head-coupled perspective) projection.
# Dependency-free native core; wasm-bindgen surface only on wasm32.
"crates/ruview-offaxis",
# ADR-368 — portable compute kernel for the `@ruvnet/ruview-kernel` npm
# package: one bounded JSON ABI, wasm32 (zero-import) + napi-rs transports.
"crates/ruview-kernel",
# ADR-348 — RuForecast extracted to the ruvnet/RuForecast submodule
# (see crates/ruforecast in the exclude list below); path-deps only.
]
# ADR-040: WASM edge crate targets wasm32-unknown-unknown (no_std),
# excluded from workspace to avoid breaking `cargo test --workspace`.
# Build separately: cargo build -p wifi-densepose-wasm-edge --target wasm32-unknown-unknown --release
#
# ADR-128 P2: example WASM plugin — also wasm32-only (no_std, cdylib),
# excluded for the same reason. Build separately:
# cargo build --target wasm32-unknown-unknown --release -p homecore-plugin-example
exclude = [
"crates/wifi-densepose-wasm-edge",
"crates/homecore-plugin-example",
# ADR-368: napi-rs transport for ruview-kernel. Own workspace so napi never
# enters `cargo test --workspace`. Built by harness/ruview-kernel scripts.
"crates/ruview-kernel-napi",
"crates/worldgraph", # ruvnet/worldgraph submodule — its own workspace (geo/worldgraph/worldmodel)
"crates/ruforecast", # ruvnet/RuForecast submodule — its own workspace (ruforecast-core/model/train)
# LOCAL-DEV-ONLY: path-depends on an absolute, unpublished ruvnet/autogenous
# checkout that does not exist in CI. Build directly with
# `cargo build --manifest-path crates/ruforecast-autogenous-bridge/Cargo.toml`
# on a host with that checkout present. See its Cargo.toml/README.
"crates/ruforecast-autogenous-bridge",
]
[workspace.package]
version = "0.3.1"
edition = "2021"
authors = ["rUv <ruv@ruv.net>", "WiFi-DensePose Contributors"]
license = "MIT OR Apache-2.0"
repository = "https://github.com/ruvnet/wifi-densepose"
documentation = "https://docs.rs/wifi-densepose"
keywords = ["wifi", "densepose", "csi", "pose-estimation", "rust"]
categories = ["science", "computer-vision", "wasm"]
[workspace.dependencies]
# Core utilities
thiserror = "2.0"
# WiFi Veil — compliant-waveform countermeasure against unauthorized WiFi
# sensing (ADR-294). Dependency-free, deterministic, SYNTHETIC-only leaf;
# pinned to an exact rev because the crate is consumed pre-crates.io-release.
wifi-veil = { git = "https://github.com/ruvnet/wifi-veil", rev = "018468b5d2bf41f35c552910f35659830af0eb91" }
anyhow = "1.0"
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
serde_yaml = "0.9"
tokio = { version = "1.35", features = ["full"] }
tracing = "0.1"
tracing-subscriber = { version = "0.3", features = ["env-filter", "json"] }
nalgebra = "0.34"
smallvec = "1.15"
bitflags = "2.9"
rapier3d = { version = "0.33", default-features = false, features = ["std", "dim3", "f32"] }
burn-core = { version = "0.21", default-features = false, features = ["std"] }
burn-nn = { version = "0.21", default-features = false }
burn-ndarray = { version = "0.21", default-features = false, features = ["std"] }
burn-train = { version = "0.21", default-features = false }
burn-wgpu = { version = "0.21", default-features = false, features = ["std"] }
burn-cuda = { version = "0.21", default-features = false, features = ["std"] }
# Signal processing
ndarray = { version = "0.17", features = ["serde"] }
ndarray-linalg = { version = "0.18", features = ["openblas-static"] }
rustfft = "6.1"
num-complex = "0.4"
num-traits = "0.2"
# Neural network
tch = "0.24"
ort = { version = "2.0.0-rc.11" }
candle-core = "0.4"
candle-nn = "0.4"
# Web framework
axum = { version = "0.7", features = ["ws", "macros"] }
tower = { version = "0.4", features = ["full"] }
tower-http = { version = "0.6", features = ["cors", "trace", "compression-gzip"] }
hyper = { version = "1.1", features = ["full"] }
# Database
sqlx = { version = "0.7", features = ["runtime-tokio", "postgres", "sqlite", "uuid", "chrono", "json"] }
redis = { version = "0.24", features = ["tokio-comp", "connection-manager"] }
# Configuration
config = "0.14"
dotenvy = "0.15"
envy = "0.4"
# WASM
wasm-bindgen = "0.2"
wasm-bindgen-futures = "0.4"
js-sys = "0.3"
web-sys = { version = "0.3", features = ["console", "Window", "WebSocket"] }
getrandom = { version = "0.2", features = ["js"] }
# Hardware
serialport = "4.3"
pcap = "1.1"
# Graph algorithms (for min-cut assignment in metrics)
petgraph = "0.6"
# Data loading
ndarray-npy = "0.10"
walkdir = "2.4"
# Hashing (for proof)
sha2 = "0.10"
ed25519-dalek = "2.1"
# CSV logging
csv = "1.3"
# Progress bars
indicatif = "0.17"
# CLI
clap = { version = "4.4", features = ["derive", "env"] }
# rvCSI: napi-rs (Rust -> Node bindings) + napi-c (C-shim build glue)
napi = { version = "2.16", default-features = false, features = ["napi8"] }
napi-derive = "2.16"
napi-build = "2.1"
cc = "1.0"
libc = "0.2"
# Testing
criterion = { version = "0.5", features = ["html_reports"] }
proptest = "1.4"
mockall = "0.12"
wiremock = "0.5"
# midstreamer integration (published on crates.io)
# 0.1.0 was yanked; upgrade to latest 0.3/0.2 releases which pull in
# quinn-proto >=0.11.14 (fixes RUSTSEC-2026-0037) and
# rustls-webpki >=0.103.13 (fixes RUSTSEC-2026-0049/0098/0099/0104).
midstreamer-quic = "0.3"
midstreamer-scheduler = "0.2"
midstreamer-temporal-compare = "0.2"
midstreamer-attractor = "0.2"
# ruvector integration (published on crates.io)
# Vendored at origin/main (a083bd77f) in vendor/ruvector; using crates.io versions
# until published. Bumps per ADR-152 §2.6 (2026-06-10 vendor sync survey).
ruvector-core = "2.3.0"
ruvector-mincut = "2.0.6"
ruvector-attn-mincut = "2.0.4"
ruvector-temporal-tensor = "2.0.6"
ruvector-solver = "2.0.6"
ruvector-attention = "2.1.0"
ruvector-crv = "0.1.1"
ruvector-gnn = { version = "2.2.0", default-features = false }
# Internal crates
wifi-densepose-core = { version = "0.3.0", path = "crates/wifi-densepose-core" }
wifi-densepose-physics = { version = "0.1.0", path = "crates/wifi-densepose-physics" }
wifi-densepose-signal = { version = "0.3.0", path = "crates/wifi-densepose-signal" }
wifi-densepose-nn = { version = "0.3.0", path = "crates/wifi-densepose-nn" }
wifi-densepose-api = { version = "0.3.0", path = "crates/wifi-densepose-api" }
wifi-densepose-db = { version = "0.3.0", path = "crates/wifi-densepose-db" }
wifi-densepose-config = { version = "0.3.0", path = "crates/wifi-densepose-config" }
wifi-densepose-hardware = { version = "0.3.0", path = "crates/wifi-densepose-hardware" }
wifi-densepose-wasm = { version = "0.3.0", path = "crates/wifi-densepose-wasm" }
wifi-densepose-mat = { version = "0.3.0", path = "crates/wifi-densepose-mat" }
wifi-densepose-ruvector = { version = "0.3.0", path = "crates/wifi-densepose-ruvector" }
wifi-densepose-worldmodel = { version = "0.3.0", path = "crates/worldgraph/wifi-densepose-worldmodel" }
ruforecast-core = { version = "0.1.0", path = "crates/ruforecast/crates/ruforecast-core" }
ruforecast-model = { version = "0.1.0", path = "crates/ruforecast/crates/ruforecast-model" }
ruforecast-train = { version = "0.1.0", path = "crates/ruforecast/crates/ruforecast-train" }
[profile.release]
lto = true
codegen-units = 1
panic = "abort"
strip = true
opt-level = 3
[profile.release-with-debug]
inherits = "release"
debug = true
strip = false
[profile.bench]
inherits = "release"
debug = true