## 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 ``` 这个回归台把“语境是否完整”和“更新旧卡是否破坏复习状态”都变成可自动验证的工程约束。