# 扩展后台预加载运行时smoke
## 诊断流程样例
### 输入
- `extension-dir`: `~/Documents/product-bu/obsidian/obsidian-clipper/dist`
- `page-url`: smoke 脚本启动的本地 HTML 页面
- `openrouter`: smoke 脚本启动的本地 mock endpoint,返回一个固定 data URL,并记录请求次数
- `wait-ms`: 65000 或更长,覆盖 60 秒预加载阈值
### 流程
1. 运行 `npm run build:chrome` 生成 unpacked extension。
2. 运行 `npm run smoke:scholar-preload -- --wait-ms 65000 --mock-delay-ms 300`。
3. 脚本用临时 Chrome profile 加载 `dist/`,打开 smoke page,但不打开 popup。
4. 等待 60 秒后,检查 background service worker 是否已收到 `scholarNotePreloadEligible`,并查询 `getScholarNotePreloadStatus`。
5. 打开 popup 或直接发送 `getScholarNoteImage`,确认它复用 pending/ready cache,而不是重新发起生图链路。
### 成功信号
- popup 打开前,后台状态已经从 `idle` 进入 `pending` 或 `ready`。
- mock OpenRouter 请求数保持为 1。
- 手动点击后返回同一个 `pageKey`,并渲染图片或等待同一个 pending promise。
### 失败信号
- 页面打开 70 秒后后台仍是 `idle`。
- popup 打开后才出现第一条 OpenRouter 请求。
- 手动点击导致 request count 从 1 变 2。
- UI 只显示“正在生成”,但后台没有 ready/pending 状态可解释。