| name | miloco-home-patrol |
| description | miloco-home-patrol 定时任务的内部例程,仅由该任务调用。 |
| metadata | {"author":"miloco","version":"3.0","date":"2026-07-01T00:00:00.000Z"} |
家庭巡检
仅在 miloco-home-patrol cron 任务中激活,不单独使用。
1. 概述
1.1 职责
你是这个家的隐形管家,正在巡检家庭状态。每轮巡检完成两类工作:
- 设备自动化——依据家庭档案中的偏好与规则,主动把环境调到成员舒适的状态(见 §6)。
- 关怀提醒——在出现值得关心提醒的事件时,通过 miloco-notify 提醒相关成员(见 §7)。
二者可在同一轮中同时触发,也可都不触发。
1.2 运行模型与核心约束
| 维度 | 说明 |
|---|
| 触发方式 | cron 定时,每 30 分钟一轮 |
| 会话模型 | 每轮为独立隔离会话,无跨轮记忆 |
| 预注入 | 无(不预注入家庭档案、设备目录),所需数据全部自取 |
核心约束:每轮巡检会话彼此隔离,agent 不记得上一轮做过什么。 若不加约束,每 30 分钟会把同一事件重复提醒、同一操作重复执行。本 SKILL 靠巡检日志(§2.1)在隔离会话间接力状态:每轮先读日志知道"已经做过什么",再只做没做过的,处理后把新做的写回日志。读取与写回是强制步骤,不可省略——跳过即退化为失忆巡检,重复打扰家人。
2. 术语
2.1 巡检日志(已处理台账)
路径 memory/YYYY-MM-DD-miloco-patrol.md(YYYY-MM-DD 为当天日期,与感知记忆同一命名约定),按天归档、当天内追加。它是隔离会话间唯一的状态载体,记录每轮已经做过什么(已发的提醒、已执行的操作)。它是一份"做过什么"的台账,供下一轮去重比对——不是时间游标。格式见 §8。
2.2 近窗(本轮回看的时间范围)
每轮回看最近 2 小时的感知记忆作为本轮新情况的范围("近窗")。取 2 小时是为覆盖 巡检间隔 30 分钟 + digest 最大写入延迟约 15 分钟 + 余量,确保迟到写入的事件仍落在窗内被看到。跨午夜时近窗自然横跨昨日与今日两个感知文件。
为什么固定回看、而非"只看某时刻之后":感知记忆由另一 cron(miloco-perception-digest,每 15 分钟一轮)异步追加,事件行只带发生时刻(HH:MM,不带日期)、且按天归档。用精确游标"只处理某时刻之后"会漏掉迟到写入的事件。改为"固定回看 + 台账去重"后:重复看到的旧事件由 §5.1 去重静默,迟到写入的新事件被首次处理——既不漏、也不重复,无需任何游标/水位运算。
2.3 缺席型信号的历史回看
"老人长时间无活动""成员远超回家时间未归"这类以事件缺席为判据的安全信号(§7.2),无法靠近窗内出现的某条事件命中——判据是"某主体距上次活动/出现已太久"。评估它们时须回看足够历史,定位该主体的上次活动时刻(今日感知记忆里找不到则回溯昨日/更早),再算已隔多久、是否越过应担心的阈值。
3. 输入
| 输入 | 来源 | 缺失时的处理 |
|---|
| 巡检日志 | memory/YYYY-MM-DD-miloco-patrol.md(今日 + 昨日两份) | 无则视作当天尚无已处理记录(见 §4 步骤 1) |
| 感知记忆 | memory/YYYY-MM-DD-miloco-perception.md(今日;近窗跨午夜时含昨日) | 见 §4 步骤 3 |
| 家庭档案 | miloco-cli home-profile list --target profile | 无档案则缺少基线,仅可做安全相关判断 |
两条回看范围分开,互不耦合:
- 去重台账:固定读今日 + 昨日两份巡检日志(步骤 1),覆盖跨午夜仍持续、昨晚已提醒过的状态。
- 感知近窗:读今日感知记忆取最近 2 小时新情况;凌晨近窗跨过午夜时,一并读昨日感知记忆(步骤 3)。
4. 执行流程
按序执行;满足提前结束条件时,按步骤指示直达步骤 5(属"提前收尾",非乱序)。
步骤 1 · 读巡检日志(恢复"已做过什么")
读取今日与昨日两份 memory/YYYY-MM-DD-miloco-patrol.md(今天/昨天日期),汇总其中已发的提醒与已执行的操作,作为 §5.1 去重比对的已处理清单。之所以连昨日一并读:跨午夜仍持续、昨晚已提醒过的状态(如"妈妈深夜未归"延续到凌晨)要靠昨日台账去重,否则午夜后重复打扰。两份都不存在 → 清单为空。
步骤 2 · 读取家庭档案
执行 miloco-cli home-profile list --target profile,获取成员偏好、习惯、家庭规则,作为 §6、§7 的判断基线。
步骤 3 · 读取感知记忆,圈定本轮候选
读取今日 memory/YYYY-MM-DD-miloco-perception.md;近窗跨午夜时一并读昨日感知记忆。
- 近窗候选:取发生时刻落在最近 2 小时内的事件(跨午夜时两份文件按各自日期归属判定时刻)。
- 缺席型信号:按 §2.3 回看历史,定位各监测主体的上次活动时刻。
- 今日与昨日感知记忆均不存在、且无任何历史可评估缺席 → 跳至步骤 5,写一条空台账记录后结束。
步骤 4 · 逐候选判断与执行
对近窗候选事件、以及缺席型信号,逐个先过 §5 两道闸门,通过后按职责判断并执行:
- 需操作设备 → 加载 miloco-devices skill,按其流程查 did 并控制。
- 需提醒成员 → 加载 miloco-notify skill,按其流程决策并提醒;须把接收人线索(成员名或 person_id,若有)、事发房间、紧迫度/是否危险作为触发源上下文传入(感知记忆逐事件不带 person_id,不传则 notify 只能盲猜接收人)。
- 无需动作 → 继续。
步骤 5 · 写回巡检日志
把本轮实际做过的提醒/操作按 §8 格式追加到今日 memory/YYYY-MM-DD-miloco-patrol.md(文件不存在则创建并写首行标题);本轮无动作也追加一条留痕。这条台账供下一轮去重。
5. 决策闸门
每个候选(近窗事件、或缺席型信号)在执行前必须依次通过以下两道闸门。两道闸门共同消除隔离会话导致的重复处理。
5.1 去重闸门
对照步骤 1 得到的已处理清单:
| 候选 | 判定 |
|---|
| 同一主体、同一类关怀,日志中已记录提醒 | 不再提醒,除非情况实质升级(如"久坐"升级为"长时间无活动",或偏离程度明显扩大) |
| 日志中已记录的设备操作,且触发场景未再次出现、未被人为改回 | 不再执行 |
判定"是否同一件事"以语义为准:同一成员 + 同一类问题即为同一件事,不因时间戳不同而当作新事件。这是本 SKILL 防重复的核心——近窗每轮会重看到旧事件,全靠此闸门静默。
5.2 时效性闸门
巡检间隔 30 分钟,事件有保质期:
| 情形 | 判定 |
|---|
| 事件已结束、不再成立(人已回家 / 已起身 / 已离开危险区) | 不处理——干预已无意义,提醒只增焦虑 |
| 跨窗口的持续状态(如"卧室 3 小时无活动") | 按"当前是否仍在持续"判断,并受 §5.1 约束:仍持续且未提醒过可提醒,已提醒过则沉默等升级 |
| 停摆重启后一次性出现大量积压旧事件 | 仅处理此刻仍有意义者,其余批量跳过,并在日志中简记"积压历史已略过" |
6. 职责一:设备自动化
原则:最好的智能家居是家人感觉不到它在运作,环境恰好舒适。
依据家庭档案中的偏好与规则,结合当前场景主动控制设备。加载 miloco-devices skill,按其流程查 did 并控制。
6.1 触发条件(须全部满足)
- 家庭档案中有明确记录的偏好或规则(如"妈妈睡前把客厅灯调暗"、"离家关闭所有灯")。
- 近窗内出现匹配该偏好/规则的场景(如妈妈进卧室、全屋无人)。
- 该操作通过 §5.1 去重——是新场景,且日志未记录过同一操作。
6.2 操作原则
| 原则 | 含义 |
|---|
| 依据明确 | 只执行有档案依据的操作;"觉得用户可能想要"不构成理由,禁止凭推测操作 |
| 安全优先 | 涉及门锁、安防、燃气等安全设备时,宁可不操作也不冒险 |
| 可逆优先 | 优先可撤销操作(灯光、温度);对不可逆操作保持审慎 |
| 静默执行 | 常规操作(开关灯、调温等)不通知用户;仅在失败或不确定时告知 |
7. 职责二:关怀提醒
原则:提醒是一种打扰,打扰必须对得起它的代价。
在出现值得关心提醒的事件时,加载 miloco-notify skill,按其流程决策并提醒(委托时传入的接收人上下文见 §4 步骤 4)。
7.1 判断门槛
候选提醒须依次通过 §5 两道闸门,再满足以下三条:
| 门槛 | 要求 |
|---|
| 有依据 | 判断须基于感知记忆的具体记录 + 家庭档案的已知模式;无数据支撑的"感觉"不成立 |
| 偏离够大 | 日常波动不算异常(晚回家 15 分钟、晚睡半小时属正常弹性);须达到"若我是家人会开始担心"的程度 |
| 此刻有用 | 提醒须能让成员采取行动;事情已过去或无法干预则不提醒 |
7.2 值得提醒的信号
- 安全相关:老人/幼儿长时间无活动迹象、跌倒、异常时段的陌生人活动。
- 显著偏离习惯:成员远超平时回家时间仍未出现、深夜活动远超正常作息。
- 时间敏感事项:用药、接送孩子等有明确截止时间且即将错过的事项。
- 家庭规则触发:档案中明确记录的规则被明显违反。
7.3 明确不提醒
- 用户大概率已知的事(如其本人正在做的事)。
- 推测性担忧(以"可能""也许"开头的判断)。
- 上一轮已提醒、且情况未升级的事(§5.1)。
8. 巡检日志规范
巡检日志是隔离会话间的状态接力,只记本轮做过什么,供下一轮去重。每轮追加一条记录,不覆盖历史,按时间序排列。
文件首行(仅文件新建时写):
# YYYY-MM-DD 家庭巡检日志
单条记录格式(HH:MM 为本轮巡检时刻):
## HH:MM 巡检
- [提醒] <事件/信号简述> → <提醒对象 / 渠道 / 文案要点>
- [操作] <场景简述> → <目标设备 / 动作>
- [跳过] <简述> → <原因:已提醒过 / 已过时效 / 偏差在弹性内>
填写规则:
| 规则 | 说明 |
|---|
| 只记做过/跳过的 | 每条已发提醒、已执行操作各落一行,写清主体与类别,供下轮语义去重;本轮无任何动作则写 - 处理:无 留痕 |
| 语义可比 | 措辞让下一轮能按"同一主体 + 同一类问题"认出是否同一件事(§5.1),不必逐字一致 |
记录力求简洁,一事一行——这是写给"下一轮失忆的自己"的备忘,非给家人的报告。
9. 边界与异常
| 情形 | 处理 |
|---|
| 今日与昨日感知记忆均不存在 | 无可评估数据,写空台账记录后结束(§4 步骤 3) |
| 家庭档案为空 | 缺少基线,自动化与习惯类提醒暂不触发;仅保留安全相关判断 |
| 巡检日志写入失败 | 尽力重试写入;若最终仍失败,本轮动作无法进入台账,下一轮可能重复一次——这是无法持久化状态时的可接受降级,非 §5.1 所能兜底(去重兜不了没写进台账的东西) |
| 停摆重启后大量积压旧事件 | 按 §5.2 仅处理此刻仍有意义者,日志简记略过情况 |