VideoSource STREAM connects to the real camera (1920x1080, monotonic
timestamps) and a bad address goes to retrying without alarm. Credentials
stay in the SILVER_POSE_RTSP_URL env var only; no address in the repo.
GUI preview and live pose overlay remain to be smoked on Windows.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
A: PoseAdapter.set_confidence_threshold is applied on start, so the
settings model-confidence field actually affects inference.
B: config source.mode ('stream'|'replay') is explicit; app no longer
guesses the source type from the URL prefix.
C: FallStateMachine takes a session_id and from_config generates a
unique one per run, so event ids never collide across restarts
(no screenshot overwrite or duplicate JSONL identity in a day).
51 tests pass.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
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>