---
name: paper-digest
description: >
  当 Supervisor 给出论文或 blog 的 URL/标题/PDF/DOI，或阅读队列中有待处理条目时，消化内容并生成结构化笔记到 Papers/
argument-hint: "[arXiv URL / blog URL / PDF path / title / DOI]"
allowed-tools: Read, Write, Edit, Glob, Grep, Bash, WebSearch, WebFetch
---

## Purpose

给定一篇论文或技术 blog 的来源（URL、PDF 路径、标题或 DOI），它自动获取内容、提炼核心信息，并按照 `Templates/Paper.md` 格式生成结构化笔记保存至 `Papers/`。

支持两种内容类型：
- **论文**：arXiv、PDF、DOI 等学术论文
- **Blog**：技术博客文章（如 Google Research Blog、Lilian Weng、公司技术博客等）

## Steps

### Step 1：获取论文内容

根据 `source` 的类型选择获取方式：

- **arXiv URL**（如 `https://arxiv.org/abs/2603.08127`）：用 WebFetch 抓取该页面。若需要正文，同时抓取对应的 HTML 全文页（如 `https://arxiv.org/html/2603.08127`）。
- **CVF Open Access URL**（如 `https://openaccess.thecvf.com/content/CVPR2026/html/..._paper.html`）：**全文** 走同名 PDF（把路径中的 `/html/` 换成 `/papers/`、`.html` 换成 `.pdf`，即 `.../content/CVPR2026/papers/..._paper.pdf`）。⚠️ **thecvf.com 对 WebFetch 的 UA 返回 403**，必须用 Bash + curl 带浏览器 UA 下载 PDF 再用 Read 读取：
  ```bash
  curl -s --max-time 90 -A "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36" \
    -o /tmp/cvf_paper.pdf "<pdf_url>"
  ```
  然后 `Read /tmp/cvf_paper.pdf`（>10 页需指定 `pages`）。abstract、作者等元数据可同样用 curl 抓 html 页解析（`id="abstract"` / `id="authors"`），或直接从 PDF 首页提取。`venue` 字段按 proceeding 填，如 `CVPR 2026`、`ICCV 2025`。CVF 论文 PDF 免费且完整，应获取全文而非停留在 abstract。若候选来自 daily-papers，其 `pdf_url` 字段已给出 PDF 直链。
- **PDF 路径**（如 `/path/to/paper.pdf`）：用 Read 读取文件内容。
- **论文标题或关键词**：用 WebSearch 搜索（建议加上 `site:arxiv.org` 或 `filetype:pdf`），从结果中定位最可能的论文页面，再用 WebFetch 获取内容。
- **DOI**（如 `10.1145/...`）：用 WebFetch 抓取 `https://doi.org/<DOI>`，跟随重定向到出版商页面。
- **Blog URL**（非 arXiv/DOI 的普通网页链接）：用 WebFetch 抓取页面内容。从页面中提取作者、发布日期等元数据。

**网络兜底协议**：若 WebFetch / WebSearch 卡住、返回空内容、只拿到 abstract、或 arXiv / HuggingFace 页面无法完整读取，读取 `references/network-fetch-fallback.md` 并启用 Lexmount fallback。关键约束：

1. 不把 API key 写入笔记、日志、frontmatter 或可提交文件；只从 `LEXMOUNT_API_KEY` 或已被 `.gitignore` 忽略的 `.env` 读取。
2. arXiv 全文优先尝试 `https://arxiv.org/html/<arxiv_id>`，再尝试 `https://ar5iv.labs.arxiv.org/html/<arxiv_id>`；用：
   ```bash
   python3 scripts/lexmount_fetch.py extract "<url>" --format markdown
   ```
3. 若 `extract` 结果仍不完整，再用 DOM dump 检查：
   ```bash
   python3 scripts/lexmount_fetch.py dump "<url>" --engine lightmount_domstable --format text
   ```
4. HuggingFace papers / model / dataset 页面或动态页面卡顿时，先 `extract` 公共页面；仍失败再 `dump --engine chrome_cdp`。
5. Lexmount 也失败时，明确记录"未获取全文"，不得补写正文细节。

从获取到的内容中提取以下元数据（如果全文无法获取，至少要获取 abstract）：

| 字段             | 说明                                      |
| :------------- | :-------------------------------------- |
| `title`        | 完整论文标题                                  |
| `authors`      | 作者列表（字符串数组）                             |
| `institute`    | 作者所属机构（字符串数组，从 affiliation 提取）          |
| `date_publish` | 发表日期，格式 `YYYY-MM-DD`、`YYYY-MM` 或 `YYYY` |
| `venue`        | 发表场所，如 `NeurIPS 2025`、`arXiv`；blog 填来源名如 `Google DeepMind Blog`、`Lilian Weng Blog` |
| `url`          | 论文链接（优先用论文主页，无则用 arXiv abstract 页）     |
| `arxiv_id`     | arXiv id，如 `2606.19409`（非 arXiv 论文留空）        |
| `doi`          | DOI，如 `10.1109/TPAMI...`（期刊/会议有则填，否则留空）  |
| `code`         | GitHub 代码链接（若论文中提及）                     |

### Step 2：阅读并理解

**Read Critically**——论文不是圣经。找出隐含假设和适用边界，ablation、failure case、baseline 选择往往比 main result 更有信息量。对高引论文同样保持批判。

通读获取到的内容，重点提炼以下四个维度：

1. **Problem & Motivation**：作者要解决什么问题？现有方法有什么局限？为什么这个问题重要？
2. **Method**：核心方法/架构是什么？关键设计选择有哪些？用简洁的中文描述，保留必要的英文术语。对于 blog，此处提炼文章的核心论点或技术方案。
3. **Key Results**：主要实验结果是什么？在哪些 benchmark 上取得了什么指标？核心 takeaway 是什么？对于 blog，提炼关键结论、数据或 demo 效果。
4. **Strengths & Weaknesses**：方法的亮点与局限，以及对该领域的潜在影响。严格区分已知、推测、不知道——不 overclaim，不掩盖方法的局限。

如果只能获取 abstract 而非全文，在所有内容区块开头加注：`> [未获取全文，仅基于 abstract]`

### Step 3：确定文件名和 tags

**文件名格式**：`YYMM-ShortTitle.md`

- `YYMM`：取自 `date_publish` 的年份后两位 + 月份，如 `2603`（2026年3月）
- `ShortTitle`：标题的 CamelCase 缩写，2-4 个关键词，如 `EvoScientist`、`RoboClaw`、`DiffusionPolicy`
- Blog 同理，如一篇 2026 年 2 月的 blog 关于 scaling laws → `2602-ScalingLaws.md`

**去重检查**：用 Glob 扫描 `Papers/` 目录，检查是否已存在同名或同主题笔记（搜索标题关键词）。若发现重复，停止并告知 Human，不创建新文件。

**Tag 选择**：阅读 `references/tags.md`，按照规范选择 tag。

### Step 4：生成笔记

读取 `Templates/Paper.md`，按模板中的字段和 `%%` 注释指导填写所有内容。

补充规则（模板未涵盖的）：
- **rating**：必填，按模板中的 1-5 分制评分，基于内容质量和与当前研究方向的相关性综合判断
- **未获取全文**：在受影响的章节开头加注 `> [未获取全文，仅基于 abstract]`，不得推测正文内容
- **date_added**：填写今天日期，格式 `YYYY-MM-DD`

### Step 5：保存并记录

1. **写入文件**：用 Write 将笔记保存到 `Papers/YYMM-ShortTitle.md`。

2. **YAML 前置校验**：写入后立即用 Bash 执行以下检查，确保 frontmatter 可被 Quartz 正确解析：

   ```bash
   f="Papers/YYMM-ShortTitle.md"
   # 检查 title 等字段值中含冒号但未加引号的情况
   awk '/^---$/{n++; next} n==1 && /^[a-z_]+:/{print}' "$f" | while read -r line; do
     value=$(echo "$line" | sed 's/^[a-z_]*: *//')
     if echo "$value" | grep -q ':' && ! echo "$value" | grep -q '^"'; then
       echo "YAML ERROR: unquoted colon in value: $line"
     fi
   done
   ```

   若发现未加引号的字段，立即用 Edit 为该值加上双引号后重新检查。

3. **固化引用身份**：用 Bash 为该论文分配稳定 cite_key 并缓存权威 BibTeX：

   ```bash
   python3 skills/4-writing/latex-citation-enhancer/assign_cite_keys.py Papers/YYMM-ShortTitle.md
   python3 skills/4-writing/latex-citation-enhancer/fetch_bibtex.py Papers/YYMM-ShortTitle.md
   ```

   第一条从 url 抽 `arxiv_id` 并写回 `cite_key`（幂等，已有 key 不变）；第二条把 arXiv/Crossref 权威 BibTeX 存入 `references/bibtex-cache.bib`（抓不到则从 frontmatter 重建）。两条都安全可重复执行。

4. **追加日志**：用 Edit（或 Write 若文件不存在）将以下格式的 log entry 追加到 `Workbench/logs/YYYY-MM-DD.md`（日期为今天）：

   ```markdown
   ### [HH:MM] paper-digest
   - **input**: <source 的原始内容>
   - **output**: [[Papers/YYMM-ShortTitle]]
   - **observation**: <一句话描述论文核心贡献>
   - **status**: success
   ```

   若日志文件不存在，先创建文件（包含一级标题 `# YYYY-MM-DD`），再追加 entry。

5. **阅读队列**：若 source 来自阅读队列（`Workbench/queue.md` 的 Reading 部分），用 Edit 将对应条目标记为已完成（如在行首添加 `✓` 或删除该条目）。

### Step 6：survey 归属记账

笔记保存后，运行记账脚本把它挂到相关 survey 的待更新队列：

```bash
python3 scripts/survey_updates.py record "Papers/{文件名}.md"
```

- 脚本按 `Topics/*-Survey.md` frontmatter 的 `keywords` 与本笔记 tags/标题匹配（大小写与连字符已归一化），输出匹配到的 survey 列表（JSON）。
- 匹配为空是正常情况（论文不属于任何已有 survey 主题），静默继续。
- 脚本报错时不阻塞 digest：在当日 log 记一条 `survey-updates 记账失败` 即可。
- pending 的消费由 `survey-refresh` skill 负责（autoresearch 在某 survey 积压 ≥5 篇时触发）。

## Guard

- **不覆盖已有笔记**：若 `Papers/YYMM-ShortTitle.md` 已存在，停止执行并告知 Human，不得覆盖或修改已有文件。
- **不捏造信息**：所有字段必须来自论文原文。无法获取全文时，在受影响的章节开头标注 `> [未获取全文，仅基于 abstract]`，不得推测正文内容填充 Method / Key Results 等节。
- **语言规范**：正文用中文撰写，英文技术术语（模型名、方法名、benchmark 名）保持英文，不做翻译。

## Verify

- [ ] `Papers/YYMM-ShortTitle.md` 已创建且正文 >200 字
- [ ] frontmatter 的 title、authors、date_publish 字段非空
- [ ] **YAML 前置校验通过**：所有含冒号的字段值已加双引号（title、venue 等）
- [ ] **引用身份已固化**：frontmatter 的 `cite_key` 非空，`references/bibtex-cache.bib` 含该 key 的条目
- [ ] Summary 节非空且不超过 3 句话
- [ ] 日志已追加到 `Workbench/logs/YYYY-MM-DD.md`

## Examples

**示例 1：从 arXiv URL 消化论文**

```
/paper-digest "https://arxiv.org/abs/2603.08127"
```

执行过程：
1. WebFetch `https://arxiv.org/abs/2603.08127` 获取 abstract、作者、日期等元数据
2. WebFetch `https://arxiv.org/html/2603.08127` 获取 HTML 全文
3. 提炼 Problem / Method / Results / Strengths & Weaknesses
4. Glob `Papers/2603-*.md` 检查是否重复
5. 读取 `references/tags.md` 选取合适 tags
6. Grep `Papers/` 和 `Ideas/` 搜索相关笔记
7. 写入 `Papers/2603-EvoScientist.md`
8. 追加日志到 `Workbench/logs/2026-03-26.md`

输出文件：`Papers/2603-EvoScientist.md`

---

**示例 2：从论文标题搜索**

```
/paper-digest "Diffusion Policy: Visuomotor Policy Learning via Action Diffusion"
```

执行过程：
1. WebSearch `"Diffusion Policy: Visuomotor Policy Learning via Action Diffusion" site:arxiv.org`
2. 获取 arXiv 链接，WebFetch 抓取内容
3. 后续步骤同示例 1

输出文件：`Papers/2303-DiffusionPolicy.md`

---

**示例 3：从本地 PDF 消化**

```
/paper-digest "/Users/qingli/Downloads/roboclaw_2025.pdf"
```

执行过程：
1. Read `/Users/qingli/Downloads/roboclaw_2025.pdf` 读取 PDF 内容
2. 从内容中提取元数据（title、authors、date、venue）
3. 后续步骤同示例 1

---

**示例 4：从 blog URL 消化**

```
/paper-digest "https://lilianweng.github.io/posts/2024-11-28-reward-hacking/"
```

执行过程：
1. WebFetch 抓取 blog 页面内容
2. 提取元数据：title、author（Lilian Weng）、date_publish、venue 填 `Lilian Weng Blog`
3. institute、code 无法确定则留空
4. 提炼 Problem / Method（核心论点）/ Key Results（关键结论）/ Strengths & Weaknesses
5. 后续去重、tag 选择、Connections 搜索、保存、日志同论文流程

输出文件：`Papers/2411-RewardHacking.md`
