# 静默心跳 / 主动汇报:可复现的调度示例 > 新任务优先使用 [原生定时闭环](timer-first.md),支持重启恢复、预算和完成/等待状态。以下保留旧 schedule 示例供比较。 > 本页给出两种把「唤醒与打扰分离」跑起来的方式。共同语义:**醒来先检查,有真正值得说的事才开口;否则只记日志,保持沉默。** ## 方式一:会话内 schedule(最简单,有唤醒卡片) 在你的 DSH 会话里直接对 agent 说(或让 agent 用 `schedule_create` 建): > 建一个静默心跳:每 2 小时唤醒一次。每次醒来检查 `<你关心的目录或文件>`, > 只有发现真正有意义的新进展或需要我参与的事才简短汇报; > 否则在 `<日志文件>` 追加一行「心跳:检查了什么,结论:不说」,不要打扰我。 对应的调度参数(`schedule_create`): ``` title: Muse silent heartbeat every_seconds: 7200 # 静默检查可以更频繁,说话率由判断门控制 prompt: 按「检查但未必说」语义执行……只有真正值得说才向用户汇报, 否则只记日志保持沉默,不要为了汇报而汇报 ``` 已知边界(实测):提醒投递需要会话空闲;agent 忙碌时被压住、空闲后补投(at-least-once)。 每次唤醒在 GUI 会留下「自动化任务」卡片——这是留痕不打扰,做不到无痕。 ## 方式二:对话外闸门(无痕迹,推荐) 判断移到对话外,主线只在「值得说」时收到消息,无任何多余卡片: ``` launchd / cron(每 1 分钟) → 确定性预检脚本(文件存在?超阈值?) ├─ 不满足 → 退出,零痕迹 └─ 满足 → (可选)廉价 LLM API 判断「值得打扰吗」 ├─ 不值得 → 退出,零痕迹 └─ 值得 → 持久化本地 mailbox,由插件以非人类来源投递主线 ``` 投递采用 `examples/lib/dsh-client.mjs` 的本地 mailbox。只读会话查询使用回环 RPC;不再通过 `session/prompt` 将定时消息伪装成人类输入。 ## 判断门怎么写(两条分支都要测) - **静默分支**:放一个「无事发生」的周期,验证主线安静 + 日志有「结论:不说」 - **开口分支**:预置一个信号文件(模拟需要用户参与的事),验证 agent 主动汇报并清理信号 两条都通过,心跳才算可用——频率刻板与否取决于说话率,不取决于心跳周期。 ## 日历事件 source(jxa-calendar,本机零 OAuth) ```json [ { "type": "jxa-calendar", "hoursAhead": 12, "messageTemplate": "日程提醒:$summary($startLabel)" } ] ``` gate 每 2 分钟巡逻时检查未来 12 小时的日历事件。权限被拒时输出授权指引。配合判断门:节假日等低价值事件被过滤,真会议/约定才提醒。 ## 目标级专属日程(Muse 式「每个目标有自己的节奏」) > **首选:`muse_routine` 工具**(muse 插件内置)——在授权 turn 里直接说「每 30 分钟推进一次,最多 24 次」,agent 调用 `muse_routine {operation:"create", every_seconds:1800, max_runs:24, prompt:"..."}`。带运行预算、pause/resume(需人类请求)、结果三态(progress/waiting/done)、重启恢复。以下 schedule_create 方式为不装 muse 时的替代。 全局心跳之外,**每个长期目标可以绑一条专属调度**:到期唤醒时只推进这个目标的一个工作单元,多目标各走各的节奏。 ```text schedule_create: title: <目标名> 目标推进 every_seconds: 1800 # 该目标专属节奏 prompt: | 【<目标名> 推进单元】从 <目标文档/backlog> 找下一个可自主推进项, 做一个工作单元 → commit/push/留证据。 无事可做时只记日志,不向用户输出。 ``` 要点: - 绑定 goal 的定时任务只做复查;paused/blocked/disarmed/轮数耗尽时不得额外推进。独立任务使用原生 routine,由直接人类请求授权其范围和预算。 - 无事可做的唤醒只留日志静默(判断门语义) - 需要用户决策/凭据时才简短汇报