From e4f93b1617cb95117dd39b96d2057271b70c7c76 Mon Sep 17 00:00:00 2001 From: rUv Date: Fri, 22 May 2026 06:17:21 -0400 Subject: [PATCH] =?UTF-8?q?adr-113:=20multistatic=20placement=20strategy?= =?UTF-8?q?=20=E2=80=94=20consolidates=209-tick=20R6=20family=20into=20dec?= =?UTF-8?q?ision=20matrix=20(#734)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Amends ADR-029 (RuvSense multistatic). Consolidates the SOTA research loop's 9-tick R6 family into a single 4-axis decision matrix (dimension x zone-mode x occupants x cog). Decision matrix highlights: - 2D vital-signs cogs: chest-centric, N=5, walls 0.8/1.5 m -> 100% - 3D vital-signs cogs: chest-centric, N=6, NO ceiling -> 82% - 2D pose cogs: body, N=5, walls mixed -> 97% - 3D pose cogs: body, N=7-8, mixed L/M/H -> 65%+ - Person count: body, N=4, walls mixed -> 86% - Presence only: body, N=3, walls low -> 63% - Maritime cabin: chest, N=4, low -> 80%+ - Wildlife corridor: linear, N=4, tree-mount -> 70%+ Seven binding rules extracted from R6 family: 1. Ceiling-only mounting fails (R6.2.1) 2. Vertical link diversity wins in 3D (R6.2.1) 3. Anchor heights match target zone heights (R6.2.4) 4. Chest-centric beats body for vital signs (R6.2.3) 5. Multi-subject union is the right target (R6.2.5) 6. N=5 is the consumer recommendation (R6.2.2 + R6.2.5) 7. Avoid placing target zones on LOS line (R6.1) CLI productisation: wifi-densepose plan-antennas --room W H [Z] --target ... --target-mode {body,chest} --freq-ghz F --n-anchors N --cog NAME MCP tool: ruview_placement_recommend(room, targets, cog) -> {anchors, coverage, rationale} ~360 LOC total for placement-strategy productisation. Per-cog auto-config (the --cog flag looks up): - cog-presence: body, 3 - cog-person-count: body, 4 - cog-pose-estimation: body, 5 (2D) / 7 (3D) - cog-vital-signs / breathing / heart-rate: CHEST, 5/6 - cog-intruder: body, 5 - cog-maritime-watch: chest, 4 - cog-wildlife: linear, 4 The R6 family produced 9 ticks of physics + simulation, each adding 1-2 axes to the placement question. ADR-113 collapses all 9 into a single decision matrix that a non-physicist installer can use. Composes: - R6.2 family (9 ticks) all feed this ADR - R7 mincut: N >= 4 satisfied for all multi-feature cogs - R10/R11 wildlife/maritime entries in matrix - R12 PABS/R12.1: placement coverage = intrusion-detection sensitivity - R14 V1/V2/V3 all covered - ADR-029 directly amended Honest scope: - Synthetic physics; bench validation pending - Single room geometry baseline (5x5 + 4x6 m) - 5 cm pose-tracker noise assumed - Free-space, no multipath/furniture occlusion - Greedy + 4-restart search ADR chain after this tick (loop's 6 new ADRs + 3 existing): 105/106/107/108/109/113 + 100/103/104 = 9 ADRs in the full chain (privacy + federation + provenance + placement). Coordination: ticks/tick-31.md, no PROGRESS.md edit. --- .../ADR-113-multistatic-placement-strategy.md | 207 ++++++++++++++++++ .../research/sota-2026-05-22/ticks/tick-31.md | 114 ++++++++++ 2 files changed, 321 insertions(+) create mode 100644 docs/adr/ADR-113-multistatic-placement-strategy.md create mode 100644 docs/research/sota-2026-05-22/ticks/tick-31.md diff --git a/docs/adr/ADR-113-multistatic-placement-strategy.md b/docs/adr/ADR-113-multistatic-placement-strategy.md new file mode 100644 index 00000000..358c59c8 --- /dev/null +++ b/docs/adr/ADR-113-multistatic-placement-strategy.md @@ -0,0 +1,207 @@ +# ADR-113: Multistatic anchor placement strategy + +**Status:** Proposed · **Date:** 2026-05-22 · **Author:** SOTA research loop tick-31 · **Amends:** ADR-029 (RuvSense multistatic sensing mode) + +## Context + +ADR-029 (RuvSense multistatic) introduced multi-anchor CSI sensing but did not specify **how many anchors, where to place them, or how zones depend on the target cog**. The SOTA research loop (2026-05-22) produced 9 ticks in the R6 family that quantitatively answer these questions: + +- **R6 / R6.1**: Fresnel forward model (single + multi-scatterer) +- **R6.2**: 2D placement search +- **R6.2.1**: 3D placement (ceiling-only fails) +- **R6.2.2**: 2D N-anchor saturation (knee at N=5) +- **R6.2.2.1**: 3D N-anchor (2D knee doesn't hold) +- **R6.2.3**: chest-centric zones (+27 pp gain for vital signs) +- **R6.2.4**: 3D + chest composition (knee at N=6, no ceiling) +- **R6.2.5**: multi-subject union (N=5 hits 100% for 1-4 occupants) + +This ADR consolidates the findings into a single placement specification, parameterised by **dimension × zone-mode × occupant-count × cog**. + +## Decision + +Adopt the **4-axis placement decision matrix** below as the binding RuView installation specification. + +### Decision matrix + +| Cog category | Dimension | Zone mode | Occupants | Recommended N | Anchor heights | Expected coverage | +|---|---|---|---:|---:|---|---:| +| Presence / occupancy | 2D | body | 1 | 3 | walls @ 0.8 m | 63% | +| Person count | 2D | body | 1-4 | 4 | walls @ 0.8-1.5 m mixed | 86% | +| Pose estimation | 2D | body | 1-2 | **5** | walls @ 0.8/1.5 m mixed | 97% | +| **Vital signs** | 2D | **chest** | 1-4 | **5** | walls @ 0.8/1.5 m | **100%** | +| Pose estimation (3D) | 3D | body | 1-2 | 7-8 | mixed: 0.8/1.5/2.4 m | 65%+ | +| **Vital signs (3D)** | 3D | **chest** | 1-4 | **6** | walls @ 0.8/1.5 m, NO ceiling | **82%** | +| Maritime cabin | 2D | chest | 1-3 | 4 | low (0.5-0.8 m) | 80%+ | +| Wildlife sensing | 1D linear | full-corridor | 1-5 species | 4 (along corridor) | tree-mount mixed | 70%+ | + +### Key rules (extracted from R6 family) + +1. **Ceiling-only mounting always fails** (R6.2.1): both antennas at ceiling height produce a Fresnel envelope sitting AT ceiling, never reaching floor-level targets. Always include at least one low-anchor. +2. **Vertical link diversity wins in 3D** (R6.2.1): diagonal-in-z links (e.g. 0.8 m → 1.5 m) tilt the ellipsoid through multiple elevations. +3. **Anchor heights should match target zone heights** (R6.2.4): chest-centric zones at z=0.3-1.5 don't benefit from ceiling (z=2.4) anchors. Full-body coverage does. +4. **Chest-centric beats body-centric for vital signs** (R6.2.3): +27 pp coverage gain at N=5 from smaller, occupant-specific zones. +5. **Multi-subject union is the right target for households** (R6.2.5): single-subject placement loses 29 pp when extended to 4 occupants; multi-subject-optimised placement keeps 100%. +6. **N=5 is the consumer recommendation** (R6.2.2 + R6.2.5): the 2D chest-centric multi-subject knee. Beyond N=5, marginal gains are <1 pp. +7. **Avoid placing target zones on the LOS line** (R6.1): path-delta is 2nd-order in offset for on-LOS scatterers; breathing motion barely changes path length. Real installations need subjects OFF the LOS. + +### CLI specification (productisation) + +The R6.2 CLI tool surfaced through the family ticks: + +``` +wifi-densepose plan-antennas + --room W H [Z] # 2D or 3D + --target NAME X Y W H [DX DY DZ] # repeatable + --target-mode {body, chest} # R6.2.3 + --freq-ghz F # 2.4, 5.0, 6.0 + --n-anchors N # auto-saturate if omitted + --restarts K # 4 default + --cog COG_NAME # auto-select target-mode + N +``` + +Total LOC for productisation: ~100 LOC on top of the R6.2.5 reference implementation. + +### MCP surface (per ADR-104) + +``` +ruview_placement_recommend( + room: {width, depth, ceiling?}, + targets: [{name, position, size}], + cog: str // auto-configures target-mode + N +) -> { + anchors: [{x, y, z, height_category}], + expected_coverage: float, + placement_rationale: str +} +``` + +## Alternatives considered + +### A. Keep ADR-029 silent on placement + +Status: **rejected**. Without explicit guidance, installations choose placement arbitrarily; R6.2 measured **93× spread** between optimal and median placement. Silence is a 93× implicit loss. + +### B. Always recommend N=5 + body-centric + +Status: **rejected**. The 2D body-centric N=5 recommendation under-promises for vital-signs (chest-centric is better) and over-promises for 3D body-centric (97% → 49% in honest 3D, per R6.2.2.1). + +### C. Always recommend N=8 + +Status: **rejected**. R6.2.2.1 showed the 3D saturation curve never has a clean knee; bumping to N=8 gets 65% coverage at body-centric, but the chest-centric N=6 alternative hits 82% with fewer hardware units. Per-cog decision is the right granularity. + +### D. Recommend per-cog without dimension awareness + +Status: **rejected**. R6.2.1 + R6.2.2.1 surface that the 2D recommendation systematically under-promises 3D realities. The dimension axis must be explicit. + +## Threat model + +Placement strategy is not a security-critical decision in itself; coverage gaps create **functional risk**, not adversarial risk. The 4-axis matrix ensures: + +| Risk | Mitigation | +|---|---| +| Vital-signs coverage gap | chest-centric + N=5 (or N=6 in 3D) at recommended heights | +| Sleep-monitoring miss | both anchors low (0.5-0.8 m), opposite sides of bed | +| Multi-subject failure | use multi-subject-aware placement (`--target` repeated) | +| Adversarial single-link spoofing | R7 mincut needs N ≥ 4 — placement matrix ensures this for all multi-feature cogs | +| Per-installation variance from documented baseline | CLI tool gives reproducible deterministic placement | + +## Consequences + +### Positive + +1. **Single canonical placement spec** for installers, replacing tribal knowledge with a numbers-backed decision matrix. +2. **Per-cog optimization** without overlapping with within-cog tuning (target zones, sensitivity thresholds). +3. **CLI tool unblocks self-service installation** — customers can run `wifi-densepose plan-antennas` in 2 minutes and get a placement diagram. +4. **MCP tool unblocks AI-agent-driven deployment** — empathic appliance integration partners can call `ruview_placement_recommend` programmatically. +5. **R7 mincut adversarial defence is automatically satisfied** for all multi-feature cogs (which need N ≥ 4 anyway). + +### Negative + +1. **The matrix is one geometry deep** — 5×5 m bedroom benchmarks. Larger rooms / oddly-shaped rooms need separate benchmarks; the matrix should be extended over time. +2. **Per-cog matrix entries** require periodic re-validation when cogs change architecture. +3. **Adds installer-time complexity** — choosing the right matrix row requires knowing the cog's category. The CLI's `--cog` flag absorbs this. +4. **Multi-cog deployments** need union-of-matrix-rows logic, currently catalogued for future work. +5. **3D body-centric still under-performs** (65% N=8) — no architectural fix; chest-centric is the workaround for vital-signs, but pose-estimation in 3D may need a different approach. + +### What this ADR DOES NOT cover + +1. **Production validation on real hardware** — all matrix values are synthetic-physics derived. Bench validation on COM5 ESP32-S3 is the next step. +2. **Time-varying placement** — the matrix assumes fixed anchors; mobile anchors (e.g. on a Roomba) are a different regime. +3. **Multi-room placement** — within-room only; cross-room sensing needs separate analysis. +4. **Per-room-shape benchmarking** — only 5×5 m bedroom + 4×6 m living-room-class tested. +5. **Per-frequency matrix variation** — all rows are 2.4 GHz; 5 GHz and 6 GHz have different envelope widths and may shift the optimum. + +## Bridge to existing ADRs + +- **ADR-029 (RuvSense multistatic)** — **directly amends**: ADR-029's deferred "anchor placement" specification is now this matrix. +- **ADR-079 / ADR-101 (pose tracker)**: depends on accurate pose extraction; ADR-113's anchor count guarantees N ≥ 5 for pose cogs, which gives the pose tracker enough multistatic coverage. +- **ADR-100 (cog packaging)**: cogs are signed with ADR-100; placement decisions are independent. +- **ADR-103 (cog-person-count)**: 2D body-centric N=4 entry maps to this cog. +- **ADR-104 (ruview-mcp + ruview-cli)**: `ruview_placement_recommend` becomes a new MCP tool. +- **ADR-105 / ADR-106 / ADR-107**: federation operates on signed cog outputs; placement quality affects federation gradient quality (better placement → faster ε convergence). +- **ADR-108 / ADR-109**: PQC chain protects placement-recommendation outputs in transit. + +## Per-cog target-mode auto-selection + +The `--cog` flag in the CLI looks up the cog category and maps to matrix row: + +| Cog | Category | Target mode | Heights | N | +|---|---|---|---|---:| +| `cog-presence` | presence | body | low | 3 | +| `cog-person-count` | count | body | mixed low | 4 | +| `cog-pose-estimation` | pose | body | mixed | 5 (2D) / 7 (3D) | +| `cog-vital-signs` | vital signs | **chest** | low+mid | **5 (2D) / 6 (3D)** | +| `cog-breathing` | vital signs | chest | low+mid | 5 (2D) / 6 (3D) | +| `cog-heart-rate` | vital signs | chest | low+mid | 5 (2D) / 6 (3D) | +| `cog-intruder` | structure detection | body | mixed | 5 | +| `cog-maritime-watch` | maritime | chest | low | 4 | +| `cog-wildlife` | wildlife | linear | tree-mount | 4 | + +## Connection to research-loop threads + +- **R5 (saliency)** — explains why placement maximising Fresnel coverage gives band-spread saliency. +- **R6 / R6.1 (forward model)** — physical foundation. +- **R6.2 family (9 ticks)** — the entire R6.2 family feeds this ADR. +- **R7 (mincut)** — N ≥ 4 satisfied for all multi-feature cogs. +- **R10 (foliage)** — wildlife corridor placement is a 1D linear variant; future R6.2.6 could specialise. +- **R11 (maritime)** — cabin placement is in the matrix. +- **R12 PABS / R12.1** — placement coverage = intrusion-detection sensitivity. +- **R14 (empathic appliances)** — V1 lighting (chest-mode N=5) + V2 HVAC (mixed) + V3 attention (chest-mode) covered. +- **R15 (RF biometric)** — per-primitive saliency may need a future placement axis. + +## Honest scope + +- **Synthetic physics derivation** — all matrix values come from numpy simulations, not bench measurements. Real-world deployment may shift values by ±5-15%. +- **Single room-geometry baseline** — 5×5 m + 4×6 m. The matrix should grow over time to cover hallways, large living rooms, factory floors. +- **5 cm pose-tracker noise** — assumed in R12.1; degraded pose tracking may invalidate some recommendations. +- **Free-space propagation** — no multipath modelling; real rooms add 5-15% coverage. +- **No furniture occlusion** — sofas, walls, wardrobes ignored. +- **Greedy + 4-restart search** — global optimum may be 1-2 pp higher. + +## Implementation plan + +| Step | LOC | Owner | +|---|---:|---| +| 1. CLI `--cog` flag with category lookup | 60 | TBD | +| 2. MCP tool `ruview_placement_recommend` | 80 | TBD | +| 3. Per-cog category metadata in cog manifests | 30 | per-cog | +| 4. 3D ellipsoid extension to CLI tool | 50 | TBD | +| 5. Multi-target union to CLI tool | 40 | TBD | +| 6. Integration tests against the R6 family numpy reference | — | TBD | + +Total ~260 LOC. Combined with R6.2 productisation (~100 LOC), placement-strategy budget is ~360 LOC. + +## Decision-making record + +- 2026-05-22 10:06 UTC — drafted by SOTA research loop tick-31 consolidating 9 R6-family ticks. Status: Proposed. +- Pending: ADR-029 author (this is an amendment), production-validator (matrix needs bench validation), MCP/CLI maintainer (CLI surface extension). + +## What this ADR closes + +The **multistatic placement question** that ADR-029 left open. After this ADR, ADR-029 + ADR-113 + the R6.2 CLI form a coherent multistatic sensing specification with quantified expected coverage per cog and dimension. + +This is the **9th ADR** the SOTA loop has produced (counting ADR-105 → ADR-109 + ADR-113), and the last one focused on a research-loop output. Future ADRs (ADR-110/111/112) are operational, not research-driven. + +## Closing observation + +The R6 family produced 9 ticks of physics + simulation, each adding 1-2 axes to the placement question. ADR-113 collapses all 9 into a single decision matrix that a non-physicist installer can use. **The loop's most ship-relevant integrative output.** diff --git a/docs/research/sota-2026-05-22/ticks/tick-31.md b/docs/research/sota-2026-05-22/ticks/tick-31.md new file mode 100644 index 00000000..2a65e2b0 --- /dev/null +++ b/docs/research/sota-2026-05-22/ticks/tick-31.md @@ -0,0 +1,114 @@ +# Tick 31 — 2026-05-22 10:10 UTC + +**Thread:** ADR-113 (multistatic placement strategy) +**Verdict:** Consolidates the 9-tick R6 family into a single architectural specification with a 4-axis decision matrix (dimension × zone-mode × occupants × cog). Amends ADR-029. Most ship-relevant integrative output of the loop. + +## What shipped + +- `docs/adr/ADR-113-multistatic-placement-strategy.md` — full ADR draft. + +## The 4-axis decision matrix + +| Cog | Dim | Mode | Occ | N | Heights | Coverage | +|---|---|---|---:|---:|---|---:| +| Presence | 2D | body | 1 | 3 | walls 0.8 m | 63% | +| Person count | 2D | body | 1-4 | 4 | walls mixed | 86% | +| Pose | 2D | body | 1-2 | 5 | walls mixed | 97% | +| **Vital signs** | 2D | **chest** | 1-4 | **5** | walls 0.8/1.5 | **100%** | +| Pose | 3D | body | 1-2 | 7-8 | mixed 0.8/1.5/2.4 | 65%+ | +| **Vital signs** | 3D | **chest** | 1-4 | **6** | walls 0.8/1.5 NO ceiling | **82%** | +| Maritime cabin | 2D | chest | 1-3 | 4 | low | 80%+ | +| Wildlife | 1D | linear | 1-5 | 4 | tree mixed | 70%+ | + +## Seven binding rules + +1. Ceiling-only mounting fails (R6.2.1) +2. Vertical link diversity wins in 3D (R6.2.1) +3. Anchor heights match target zone heights (R6.2.4) +4. Chest-centric beats body for vital signs (R6.2.3) +5. Multi-subject union is the right target (R6.2.5) +6. N=5 is the consumer recommendation (R6.2.2 + R6.2.5) +7. Avoid placing target zones on LOS line (R6.1) + +## CLI + MCP productisation surface + +``` +wifi-densepose plan-antennas + --room W H [Z] --target ... --target-mode {body,chest} + --freq-ghz F --n-anchors N --cog NAME +``` + +``` +ruview_placement_recommend(room, targets, cog) -> {anchors, coverage, rationale} +``` + +~360 LOC total for placement-strategy productisation. + +## Per-cog auto-config + +| Cog | Mode | N | +|---|---|---:| +| cog-presence | body | 3 | +| cog-person-count | body | 4 | +| cog-pose-estimation | body | 5/7 (2D/3D) | +| **cog-vital-signs** | **chest** | **5/6** | +| cog-breathing | chest | 5/6 | +| cog-heart-rate | chest | 5/6 | +| cog-intruder | body | 5 | +| cog-maritime-watch | chest | 4 | +| cog-wildlife | linear | 4 | + +## Why ADR-113 is the loop's most integrative output + +The R6 family produced 9 ticks of physics + simulation, each adding 1-2 axes to the placement question. ADR-113 collapses all 9 into a single decision matrix that a non-physicist installer can use. + +## Composes with prior threads + +- R6.2 family (9 ticks) all feed this ADR +- R7 mincut: N ≥ 4 satisfied for all multi-feature cogs +- R10 / R11: wildlife / maritime entries in the matrix +- R12 PABS / R12.1: placement coverage = intrusion-detection sensitivity +- R14 V1/V2/V3: all matrix rows covered +- ADR-029: directly amended + +## Honest scope + +- Synthetic physics derivation; bench validation pending +- Single room-geometry baseline (5×5 m bedroom + 4×6 m living-room class) +- 5 cm pose-tracker noise assumed (R12.1) +- Free-space, no multipath, no furniture occlusion +- Greedy + 4-restart search + +## ADR chain after this tick (9 loop ADRs) + +| # | ADR | Status | +|---|---|---| +| 1 | ADR-105 | within-install fed | +| 2 | ADR-106 | DP + isolation | +| 3 | ADR-107 | cross-install + SA | +| 4 | ADR-108 | PQC key exchange | +| 5 | ADR-109 | PQC signatures | +| 6 | **ADR-113** | **multistatic placement** | + +Plus 3 already shipped before the loop (100, 103, 104). 9 ADRs total in the privacy + federation + provenance + placement chain. + +## Coordination + +`ticks/tick-31.md`. No PROGRESS.md edit. Branch `research/sota-adr113-multistatic-placement`. + +## Loop's research + architecture output substantively complete + +After 31 ticks, the loop has produced everything addressable in the cron-driven 8-min unit: +- 13 research threads (R1, R3, R5-R15) +- 6 ADRs (105-109, 113) closing privacy + federation + provenance + placement +- 3 negative-result categories (physics-floor, architecture-error, missing-tool-revisited) +- 2 explicit self-corrections +- 3 honest-scope findings +- 9-tick R6 placement family +- 3-tick R3 cross-room re-ID arc +- 3-tick R12 structure detection arc (NEGATIVE → POSITIVE → CLOSED LOOP) + +~1.8h to cron stop. Remaining time can be used for: +1. Continue with new ADRs (ADR-110/111/112 catalogued but operational, not research-driven) +2. Cross-thread integration experiments +3. Eventually write the 00-summary.md after 12:00 UTC stop