Add life-admin-tracker: voice renewals and expiry tracking with proactive nudges - #359
Add life-admin-tracker: voice renewals and expiry tracking with proactive nudges#359hassan1731996 wants to merge 5 commits into
Conversation
🔀 Branch Merge CheckPR direction: ✅ Passed — |
✅ Community PR Path Check — PassedAll changed files are inside the |
…king with proactive daemon nudges - Tracks passports, MOT, insurance, subscriptions, warranties by voice - LLM extracts dates from natural speech (next March, in 3 years, etc.) - ADD flow: 3 exchanges max; single-exchange if item+date in trigger - CHECK groups items by urgency (urgent/soon/upcoming) spoken in priority order - RENEW chains automatically: marks done, asks for next date, resets nudge cycle - COST intent: subscription spend summary with monthly and annual totals - Background daemon: hourly check, nudges at 90/30/7-day thresholds (each once), daily inside 7-day window - Multiple urgencies batched into one spoken message - Outer while loop with user_response() for multi-turn sessions
e9c651e to
a16b65a
Compare
✅ Ability Validation Passed |
🔍 Lint Results✅
|
uzair401
left a comment
There was a problem hiding this comment.
Hey @hassan1731996, hope you're doing great.Great work on this one, the renewal tracking is genuinely useful and the daemon nudge de-duplication is done really well.
Two things:
In main.py the EXIT_WORDS set includes "all", and the follow-up loop checks for exit before classifying intent, so normal phrases like "show me all my renewals" or "list all" end the session instead of listing. I think "all" was added to catch "that's all", but it over-reaches. Better to drop the bare "all" and match the phrase "that's all" / "thats all" instead.
One nice improvement: setup asks the user for their name, but you can read it from the platform profile instead. The memory system keeps user_profile.md and user_summary.md in persistent storage, so you can pull them with read_file("user_profile.md", in_ability_directory=False) (and user_summary.md) and use the name from there, only asking if they're empty. Just read them, never write them, they're platform owned. There's more in docs/Agent-Memory-and-Context-Injection.md.
Same idea as I mentioned on the other PR, pulling the name and other details from the profile instead of asking each time automates the data gathering and saves the user the manual back and forth, which makes for a much smoother UX.
Thanks for this, nice work.
…ead name from platform profile
- Remove bare 'all' and 'thats' from EXIT_WORDS; add EXIT_PHRASES set for
full-phrase exits ('that's all', 'thats all') to prevent false exits on
commands like 'show me all my renewals' or 'list all'
- Update _is_exit() to check EXIT_PHRASES via substring before token check
- Read user name from user_profile.md / user_summary.md on setup; only ask
if platform profile is empty
What This Does
A persistent voice assistant that tracks everything with an expiry date — passports, MOT, car insurance, subscriptions, warranties, boiler services — and automatically reminds you before they're due. Log once by voice, never forget a renewal again.
Why This Is Different from Alexa
Key UX Decisions
Background Daemon
Runs hourly. Nudge schedule per item:
SDK Patterns
create_keyfirst withsuccesscheck, fallbackupdate_keycall():background_daemon_modeset beforeCapabilityWorkerresume_normal_flow()infinallyblock and at top ofwatch_loop()while Trueloop withuser_response()for multi-turn sessions