Most monitoring treats stillness as an emergency. Care Ladder treats it as a question: asked out loud, answered by Pat, and only escalated when nobody answers.
Built on OpenCV cues and a configurable ladder of rungs, every incident leaves a complete, ordered audit trail: what was seen, what was asked, who was told, and where it stopped.
Demo / simulator stack · no live camera · no clinical claims
no_movement: stillness past timeout. Source: opencv_cue_detector. Privacy: silhouette.
Re-check confirms the reading. Incident opens.
“Pat, are you okay?”
Listen window closes. Silence: intent unclear, never invented into an OK.
Checking on Pat. Reply 1 to acknowledge · 2 for updates · 3 to call now.
No ack yet. The ladder holds at pressure, then moves to call.
Stub dial to caregiver Jamie · +1 212 555 0101 (reserved fiction).
“I’ve got it from here.”
The vision layer says only what it can defend. Each cue is a structured event with a detector source on the timeline; a covered lens stays camera health, never distress.
no_movement
Stillness. A person-like blob in the plan zone, still past the configured timeout. The timeout itself adapts to the household’s learned routine.
no_visibility
Absence. The monitored person leaves, or cannot be seen in the zone.
camera_occlusion
Covered lens. Lens covered or unreadable: the ladder asks to clear it and informs family on a camera-health basis. No distress claim, no dial.
distress_heuristic
Motion heuristic. A simple motion/pose heuristic, explicitly not a medical assessment.
opencv_dnn_person
Person detection. An optional fifth source: a real photo through the MediaPipe person-detection ONNX via OpenCV 5 DNN. Frames attach as silhouettes, the audit cue tagged with the detector name.
An incident walks the configured rungs of demo_home.yaml. Replies branch the path; acknowledges stand it down; every move appends an audit event.
Re-check before acting. Then a home-speaker check-in: “Are you okay?” or “could you clear the lens?” when the cue is occlusion.
A settle window, interruptible at any moment by an acknowledge: from the console, the family page, or a Telegram reply.
A BotThread inform card (1|2|3) via Telegram or the console fallback. Status language stays calm: Care plan active · Checking on Pat · Camera blocked · Resolved.
Caregiver, then secondary: scripted outcomes only. The emergency rung above it stays fail-closed and disabled by default.
Frames cannot attach to an incident as raw video: the attach path itself maps them through a Gaussian blur or a filled silhouette first, and stamps the audit cue with the proof.
“Do not ship raw identifiable video in demos.”
The repo’s own rule, enforced in code.
Run it locally with no cloud credentials, or open the deployed console and watch a fixture fill the timeline.
./scripts/run_demo.sh: caregiver console at /ui/, interactive docs at /docs.
POST /demo/run {"fixture":"no_movement_silence"}, or push synthetic frames through the real detector with opencv_stillness.
GET /incidents/<id>: ordered events from cue to resolve, ≥3 per incident, every jump logged.
No. It claims no clinical diagnosis. The distress cue is a simple motion/pose heuristic, and the spoken-reply classifier is deterministic; an optional LLM path stays off unless explicitly enabled.
Never. The emergency rung is fail-closed: off by default, audits-only even if enabled. The dialer is a stub; demo phones are reserved fiction (555-01XX); emergency-like numbers are rejected at plan load.
The deployment is: CloudFront → ALB → ECS Fargate, DynamoDB incident store, S3 silhouette clips, EventBridge cue bus. The inputs are not: speaker and dial are simulators, cues arrive from fixtures or controlled frames. CI tests and rolls every push to main; infra notes have the details.
Quiet hours soft-suppress non-distress cues: stillness and absence get a suppress event instead of waking the house. Distress cues still run the ladder.
Open a fixture, watch the transcript fill, and see exactly where the system paused, and where a person took over.
Try the live demo Read the sourceResearch brief · failure modes · competitive landscape, all linked in the footer