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:
364
docs/adr/ADR-030-ruvsense-persistent-field-model.md
Normal file
364
docs/adr/ADR-030-ruvsense-persistent-field-model.md
Normal 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.
|
||||
@@ -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)
|
||||
|
||||
@@ -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.**
|
||||
|
||||
Reference in New Issue
Block a user