docs: add RuvSense persistent field model, exotic tiers, and appliance categories

Expands the RuvSense architecture from pose estimation to spatial
intelligence platform with persistent electromagnetic world model.

Research (Part II added):
- 7 exotic capability tiers: field normal modes, RF tomography,
  intention lead signals, longitudinal biomechanics drift,
  cross-room continuity, invisible interaction layer, adversarial detection
- Signals-not-diagnoses framework with 3 monitoring levels
- 5 appliance product categories: Invisible Guardian, Spatial Digital Twin,
  Collective Behavior Engine, RF Interaction Surface, Pre-Incident Drift Monitor
- Regulatory classification (consumer wellness → clinical decision support)
- Extended acceptance tests: 7-day autonomous, 30-day appliance validation

ADR-030 (new):
- Persistent field model architecture with room eigenstructure
- Longitudinal drift detection via Welford statistics + HNSW memory
- All 5 ruvector crates mapped across 7 exotic tiers
- GOAP implementation priority: field modes → drift → tomography → intent
- Invisible Guardian recommended as first hardware SKU vertical

DDD model (extended):
- 3 new bounded contexts: Field Model, Longitudinal Monitoring, Spatial Identity
- Full aggregate roots, value objects, domain events for each context
- Extended context map showing all 6 bounded contexts
- Repository interfaces for field baselines, personal baselines, transitions
- Invariants enforcing signals-not-diagnoses boundary

https://claude.ai/code/session_01QTX772SDsGVSPnaphoNgNY
This commit is contained in:
Claude
2026-03-02 01:59:21 +00:00
parent 25b005a0d6
commit c707b636bd
3 changed files with 1416 additions and 0 deletions

View File

@@ -0,0 +1,364 @@
# ADR-030: RuvSense Persistent Field Model — Longitudinal Drift Detection and Exotic Sensing Tiers
| Field | Value |
|-------|-------|
| **Status** | Proposed |
| **Date** | 2026-03-02 |
| **Deciders** | ruv |
| **Codename** | **RuvSense Field** — Persistent Electromagnetic World Model |
| **Relates to** | ADR-029 (RuvSense Multistatic), ADR-005 (SONA Self-Learning), ADR-024 (AETHER Embeddings), ADR-016 (RuVector Integration), ADR-026 (Survivor Track Lifecycle), ADR-027 (MERIDIAN Generalization) |
---
## 1. Context
### 1.1 Beyond Pose Estimation
ADR-029 establishes RuvSense as a sensing-first multistatic mesh achieving 20 Hz DensePose with <30mm jitter. That treats WiFi as a **momentary pose estimator**. The next leap: treat the electromagnetic field as a **persistent world model** that remembers, predicts, and explains.
The most exotic capabilities come from this shift in abstraction level:
- The room is the model, not the person
- People are structured perturbations to a baseline
- Changes are deltas from a known state, not raw measurements
- Time is a first-class dimension — the system remembers days, not frames
### 1.2 The Seven Capability Tiers
| Tier | Capability | Foundation |
|------|-----------|-----------|
| 1 | **Field Normal Modes** — Room electromagnetic eigenstructure | Baseline calibration + SVD |
| 2 | **Coarse RF Tomography** — 3D occupancy volume from link attenuations | Sparse tomographic inversion |
| 3 | **Intention Lead Signals** — Pre-movement prediction (200-500ms lead) | Temporal embedding trajectory analysis |
| 4 | **Longitudinal Biomechanics Drift** — Personal baseline deviation over days | Welford statistics + HNSW memory |
| 5 | **Cross-Room Continuity** — Identity persistence across spaces without optics | Environment fingerprinting + transition graph |
| 6 | **Invisible Interaction Layer** — Multi-user gesture control through walls/darkness | Per-person CSI perturbation classification |
| 7 | **Adversarial Detection** — Physically impossible signal identification | Multi-link consistency + field model constraints |
### 1.3 Signals, Not Diagnoses
RF sensing detects **biophysical proxies**, not medical conditions:
| Detectable Signal | Not Detectable |
|-------------------|---------------|
| Breathing rate variability | COPD diagnosis |
| Gait asymmetry shift (18% over 14 days) | Parkinson's disease |
| Posture instability increase | Neurological condition |
| Micro-tremor onset | Specific tremor etiology |
| Activity level decline | Depression or pain diagnosis |
The output is: "Your movement symmetry has shifted 18 percent over 14 days." That is actionable without being diagnostic. The evidence chain (stored embeddings, drift statistics, coherence scores) is fully traceable.
### 1.4 Acceptance Tests
**Tier 0 (ADR-029):** Two people, 20 Hz, 10 min stable tracks, zero ID swaps, <30mm torso jitter.
**Tier 1-4 (this ADR):** Seven-day run, no manual tuning. System flags one real environmental change and one real human drift event, produces traceable explanation using stored embeddings plus graph constraints.
**Tier 5-7 (appliance):** Thirty-day local run, no camera. Detects meaningful drift with <5% false alarm rate.
---
## 2. Decision
### 2.1 Implement Field Normal Modes as the Foundation
Add a `field_model` module to `wifi-densepose-signal/src/ruvsense/` that learns the room's electromagnetic baseline during unoccupied periods and decomposes all subsequent observations into environmental drift + body perturbation.
```
wifi-densepose-signal/src/ruvsense/
├── mod.rs // (existing, extend)
├── field_model.rs // NEW: Field normal mode computation + perturbation extraction
├── tomography.rs // NEW: Coarse RF tomography from link attenuations
├── longitudinal.rs // NEW: Personal baseline + drift detection
├── intention.rs // NEW: Pre-movement lead signal detector
├── cross_room.rs // NEW: Cross-room identity continuity
├── gesture.rs // NEW: Gesture classification from CSI perturbations
├── adversarial.rs // NEW: Physically impossible signal detection
└── (existing files...)
```
### 2.2 Core Architecture: The Persistent Field Model
```
Time
┌────────────────────────────────┐
│ Field Normal Modes (Tier 1) │
│ Room baseline + SVD modes │
│ ruvector-solver │
└────────────┬───────────────────┘
│ Body perturbation (environmental drift removed)
┌───────┴───────┐
│ │
▼ ▼
┌──────────┐ ┌──────────────┐
│ Pose │ │ RF Tomography│
│ (ADR-029)│ │ (Tier 2) │
│ 20 Hz │ │ Occupancy vol│
└────┬─────┘ └──────────────┘
┌──────────────────────────────┐
│ AETHER Embedding (ADR-024) │
│ 128-dim contrastive vector │
└────────────┬─────────────────┘
┌───────┼───────┐
│ │ │
▼ ▼ ▼
┌────────┐ ┌─────┐ ┌──────────┐
│Intention│ │Track│ │Cross-Room│
│Lead │ │Re-ID│ │Continuity│
│(Tier 3)│ │ │ │(Tier 5) │
└────────┘ └──┬──┘ └──────────┘
┌──────────────────────────────┐
│ RuVector Longitudinal Memory │
│ HNSW + graph + Welford stats│
│ (Tier 4) │
└──────────────┬───────────────┘
┌───────┴───────┐
│ │
▼ ▼
┌──────────────┐ ┌──────────────┐
│ Drift Reports│ │ Adversarial │
│ (Level 1-3) │ │ Detection │
│ │ │ (Tier 7) │
└──────────────┘ └──────────────┘
```
### 2.3 Field Normal Modes (Tier 1)
**What it is:** The room's electromagnetic eigenstructure — the stable propagation paths, reflection coefficients, and interference patterns when nobody is present.
**How it works:**
1. During quiet periods (empty room, overnight), collect 10 minutes of CSI across all links
2. Compute per-link baseline (mean CSI vector)
3. Compute environmental variation modes via SVD (temperature, humidity, time-of-day effects)
4. Store top-K modes (K=3-5 typically captures >95% of environmental variance)
5. At runtime: subtract baseline, project out environmental modes, keep body perturbation
```rust
pub struct FieldNormalMode {
pub baseline: Vec<Vec<Complex<f32>>>, // [n_links × n_subcarriers]
pub environmental_modes: Vec<Vec<f32>>, // [n_modes × n_subcarriers]
pub mode_energies: Vec<f32>, // eigenvalues
pub calibrated_at: u64,
pub geometry_hash: u64,
}
```
**RuVector integration:**
- `ruvector-solver` → Low-rank SVD for mode extraction
- `ruvector-temporal-tensor` → Compressed baseline history storage
- `ruvector-attn-mincut` → Identify which subcarriers belong to which mode
### 2.4 Longitudinal Drift Detection (Tier 4)
**The defensible pipeline:**
```
RF → AETHER contrastive embedding
→ RuVector longitudinal memory (HNSW + graph)
→ Coherence-gated drift detection (Welford statistics)
→ Risk flag with traceable evidence
```
**Three monitoring levels:**
| Level | Signal Type | Example Output |
|-------|------------|----------------|
| **1: Physiological** | Raw biophysical metrics | "Breathing rate: 18.3 BPM today, 7-day avg: 16.1" |
| **2: Drift** | Personal baseline deviation | "Gait symmetry shifted 18% over 14 days" |
| **3: Risk correlation** | Pattern-matched concern | "Pattern consistent with increased fall risk" |
**Storage model:**
```rust
pub struct PersonalBaseline {
pub person_id: PersonId,
pub gait_symmetry: WelfordStats,
pub stability_index: WelfordStats,
pub breathing_regularity: WelfordStats,
pub micro_tremor: WelfordStats,
pub activity_level: WelfordStats,
pub embedding_centroid: Vec<f32>, // [128]
pub observation_days: u32,
pub updated_at: u64,
}
```
**RuVector integration:**
- `ruvector-temporal-tensor` → Compressed daily summaries (50-75% memory savings)
- HNSW → Embedding similarity search across longitudinal record
- `ruvector-attention` → Per-metric drift significance weighting
- `ruvector-mincut` → Temporal segmentation (detect changepoints in metric series)
### 2.5 Regulatory Classification
| Classification | What You Claim | Regulatory Path |
|---------------|---------------|-----------------|
| **Consumer wellness** (recommended first) | Activity metrics, breathing rate, stability score | Self-certification, FCC Part 15 |
| **Clinical decision support** (future) | Fall risk alert, respiratory pattern concern | FDA Class II 510(k) or De Novo |
| **Regulated medical device** (requires clinical partner) | Diagnostic claims for specific conditions | FDA Class II/III + clinical trials |
**Decision: Start as consumer wellness.** Build 12+ months of real-world longitudinal data. The dataset itself becomes the asset for future regulatory submissions.
---
## 3. Appliance Product Categories
### 3.1 Invisible Guardian
Wall-mounted wellness monitor for elderly care and independent living. No camera, no microphone, no reconstructable data. Stores embeddings and structural deltas only.
| Spec | Value |
|------|-------|
| Nodes | 4 ESP32-S3 pucks per room |
| Processing | Central hub (RPi 5 or x86) |
| Power | PoE or USB-C |
| Output | Risk flags, drift alerts, occupancy timeline |
| BOM | $73-91 (ESP32 mesh) + $35-80 (hub) |
| Validation | 30-day autonomous run, <5% false alarm rate |
### 3.2 Spatial Digital Twin Node
Live electromagnetic room model for smart buildings and workplace analytics.
| Spec | Value |
|------|-------|
| Output | Occupancy heatmap, flow vectors, dwell time, anomaly events |
| Integration | MQTT/REST API for BMS and CAFM |
| Retention | 30-day rolling, GDPR-compliant |
| Vertical | Smart buildings, retail, workspace optimization |
### 3.3 RF Interaction Surface
Multi-user gesture interface. No cameras. Works in darkness, smoke, through clothing.
| Spec | Value |
|------|-------|
| Gestures | Wave, point, beckon, push, circle + custom |
| Users | Up to 4 simultaneous |
| Latency | <100ms gesture recognition |
| Vertical | Smart home, hospitality, accessibility |
### 3.4 Pre-Incident Drift Monitor
Longitudinal biomechanics tracker for rehabilitation and occupational health.
| Spec | Value |
|------|-------|
| Baseline | 7-day calibration per person |
| Alert | Metric drift >2sigma for >3 days |
| Evidence | Stored embedding trajectory + statistical report |
| Vertical | Elderly care, rehab, occupational health |
### 3.5 Vertical Recommendation for First Hardware SKU
**Invisible Guardian** — the elderly care wellness monitor. Rationale:
1. Largest addressable market with immediate revenue (aging population, care facility demand)
2. Lowest regulatory bar (consumer wellness, no diagnostic claims)
3. Privacy advantage over cameras is a selling point, not a limitation
4. 30-day autonomous operation validates all tiers (field model, drift detection, coherence gating)
5. $108-171 BOM allows $299-499 retail with healthy margins
---
## 4. RuVector Integration Map (Extended)
All five crates are exercised across the exotic tiers:
| Tier | Crate | API | Role |
|------|-------|-----|------|
| 1 (Field) | `ruvector-solver` | `NeumannSolver` + SVD | Environmental mode decomposition |
| 1 (Field) | `ruvector-temporal-tensor` | `TemporalTensorCompressor` | Baseline history storage |
| 1 (Field) | `ruvector-attn-mincut` | `attn_mincut` | Mode-subcarrier assignment |
| 2 (Tomo) | `ruvector-solver` | `NeumannSolver` (L1) | Sparse tomographic inversion |
| 3 (Intent) | `ruvector-attention` | `ScaledDotProductAttention` | Temporal trajectory weighting |
| 3 (Intent) | `ruvector-temporal-tensor` | `CompressedCsiBuffer` | 2-second embedding history |
| 4 (Drift) | `ruvector-temporal-tensor` | `TemporalTensorCompressor` | Daily summary compression |
| 4 (Drift) | `ruvector-attention` | `ScaledDotProductAttention` | Metric drift significance |
| 4 (Drift) | `ruvector-mincut` | `DynamicMinCut` | Temporal changepoint detection |
| 5 (Cross-Room) | `ruvector-attention` | HNSW | Room and person fingerprint matching |
| 5 (Cross-Room) | `ruvector-mincut` | `MinCutBuilder` | Transition graph partitioning |
| 6 (Gesture) | `ruvector-attention` | `ScaledDotProductAttention` | Gesture template matching |
| 7 (Adversarial) | `ruvector-solver` | `NeumannSolver` | Physical plausibility verification |
| 7 (Adversarial) | `ruvector-attn-mincut` | `attn_mincut` | Multi-link consistency check |
---
## 5. Implementation Priority
| Priority | Tier | Module | Weeks | Dependency |
|----------|------|--------|-------|------------|
| P0 | 1 | `field_model.rs` | 2 | ADR-029 multistatic mesh operational |
| P0 | 4 | `longitudinal.rs` | 2 | Tier 1 baseline + AETHER embeddings |
| P1 | 2 | `tomography.rs` | 1 | Tier 1 perturbation extraction |
| P1 | 3 | `intention.rs` | 2 | Tier 1 + temporal embedding history |
| P2 | 5 | `cross_room.rs` | 2 | Tier 4 person profiles + multi-room deployment |
| P2 | 6 | `gesture.rs` | 1 | Tier 1 perturbation + per-person separation |
| P3 | 7 | `adversarial.rs` | 1 | Tier 1 field model + multi-link consistency |
**Total exotic tier: ~11 weeks after ADR-029 acceptance test passes.**
---
## 6. Consequences
### 6.1 Positive
- **Room becomes self-sensing**: Field normal modes provide a persistent baseline that explains change as structured deltas
- **7-day autonomous operation**: Coherence gating + SONA adaptation + longitudinal memory eliminate manual tuning
- **Privacy by design**: No images, no audio, no reconstructable data — only embeddings and statistical summaries
- **Traceable evidence**: Every drift alert links to stored embeddings, timestamps, and graph constraints
- **Multiple product categories**: Same software stack, different packaging — Guardian, Twin, Interaction, Drift Monitor
- **Regulatory clarity**: Consumer wellness first, clinical decision support later with accumulated dataset
- **Security primitive**: Coherence gating detects adversarial injection, not just quality issues
### 6.2 Negative
- **7-day calibration** required for personal baselines (system is less useful during initial period)
- **Empty-room calibration** needed for field normal modes (may not always be available)
- **Storage growth**: Longitudinal memory grows ~1 KB/person/day (manageable but non-zero)
- **Statistical power**: Drift detection requires 14+ days of data for meaningful z-scores
- **Multi-room**: Cross-room continuity requires hardware in all rooms (cost scales linearly)
### 6.3 Risks
| Risk | Probability | Impact | Mitigation |
|------|-------------|--------|------------|
| Field modes drift faster than expected | Medium | False perturbation detections | Reduce mode update interval from 24h to 4h |
| Personal baselines too variable | Medium | High false alarm rate for drift | Widen sigma threshold from 2σ to 3σ; require 5+ days |
| Cross-room matching fails for similar body types | Low | Identity confusion | Require temporal proximity (<60s) plus spatial adjacency |
| Gesture recognition insufficient SNR | Medium | <80% accuracy | Restrict to near-field (<2m) initially |
| Adversarial injection via coordinated WiFi injection | Very Low | Spoofed occupancy | Multi-link consistency check makes single-link spoofing detectable |
---
## 7. Related ADRs
| ADR | Relationship |
|-----|-------------|
| ADR-029 | **Prerequisite**: Multistatic mesh is the sensing substrate for all exotic tiers |
| ADR-005 (SONA) | **Extended**: SONA recalibration triggered by coherence gate → now also by drift events |
| ADR-016 (RuVector) | **Extended**: All 5 crates exercised across 7 exotic tiers |
| ADR-024 (AETHER) | **Critical dependency**: Embeddings are the representation for all longitudinal memory |
| ADR-026 (Tracking) | **Extended**: Track lifecycle now spans days (not minutes) for drift detection |
| ADR-027 (MERIDIAN) | **Used**: Room geometry encoding for field normal mode conditioning |
---
## 8. References
1. IEEE 802.11bf-2024. "WLAN Sensing." IEEE Standards Association.
2. FDA. "General Wellness: Policy for Low Risk Devices." Guidance Document, 2019.
3. EU MDR 2017/745. "Medical Device Regulation." Official Journal of the European Union.
4. Welford, B.P. (1962). "Note on a Method for Calculating Corrected Sums of Squares." Technometrics.
5. Chen, L. et al. (2026). "PerceptAlign: Geometry-Aware WiFi Sensing." arXiv:2601.12252.
6. AM-FM (2026). "A Foundation Model for Ambient Intelligence Through WiFi." arXiv:2602.11200.
7. Geng, J. et al. (2023). "DensePose From WiFi." arXiv:2301.00250.

View File

@@ -591,3 +591,437 @@ pub trait MeshRepository {
- Re-ID window: Lost tracks eligible for re-identification for 5 seconds
- Embedding EMA decay: 0.95 (slow adaptation preserves identity across environmental changes)
- Joint assignment cost must use both position (60%) and embedding (40%) terms
---
## Part II: Persistent Field Model Bounded Contexts (ADR-030)
### Ubiquitous Language (Extended)
| Term | Definition |
|------|------------|
| **Field Normal Mode** | The room's electromagnetic eigenstructure — stable propagation baseline when unoccupied |
| **Body Perturbation** | Structured change to field caused by a person, after environmental drift is removed |
| **Environmental Mode** | Principal component of baseline variation due to temperature, humidity, time-of-day |
| **Personal Baseline** | Per-person rolling statistical profile of biophysical proxies over days/weeks |
| **Drift Event** | Statistically significant deviation from personal baseline (>2sigma for >3 days) |
| **Drift Report** | Traceable evidence package: z-score, direction, window, supporting embeddings |
| **Risk Signal** | Actionable observation about biophysical change — not a diagnosis |
| **Intention Lead Signal** | Pre-movement dynamics (lean, weight shift) detected 200-500ms before visible motion |
| **Occupancy Volume** | Low-resolution 3D probabilistic density field from RF tomography |
| **Room Fingerprint** | HNSW-indexed embedding characterizing a room's electromagnetic identity |
| **Transition Event** | Person exiting one room and entering another, matched by embedding similarity |
---
### 4. Field Model Context
**Responsibility:** Learn and maintain the room's electromagnetic baseline. Decompose all CSI observations into environmental drift, body perturbation, and anomalies. Provide the foundation for all downstream exotic capabilities.
```
┌──────────────────────────────────────────────────────────┐
│ Field Model Context │
├──────────────────────────────────────────────────────────┤
│ │
│ ┌───────────────┐ ┌───────────────┐ │
│ │ Calibration │ │ Mode │ │
│ │ Collector │ │ Extractor │ │
│ │ (empty-room │ │ (SVD on │ │
│ │ CSI frames) │ │ baseline) │ │
│ └───────┬───────┘ └───────┬───────┘ │
│ │ │ │
│ └────────┬───────────┘ │
│ ▼ │
│ ┌────────────────┐ │
│ │ Perturbation │ │
│ │ Extractor │ │
│ │ (subtract │ │
│ │ baseline + │──▶ BodyPerturbation │
│ │ project out │ │
│ │ env modes) │ │
│ └────────┬───────┘ │
│ │ │
│ ┌────────▼───────┐ │
│ │ RF Tomographer│ │
│ │ (sparse 3D │──▶ OccupancyVolume │
│ │ inversion) │ │
│ └────────────────┘ │
│ │
└──────────────────────────────────────────────────────────┘
```
**Aggregates:**
- `FieldNormalMode` (Aggregate Root)
**Value Objects:**
- `BodyPerturbation` — Per-link CSI residual after baseline + environmental mode removal
- `EnvironmentalMode` — One principal component of baseline variation
- `OccupancyVolume` — 3D voxel grid of estimated mass density
- `CalibrationStatus` — Fresh / Stale / Expired (based on time since last empty-room)
**Domain Services:**
- `CalibrationService` — Detects empty-room windows, collects calibration data
- `ModeExtractionService` — SVD computation for environmental modes
- `PerturbationService` — Baseline subtraction + mode projection
- `TomographyService` — Sparse L1 inversion for occupancy volume
**RuVector Integration:**
- `ruvector-solver` → SVD for mode extraction; L1 for tomographic inversion
- `ruvector-temporal-tensor` → Baseline history compression
- `ruvector-attn-mincut` → Mode-subcarrier assignment partitioning
---
### 5. Longitudinal Monitoring Context
**Responsibility:** Maintain per-person biophysical baselines over days/weeks. Detect meaningful drift. Produce traceable evidence reports. Enforce the signals-not-diagnoses boundary.
```
┌──────────────────────────────────────────────────────────┐
│ Longitudinal Monitoring Context │
├──────────────────────────────────────────────────────────┤
│ │
│ ┌───────────────┐ ┌───────────────┐ │
│ │ Metric │ │ Baseline │ │
│ │ Extractor │ │ Updater │ │
│ │ (pose → gait,│ │ (Welford │ │
│ │ stability, │ │ online │ │
│ │ breathing) │ │ statistics) │ │
│ └───────┬───────┘ └───────┬───────┘ │
│ │ │ │
│ └────────┬───────────┘ │
│ ▼ │
│ ┌────────────────┐ │
│ │ Drift Detector│ │
│ │ (z-score vs │ │
│ │ personal │ │
│ │ baseline) │ │
│ └────────┬───────┘ │
│ ▼ │
│ ┌────────────────┐ │
│ │ Evidence │ │
│ │ Assembler │──▶ DriftReport │
│ │ (embeddings + │ │
│ │ timestamps + │ │
│ │ graph links) │ │
│ └────────────────┘ │
│ │
└──────────────────────────────────────────────────────────┘
```
**Aggregates:**
- `PersonalBaseline` (Aggregate Root)
**Entities:**
- `DailyMetricSummary` — One day's worth of compressed metric statistics per person
**Value Objects:**
- `DriftReport` — Evidence package with z-score, direction, window, embeddings
- `DriftMetric` — GaitSymmetry / StabilityIndex / BreathingRegularity / MicroTremor / ActivityLevel
- `DriftDirection` — Increasing / Decreasing
- `MonitoringLevel` — Physiological (Level 1) / Drift (Level 2) / RiskCorrelation (Level 3)
- `WelfordStats` — Online mean/variance accumulator (count, mean, M2)
**Domain Services:**
- `MetricExtractionService` — Extract biomechanical proxies from pose tracks
- `BaselineUpdateService` — Update Welford statistics with daily observations
- `DriftDetectionService` — Compute z-scores, identify significant deviations
- `EvidenceAssemblyService` — Package supporting embeddings and graph constraints
**RuVector Integration:**
- `ruvector-temporal-tensor` → Compressed daily summary storage
- `ruvector-attention` → Weight metric significance in drift score
- `ruvector-mincut` → Temporal changepoint detection in metric series
- HNSW → Similarity search across longitudinal embedding record
**Invariants:**
- Baseline requires 7+ observation days before drift detection activates
- Drift alert requires >2sigma deviation sustained for >3 consecutive days
- Evidence chain must include start/end embeddings bracketing the drift window
- System never outputs diagnostic language — only metric values and deviations
- Personal baseline decay: Welford stats use full history (no windowing) for stability
---
### 6. Spatial Identity Context
**Responsibility:** Maintain cross-room identity continuity via environment fingerprinting and transition graphs. Track who is where across spaces without storing images.
```
┌──────────────────────────────────────────────────────────┐
│ Spatial Identity Context │
├──────────────────────────────────────────────────────────┤
│ │
│ ┌───────────────┐ ┌───────────────┐ │
│ │ Room │ │ Transition │ │
│ │ Fingerprint │ │ Detector │ │
│ │ Index (HNSW) │ │ (exit/entry │ │
│ └───────┬───────┘ │ events) │ │
│ │ └───────┬───────┘ │
│ │ │ │
│ └────────┬───────────┘ │
│ ▼ │
│ ┌────────────────┐ │
│ │ Cross-Room │ │
│ │ Matcher │ │
│ │ (exit embed ↔ │──▶ TransitionEvent │
│ │ entry embed) │ │
│ └────────┬───────┘ │
│ │ │
│ ┌────────▼───────┐ │
│ │ Transition │ │
│ │ Graph │ │
│ │ (rooms, │ │
│ │ persons, │ │
│ │ timestamps) │ │
│ └────────────────┘ │
│ │
└──────────────────────────────────────────────────────────┘
```
**Aggregates:**
- `SpatialIdentityGraph` (Aggregate Root)
**Entities:**
- `RoomProfile` — HNSW-indexed electromagnetic fingerprint of a room
- `PersonSpatialRecord` — Which rooms a person has visited, in order
**Value Objects:**
- `TransitionEvent` — Person, from_room, to_room, timestamps, embedding similarity
- `RoomFingerprint` — 128-dim AETHER embedding of the room's CSI profile
- `SpatialContinuity` — Confidence score for cross-room identity chain
**Domain Services:**
- `RoomFingerprintService` — Compute and index room electromagnetic profiles
- `TransitionDetectionService` — Detect exits (track lost near boundary) and entries (new track)
- `CrossRoomMatchingService` — HNSW similarity between exit and entry embeddings
- `TransitionGraphService` — Build and query the room-person-time graph
**RuVector Integration:**
- HNSW → Room and person fingerprint similarity search
- `ruvector-mincut` → Transition graph partitioning for occupancy analysis
**Invariants:**
- Cross-room match requires >0.80 cosine similarity AND <60s temporal gap
- Room fingerprint must be recalculated if mesh topology changes
- Transition graph edges are immutable once created (append-only audit trail)
- No image data stored — only 128-dim embeddings and structural events
---
### Domain Events (Extended)
#### Field Model Events
```rust
pub enum FieldModelEvent {
/// Baseline calibration completed (empty room detected and measured)
BaselineCalibrated {
room_id: RoomId,
n_modes: usize,
variance_explained: f32, // fraction of total variance captured
timestamp_us: u64,
},
/// Environmental drift detected (baseline shift without body cause)
EnvironmentalDriftDetected {
room_id: RoomId,
magnitude: f32,
drift_type: DriftProfile,
timestamp_us: u64,
},
/// Anomalous perturbation detected (does not match body or environment)
AnomalousPerturbation {
room_id: RoomId,
anomaly_score: f32,
affected_links: Vec<usize>,
timestamp_us: u64,
},
/// Occupancy volume updated
OccupancyUpdated {
room_id: RoomId,
occupied_voxels: usize,
total_voxels: usize,
timestamp_us: u64,
},
}
```
#### Longitudinal Monitoring Events
```rust
pub enum LongitudinalEvent {
/// Personal baseline established (7-day calibration complete)
BaselineEstablished {
person_id: PersonId,
observation_days: u32,
metrics_tracked: Vec<DriftMetric>,
timestamp_us: u64,
},
/// Drift detected — biophysical metric significantly changed
DriftDetected {
person_id: PersonId,
report: DriftReport,
timestamp_us: u64,
},
/// Drift resolved — metric returned to baseline range
DriftResolved {
person_id: PersonId,
metric: DriftMetric,
resolution_days: u32,
timestamp_us: u64,
},
/// Daily summary computed for a person
DailySummaryComputed {
person_id: PersonId,
date: u64, // day timestamp
metrics: Vec<(DriftMetric, f32)>, // metric, today's value
timestamp_us: u64,
},
}
```
#### Spatial Identity Events
```rust
pub enum SpatialEvent {
/// New room fingerprinted
RoomFingerprinted {
room_id: RoomId,
fingerprint_dims: usize,
timestamp_us: u64,
},
/// Person transitioned between rooms
PersonTransitioned {
person_id: PersonId,
from_room: RoomId,
to_room: RoomId,
similarity: f32,
gap_duration_ms: u64,
timestamp_us: u64,
},
/// Cross-room match failed (new person in destination room)
CrossRoomMatchFailed {
entry_room: RoomId,
entry_embedding: Vec<f32>,
candidates_checked: usize,
best_similarity: f32,
timestamp_us: u64,
},
}
```
---
### Extended Context Map
```
┌──────────────────────────────────────────────────────────────────────┐
│ RuvSense Full System (ADR-029 + ADR-030) │
├──────────────────────────────────────────────────────────────────────┤
│ │
│ ┌───────────────┐ FusedFrame ┌──────────────┐ │
│ │ Multistatic │────────────▶│ Pose Tracking │ │
│ │ Sensing │ │ Context │ │
│ └───────┬───────┘ └───────┬───────┘ │
│ │ │ │
│ │ │ TrackedPose │
│ │ │ │
│ ▼ ┌───────▼───────┐ │
│ ┌───────────────┐ │ Longitudinal │ │
│ │ Coherence │ │ Monitoring │ │
│ │ Context │ │ Context │ │
│ └───────┬───────┘ └───────┬───────┘ │
│ │ Gates │ DriftReport │
│ │ │ │
│ ▼ ▼ │
│ ┌───────────────┐ ┌───────────────┐ │
│ │ Field Model │ │ Spatial │ │
│ │ Context │ │ Identity │ │
│ │ (baseline, │ │ Context │ │
│ │ modes, │ │ (cross-room, │ │
│ │ tomography) │ │ transitions)│ │
│ └───────────────┘ └───────────────┘ │
│ │
│ ──────────────── Event Bus ────────────────── │
│ SensingEvent | CoherenceEvent | TrackingEvent | │
│ FieldModelEvent | LongitudinalEvent | SpatialEvent │
│ │
├──────────────────────────────────────────────────────────────────────┤
│ UPSTREAM: wifi-densepose-{hardware, nn, signal} │
│ SIBLINGS: AETHER (embeddings) | MERIDIAN (geometry) | MAT (triage) │
└──────────────────────────────────────────────────────────────────────┘
```
**New Relationship Types:**
- Multistatic Sensing → Field Model: **Partnership** (sensing provides raw CSI; field model provides perturbation extraction)
- Pose Tracking → Longitudinal Monitoring: **Customer/Supplier** (tracking provides daily pose metrics; monitoring builds baselines)
- Pose Tracking → Spatial Identity: **Customer/Supplier** (tracking provides track exit/entry events; spatial maintains transition graph)
- Coherence → Field Model: **Subscriber** (coherence events inform baseline recalibration)
- Longitudinal Monitoring → Spatial Identity: **Partnership** (person profiles shared for cross-room matching)
---
### Extended Repository Interfaces
```rust
/// Persists field normal modes and calibration history
pub trait FieldModelRepository {
fn save_baseline(&self, room_id: RoomId, mode: &FieldNormalMode);
fn load_baseline(&self, room_id: RoomId) -> Option<FieldNormalMode>;
fn list_rooms(&self) -> Vec<RoomId>;
fn save_occupancy_snapshot(&self, room_id: RoomId, volume: &OccupancyVolume, timestamp_us: u64);
}
/// Persists personal baselines and drift history
pub trait LongitudinalRepository {
fn save_baseline(&self, baseline: &PersonalBaseline);
fn load_baseline(&self, person_id: &PersonId) -> Option<PersonalBaseline>;
fn save_daily_summary(&self, person_id: &PersonId, summary: &DailyMetricSummary);
fn load_summaries(&self, person_id: &PersonId, days: u32) -> Vec<DailyMetricSummary>;
fn save_drift_report(&self, report: &DriftReport);
fn load_drift_history(&self, person_id: &PersonId) -> Vec<DriftReport>;
}
/// Persists room fingerprints and transition graphs
pub trait SpatialIdentityRepository {
fn save_room_fingerprint(&self, room_id: RoomId, fingerprint: &RoomFingerprint);
fn load_room_fingerprint(&self, room_id: RoomId) -> Option<RoomFingerprint>;
fn save_transition(&self, transition: &TransitionEvent);
fn load_transitions(&self, person_id: &PersonId, window_ms: u64) -> Vec<TransitionEvent>;
fn load_room_occupancy(&self, room_id: RoomId) -> Vec<PersonId>;
}
```
---
### Extended Invariants
#### Field Model
- Baseline calibration requires ≥10 minutes of empty-room CSI (≥12,000 frames at 20 Hz)
- Environmental modes capped at K=5 (more modes overfit to noise)
- Tomographic inversion only valid with ≥8 links (4 nodes minimum)
- Baseline expires after 24 hours if not refreshed during quiet period
- Perturbation energy must be non-negative (enforced by magnitude computation)
#### Longitudinal Monitoring
- Personal baseline requires ≥7 observation days before drift detection activates
- Drift alert requires >2sigma deviation sustained for ≥3 consecutive days
- Evidence chain must include embedding pairs bracketing the drift window
- Output must never use diagnostic language — only metric values and statistical deviations
- Daily summaries stored for ≥90 days (rolling retention policy)
- Welford statistics use full history (no windowing) for maximum stability
#### Spatial Identity
- Cross-room match requires >0.80 cosine similarity AND <60s temporal gap
- Room fingerprint recalculated when mesh topology changes (node added/removed/moved)
- Transition graph is append-only (immutable audit trail)
- No image data stored — only 128-dim embeddings and structural events
- Maximum 100 rooms indexed per deployment (HNSW scaling constraint)

View File

@@ -875,3 +875,621 @@ RuvSense achieves high-fidelity WiFi DensePose by exploiting three physical leve
The architecture is incrementally deployable: start with 2 nodes for basic improvement, scale to 4+ for full multistatic sensing. The same software stack runs on ESP32 mesh or Cognitum hardware, with only the CSI input interface changing.
**The winning move is not inventing new WiFi. It is making existing WiFi see better.**
---
## Part II: The Persistent Field Model
*The most exotic capabilities come from treating RF as a persistent world model, not a momentary pose estimate.*
---
## 16. Beyond Pose: RF as Spatial Intelligence
Sections 1-15 treat WiFi as a pose estimator. That is the floor. The ceiling is treating the electromagnetic field as a **persistent, self-updating model of the physical world** — a model that remembers, predicts, and explains.
The shift: instead of asking "where are the keypoints right now?", ask "how has this room changed since yesterday, and what does that change mean?"
This requires three architectural upgrades:
1. **Field normal modes**: Model the room itself, not just the people in it
2. **Longitudinal memory**: Store structured embeddings over days/weeks via RuVector
3. **Coherence as reasoning**: Use coherence gating not just for quality control, but as a semantic signal — when coherence breaks, something meaningful happened
---
## 17. The Seven Exotic Capability Tiers
### Tier 1: Field Normal Modes
The room becomes the thing you model. You learn the stable electromagnetic baseline — the set of propagation paths, reflection coefficients, and interference patterns that exist when nobody is present. This is the **field normal mode**: the eigenstructure of the empty room's channel transfer function.
People and objects become **structured perturbations** to this baseline. A person entering the room does not create a new signal — they perturb existing modes. The perturbation has structure: it is spatially localized (the person is somewhere), spectrally colored (different body parts affect different subcarriers), and temporally smooth (people move continuously).
```rust
/// Field Normal Mode — the room's electromagnetic eigenstructure
pub struct FieldNormalMode {
/// Baseline CSI per link (measured during empty-room calibration)
pub baseline: Vec<Vec<Complex<f32>>>, // [n_links × n_subcarriers]
/// Principal components of baseline variation (temperature, humidity)
pub environmental_modes: Vec<Vec<f32>>, // [n_modes × n_subcarriers]
/// Eigenvalues: how much variance each mode explains
pub mode_energies: Vec<f32>,
/// Timestamp of last baseline update
pub calibrated_at: u64,
/// Room geometry hash (invalidate if nodes move)
pub geometry_hash: u64,
}
impl FieldNormalMode {
/// Compute perturbation: subtract baseline, project out environmental modes.
/// What remains is body-caused change.
pub fn extract_perturbation(
&self,
current_csi: &[Vec<Complex<f32>>],
) -> Vec<Vec<f32>> {
current_csi.iter().zip(self.baseline.iter()).map(|(curr, base)| {
let delta: Vec<f32> = curr.iter().zip(base.iter())
.map(|(c, b)| (c - b).norm())
.collect();
// Project out environmental modes (slow drift)
let mut residual = delta.clone();
for mode in &self.environmental_modes {
let projection: f32 = residual.iter().zip(mode.iter())
.map(|(r, m)| r * m).sum();
for (r, m) in residual.iter_mut().zip(mode.iter()) {
*r -= projection * m;
}
}
residual // Pure body perturbation
}).collect()
}
}
```
**Why this matters:** The field normal mode enables a building that **senses itself**. Changes are explained as deltas from baseline. A new chair is a permanent mode shift. A person walking is a transient perturbation. A door opening changes specific path coefficients. The system does not need to be told what changed — it can decompose the change into structural categories.
**RuVector integration:** `ruvector-solver` fits the environmental mode matrix via low-rank SVD. `ruvector-temporal-tensor` stores the baseline history with adaptive quantization.
### Tier 2: Coarse RF Tomography
With multiple viewpoints, you can infer a low-resolution 3D occupancy volume, not just skeleton keypoints.
```
Node A
╲ Link A→B passes through voxel (2,3)
╲ Link A→C passes through voxels (2,3), (3,4)
┌─────┐ ╲ Link B→D passes through voxel (3,3)
│ occ │ ╲
Node B │upa- │ Node C From 12 link attenuations,
╲ │ ncy │ solve for voxel occupancy
╲ └─────┘ using ruvector-solver (L1)
Node D
```
This is not a camera. It is a **probabilistic density field** that tells you where mass is, not what it looks like. It stays useful in darkness, smoke, occlusion, and clutter.
```rust
/// Coarse RF tomography — 3D occupancy from link attenuations
pub struct RfTomographer {
/// 3D voxel grid dimensions
pub grid_dims: [usize; 3], // e.g., [8, 10, 4] for 4m × 5m × 2m at 0.5m resolution
/// Voxel size in metres
pub voxel_size: f32, // 0.5m
/// Projection matrix: which voxels does each link pass through
/// Shape: [n_links × n_voxels], sparse
pub projection: Vec<Vec<(usize, f32)>>, // (voxel_idx, path_weight)
/// Regularization strength (sparsity prior)
pub lambda: f32, // default: 0.01
}
impl RfTomographer {
/// Reconstruct occupancy volume from link perturbation magnitudes.
/// Uses ruvector-solver for L1-regularized least squares.
pub fn reconstruct(
&self,
link_perturbations: &[f32], // [n_links], magnitude of body perturbation
) -> Vec<f32> {
// Sparse tomographic inversion: find occupancy x such that
// ||Ax - b||₂ + λ||x||₁ → min
// where A is projection matrix, b is link perturbations
let n_voxels = self.grid_dims.iter().product();
let solver = NeumannSolver::new(n_voxels, self.lambda);
solver.solve_sparse(&self.projection, link_perturbations)
}
}
```
**Resolution:** With 4 nodes (12 links) and 0.5m voxels, the tomographic grid is 8×10×4 = 320 voxels. 12 measurements for 320 unknowns is severely underdetermined, but L1 regularization exploits sparsity — typically only 5-15 voxels are occupied by a person. At 8+ nodes (56 links), resolution improves to ~0.25m.
### Tier 3: Intention Lead Signals
Subtle pre-movement dynamics appear **before visible motion**. Lean, weight shift, arm tension, center-of-mass displacement. These are not noise — they are the body's preparatory phase for action.
With contrastive embeddings plus temporal memory, you can **predict action onset** early enough to drive safety and robotics applications.
```rust
/// Intention lead signal detector.
/// Monitors the embedding trajectory for pre-movement patterns.
pub struct IntentionDetector {
/// Temporal window of AETHER embeddings (last 2 seconds at 20 Hz = 40 frames)
pub embedding_history: VecDeque<Vec<f32>>, // [40 × 128]
/// Trained classifiers for pre-movement signatures
pub lean_classifier: MicroClassifier,
pub weight_shift_classifier: MicroClassifier,
pub reach_intent_classifier: MicroClassifier,
/// Lead time budget: how far ahead we predict (ms)
pub max_lead_ms: u32, // default: 500ms
}
impl IntentionDetector {
/// Detect pre-movement intention from embedding trajectory.
/// Returns predicted action and time-to-onset.
pub fn detect(&self) -> Option<IntentionSignal> {
let trajectory = self.compute_trajectory_features();
// Pre-movement signatures:
// 1. Embedding velocity increases before visible motion
// 2. Embedding curvature changes (trajectory bends toward action cluster)
// 3. Subcarrier variance pattern matches stored pre-action templates
let lean = self.lean_classifier.score(&trajectory);
let shift = self.weight_shift_classifier.score(&trajectory);
let reach = self.reach_intent_classifier.score(&trajectory);
let best = [
(lean, IntentionType::Lean),
(shift, IntentionType::WeightShift),
(reach, IntentionType::Reach),
].iter().max_by(|a, b| a.0.partial_cmp(&b.0).unwrap())?;
if best.0 > 0.7 {
Some(IntentionSignal {
intent_type: best.1,
confidence: best.0,
estimated_lead_ms: self.estimate_lead_time(&trajectory),
})
} else {
None
}
}
}
```
**How much lead time is realistic?** Research on anticipatory postural adjustments shows 200-500ms of preparatory muscle activation before voluntary movement. At 20 Hz with 2-second embedding history, we observe 4-10 frames of pre-movement dynamics. Contrastive pre-training teaches the encoder to separate pre-movement from noise.
### Tier 4: Longitudinal Biomechanics Drift
Not diagnosis. **Drift.** You build a personal baseline for gait symmetry, stability, breathing regularity, and micro-tremor, then detect meaningful deviation over days.
RuVector is the memory and the audit trail.
```rust
/// Personal biomechanics baseline — stores longitudinal embedding statistics
pub struct PersonalBaseline {
pub person_id: PersonId,
/// Per-metric rolling statistics (Welford online algorithm)
pub gait_symmetry: WelfordStats, // left-right step ratio
pub stability_index: WelfordStats, // center-of-mass sway area
pub breathing_regularity: WelfordStats, // coefficient of variation of breath interval
pub micro_tremor: WelfordStats, // high-frequency (4-12 Hz) limb oscillation power
pub activity_level: WelfordStats, // average movement energy per hour
/// Embedding centroid (EMA, 128-dim)
pub embedding_centroid: Vec<f32>,
/// Days of data accumulated
pub observation_days: u32,
/// Last update timestamp
pub updated_at: u64,
}
/// Drift detection result
pub struct DriftReport {
pub person_id: PersonId,
pub metric: DriftMetric,
/// How many standard deviations from personal baseline
pub z_score: f32,
/// Direction of change
pub direction: DriftDirection, // Increasing / Decreasing
/// Duration over which drift occurred
pub window_days: u32,
/// Confidence that this is a real change (not noise)
pub confidence: f32,
/// Supporting evidence: stored embeddings bracketing the change
pub evidence_embeddings: Vec<(u64, Vec<f32>)>,
}
pub enum DriftMetric {
GaitSymmetry,
StabilityIndex,
BreathingRegularity,
MicroTremor,
ActivityLevel,
}
```
**What can be detected (signals, not diagnoses):**
| Signal | Physiological Proxy | Detectable Via |
|--------|---------------------|---------------|
| Gait symmetry shift | Asymmetric loading, injury compensation | Left-right step timing ratio from pose tracks |
| Stability decrease | Balance degradation | CoM sway area increase (static standing) |
| Breathing irregularity | Respiratory pattern change | Coefficient of variation in breath interval |
| Micro-tremor onset | Involuntary oscillation | 4-12 Hz power in limb keypoint FFT |
| Activity decline | Reduced mobility | Hourly movement energy integral |
**The output:** "Your movement symmetry has shifted 18 percent over 14 days." That is actionable without being diagnostic.
**RuVector integration:** `ruvector-temporal-tensor` stores compressed daily summaries. HNSW indexes embeddings for fast similarity search across the longitudinal record. `ruvector-attention` weights which metrics contribute to the overall drift score.
### Tier 5: Cross-Room Continuity Without Optics
Environment fingerprints plus track graphs let you carry identity continuity across spaces. You can know who moved where without storing images.
```rust
/// Cross-room identity continuity via environment fingerprinting
pub struct CrossRoomTracker {
/// Per-room AETHER environment fingerprints (HNSW indexed)
pub room_index: HnswIndex,
/// Per-person embedding profiles (HNSW indexed)
pub person_index: HnswIndex,
/// Transition graph: room_a → room_b with timestamps
pub transitions: Vec<RoomTransition>,
/// Active tracks per room
pub active_tracks: HashMap<RoomId, Vec<TrackId>>,
}
pub struct RoomTransition {
pub person_id: PersonId,
pub from_room: RoomId,
pub to_room: RoomId,
pub exit_time: u64,
pub entry_time: u64,
/// Embedding at exit (for matching at entry)
pub exit_embedding: Vec<f32>,
}
impl CrossRoomTracker {
/// When a person appears in a new room, match against recent exits.
pub fn match_entry(
&self,
room_id: RoomId,
entry_embedding: &[f32],
entry_time: u64,
) -> Option<PersonId> {
// Search recent exits (within 60 seconds) from adjacent rooms
let candidates: Vec<_> = self.transitions.iter()
.filter(|t| entry_time - t.exit_time < 60_000_000) // 60s window
.collect();
// HNSW similarity match
let best = candidates.iter()
.map(|t| {
let sim = cosine_similarity(&t.exit_embedding, entry_embedding);
(t, sim)
})
.max_by(|a, b| a.1.partial_cmp(&b.1).unwrap());
match best {
Some((transition, sim)) if sim > 0.80 => Some(transition.person_id),
_ => None,
}
}
}
```
**Privacy advantage:** No images are stored. The system stores 128-dimensional embeddings (not reconstructable to appearance) and structural transition events. Identity is established by **behavioral consistency**, not visual recognition.
### Tier 6: Invisible Interaction Layer
A room becomes an interface. Multi-user gesture control that works through clothing, in darkness, with line-of-sight blocked.
The key insight: the same multistatic CSI pipeline that estimates pose can detect **gestural micro-patterns** when the pose is held relatively still. A hand wave, a pointing gesture, a beckoning motion — all produce characteristic CSI perturbation signatures that are person-localized (thanks to the multi-person separator) and geometry-invariant (thanks to MERIDIAN conditioning).
```rust
/// Gesture recognition from multistatic CSI
pub struct GestureRecognizer {
/// Per-gesture template embeddings (trained contrastively)
pub gesture_templates: HashMap<GestureType, Vec<f32>>, // [128-dim each]
/// Temporal window for gesture detection
pub window_frames: usize, // 20 frames = 1 second at 20 Hz
/// Minimum confidence for gesture trigger
pub trigger_threshold: f32, // default: 0.8
}
pub enum GestureType {
Wave,
Point,
Beckon,
PushAway,
CircularMotion,
StandUp,
SitDown,
Custom(String),
}
```
**Multi-user:** Because person separation (§5.4) already isolates each person's CSI contribution, gesture detection runs independently per person. Two people can gesture simultaneously without interference.
### Tier 7: Adversarial and Spoofing Detection
You can detect when the signal looks **physically impossible** given the room model. Coherence gating becomes a **security primitive**, not just a quality check.
```rust
/// Adversarial signal detector — identifies physically impossible CSI
pub struct AdversarialDetector {
/// Room field normal modes (baseline)
pub field_model: FieldNormalMode,
/// Physical constraints: maximum possible CSI change per frame
pub max_delta_per_frame: f32, // based on max human velocity
/// Subcarrier correlation structure (from room geometry)
pub expected_correlation: Vec<Vec<f32>>, // [n_sub × n_sub]
}
impl AdversarialDetector {
/// Check if a CSI frame is physically plausible.
pub fn check(&self, frame: &[Complex<f32>], prev_frame: &[Complex<f32>]) -> SecurityVerdict {
// 1. Rate-of-change check: no human can cause faster CSI change
let delta = frame_delta_magnitude(frame, prev_frame);
if delta > self.max_delta_per_frame {
return SecurityVerdict::RateViolation(delta);
}
// 2. Correlation structure check: body perturbations have specific
// cross-subcarrier correlation patterns (from Fresnel zone geometry).
// Injected signals typically lack this structure.
let observed_corr = compute_correlation(frame);
let structure_score = correlation_similarity(&observed_corr, &self.expected_correlation);
if structure_score < 0.5 {
return SecurityVerdict::StructureViolation(structure_score);
}
// 3. Multi-link consistency: a real body affects multiple links
// consistently with its position. A spoofed signal on one link
// will be inconsistent with other links.
// (Handled at the aggregator level, not per-frame)
SecurityVerdict::Plausible
}
}
pub enum SecurityVerdict {
Plausible,
RateViolation(f32),
StructureViolation(f32),
MultiLinkInconsistency(Vec<usize>), // which links disagree
}
```
**Why multistatic helps security:** To spoof a single-link system, an attacker injects a signal into one receiver. To spoof a multistatic mesh, the attacker must simultaneously inject consistent signals into all receivers — signals that are geometrically consistent with a fake body position. This is physically difficult because each receiver sees a different projection.
---
## 18. Signals, Not Diagnoses
### 18.1 The Regulatory Boundary
RF sensing can capture **biophysical proxies**:
- Breathing rate variability
- Gait asymmetry
- Posture instability
- Micro-tremor
- Activity level drift
- Sleep movement patterns
**Diagnosis** requires:
1. Clinical gold standard validation
2. Controlled datasets with IRB approval
3. Regulatory approval (FDA Class II or III)
4. Extremely low false positive and false negative rates
Without that, you are in **"risk signal detection"**, not medical diagnosis.
### 18.2 The Three Levels
| Level | What It Is | What It Says | Regulatory Load |
|-------|-----------|-------------|-----------------|
| **Level 1: Physiological Monitoring** | Respiratory rate trends, movement stability index, fall likelihood score | "Your breathing rate averaged 18.3 BPM today" | Consumer wellness (low) |
| **Level 2: Drift Detection** | Change from personal baseline, early anomaly detection | "Your gait symmetry shifted 18% over 14 days" | Consumer wellness (low) |
| **Level 3: Condition Risk Correlation** | Pattern consistent with respiratory distress, motor instability | "Pattern consistent with increased fall risk" | Clinical decision support (medium-high) |
**What you never say:**
- "You have Parkinson's."
- "You have heart failure."
- "You have Alzheimer's."
### 18.3 The Defensible Pipeline
```
RF (CSI)
→ AETHER contrastive embedding
→ RuVector longitudinal memory
→ Coherence-gated drift detection
→ Risk flag with traceable evidence
```
That gives you: *"Your movement symmetry has shifted 18 percent over 14 days."*
That is actionable without being diagnostic. The evidence chain (stored embeddings, drift statistics, coherence scores) is fully traceable and auditable via RuVector's graph memory.
### 18.4 Path to Regulated Claims
If you ever want to make diagnostic claims:
| Requirement | Status | Effort |
|-------------|--------|--------|
| IRB-approved clinical studies | Not started | 6-12 months |
| Clinically labeled datasets | Not started | Requires clinical partner |
| Statistical power analysis | Feasible once data exists | 1-2 months |
| FDA 510(k) or De Novo pathway | Not started | 12-24 months + legal |
| CE marking (EU MDR) | Not started | 12-18 months |
The opportunity is massive, but the regulatory surface explodes the moment you use the word "diagnosis."
### 18.5 The Decision: Device Classification
| Class | Example | Regulatory Path | Time to Market |
|-------|---------|----------------|----------------|
| **Consumer wellness** | Breathing rate tracker, activity monitor | Self-certification, FCC Part 15 only | 3-6 months |
| **Clinical decision support** | Fall risk alert, respiratory distress pattern | FDA Class II 510(k) or De Novo | 12-24 months |
| **Regulated medical device** | Diagnostic tool for specific conditions | FDA Class II/III, clinical trials | 24-48 months |
**Recommendation:** Start as consumer wellness device with Level 1-2 signals. Build longitudinal dataset. Pursue FDA pathway only after 12+ months of real-world data proves statistical power.
---
## 19. Appliance Product Categories
Treating RF spatial intelligence as a persistent field model enables appliances that were not possible before because they required cameras, wearables, or invasive sensors.
### 19.1 Invisible Guardian
**Wall-mounted unit that models gait, fall dynamics, and breathing baselines without optics.**
| Attribute | Specification |
|-----------|--------------|
| Form factor | Wall puck, 80mm diameter |
| Nodes | 4 ESP32-S3 pucks per room |
| Processing | Central hub (RPi 5 or x86) |
| Power | PoE or USB-C |
| Storage | Embeddings + deltas only, no images |
| Privacy | No camera, no microphone, no reconstructable data |
| Output | Risk flags, drift alerts, occupancy timeline |
| Vertical | Elderly care, independent living, home health |
**Acceptance test:** Runs locally for 30 days, no camera, detects meaningful environmental or behavioral drift with less than 5% false alarms.
### 19.2 Spatial Digital Twin Node
**Small appliance that builds a live electromagnetic twin of a room.**
Tracks occupancy flow, environmental changes, and structural anomalies. Facilities teams get a time-indexed behavioral map of space usage without video storage risk.
| Attribute | Specification |
|-----------|--------------|
| Output | Occupancy heatmap, flow vectors, dwell time, anomaly events |
| Data retention | 30-day rolling summary, GDPR-compliant |
| Integration | MQTT/REST API for BMS and CAFM systems |
| Vertical | Smart buildings, workplace analytics, retail |
### 19.3 Collective Behavior Engine
**Real-time crowd density, clustering, agitation patterns, and flow bottlenecks.**
| Attribute | Specification |
|-----------|--------------|
| Scale | 10-100 people per zone |
| Metrics | Density, flow velocity, dwell clusters, evacuation rate |
| Latency | <1s for crowd-level metrics |
| Vertical | Fire safety, event management, transit, retail |
### 19.4 RF Interaction Surface
**Turn any room into a gesture interface. No cameras. Multi-user. Works in darkness or smoke.**
Lighting, media, robotics respond to posture and intent.
| Attribute | Specification |
|-----------|--------------|
| Gestures | Wave, point, beckon, push, circle + custom |
| Multi-user | Up to 4 simultaneous users |
| Latency | <100ms gesture recognition |
| Vertical | Smart home, hospitality, accessibility, gaming |
### 19.5 Pre-Incident Drift Monitor
**Detect subtle changes in movement patterns that precede falls or medical instability.**
Not diagnosis. Early warning via longitudinal embedding drift.
| Attribute | Specification |
|-----------|--------------|
| Metrics | Gait symmetry, stability index, breathing regularity, micro-tremor |
| Baseline | 7-day calibration period per person |
| Alert | When any metric drifts >2σ from personal baseline for >3 days |
| Evidence | Stored embedding trajectory + statistical report |
| Vertical | Elderly care, rehabilitation, occupational health |
### 19.6 Cognitum Nervous System Appliance
For the premium lane: always-on, local, coherence-gated, storing structured memory in RuVector.
This appliance was never possible before because we did not have:
- Small edge embedding models (AETHER on ESP32-S3 or Cognitum)
- Persistent vector graph memory (RuVector with HNSW)
- Cheap multistatic RF (ESP32 mesh at $73-91)
---
## 20. Extended Acceptance Tests
### 20.1 Pose Fidelity (Tier 0 — ADR-029)
Two people in a room, 20 Hz, stable tracks for 10 minutes with no identity swaps and low jitter in the torso keypoints.
### 20.2 Longitudinal Stability (Tier 1-4)
**Seven-day run, no manual tuning.** The system:
1. Flags one real environmental change (furniture moved, door state changed)
2. Flags one real human drift event (gait asymmetry shift, breathing pattern change)
3. Produces a traceable explanation using stored embeddings plus graph constraints
4. Zero false alarms on days with no real change
### 20.3 Appliance Validation (Tier 5-7)
**Thirty-day local run, no camera.** The system:
1. Detects meaningful environmental or behavioral drift
2. Less than 5% false alarm rate
3. Provides traceable evidence chain for every alert
4. Operates autonomously — no manual calibration after initial setup
---
## 21. Decision Questions (Exotic Tier)
### Q3: Which exotic tier first?
**Recommendation: Field normal modes (Tier 1).**
Rationale:
- It is the foundation for everything else. Without a room baseline, you cannot detect drift (Tier 4), cross-room transitions (Tier 5), or adversarial signals (Tier 7).
- It requires no new hardware — just a calibration phase during empty-room periods.
- It immediately improves pose quality by separating environmental from body-caused CSI variation.
- It uses `ruvector-solver` (SVD) and `ruvector-temporal-tensor` (baseline storage), both already integrated.
Second priority: **Longitudinal biomechanics drift (Tier 4)**, because it unlocks the Invisible Guardian and Pre-Incident Drift Monitor appliance categories.
Third priority: **Cross-room continuity (Tier 5)**, because it unlocks the Spatial Digital Twin Node.
### Q4: Commodity ESP32 mesh only, or premium Cognitum lane too?
**Recommendation: ESP32 mesh as the primary development and validation platform. Design the software abstraction layer so Cognitum can slot in as a premium SKU without code changes.**
The ESP32 mesh ($73-91) proves the algorithms. The Cognitum lane ($500-1000) proves the fidelity ceiling. Both share the same RuvSense aggregator, AETHER embeddings, and RuVector memory. The only difference is the CSI input quality.
### Q5: Consumer wellness, clinical decision support, or regulated medical device?
**Recommendation: Consumer wellness device first.** Build the longitudinal dataset. Pursue clinical decision support after 12 months of real-world data proves statistical power. Do not attempt regulated medical device claims without a clinical partner and IRB approval.
---
## 22. Conclusion (Extended)
RuvSense is not a pose estimator. It is a **spatial intelligence platform** built on the insight that WiFi RF is a persistent, self-updating model of the physical world.
The architecture decomposes into three layers:
| Layer | Capability | Timeframe |
|-------|-----------|-----------|
| **Pose** (§1-15) | Multistatic DensePose at 20 Hz, <30mm jitter, zero ID swaps | 10 weeks |
| **Field** (§16-17) | Room modeling, drift detection, intention signals, tomography | +8 weeks |
| **Appliance** (§19) | Product categories: Guardian, Digital Twin, Interaction Surface | +12 weeks |
Each layer builds on the one below. The complete stack — from ESP32 NDP injection to 30-day autonomous drift monitoring — uses no cameras, stores no images, and runs on $73-91 of commodity hardware.
RuVector provides the algorithmic spine: solving, attention, graph partitioning, temporal compression, and coherence gating. AETHER provides the embedding space. MERIDIAN provides domain generalization. The result is a system that remembers rooms, recognizes people, detects drift, and explains change — all through WiFi.
**You can detect signals, not diagnoses. That distinction matters legally, ethically, and technically. But the signals are rich enough to build products that were never possible before.**