创建/管理"持续运转的家庭任务"—— 由 rule(条件触发自动化)/ schedule(定时提醒)/ record(行为累积统计)/ lifecycle(长期/限时)组合装配;也是 [感知引擎] 语音指令类系统消息的统一入口。覆盖:定时/累积提醒、"X 时 Y" 自动化、行为统计、持续状态阈值等。
58
68%
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-create-task/SKILL.md收到任务相关消息 → 第一步判 op,六条路径之一:
| op | 触发来源 | 例子 | 走哪条 |
|---|---|---|---|
| create | 用户消息 / [感知引擎] 语音指令系统消息 | "每天喝 8 杯水" / "房间有人提醒我" / "明天 X" / "没人就 Y" | 本 skill 后续段(前置检查 → 两层维度判 → 装配映射) |
| list | 用户消息 | "我有哪些任务" / "查看任务列表" | references/crud-ops.md |
| logs | 用户消息 | "X 任务今天触发几次" / "看 X 触发记录" | references/crud-ops.md |
| disable / enable | 用户消息 | "暂停喝水任务" / "启用 X 任务" | references/crud-ops.md |
| update | 用户消息 | "把喝水改成 10 杯" / "条件改成阳台有人" | references/crud-ops.md |
| delete | 用户消息 | "删除喝水任务" / "把 X 任务去掉" | miloco-terminate-task |
user-facing text 仅在两个时机出现:
其余时刻过程描述放 thinking 块,user-facing 静默。
person 引用规则:user-facing 文本(终态 + 反问)引用 person 时 role 优先——role 非空只写 role,不带 name 括号标注;role 为空才写 name。
内容反映本轮实际 CLI 装配参数,不增不减。格式不限,必含:
以下内容仅覆盖 create 路径。判据走语义判断,不照字面词表死扣。下文给的词只作类别示例,不是穷举枚举。
工具链跑完到终态输出之间,必须 echo 下列格式做自检(任一 N → 修正后重过;echo 内容不输出到 user-facing):
[装配后自检]
1. 含 on-target-desc 时 task → record → rule 顺序完成装配:Y / N / NA
2. 终态 §响应动作 同时含「触发后做什么」+「记录什么」:Y / N
3. 每条装配提示「怎么改」字段给出用户可直接复述的短语:Y / N凡装配过程中 agent 自主产生的对用户的提示性信息,统称「装配提示」。覆盖:默认猜测、偏离推荐、超阈值范围、需用户验证的常识默认等。
每条装配提示必产出,在终态独立成句出现,措辞自由。
每条必含 3 要素:
子维度判据里只标 "→ 触发装配提示"。
多提示装配:N 条提示 → N 句,独立成句。
[输出协议 reload]:本章节及后续所有装配工具调用期间,过程描述走 thinking,user-facing 仅在终态与反问输出。
调 miloco-cli scope camera list,取 in_use=true 的子集记为 N。结果给 §Rule.感知设备 装配阶段消费。与 §重复检查 / §person 清单 并行调用。
调 miloco-cli person list 拿 role/name 列表,结果给 §Rule.condition.query 主语决策消费。与 §感知设备清单 / §重复检查 并行调用。
agent 自己起,snake_case [a-z0-9_]{1,32},需含语义(drink_8_today / fall_alert / phone_time_daily),不用纯数字 / 简短缩写。
调 miloco-cli task list --pretty 拿活跃 task 列表,按 task_id + description + rule_briefs 比对:
| 类型 | 判据 | 处理 |
|---|---|---|
| A 名字冲突 | 待建 task_id 命中现有活跃 task | 让用户换 task_id 或先 terminate 旧 |
| B 语义重复 | description 表意一致 / rule_briefs 触发+动作组合本质相同 | 反问三选一:替换 / 强制新建 / 取消 |
| C 触发冲突 | 同 source + 同 condition + 动作矛盾或参数改写 | 反问三选一:替换并删旧(旧历史不可恢复)/ 暂停旧建新(旧历史保留,可恢复)/ 取消 |
跳过条件:
禁止主动 update / delete:A / B / C 类命中后等用户答复,不私自 update / delete 已有 rule / cron / record / task。
[输出协议 reload]:本章节及后续所有装配工具调用期间,过程描述走 thinking,user-facing 仅在终态与反问输出。
task 是聚合根,含:
Rule/Schedule/Record 是子组件存在性(Y/N);Lifecycle 是 task 整体属性(permanent/temporary)。四者独立判,不互依赖。
Y = 用户描述需要系统持续观察现实世界才能触发的场景,含以下任一语义:
N = 纯时间触发或纯查询,不依赖现实事件。
Rule 跟 Schedule 完全独立:句中含任何现实事件信号(动作/环境/状态变化/计数目标)就 Rule=Y,即使同句有定时提醒。
核心判据:触发是否依赖时钟锚点(在某个未来时间点 / 周期性时间点上由系统主动发起)。
Y 的语义(含以下任一):
"每天累计/合计/总共/加起来 N 小时/分钟" → Schedule=N。区别于"每天 N 杯/N 次"离散计数 → Schedule=Y 定时提醒。
不归 Schedule:
核心判据:用户语义里是否含"累计/计数"信号。
累计/计数信号(含以下任一即 Y):
N 的边界 case:
Record=Y → Rule=Y(强约束):record 各 kind 必须由 rule 触发写入 —— progress = --action-desc「计数加一」/ duration = --on-enter-desc「开始计时」+ --on-exit-desc「结束计时」/ event = --action-desc「事件追加」。具体动词短语变体见 §Rule.action 自检表。
核心判据:用户的规则是长期常驻还是只在某个有限时间段内有效。
按以下信号顺序判,命中第一个即停:
不归 temporary:
核心判据:是否需要对"进入条件"和"离开条件"双向响应?
stateevent(触发条件含持续时长用 duration_seconds 修饰,不改 mode)按顺序判,命中即停:
state(on_enter 写 duration-start + on_exit 写 duration-end)eventstate
on_exit 复位duration_seconds 取稳定窗(按推荐表)+ 长 exit_debounce_seconds(按推荐表)+ on_exit 留空state + 长 exit_debounce_seconds(按推荐表)+ on_exit 留空eventstate + 长 exit_debounce_seconds(按推荐表)+ on_exit 留空event
duration_seconds 表达,不改 modecondition.query 是「判定 X 在发生」的视觉命题——主语 + 谓语,主语类型由命题语义决定(person / object / scene)。
主语取值规则(按命题语义分支):
| 命题语义 | 主语取值 |
|---|---|
| 人在做某事(具体姓名 / 家庭关系称谓 / 类别词如宝宝/老人 / 第一人称) | 跑 miloco-cli person list 解析(见下) |
| 多个具体人物明示列举("妈妈和爸爸" 等) | 拆 N 条 rule(同 task),每条主语 = 一位 role/name |
| 抽象集合(家人 / 家庭成员 / 家里人 / 所有家人 / 全家) | 已注册成员 + 触发装配提示。禁展开为当前 person list 的具体成员 |
| 有人 / 任何人 / 谁 | 任何人 + 触发装配提示 |
| 陌生人 / 外人 / 非家人 | 陌生人(命题反例排除必含"不含家庭成员") |
| 物体异常(烟雾 / 火焰 / 积水 / ...) | 物体名词,取自用户原话 |
| 场景状态(无人 / 明暗 / ...) | 画面 或具体房间名 |
| 句中无明示主体("起床开窗帘" / "久坐提醒" 等) | 用户 + 触发装配提示 |
person list 解析(主语是具体人物 / 第一人称 共用,使用 §前置检查 已拿的列表):
动作类命题(含动作姿态的 query)必含三段。装 --condition 前先按三段拆解(- 动作姿态:... / - 关键物体:... / - 反例排除:...),对每个具象词标注来源「用户原话 / profile 习惯描述 / 视觉常识」,profile 习惯描述 → 删词。再按结构模板机械串接三段为 query 字符串装入 --condition:<主语><动作姿态><关键物体>;不含<反例1>,不含<反例2>[...]。串接规则:三段所有具象词必须 1:1 保留到 query 字符串,禁止简化、抽象化或省略下位词;串接后 query 字符串必须包含拆解出的所有具象词字面字符串。query 字符串必含分号 + ≥ 2 个「不含」前缀,缺任一视为未完成;关键物体段使用近邻易混结构时缺下位词或上位类别视为未完成:
颗粒度总则:每段提供视觉模型独立判别正例的最低必要信息,避免过粗(单动词 / 抽象集合)和过细(精确角度 / 品牌 / 型号)。
每方向单独判(state mode 下 ENTERED / EXITED 独立选):
| 动作性质 | 装配 | fire 时谁执行 |
|---|---|---|
| 能 100% 写死(开关固定设备、播固定文本) | action JSON | rule engine 直接执行 |
| 需按运行时状态/上下文决定 | desc 文案(业务意图) | fire-agent 独立 turn 推理执行 |
按顺序命中即停:
通知类场景(通知用户/播报/提醒家人/告知监护人)统一 desc。达标触发的通知按 §达标通知机制 三选一定位置。
desc 写法:业务语义,不贴 CLI 命令字面。文案以客观陈述事件为准,不含「检测到/识别到/感知到/察觉到」等系统视角词。通知类 desc 句式以「使用<通道>通知:<内容>」开头,<通道>取 §通道反问 A/B/C 三选项之一。desc 内禁用 {...} / ${...} / %s 等占位符语法。
涉及 Record 读写的 desc 首句必含动词短语:
| record kind | 响应方向 | 首句动词短语 |
|---|---|---|
| progress | action | 「计数加一」/「+1」/「<次数>加一」 |
| event | action | 「事件追加:<事件描述>」 |
| duration | on_enter | 「开始计时」/「记录起点」/「记录计时起点」 |
| duration | on_exit | 「结束计时」/「记录终点」 |
| duration | on_target | 业务通知文案 |
desc 结构:<首句动词短语>[;<业务通知文案>]。
on_exit 留空条件(不填任何 flag):
按业务语义对照:
| 业务语义 | 触发字段 | 通知装配位置 |
|---|---|---|
| 连续观测达标 | rule.duration_seconds | action-desc(event)/ on-enter-desc(state) |
| 跨次累计达标 | record.target_minutes(duration kind) | on-target-desc(文案为抽象业务语义) |
| 计数达标 | record.target(progress kind) | action-desc 末段含达标判断 |
| 跨次累计达标 + 退出复提醒 | 用户原话明示每次退出复提醒语义 | on-exit-desc 附加条件通知 |
state + duration record 三 desc 分工:
on-enter-desc 仅放计时起点动词短语on-exit-desc 仅放计时终点动词短语;用户原话明示每次退出复提醒语义时附加条件通知(按 §Rule.action 通知 desc 句式)on-target-desc 仅放业务通知文案on-target-desc 非空 → 必同时配 duration record + target_minutes,且必按 task → record → rule 顺序装配。
含义:触发条件需要持续 N 秒才算成立。mode 无关修饰符(event / state 都可配)。
单位:CLI --duration-seconds 收秒整数。用户原话 N 分钟 → 装 N×60;N 小时 → 装 N×3600。同任务内 record.target_minutes 字段按分钟传,两者不混用。
单次时长跟踪场景:duration_seconds 直接表达用户业务时长(CLI 上限 86400 = 24h)。业务时长 > 24h 拒建,回话告知用户改用跨次累计 record(Record.kind=duration)。装 > 12h(43200s)→ 触发装配提示(内容:"本 rule 跟踪时长较长,若 Miloco 服务期间重启,计时窗口会清零重新累计")。
跨次累计场景(Record.duration):duration_seconds 退化为 rule 层姿态稳定窗(推荐值见下方推荐表),业务时长由 record.target_minutes 表达。
何时配:
推荐值(按动作类别取,不是字面词表):
| 动作类别 | 推荐 |
|---|---|
| 一般简单姿态动作 | 30 |
| 视线类前置确认 | 45 |
| 久坐/久站/久躺类前置确认 | 60 |
| 屏幕/读写沉浸类前置确认 | 90 |
| 运动/健身/锻炼类前置确认 | 180 |
| 睡眠/专注做事类前置确认 | 180 |
| 拿不准 | 60 |
取值流程:
--duration-seconds,跳过此项;命中第 3 条 → 继续取值state mode 防边沿抖动 / 防重复触发;event mode 一般不配(duration_seconds 已提供抖动保护)。
何时必配(state mode):
| 场景 | 推荐 |
|---|---|
| state 双向边沿去重(默认) | 60 |
| state + duration record · 离散使用型(玩手机/看电视/看书 等) | 60 |
| state + duration record · 间断持续型(健身/做饭/打游戏/学习 等) | 180 |
| 瞬时事件防重复 / 持续行为入态 · 长窗(默认) | 1800 |
| 瞬时事件防重复 / 持续行为入态 · 长窗(用户指定 N 分钟) | N × 60(封顶 3600) |
取值流程:
Schedule.message:写业务意图,fire-agent fire 时独立 turn 推理执行;周期触发的唤醒次数 ≠ 提醒次数。
| 类型 | 信号 |
|---|---|
at | 单一未来时刻 |
every | 固定间隔("每 N 分钟" / "每 N 小时" 等明示间隔但无具体时点的措辞) |
cron | 时钟模式 / 周期重复(具体时点 / 周中某天 / 工作日 / 周末) |
绝不创建不带家庭时区的 cron 定时任务。 openclaw 对未设 tz 的 cron 按宿主机时区求值,宿主机时区 ≠ 家庭时区时整点全偏。家庭时区(IANA 名,如 Asia/Shanghai)取自注入的「## 时间与时区」块,下方 <家庭时区> 一律替换成该真实 IANA 名。
schedule 对象里独立的 tz 字段,与表达式分开传:schedule={kind:"cron", expr:"0 21 * * *", tz:"<家庭时区>"}。expr 只放裸 5 段 cron 表达式——绝不把时区写进 expr:cron list 展示的 0 21 * * * @ Asia/Shanghai 是显示格式、不是合法输入,塞进 expr 会直接创建失败。miloco-cli time-compute 产出的 ISO 已带时区偏移(如 +08:00),本身无歧义,直接传即可。按顺序判,命中即停:
N = min(target_per_day, 6) 取整;跨周期先归一 target_per_day = target / 周期天数(day=1, week=7, month=30)* * *;用户明示工作日/周末 → * * 1-5 / * * 0,6expr="0 H1,H2,...,Hn * * *" + tz="<家庭时区>",通过 miloco-cli cron add --task-id <id> --kind cron --cron-expr ... --tz ... 一步绑到 task(backend 内部走 cron.task_id FK CASCADE,tz 必带,见 §Schedule.时区)0 9 * * *;week → 0 9 * * 1;month → 0 9 1 * *(均须配 tz="<家庭时区>")命中默认路径 → 触发装配提示(按 §装配提示元规则)
| kind | 用户语义 |
|---|---|
progress | 计数达标 + 明确目标正整数 |
duration(含阈值) | 累计/连续超过 N 小时/分钟,含明确时长阈值 |
duration(无阈值) | 记录/统计/追踪 X 时长,无目标数字 |
event | 累积事件流,记录/统计/跟踪/数 + 行为,无目标数字 |
歧义裁决(按顺序判):
duration(含阈值时填 target_minutes;无阈值省略字段,禁写 0/1 占位)duration → 触发装配提示eventprogressevent,禁 target=0/1| task_type | 判据 |
|---|---|
recurring | 含周期/习惯化语义 |
oneshot | kind=progress/duration + 含限时窗口语义 |
longterm | kind=event + 任意时间语义或无时间语义 |
特例(时长门槛模板):
longtermrecurring触发条件:用户用了含糊动作词且未明示通道。
含糊动作词分两类:
未明示通道 = 用户没说"音箱/喇叭/播报/朗读/手机/推送/消息"等任何通道线索。
必反问 A/B/C,等用户答复后装 desc:
跳过条件:user_intent 已明示通道 → desc 按用户指定通道写,不反问。
用户描述的感知触发存在以下不明确 → 先反问再装配,不默认猜。
由 Rule.mode 判据第 4 条触发。按用户原话信号判:
exit_debounce_seconds(按推荐表),不反问反问模板:
你说的"<原词>",我想确认下:
- A. 每次发生即触发(短时间内重复发生也响)
- B. 间隔一段时间后才算一次(默认 30 分钟以上)
映射:A → event;B → state + 长 exit_debounce_seconds(按推荐表)+ on_exit 留空。
触发条件:触发依赖主体进入或离开摄像头视野(vs 主体已在视野内的姿态/状态变化)。
跳过本反问:
按以下顺序判,命中即停:
反问模板:
"<房间名>" 那个摄像头能不能 <关键视角描述>?
- A. 看得到
- B. 看不到
<关键视角描述> 指向主体可见性切换发生的具体局部位置(出入口/家具点位/区域边界),不是房间整体。
按答复(或常识默认)选 condition.query 形式:视角覆盖 → 含触发动作的命题;视角不覆盖 → 退化为存在态命题。<X> 按命题主语决策替换。
路径 2 走常识默认 → 触发装配提示。
--source,可选)消费 §前置检查 §感知设备清单 拿到的 N:
source_did[](非空)→ 直接当 --source--source + 触发装配提示(mode 无关,state 持续姿态触发不例外)name / room_name 模糊匹配:
--source <did1> --source <did2> ...)+ 触发装配提示--action JSON 的 did)优先看 system context ## 设备目录 段。缺失或未覆盖 → device list --room + device spec <did> 拿 iid。
目标设备消歧(TTS/语音播报/单点提示音/警报音/局部光效)+ 候选 ≥ 2:
[输出协议 reload]:本章节及后续所有装配工具调用期间,过程描述走 thinking,user-facing 仅在终态与反问输出。
按维度取值映射到 CLI 命令。多命令按顺序执行。
--name 必带 [<task_id>] 前缀(适用 rule create / cron job;task_id 规范见 §前置检查)。
单任务串行装配:多 task 装配按 task 维度串行——上一个 task 装完所有相关命令、CLI 返回成功后,才能启动下一个 task。禁止同 model turn 中并发多 task 的 CLI 命令。
CLI 报错后重审全命令:任何 CLI 报错后,重装该命令前必须对所有参数逐项重新检查,不允许仅针对报错字段补丁式重发。
| 维度 | CLI |
|---|---|
| 创建 task | miloco-cli task create --task-id <id> --description "<描述>" |
| Rule=Y | miloco-cli rule create --task-id <id> <rule-flags> |
| Schedule=Y | miloco-cli cron add --task-id <id> --kind cron --name "[<id>] <描述>" --cron-expr "<expr>" --tz "<家庭时区>" --message "<业务意图>"(backend 强制 dispatch_owner=internal,经 cron.task_id FK 直接绑 task,无需 link;cron 类必带 tz,见 §Schedule.时区) |
| Record=Y | miloco-cli task record init <id> --kind <progress/duration/event> --content '<JSON>' |
| Lifecycle=temporary | miloco-cli cron add --task-id <id> --kind at --at-iso <expires_at> --name "[<id>] 到期销毁" --message "到期销毁 task <id>" --max-delay 0(<expires_at> 由 miloco-cli time-compute --anchor <kind> 直出裸 ISO,--max-delay 0 让 termination 无限补跑) |
| 维度取值 | flag |
|---|---|
| name(必填) | --name "[<task_id>] <场景描述>" |
mode=event | --mode event |
mode=state | --mode state |
condition.query | --condition "<query>" |
| event + action JSON | --action '<JSON>' |
| event + desc | --action-desc "<desc>" |
| state + on_enter action JSON | --on-enter-action '<JSON>' |
| state + on_enter desc | --on-enter-desc "<desc>" |
| state + on_exit action JSON | --on-exit-action '<JSON>' |
| state + on_exit desc | --on-exit-desc "<desc>" |
| on_exit 留空 | 不传 on_exit flag |
duration_seconds=N | --duration-seconds N |
exit_debounce_seconds=N | --exit-debounce-seconds N |
感知设备=<DID> | --source <DID> |
| 感知设备=广播 | 不传 --source |
| kind | content |
|---|---|
| progress(temporary) | {"target":N,"unit":"<次/杯/步>","window":"<day/week>","expires_at":"<ISO>"} |
| progress(recurring) | {"target":N,"unit":"<次/杯/步>","window":"<day/week>","recurring_pattern":{"window":"<day/week>"}} |
| duration 含阈值(temporary) | {"target_minutes":N,"expires_at":"<ISO>"} |
| duration 含阈值(recurring) | {"target_minutes":N,"recurring_pattern":{"window":"<day/week>"}} |
| duration 无阈值(longterm) | {"recurring_pattern":{"window":"longterm"}} |
| duration 无阈值(recurring) | {"recurring_pattern":{"window":"<day/week>"}} |
| event | {} |
装填规则:
window 必填,决定 period 边界recurring_pattern多步执行(task create → record init → cron add → rule create)任一步失败 → 调 miloco-cli task delete <task_id> --reason abandoned 回滚。
agent_pending(仅含 cron kind),按顺序逐条 cron removecron.task_id=NULL)的 cron → 按本 turn 已知的 cron_id 单独 cron removeexample 展示判据→取值的推导过程,具体取值仅适用其原话场景。每个用户原话独立按 §第一层 / §第二层 判据推。
cron / at / termination 均由 miloco-cli cron add 单步装配:--task-id 直绑 task(backend 强制 dispatch_owner=internal,经 cron.task_id FK CASCADE),cron 类必带 --tz "<家庭时区>",at 类用 --at-iso 传带偏移 ISO(与 time-compute 输出、record expires_at 同格式)。
用户:"家里有人摔倒就报警"
推理:「摔倒」人身安全异常 → §Rule?=Y · §Rule.mode(人身安全)=event;无累计/计数 → §Record?=N;现实事件触发 → §Schedule?=N;无信号兜底 → §Lifecycle(无信号兜底)=permanent;「报警」通知类 → §Rule.action=desc · §通道反问 触发(必反问 A/B/C);§Rule.感知设备 N≥1 + 「家里」未指定房间 → 不传 --source + 触发装配提示
Rule?=Y · Schedule?=N · Record?=N · Lifecycle=permanent
Rule.mode=event · action=desc
通道反问 → A 音箱miloco-cli task create --task-id fall_alert --description "家里有人摔倒报警"
miloco-cli rule create --task-id fall_alert \
--name "[fall_alert] 摔倒报警" \
--mode event \
--condition "任何人身体突然失去平衡倒地,呈仰面/侧卧/俯卧姿态躺在地面;不含主动卧倒、躺床睡觉等休息姿态,不含做仰卧起坐、瑜伽下犬式/平板支撑等贴地运动" \
--action-desc "使用音箱播报通知:有人摔倒了,立即报警"用户:"起床后自动开窗帘"
推理:「起床」人体可观测动作 → §Rule?=Y;「开窗帘」"开 X" 动作 → §Rule.mode(激活持续设备)=state · 默认补 on_exit 复位;现实事件触发 → §Schedule?=N;无累计/计数 → §Record?=N;无信号兜底 → §Lifecycle(无信号兜底)=permanent;state 默认 → §Rule.exit_debounce_seconds=60;§Rule.感知设备 N≥1 + 未指定房间 → 不传 --source + 触发装配提示
Rule?=Y · Schedule?=N · Record?=N · Lifecycle=permanent
Rule.mode=state · 默认补 on_exit 复位 · exit_debounce_seconds=60miloco-cli task create --task-id wakeup_curtain --description "起床开窗帘"
miloco-cli rule create --task-id wakeup_curtain \
--name "[wakeup_curtain] 起床开窗帘" \
--mode state \
--condition "用户从卧床躺姿切换到坐起或离床站立姿态;不含翻身、伸懒腰等床上小动作,不含坐起喝水后躺回等短暂起身动作" \
--exit-debounce-seconds 60 \
--on-enter-action '{"did":"<窗帘 DID>","iid":"prop.X","value":true,"idempotent":true}' \
--on-exit-desc "检查开窗帘是否仍有效,若已结束则复位"用户:"明天 9 点提醒吃药"
推理:「明天 9 点」单一未来具体时点 → §Schedule?=Y(at);绝对一次性时刻信号 → §Lifecycle(绝对一次性时刻)=temporary;纯时间触发 → §Rule?=N · §Record?=N
Rule?=N · Schedule?=Y(at) · Record?=N · Lifecycle=temporaryAT_ISO=$(miloco-cli time-compute --anchor '{"kind":"tomorrow_at","time":"09:00:00"}')
miloco-cli task create --task-id med_tomorrow_9am --description "明天 9 点提醒吃药"
miloco-cli cron add --task-id med_tomorrow_9am --kind at --at-iso "$AT_ISO" \
--name "[med_tomorrow_9am] 吃药提醒" --message "提醒用户吃药"用户:"今天喝够 8 杯水提醒"
推理:「喝水」人体可观测动作 → §Rule?=Y;「8 杯」计数达标 → §Record?=Y · §Record.kind=progress · target=8 · window=day;「今天」时间窗信号 → §Lifecycle(时间窗信号)=temporary · expires_at=今日 24:00;瞬时动作 + 计数型 → §Rule.mode(瞬时动作)=event;progress + target>0 → §Schedule?=Y(cron) · §Schedule.频率默认(progress+target>0 多时点) · N=min(8,6)=6 时点 · 无强场景均分 10-20;「提醒」通知类 → §Rule.action=desc · §通道反问 触发(必反问 A/B/C);句中无主体 → 主语=用户 + 触发装配提示;§Rule.感知设备 N≥1 + 未指定房间 → 不传 --source + 触发装配提示
Rule?=Y · Schedule?=Y(cron×6 默认+装配提示) · Record?=Y · Lifecycle=temporary
Rule.mode=event · Record.kind=progress · target=8 · window=day
通道反问 → B 手机EXPIRES_AT=$(miloco-cli time-compute --anchor '{"kind":"end_of_day"}')
miloco-cli task create --task-id drink_8_today --description "今天喝够 8 杯水"
miloco-cli rule create --task-id drink_8_today \
--name "[drink_8_today] 喝水计数" \
--mode event \
--condition "用户手持水杯/水瓶/茶杯/保温杯等饮品容器,杯口贴近嘴边并伴随仰头吞咽动作;不含手持牙刷/麦克风/纸盒/食物/餐盒等非饮品物品,不含举杯凑近鼻子闻、吹凉、展示等动作" \
--action-desc "喝水次数加一;首次达标时使用手机推送通知:恭喜达标"
miloco-cli task record init drink_8_today \
--kind progress \
--content "{\"target\":8,\"unit\":\"杯\",\"window\":\"day\",\"expires_at\":\"$EXPIRES_AT\"}"
miloco-cli cron add --task-id drink_8_today --kind cron \
--name "[drink_8_today] 喝水提醒" \
--cron-expr "0 10,12,14,16,18,20 * * *" --tz "<家庭时区>" \
--message "调 miloco-cli task record get drink_8_today,按 derived.remaining 决定是否催"
miloco-cli cron add --task-id drink_8_today --kind at --at-iso "$EXPIRES_AT" \
--name "[drink_8_today] 到期销毁" --message "到期销毁 task drink_8_today" --max-delay 0用户:"每天累计玩手机超 1 小时提醒"
推理:「玩手机」人体可观测行为 → §Rule?=Y;「累计 1 小时」时长累计 → §Record?=Y · §Record.kind=duration · target_minutes=60;「每天累计 N 小时」→ §Schedule?=N;「每天」周期信号 → §Lifecycle(周期信号)=permanent · §Record.task_type=recurring · recurring_pattern={"window":"day"};跨次累计 record(duration kind) → §Rule.mode(跨次累计 record)=state;看屏幕姿态稳定窗 → §Rule.duration_seconds=90;state + duration record 离散使用型 → §Rule.exit_debounce_seconds=60;「提醒」通知类 → §Rule.action=desc · §通道反问 触发(必反问 A/B/C) · 跨次累计达标 → §达标通知机制 → on-target-desc;§Rule.感知设备 N≥1 + 未指定房间 → 不传 --source + 触发装配提示
Rule?=Y · Schedule?=N · Record?=Y · Lifecycle=permanent
Rule.mode=state · duration_seconds=90 · exit_debounce_seconds=60
通道反问 → B 手机
Record.kind=duration · target_minutes=60 · task_type=recurring · window=daymiloco-cli task create --task-id phone_time_daily --description "每天累计玩手机超 1 小时提醒"
miloco-cli task record init phone_time_daily \
--kind duration \
--content '{"target_minutes":60,"recurring_pattern":{"window":"day"}}'
miloco-cli rule create --task-id phone_time_daily \
--name "[phone_time_daily] 玩手机累计时长" \
--mode state \
--condition "用户手持手机,屏幕亮起朝向脸部,目光低头注视屏幕;不含手持平板/书本/遥控器,不含手机贴耳通话" \
--duration-seconds 90 \
--exit-debounce-seconds 60 \
--on-enter-desc "记录计时起点" \
--on-exit-desc "结束计时" \
--on-target-desc "使用手机推送通知:今日累计玩手机已达目标时长,休息一下"用户:"客厅没人就关灯"
推理:「客厅没人」环境状态变化 → §Rule?=Y;无累计/计数 → §Record?=N;现实事件触发 → §Schedule?=N;无信号兜底 → §Lifecycle(无信号兜底)=permanent;"关 X" 动作 → §Rule.mode(关 X 动作)=event;持续条件「没人」需稳定观测 → §Rule.duration_seconds=300;「客厅」指定房间 → §Rule.感知设备 N 内按 room_name 匹配命中 1 台 → --source <客厅摄像头 DID>;「关灯」固定 handler → §Rule.action=action JSON
Rule?=Y · Schedule?=N · Record?=N · Lifecycle=permanent
Rule.mode=event · duration_seconds=300 · action=action JSONmiloco-cli task create --task-id living_room_off --description "客厅没人关灯"
miloco-cli rule create --task-id living_room_off \
--name "[living_room_off] 客厅无人关灯" \
--mode event \
--condition "画面中无人" \
--source <客厅摄像头 DID> \
--duration-seconds 300 \
--action '{"did":"<客厅灯 DID>","iid":"prop.on","value":false,"idempotent":true}'用户:"久坐 30 分钟提醒一下"
推理:「坐」人体可观测姿态 → §Rule?=Y;「30 分钟」时长阈值 + 无跨次词 → §Record?=N · 单次连续 + 触发装配提示;现实事件触发 → §Schedule?=N;无信号兜底 → §Lifecycle(无信号兜底)=permanent;持续行为 + 一次性通知 → §Rule.mode(持续行为+一次性通知)=event;30 分钟 → §Rule.duration_seconds=1800;「提醒」通知类 → §Rule.action=desc · §通道反问 触发(必反问 A/B/C);句中无主体 → 主语=用户 + 触发装配提示;§Rule.感知设备 N≥1 + 未指定房间 → 不传 --source + 触发装配提示
Rule?=Y(触发装配提示) · Schedule?=N · Record?=N · Lifecycle=permanent
Rule.mode=event · duration_seconds=1800 · action=desc
通道反问 → B 手机miloco-cli task create --task-id sit_30min --description "久坐 30 分钟提醒"
miloco-cli rule create --task-id sit_30min \
--name "[sit_30min] 久坐 30 分钟提醒" \
--mode event \
--condition "用户臀部接触沙发/座椅,腰背靠近椅背或半弯曲,保持坐姿;不含蹲在地面双膝弯曲但臀部未接触座面,不含半靠扶手/桌沿臀部悬空的站姿,不含跪地或跪坐臀部触脚跟未接触座面" \
--duration-seconds 1800 \
--action-desc "使用手机推送通知:已久坐 30 分钟,建议起身活动"用户:"妈妈回家就播放欢迎曲"
推理:「妈妈」具体人物 → person list 1 命中 → role/name;「回家」到达/进入类瞬时事件 → §Rule?=Y · §Rule.mode(到达/进入瞬时事件)=state · §Rule.exit_debounce_seconds=1800 · on_exit 留空;「欢迎曲」一次性 TTS → §Record?=N · §Schedule?=N;无信号兜底 → §Lifecycle(无信号兜底)=permanent;玄关无明示视角 → §感知视角 常识默认 + 装配提示;「玄关」隐含房间 → §Rule.感知设备 N 内按 room_name 匹配命中 1 台 → --source <玄关摄像头 DID>
Rule?=Y · Schedule?=N · Record?=N · Lifecycle=permanent
Rule.mode=state(到达事件)· on_exit 留空 · exit_debounce_seconds=1800
命题主语="妈妈"(跑 person list 唯一命中)
感知视角:玄关/门口走 agent 常识默认 + 装配提示miloco-cli task create --task-id mom_arrival --description "妈妈回家欢迎播报"
miloco-cli rule create --task-id mom_arrival \
--name "[mom_arrival] 妈妈回家欢迎" \
--mode state \
--condition "妈妈伴随开门动作从户外走入玄关画面,正面或侧面对镜头;不含路过门口但未开门走入的短暂停留,不含其他家庭成员或来访客人进门" \
--source <玄关摄像头 DID> \
--exit-debounce-seconds 1800 \
--on-enter-desc "使用音箱播报通知:向妈妈说一段欢迎回家的话"用户:"提醒我每天喝 8 杯水"
推理:「我」第一人称 → person list 1 命中 → role 非空填 role · 触发装配提示;「喝水」人体可观测动作 → §Rule?=Y;「8 杯」计数达标 → §Record?=Y · §Record.kind=progress · target=8 · window=day;「每天」周期信号 → §Lifecycle(周期信号)=permanent · recurring_pattern={"window":"day"};瞬时动作 + 计数型 → §Rule.mode(瞬时动作)=event;progress+target>0 → §Schedule?=Y(cron) · §Schedule.频率默认(progress+target>0 多时点) · N=min(8,6)=6 时点 · 无强场景均分 10-20;「提醒」通知类 → §Rule.action=desc · §通道反问 触发(必反问 A/B/C);§Rule.感知设备 N≥1 + 未指定房间 → 不传 --source + 触发装配提示
Rule?=Y · Schedule?=Y(cron×6 默认+装配提示) · Record?=Y · Lifecycle=permanent
Rule.mode=event · 命题主语=<当前用户 role>("我" → 跑 person list 1 命中 → role + 装配提示;此例假设命中 role=妈妈)· Record.kind=progress · target=8 · window=day · recurring_pattern={"window":"day"}
通道反问 → B 手机miloco-cli task create --task-id drink_8_daily --description "妈妈每天喝 8 杯水"
miloco-cli rule create --task-id drink_8_daily \
--name "[drink_8_daily] 喝水计数" \
--mode event \
--condition "妈妈手持水杯/水瓶/茶杯/保温杯等饮品容器,杯口贴近嘴边并伴随仰头吞咽动作;不含手持牙刷/麦克风/纸盒/食物/餐盒等非饮品物品,不含举杯凑近鼻子闻、吹凉、展示等动作" \
--action-desc "喝水次数加一;首次达标时使用手机推送通知:恭喜达标"
miloco-cli task record init drink_8_daily \
--kind progress \
--content '{"target":8,"unit":"杯","window":"day","recurring_pattern":{"window":"day"}}'
miloco-cli cron add --task-id drink_8_daily --kind cron \
--name "[drink_8_daily] 喝水提醒" \
--cron-expr "0 10,12,14,16,18,20 * * *" --tz "<家庭时区>" \
--message "调 miloco-cli task record get drink_8_daily,按 derived.remaining 决定是否催"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.