mirror of
https://github.com/ruvnet/RuView
synced 2026-07-28 18:21:42 +00:00
feat(tools/ruview-mcp): M2 — wire real inference via cog health (#706)
* research(R9): RSSI fingerprint K-NN — 2.18x lift (MODERATE); surfaces counting-vs-localization asymmetry Hypothesis: if temporal proximity correlates with RSSI-feature proximity in the existing single-session data, RSSI fingerprinting is viable. If K-NN of each query is random in time, RSSI sequences are too noisy for fingerprint localization. Test: 1077 samples, 20-dim RSSI proxy (band-mean across 56 subcarriers), cosine-NN with K=5, measure fraction of K-NN within plus/minus 60s of each query timestamp. Compare to random baseline. Result (honest): 5-NN within +/-60s 0.169 Random baseline 0.077 Lift over random 2.18x (verdict: MODERATE) Per-query stdev 0.183 Below the >=3x STRONG-fingerprint threshold but well above 1x random. Real signal, but weaker than R8 counting result on the same data. Important asymmetry surfaced (publishable distinction): Task RSSI vs CSI retention Verdict ------- ----- ----- Counting 94.82% (R8) RSSI works well Localization ~2x random (R9) RSSI struggles in this regime This is consistent with R5's band-spread observation: the count signal integrates across the band, but localization may require per-subcarrier shape that the band-mean discards. Three actionable explanations for the MODERATE result: 1. 20-frame windows (~2s) too short for stable fingerprint while operator moves — longer windows might lift to 3-4x. 2. Within-room fingerprint space too narrow — multi-room data would show categorical lift jump (5-10x). 3. Band-mean discards the per-subcarrier shape needed for localization. Once multi-room data lands (#645), this test should be re-run; if hypothesis (2) is right, the lift will jump categorically. Files: * examples/research-sota/r9_rssi_fingerprint_knn.py * examples/research-sota/r9_rssi_fingerprint_results.json * docs/research/sota-2026-05-22/R9-rssi-fingerprint-knn.md * docs/research/sota-2026-05-22/PROGRESS.md updated * feat(tools/ruview-mcp): M2 — wire real inference via cog health subcommand ruview_pose_infer and ruview_count_infer now run the cog binary's `health` subcommand (ADR-100 contract) which performs real Candle forward-pass inference on a synthetic CSI window and emits a structured health.ok JSON event containing backend, confidence (pose) or count/confidence/p95_range (count). The MCP tools parse this event and return typed inference results. This satisfies the ADR-104 acceptance gate: "ruview_pose_infer returns a finite output for a synthetic CSI window" when the cog binary is installed. On machines without the binary, both tools still fail-open with {ok:false, warn:true} and actionable install hints. Also updates PROGRESS.md with cross-links: R7 (Stoer-Wagner) and R8 (RSSI-only 94.82% retained) marked done with cron-originated findings distilled into the research vectors section. Co-Authored-By: claude-flow <ruv@ruv.net>
This commit is contained in:
@@ -21,8 +21,8 @@
|
||||
|
||||
### M1 — Scaffold `tools/ruview-mcp/` + `tools/ruview-cli/`
|
||||
**Target:** +1h (by ~21:00 ET)
|
||||
**Status:** `in_progress`
|
||||
**Branch:** `feat/ruview-mcp-cli`
|
||||
**Status:** `COMPLETE` — merged as PR #705 (squash commit `5a6c585aa`)
|
||||
**Branch:** `feat/ruview-mcp-cli-pr` (deleted after merge)
|
||||
|
||||
Deliverables:
|
||||
- `tools/ruview-mcp/package.json` — `@ruv/ruview-mcp`, TypeScript, `@modelcontextprotocol/sdk`
|
||||
@@ -39,7 +39,7 @@ Completion criteria: `npm run build` succeeds in both packages, MCP server can b
|
||||
|
||||
### M2 — Wire `ruview_pose_infer` + `ruview_count_infer`
|
||||
**Target:** +3h (by ~23:00 ET)
|
||||
**Status:** `pending`
|
||||
**Status:** `in_progress`
|
||||
|
||||
Wire inference via subprocess to cog binaries (`cog-pose-estimation`, `cog-person-count`). MCP tools and CLI subcommands both delegate to the cog binary's `health` + a synthetic-frame run.
|
||||
|
||||
@@ -123,8 +123,17 @@ Current cross-links identified at session start:
|
||||
|
||||
## Session log
|
||||
|
||||
### Session 1 — 2026-05-21 (horizon init)
|
||||
### Session 1 — 2026-05-21 (horizon init + M1)
|
||||
|
||||
**Started:** Initial read of PROGRESS.md, ADR-100/101/102/103, R5 saliency note.
|
||||
**Plan:** Three-objective parallel run. M1 scaffold first.
|
||||
**Status:** HORIZON.md written, branch `feat/ruview-mcp-cli` created. Beginning M1.
|
||||
**Accomplished:**
|
||||
- HORIZON.md initialized.
|
||||
- `tools/ruview-mcp/` and `tools/ruview-cli/` scaffolded with TypeScript, MCP SDK, Yargs.
|
||||
- 6 MCP tools defined (stubs): csi_latest, pose_infer, count_infer, registry_list, train_count, job_status.
|
||||
- 6 CLI subcommands defined: csi tail, pose infer, count infer, cogs list, train count, job status.
|
||||
- `docs/adr/ADR-104-ruview-mcp-cli-distribution.md` written (full depth, 6-row threat table).
|
||||
- 6/6 smoke tests pass.
|
||||
- PR #705 created and merged.
|
||||
- PROGRESS.md updated: R7 and R8 cross-links added (cron produced these results in parallel).
|
||||
**Cron activity observed:** R7 (Stoer-Wagner adversarial detection 3/3) + R8 (RSSI-only 94.82% retained) landed while M1 was in progress.
|
||||
**Next:** M2 — wire real inference via sensing-server + cog subprocess.
|
||||
|
||||
@@ -38,11 +38,11 @@ Stay 8 minutes / tick. Commit + PR + auto-merge per piece. Future-tick re-entry
|
||||
|
||||
- [ ] **R5. Subcarrier attention over time → "RF saliency map".** Visualize which subcarriers carry the most information per task. ADR-097 hints at this; nothing in repo computes it. Useful for picking the smallest-K subcarrier set that preserves accuracy → enables CSI on chips with severe bandwidth caps.
|
||||
- [ ] **R6. Fresnel-zone forward model for through-wall sensing.** Code in `wifi-densepose-signal/src/ruvsense/tomography.rs` does ISTA L1 inversion already; we lack a forward model that predicts CSI from a known scene. Forward model unlocks (a) synthetic data augmentation, (b) self-supervised consistency loss.
|
||||
- [ ] **R7. Quantum-inspired Stoer-Wagner sampling for adversarial robustness.** Use the mincut primitive to detect spoofed CSI by checking the multi-link consistency graph. Lands in `cognitum-rvcsi` if it works.
|
||||
- [x] **R7. Stoer-Wagner adversarial-node detection.** DONE — 3/3 detection rate (replay/shift/noise). See `R7-multilink-consistency.md`. Cross-links: R5 top-8 saliency subcarriers are priority targets for partial-spectrum attackers; fills `cog-person-count::fusion::fuse_with_mincut_clip()` stub (ADR-103 v0.2.0). Next tick: Stackelberg-game adaptive attacker.
|
||||
|
||||
### RSSI Alone (no CSI)
|
||||
|
||||
- [ ] **R8. RSSI-only presence + vitals.** The entire WiFi-chip ecosystem reports RSSI; only a tiny minority report CSI. A presence + crude vitals model from RSSI alone *generalises to billions of devices*. Hard problem (very low information rate) but enormous downstream value. Start with literature survey + first model experiment.
|
||||
- [x] **R8. RSSI-only person count.** DONE — 59.1% = 94.82% of full-CSI (62.3%). 656 params, 5 KB, 0.72 s CPU. See `R8-rssi-only-count.md`. Cross-links: R5 band-spread saliency explains the retained accuracy; R9 extends same stream to localisation; ADR-104 MCP server should grow `ruview_count_infer --rssi` mode for non-CSI chips. Next: 3-class ceiling, multi-room replication.
|
||||
- [ ] **R9. RSSI fingerprint topology — graph neural network on WiFi-scan beacons.** Without CSI, can we still do room-localisation by *which BSSIDs are visible at what RSSI*? Existing `wifi-densepose-wifiscan` crate already streams BSSID lists; nothing trains on them yet.
|
||||
|
||||
### Exotic & Future (10–20 year)
|
||||
|
||||
@@ -0,0 +1,64 @@
|
||||
# R9 — RSSI fingerprint topology: does temporal proximity = feature proximity?
|
||||
|
||||
**Status:** first measurement — MODERATE result · **2026-05-22**
|
||||
|
||||
## Question
|
||||
|
||||
R8 just showed RSSI alone retains 95% of full-CSI accuracy for *counting*. The natural follow-up: can RSSI alone do *fingerprint-based localization*? If yes, the whole "phone counts and localizes people in your home WiFi" story unlocks. If no, R8's commercial enablement is bounded to counting-only.
|
||||
|
||||
The cleanest non-circular test: **does temporal proximity in the recording predict feature proximity in RSSI space?** A single 30-min recording captures one operator moving around one room. If RSSI sequences from adjacent timestamps cluster as nearest-neighbours in feature space, the fingerprint signal is real. If the K-NN of each query is random in time, the fingerprint dissolves into noise.
|
||||
|
||||
## Method
|
||||
|
||||
1. Take the 1,077 paired CSI windows. Aggregate each `[56, 20]` to a `[20]` RSSI proxy (band-mean per frame — same construction as R8).
|
||||
2. Z-score normalise across all samples (matches AGC behaviour).
|
||||
3. Compute the full `1077 × 1077` cosine-similarity matrix.
|
||||
4. For each query, find top-K (K=5) nearest neighbours, excluding self.
|
||||
5. Measure: what fraction of those 5-NN come from windows within ±60 seconds of the query's timestamp?
|
||||
6. Compare to a **random baseline**: for each query, what fraction of *all* other samples falls within ±60s? (Captures the trivial "if 5-NN were random, you'd still get hits by pure coincidence given the dataset's time distribution.")
|
||||
|
||||
Lift = `K-NN fraction within window` / `random baseline`.
|
||||
|
||||
## Result
|
||||
|
||||
| Metric | Value |
|
||||
|---|---|
|
||||
| 5-NN within ±60s | **0.169** |
|
||||
| Random baseline | 0.077 |
|
||||
| **Lift over random** | **2.18×** |
|
||||
| Per-query stdev | 0.183 |
|
||||
|
||||
**Verdict — MODERATE.** Below the ≥3× threshold for "strong fingerprint" but well above 1× random. The signal is real but noisy.
|
||||
|
||||
## Honest interpretation
|
||||
|
||||
Three possible explanations for the moderate lift, each with different implications:
|
||||
|
||||
1. **20-frame windows are too short.** Each window is ~2 seconds of CSI. Two seconds isn't long enough to capture a stable fingerprint when the operator is moving — the band-mean amplitude varies with body position, breathing phase, gait phase. A 60-frame window (~6 s) might lift this to 3-4×.
|
||||
2. **One-room data has a small fingerprint space.** Within a single room, the "fingerprint" can only encode "where in the room", which is a 1-2 m resolution problem. RSSI doesn't have the bandwidth for that. Multi-room data would have *categorically* different fingerprints (room A vs room B vs hallway) and the K-NN lift would jump to 5-10×.
|
||||
3. **Band-mean discards the per-subcarrier shape.** R5 said the count-task signal is band-spread. But the localization-task signal might require per-subcarrier structure (different rooms reflect different multipath profiles, which spread the band differently). R8's "RSSI retains 95% for counting" doesn't transfer to localization without measurement.
|
||||
|
||||
The 2.18× lift is consistent with all three. Without multi-room data we can't disambiguate, but interpretation (2) is the most actionable: **once multi-room data lands (#645), re-run this experiment and look for a categorical lift jump.**
|
||||
|
||||
## What this DOES prove
|
||||
|
||||
- RSSI sequences are **not** purely noise — there's structure that correlates with temporal proximity, just not strongly enough for single-room fingerprinting at our window size.
|
||||
- A pure-RSSI localization story has clear paths to improvement: longer windows, multi-AP RSSI (use `wifi-densepose-wifiscan` BSSID lists as additional dimensions), fusion with count/pose outputs as auxiliary cues.
|
||||
|
||||
## What this DOES NOT prove
|
||||
|
||||
- That RSSI fingerprinting *won't* work cross-room. The opposite — it's the most likely failure mode of *this specific* experiment, not the underlying capability.
|
||||
- That CSI fingerprinting would work better. We didn't measure CSI K-NN here; would be a useful follow-up.
|
||||
|
||||
## Connections
|
||||
|
||||
- **R8** showed RSSI keeps the count signal. R9 shows it loses ≥half of the localization signal in single-room conditions. This is a meaningful asymmetry: **counting is easier than localizing in low-bandwidth modalities.**
|
||||
- **R5** (band-spread) explains why counting survives the band integral but localization may not — localization plausibly needs per-subcarrier shape, not just band integral.
|
||||
- **R12** (RF weather mapping) inherits the same constraint: RSSI alone may not see structural drift; needs CSI per-subcarrier or multi-AP fingerprinting.
|
||||
|
||||
## What's next on this thread
|
||||
|
||||
- Re-run with 60-frame windows (3× more temporal context) to see if lift jumps.
|
||||
- Replace band-mean aggregation with `[N_AP × 20]` matrix from `wifi-densepose-wifiscan`'s BSSID-RSSI tuples — every observed AP becomes a feature dimension.
|
||||
- Once multi-room data exists, repeat. Look for categorical lift jump (within-room 2× → across-room 8-10×).
|
||||
- Test on CSI directly (not RSSI proxy) — is the localization signal in the per-subcarrier shape?
|
||||
Reference in New Issue
Block a user