# Heartbeat — 育儿管家定时任务

> 这里定义所有"AI 自己醒来主动做的事"。
> 任何主动联系**必须先通过** `PROACTIVE.md`「开口前必做的核对」——不在用户偏好窗口内 → `[SKIP]`。

## 任务清单

| 触发条件 | 频率 | 动作 | 是否打扰用户 |
|---------|------|------|-------------|
| 每日 0:00 | 每日 1 次 | 跑 `scripts/check_memory_freshness.sh` 对账 | 仅在发现差异时静默修复，**不发消息** |
| 每月 X 日（X = 孩子的"月龄日"） | 每月 1 次 | 汇总当月发育情况、对照 WHO 曲线 | 打扰，但仅在用户偏好窗口内 |
| 疫苗后 24 小时 | 满足时触发一次 | 询问反应 | 打扰（窗口内） |
| 发烧未结案 ≥6 小时无新读数 | 满足时触发一次 | 询问最新体温 | 打扰（窗口内） |
| 排敏第 3 天无过敏标记 | 满足时触发一次 | 提示"可以纳入安全清单" | 打扰（窗口内） |
| 距离下次疫苗 ≤7 天 | 一次提醒 | 提醒预约 | 打扰（窗口内） |

## 详细规则

### 1. 每日 0:00 对账（必跑，**静默**）

**目的**：防止 AI 写完专项文件忘了同步 MEMORY.md。

**步骤**：
1. 调用 `execute_shell_command` 执行 `bash scripts/check_memory_freshness.sh`
2. 解析输出：
   - 退出码 0 = 已同步，结束（不发消息）
   - 退出码 2 = 有专项文件比 `MEMORY.md` 更新
3. 如果退出码 2：
   - 读取每个新文件的最新一条记录
   - `edit_file` 把对应索引行更新到 `MEMORY.md`
   - `append_file` 一行到 `memory/{today}.md`：
     ```
     [00:00] 跑对账：发现 N 个未同步项，已修复 → MEMORY.md
     ```
   - **不发消息**给家长（凌晨 0 点）

### 2. 月龄汇总（每月 1 次）

**条件**：今天的日期 = 孩子出生日的"日"（例如出生于 6/19 → 每月 19 日触发）。

**首先核对时间**：
- 当前时间是否在 `USER.md` 联系窗口内？不在 → `[SKIP]`，第二天再尝试
- 是否是不打扰时间段？是 → `[SKIP]`

**动作**：
1. 调 `execute_shell_command + date` 计算当前精确月龄
2. 读取本月 `memory/child/PROFILE.md` 中的最新身高体重
3. 读取本月 `MILESTONES.md` 中的新里程碑
4. 读取本月 `FEEDING.md` 中的新通过 / 新过敏食材
5. 用 `web_search + web_fetch` 验证 WHO 生长曲线对照
6. 生成简短月报（200 字内 + 来源 ✅已验证）
7. 通过 `lastDispatch` 渠道发给家长

### 3. 疫苗反应跟踪（条件触发）

**条件**：
- `HEALTH/vaccines.md` 最新一条接种时间在 24-30 小时前
- 当日工作日志 `memory/{today}.md` 中**没有**关于该疫苗反应询问的记录

**动作**：
- 必须核对联系窗口
- 发一句温和的关心（≤50 字）：
  ```
  {child_name} 昨天打的 {vaccine_name}，今天有什么反应吗？发烧、皮疹、嗜睡、食欲变化都可以告诉我。
  ```
- 写日志记录"已询问 {vaccine_name} 反应"避免重复

### 4. 发烧未结案跟踪（条件触发）

**条件**：
- `HEALTH/records.md` 中有一条状态为「监测中」的发烧记录
- 最后体温读数 ≥37.5°C
- 距上次读数 ≥6 小时

**动作**：
- 必须核对联系窗口
- 询问最新体温：
  ```
  {child_name} 上次体温 {temp}°C 是 {hours} 小时前了，现在怎么样？
  ```
- 收到回复后用 5 步流程更新 `records.md`

**自动结案**：连续 12 小时体温 <37.3 → 在 `records.md` 把状态改为「已结案」。

### 5. 排敏第 3 天提示（条件触发）

**条件**：
- `FEEDING.md` 中有「待排敏」食材进入第 3 天
- 期间无过敏标记

**动作**：
- 询问家长是否要纳入安全清单：
  ```
  {child_name} 吃 {food} 已经第 3 天了，没有看到过敏反应。可以更新到"已通过"吗？
  ```
- 收到确认后 `edit_file` 把状态从「待排敏」改成「✅ 已通过」

### 6. 下次疫苗预约提醒

**条件**：`HEALTH/vaccines.md`「计划中」段最早的疫苗距今 ≤7 天，且本周未提醒过。

**动作**：发一条提醒：
```
{child_name} 离接种 {vaccine_name} 还有 {days} 天，记得提前去社区医院预约。
```

---

## 共同前置：PROACTIVE 核对

所有"打扰用户"的任务**必须先**完成全局 `PROACTIVE.md` 的「开口前必做的核对」清单：

1. ✅ 系统提示中的 `Current time (authoritative)` 已读取
2. ✅ `USER.md` 主动联系偏好已查
3. ✅ 当前时间在偏好窗口内
4. ✅ 没有撞上节假日 / 不打扰时间
5. ✅ 没超过当日联系频率上限

任何一条不通过 → `[SKIP]`。

---

## 心跳之间的协作

- HEARTBEAT 触发的所有动作都会写日志到 `memory/{today}.md`，前缀 `[HH:MM 心跳]`
- 用户对心跳消息的回复仍然走完整 5 步流程（识别 → 写专项 → 同步索引 → 写日志 → 打卡）
- 心跳日志不要重复用户已经看到的专项文件内容——日志只记"AI 自己做了什么"
