Skip to content

Add check-in-companion: daily check-ins with a family digest - #390

Open
hassan1731996 wants to merge 2 commits into
openhome-dev:devfrom
hassan1731996:add-check-in-companion
Open

hassan1731996 wants to merge 2 commits into
openhome-dev:devfrom
hassan1731996:add-check-in-companion

Conversation

@hassan1731996

Copy link
Copy Markdown
Contributor

What does this Ability do?

A daily check-in for someone who lives alone, such as an older parent, with a short evening email for their family. At set times the speaker asks one warm question and understands the answer. A missed check-in gets one gentle retry, then an email to family. A mention of a fall, chest pain or trouble breathing gets a spoken "please call..." prompt and an urgent email. The evening digest says answered or missed, a mood word, any worry types and only the news the person was happy to share. It never sends a transcript.

Amazon retired Alexa Together, and what's left elsewhere only reports that the device was used. This is the "check in on an elderly resident" use case from OpenHome's spatial intelligence post. It's not an emergency service, and the README and first-run speech say so.

How it differs from existing abilities

  • medication-reminder reminds about pills. This asks how the person is and closes the loop with family.
  • panic-protocol calls contacts when the user asks for help. This notices when they don't answer, or mention a worry without asking, and points to panic-protocol for emergencies.
  • KindMind and celebration-engine talk only to the user.

Suggested Trigger Words

  • check in
  • check-in
  • I'm here
  • check-in settings
  • what have you told my family

Scheduled check-ins need no trigger. The background daemon asks at the set times.

Type

  • New community Ability
  • Improvement to existing Ability
  • Bug fix
  • Documentation update

External APIs

  • No external APIs
  • Uses external API(s): Gmail API (users/me/messages/send) through the linked Google account (get_token("google")). SMTP through send_email() is the fallback, with the optional keys checkin_sender_email / checkin_sender_password. Family recipients come from the checkin_family_emails key.

Testing

  • Tested in OpenHome Live Editor
  • All exit paths tested (said "stop", "exit", etc.)
  • Error scenarios tested (API down, bad input, etc.): storage read failure, Gmail failure with SMTP fallback, malformed LLM JSON and no recipients set are covered in offline tests.

Checklist

  • Files are in community/check-in-companion/
  • main.py follows SDK pattern (extends MatchingCapability, has register_capability + call)
  • README.md included with description, suggested triggers, and setup
  • resume_normal_flow() called on every exit path
  • No print() — using editor_logging_handler
  • No hardcoded API keys — using placeholders
  • No blocked imports (redis, user_config)
  • No asyncio.sleep() or asyncio.create_task() — using session_tasks
  • Error handling on all external calls
  • Tested in OpenHome Live Editor

Anything else?

Design notes, following earlier review feedback

  • Daemon: background_daemon_mode is set before CapabilityWorker(self). The daemon polls every 60s, never awaits user_response() and never calls resume_normal_flow(). It reads answers from get_full_message_history() on its next poll.
  • Storage: state is kept in Context Storage (checkin_state). Saves use create_key then update_key and check success. A failed read skips the poll, so it can never wipe data. A checkin_busy key keeps the daemon out while the skill is open.
  • Conversation:
    • Intents are routed by an LLM.
    • Confirmations go through an LLM classifier that allows a change ("no, make it ten").
    • Exit is checked at every prompt, including nested ones, by matching the whole utterance. "I'm good" and "nothing" count as check-in answers, not exits.
    • Times are spoken as "7 in the evening", never as 24-hour times.
  • Profile: the name is read only from user_profile.md / user_summary.md, which are never written. User text is nonce-fenced as untrusted in every prompt.
  • Logs: event types only, never words, names or email addresses.
  • Agent hint: checkin_context.md is written (delete then write) only while a question is open, so the Agent answers warmly and gives no medical advice.

A daily check-in for someone who lives alone. A background daemon asks a
short question at set times, reads the answer from the conversation, retries
once, and emails family if a check-in is missed. Mentions of a fall, chest
pain or trouble breathing trigger a spoken safety prompt and an urgent email.
An evening digest shares answered/missed status, a mood word, worry types and
only the notes the person agreed to share, never transcripts.

The voice skill handles check-in now, times, pause, privacy, the emergency
number and status. State lives in Context Storage; it is not an emergency
service.
@hassan1731996
hassan1731996 requested a review from a team as a code owner November 1, 2026 09:36
@github-actions

github-actions Bot commented Nov 1, 2026

Copy link
Copy Markdown
Contributor

🔀 Branch Merge Check

PR direction: add-check-in-companion → dev

✅ Passed — add-check-in-companion → dev is a valid merge direction

@github-actions

github-actions Bot commented Nov 1, 2026

Copy link
Copy Markdown
Contributor

✅ Community PR Path Check — Passed

All changed files are inside the community/ folder. Looks good!

@github-actions github-actions Bot added the community-ability Community-contributed ability label Nov 1, 2026
@github-actions

github-actions Bot commented Nov 1, 2026

Copy link
Copy Markdown
Contributor

✅ Ability Validation Passed

📋 Validating: community/check-in-companion
  ✅ All checks passed!

@github-actions

github-actions Bot commented Nov 1, 2026

Copy link
Copy Markdown
Contributor

🔍 Lint Results

✅ __init__.py — Empty as expected

Files linted: community/check-in-companion/background.py community/check-in-companion/main.py

✅ Flake8 — Passed

✅ All checks passed!

Read-only, optional sources, skipped when the ability isn't installed:
- medication-reminder: a spoken aside when a dose is overdue and not
  marked taken; never included in family emails
- timers-alarms-reminders: today's reminders for a personal question
- social-memory: family names and relationships only, never snippets
- memory-mirror: a corrected name

Review fixes: help offers two options then more (openhome-dev#209); pause and
emergency confirmations accept a change (openhome-dev#209); shorter first-run intro.

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

community-ability Community-contributed ability

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant