# 引文三角核验协议 (language 无关)

论文最致命的失分是**编造引文**(hallucinated citation)与**引而不实**(cite 的文献不支撑该论断)。
本协议把每条引文从"看起来对"逼到"经得起查"。移植自 ARS 的 triangulation + claim-faithfulness 思路,
**后端换成 zcbot 自己的 `documents` / `research` 库**(它们本就带 DOI + md_content,做 anchor 比对反而更顺)。

> 这是**协议**不是脚本 —— 你(模型)拿 host-side tool 逐条执行。quality_check.py 只做机械的
> orphan/uncited/编号核对,真伪与支撑度靠本协议。

## 何时跑

- 阶段四逐章起草后、阶段六渲染前,对所有引文跑一遍
- 用户自带的引文清单**也要跑**(用户也可能记错卷期/页码)

## 三层核验(逐条引文执行)

### 第 1 层 — 存在性 (exists)

每条引文先确认"这篇文献真实存在":

1. `documents` 库语义检索(材料类优先,中英 query 都行)/ `research` 库 `search()` / `get_paper(doi)`
2. 命中 → 记下真实 DOI / 作者 / 年份 / 期刊 / 卷期页;**以库里返回为准**,不沿用记忆里的字段
3. 两个库都查不到 → 标 `[未核实]`,**不得编造条目**;告诉用户"这条找不到来源,请提供 PDF/DOI 或删去该论断"

### 第 2 层 — 三角印证 (triangulate)

关键论断(创新点对比、机理依据、定量结论)的支撑引文,**至少两个独立信息源一致**才算稳:

- documents 命中 + research/DOI 一致 → 通过
- 仅单一来源 → 标"单源,谨慎",提示用户复核
- 不同来源字段冲突(年份/卷期不一致)→ 以可验证的 DOI 元数据为准,修正条目

### 第 3 层 — 支撑度 (claim-faithfulness)

最容易翻车的一层:文献存在,但**并不支撑你写的那句话**。逐条做:

1. 抓回该文献的 `md_content`(documents 直接给整篇 Markdown)/ `fetch_xml` / `fetch_pdf`(research)
2. 在原文里定位与论断相关的**锚点证据**:一句 ≤25 词的原文引语 + 出现的段落/小节位置
3. 判定支撑度三档:
   - **support**:原文明确支撑该论断 → 通过
   - **partial / 需限定**:原文只支撑部分,或有前提条件 → **改写论断**使之与证据相符(别让引文背锅)
   - **not-support / 反向**:原文不支撑甚至相反 → **删除该引用或换文献**;绝不硬挂
4. 抓不到全文(无 PDF/XML)→ 至少用 abstract 做弱核验,标"仅摘要核验",提示用户终审时复查

## 产出:核验台账 `CITATIONS.md`

在 `<task_dir>/CITATIONS.md` 记一份可复盘的台账(append,一条引文一行):

```markdown
# 引文核验台账
> 每条引文的存在性/三角/支撑度核验结果。渲染前所有条目应为 verified 或经用户确认。

- [1] Provis & Bernal 2014, Annu. Rev. Mater. Res. 44:299 | exists:✓(documents+DOI) | triangulate:✓ | claim:support "geopolymers form via dissolution-polymerisation"(§2.1) | status: verified
- [2] <author> <year> ... | exists:✓ | claim:partial → 已把"显著提高"改为"在 28d 提高约 12%" | status: verified-revised
- [3] <author> ... | exists:✗ 两库未命中 | status: 待用户提供来源
```

## 与编号流程的衔接

1. 起草时占位 `[CITE-<keyword>]`(见 cite_*.md)
2. 本协议逐条把占位映射到**已核验的真实文献**
3. 仅 status=verified / verified-revised / 用户确认 的才进入编号
4. 按文中首次出现顺序编 `[1][2]...`,写 `06_references.md`
5. quality_check.py 兜底查 orphan/uncited/编号连续

## 铁律

- ❌ 任何 status 非 verified 的引文不得带进最终稿(要么核实、要么删论断、要么用户拍板)
- ❌ 不得为凑引文数编造"看起来合理"的文献
- ✅ 支撑度不足时**改论断迁就证据**,不是改证据迁就论断
- ✅ 两库都查不到时如实告诉用户,给出"提供来源 / 删除论断"两个选项
