## Viva 语境写卡回归台示例
### Before
Gemini 页面把一句话拆成多个节点:
```html
<div data-message-author-role="model">
<span>The cable tray was mounted on the </span><span>rack</span><span> before testing.</span>
</div>
```
旧逻辑从当前 text node 取句子,结果写入 Anki:
```html
<mark>rack</mark>
```
用户看到的问题是:卡片有单词,但没有真实语境,后续复习时无法回忆原句。
### After
回归台执行:
```bash
npm run bench:context
```
检查项:
| 检查 | 期望 |
| --- | --- |
| fragmented span 语境抽取 | `The cable tray was mounted on the <mark>rack</mark> before testing.` |
| 单 text node 页面 | 行为不退化,仍能抽完整句 |
| 旧卡语境更新 | 只调用 `updateNoteFields` |
| Anki 状态保护 | 不调用 `deleteNotes` / `addNote`,note id 和调度字段不变 |
失败输出样例:
```text
FAIL contextExtractor(gemini-fragmented-spans.html)
expected full sentence, got: <mark>rack</mark>
domPath: div[data-message-author-role=model] > span:nth-child(2) > #text
suggestion: climb to nearest text block ancestor before sentence extraction
```
这个回归台把“语境是否完整”和“更新旧卡是否破坏复习状态”都变成可自动验证的工程约束。