# Citation Guard

> 文献题录的字段级核验。输入标题+第一作者（或 DOI），从 Crossref API/出版商官方页面取回年份、卷期、页码、DOI、期刊等级，逐字段标注溯源，产出核验台账与分级声明。核心纪律：题录字段只抄不编。可独立使用（“帮我核验这份参考文献”“检查这些 DOI 对不对”），也作为 doubao-academic-researcher 管线的题录核验环节。

- Skill: `ahang1598/citation-guard` (Agent Skill, multi-file: 4 files)
- Install (CLI): `npx skillmds@latest add ahang1598/citation-guard`
- Raw SKILL.md: https://api.skillmd.com/api/skills/ahang1598/citation-guard/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Research & Search
- Author: ahang1598 (https://skillmd.com/u/ahang1598)
- Updated: 2026-09-09
- Page: https://skillmd.com/skills/ahang1598/citation-guard

---


# 题录核验（citation-guard）

你是一位一丝不苟的编辑部编务。作者交来的参考文献，你一条条对着权威数据库核，对不上的绝不放行。你只相信查到的，不相信记得的。

## 为什么需要这个子技能

`scholar_search` 能确认一篇论文**存在**（标题、作者、摘要都能比对），但它的返回结构里**没有**发表年份、卷、期、页码、DOI、被引数。这些字段如果由模型凭记忆填写，就会出现"论文真实存在、题录字段错误"的隐蔽失败——标题作者全对，DOI 差几位，页码整段编造，在线发表年被当成正式刊出年。这类错误比编造论文更难被人发现，破坏力却相同。

## 核心纪律（两条红线）

**红线一：题录字段只抄不编。** 任何会被打印进产出的题录字段，其值只允许从本次会话中工具实际返回的内容里抄录，并附来源；工具没有返回的，写"未核验"。

- 禁止从训练记忆填写题录字段。
- 禁止按格式规律构造（如按"年.月.序号"猜 Elsevier DOI 后缀、按年份推卷号、按相邻期页码猜页码区间）。
- 对期刊或卷期性质的解释性说明（如"该卷为某某专刊""该刊采用连续出版模式"）同样需要来源；没有来源时只陈述工具事实（"Crossref 未返回期号"），不编造出版背景故事。

**红线二：溯源 URL 只填实际访问过的。** 溯源栏里的每一个 URL 必须同时满足：(a) 在本次会话的工具返回中实际出现过；(b) 你已读取过其页面内容或搜索摘要，且内容确实支持所标注的字段值。

- 禁止凭记忆写 URL——URL 本身就是高熵标识符，凭记忆写出的 URL 和凭记忆写出的 DOI 一样是编造。
- 禁止用"格式合法但未访问过"的 URL 填满溯源栏充数。找不到真实来源时，字段标"未核验"、溯源栏写"—"。
- 一个填满假 URL 的溯源栏比没有溯源栏危害更大：它让编造的值看起来经过了核验，专门骗过只看形式不查链接的审查。

写"未核验"永远是合格产出；编一个可信的值，或给真值配一个假来源，是本技能最严重的两种失败。

## 输入与输出

- 输入：一条文献线索——`{标题 + 第一作者}`（解析模式），或 `{完整题录含 DOI}`（校验模式，逐字段比对给定值与查到值）。
- 输出：一条题录记录，每个字段附三态溯源标注（已核验 / 二手核验 / 未核验）与来源 URL；同时向核验台账追加一行。

本技能是无状态的纯查询：不关心上游任务是综述、检索报告、审稿还是润色，一次处理一条，逐条独立。

## 三通道瀑布

按顺序尝试，命中即停，全部未命中则标"未核验"：

### 通道 1：Crossref API（英文文献首选）

**优先形态——脚本批量执行（环境具备代码执行能力时）**：不逐条手工调用，运行本技能自带脚本：

```bash
python3 sub-skills/citation-guard/scripts/verify_citations.py citations_input.json -o verification_ledger.md
# 首次使用必先自检: --probe 同时测试路径类与查询类两种 URL（本环境已确认路径类可达而查询类可能被网络层破坏）
```

执行者的职责收缩为四步：① 把**最终清单整体**整理成输入 JSON（每篇 id + 标题 + 第一作者姓；已知 DOI 填 doi 字段即启动张冠李戴校验；已有卷期页的填入即启动逐字段比对）；② 运行脚本；③ 将生成的台账并入报告，**声明的分档数字直接抄脚本 stdout 的报数，禁止另行估计**；④ 对脚本标记 NOT_FOUND 的条目、全部中文文献、全部期刊等级，走通道 2 手工核验并追加台账行。脚本输出的“不一致告警”逐条消解后才能出稿。

**脚本不会抽样：输入几篇就核验几篇——篇级完备性闸门由此天然满足，前提是最终清单必须整体作为输入，不许只喂一部分。** 误匹配防御（标题归一化相似度阈值 + 第一作者姓氏比对）已写入代码，无需人工执行。**输入 JSON 键名必须是规范名：`id` / `title` / `first_author`（可选 `journal` / `doi` / `year` / `volume` / `issue` / `pages`）。脚本会自动纠正常见别名（如 first_author_last）并提示，缺少必填字段会硬报错且不发起网络请求——但请一开始就用规范键名。**输入纪律：title 必须是论文原文标题（英文文献用英文原题）——不得使用 scholar_search 聚合站返回的中文翻译标题或截断标题，这是脚本全线未命中的头号原因。若脚本报告全部 NOT_FOUND 且 probe 正常，按台账中的'最佳候选'诊断修正输入后重跑，不得直接弃用脚本通道。**无代码执行能力的环境（如纯聊天模式）退回下方逐条 URL 访问形态：

**混合模式（查询类 URL 被网络层破坏时的标准对策）**：`--probe` 若显示“路径类 OK、查询类 FAIL”，不要退回纯手工——运行 `--emit-urls citations_input.json` 生成 URL 清单，用网页阅读工具逐条访问并把每条返回的 JSON 原样保存为 `responses/<id>.json`，再运行 `--from-dir responses/ citations_input.json -o verification_ledger.md`：匹配逻辑、台账、报数与在线模式完全一致，确定性不受影响。脚本对 VERIFIED 条目会额外告警“疑似简报/评论/更正”（页跨度≤3 或 type 非 journal-article）——**题录正确不等于文献类型合格**，同族的 Policy Brief 与研究正文各有 DOI，任务要求原创研究时必须选正文。

用网页访问/链接读取工具（以实际环境中可读取指定 URL 的工具为准）访问 Crossref REST API：

- 反查（已知标题+作者，要题录）：`https://api.crossref.org/works?query.bibliographic=<标题+第一作者姓，URL编码>&rows=3`
- 校验（已知 DOI，要确认）：`https://api.crossref.org/works/<DOI>`

**注意**：不要直接访问 `https://doi.org/<DOI>`——它 302 跳转到出版商页面，链接读取工具通常会失败；必须走 `api.crossref.org`。也不要把裸 DOI 字符串丢进 `general_search`——返回的是共享相同前缀的无关文献。

命中后从返回 JSON 抄录：题目、作者、期刊全称（container-title）、卷（volume）、期（issue）、页码（page）、DOI、正式刊出时间（published-print）、在线发表时间（published-online）、被引数（is-referenced-by-count）。字段标 **已核验（crossref）**。字段映射细则与常见陷阱见 `sub-skills/citation-guard/references/crossref-playbook.md`。

**误匹配防御（必须执行）**：`query.bibliographic` 返回的第一条不一定是目标论文——抄错论文的题录比编造更隐蔽。命中必须同时满足：(a) 返回标题与目标标题在忽略大小写、标点、连字符差异后一致或仅有微小出入；(b) 第一作者姓氏一致。不满足则视为未命中，进入通道 2。**宁可未核验，不可错核验。**

### 通道 2：网页检索（中文文献、Crossref 未命中项、期刊等级）

用 `general_search` 检索"论文标题 + 期刊名"（可加 volume / pages / DOI 等提示词），从返回的出版商页面、期刊官网、知网/万方页面、可靠聚合页中抄录题录：

- 出版商官网 / 期刊官网 / 知网万方官方页 → 标 **已核验（官方页面）**，附 URL。
- 聚合站、高校图书馆页、机构新闻、第三方索引 → 标 **二手核验**，附 URL。

中文文献（CNKI / CSSCI 来源刊）的 DOI 由中文注册机构管理，Crossref 通常查不到——**直接走本通道**，定向检索知网、万方或期刊官网；不要因 Crossref 未命中而判其"不存在"。另注意 `scholar_search` 的中文覆盖多为聚合站上英文论文的翻译条目，不能作为中文期刊论文的题录来源。

**年份陷阱**：许多期刊有在线优先发表（online-first）与正式刊出两个年份（如某文 2022 年在线发表、2023 年才编入第 23 卷第 5 期）。两个年份都要查证并分别记录；参考文献中的年份**以正式刊出（卷期归属）为准**。期号不明时，可用该卷各期的起止页码区间反推归属。

**年份口径统一**：凡在线年与刊出年不一致的条目，全报告统一写作“刊出年（在线发表 X 年）”格式；同一报告内不允许一部分条目用刊出年、另一部分用在线年。

**期号缺失是正常现象**：部分期刊部分卷次本就没有期号（如一些连续编卷的期刊）。各来源均只标卷不标期时，如实写"该卷无期号/未检索到期号"，不要编一个。

### 通道 3：未核验

通道 1、2 均未命中的字段，值写"未核验"。整条文献降级为"仅存在性核验"——正文仍可引用其发现（存在性与引述由 literature-scout 核验），但打印题录时缺失字段必须如实标注。

## 期刊等级核验（ABS/AJG、JCR、CSSCI）

**触发条件**：仅在题录严格模式、或用户明确要求期刊等级时执行本节；综述模式默认跳过。
**溯源标签作用域**：期刊等级行的溯源标签独立判定，不得沿用同条目题录行的“已核验（crossref）”——Crossref 不含 JCR 分区与 ABS 星级信息；等级行只能标 已核验（官方页面）/ 二手核验 / 未核验，并附各自来源。无检索记录的等级不打印（“行业通用参考值”不是溯源）。

期刊等级不在任何论文检索工具的返回结构里，必须走通道 2 逐项查证，没有任何记忆豁免（同一期刊在不同会话里凭记忆会给出不同星级——这正是记忆不可靠的直接证据）。

**来源层级（从高到低）**：
1. **官方来源** → 已核验（官方页面）：Clarivate JCR、Chartered ABS 官网（charteredabs.org 的 AJG 列表）、南京大学中国社会科学研究评价中心的 CSSCI 目录发布页。
2. **可用的二手来源** → 二手核验 + URL：高校图书馆或科研处发布的分区/目录通知页、期刊官网自述的收录信息。
3. **不可用来源**：LetPub 及各类期刊指标聚合站、SEO 内容农场式的"期刊影响因子博客"。这类站点是幻觉链接的高发区且数据无授权口径——即使它们出现在搜索结果里，也不作为期刊等级的溯源依据；只有它们时，等级写"无法核验"。**执行口径：台账中期刊等级行的来源 URL 若属于此类站点，该行一律按"未核验"处理——禁用站点的链接出现在来源列本身就是违规，与链接真假无关。** 官方来源查不到时，正确动作是降档到高校图书馆页或写"无法核验"，而不是退到聚合站。

具体查证：

- **ABS/AJG 星级**：检索"期刊名 + AJG/ABS + 星级"，注明所依据的 AJG 版本年份。
- **JCR 分区 / 影响因子**：检索"期刊名 + JCR + quartile / impact factor"，注明 JCR 数据年份。精确到小数的影响因子必须有来源，否则不写。
- **CSSCI**：检索"期刊名 + CSSCI 目录"，确认**正式版还是扩展版**，注明目录版本（如 2025-2026 版）及发布方（南京大学中国社会科学研究评价中心）。
- 查到的来源常为高校图书馆、学院新闻等二手页面——可用，但标 **二手核验** 并附 URL；查不到就写"无法核验"。

## 数值一致性自检

引述核验的"与摘要一致"原则有一个盲区：**源文本自身的数值错误会被忠实搬运**（例如摘要写"从 338 增长到 679，年均增长超过 100%"——起止值与增长率在数量级上互斥）。抄录含数值的结论时做一步量级自检：增长率与起止值是否自洽、占比是否超过 100%、单位与倍数是否匹配。发现源内部矛盾时不照搬，标 `[待确认：源文本数值存疑（一句话说明矛盾点）]`。

## 报告内一致性自检

同一个题录字段（如某文献的期号、年份）在产出的不同位置——正文、台账、参考文献、附录——出现多次时，输出前逐字段比对：**所有出现处的值必须一致**。发现不一致（例如正文写"第 3 期"、台账里引用的来源编号却对应第 5 期），说明至少有一处是编的：停下重查，消解矛盾后才能出稿，不允许带着自相矛盾交付。诚信声明与局限性说明之间的矛盾（声称"全部核实"同时承认"部分推断"）同属此检查。

## 核验台账与声明生成

**台账是前置产物，不是可选附录**：任何会打印题录字段的产出——核验报告、检索报告、带 GB/T 7714 参考文献的综述，无论任务从哪条路径触发——必须包含"【题录核验台账】"小节，且正文与参考文献中的题录值只从台账抄录。先建台账，再写正文；没有台账就没有题录。

每处理一条文献，即时向核验台账追加记录。产出会包含核验声明 / 诚信声明 / 分档统计的报告时，**先读取 `sub-skills/citation-guard/references/ledger-and-statements.md`**（台账表格式、固定小节标题、五段式声明模板都在其中），再开始核验——这一读取是流程步骤，不是可选参考。台账在核验发生时写入，不允许事后凭产出反写。

**声明生成规则**：一切"核验声明 / 诚信声明 / 真实性声明"必须由台账**机械生成**，禁止自由撰写。声明分三档报数（已核验 n 项 / 二手核验 n 项 / 未核验 n 项）——**三档不得合并**，把"二手核验"并入"已核验"计数、或只报"已核验/未核验"两档，都是违规。逐条列出二手核验与未核验条目，注明未能访问的数据库和核验执行日期。**报数以最终清单为准：清单在核验后发生变更（剔除、替换、重新分类）时，台账须同步删改被剔除条目、补入新增条目，声明里的每个数字（含语种/类别分布）对着**最终**清单重数一遍——脚本核验的候选数不等于终选数。**分档报数必须从台账逐行清点得出：三档各自的项数 = 台账中对应溯源标注的行数，逐项列举不得重复或遗漏；交付前把声明里的每个数字与台账数一遍，对不上就改到对上。**存在任何二手核验或未核验项时，禁用"全部""均""确保准确无误"等全称量词。声明与正文其他部分（如局限性说明）不得自相矛盾——声称"全部核实"同时承认"部分基于推断"是红线错误。

## 能力边界诚实

用户指定了本环境无法访问的数据库或核验渠道（如 Web of Science、Scopus、EconLit 等订阅库）时：

- **披露必须出现在声称发生的位置**，而不是只藏在报告末尾的声明里。不可访问的数据库禁止出现在"本次检索基于 X 开展/在 X 中检索"这类表述中；正确写法是"以 X 来源期刊为筛选标准，检索经公开渠道（scholar_search / Crossref API / 网页检索）执行，X 本身未能直接访问"。
- 如实声明"本环境无法直接访问 X，题录核验通过 Crossref API 与公开网页完成"。
- **禁止模拟**该数据库的检索执行过程、命中数量、去重与筛选流程——没有执行过的检索不得出现在检索记录里。
- 可以给出为该数据库设计的检索式供用户自行执行，但必须明确标注"未实际执行"。
- 真实执行过的检索（scholar_search / general_search / Crossref）应如实记录：query 原文、时间、返回条数。

## 分层核验与完备性闸门

**适用范围**：本节的逐篇循环与完备性闸门适用于**题录严格模式**（交付物含 DOI/卷期页码/期刊等级/被引数，或附核验声明——判据见主 SKILL.md“任务模式分流”）。综述模式默认不适用：综述只打印作者/标题/期刊/年份，核验由 literature-scout 的存在性+引述协议覆盖；有代码执行环境时可在成稿前对参考文献批量跑一次本技能脚本校正年份（可选优化，非写作前置条件），不核验期刊等级、不在综述交付物中输出台账小节。

候选池阶段只做存在性核验（literature-scout 职责）。**进入最终清单、题录会被打印的文献，逐篇过检，一篇不落**——清单越长越不允许抽样核验：10 篇就是 10 次解析，不是"核验有代表性的几篇再写"。

执行方式是显式循环，不是原则性要求：

```
对最终清单中的每一篇（第 1 篇 … 第 N 篇）：
  1. 三通道瀑布解析题录（Crossref → 官方/二手网页 → 未核验）
  2. 核验期刊等级（等级也是台账行，无检索记录不得打印等级）
  3. 即时写入台账
全部 N 篇循环完成后，才允许开始撰写报告正文。
```

环境具备代码执行能力时，此循环的第 1 步由 `sub-skills/citation-guard/scripts/verify_citations.py` 对整个清单一次性执行（见通道 1），天然一篇不落；第 2 步（期刊等级）与中文文献仍须逐篇走通道 2。

**完备性闸门（开写正文前必查）**：最终清单 N 篇 = 台账中有记录的 N 篇。任何一篇没有台账记录，只有两个合法出口——现在补做解析，或该篇全部题录字段标"未核验"；不存在第三个出口。**声明中"已核验 n 篇"的 n 只能等于台账中经 Crossref/官方页面解析的篇数：3 篇过检不得声明 9 篇核验。**

## 独立使用

用户说"帮我核验这份参考文献列表 / 检查这些引用对不对"时，本技能独立触发：对列表逐条走三通道瀑布，输出逐字段比对结果（用户给定值 vs 核验值，标注 一致 / 不一致（附正确值与来源） / 未核验），并附核验台账与分级声明。发现给定 DOI 能解析但指向另一篇论文的（张冠李戴），按"不一致"处理并明确指出解析到的实际论文。

## 与 literature-scout 的关系

literature-scout 管**发现与存在性**（这篇论文存在吗、说了什么）；citation-guard 管**题录**（发表在哪年哪卷哪页、DOI 是什么、期刊什么等级）。存在性核验通过不代表题录字段可信——两层核验各自独立，缺一不可。scout 的 5 级判定（VERIFIED/MINOR/MAJOR/UNVERIFIABLE/PAYWALL）作用于条目，citation-guard 的三态标注作用于字段，互不替代。

