跳转至

Infrastructure — 03-25 健康监控与日报系统

背景

Dad 住院期间(3/25 入院,3/29 出院),要求 bot 总结住院情况并接管术后恢复提醒。Dad 明确强调:提醒的时机和执行可靠性很重要。 这推动了从"知识整理"升级为"自动提醒系统"的实现。

出院医嘱结构化

Bot 的关键决策

将出院文档中的药物、换药流程、复查时间、风险提示整理为可执行清单,固化到健康档案。

护理流程模块化

将复杂护理流程抽象为"早中晚三个护理技能":

  • care-morning.md:吃药(痛血康 + 大柴胡 + 小金胶囊)→ 换药(含塞栓)
  • care-noon.md:吃药(痛血康 + 地奥司明)→ 散步 → 按摩操
  • care-evening.md:吃药(痛血康 + 地奥司明)→ 按摩操 → 换药(不塞栓

选型理由:模块化降低了因临时生成而出错的概率,便于 bot 记忆维护和提醒文案复用。

Dad 的人工纠偏

Bot 初版提醒与医嘱存在多处偏差,Dad 逐条纠正:

问题 Bot 初版 Dad 纠正
地奥司明服用时间 早晚 中午 + 晚上
晚上换药 含塞栓 不塞栓
痛血康频次 2 次/日 3 次/日(漏掉中午)
坐浴中药/黄柏液 未强调 仅外用,绝对不能口服
复查安排 4/2 + 4/3 两天 只保留 4/2 上午

关键教训:Bot 在从文档到执行计划的映射中容易遗漏或错配,医嘱类场景必须经过人工纠偏。

提醒系统技术演进

第一版:Heartbeat 方案(失败)

  • 方案:通过 heartbeat 轮询实现主动提醒
  • 问题:heartbeat 适合巡检,不适合精确定点提醒
  • 额外发现openclaw system event 不支持 --agent 参数,无法精确指定 health agent

第二版:Cron + TTS + Mattermost(成功)

选型理由:cron 更适合固定时间点任务,可以直接调用脚本生成语音并发送消息,绕过 agent 路由限制。

调度:系统 crontab
脚本:workspace-health/scripts/remind.sh
TTS:edge-tts
发送:openclaw message send --account health --channel mattermost
辅助:保留 heartbeat 每 2 小时巡检

踩坑:消息发错账号

Dad 收到测试语音,但发现不是发在 health 的 DM 里。根因是发送脚本未指定正确 Mattermost account。

修复:在脚本中加入 --account health,确保消息发到正确的 DM。

稳定运行的提醒时间表

时间 内容
08:00 早上吃药
09:00 早上换药(坐浴 → 涂药 → 塞栓 → 敷料)
13:00 中午吃药
15:00 散步 20-30 分钟
19:00 晚上吃药
20:00 腹部按摩操
21:30 睡前换药(坐浴 → 涂药 → 敷料,不塞栓

3/30 起连续多日稳定执行,提醒系统从"调试阶段"进入"稳定服务阶段"。

Web App 需求抽象

Dad 的产品化决策

纯 DM 提醒虽然可用,但不利于整体查看。Dad 决定把护理计划产品化为内网 Web App。

技术栈升级路径

  • 初版 PRD:纯前端 SPA + localStorage
  • Dad 最终决策:React + Vite + Python + SQLite

核心功能

  1. 每日护理看板:时间轴展示 + 勾选完成 + 逾期标红
  2. 护理流程详情:早晚换药步骤、按摩操
  3. 浏览器通知提醒:到点 Notification + 声音
  4. 用药方案页:药物表格 + 早/中/晚矩阵
  5. 康复时间线:术后天数 + 状态记录
  6. 注意事项页:紧急情况 + 医生电话

能力边界管理

Bot 明确说明:health agent 没有 allowAgents 权限,不能直接调用 main agent。因此采用"输出 PRD + 提示词,由 Dad 手动发给 main agent"的方案。这是一次重要的系统边界管理。

关键经验

  1. Heartbeat 不适合精确定时提醒:应使用 cron
  2. 医嘱映射必须人工纠偏:Bot 自主推断容易遗漏
  3. 消息发送要指定 account:否则可能发到错误的 DM
  4. 护理知识要模块化:降低错误率,便于维护
  5. 能力边界要透明:Bot 做不到的事明确说出来,不要硬撑