Reconnect/state/idempotency logic is implemented and unit-tested; the
unmet acceptance is on-site Hikvision preview (T-203) and consented fall
and counter-example recordings with field safety (T-204, T-205). Not
marked DONE without real observable evidence.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
AlertDispatcher de-duplicates by event_id and fires each side effect once
per CONFIRMED: annotated screenshot, one JSONL line (config_version,
source_id, no rtsp/credentials), sound and popup via injectable sink.
44 tests pass; real-frame artifact smoke verified.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Qt-free view_model builds monitor view state and isolates the settings
draft from the running config snapshot; gui.py/app.py are a thin PyQt5
shell that only renders already-decided FrameAnalysis. 39 tests pass.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>