mirror of
https://github.com/ruvnet/RuView
synced 2026-08-11 20:41:44 +00:00
Merge remote-tracking branch 'origin/main' into resolve-1579-conflict
# Conflicts: # docs/adr/README.md
This commit is contained in:
@@ -0,0 +1,135 @@
|
||||
# ADR-307: Persistent identity & tracking — privacy-preserving probabilistic tracks
|
||||
|
||||
- **Status**: Accepted — initial implementation (ADR-300 phase 2)
|
||||
- **Date**: 2026-08-11
|
||||
- **Deciders**: ruv
|
||||
- **Tags**: tracking, identity, privacy, fusion, worldgraph, phase-2
|
||||
|
||||
## Context
|
||||
|
||||
This ADR is a child of **ADR-300** and owns primitive #7, *persistent identity
|
||||
& tracking*. In the ADR-300 DAG it is a phase-2 primitive sitting on the
|
||||
phase-1 spine: it **consumes the ADR-306 ontology** (producing and updating the
|
||||
`Track` and `Person` node types defined there), it relies on **ADR-305**
|
||||
authenticated identity so that the observations it associates have a verified
|
||||
origin, and its outputs are governed `Event`s that ADR-318/ADR-319 can certify
|
||||
and witness.
|
||||
|
||||
The product need is to reason about *persistent entities* — "person_7 entered
|
||||
the kitchen, then the hallway, then the bedroom" — across radios, modalities,
|
||||
rooms, and time. The hard constraint is that this must happen **without
|
||||
establishing civil identity**. RuView is camera-free (ADR-282), and a
|
||||
persistent pseudonymous track must never become, or be joinable to, a real-
|
||||
world named individual. This is a privacy property to be enforced *by
|
||||
construction*, not a policy footnote.
|
||||
|
||||
Substantial scaffolding already exists in
|
||||
`v2/crates/wifi-densepose-mat/src/tracking` and must be **reused/extended, not
|
||||
rebuilt**:
|
||||
|
||||
- `SurvivorTracker`, `TrackedSurvivor`, `TrackId`, `TrackerConfig`,
|
||||
`TrackLifecycle`, and `TrackState` — a multi-target tracker with lifecycle
|
||||
(tentative/active/lost/terminal) and a `TrackId` backed by a UUID
|
||||
(`as_uuid`).
|
||||
- `KalmanState` with `predict`/`update`, `position`, `velocity`,
|
||||
`position_uncertainty`, and `mahalanobis_distance_sq` — the motion model and
|
||||
gating distance.
|
||||
- `CsiFingerprint`, `DetectionObservation`, `AssociationResult`, and the
|
||||
`can_reidentify`/`matches`/`mark_rescued`/`rescue` re-identification surface —
|
||||
the appearance/fingerprint channel for track continuity.
|
||||
|
||||
What is missing is (a) continuity **across radios, modalities, and rooms** (the
|
||||
tracker today reasons within a node/room context), (b) a **persistent** entity
|
||||
that survives track loss and hand-off between spaces, and (c) an explicit
|
||||
**privacy boundary** that guarantees no civil-identity binding.
|
||||
|
||||
## Options considered
|
||||
|
||||
1. **Per-room independent trackers, no cross-room identity.** Rejected: cannot
|
||||
express "person_7 moved kitchen → hallway → bedroom"; loses the entity at
|
||||
every room boundary.
|
||||
2. **Global identity keyed on a strong biometric fingerprint.** Rejected: a
|
||||
fingerprint strong enough to re-identify across long gaps trends toward a
|
||||
civil-identity-grade biometric — exactly what the privacy constraint
|
||||
forbids.
|
||||
3. **Probabilistic persistent tracks with bounded, decaying pseudonymous
|
||||
association, built on the existing MAT tracker.** Chosen.
|
||||
|
||||
## Decision
|
||||
|
||||
Extend `wifi-densepose-mat/tracking` into a **cross-domain persistent track
|
||||
layer** that produces ADR-306 `Track`/`Person` nodes.
|
||||
|
||||
### 1. Persistent probabilistic entity
|
||||
|
||||
- A persistent entity is a pseudonymous `Person` node (ADR-306) with a stable
|
||||
synthetic id (e.g. `person_7`) backed by the existing `TrackId`/UUID. It
|
||||
aggregates one or more `SurvivorTracker` tracks over time and space and holds
|
||||
a **probabilistic** continuity belief — association is never asserted as
|
||||
certain, and every hand-off carries a confidence.
|
||||
- Continuity across a track-loss gap reuses the existing re-identification
|
||||
surface (`can_reidentify`, `CsiFingerprint`, `AssociationResult`), extended
|
||||
with a **time- and distance-decayed** association prior so that confidence in
|
||||
"same entity" falls with the size of the gap. Beyond a bounded horizon the
|
||||
association is dropped and a new pseudonym is minted rather than forcing a
|
||||
join — under-linking is the privacy-safe failure mode.
|
||||
|
||||
### 2. Cross-radio / cross-modality / cross-room continuity
|
||||
|
||||
- Association operates over the ADR-306 ontology graph: `Observes` edges from
|
||||
multiple `Sensor`s and `AdjacentTo`/`Doorway` topology constrain plausible
|
||||
hand-offs (a person can only move between adjacent spaces). The existing
|
||||
`mahalanobis_distance_sq` gating extends to a fused observation across
|
||||
modalities rather than a single node's detections.
|
||||
- Fusion here is track-level association; the underlying multi-modality fusion
|
||||
(radar/mmWave per ADR-063, multistatic per ADR-029, and real sensor fusion
|
||||
per ADR-311) supplies the observations. This ADR depends on those for the raw
|
||||
cross-modality evidence and does not re-implement sensor fusion.
|
||||
|
||||
### 3. Privacy boundary (by construction)
|
||||
|
||||
- **No civil-identity binding.** The persistent id is a synthetic pseudonym
|
||||
with no field, edge, or join key to any name, account, phone, MAC, or other
|
||||
civil identifier. The type carries no such field, so binding is impossible in
|
||||
the schema, not merely discouraged.
|
||||
- The `CsiFingerprint` used for re-identification is **bounded and decaying**:
|
||||
it is scoped to short-horizon continuity, is not persisted as a long-term
|
||||
biometric template, and expires. This keeps re-identification useful for
|
||||
"same person across the hallway" while structurally unable to serve "this is
|
||||
the same person who visited last month."
|
||||
- Every `Track`/`Person`/`Event` produced carries `SemanticProvenance` and an
|
||||
`EvidenceLevel` (ADR-282), and honors the ADR-277/ADR-280 edge governance and
|
||||
ADR-141 attestation — a pseudonymous track is still governed P-class data.
|
||||
Tracking accuracy is a per-domain claim to be tagged MEASURED/CLAIMED/
|
||||
SYNTHETIC with a reproducer; **this ADR claims no accuracy number.**
|
||||
|
||||
## Consequences
|
||||
|
||||
- RuView can express persistent, cross-room trajectories for automation and
|
||||
analytics while remaining camera-free and civil-identity-free.
|
||||
- The privacy-safe failure mode is **under-linking** (mint a fresh pseudonym
|
||||
when unsure), which will fragment a trajectory across long gaps or sparse
|
||||
coverage. This is a deliberate trade: a fragmented pseudonym is safe, a
|
||||
wrong civil-identity join is not.
|
||||
- Extends an existing tracker rather than forking one; single-room single-radio
|
||||
deployments keep the current behavior (one entity = one track).
|
||||
- Cross-modality quality depends on ADR-311/ADR-063/ADR-029 landing; until then
|
||||
continuity is WiFi-primary and its limits are stated, not hidden.
|
||||
- Being phase 2, this ADR is design intent; it will be revised as the ADR-306
|
||||
ontology and ADR-305 identity spine finalize.
|
||||
|
||||
## Validation
|
||||
|
||||
- Unit tests (`cargo test -p wifi-densepose-mat`): decayed association prior
|
||||
(confidence falls with gap; drops beyond horizon → new pseudonym);
|
||||
topology-constrained hand-off (no association across non-adjacent spaces);
|
||||
schema check that a `Person`/`Track` carries no civil-identifier field.
|
||||
- Integration test against a synthetic multi-room, multi-radio scenario:
|
||||
a scripted walk kitchen → hallway → bedroom yields one persistent pseudonym
|
||||
with per-hand-off confidence, and a deliberately ambiguous crossing produces
|
||||
two pseudonyms rather than a false join.
|
||||
- Evidence discipline: any tracking-continuity accuracy is reported only with
|
||||
the ADR-291 leakage-free protocol and an evidence tag; no number is asserted
|
||||
here.
|
||||
- Privacy review: confirm no persisted long-term biometric template and no
|
||||
civil-identity join path, as an explicit checklist item before any pilot.
|
||||
Reference in New Issue
Block a user