## 诊断流程样例
| 阶段 | 输入 | 检查 | 通过信号 | 失败信号 |
| --- | --- | --- | --- | --- |
| 1. 解析目标 | runtime prompt / session log | 提取 `Report target` | 得到绝对路径 | 找不到目标路径字段 |
| 2. 检查文件 | Odyssey Markdown 路径 | `exists && size > 0` | 文件存在且非空 | `missing_file` 或 `empty_file` |
| 3. 检查结构 | Markdown 正文 | 标题、推荐段落、链接数 | 含 `Daily i+1 Reading Recommendations` 且链接数 >= 1 | `missing_required_section` 或 `no_links` |
| 4. 检查 session | assistant/event messages | 是否有最终回答和保存完成信号 | 有 assistant message 或 save marker | `no_assistant_message` / `no_save_signal` |
### 示例命令
```bash
python tools/scheduled_report_output_doctor.py \
--session-log runs/2026-05-05/sessions/019df5a6-4309-7a71-9e45-b3a7a4bef1ed.jsonl \
--report-target "$HOME/Library/Mobile Documents/com~apple~CloudDocs/odyssey/0 收集箱/每日英语i+1阅读/2026-05-05 每日英语i+1阅读.md" \
--expect-title "Daily i+1 Reading Recommendations" \
--min-links 1 \
--out out/diagnostics/019df5a6-4309-7a71-9e45-b3a7a4bef1ed.json
```
### 期望输出
```json
{
"status": "fail",
"report_target": "~/Library/Mobile Documents/com~apple~CloudDocs/odyssey/0 收集箱/每日英语i+1阅读/2026-05-05 每日英语i+1阅读.md",
"failed_checks": ["no_assistant_message", "no_save_signal", "missing_file"],
"remediation": ["重新运行日报生成", "检查 runner 是否把最终消息写入 Report target", "补充保存完成 marker"]
}
```