# i+1 阅读推荐上下文诊断
## 诊断流程样例
### 入口
```bash
cd /Users/bytedance/Documents/learning-bu
python3 tools/i_plus_one_context_diagnostic.py \
--date 2026-05-10 \
--odyssey-dir "$HOME/Library/Mobile Documents/com~apple~CloudDocs/odyssey" \
--anki "$HOME/Library/Application Support/Anki2/User 1/collection.anki2" \
--browser-history "$HOME/Library/Application Support/Google/Chrome/Default/History" \
--out out/i_plus_one_context_report_2026-05-10.json
```
### 输入来源
| source | 检查内容 | 成功信号 | 失败/降级信号 |
|---|---|---|---|
| Odyssey/日更 | 昨日笔记、项目关键词、学习轨迹 | 命中昨日时间窗且有 3+ 条可引用证据 | `stale_odyssey_snapshot` 或无昨日记录 |
| 本地活动 | Night Gym、近期项目、shell/日志摘要 | 能定位到昨日主题和 cwd | 只能读到单个复盘文件 |
| 浏览历史 | 昨日网页主题、已读文章、站点频次 | 可读 history/export 且有 URL 列表 | `missing_browser_history` |
| Anki | collection/deck/card 状态、成熟词覆盖 | 能输出已知词、未知词、新概念差集 | `missing_anki_collection` 或字段不可解析 |
| 网页检索 | 今日候选文章 URL 和正文 | 候选文章可访问并能抽正文 | URL 404、paywall、正文过短 |
### 核心检查
1. 先生成 source coverage:哪些上下文源可读、各自更新时间、记录数、是否覆盖昨日。
2. 再对候选文章跑正文抽取和词汇/概念差分:文章术语是否已在 Anki 成熟卡中出现,哪些概念是新增。
3. 给每篇文章打推荐等级:`ready` 表示多源上下文齐全且新增概念可复算;`degraded` 表示上下文缺源但仍可推荐;`blocked` 表示 Anki 或正文不可读导致 i+1 无法判断。
4. 最后把诊断摘要写入推荐回答:推荐前先说本次依据了哪些源,哪些数字是实测,哪些只是估算。
### 输出样例
```json
{
"date": "2026-05-10",
"overall_status": "degraded",
"source_status": {
"odyssey": "ok",
"local_activity": "ok",
"browser_history": "missing",
"anki_collection": "ok",
"web_search": "ok"
},
"recommendation_rules": [
"可以推荐文章,但必须标注缺少浏览历史",
"新增概念数只允许来自 anki_vocab_delta.py 的 diff;否则显示为区间"
]
}
```
### 推荐落地变化
Before:`这篇文章大约有 7 个新概念,适合你当前 14,678 词汇量。`
After:`诊断状态:degraded,Odyssey/本地活动/Anki 可用,浏览历史不可用。本文基于 Anki diff 有 5 个未见术语、2 个可能新概念;因为缺少昨日浏览历史,不把它称为完全个性化推荐。`