move_detect/tests
유창욱 3240428380 fix(edge): require sustained non-prone before FallDetector recover (FIX 2)
edge/detectors/fall.py update(): a single frame where prone was false while
state was in {FALLING, FALLEN, NO_MOTION} immediately emitted "recover" and
reset _State. One jittery frame (a momentary pose-estimation miss) could
wipe an in-progress CRITICAL no_motion incident.

Add FallConfig.recover_grace_s (default 1.0s) and _State.not_prone_since.
On the first non-prone frame while in an incident state, start the grace
timer instead of recovering immediately; only reset to STANDING once
recover_grace_s of sustained non-prone has elapsed. A re-prone frame while
in an incident state clears the pending grace timer (cancels the recover
attempt). The non-incident STANDING path is unchanged.

BEHAVIOR CHANGE: recover now requires recover_grace_s of sustained
non-prone instead of firing on a single frame.

Tests: test_recovery_clears_state (tests/test_fall.py) strengthened per
review brief to assert a single standing frame does NOT recover but
sustained standing across the grace window does. Added
test_single_noisy_nonprone_frame_does_not_cancel_no_motion covering the
life-safety scenario: one noisy non-prone frame during NO_MOTION must not
cancel the incident.
2026-07-11 22:15:47 +09:00
..
test_alert.py feat(edge): PostClient with HMAC+nonce signed event POST 2026-07-11 21:27:38 +09:00
test_app.py fix(edge): smooth keypoints per-track after tracking, not before (FIX 1) 2026-07-11 22:14:03 +09:00
test_config.py test(edge): cover ghost/zone env overrides and config defaults 2026-07-11 21:43:35 +09:00
test_engine.py test(edge): add genuine EventEngine cooldown primitive test 2026-07-11 21:18:27 +09:00
test_events.py feat(edge): Event model + severity mapping (§7.3 payload) 2026-07-11 20:34:57 +09:00
test_fall.py fix(edge): require sustained non-prone before FallDetector recover (FIX 2) 2026-07-11 22:15:47 +09:00
test_geometry.py feat(edge): pose geometry utils (torso angle, com, normalization) 2026-07-11 20:18:03 +09:00
test_ghost.py feat(edge): GhostIncidentDetector (collapse-then-occluded spatial incident) 2026-07-11 20:59:31 +09:00
test_immobility.py feat(edge): ImmobilityWatchdog (posture-independent prolonged immobility) 2026-07-11 20:51:33 +09:00
test_models.py feat(edge): data models (Keypoint, BBox, Person) + COCO indices 2026-07-11 20:13:00 +09:00
test_queue.py feat(edge): OfflineQueue (SQLite persist + ordered resend) 2026-07-11 21:33:43 +09:00
test_smoothing.py fix(edge): smooth keypoints per-track after tracking, not before (FIX 1) 2026-07-11 22:14:03 +09:00
test_snapshot.py feat(edge): RingBuffer + face blur + JPEG snapshotter 2026-07-11 21:21:57 +09:00
test_tracking.py feat(edge): Track model + IoU tracker with lost-track reporting 2026-07-11 20:28:45 +09:00
test_zone.py feat(edge): ZoneIntrusionDetector (foot-anchor point-in-polygon, debounce) 2026-07-11 21:05:42 +09:00