docs/adr/ADR-118-bfld-beamforming-feedback-layer-for-detection.md
| Field | Value |
|---|---|
| Status | Proposed |
| Date | 2026-05-24 |
| Deciders | ruv |
| Codename | BFLD — Beamforming Feedback Layer for Detection |
| Relates to | ADR-024 (AETHER), ADR-027 (MERIDIAN), ADR-028 (witness), ADR-029 (multistatic), ADR-030 (field model), ADR-031 (sensing-first), ADR-032 (mesh security), ADR-095 (rvCSI), ADR-115 (HA), ADR-116 (Matter), ADR-117 (pip) |
| Sub-ADRs | ADR-119 (frame), ADR-120 (privacy), ADR-121 (risk), ADR-122 (RuView), ADR-123 (capture) |
| Research bundle | docs/research/BFLD/ (11 files, 13,544 words) |
| Tracking issue | TBD |
IEEE 802.11ac and 802.11ax beamforming feedback (BFI) is exchanged between client stations (STA) and access points (AP) in unencrypted management-plane frames. The STA compresses the channel response into a Givens-rotation angle matrix (Φ/ψ) and transmits it as a VHT/HE Compressed Beamforming Report (CBFR). Any device in WiFi monitor mode within range can passively sniff these frames without joining the network.
Two independent 2024–2025 research results establish the severity of this exposure:
Capture tooling is freely available: Wi-BFI (pip-installable), PicoScenes, Nexmon BFI patches for BCM43455c0 (Raspberry Pi 5 / 4 / 3B+).
The wifi-densepose / RuView pipeline processes CSI via the rvCSI runtime (ADR-095/096) and emits presence, pose, vitals, and zone-activity events. No layer in the existing pipeline measures whether the data it is processing is capable of identifying individuals. All CSI is treated as equivalent from a privacy standpoint regardless of operating regime.
This gap becomes a compliance and liability issue at deployment scale. An operator placing RuView in a care home, hotel, shared office, or rental property has no instrument to verify that the system is operating anonymously.
BFI is not only a threat vector — its compressed angle matrices carry multipath geometry useful for presence and motion detection, particularly in single-AP deployments where MIMO CSI is unavailable. BFLD treats BFI as an optional input alongside CSI, not a replacement.
cog-ha-matter boundary.Create a new Rust crate wifi-densepose-bfld in v2/crates/ that:
identity_risk_score (separability × temporal_stability × cross_perspective_consistency × sample_confidence).privacy_class byte that structurally prevents identity-correlated data from being published at classes 2 (anonymous) and 3 (restricted).BfldEvent JSON over MQTT under ruview/<node_id>/bfld/* with per-class topic routing.The umbrella implementation is decomposed into five sub-ADRs:
| Sub-ADR | Scope |
|---|---|
| ADR-119 | BfldFrame wire format, magic 0xBF1D_0001, deterministic serialization, CRC32 |
| ADR-120 | privacy_class semantics, BLAKE3 hash rotation, default-deny field classification |
| ADR-121 | Identity risk scoring formula, coherence gate, leakage estimator |
| ADR-122 | RuView surface: HA entities, Matter cluster boundary, MQTT topic ACL |
| ADR-123 | Capture path: Pi 5 / Nexmon adapter + ESP32-S3 BFI feasibility |
v2/crates/wifi-densepose-bfld/
├── Cargo.toml
└── src/
├── lib.rs
├── frame.rs # BfldFrame (ADR-119)
├── extractor.rs # CBFR parser → BfiCapture
├── features.rs # 9 features
├── identity_risk.rs # risk score (ADR-121)
├── privacy_gate.rs # privacy_class enforcement (ADR-120)
├── hash_rotation.rs # BLAKE3 per-site rotation (ADR-120)
├── emitter.rs # BfldEvent → MQTT
├── mqtt.rs # topic routing (ADR-122)
└── ffi.rs # PyO3 bindings (ADR-117 pattern)
| BFLD module | Depends on |
|---|---|
features.rs | wifi-densepose-signal/src/ruvsense/coherence.rs, multistatic.rs |
identity_risk.rs | wifi-densepose-ruvector/src/viewpoint/attention.rs, coherence.rs |
privacy_gate.rs | (new) — no upstream dependency |
hash_rotation.rs | blake3 = "1.5" (keyed mode) |
extractor.rs | vendor/rvcsi/crates/rvcsi-adapter-nexmon (ADR-095/096) |
identity_risk_score doubles as an anomaly signal (sudden spike → new AP firmware / nearby attacker-grade sniffer / unusual propagation).identity_risk_score calibration requires the KIT BFId dataset (non-commercial research agreement).Rejected because: (a) leaves the identity-leakage gap open for the CSI pipeline; (b) as BFI tooling becomes ubiquitous (Wi-BFI, PicoScenes), the absence of a privacy layer becomes more conspicuous for operators.
identity_risk_score publicly by defaultRejected: the risk score itself is privacy-sensitive (reveals presence via timing correlation). Default is opt-in.
Rejected: violates I1. Cloud training creates an off-node store of angle matrices reconstructible into identity profiles.
Deferred to a follow-up ADR. DP sensitivity analysis and its interaction with identity_risk_score calibration are not yet complete. Current design achieves privacy through structural impossibility, not noise injection.
ruview/<node_id>/bfld/motion/state.BfldFrame payload at any privacy_class value.privacy_mode enabled, all identity-derived fields are absent from outbound events.BfiCapture inputs produce bit-identical BfldFrame serialization (deterministic hash).BfldEvent outputs without csi_matrix (BFI-only mode).Per-sub-ADR acceptance criteria are defined in ADR-119 through ADR-123.
| Phase | ADR | Scope | Effort |
|---|---|---|---|
| P1 | 119 | Frame format + extractor stub | 1.5 wk |
| P2 | 121 | Features + identity_risk_score | 2.0 wk |
| P3 | 120 | Privacy gate + hash rotation | 1.5 wk |
| P4 | 122 (a) | MQTT emitter + HA discovery | 1.5 wk |
| P5 | 122 (b) | Matter cluster boundary in cog-ha-matter | 1.5 wk |
| P6 | 123 | Pi 5 / Nexmon capture adapter | 2.5 wk |
| Total | 10.5 wk |
See header table. Cross-references in body cite the structural reuse of:
multistatic.rs, cross_room.rs reused)cog-ha-matter boundary filter)