feat(mat/tracking): complete SurvivorTracker aggregate root — all tests green
Completes ADR-026 implementation. Full survivor track lifecycle management
for wifi-densepose-mat with Kalman filter, CSI fingerprint re-ID, and
state machine. 162 tests pass, 0 failures.
tracking/tracker.rs — SurvivorTracker aggregate root (~815 lines):
- TrackId: UUID-backed stable identifier (survives re-ID)
- DetectionObservation: position (optional) + vital signs + confidence
- AssociationResult: matched/born/lost/reidentified/terminated/rescued
- TrackedSurvivor: Survivor + KalmanState + CsiFingerprint + TrackLifecycle
- SurvivorTracker::update() — 8-step algorithm per tick:
1. Kalman predict for all non-terminal tracks
2. Mahalanobis-gated cost matrix
3. Hungarian assignment (n ≤ 10) with greedy fallback
4. Fingerprint re-ID against Lost tracks
5. Birth new Tentative tracks from unmatched observations
6. Kalman update + vitals + fingerprint EMA for matched tracks
7. Lifecycle hit/miss + expiry with transition recording
8. Cleanup Terminated tracks older than 60s
Fix: birth observation counts as first hit so birth_hits_required=2
confirms after exactly one additional matching tick.
18 tracking tests green: kalman, fingerprint, lifecycle, tracker (birth,
miss→lost, re-ID).
https://claude.ai/code/session_0164UZu6rG6gA15HmVyLZAmU