mirror of
https://github.com/ruvnet/RuView
synced 2026-08-11 20:41:44 +00:00
150 lines
7.9 KiB
Markdown
150 lines
7.9 KiB
Markdown
# ADR-301: Automatic domain calibration — signed, versioned, invalidatable room fingerprint
|
||
|
||
- **Status**: Accepted — initial implementation planned (ADR-300 phase 1)
|
||
- **Date**: 2026-08-11
|
||
- **Deciders**: ruv
|
||
- **Tags**: calibration, provenance, drift, evidence, honesty, substrate
|
||
|
||
## Context
|
||
|
||
This ADR is primitive 1 of the perception-substrate program (ADR-300) and the
|
||
first brick of that program's "certificate spine" (ADR-300 phase 1). It depends
|
||
on the canonical spatial ontology (ADR-306) to name *which space* it
|
||
characterizes, on authenticated sensor identity (ADR-305) to bind a fingerprint
|
||
to *which signed device* produced it, and on the witness chain (ADR-319) to
|
||
anchor the resulting artifact. Its output is consumed directly by
|
||
out-of-distribution detection (ADR-302).
|
||
|
||
WiFi sensing is only reproducible inside the environment it was tuned for.
|
||
Multipath, furniture geometry, transceiver placement, and AP channel all shape
|
||
the CSI distribution, so a model that reads a room correctly one week can drift
|
||
silently the next. RuView already has the raw ingredients for room-aware
|
||
sensing but not a single portable, signed, expiring artifact that says "this is
|
||
the room, here is when it was measured, and here is the evidence that it is
|
||
still the same room."
|
||
|
||
Existing scaffolding to build on, not rebuild (`v2/crates/wifi-densepose-calibration`):
|
||
|
||
- `enrollment` / `anchor` — guided human anchors with an adaptive quality gate.
|
||
- `bank` / `specialist` / `runtime` — a versioned bank of small specialist
|
||
models and a confidence-gated mixture runtime (`RoomState`), including the
|
||
crate's existing honest `STALE` degradation when the ADR-135 empty-room
|
||
baseline drifts.
|
||
- `geometry` / `geometry_embedding` — transceiver-geometry record and its
|
||
fixed-length conditioning featurization (ADR-152).
|
||
|
||
What is missing is (a) an *automatic* observe-only characterization phase that
|
||
does not require a human enrollment ritual, (b) empty-vs-occupied baseline
|
||
separation as a first-class pair, (c) a signed, versioned, comparable
|
||
`CalibrationCertificate` artifact, and (d) explicit invalidation on drift rather
|
||
than a soft `STALE` flag buried in the runtime.
|
||
|
||
## Options considered
|
||
|
||
1. **Keep calibration internal to the runtime (status quo).** Rejected: the
|
||
room characterization exists only as in-process state; it cannot be signed,
|
||
shipped, compared across time, or presented as evidence to ADR-302/ADR-318.
|
||
2. **Build a new calibration crate.** Rejected: `wifi-densepose-calibration`
|
||
already owns enrollment, the specialist bank, geometry embedding, and the
|
||
baseline-drift concept. A parallel crate would fork the room model.
|
||
3. **Extend `wifi-densepose-calibration` with an automatic characterization
|
||
phase and a signed certificate artifact.** Chosen.
|
||
|
||
## Decision
|
||
|
||
Extend `v2/crates/wifi-densepose-calibration` with an `autocal` characterization
|
||
phase and a `certificate` artifact module. The target UX is:
|
||
|
||
> install → observe (~10 min) → room fingerprint → calibration certificate →
|
||
> sensing.
|
||
|
||
### 1. Automatic characterization (`autocal`)
|
||
|
||
- An observe-only pass (default ~10 minutes, configurable) that collects CSI
|
||
without requiring guided human anchors, reusing the `anchor` quality gate to
|
||
reject frames it cannot trust. It layers on the existing ADR-135 empty-room
|
||
baseline rather than replacing it.
|
||
- Produces a `RoomFingerprint`: a bounded, fixed-length statistical summary of
|
||
the room's CSI distribution (subcarrier amplitude/phase moments, multipath
|
||
structure, occupancy-band energy), plus the `geometry_embedding` when a
|
||
geometry record is present. The fingerprint is the distance-comparable object
|
||
ADR-302 measures against; its schema is versioned.
|
||
|
||
### 2. Empty / occupied baseline pair
|
||
|
||
- Characterization establishes a paired baseline: an **empty** distribution
|
||
(no occupant motion) and an **occupied** distribution (motion present),
|
||
separated by the existing occupancy signal rather than a manual label. Both
|
||
are stored on the fingerprint so downstream OOD gating can distinguish "the
|
||
empty room changed" (furniture/geometry drift) from "occupancy statistics
|
||
changed" (different subject dynamics).
|
||
|
||
### 3. `CalibrationCertificate` artifact
|
||
|
||
- A serializable `CalibrationCertificate` binding: the `RoomFingerprint`; a
|
||
space identifier from the ADR-306 ontology; the signing sensor identity from
|
||
ADR-305; `captured_at_unix_s`; a monotonic `version`; a schema version; the
|
||
calibration `tier`; and an `EvidenceLevel` (L0–L5, ADR-282) — an automatic
|
||
characterization on real captured CSI is at most L1/L2 and is labelled as
|
||
such, never L3+.
|
||
- The certificate is **signed** using RuField provenance/signature types
|
||
(ADR-260/262/277/279) and anchored in the witness chain (ADR-319). Signature
|
||
and witness anchoring are mandatory: an unsigned certificate is not a valid
|
||
certificate.
|
||
- Two certificates for the same space are **comparable**: `distance(a, b)`
|
||
returns a bounded fingerprint distance, which is the primitive ADR-302 uses
|
||
to gate KNOWN → DEGRADED → UNKNOWN.
|
||
|
||
### 4. Invalidation and continuous drift compensation
|
||
|
||
- A certificate carries an explicit validity policy: it is invalidated when
|
||
fingerprint distance against live traffic exceeds a threshold, when the AP
|
||
channel or transceiver geometry changes, when the signing device identity
|
||
changes, or on age expiry. Invalidation is an explicit state transition that
|
||
emits a witness record (ADR-319), not a silent `STALE` flag.
|
||
- Continuous drift compensation runs as a bounded online update of the
|
||
fingerprint within a **compatibility envelope**: small drift is absorbed and
|
||
logged; drift beyond the envelope invalidates the certificate and forces
|
||
re-characterization. Compensation never silently rewrites a signed
|
||
certificate — it produces a new version, preserving the append-only history.
|
||
|
||
### Provenance and honesty discipline
|
||
|
||
- No accuracy number is claimed by this ADR; it delivers the artifact and the
|
||
distance/invalidation machinery. Any certificate produced from generated CSI
|
||
is L0/`Synthetic` by construction; the constructor rejects labelling
|
||
synthetic characterization as measured (ADR-279 invariant 6, ADR-282 ladder).
|
||
- Certificates never leave the edge except through the governed control plane
|
||
(ADR-277); a room fingerprint is treated as potentially sensitive spatial
|
||
data, not free telemetry.
|
||
|
||
## Consequences
|
||
|
||
- Room characterization becomes a portable, signed, versioned artifact that
|
||
ADR-302 (OOD), ADR-318 (capability certificates), and ADR-317 (benchmark)
|
||
can consume without re-deriving room state.
|
||
- The automatic observe-only path lowers deployment friction (no mandatory
|
||
enrollment ritual) but yields a weaker evidence level than guided enrollment;
|
||
the certificate states which path produced it so consumers can weight it.
|
||
- Explicit invalidation means RuView will sometimes refuse to sense a changed
|
||
room until re-characterization. That refusal is the intended honest behavior,
|
||
surfaced by ADR-302, not a regression.
|
||
- The existing enrollment/bank/runtime path is preserved; `autocal` is an
|
||
additional entry point that produces the same `RoomFingerprint` object the
|
||
guided path can also emit.
|
||
|
||
## Validation
|
||
|
||
- `cargo test -p wifi-densepose-calibration` — fingerprint determinism from
|
||
fixed synthetic CSI; empty/occupied separation on synthetic occupancy;
|
||
certificate signing/verification round-trip and tamper rejection;
|
||
`distance()` monotonicity on progressively perturbed fixtures; invalidation
|
||
transitions (channel change, geometry change, age, drift-envelope breach)
|
||
each emit the expected witness record; constructor rejects synthetic→measured
|
||
mislabeling.
|
||
- Cross-ADR: an ADR-302 test consumes a certificate and asserts the gating
|
||
state transitions on a drifted fingerprint.
|
||
- Real-silicon characterization (ESP32 capture over a real 10-minute window)
|
||
remains a follow-up requiring hardware evidence per CLAUDE.md; a successful
|
||
build or synthetic run is not hardware evidence.
|