mcpField
C
citation-audit

citation-audit

github.com/wanshuiyin文档处理18.2k494 次安装4 天前更新
代码仓库

关于 citation-audit

Citation Audit 是面向论文作者的参考文献审计技能,在投稿前核查引用的存在性、元数据准确性及其与文中论述的匹配度。它为每条引用生成判定,并输出 Markdown 报告和 JSON 记录。

主要功能

  1. 01核查引用文献是否真实存在
  2. 02比对作者、年份、标题与发表 venue
  3. 03检查文献是否支持文中论述
  4. 04生成逐条判定与审计报告
  5. 05输出机器可读的 JSON 记录
  6. 06可选检测未引用的文献条目

适用场景

  1. 01论文投稿前审计参考文献
  2. 02发现引用与论述语境不匹配
  3. 03核对作者、年份或 DOI 等元数据
  4. 04清理未被引用的文献条目

MCP 相关

该技能通过 Codex MCP 将引用条目和上下文发送给外部审查器,并要求进行网页、DBLP 或 arXiv 检索。

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/wanshuiyin/auto-claude-code-research-in-sleep --skill citation-audit

安装后在 Claude Code 中输入/citation-audit确认已加载。

详细介绍

引文审查

每个审稿人时段开始前,请遵循 Selectable Reviewers: 通过 reviewer_route.py 和规范的辅助解析器依次解析调用 → .aris/reviewer.json → Claude Code 默认值(Codex MCP),并保留 此时段的层级、新鲜上下文、源文件/图像输入和确定性门控。 下方的 Codex 示例/固定配置仅适用于 backend=codex;其他路由使用各自的首次调用/回复约定。保存路由和实际返回的身份; 不可用的选择记为 REVIEW_UNAVAILABLE。根据实际的系列/完成情况/范围对接受情况进行分类。 将调用中的审稿人/模型/推理强度覆盖项传递给包含审稿人的子任务。生成工作进程保持不变。

🔒 不要用 /loop、/schedule 或 CronCreate 包装此技能。 它负责给出判定——即评估书目是否正确。定时重复运行此判定不会带来新信号(只有在书目发生变化时才会改变)。安排它之前的外部等待——书目定稿 → 然后审查一次。参见 shared-references/external-cadence.md。

通过以下三个相互独立的层面,核验论文中的每个 \cite{...}:

  1. 是否存在 — 被引用的论文是否确实存在于所声称的 arXiv ID/DOI/会议上。
  2. 元数据是否正确 — 作者姓名、年份、发表渠道和标题是否与权威来源(DBLP、arXiv、ACL Anthology、Nature、OpenReview 等)一致。
  3. 上下文是否恰当 — 被引用的论文是否确实支持文稿中用它来支撑的论点。

此技能是 \aris{} 证据与论点保障体系的第四层,与 experiment-audit(代码)、result-to-claim(科学结论判定)和 paper-claim-audit(数值论点)相辅相成。它们共同构成一个自下而上的完整性体系,从原始评估代码一直延伸到文稿书目。

何时使用此技能

在投稿前运行。 合适的门控时点是:

  • paper-write 生成 LaTeX 草稿和 bib 文件之后
  • paper-claim-audit 核验数值论点之后
  • 投稿前最终执行 paper-compile 之前

不要在草稿尚未完成时运行此技能——大部分工作在于结合上下文逐一核对每个 \cite,在占位文本上这么做是浪费。

此技能能发现的问题

危险的引文问题并不是一眼就能识别的明显伪造引文。真正危险的问题包括:

  • 上下文不符的引文:论文真实存在,但所引述的论点并非该论文实际得出的结论(例如,引用 Self-Refine 来支持“自我反馈会产生相关错误”,而 Self-Refine 实际上论证的是相反观点)。
  • 作者信息幻觉:匿名作者占位内容未被清除,遗漏合著者或作者顺序错误。
  • 标题变动:arXiv v1 和 v3 的标题不同,却被悄然合并。
  • 发表渠道混淆:引用的是 arXiv 预印本,但官方发表渠道现已是 CVPR/ICML/NeurIPS,却仍使用错误的记录。
  • 年份不一致:arXiv 2023 年预印本于 2024 年被会议接收,但年份标注不一致。
  • 虚构 DOI:DOI 看起来真实,却无法解析。
  • 自引年份偏差:引用自己的先前作品时,年份相差一年。

常量

  • REVIEWER_MODEL = gpt-6-astra — 通过 Codex MCP 使用。默认用于支持 Web 访问的跨模型审查。
  • CONTEXT_POLICY = fresh — 每次审计都使用新的审查线程(REVIEWER_BIAS_GUARD)。绝不使用 codex-reply。
  • WEB_SEARCH = required — 审查者必须实际检索 Web/DBLP/arXiv,而不能凭记忆进行模式匹配。
  • OUTPUT = CITATION_AUDIT.md — 面向人工阅读的逐条判定报告。
  • STATE = CITATION_AUDIT.json — 机器可读的判定记录,可供下游工具使用。
  • SOFT_ONLY = false — 设为 true 时(通过 — soft-only/— soft_only 标志设置),审计仍照常运行全部三层,但禁止修改任何 .bib 文件。原本会修改 bib 的发现(FIX/REPLACE/REMOVE)将转换为针对引用它们的 *.tex 文件的逐处句子改写建议。/resubmit-pipeline 的 Phase 1 使用此选项,以遵守用户“冻结 bib”的硬性约束。
  • RENDER_HTML = true — 设为 true 时(默认值),写入报告后自动将 CITATION_AUDIT.md 渲染为 HTML。使用完整 Codex 审查门槛(审计类产物——渲染保真度检查符合该技能的跨模型审计不变量)。设为 false 可跳过,也可传入 — render html: false。

工作流

第 1 步:查找 bib 文件和章节文件

查找:

  • 论文目录下的 references.bib(或 paper.bib/类似文件)
  • 所有包含 \cite{...} 调用的 *.tex 文件(通常位于 sec/ 或 sections/)

如果存在多个 bib 文件,请分别审计。

第 2 步:提取所有(cite-key,context)对

针对论文中的每个 \cite{key1,key2,...} 调用:

  • 记录 cite key
  • 记录文件和行号
  • 记录引用周围的句子(至少包含引用所在处前后的 1 个完整句子,以便检查上下文)

输出一个扁平列表,包含 (key, file, line, surrounding_sentence) 元组。

同时构建反向索引:针对每条 bib 记录,列出所有引用它的位置。

定义工作流其余部分将用到的两个协议集合:cited_keys 是已审计的 *.tex 文件中任意 \cite{...} 调用所含的唯一 cite key 集合(去重),bib_keys 是从已审计 bib 文件中解析出的 key 集合。cited_keys 用于第 3 步(只审计被引用的记录);bib_keys \ cited_keys 是由 --uncited 选项启用时显示的未引用残余集合。

如果用户传入了 --uncited,还要在此处计算集合差 bib_keys \ cited_keys 并保存起来,以供第 5 步和 JSON 汇总使用;协议详见下方“未引用记录检测(可选)”。集合差计算只是字符串操作,不会消耗审查额度。

将提取的上下文保存到 paper/.aris/citation-audit/contexts.txt,以便审查者直接读取。记录 audited_input_hashes 中的文件路径时,使用相对于论文目录的路径 .aris/citation-audit/contexts.txt;不要将文件暂存到 /tmp 或其他验证器之后无法重新计算哈希的临时位置。

第 3 步:将每条记录发送给新的跨模型审查者

对于每条被引用的 bib 记录——即 cited_keys 中至少有一个提取出的引用上下文的 key——调用 mcp__codex__codex(而非 codex-reply——每条记录使用新的线程,或批量处理并明确隔离每条记录)。不要将 bib_keys \ cited_keys 中的记录发送给审查者;这些记录仅用于检测,只有在明确启用 --uncited 时才会显示(见下方“未引用记录检测”)。

首先解析此审查者插槽;以下是 backend=codex 示例。

mcp__codex__codex:
  model: gpt-6-astra
  config: {"model_reasoning_effort": "xhigh"}
  sandbox: read-only
  prompt: |
    You are auditing a bibliographic entry. Use web/DBLP/arXiv search.

    ## Bib entry
    @article{key2024example,
      author = {...}, title = {...}, journal = {...}, year = {...}, ...
    }

    ## Where this entry is cited in the paper
    [paste extracted contexts]

    For this entry, verify:
    1. EXISTENCE: does this paper exist at the claimed arXiv ID / DOI / venue?
       Output: YES / NO / UNCERTAIN, with the verifying URL.
    2. METADATA: are author names, year, venue, title correct?
       For each, output: correct / wrong: should be ... / typo: ...
    3. CONTEXT: for each use, does the cited paper actually support the surrounding claim?
       Output per-use: SUPPORTS / WEAK / WRONG, with one-sentence reasoning.

    VERDICT: KEEP / FIX / REPLACE / REMOVE
    - KEEP: entry is clean, all uses are appropriate
    - FIX: metadata needs correction; uses are appropriate
    - REPLACE: cite is wrong-context, find a different paper that actually supports the claim
    - REMOVE: entry is hallucinated or unsupportable

    Be honest. If you cannot verify online, say UNCERTAIN; do not guess.

按照审查追踪协议,将响应保存到 .aris/traces/citation-audit/<date>_runNN/<key>.md。

第 4 步:汇总判定结果

按照下方 “提交产物生成” 中定义的架构(此文件唯一权威的架构)构建 CITATION_AUDIT.json。 每条目的台账数据放在 details.per_entry 下,而不是顶层的 entries 字段中。顶层的 verdict 是单个总体值(PASS / WARN / FAIL / NOT_APPLICABLE / BLOCKED / ERROR),根据“提交产物生成”中的决策表从各条目的判定结果推导得出;顶层的 summary 是一行可供人阅读的字符串。

具体来说,details 包含逐条目的台账:

"details": {
  "total_entries": 29,
  "counts": { "KEEP": 11, "FIX": 14, "REPLACE": 3, "REMOVE": 1 },
  "per_entry": [
    {
      "key": "lu2024aiscientist",
      "verdict": "KEEP",
      "axis_failures": [],
      "uses": [
        {"file": "sections/1.intro.tex", "line": 11, "verdict": "SUPPORTS"},
        {"file": "sections/6.related.tex", "line": 8, "verdict": "SUPPORTS"}
      ]
    },
    {
      "key": "madaan2023selfrefine",
      "verdict": "FIX",
      "axis_failures": ["CONTEXT"],
      "uses": [
        {"file": "sections/2.overview.tex", "line": 42, "verdict": "WRONG",
         "note": "Self-Refine demonstrates iterative improvement, not correlated errors"},
        {"file": "sections/6.related.tex", "line": 13, "verdict": "SUPPORTS"}
      ]
    }
  ]
}

完整产物的字段包括顶层字段 audit_skill、verdict、reason_code、summary、audited_input_hashes、trace_path、thread_id、reviewer_model、reviewer_reasoning、generated_at、details,详见“提交产物生成”。

第 5 步:生成便于阅读的报告

写入 CITATION_AUDIT.md:

# Citation Audit Report

**Date**: 2026-04-19
**Bib file(s)**: references.bib
**Total entries**: 29

## Summary
| Verdict | Count |
|---------|------|
| KEEP    | 11   |
| FIX     | 14   |
| REPLACE | 3    |
| REMOVE  | 1    |

## Priority Fixes (CRITICAL — apply before submission)

### REMOVE: anon2025placeholder
- Author listed as "Anonymous" — canonical record exists with real authors and full title
- Title is incomplete
- ACTION: Replace key with the canonical citekey, update authors and title

### REPLACE-CONTEXT: example2023priorwork in sec/2.overview.tex:42
- Cited to support a specific technical claim
- The cited paper actually demonstrates a different (related but distinct) phenomenon
- ACTION: Rewrite the sentence; cite the prior work for what it actually establishes

[... continues for each entry ...]

## All-Clean Entries (no action needed)

[list of KEEP keys]

启用 --uncited 时,在“All-Clean Entries”之后追加以下章节:

## Uncited Entries (opt-in)

The following bib entries are present in the audited bib file(s) but are not referenced by any `\cite{...}` in the paper body:

- `author2010example` — suggestion: prune (uncited; no local evidence of intent)
- `someone2015othercite` — suggestion: prune (uncited; no local evidence of intent)
- `third2024todo` — suggestion: check (a `% TODO: cite third2024todo` comment was found in `sections/3.related.tex`)

This section is detect-only; it does not change the top-level verdict.
第 6 步:应用修复(交互式)

对于每个 FIX/REPLACE/REMOVE 判定结果,提示用户:

Fix [key]?
  Change: <description of change>
  Files affected: references.bib + sec/X.tex:Y
[Apply / Skip / Defer]

如果 AUTO_APPLY = true,则应用所有 FIX 级别的变更(仅限元数据更正)。REPLACE 和 REMOVE 始终需要人工批准,因为它们涉及内容变更。

第 7 步:重新编译并验证
latexmk -C && latexmk -pdf -interaction=nonstopmode main.tex

确认:

  • 没有新增 Citation undefined 警告
  • 没有 Reference undefined 警告
  • 页数未变,或因元数据修复仅有微小变化

未引用条目检测(可选启用)

默认:禁用。现有用户不会看到行为变化——只审计 \cite{...} 键,手稿中没有 \cite 引用的 bib 条目将被静默忽略。

可选启用:调用时传入 --uncited。此时,技能会在第 2 步后进行集合差异比较,并报告所有经过审计的 bib 文件中存在、但论文中任何位置都没有引用的条目。仅检测——未引用条目不会发送给跨模型审阅器,因此不会产生额外的审阅器或网络查询成本。

为何采用可选启用

此技能的主要输出是对已引用条目的三轴审计。默认显示未引用的 bib 条目会:(a) 改变每次现有运行的长篇输出;(b) 给有意维护超集 bib 文件的用户增加噪声(例如,共享实验室 bib 文件,或正在进行章节重排且引用已移除、但有意保留条目的情况)。此标志确保现有调用方的行为完全不变。

启用后的效果

启用 --uncited 时:

  • CITATION_AUDIT.md 会新增 ## Uncited Entries (opt-in) 章节,为每个键列出一条建议:prune(条目已无用,建议删除)或 check(条目可能是有意保留的,标记给用户审查)。默认建议为 prune;仅在有具体的本地证据时才输出 check(例如,.tex 文件中提及该键的 TODO 注释,或 git diff 中显示最近移除的 \cite)。不要仅凭 bib 键字符串推断意图。
  • CITATION_AUDIT.json 的 details 会新增 uncited_entries 数组;架构见下方“提交产物生成”。
  • 顶层 verdict 保持不变:未引用条目不会提高或降低 PASS / WARN / FAIL 等分类。reason_code 和 summary 的形式也保持不变;只会出现 details.uncited_entries 字段。
  • 验证门控和下游技能(paper-writing 第 6 阶段、verify_paper_audits.sh)不得将存在 uncited_entries 视为阻断信号。
适合启用的情况
  • 提交前清理(分享可用于最终出版的 ZIP 前删除无用的 bib 条目)。
  • 共享实验室 bib 文件,其中论文只使用一部分条目,而用户希望确认具体使用范围。
  • 定期审计时,用户之前查看过未引用条目的数量,并希望追踪其变化。
bib 条目枚举失败时的回退处理

如果启用了 --uncited,但完整的 bib 键枚举失败(例如 bib 语法不规范,解析器无法恢复),仍必须尽可能继续进行已引用条目审计。在这种情况下:

  • 不要更改顶层的 verdict、reason_code 或 summary。
  • 将 details.uncited_entries 输出为空数组 []。
  • 添加 details.uncited_entries_status: "unavailable",并附上一行说明原因的备注(例如:"bib parser could not enumerate keys; cited-entry audit completed normally")。
  • 验证器门控和下游技能必须将 unavailable 视为与字段缺失相同:不阻塞。

如果 bib 文件无法读取到足以审计已引用条目的程度,则回退到裁决决策表中定义的现有 BLOCKED / bib_unreadable 路径;这与默认未传标志时的行为相同。

关键规则

  • 每次审计运行都使用全新的审阅者线程——绝不复用之前的审阅上下文
  • 必须能访问 Web——审阅者必须进行实际查找,不能只凭记忆进行模式匹配
  • 上下文错误 > 元数据错误——用真实论文支持错误论点,比作者姓名拼写错误更危险
  • REPLACE/REMOVE 需要人工批准——绝不自动修改内容论点
  • 始终输出,不要阻塞——此技能始终会写入带有裁决结果的 CITATION_AUDIT.json;是否阻止最终定稿由 paper-writing Phase 6 和 verify_paper_audits.sh 根据 assurance 级别决定。参见下文“提交产物输出”。
  • 每次提交运行一次——审计耗费实际时间(需要对每个条目进行 Web 查找);不要在每次保存时运行
  • 仅选择性启用未引用检测——绝不自动启用;绝不因未引用条目而阻塞;如果未传入 --uncited,现有调用方必须观察到完全相同的输出
  • 在 --soft-only 下,citation-audit 只输出文本改写建议;无论发现的严重程度如何,都绝不修改 bib 文件。 审计语义(存在性 + 元数据 + 上下文)以及每个条目的 KEEP/FIX/REPLACE/REMOVE 记录都原样保留;只有操作层会转换为对引用它的 *.tex 文件中各处句子的改写。设置了 --soft-only 时,拒绝任何下游提出的 bib 编辑。

与其他审计技能的比较

技能审计内容可发现的问题
/experiment-audit评估代码伪造的真实值、自归一化分数、虚构结果
/result-to-claim结果到论点的映射缺乏证据支持的论点
/paper-claim-audit手稿中的数值论点数值膨胀、挑选最佳随机种子、配置不匹配
/citation-audit书目条目幻觉引用、上下文不匹配的引用、元数据错误

合起来:代码 → 结果 → 数值论点 → 引用支持的论点。每一层都由跨系列审查,验证器路径中不包含执行器。

已知限制

  • DBLP 覆盖缺口:非常新的论文(< 2 周)可能尚未收录在 DBLP 中。审阅者应改查 arXiv。
  • 预印本与正式发表版本:两者都存在时,审阅者应优先选择正式发表的版本(ICML 2024 优先于 arXiv 2401.xxxxx),但要标明两者。
  • Anthology 与 OpenReview:NeurIPS/ICLR 论文在官方论文集发布前就会有 OpenReview 条目;两者都是有效来源。
  • 多作者截断:包含 6 位或更多作者且使用 and others 的 bib 条目属于常见写法,除非截断隐藏了用户明确关心的共同作者,否则不予标记。

审查追踪

每次调用 mcp__codex__codex 审阅者后,按照 shared-references/review-tracing.md 保存追踪记录(Policy C——取证;绝不悄然跳过)。使用 save_trace.sh(根据 shared-references/integration-contract.md §2 中的链路解析路径),或直接将文件写入 .aris/traces/citation-audit/<date>_run<NN>/。遵循 --- trace: 参数(默认为 full)。

输出契约

  • 论文根目录下的 CITATION_AUDIT.md(人类可读的报告)
  • 论文根目录下的 CITATION_AUDIT.json(机器可读的台账;架构如下)
  • .aris/traces/citation-audit/<date>_runNN/(每条目的审核追踪记录)
  • 可选:对 references.bib + sec/*.tex 应用修复(使用 --apply 标志)
  • 可选:JSON 中的 details.uncited_entries 字段 + MD 中的 ## 未引用条目(选择启用) 章节(使用 --uncited 标志;未设置该标志时,字段不存在且省略此章节)
  • CITATION_AUDIT.html(当 RENDER_HTML = true 时生成,默认为 true)——通过 /render-html "CITATION_AUDIT.md" --json "CITATION_AUDIT.json" 自动渲染的单文件 HTML 视图。这是完整审核关卡。旁路文件 .review.json 会记录渲染保真度判定。非阻塞:如果 /render-html 失败(缺少辅助程序、Codex MCP 不可用、文件写入错误),记录失败并视为审核已完成——JSON + MD 台账是规范输出。

可选:仅软化模式(— soft-only)

默认:禁用。审核会为每个条目生成标准的 KEEP / FIX / REPLACE / REMOVE 判定,下游调用方(或步骤 6 的 --apply 路径)可以自由修改 bib。

选择启用:调用时传入 — soft-only(也接受 — soft_only)。此模式专为受**“冻结 bib”硬性约束**的调用方设计,尤其是 /resubmit-pipeline 的阶段 1:如果引文上下文有误,就软化周围的句子;不要更改、添加或删除引文本身。

仅软化模式的变化

审核语义不变:存在性、元数据和上下文适用性检查都会执行,仍会针对每条被引用的条目调用一次审核器,且仍会像默认模式一样计算并输出每条目的 KEEP / FIX / REPLACE / REMOVE 判定。只有操作层会变化——仅软化模式会将每种基础判定转换为文本改写建议,而非 bib 修改操作。

判定转换表
基础判定仅软化模式转换结果备注
KEEPkeep_unchanged无需操作。引文和句子都没有问题。
FIX(元数据错误)keep_metadata_drift_acknowledgedbib 保持不变。在提交时标记为需要人工审核。附加备注:“检测到元数据偏差,但在 --soft-only 模式下未修复”。
REPLACE(引文上下文错误)soften_citing_sentence针对每处引文提出句子改写建议。对于正文中的每个 \cite{X},找到其所在句子,并提出一个软化版本,不再声称 X 实际证明的内容。
REMOVE(引文指向不存在的论文,即虚构引文)drop_cite_in_body_onlybib 条目保持不变(遵循 --soft-only 不变量),但必须从正文中删除行内的 \cite{X} 引用,并改写周围句子,使其不再依赖不存在的论文。改写器可使用两种子策略:(a)完全删除行内的 \cite{X},并改写句子以移除关键论断;或(b)改为引用另一篇 bib 中确实支持该论断的来源。绝不能在正文中保留指向虚构论文的 \cite{X}——这比删除引文更糟,因为审稿人会核查该参考文献,却找不到任何内容。bib 条目本身仍会保留(只要不再引用,就不会造成问题;验证器会在提交时检测未引用条目,以便在本次审核之外进行清理)。
增强型 JSON 架构(在 --soft-only 模式下)

设置该标志后,标准顶层字段(audit_skill、verdict、reason_code、summary 等)以及现有的 details.per_entry 记录表都会按默认模式原样输出。此外:

  • 添加顶层布尔字段 soft_only_mode: true。
  • details 中新增 soft_only_actions 数组——每个经过审计的文献键对应一项,顺序与 details.per_entry 相同。
{
  "audit_skill": "citation-audit",
  "verdict": "...",
  "soft_only_mode": true,
  "details": {
    "soft_only_actions": [
      {
        "citekey": "smith2023example",
        "base_verdict": "REPLACE",
        "soft_action": "soften_citing_sentence",
        "occurrences": [
          {
            "file": "sec/3.method.tex",
            "line": 142,
            "current_sentence": "Smith et al. [2023] proves a generic result that...",
            "proposed_rewrite": "Smith et al. [2023] discusses a related setting; while not directly applicable, the framing motivates...",
            "rationale": "Original sentence claims smith2023 'proves' a result, but smith2023 actually only conjectures it. Softened to 'discusses ... motivates' to remove the unsupported claim."
          }
        ]
      }
    ]
  }
}

soft_action 的取值为 keep_unchanged | keep_metadata_drift_acknowledged | soften_citing_sentence | drop_cite_in_body_only。对于 keep_unchanged 和 keep_metadata_drift_acknowledged,可以省略 occurrences,也可以将其输出为 []。对于 soften_citing_sentence 和 drop_cite_in_body_only,occurrences 必须为正文中触发该判定的每个 \cite{X} 位置列出一个对象。

对于 drop_cite_in_body_only,proposed_rewrite 字段会显示删除行内 \cite{X} 后的句子(或将其替换为指向文献库中另一来源的 \cite{Y})。bib_entry_action 字段固定为 "leave_as_is_per_soft_only"——审计绝不会修改文献记录本身。

增强型人类可读报告

CITATION_AUDIT.md 会新增一个 ## Soft-Only Rewrites (— soft-only mode) 章节,列出每个位置及建议的句子改写,以供人工批准。示例:

## Soft-Only Rewrites (— soft-only mode)

The bib file is frozen. The following sentence rewrites are proposed in lieu of bib edits.

### `smith2023example` — base verdict REPLACE → `soften_citing_sentence`

- **File**: `sec/3.method.tex:142`
- **Current**: "Smith et al. [2023] proves a generic result that..."
- **Proposed**: "Smith et al. [2023] discusses a related setting; while not directly applicable, the framing motivates..."
- **Rationale**: Original sentence claims smith2023 "proves" a result, but smith2023 actually only conjectures it. Softened to "discusses ... motivates" to remove the unsupported claim.

Summary 块中现有的逐条判定表格会保留,但 FIX/REPLACE/REMOVE 行会标注 🔒 bib frozen by --soft-only 徽标,让下游读者立即了解文献库为何未被修改。

--soft-only 模式下的硬性保证
  • 无论何种情况,都不会修改 .bib 文件。 第 6 步(“交互式应用修复”)会跳过文献库文件;只会生成 *.tex 改写建议(任何文本编辑仍须经人工批准)。
  • 如果下游调用方(包括 paper-writing 第 6 阶段或任何封装程序)在设置 --soft-only 时提出文献库编辑,必须拒绝:在跟踪记录中输出一行拒绝说明,然后继续处理下一个发现项。
  • 顶层 verdict 判定表保持不变:上下文错误的引用仍会产生 FAIL 和 reason_code: wrong_context。Soft-only 不会屏蔽该发现项,只会限制操作层的行为。
  • --soft-only 可与 --uncited 同时使用。未被引用的条目仍只检测、不修改,且不受 soft-only 转换影响(没有可供软化的引用句)。

提交产物生成

无论调用方或检测器的结果如何,此技能始终会写入 paper/CITATION_AUDIT.json。如果论文没有 .bib 文件或没有 \cite{...} 用法,则会输出判定结果 NOT_APPLICABLE;禁止静默跳过。 paper-writing 第 6 阶段和 verify_paper_audits.sh 都依赖此产物存在于可预测的路径。

该产物符合 shared-references/assurance-contract.md 中的架构:

{
  "audit_skill":      "citation-audit",
  "verdict":          "PASS | WARN | FAIL | NOT_APPLICABLE | BLOCKED | ERROR",
  "reason_code":      "all_entries_keep | metadata_drift | wrong_context | hallucinated | ...",
  "summary":          "One-line human-readable verdict summary.",
  "audited_input_hashes": {
    "references.bib":             "sha256:...",
    "main.tex":                   "sha256:...",
    "sections/3.related.tex":     "sha256:..."
  },
  "trace_path":       ".aris/traces/citation-audit/<date>_run<NN>/",
  "thread_id":        "<codex mcp thread id>",
  "reviewer_model":   "<resolved — the model that actually ran (target: gpt-6-astra)>",
  "reviewer_reasoning": "<resolved — the effort that actually ran (target: xhigh)>",
  "generated_at":     "<UTC ISO-8601>",
  "details": {
    "total_entries":  <int>,                 // count of audited cited entries (= |cited_keys|), NOT the bib-file size
    "per_entry":      [ { "key": "madaan2023selfrefine",
                          "verdict": "KEEP | FIX | REPLACE | REMOVE",
                          "axis_failures": [ "CONTEXT" | "METADATA" | "EXISTENCE" ],
                          "note": "..." }, ... ]
  }
}
可选:details.uncited_entries(仅在设置 --uncited 时)
"details": {
  ...
  "uncited_entries": [
    {"key": "<bibkey>", "suggestion": "prune" | "check", "note": "..."}
  ],
  "uncited_entries_status": "ok" | "unavailable"
}

字段语义:

  • 未设置该标志时,两个字段都会被完全省略。默认架构不包含任何一个键。
  • 设置该标志且集合差运算正常完成时,uncited_entries_status 为 "ok",uncited_entries 列出检测到的键(如果所有文献库条目都已被引用,则可能为空)。
  • 设置该标志但文献库键枚举失败时(参见上文“文献库枚举失败时的回退处理”),uncited_entries_status 为 "unavailable",且 uncited_entries 为 []。下游使用方必须将 "unavailable" 与字段缺失视为相同情况:不得阻止处理。
  • 下游使用方必须将两个字段缺失视为唯一有效的默认状态,且不得因字段缺失而报错。
  • suggestion 仅供参考;验证器和 paper-writing 第 6 阶段不会因此阻止处理。
audited_input_hashes 范围

对实际传递给本次审计的声明输入集进行哈希:.bib 文件、main.tex,以及提供引文上下文的所有 sections/*.tex 文件。不要对从 /tmp 或其他临时路径提取的上下文进行哈希——如果需要暂存提取出的上下文,请将其写入 paper/.aris/,以便验证器能够重新计算哈希。不要对整个仓库的并集或审阅者自报已打开的文件子集进行哈希。

路径约定(必须与 verify_paper_audits.sh 一致):键必须是相对于论文目录的路径(不带 paper/ 前缀——验证器会以论文目录为基准解析路径;添加前缀会导致路径变成 paper/paper/...,并因 STALE 而误报)。论文目录之外的文件使用绝对路径。

判定表
输入状态判定reason_code 示例
没有 .bib 文件,或没有 \cite{...} 用法NOT_APPLICABLEno_citations
引用了 .bib 文件,但文件无法读取或缺失BLOCKEDbib_unreadable
所有条目均为 KEEP,三个维度均为绿色PASSall_entries_keep
只有 FIX 判定(元数据偏差,无上下文错误)WARNmetadata_drift
存在任何 REPLACE 或 REMOVE(上下文错误或幻觉条目)FAILwrong_context
网络查询超时/审阅者调用失败ERRORreviewer_error

--uncited 标志不在此表中:未引用条目仅供参考,绝不会改变顶层判定或 reason_code。它们只会显示在 details.uncited_entries 和可选的 Markdown 章节中。

线程独立性

每次调用都使用一个全新的 mcp__codex__codex 线程。切勿使用 codex-reply。不要将先前的审计输出(PROOF_AUDIT、 PAPER_CLAIM_AUDIT、EXPERIMENT_LOG)作为输入——全新线程可依据 shared-references/reviewer-independence.md 保持审阅者独立性。

此技能本身永远不会阻止流程;paper-writing Phase 6 和 验证器会根据 assurance 级别决定该判定是否会阻止最终定稿。

另请参阅

  • /paper-claim-audit — 用于数值声明验证的同类技能
  • /experiment-audit — 用于评估代码完整性审查的同类技能
  • /result-to-claim — 根据结果分配声明判定
  • shared-references/citation-discipline.md — 引文规范协议文档
  • shared-references/reviewer-independence.md — 跨模型审查约束

评论

支持 Markdown