v0.8.0 — Real-time CSI introspection / low-latency tap (ADR-099)
Host-only release. Firmware is unchanged from
v0.6.4-esp32— the introspection tap consumes the existing CSI frame stream produced by current firmware, no flash needed.
What's new
Adds midstream as a parallel introspection tap on wifi-densepose-sensing-server. Two new endpoints, both off by default behind --introspection:
| Endpoint | Format | Purpose |
|---|---|---|
GET /ws/introspection
| newline-delimited JSON, streamed at CSI frame rate | Live attractor + regime + signature-match stream |
GET /api/v1/introspection/snapshot
| single-shot JSON, RUVIEW_API_TOKEN-gated when auth is on
| Pull-based snapshot for orchestrators |
Each snapshot carries:
frame_count,timestamp_nsregime—Idle/Periodic/Transient/Chaotic/Unknownlyapunov_exponent,attractor_dim,attractor_confidenceregime_changed— boolean, flips on the first frame after a regime transitiontop_k_similarity[]— highest-scoring matches against a per-deployment signature library, withabove_thresholdflag
Performance numbers (measured on this branch)
tests/introspection_latency.rs, host-side L1 stand-in scoring on a 1-D mean-amplitude feature, 200-frame noise warm-up → 5-frame motion-ramp signature:
| Signal | Frames to recognise | Ratio vs event-path floor (16 frames) | Status |
|---|---|---|---|
top_k_similarity[0].above_threshold
| 5 | 3.20× | Real, repeatable |
regime_changed (10-frame motion window)
| did not fire | — | Needs multi-dim features (ADR-208 P2) |
Per-frame update() p99
| 0.041 ms | ~24× under ADR-099 D4's 1 ms budget | ✅ Meets budget |
ADR-099 D8 is honestly amended in this release. The aspirational 10× ratio is architecturally unreachable on 1-D scalar features — the noise floor of a single mean-amplitude scalar is too wide to discriminate from a motion signature in 1–2 frames. Closing the gap requires ADR-208 Phase 2 (Hailo NPU vec128 embeddings) so multi-dim partial matches can score in 1–2 frames rather than 5. Until that lands, the tap ships off by default and D4 (per-frame budget) is met today, D8 (10× ratio) is contingent on ADR-208 P2.
Validation
- ✅
cargo test --workspace --no-default-features— 1,656 passed, 0 failed, 8 ignored - ✅
python archive/v1/data/proof/verify.py— VERDICT PASS, hash8c0680d7…51c6matches expected - ✅ 13 / 13 introspection-specific tests pass (8 lib + 5 latency/regression)
- ✅ PR #554 CI: 29 SUCCESS, 0 FAILURE (informational dep-scan / security-report still aggregating at merge time, both pass downstream of green code-correctness gates)
What's NOT in this release
- No firmware change — uses existing
v0.6.4-esp32firmware. - No change to
/ws/sensingorwifi-densepose-signal— ADR-098 already settled that those existing seams are correct; this is the parallel-addition counterpart, not a substitution. - No NPU dependency — runs entirely on the existing host CPU. D8's 10× target is documented as contingent on ADR-208 P2.
Files of interest
docs/adr/ADR-099-midstream-introspection-tap.md— full design record + amended D8.v2/crates/wifi-densepose-sensing-server/src/introspection.rs— 578 lines.v2/crates/wifi-densepose-sensing-server/tests/introspection_latency.rs— 288 lines.
Companion tracking
Issue #556 — capability surface, measured baseline, path to closing D8.
Upgrade
Pull, rebuild, restart with --introspection:
git pull && (cd v2 && cargo build --release -p wifi-densepose-sensing-server --bin sensing-server)
./v2/target/release/sensing-server --introspection/ws/sensing clients are unaffected — no change to existing behaviour.
🤖 Generated with claude-flow