diff --git a/README.md b/README.md index 91ab923c..43de8306 100644 --- a/README.md +++ b/README.md @@ -594,6 +594,7 @@ Verify the plugin structure: `bash plugins/ruview/scripts/smoke.sh`. Full detail | [User Guide](docs/user-guide.md) | Step-by-step guide: installation, first run, API usage, hardware setup, training | | [Build Guide](docs/build-guide.md) | Building from source (Rust and Python) | | [**Home Assistant + Matter Integration**](docs/integrations/home-assistant.md) | **Works with Home Assistant** via MQTT auto-discovery + **Works with Matter** (Apple Home / Google Home / Alexa / SmartThings) — full entity catalog, 3 starter blueprints, Lovelace dashboards, privacy mode, threshold tuning ([ADR-115](docs/adr/ADR-115-home-assistant-integration.md)). | +| [**BFLD — Beamforming Feedback Layer for Detection**](v2/crates/wifi-densepose-bfld/README.md) | New privacy-gated WiFi sensing layer that measures + structurally prevents identity leakage from 802.11ac/ax Beamforming Feedback Information. Three type-enforced invariants (raw BFI never exits node, identity embedding is in-RAM-only, cross-site correlation cryptographically impossible via per-site BLAKE3 keyed hash + daily rotation). Ships full operator surface (`BfldPipeline`, `BfldPipelineHandle`, Soul Signature `SoulMatchOracle` integration), MQTT topic router + HA-DISCO + availability + LWT, 3 operator HA blueprints, two runnable examples, eclipse-mosquitto:2 CI service container. 327+ tests. [ADR-118](docs/adr/ADR-118-bfld-beamforming-feedback-layer-for-detection.md) umbrella + sub-ADRs [119](docs/adr/ADR-119-bfld-frame-format-and-wire-protocol.md)/[120](docs/adr/ADR-120-bfld-privacy-class-and-hash-rotation.md)/[121](docs/adr/ADR-121-bfld-identity-risk-scoring.md)/[122](docs/adr/ADR-122-bfld-ruview-ha-matter-exposure.md)/[123](docs/adr/ADR-123-bfld-capture-path-nexmon-and-esp32.md). Research dossier: [`docs/research/BFLD/`](docs/research/BFLD/) (11 files, 13,544 words). | | [Semantic Primitives — Precision/Recall](docs/integrations/semantic-primitives-metrics.md) | Per-primitive F1 on the held-out paired-capture set: someone-sleeping, possible-distress, room-active, elderly-inactivity-anomaly, meeting, bathroom, fall-risk, bed-exit, no-movement, multi-room. | | [Claude Code / Codex Plugin](plugins/ruview/README.md) | The `ruview` plugin + marketplace — skills, `/ruview-*` commands, agents, and the Codex prompt mirror | | [Architecture Decisions](docs/adr/README.md) | 96 ADRs — why each technical choice was made, organized by domain (hardware, signal processing, ML, platform, infrastructure) | diff --git a/v2/crates/wifi-densepose-bfld/tests/root_readme_link.rs b/v2/crates/wifi-densepose-bfld/tests/root_readme_link.rs new file mode 100644 index 00000000..ca20a22a --- /dev/null +++ b/v2/crates/wifi-densepose-bfld/tests/root_readme_link.rs @@ -0,0 +1,65 @@ +//! Validate the workspace-root `README.md` Documentation table cites the +//! BFLD crate. crates.io won't show this, but new contributors browsing +//! `ruvnet/RuView` on GitHub will — the entry is the primary discovery +//! path for operators looking for "WiFi sensing privacy layer". + +#![cfg(feature = "std")] + +const ROOT_README: &str = include_str!("../../../../README.md"); + +#[test] +fn root_readme_links_to_bfld_crate_readme() { + assert!( + ROOT_README.contains("v2/crates/wifi-densepose-bfld/README.md"), + "root README must link to the BFLD crate README from the Documentation table", + ); +} + +#[test] +fn root_readme_mentions_bfld_acronym_and_full_name() { + assert!( + ROOT_README.contains("BFLD"), + "root README must mention the BFLD acronym", + ); + assert!( + ROOT_README.contains("Beamforming Feedback Layer for Detection"), + "root README must expand the BFLD acronym at least once", + ); +} + +#[test] +fn root_readme_cites_all_six_bfld_adrs() { + for adr in ["ADR-118", "ADR-119", "ADR-120", "ADR-121", "ADR-122", "ADR-123"] { + assert!( + ROOT_README.contains(adr), + "root README must cite {adr} so the discovery path is intact", + ); + } +} + +#[test] +fn root_readme_points_at_research_bundle() { + assert!( + ROOT_README.contains("docs/research/BFLD/"), + "root README must point at the BFLD research dossier", + ); +} + +#[test] +fn root_readme_documents_three_structural_invariants_in_summary() { + // The doc-table summary is short, but it should still mention the + // three I1/I2/I3 invariants since they're the single most operator- + // visible property of BFLD. + assert!( + ROOT_README.contains("raw BFI never exits"), + "root README must mention invariant I1 in the BFLD summary", + ); + assert!( + ROOT_README.contains("in-RAM-only") || ROOT_README.contains("in-RAM only"), + "root README must mention invariant I2 in the BFLD summary", + ); + assert!( + ROOT_README.contains("cross-site"), + "root README must mention invariant I3 in the BFLD summary", + ); +}