# Viva Anki状态和下划线链路诊断工具
# 诊断流程样例:Viva Anki 状态与下划线链路
## 入口
```bash
pnpm viva:doctor --word "还不确定" --tab current --profile dev --json
```
## 输入
| 来源 | 读取内容 | 目的 |
| --- | --- | --- |
| content script | 当前页 token/phrase 扫描结果、DOM underline 状态 | 确认页面是否扫到目标词以及最终是否渲染下划线 |
| background / AnkiConnect | Anki card active/suspended/deleted/mastered/known | 确认 Anki 快照是否覆盖本地状态 |
| chrome.storage | knownWords、knownPhrases、learning 记录、rescan timestamp | 找出删除后残留或重扫缺失 |
## 核心检查
1. 归一化输入词,生成 word/phrase 两种 lookup key。
2. 查询 Anki 状态:如果卡片已删除但 mastered/known 快照仍存在,标记 `anki_snapshot_residue`。
3. 查询本地学习状态:如果存在 learning 记录但最终状态仍是 known,标记 `anki_snapshot_overrides_learning`。
4. 查询 knownWords/knownPhrases:如果取消后仍命中,标记 `known_residue_blocks_underline`。
5. 查询当前页扫描:如果 storage 已正确但页面没有 rescan,标记 `missing_rescan`。
6. 对照 DOM:只有 `learning_priority_wins=true` 且页面出现 underline/relearn affordance,才判定成功。
## 输出示例
```json
{
"word": "还不确定",
"final_state": "known",
"expected_state": "learning",
"status": "fail",
"signals": [
"anki_snapshot_overrides_learning",
"known_residue_blocks_underline"
],
"next_action": "remove word from knownWords/knownPhrases, clear mastered snapshot, trigger current-tab rescan"
}
```
## 成功/失败信号
| 结果 | 信号 |
| --- | --- |
| 成功 | 当前页面选词后立刻进入重新学习流程,未知词有下划线,learning 优先于 known,Anki active/suspended 显示一致 |
| 失败 | 删除 Anki 后 knownWords 仍残留、learning 被 mastered/known 覆盖、当前页未重扫、content 扫描不到目标词 |