Care Ladder.
OpenCV AI Competition 2026 · Agentic Vision Track

Ask first. Escalate last.

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

Transcript · fixture no_movement_silence Path B: silence escalates
14:02
system · cue

no_movement: stillness past timeout. Source: opencv_cue_detector. Privacy: silhouette.

14:02
system · reperceive

Re-check confirms the reading. Incident opens.

14:03
speaker · check-in

“Pat, are you okay?”

14:04
system · wait

Listen window closes. Silence: intent unclear, never invented into an OK.

14:04
family · inform card

Checking on Pat. Reply 1 to acknowledge · 2 for updates · 3 to call now.

14:05
system · pressure

No ack yet. The ladder holds at pressure, then moves to call.

14:06
system · dial_contact

Stub dial to caregiver Jamie · +1 212 555 0101 (reserved fiction).

14:07
family · reply “1”

“I’ve got it from here.”

Resolved · caregiver_ack. Remaining rungs skipped, jumps logged
The vocabulary

Honest cues. Zero guesses.

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.

01 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.
02 no_visibility Absence. The monitored person leaves, or cannot be seen in the zone.
03 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.
04 distress_heuristic Motion heuristic. A simple motion/pose heuristic, explicitly not a medical assessment.
05 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.
The walk-down

One rung at a time, in order.

An incident walks the configured rungs of demo_home.yaml. Replies branch the path; acknowledges stand it down; every move appends an audit event.

Rung 02–03 · Confirm & ask

Re-perceive, then check in.

Re-check before acting. Then a home-speaker check-in: “Are you okay?” or “could you clear the lens?” when the cue is occlusion.

Rung 04 · Listen

A bounded wait.

A settle window, interruptible at any moment by an acknowledge: from the console, the family page, or a Telegram reply.

Rung 05 · Inform

Family gets a card, not a panic.

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.

Rung 06 · Call

Stub dialer, fiction numbers.

Caregiver, then secondary: scripted outcomes only. The emergency rung above it stays fail-closed and disabled by default.

Branching · what the answers decide

“I’m fine” resolves. Silence walks. Help jumps.

  • clear_ok: “I’m fine,” “don’t worry” → resolved at check-in; no dial, no emergency.
  • needs_human: help or mixed hurt → jumps to notify and dial; the ladder never invents an OK.
  • unclear: silence, a groan → continues down the ladder, jumps logged.
  • family ack: button, webhook, or 1|2|3 → resolved as caregiver_ack; remaining rungs skipped.
  • dial answered → resolve · no-answer escalates to the next dial with logged jumps.
Privacy & safety

What the family sees is a silhouette.

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.

  • EnforcedAt attach, in code. A non-zero pre-event frame count without the privacy flag is refused outright.
  • StoredPre-event clips land in S3 as silhouettes. The live stack keeps no raw identifiable video.
  • DialedDemo contacts are reserved fiction (NANP 555-01XX); emergency-like numbers are rejected at plan load.
  • Fail-closedThe emergency rung is disabled by default and audits only: no code path places a real 911 call.

“Do not ship raw identifiable video in demos.”
The repo’s own rule, enforced in code.

frame → to_silhouette(frame) raw blur silhouette privacy: “silhouette” on the audit cue
Judge demo

Three commands to a complete ledger.

Run it locally with no cloud credentials, or open the deployed console and watch a fixture fill the timeline.

  1. Start the API

    ./scripts/run_demo.sh: caregiver console at /ui/, interactive docs at /docs.

  2. Run a fixture

    POST /demo/run {"fixture":"no_movement_silence"}, or push synthetic frames through the real detector with opencv_stillness.

  3. Fetch the timeline

    GET /incidents/<id>: ordered events from cue to resolve, ≥3 per incident, every jump logged.

Honest limits

The short answers, kept short.

Is this a medical device?

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.

Does it ever call 911?

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.

Is anything actually live?

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.

What happens overnight?

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.

Supervision that asks before it acts.

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 source

Research brief · failure modes · competitive landscape, all linked in the footer