Commit Graph

273 Commits

Author SHA1 Message Date
Claude 1a3c6b4d11
Add attention mechanisms for RF sensing research
GOAP Agent 3 output: 1,110-line document covering GAT for RF graphs,
self-attention for CSI sequences, cross-attention multi-link fusion,
attention-weighted differentiable mincut, spatial node attention,
antenna-level subcarrier attention, and efficient attention variants
(linear, sparse, LSH, S4/Mamba). 8 ASCII architecture diagrams.

Part of RF Topological Sensing research swarm (10 agents).

https://claude.ai/code/session_01DGUAowNScGVp88bK2eiuRv
2026-03-08 20:05:55 +00:00
Claude 5e83d70d06
Add transformer architectures for graph sensing research
GOAP Agent 4 output: 896-line SOTA document covering Graph Transformers
(Graphormer, SAN, GPS, TokenGT), Temporal Graph Transformers (TGN, TGAT,
DyRep), ViT for RF spectrograms, transformer-based mincut prediction,
positional encoding for RF graphs, foundation models for RF sensing, and
efficient edge deployment with INT8 quantization.

Part of RF Topological Sensing research swarm (10 agents).

https://claude.ai/code/session_01DGUAowNScGVp88bK2eiuRv
2026-03-08 20:05:02 +00:00
Claude e4f82329a9
Add temporal graph evolution & RuVector integration research
GOAP Agent 8 output: 1,528-line SOTA research document covering temporal
graph models (TGN, JODIE, DyRep), RuVector graph memory design, mincut
trajectory tracking with Kalman filtering, event detection pipelines,
compressed temporal storage, cross-room transition graphs, and a 5-phase
integration roadmap.

Part of RF Topological Sensing research swarm (10 agents).

https://claude.ai/code/session_01DGUAowNScGVp88bK2eiuRv
2026-03-08 19:11:16 +00:00
rUv c82c4fc4ac
Update README.md 2026-03-07 23:07:12 -05:00
rUv 0c85d9c86f
Update README.md
updated intro
2026-03-07 22:56:18 -05:00
rUv 65c6fa7a34
Update README.md
update intro
2026-03-07 22:51:17 -05:00
rUv 7659b0bbe2
feat: cross-platform WiFi collector factory (ADR-049) (#173)
feat: cross-platform WiFi collector factory (ADR-049)
2026-03-06 15:10:26 -05:00
ruv 75d4685d25 feat: cross-platform WiFi collector factory with graceful degradation (ADR-049)
- Add create_collector() factory function that auto-detects platform and never raises
- Add LinuxWifiCollector.is_available() classmethod for probe-without-exception
- Refactor ws_server.py to use create_collector(), removing ~30 lines of duplicated platform detection
- Add 10 unit tests covering all platform paths and edge cases
- Add ADR-049 documenting the cross-platform detection and fallback chain

Docker, WSL, and headless users now get SimulatedCollector automatically
with a clear WARNING log instead of a RuntimeError crash.

Closes #148
Closes #155

Co-Authored-By: claude-flow <ruv@ruv.net>
2026-03-06 15:09:32 -05:00
rUv 45c15b77a5
fix: ADR-050 security hardening — HMAC, path traversal, OTA auth (#172)
fix: ADR-050 security hardening — HMAC, path traversal, OTA auth
2026-03-06 14:02:50 -05:00
ruv 47223a98be fix: security hardening — replace fake HMAC, add path traversal protection, OTA auth (ADR-050)
Sprint 1 security fixes from quality engineering analysis (issue #170):

- Replace XOR-fold fake HMAC with real HMAC-SHA256 (hmac + sha2 crates) in secure_tdm.rs
- Add path traversal sanitization on DELETE /api/v1/models/:id and /api/v1/recording/:id
- Default bind address changed from 0.0.0.0 to 127.0.0.1 (configurable via --bind-addr / SENSING_BIND_ADDR)
- Add PSK authentication to ESP32 OTA firmware upload endpoint (ota_update.c)
- Flip WASM signature verification to default-on (CONFIG_WASM_SKIP_SIGNATURE opt-out vs opt-in)
- Add 6 new security tests: HMAC key/message sensitivity, determinism, wrong-key rejection, bit-flip detection, enforcing mode
- Add clap env feature for environment variable configuration

All 106 hardware crate tests pass. Sensing server compiles clean.

Closes #170

Co-Authored-By: claude-flow <ruv@ruv.net>
2026-03-06 13:11:04 -05:00
ruv c45690ed4e fix: use montserrat_14 for display_ui big label (montserrat_20 not in Kconfig)
Co-Authored-By: claude-flow <ruv@ruv.net>
2026-03-05 11:45:59 -05:00
ruv fb782e0d71 fix: brighten ambient light color and increase multiplier for room brightness slider
The ambient light color 0x446688 (dark blue-gray) was too dim to produce
visible brightness changes. Changed to 0xccccdd (bright neutral) with 5x
multiplier. Bumped SETTINGS_VERSION to force fresh defaults.

Co-Authored-By: claude-flow <ruv@ruv.net>
2026-03-05 10:56:37 -05:00
ruv 944076733e fix: room brightness slider now applies 3x multiplier to ambient light
The ambient light was initialized with intensity * 3.0 but the slider
and preset callbacks set raw value without the multiplier, making the
setting appear to do nothing.

Co-Authored-By: claude-flow <ruv@ruv.net>
2026-03-05 10:51:41 -05:00
ruv a8f48a7897 docs: make hero image clickable, links to live demo
Co-Authored-By: claude-flow <ruv@ruv.net>
2026-03-05 10:48:41 -05:00
ruv 7df316f13e docs: make README screenshot clickable, links to live demo
Co-Authored-By: claude-flow <ruv@ruv.net>
2026-03-05 10:45:53 -05:00
ruv da54ea07d2 fix: reduce default bloom strength, ensure auto-cycle starts on load
- Default bloom: 0.2 → 0.08, radius 0.25 → 0.2, threshold 0.5 → 0.6
- PostProcessing constructor matches new defaults
- Bump SETTINGS_VERSION to '5' to clear stale localStorage (forces auto scenario)

Co-Authored-By: claude-flow <ruv@ruv.net>
2026-03-05 10:42:37 -05:00
rUv bf4d64ad4b
docs: add live Observatory demo link to README (#145) 2026-03-05 10:39:58 -05:00
ruv 8b57a6f64c docs: update README with ADR-045–048, Observatory, adaptive classifier, AMOLED display
- Update ADR count from 44 to 48
- Add adaptive classifier (ADR-048) to Intelligence features
- Add Observatory visualization (ADR-047) and AMOLED display (ADR-045) to Deployment features
- Update screenshot to v2-screen.png
- Add ADR-045 (AMOLED), ADR-046 (Android TV), ADR-047 (Observatory), DDD deployment model
- Add AMOLED display firmware (display_hal, display_task, display_ui, LVGL config)
- Add Observatory UI (13 Three.js modules, CSS, HTML entry point)
- Add trained adaptive model JSON
- Update .gitignore for managed_components, recordings, .swarm

Co-Authored-By: claude-flow <ruv@ruv.net>
2026-03-05 10:20:48 -05:00
rUv 5fa61ba7ea
feat: adaptive CSI classifier with signal smoothing pipeline (ADR-048) (#144)
Add environment-tuned activity classification that learns from labeled
ESP32 CSI recordings, replacing brittle static thresholds.

- Adaptive classifier: 15-feature logistic regression trained from JSONL
  recordings (variance, motion band, subcarrier stats: skew, kurtosis,
  entropy, IQR). Trains in <1s, persists as JSON, auto-loads on restart.
- Three-stage signal smoothing: adaptive baseline subtraction (α=0.003),
  EMA + trimmed-mean median filter (21-frame window), hysteresis debounce
  (4 frames). Motion classification now stable across seconds, not frames.
- Vital signs stabilization: outlier rejection (±8 BPM HR, ±2 BPM BR),
  trimmed mean, dead-band (±2 BPM HR), EMA α=0.02. HR holds steady for
  10+ seconds instead of jumping 50 BPM every frame.
- Observatory auto-detect: always probes /health on startup, connects
  WebSocket to live ESP32 data automatically.
- New API endpoints: POST /api/v1/adaptive/train, GET /adaptive/status,
  POST /adaptive/unload for runtime model management.
- Updated user guide with Observatory, adaptive classifier tutorial,
  signal smoothing docs, and new troubleshooting entries.
2026-03-05 10:15:18 -05:00
ruv f771cf8461 docs: add vendor README with submodule setup instructions
Co-Authored-By: claude-flow <ruv@ruv.net>
2026-03-04 13:31:19 -05:00
ruv c257e9a215 chore: track upstream main branch for vendor submodules
- Add branch = main to each submodule in .gitmodules
- Add GitHub Actions workflow that checks every 6 hours for
  upstream updates and opens a PR automatically

Co-Authored-By: claude-flow <ruv@ruv.net>
2026-03-04 13:30:48 -05:00
rUv 6e76578dcf
Merge pull request #137 from ruvnet/refactor/vendor-submodules
refactor: convert vendor/ to git submodules
2026-03-04 13:23:38 -05:00
ruv c6f061a191 refactor: convert vendor/ directories to git submodules
Replace 9,608 tracked vendor files (~737MB) with git submodule pointers
to their upstream repositories:

- vendor/midstream -> https://github.com/ruvnet/midstream
- vendor/ruvector -> https://github.com/ruvnet/ruvector
- vendor/sublinear-time-solver -> https://github.com/ruvnet/sublinear-time-solver

This dramatically reduces repo size and ensures vendor code stays
in sync with upstream. New clones should use:
  git clone --recurse-submodules
Existing clones should run:
  git submodule update --init --recursive

Co-Authored-By: claude-flow <ruv@ruv.net>
2026-03-04 13:22:25 -05:00
ruv 57141ff707 Update README hero image to ruview-small-gemini
Co-Authored-By: claude-flow <ruv@ruv.net>
2026-03-04 10:37:42 -05:00
ruv b995adea87 docs: update user guide for multi-arch Docker and RuView repo rename
- Update GitHub URLs from ruvnet/wifi-densepose to ruvnet/RuView
- Update git clone directory references to RuView
- Note multi-architecture support (amd64 + arm64) for Docker image
- Add troubleshooting entry for macOS arm64 manifest error

Fixes ruvnet/RuView#136

Co-Authored-By: claude-flow <ruv@ruv.net>
2026-03-04 10:21:22 -05:00
ruv 6fea56c4a9 Add RuView hero image to top of README
Co-Authored-By: claude-flow <ruv@ruv.net>
2026-03-04 10:19:41 -05:00
rUv d7a55fd646
Merge pull request #135 from ruvnet/fix/install-macos-bash3-compat
fix: install.sh macOS Bash 3.2 compatibility
2026-03-04 08:27:21 -05:00
ruv dc371a6751 fix: install.sh compatibility with macOS Bash 3.2
Replace `declare -A` (associative array, requires Bash 4+) with
a standard indexed array. macOS ships Bash 3.2 due to GPLv3
licensing, so `declare -A` fails with "invalid option".

Fixes #134

Co-Authored-By: claude-flow <ruv@ruv.net>
2026-03-04 08:27:02 -05:00
rUv da7105d599
Update README.md 2026-03-03 21:17:37 -05:00
rUv 749007d708
Update README.md 2026-03-03 21:17:08 -05:00
rUv 26655d397e
Merge pull request #133 from ruvnet/fix/pickle-deserialization-safety
fix: safe PyTorch model loading (weights_only=True)
2026-03-03 18:11:29 -05:00
ruv aca1bbc82e fix: use weights_only=True for safe PyTorch model loading
Replace unsafe `torch.load(path)` with `torch.load(path,
map_location=self.device, weights_only=True)` to prevent
pickle deserialization RCE (trailofbits.python.pickles-in-pytorch).

weights_only=True disables pickle entirely for model loading,
which is the PyTorch-recommended mitigation (available since 1.13).
Also adds map_location for correct CPU/GPU device mapping.

Closes #106

Co-Authored-By: claude-flow <ruv@ruv.net>
2026-03-03 18:08:31 -05:00
ruv 2ad510782e docs: add 4 DDD domain models covering all major subsystems
Create complete Domain-Driven Design specifications for:
- Signal Processing (3 contexts: CSI Preprocessing, Feature Extraction, Motion Analysis)
- Training Pipeline (4 contexts: Dataset Management, Model Architecture, Training Orchestration, Embedding & Transfer)
- Hardware Platform (5 contexts: Sensor Node, Edge Processing, WASM Runtime, Aggregation, Provisioning)
- Sensing Server (5 contexts: CSI Ingestion, Model Management, CSI Recording, Training Pipeline, Visualization)

Update DDD index (3 → 7 models) and README docs table.

Co-Authored-By: claude-flow <ruv@ruv.net>
2026-03-03 17:39:57 -05:00
ruv 8658cc3de0 docs: improve RuvSense domain model and add DDD index
- Add intro explaining DDD purpose and bounded context overview table
- Add Edge Intelligence bounded context (#7) for on-device sensing
- Add ubiquitous language terms: Edge Tier, WASM Module
- Fix frame rate 20 Hz -> 28 Hz (measured on hardware)
- Link each context to its source files and ADRs
- Add NVS configuration table and invariants for edge processing
- Create docs/ddd/README.md introducing all 3 domain models
- Update main README docs table to link to DDD index

Co-Authored-By: claude-flow <ruv@ruv.net>
2026-03-03 17:02:39 -05:00
ruv 2e9b34ec9a docs: remove WiFi-Mat User Guide from docs table
Co-Authored-By: claude-flow <ruv@ruv.net>
2026-03-03 16:58:39 -05:00
ruv 3eb8444f73 docs: link Architecture Decisions to ADR README index
Co-Authored-By: claude-flow <ruv@ruv.net>
2026-03-03 16:58:12 -05:00
ruv cd7b914580 docs: add Fully Local feature to Key Features table
Co-Authored-By: claude-flow <ruv@ruv.net>
2026-03-03 16:53:25 -05:00
ruv 6d799c2917 docs: move server-optional note below screenshot
Co-Authored-By: claude-flow <ruv@ruv.net>
2026-03-03 16:42:54 -05:00
ruv d00b733c99 docs: link edge modules to Edge Intelligence section
Co-Authored-By: claude-flow <ruv@ruv.net>
2026-03-03 16:40:03 -05:00
ruv 90b5beb1d4 docs: add "No Internet" to README tagline
Co-Authored-By: claude-flow <ruv@ruv.net>
2026-03-03 16:38:07 -05:00
ruv b5af3bc528 docs: mention edge modules in README intro
Co-Authored-By: claude-flow <ruv@ruv.net>
2026-03-03 16:36:11 -05:00
ruv 7e43edf26a docs: add ADR index with intro on ADRs for AI-assisted development
Explains why ADRs matter for AI-generated code (prevents drift,
provides constraints and rationale), how they work with DDD domain
models, and indexes all 44 ADRs by category.

Also fixes ADR count 43 -> 44 in main README.

Co-Authored-By: claude-flow <ruv@ruv.net>
2026-03-03 16:35:17 -05:00
ruv a7fe8b6799 docs: rewrite ESP32 hardware pipeline section with accurate metrics
- Fix binary size 777KB -> 947KB, frame rate 20Hz -> 28.5Hz
- Fix flash command: write_flash (not write-flash), 8MB (not 4MB)
- Add multi-node mesh provisioning with TDM examples
- Add Tier 3 WASM modules row
- Add fine-tuning provisioning flags (--vital-int, --fall-thresh, etc.)
- Plain-language descriptions throughout
- Note server is optional, ESP32 works standalone

Co-Authored-By: claude-flow <ruv@ruv.net>
2026-03-03 16:28:07 -05:00
ruv c2e6546159 docs: move ESP32 independent operation note to hardware section
Co-Authored-By: claude-flow <ruv@ruv.net>
2026-03-03 16:25:21 -05:00
ruv f953a309fe docs: mention ESP32 independent operation in README intro
Co-Authored-By: claude-flow <ruv@ruv.net>
2026-03-03 16:24:06 -05:00
ruv f995f69622 docs: update ADRs with ENOMEM crash fix proof (Issue #127)
- ADR-018: Document rate-limiting and ENOMEM backoff safeguards in firmware
- ADR-029: Add note about rate-limiting requirement for channel hopping, mark
  lwIP pbuf exhaustion risk as resolved
- ADR-039: Add finding #5 documenting the sendto ENOMEM crash and fix
  (947 KB binary, hardware-verified 200+ callbacks with zero errors)
- CHANGELOG: Add entries for Issue #127 fix and Issue #130 provisioning fix

Co-Authored-By: claude-flow <ruv@ruv.net>
2026-03-03 16:14:54 -05:00
rUv ce171696b2
fix: rate-limit CSI sends and add ENOMEM backoff to prevent crash (#132)
The CSI callback fires for every WiFi frame in promiscuous mode
(100-500+ fps). Each call invoked sendto() synchronously, exhausting
lwIP packet buffers (errno 12 = ENOMEM). The rapid-fire failures
cascaded into a LoadProhibited guru meditation crash.

Two fixes:

1. csi_collector.c: Rate-limit UDP sends to 50 Hz (20ms interval).
   CSI frames arriving between sends are dropped — the sensing
   pipeline only needs 20-50 Hz.

2. stream_sender.c: When sendto fails with ENOMEM, suppress further
   sends for 100ms to let lwIP reclaim buffers. Logs the backoff
   event and resumes automatically.

Closes #127
2026-03-03 16:00:40 -05:00
ruv b544545cb0 docs: ADR-044 provisioning tool enhancements
5-phase plan to close remaining gaps in provision.py:
- Phase 1: 7 missing NVS keys (hop_count, chan_list, dwell_ms,
  power_duty, wasm_max, wasm_verify, wasm_pubkey)
- Phase 2: JSON config file for mesh provisioning
- Phase 3: Named presets (basic, vitals, mesh-3, mesh-6-vitals)
- Phase 4: --read (dump NVS) and --verify (boot check)
- Phase 5: Auto-detect serial port

Co-Authored-By: claude-flow <ruv@ruv.net>
2026-03-03 15:57:34 -05:00
rUv b6f7b8a74a
fix: add TDM and edge intelligence flags to provision.py (#131)
The user guide and release notes document TDM and edge intelligence
provisioning flags but provision.py only accepted --ssid, --password,
--target-ip, --target-port, and --node-id.

Add all NVS keys the firmware actually reads:
- --tdm-slot / --tdm-total: TDM mesh slot assignment
- --edge-tier: edge processing tier (0=off, 1=stats, 2=vitals)
- --pres-thresh, --fall-thresh: detection thresholds
- --vital-win, --vital-int: vitals timing parameters
- --subk-count: top-K subcarrier selection

Also validates that --tdm-slot and --tdm-total are specified together
and that slot < total.

Closes #130
2026-03-03 15:53:43 -05:00
rUv 86f08303e6
docs: update changelog, user guide, and README for ADR-043 (#128)
- CHANGELOG: add ADR-043 entries (14 new API endpoints, WebSocket fix,
  mobile WS fix, 25 real mobile tests)
- README: update ADR count from 41 to 43
- CLAUDE.md: update ADR count from 32 to 43
- User guide: add 14 new REST endpoints to API reference table, note
  that /ws/sensing is available on the HTTP port, update ADR count
2026-03-03 15:21:52 -05:00