mirror of
https://github.com/ruvnet/RuView
synced 2026-06-09 10:13:17 +00:00
b6420ac9ba
Background Issue #937 in the cognitum-v0 appliance repo flagged that the `cognitum-csi-capture` systemd unit shipped `--simulate` by default, silently serving synthetic CSI tagged as production telemetry on `/api/v1/sensor/stream`. That's a textbook trust-eroding pattern — the single most-cited "where's the real data?" evidence external reviewers (#943, #934) point at when they call the project AI-slop. A grep across THIS tree surfaced the exact same anti-pattern in three places: docker/docker-compose.yml:27 # auto (default) — probe ESP32, fall back to simulation docker/docker-entrypoint.sh:14 # CSI_SOURCE — data source: auto (default), ... main.rs:6435 info!("No hardware detected, using simulation"); "simulate" The sensing-server's `auto` source resolver at main.rs:6425-6440 silently fell back to synthetic with only an `info!` log line as the signal. Downstream consumers calling `/api/v1/sensing/latest` or `/ws/sensing` had no in-band way to know they were being served fake data. Fix `auto` now refuses to fall back. When neither ESP32 UDP nor host WiFi is detected, the server logs a clear `error!` explaining the situation and exits 78 (EX_CONFIG). The error message names the two ways to proceed: provision real hardware, or set `--source simulated` / `CSI_SOURCE=simulated` explicitly. Existing operators who already use `--source simulated` (or its legacy `simulate` alias) are unaffected — the alias is preserved for back-compat. Docker entrypoint comment, docker-compose comment, and the Tauri desktop app's source-default path also updated to reflect the new posture. The desktop app keeps its `simulated` default because it's an explicit demo product — the value passed downstream is the *explicit* `simulated`, not `auto`, so the server tags it correctly and never lies about its data source. Validation cargo build -p wifi-densepose-sensing-server --no-default-features cargo test -p wifi-densepose-sensing-server --no-default-features → 122 / 122 pass, build clean (existing pre-fix warnings unchanged). Deployment ⚠ Breaking change for unattended deployments that relied on the `auto → simulated` silent fallback. That is exactly the failure mode this PR fixes: pretending to serve real sensing data when the source is fake. Operators who genuinely want demo mode set `CSI_SOURCE=simulated` explicitly; the error message and the docker-compose comment both point them there.
53 lines
2.2 KiB
YAML
53 lines
2.2 KiB
YAML
version: "3.9"
|
|
|
|
services:
|
|
sensing-server:
|
|
build:
|
|
context: ..
|
|
dockerfile: docker/Dockerfile.rust
|
|
image: ruvnet/wifi-densepose:latest
|
|
ports:
|
|
- "3000:3000" # REST API
|
|
- "3001:3001" # WebSocket
|
|
# ESP32 UDP. On Linux/macOS this works with multiple ESP32 nodes out of
|
|
# the box. On Docker Desktop for Windows, multi-source UDP is collapsed
|
|
# to one source IP at the WSL/Hyper-V boundary, so all-but-one node's
|
|
# frames are silently dropped (issue #374, #386).
|
|
#
|
|
# Windows workaround: change this to "5006:5005/udp" and run the host
|
|
# relay so every datagram arrives from the same loopback source:
|
|
#
|
|
# python scripts/udp-relay.py --listen-port 5005 --forward-port 5006
|
|
#
|
|
# See docs/TROUBLESHOOTING.md §9 for details.
|
|
- "5005:5005/udp"
|
|
environment:
|
|
- RUST_LOG=info
|
|
# CSI_SOURCE controls the data source for the sensing server.
|
|
# Options: auto (default) — probe for ESP32 UDP then host WiFi; **fail
|
|
# hard with exit 78 if neither is detected**.
|
|
# Synthetic data is no longer a silent fallback
|
|
# (issue #937 fix) — operators must opt in.
|
|
# esp32 — receive real CSI frames from an ESP32 on UDP port 5005
|
|
# wifi — use host Wi-Fi RSSI/scan data (Windows netsh)
|
|
# simulated — explicitly generate synthetic CSI for demo mode
|
|
- CSI_SOURCE=${CSI_SOURCE:-auto}
|
|
# MODELS_DIR controls where the server scans for .rvf model files.
|
|
# Mount a host directory and set this to make models visible:
|
|
# volumes: ["/path/to/models:/app/models"]
|
|
# MODELS_DIR=/app/models
|
|
- MODELS_DIR=${MODELS_DIR:-data/models}
|
|
# No explicit command needed — docker-entrypoint.sh uses CSI_SOURCE.
|
|
# Override with: command: ["--source", "esp32", "--tick-ms", "500"]
|
|
|
|
python-sensing:
|
|
build:
|
|
context: ..
|
|
dockerfile: docker/Dockerfile.python
|
|
image: ruvnet/wifi-densepose:python
|
|
ports:
|
|
- "8765:8765" # WebSocket
|
|
- "8080:8080" # UI
|
|
environment:
|
|
- PYTHONUNBUFFERED=1
|