# 🧪 测试路径（Test Drive）

> 跟随本路径逐步测试 i-am-cooking 的全部功能。每步都有**具体指令**和**预期结果**。
> 环境：macOS（声音/TTS/音量用系统命令）；假设已 `/reload` 加载最新版。

## 测试前准备

1. 在 pi 里执行 `/reload`（加载最新安装）
2. 保持系统音量**非静音且 >30%**（便于听到声音；若想测音量功能请把音量调到 0% 或静音）

---

## 阶段 0：加载 & 状态（5 分钟）

| # | 指令 | 预期结果 |
|---|---|---|
| 0.1 | `/i-am-cooking status` | 显示"模式: 在岗"；通道列表；无报错 |
| 0.2 | `/i-am-cooking ` 按 Tab | 弹出子命令补全（on/off/status/setup/test/rules/...） |

---

## 阶段 1：配置（10 分钟）

| # | 指令 | 预期结果 |
|---|---|---|
| 1.1 | `/i-am-cooking setup` | 向导启动，显示"手机推送配置向导" |
| 1.2 | 向导里选 **ntfy**（回车/1） | 进入 ntfy 说明页 |
| 1.3 | 跟随向导填 topic（用建议的随机值）、跳过 token | 预览确认页出现 |
| 1.4 | 确认 → 被问"自动提升音量？" → 选**否**（先不测音量） | 保存成功 |
| 1.5 | 被问"测试手机推送？" → **是**（若手机已装 ntfy 并订阅 topic） | 手机收到"测试推送"通知 |
| 1.6 | `/i-am-cooking status` | 显示"手机推送: ntfy topic=... token=已配置/未配置" |

---

## 阶段 2：自主等级（5 分钟）

| # | 指令 | 预期结果 |
|---|---|---|
| 2.1 | `/i-am-cooking level` | 显示"当前自主等级：平衡（有点难度才喊，默认）" + 三个选项说明 |
| 2.2 | `/i-am-cooking level conservative` | 提示"自主等级已切换：谨慎（遇墙就喊）" |
| 2.3 | `/i-am-cooking status` | "自主等级: 谨慎（遇墙就喊）" |
| 2.4 | `/i-am-cooking level autonomous` | 提示"放手（能不喊就不喊）" |
| 2.5 | `/i-am-cooking level balanced` | 切回平衡（后续测试用） |

---

## 阶段 3：自定义铃声 & 测试通道（10 分钟）

| # | 指令 | 预期结果 |
|---|---|---|
| 3.1 | `/i-am-cooking sound` | 弹出铃声菜单 |
| 3.2 | 选"设置自定义歌曲" → 输入 `/System/Library/Sounds/Glass.aiff` | 提示"自定义歌曲已设置" |
| 3.3 | `/i-am-cooking sound` → 选"试听" | 听到：哔哔 4 声 → 中文语音"叮咚，这是测试语音！" → Glass 提示音 |
| 3.4 | `/i-am-cooking sound` → 选"设置总时长上限" → 输入 `5` | 提示"总时长上限已设为 5 秒" |
| 3.5 | `/i-am-cooking test` | 先显示"正在测试全部通道…"，然后"测试完成：声音 ✓ | TTS ✓ | 桌面通知 ✓ | 手机推送 ✓"；能听到三段式声音 |
| 3.6 | `/i-am-cooking sound` → 选"清除自定义歌曲" | 提示已清除（测完恢复默认） |
| 3.7 | `/i-am-cooking sound` → 选"设置总时长上限" → 输入 `60` | 恢复默认 60 秒 |

---

## 阶段 4：核心——离开模式（15 分钟）

| # | 指令 | 预期结果 |
|---|---|---|
| 4.1 | `/i-am-cooking on 测试：做个调研，遇到人类墙喊我` | 状态变"🍳 离开中"；agent 收到自主推进指令 |
| 4.2 | （观察）agent 自主干活，不问你问题 | 它按自主规则推进 |
| 4.3 | `/i-am-cooking status` | 显示"模式: 🍳 离开中（I am cooking）" |
| 4.4 | **模拟卡住**：给 agent 发消息 `停下来，回答我：你收到呼喊测试了吗？` | agent 会用 `shout_for_user` 喊你（若它判断这是"必须用户处理"） |
| 4.5 | 收到呼喊（声音/弹窗/横幅出现"pi 需要你！"） | 多路通道同时触发 |
| 4.6 | 输入任何文字（如 `我回来了`） | 自动退出离开模式；agent 汇报"我不在时你喊了我这些事" |
| 4.7 | `/i-am-cooking status` | 模式回到"在岗" |

> 4.4 的替代验证（更可控）：直接让 agent 调用 `shout_for_user`——发消息 `请调用 shout_for_user 工具，message="测试呼喊"，urgency="normal"`，观察它是否真的调用并触发多路呼喊。

---

## 阶段 5：Agent 自主开启（10 分钟）

| # | 指令 | 预期结果 |
|---|---|---|
| 5.1 | 直接发消息：`我去做饭了，你继续帮我整理这个项目的 README 结构` | **不敲任何命令**，agent 应理解并调用 `enter_cooking_mode`，自动开启离开模式 |
| 5.2 | `/i-am-cooking status` | 显示"模式: 🍳 离开中"（证明 Agent 自主开启了） |
| 5.3 | 发消息：`我回来了` | 自动退出 + 汇报 |
| 5.4 | **负向测试**：发消息：`帮我看看这个文件`（没有离开意图） | agent **不应**开启离开模式（状态保持"在岗"） |

---

## 阶段 6：动态偏好 & 安全网（10 分钟）

| # | 指令 | 预期结果 |
|---|---|---|
| 6.1 | `/i-am-cooking on 完成后喊我` | 备注带偏好 → 立即切到 `completion_only` |
| 6.2 | 发消息 `我回来了` | 退出；验证偏好未残留（下次 on 重置为 normal） |
| 6.3 | 再次 `/i-am-cooking on` | 偏好恢复 `normal`（证明偏好是会话级的） |
| 6.4 | 离开模式下发消息：`别喊了` | 立即切换 `silence`（文字匹配保险丝，不依赖 agent） |
| 6.5 | `/i-am-cooking status` | "呼喊偏好: 安静模式" |
| 6.6 | 发消息 `我回来了` | 退出 |
| 6.7 | **安全网**：`/i-am-cooking on`，然后给 agent 发一个以"？"结尾的问题，观察 agent 回合结束 | agent 若以"？"结尾等你 → 自动呼喊（normal） |

---

## 阶段 7：规则定制（10 分钟）

| # | 指令 | 预期结果 |
|---|---|---|
| 7.1 | `/i-am-cooking rules` | 显示当前生效规则（含底线规则） |
| 7.2 | `/i-am-cooking edit-rules` | 打开编辑器，内容是出厂默认规则 |
| 7.3 | 加一条：`- 测试规则：每次回复前先报告当前进度。` → 保存 | 提示"规则已保存" |
| 7.4 | `/i-am-cooking on 测试规则` | 离开模式，观察 agent 是否按新规则"先报告进度" |
| 7.5 | 发消息 `我回来了` | 退出 |
| 7.6 | `/i-am-cooking reset-rules` | 规则恢复出厂默认 |
| 7.7 | `/i-am-cooking rules` | 确认自定义规则已消失 |

---

## 阶段 8：防打扰参数（5 分钟）

| # | 指令 | 预期结果 |
|---|---|---|
| 8.1 | `/i-am-cooking limits` | 弹出中文菜单，显示 4 个参数当前值 |
| 8.2 | 选"紧急呼喊重复间隔" → 输入 `2` | 提示"紧急呼喊重复间隔已设为 2 分钟" |
| 8.3 | `/i-am-cooking status` | 防打扰行显示"紧急每 2 分钟重喊" |
| 8.4 | `/i-am-cooking limits` → 选"紧急呼喊重复间隔" → 输入 `1` | 恢复默认 1 分钟 |

---

## 阶段 9：音量控制（5 分钟，可选）

| # | 指令 | 预期结果 |
|---|---|---|
| 9.1 | 把系统音量调到 **0%**（静音状态） | — |
| 9.2 | `/i-am-cooking setup` → 被问"自动提升音量？" → 选**是** | 音量控制启用 |
| 9.3 | `/i-am-cooking test` | **听到声音**（证明自动解除静音+拉高音量） |
| 9.4 | `/i-am-cooking on 音量测试` → 立即 `/i-am-cooking off` | off 后音量**恢复原值**（0% 静音） |

---

## 阶段 10：会话隔离（5 分钟）

| # | 指令 | 预期结果 |
|---|---|---|
| 10.1 | `/i-am-cooking on 隔离测试` | 离开模式开启 |
| 10.2 | 关闭当前会话（Ctrl+D / /exit） | — |
| 10.3 | 重新启动 pi（同项目路径） | **状态为"在岗"**，不显示"离开中"（离开状态不跨会话） |

---

## 测试记录表

| 阶段 | 通过 | 备注 |
|---|---|---|
| 0 加载 & 状态 | ☐ | |
| 1 配置 | ☐ | |
| 2 自主等级 | ☐ | |
| 3 铃声 & 通道 | ☐ | |
| 4 核心离开模式 | ☐ | |
| 5 Agent 自主开启 | ☐ | |
| 6 偏好 & 安全网 | ☐ | |
| 7 规则定制 | ☐ | |
| 8 防打扰参数 | ☐ | |
| 9 音量控制 | ☐ | |
| 10 会话隔离 | ☐ | |
