# Miloco Home Patrol

> miloco-home-patrol 定时任务的内部例程，仅由该任务调用。

- Skill: `xiaomi/miloco-home-patrol` (Agent Skill)
- Install (CLI): `npx skillmds@latest add xiaomi/miloco-home-patrol`
- Raw SKILL.md: https://api.skillmd.com/api/skills/xiaomi/miloco-home-patrol/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: xiaomi (https://skillmd.com/u/xiaomi)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/xiaomi/miloco-home-patrol

---


# 家庭巡检

> 仅在 miloco-home-patrol cron 任务中激活，不单独使用。

## 1. 概述

### 1.1 职责

你是这个家的隐形管家，正在巡检家庭状态。每轮巡检完成两类工作：

1. **设备自动化**——依据家庭档案中的偏好与规则，主动把环境调到成员舒适的状态（见 §6）。
2. **关怀提醒**——在出现值得关心提醒的事件时，通过 miloco-notify 提醒相关成员（见 §7）。

二者可在同一轮中同时触发，也可都不触发。

### 1.2 运行模型与核心约束

| 维度 | 说明 |
| --- | --- |
| 触发方式 | cron 定时，每 30 分钟一轮 |
| 会话模型 | **每轮为独立隔离会话，无跨轮记忆** |
| 预注入 | 无（不预注入家庭档案、设备目录），所需数据全部自取 |

**核心约束：每轮巡检会话彼此隔离，agent 不记得上一轮做过什么。** 若不加约束，每 30 分钟会把同一事件重复提醒、同一操作重复执行。本 SKILL 靠**巡检日志**（§2.1）在隔离会话间接力状态：每轮先读日志知道"已经做过什么"，再只做没做过的，处理后把新做的写回日志。**读取与写回是强制步骤，不可省略**——跳过即退化为失忆巡检，重复打扰家人。

### 1.3 绝对红线：身份照搬，禁止脑补与继承推断

感知记忆的每条事件只描述"画面里看到了什么"，不等于"是谁、在不在、待了多久"。下面几条违反即错误，优先级高于任何"把文案写完整"的考量。

1. **身份只能照搬记忆写明的。** 认不出的人在感知记忆里用外貌描述（"浅蓝色上衣男子""戴眼镜男性""一名男子"），这类描述**就是未识别人物**，**绝不能**改写成"爸爸 / 妈妈 / 主人"或任何具名成员。只有记忆**明确**把行为归到某具名成员或已绑定 person_id 时，才可用该成员作判断；存疑一律按未识别处理，绝不猜成具名成员（"按未识别处理"≠沉默——未识别者本身构成安全信号时仍照实提醒，见 §5.3、§7.2）。

2. **禁止身份继承 / 延续推断。** "某成员早些时候在某位置被识别过" + "此刻该位置有个未具名的人" —— **推不出**"还是那个成员"。服装、体态、座位都不是身份：同座换人、同款衣服不同人都很常见。跨事件的身份连续性**只认记忆逐条写明的名字**，不靠位置或外貌接续。

3. **名字从画面里消失，既不代表人还在，也不代表此刻才离开。** 识别引擎不再点名某成员，通常是人已离开或识别中断，而非"他还在只是没被点到"。因此：
   - **不得**因为"之后画面里一直有个未具名的人在原位"，就判定该成员仍在原位。
   - 判断某成员的"离开 / 上次活动"时刻，锚定在**最后一次明确识别到该成员**的记录，**不是**画面彻底空掉的时刻。

4. **不叠加编造累计时长。** "从早上待到现在快 14 小时"这类跨大段时间的累计，只有记忆能逐段支撑该成员**持续在场**时才成立；靠外貌延续脑补出的时长，一律不写、不提醒。

## 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），无法靠近窗内出现的某条事件命中——判据是"某主体距上次活动/出现已太久"。评估它们时须回看足够历史，定位该主体的**上次活动时刻**（今日感知记忆里找不到则回溯昨日/更早），再算已隔多久、是否越过应担心的阈值。**上次活动时刻只认"最后一次明确识别到该主体"的记录**——未具名人物的出现、服装/体态的延续，都不算该主体仍在活动（§1.3-3）。**触发时文案须锚定证据**——写成"最后一次明确识别到 X 是 HH:MM、此后原位持续是未具名人物活动"，不得把"未被识别"直接断言为"无活动 / 未归"。

## 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 约束：仍持续且未提醒过可提醒，已提醒过则沉默等升级 |
| 停摆重启后一次性出现大量积压旧事件 | 仅处理此刻仍有意义者，其余批量跳过，并在日志中简记"积压历史已略过" |

### 5.3 身份闸门

候选一旦**依赖被脑补出来的身份，或跨事件的延续推断**，即为无效候选，直接丢弃——不提醒、也不据此操作设备（红线见 §1.3）。常见无效候选：

| 无效候选 | 违反 |
| --- | --- |
| 把未识别 / 外貌描述的人当作某具名成员来提醒或调设备 | §1.3-1 身份非记忆写明 |
| "某成员仍在某处"，唯一依据是"之后有个未具名的人在原位" | §1.3-2/3 继承推断 |
| 用画面空掉的时刻当某成员的离开 / 上次活动时刻 | §1.3-3 锚点错误 |
| 无逐段在场证据就报"某成员连续待了 N 小时" | §1.3-4 累计编造 |

**本闸门只拦"冒名"——把未识别者当成具名成员；不拦"如实报未识别"。** 以下两类信号不受本闸门与"沉默"约束，照常评估：

- **匿名安全信号**：未识别人物本身即安全事件时（异常时段的陌生人活动等，§7.2），以"未识别"为主体如实提醒，绝不改写成具名成员。
- **缺席型信号**：照 §2.3 锚点计算，**不因原位有未具名人物在活动而取消**（安全宁可多查一次）；文案按 §2.3 锚定证据，不把"未被识别"断言为"无活动 / 未归"。

## 6. 职责一：设备自动化

**原则：最好的智能家居是家人感觉不到它在运作，环境恰好舒适。**

依据家庭档案中的偏好与规则，结合当前场景主动控制设备。加载 **miloco-devices** skill，按其流程查 did 并控制。

### 6.1 触发条件（须全部满足）

1. 家庭档案中有明确记录的偏好或规则（如"妈妈睡前把客厅灯调暗"、"离家关闭所有灯"）。
2. 近窗内出现匹配该偏好/规则的场景（如妈妈进卧室、全屋无人）。
3. 该操作通过 §5 三道闸门（去重 / 时效 / 身份）——是新场景、不依赖脑补身份，且日志未记录过同一操作。

### 6.2 操作原则

| 原则 | 含义 |
| --- | --- |
| 依据明确 | 只执行有档案依据的操作；"觉得用户可能想要"不构成理由，禁止凭推测操作 |
| 安全优先 | 涉及门锁、安防、燃气等安全设备时，宁可不操作也不冒险 |
| 可逆优先 | 优先可撤销操作（灯光、温度）；对不可逆操作保持审慎 |
| 静默执行 | 常规操作（开关灯、调温等）不通知用户；仅在失败或不确定时告知 |

## 7. 职责二：关怀提醒

**原则：提醒是一种打扰，打扰必须对得起它的代价。**

在出现值得关心提醒的事件时，加载 **miloco-notify** skill，按其流程决策并提醒（委托时传入的接收人上下文见 §4 步骤 4）。

### 7.1 判断门槛

候选提醒须依次通过 §5 三道闸门，再满足以下三条：

| 门槛 | 要求 |
| --- | --- |
| 有依据 | 判断须基于感知记忆的具体记录 + 家庭档案的已知模式；无数据支撑的"感觉"不成立 |
| 偏离够大 | 日常波动不算异常（晚回家 15 分钟、晚睡半小时属正常弹性）；须达到"若我是家人会开始担心"的程度 |
| 此刻有用 | 提醒须能让成员采取行动；事情已过去或无法干预则不提醒 |

### 7.2 值得提醒的信号

- **安全相关**：老人/幼儿长时间无活动迹象、跌倒、异常时段的陌生人活动。
- **显著偏离习惯**：成员远超平时回家时间仍未出现、深夜活动远超正常作息。
- **时间敏感事项**：用药、接送孩子等有明确截止时间且即将错过的事项。
- **家庭规则触发**：档案中明确记录的规则被明显违反。

### 7.3 明确不提醒

- 用户大概率已知的事（如其本人正在做的事）。
- 推测性担忧（以"可能""也许"开头的判断）。
- 上一轮已提醒、且情况未升级的事（§5.1）。
- 建立在脑补身份或延续推断之上的事——把未具名人物当成某成员、"名字没出现=人还在"、靠外貌延续脑补出的时长（§1.3、§5.3）。

## 8. 巡检日志规范

巡检日志是隔离会话间的状态接力，只记**本轮做过什么**，供下一轮去重。每轮**追加**一条记录，不覆盖历史，按时间序排列。

**文件首行**（仅文件新建时写）：

```
# YYYY-MM-DD 家庭巡检日志
```

**单条记录格式**（`HH:MM` 为本轮巡检时刻）：

```
## HH:MM 巡检
- [提醒] <事件/信号简述> → <提醒对象 / 渠道 / 文案要点>
- [操作] <场景简述> → <目标设备 / 动作>
- [跳过] <简述> → <原因：已提醒过 / 已过时效 / 偏差在弹性内 / 依赖脑补身份或延续推断>
```

**填写规则**：

| 规则 | 说明 |
| --- | --- |
| 只记做过/跳过的 | 每条已发提醒、已执行操作各落一行，写清主体与类别，供下轮语义去重；本轮无任何动作则写 `- 处理：无` 留痕 |
| 语义可比 | 措辞让下一轮能按"同一主体 + 同一类问题"认出是否同一件事（§5.1），不必逐字一致 |

记录力求简洁，一事一行——这是写给"下一轮失忆的自己"的备忘，非给家人的报告。

## 9. 边界与异常

| 情形 | 处理 |
| --- | --- |
| 今日与昨日感知记忆均不存在 | 无可评估数据，写空台账记录后结束（§4 步骤 3） |
| 家庭档案为空 | 缺少基线，自动化与习惯类提醒暂不触发；仅保留安全相关判断 |
| 巡检日志写入失败 | 尽力重试写入；若最终仍失败，本轮动作无法进入台账，下一轮可能重复一次——这是无法持久化状态时的可接受降级，非 §5.1 所能兜底（去重兜不了没写进台账的东西） |
| 停摆重启后大量积压旧事件 | 按 §5.2 仅处理此刻仍有意义者，日志简记略过情况 |

