move_detect/edge
유창욱 f7266f5980 fix(edge): identity-aware GHOST dedup keyed on track_id (FIX 4)
edge/engine.py keyed the ghost cooldown as
(GHOST, round(x), round(y)) — purely spatial, ignoring track identity.
Two distinct workers collapsing at ~the same pixel within the cooldown
window would suppress each other's ghost event, potentially masking a
second CRITICAL incident.

edge/detectors/ghost.py GhostIncidentDetector.update now includes the
candidate's track_id in each emitted dict. edge/engine.py keys the
cooldown as (EventType.GHOST, track_id) and sets the emitted Event's
track_id accordingly, matching how FALL/NO_MOTION/IMMOBILITY/zone events
are already keyed per-track.

Tests: tests/test_ghost.py asserts ghosts[0]["track_id"] == 1 on the
existing reappear-timeout test.
2026-07-11 22:17:48 +09:00
..
adapters feat(edge): hardware adapter stubs + Pi bring-up/benchmark doc 2026-07-11 21:54:24 +09:00
detectors fix(edge): identity-aware GHOST dedup keyed on track_id (FIX 4) 2026-07-11 22:17:48 +09:00
__init__.py feat(edge): data models (Keypoint, BBox, Person) + COCO indices 2026-07-11 20:13:00 +09:00
alert.py feat(edge): PostClient with HMAC+nonce signed event POST 2026-07-11 21:27:38 +09:00
app.py fix(edge): smooth keypoints per-track after tracking, not before (FIX 1) 2026-07-11 22:14:03 +09:00
config.py feat(edge): env-based Config for detectors and transport 2026-07-11 21:40:06 +09:00
engine.py fix(edge): identity-aware GHOST dedup keyed on track_id (FIX 4) 2026-07-11 22:17:48 +09:00
events.py feat(edge): Event model + severity mapping (§7.3 payload) 2026-07-11 20:34:57 +09:00
geometry.py feat(edge): pose geometry utils (torso angle, com, normalization) 2026-07-11 20:18:03 +09:00
models.py feat(edge): data models (Keypoint, BBox, Person) + COCO indices 2026-07-11 20:13:00 +09:00
ports.py feat(edge): Track model + IoU tracker with lost-track reporting 2026-07-11 20:28:45 +09:00
queue.py feat(edge): OfflineQueue (SQLite persist + ordered resend) 2026-07-11 21:33:43 +09:00
smoothing.py fix(edge): smooth keypoints per-track after tracking, not before (FIX 1) 2026-07-11 22:14:03 +09:00
snapshot.py feat(edge): RingBuffer + face blur + JPEG snapshotter 2026-07-11 21:21:57 +09:00
tracking.py feat(edge): Track model + IoU tracker with lost-track reporting 2026-07-11 20:28:45 +09:00