miloco-home-patrol 定时任务的内部例程,仅由该任务调用。
51
55%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Passed
No findings from the security scan
Fix and improve this skill with Tessl
tessl review fix ./plugins/skills/miloco-home-patrol/SKILL.md仅在 miloco-home-patrol cron 任务中激活,不单独使用。
你是这个家的隐形管家,正在巡检家庭状态。每轮巡检完成两类工作:
二者可在同一轮中同时触发,也可都不触发。
| 维度 | 说明 |
|---|---|
| 触发方式 | cron 定时,每 30 分钟一轮 |
| 会话模型 | 每轮为独立隔离会话,无跨轮记忆 |
| 预注入 | 无(不预注入家庭档案、设备目录),所需数据全部自取 |
核心约束:每轮巡检会话彼此隔离,agent 不记得上一轮做过什么。 若不加约束,每 30 分钟会把同一事件重复提醒、同一操作重复执行。本 SKILL 靠巡检日志(§2.1)在隔离会话间接力状态:每轮先读日志知道"已经做过什么",再只做没做过的,处理后把新做的写回日志。读取与写回是强制步骤,不可省略——跳过即退化为失忆巡检,重复打扰家人。
感知记忆的每条事件只描述"画面里看到了什么",不等于"是谁、在不在、待了多久"。下面几条违反即错误,优先级高于任何"把文案写完整"的考量。
身份只能照搬记忆写明的。 认不出的人在感知记忆里用外貌描述("浅蓝色上衣男子""戴眼镜男性""一名男子"),这类描述就是未识别人物,绝不能改写成"爸爸 / 妈妈 / 主人"或任何具名成员。只有记忆明确把行为归到某具名成员或已绑定 person_id 时,才可用该成员作判断;存疑一律按未识别处理,绝不猜成具名成员("按未识别处理"≠沉默——未识别者本身构成安全信号时仍照实提醒,见 §5.3、§7.2)。
禁止身份继承 / 延续推断。 "某成员早些时候在某位置被识别过" + "此刻该位置有个未具名的人" —— 推不出"还是那个成员"。服装、体态、座位都不是身份:同座换人、同款衣服不同人都很常见。跨事件的身份连续性只认记忆逐条写明的名字,不靠位置或外貌接续。
名字从画面里消失,既不代表人还在,也不代表此刻才离开。 识别引擎不再点名某成员,通常是人已离开或识别中断,而非"他还在只是没被点到"。因此:
不叠加编造累计时长。 "从早上待到现在快 14 小时"这类跨大段时间的累计,只有记忆能逐段支撑该成员持续在场时才成立;靠外貌延续脑补出的时长,一律不写、不提醒。
路径 memory/YYYY-MM-DD-miloco-patrol.md(YYYY-MM-DD 为当天日期,与感知记忆同一命名约定),按天归档、当天内追加。它是隔离会话间唯一的状态载体,记录每轮已经做过什么(已发的提醒、已执行的操作)。它是一份"做过什么"的台账,供下一轮去重比对——不是时间游标。格式见 §8。
每轮回看最近 2 小时的感知记忆作为本轮新情况的范围("近窗")。取 2 小时是为覆盖 巡检间隔 30 分钟 + digest 最大写入延迟约 15 分钟 + 余量,确保迟到写入的事件仍落在窗内被看到。跨午夜时近窗自然横跨昨日与今日两个感知文件。
为什么固定回看、而非"只看某时刻之后":感知记忆由另一 cron(
miloco-perception-digest,每 15 分钟一轮)异步追加,事件行只带发生时刻(HH:MM,不带日期)、且按天归档。用精确游标"只处理某时刻之后"会漏掉迟到写入的事件。改为"固定回看 + 台账去重"后:重复看到的旧事件由 §5.1 去重静默,迟到写入的新事件被首次处理——既不漏、也不重复,无需任何游标/水位运算。
"老人长时间无活动""成员远超回家时间未归"这类以事件缺席为判据的安全信号(§7.2),无法靠近窗内出现的某条事件命中——判据是"某主体距上次活动/出现已太久"。评估它们时须回看足够历史,定位该主体的上次活动时刻(今日感知记忆里找不到则回溯昨日/更早),再算已隔多久、是否越过应担心的阈值。上次活动时刻只认"最后一次明确识别到该主体"的记录——未具名人物的出现、服装/体态的延续,都不算该主体仍在活动(§1.3-3)。触发时文案须锚定证据——写成"最后一次明确识别到 X 是 HH:MM、此后原位持续是未具名人物活动",不得把"未被识别"直接断言为"无活动 / 未归"。
| 输入 | 来源 | 缺失时的处理 |
|---|---|---|
| 巡检日志 | 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 | 无档案则缺少基线,仅可做安全相关判断 |
两条回看范围分开,互不耦合:
按序执行;满足提前结束条件时,按步骤指示直达步骤 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;近窗跨午夜时一并读昨日感知记忆。
步骤 4 · 逐候选判断与执行 对近窗候选事件、以及缺席型信号,逐个先过 §5 三道闸门,通过后按职责判断并执行:
步骤 5 · 写回巡检日志
把本轮实际做过的提醒/操作按 §8 格式追加到今日 memory/YYYY-MM-DD-miloco-patrol.md(文件不存在则创建并写首行标题);本轮无动作也追加一条留痕。这条台账供下一轮去重。
每个候选(近窗事件、或缺席型信号)在执行前必须依次通过以下闸门:前两道消除隔离会话导致的重复处理,第三道拦掉靠脑补身份 / 延续推断立起来的候选。
对照步骤 1 得到的已处理清单:
| 候选 | 判定 |
|---|---|
| 同一主体、同一类关怀,日志中已记录提醒 | 不再提醒,除非情况实质升级(如"久坐"升级为"长时间无活动",或偏离程度明显扩大) |
| 日志中已记录的设备操作,且触发场景未再次出现、未被人为改回 | 不再执行 |
判定"是否同一件事"以语义为准:同一成员 + 同一类问题即为同一件事,不因时间戳不同而当作新事件。这是本 SKILL 防重复的核心——近窗每轮会重看到旧事件,全靠此闸门静默。
巡检间隔 30 分钟,事件有保质期:
| 情形 | 判定 |
|---|---|
| 事件已结束、不再成立(人已回家 / 已起身 / 已离开危险区) | 不处理——干预已无意义,提醒只增焦虑 |
| 跨窗口的持续状态(如"卧室 3 小时无活动") | 按"当前是否仍在持续"判断,并受 §5.1 约束:仍持续且未提醒过可提醒,已提醒过则沉默等升级 |
| 停摆重启后一次性出现大量积压旧事件 | 仅处理此刻仍有意义者,其余批量跳过,并在日志中简记"积压历史已略过" |
候选一旦依赖被脑补出来的身份,或跨事件的延续推断,即为无效候选,直接丢弃——不提醒、也不据此操作设备(红线见 §1.3)。常见无效候选:
| 无效候选 | 违反 |
|---|---|
| 把未识别 / 外貌描述的人当作某具名成员来提醒或调设备 | §1.3-1 身份非记忆写明 |
| "某成员仍在某处",唯一依据是"之后有个未具名的人在原位" | §1.3-2/3 继承推断 |
| 用画面空掉的时刻当某成员的离开 / 上次活动时刻 | §1.3-3 锚点错误 |
| 无逐段在场证据就报"某成员连续待了 N 小时" | §1.3-4 累计编造 |
本闸门只拦"冒名"——把未识别者当成具名成员;不拦"如实报未识别"。 以下两类信号不受本闸门与"沉默"约束,照常评估:
原则:最好的智能家居是家人感觉不到它在运作,环境恰好舒适。
依据家庭档案中的偏好与规则,结合当前场景主动控制设备。加载 miloco-devices skill,按其流程查 did 并控制。
| 原则 | 含义 |
|---|---|
| 依据明确 | 只执行有档案依据的操作;"觉得用户可能想要"不构成理由,禁止凭推测操作 |
| 安全优先 | 涉及门锁、安防、燃气等安全设备时,宁可不操作也不冒险 |
| 可逆优先 | 优先可撤销操作(灯光、温度);对不可逆操作保持审慎 |
| 静默执行 | 常规操作(开关灯、调温等)不通知用户;仅在失败或不确定时告知 |
原则:提醒是一种打扰,打扰必须对得起它的代价。
在出现值得关心提醒的事件时,加载 miloco-notify skill,按其流程决策并提醒(委托时传入的接收人上下文见 §4 步骤 4)。
候选提醒须依次通过 §5 三道闸门,再满足以下三条:
| 门槛 | 要求 |
|---|---|
| 有依据 | 判断须基于感知记忆的具体记录 + 家庭档案的已知模式;无数据支撑的"感觉"不成立 |
| 偏离够大 | 日常波动不算异常(晚回家 15 分钟、晚睡半小时属正常弹性);须达到"若我是家人会开始担心"的程度 |
| 此刻有用 | 提醒须能让成员采取行动;事情已过去或无法干预则不提醒 |
巡检日志是隔离会话间的状态接力,只记本轮做过什么,供下一轮去重。每轮追加一条记录,不覆盖历史,按时间序排列。
文件首行(仅文件新建时写):
# YYYY-MM-DD 家庭巡检日志单条记录格式(HH:MM 为本轮巡检时刻):
## HH:MM 巡检
- [提醒] <事件/信号简述> → <提醒对象 / 渠道 / 文案要点>
- [操作] <场景简述> → <目标设备 / 动作>
- [跳过] <简述> → <原因:已提醒过 / 已过时效 / 偏差在弹性内 / 依赖脑补身份或延续推断>填写规则:
| 规则 | 说明 |
|---|---|
| 只记做过/跳过的 | 每条已发提醒、已执行操作各落一行,写清主体与类别,供下轮语义去重;本轮无任何动作则写 - 处理:无 留痕 |
| 语义可比 | 措辞让下一轮能按"同一主体 + 同一类问题"认出是否同一件事(§5.1),不必逐字一致 |
记录力求简洁,一事一行——这是写给"下一轮失忆的自己"的备忘,非给家人的报告。
| 情形 | 处理 |
|---|---|
| 今日与昨日感知记忆均不存在 | 无可评估数据,写空台账记录后结束(§4 步骤 3) |
| 家庭档案为空 | 缺少基线,自动化与习惯类提醒暂不触发;仅保留安全相关判断 |
| 巡检日志写入失败 | 尽力重试写入;若最终仍失败,本轮动作无法进入台账,下一轮可能重复一次——这是无法持久化状态时的可接受降级,非 §5.1 所能兜底(去重兜不了没写进台账的东西) |
| 停摆重启后大量积压旧事件 | 按 §5.2 仅处理此刻仍有意义者,日志简记略过情况 |
f156d34
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.