mcpField
C
citation-audit

citation-audit

github.com/wanshuiyinドキュメント18.2k494 回インストール4 日前に更新
リポジトリ

citation-audit について

Citation Auditは、論文著者向けの投稿前参考文献チェック用スキルです。引用の実在性、書誌情報、本文の主張との適合性を確認し、項目別判定とMarkdown・JSONレポートを作成します。

主な機能

  1. 01引用文献の実在性確認
  2. 02著者・年・タイトル・掲載先の照合
  3. 03本文の主張を文献が裏付けるか評価
  4. 04項目別判定と監査レポートの作成
  5. 05機械可読なJSON記録の出力
  6. 06未引用の文献項目を任意で検出

活用シーン

  1. 01論文投稿前の参考文献監査
  2. 02本文の主張と合わない引用の発見
  3. 03著者・年・DOIなどの書誌情報確認
  4. 04未引用の文献項目の見直し

MCP 対応

Codex MCPを介して引用項目と文脈を外部レビュアーに送り、Web、DBLP、arXivでの検索を求めます。

インストール

コマンドをコピーしてターミナルで実行します。

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

インストール後、Claude Code で/citation-auditを入力して読み込まれたか確認します。

詳細

引用監査

各レビュースロットの前に、選択可能なレビュアーに従ってください: 呼び出し元を解決 → .aris/reviewer.json → Claude Code のデフォルト(Codex MCP) を、正規のヘルパーリゾルバー経由で reviewer_route.py を使って処理し、この スロットのティア、新しいコンテキスト、ソース/画像入力、決定論的なゲートを維持します。 以下の Codex の例/固定指定は backend=codex の場合にのみ適用されます。それ以外のルートでは、 それぞれ独自の初回呼び出し/応答の契約を使用します。ルートと実際に返された識別情報を保存してください。 選択したものが利用できない場合は REVIEW_UNAVAILABLE とします。実際の ファミリー/完了状況/スコープに基づいて採否を分類してください。呼び出し元の レビュアー/モデル/effort のオーバーライドを、レビュアーを含む子プロセスに引き継いでください。 生成ワーカーに変更はありません。

🔒 このスキルを /loop、/schedule、CronCreate でラップしないでください。 このスキルは 判定を行うものであり、書誌情報の正確性を評価します。タイマーでこの判定を 再実行しても新たな情報は得られません(変化するのは 書誌情報 のみです)。 その前段階にある 外部の待機 をスケジュールしてください。書誌情報の確定後に 監査を 一度だけ 実行します。詳しくは shared-references/external-cadence.mdを参照してください。

論文内のすべての \cite{...} について、独立した次の3つの層で確認します。

  1. 存在確認 — 引用された論文が、記載された arXiv ID/DOI/会議録に実際に存在すること。
  2. メタデータの正確性 — 著者名、年、会議録、タイトルが正規の情報源(DBLP、arXiv、ACL Anthology、Nature、OpenReview など)と一致すること。
  3. 文脈との適合性 — 引用された論文が、原稿内で裏付けるために用いられている主張を実際に裏付けていること。

このスキルは、\aris{}のエビデンスと主張の信頼性を確保するための第4の層です。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は本物のように見えるが、リンク先が存在しない。
  • 自己引用の年のずれ:自身の過去の研究を、1年ずれた年で引用している。

定数

  • REVIEWER_MODEL = gpt-6-astra — Codex MCP 経由で使用します。ウェブアクセスを使ったモデル間レビューのデフォルトです。
  • CONTEXT_POLICY = fresh — 監査を実行するたびに、新しいレビュースレッドを使用します(REVIEWER_BIAS_GUARD)。codex-reply は使用しません。
  • WEB_SEARCH = required — レビュアーは、記憶に基づくパターンマッチではなく、ウェブ/DBLP/arXiv を実際に検索する必要があります。
  • OUTPUT = CITATION_AUDIT.md — エントリーごとの判定レポート(人間が読める形式)です。
  • STATE = CITATION_AUDIT.json — 下流ツールで利用できる、機械可読な判定台帳です。
  • SOFT_ONLY = false — — soft-only / — soft_only フラグで設定すると、監査は3つのレイヤーすべてを通常どおり実行しますが、.bib ファイルの変更を禁止します。通常なら .bib を変更する調査結果(FIX / REPLACE / REMOVE)は、引用元の *.tex ファイルに対する出現箇所ごとの文書書き換え案に変換されます。/resubmit-pipeline の Phase 1 で使用し、ユーザーの「bib を変更しない」という厳格な制約を守ります。
  • RENDER_HTML = true — true(デフォルト)の場合、レポートの書き込み後に CITATION_AUDIT.md を自動的に HTML にレンダリングします。完全な Codex レビューチェックを使用します(監査クラスの成果物であるため、レンダリング忠実度チェックはスキルのモデル間監査不変条件に適合します)。スキップするには false に設定するか、— render html: false を渡します。

ワークフロー

Step 1: bib ファイルとセクションファイルの特定

次のファイルを探します。

  • 論文ディレクトリ内の references.bib(または paper.bib など)
  • \cite{...} の呼び出しを含むすべての *.tex ファイル(通常は sec/ または sections/)

bib ファイルが複数ある場合は、それぞれ個別に監査します。

Step 2: すべての(cite-key, context)ペアの抽出

論文内の各 \cite{key1,key2,...} 呼び出しについて、次の情報を記録します。

  • cite key
  • ファイルと行番号
  • 引用の前後にある文(文脈確認のため、引用を含む完全な文を1文以上)

(key, file, line, surrounding_sentence) タプルのフラットなリストを出力します。

また、逆引きも作成します。各 bib エントリーについて、そのエントリーが引用されているすべての箇所のリストを作成します。

ワークフロー全体で使用する2つのプロトコル用セットを定義します。cited_keys は、監査対象の *.tex ファイル内にあるすべての \cite{...} 呼び出しに含まれる一意の cite key の集合(重複排除済み)です。bib_keys は、監査対象の bib ファイルから解析されたキーの集合です。cited_keys は Step 3(引用されたエントリーのみを監査)で使用します。bib_keys \ cited_keys は、--uncited オプトインで提示される未引用の残余集合です。

ユーザーが --uncited を指定した場合は、ここで集合差 bib_keys \ cited_keys も計算し、Step 5 と JSON 集約で使用するために保存します。プロトコルについては、以下の「未引用エントリーの検出(オプトイン)」を参照してください。集合差分は文字列操作のみであり、レビュアーの予算は消費しません。

抽出した文脈を paper/.aris/citation-audit/contexts.txt に保存し、レビュアーが直接読めるようにします。audited_input_hashes にファイルを記録する際は、論文ディレクトリからの相対パス .aris/citation-audit/contexts.txt を使用します。検証者が後から再ハッシュできない /tmp などの一時的な場所には置かないでください。

Step 3: 各エントリーを新しいモデル間レビュアーに送信

引用された各 bib エントリー、つまり、抽出された引用文脈が少なくとも1つある cited_keys 内の各キーについて、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:判定結果を集約する

「Submission Artifact Emission」以下で定義されているスキーマ(このファイルに対する唯一の正式なスキーマ)に従って、CITATION_AUDIT.json を作成します。 エントリーごとの台帳データは、トップレベルの entries フィールドではなく、details.per_entry の下に配置します。トップレベルの verdict は、"Submission Artifact Emission" の判定表に従ってエントリーごとの判定結果から導出する全体の値(PASS / WARN / FAIL / NOT_APPLICABLE / BLOCKED / ERROR)を 1 つ設定します。トップレベルの summary は、人が読める 1 行の文字列にします。

具体的には、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)については、「Submission Artifact Emission」を参照してください。

ステップ 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 による参照がない文献目録エントリーは、何も通知されずに無視されます。

オプトイン:実行時に --uncited を渡します。その場合、このスキルはステップ 2 の後に集合差分を取り、監査対象の文献目録ファイルのいずれかに存在するものの、論文内のどこからも引用されていないエントリーを報告します。検出のみを行います。引用されていないエントリーはクロスモデルレビューアーに送られないため、レビューアーやウェブ検索の追加コストは発生しません。

オプトインにする理由

このスキルの主な出力は、引用されたエントリーに対する 3 軸監査です。引用されていない文献目録エントリーをデフォルトで表示すると、(a) 既存の実行すべてで長文出力が変わり、(b) 共有ラボの文献目録や、引用を削除したものの意図的にエントリーを残している作業中のセクション並べ替えなど、文献目録ファイル全体を意図的に維持しているユーザーの判定に不要なノイズが加わります。このフラグにより、既存の呼び出し元の動作は一切変わりません。

有効にした場合の動作

--uncited が設定されている場合:

  • CITATION_AUDIT.md に ## Uncited Entries (opt-in) セクションが追加され、各キーと 1 行の提案が記載されます。提案は prune(使用されていないエントリーのため、削除を推奨)または check(意図的な可能性があるため、ユーザーによる確認を促す)です。デフォルトの提案は prune です。具体的なローカルの根拠がある場合(例:キーに言及する .tex ファイル内の TODO コメント、または git diff で確認できる、最近削除された \cite)に限り、check を出力します。文献目録キーの文字列だけから意図を推測しないでください。
  • CITATION_AUDIT.json の details に uncited_entries 配列が追加されます。スキーマについては、以下の「Submission Artifact Emission」を参照してください。
  • トップレベルの verdict は変わりません。引用されていないエントリーによって、PASS / WARN / FAIL などの分類が上がったり下がったりすることはありません。reason_code と summary の形式も変わらず、details.uncited_entries フィールドのみが追加されます。
  • 検証ゲートと下流のスキル(paper-writing Phase 6、verify_paper_audits.sh)は、uncited_entries が存在することをブロック要因として扱ってはなりません。
オプトインが適切な場合
  • 投稿前の整理(カメラレディの ZIP を共有する前に、不要な文献目録エントリーを削除する)。
  • 論文では一部のみを使用する共有ラボの文献目録ファイルで、対象範囲を確認したい場合。
  • 引用されていないエントリー数を以前に確認しており、その変化を追跡したい場合の定期監査。
bib の列挙に失敗した場合のフォールバック

--uncited が有効でも、bib キーの完全な列挙に失敗した場合(例:パーサーで復元できない不正な bib 構文)は、可能な限り引用済みエントリーの監査を続行する必要があります。その場合:

  • トップレベルの verdict、reason_code、summary は変更しないでください。
  • details.uncited_entries は空の配列 [] として出力してください。
  • details.uncited_entries_status: "unavailable" を追加し、その理由を説明する1行の注記を添えてください(例:"bib parser could not enumerate keys; cited-entry audit completed normally")。
  • 検証ゲートと後続スキルは、unavailable をフィールドが存在しない場合と同様に扱う必要があります。つまり、ブロックしません。

引用済みエントリーの監査さえできないほど bib ファイルを読み取れない場合は、判定テーブルで定義されている既存の BLOCKED / bib_unreadable の処理にフォールバックしてください。これはフラグを指定しない場合のデフォルトと同じ動作です。

主なルール

  • 監査を実行するたびに、新しいレビュースレッドを使用する — 以前のレビューコンテキストを再利用しないでください
  • Web アクセスが必須 — レビュアーは記憶のパターンマッチングではなく、実際に検索する必要があります
  • コンテキストの誤りはメタデータの誤りより重大 — 誤った主張の裏付けに実在する論文を使うことは、著者名の誤記より危険です
  • REPLACE/REMOVE には人間の承認が必要 — 内容に関する主張を自動で変更しないでください
  • 常に出力し、ブロックしない — このスキルは常に判定結果を含む CITATION_AUDIT.json を書き出します。最終化をブロックするかどうかは、assurance レベルに基づき、paper-writing のフェーズ6と verify_paper_audits.sh で決まります。以下の「提出用成果物の出力」を参照してください。
  • 提出ごとに1回実行する — 監査には各エントリーの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 を検索してください。
  • プレプリントと出版済み論文:両方が存在する場合、レビュアーは出版済みの掲載先(arXiv 2401.xxxxx より ICML 2024)を優先しつつ、両方にフラグを付けてください。
  • Anthology と OpenReview:NeurIPS/ICLR の論文は、公式論文集への掲載前に OpenReview のエントリーが存在します。どちらも有効な情報源です。
  • 複数著者名の省略:and others を使用した著者6名以上の bib エントリーは慣例に沿ったものであり、省略によってユーザーが明示的に重視する共著者が隠れていない限り、フラグを付けません。

レビューの追跡

mcp__codex__codex のレビュアー呼び出しごとに、shared-references/review-tracing.md に従ってトレースを保存してください(ポリシー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 Entries (opt-in) セクション(--uncited フラグ使用時。フラグが未設定の場合、フィールドは存在せず、セクションも省略)
  • CITATION_AUDIT.html(RENDER_HTML = 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 判定を出力し、後続の呼び出し元(または Step 6 の --apply パス)は Bib を変更できます。

オプトイン:呼び出し時に — soft-only(— soft_only も使用可能)を渡します。このモードは、特に /resubmit-pipeline の Phase 1 など、「Bib を凍結する」という厳格な制約の下で動作する呼び出し元向けです。引用が文脈に合っていない場合は、周囲の文を控えめな表現に直します。引用自体を変更、追加、削除してはいけません。

ソフトのみモードで変わる点

監査のセマンティクスは変わりません。存在確認、メタデータ確認、文脈との適合性確認はすべて実行され、引用されたエントリーごとにレビュー担当者が引き続き 1 回呼び出され、エントリーごとの KEEP / FIX / REPLACE / REMOVE 判定もデフォルトモードとまったく同じように計算・出力されます。変わるのはアクション層だけです。ソフトのみモードでは、各基本判定を Bib の変更ではなく、文章の書き換え提案に変換します。

判定の変換表
基本判定ソフトのみモードでの変換備考
KEEPkeep_unchanged対応は不要です。引用と文の両方に問題はありません。
FIX(メタデータの誤り)keep_metadata_drift_acknowledgedBib はそのままにします。投稿時に人によるレビューが必要な項目としてフラグを立てます。注記「metadata drift detected but not fixed under --soft-only」を追記します。
REPLACE(文脈に合わない引用)soften_citing_sentence出現箇所ごとの文の書き換え提案です。本文内の各 \cite{X} について、前後の文を特定し、X が実際に示している内容を超えて主張しない、控えめな表現を提案します。
REMOVE(実在しない論文を参照する引用、つまり幻覚による引用)drop_cite_in_body_onlyBib のエントリーは変更しません(--soft-only の不変条件による)。ただし、本文内のインライン \cite{X} 参照は必ず削除し、実在しない論文に依存しないよう周囲の文を書き換える必要があります。書き換えでは、次の 2 つの方針を使用できます。(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 配列が追加されます。各項目は監査対象の Bib キーごとに 1 つで、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 では、判定の原因となった本文中の \cite{X} 箇所ごとに 1 つのオブジェクトを occurrences に記載する必要があります。

drop_cite_in_body_only の場合、proposed_rewrite フィールドには、インラインの \cite{X} を削除した(またはインビブの別のソースへの \cite{Y} に置き換えた)文が示されます。bib_entry_action フィールドは "leave_as_is_per_soft_only" に固定されます。監査によって Bib レコード自体が変更されることはありません。

拡張版の人間向けレポート

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 バッジが付記されます。これにより、Bib が変更されていない理由が後続の読み手にもすぐにわかります。

--soft-only 指定時の強制保証
  • いかなる状況でも .bib ファイルは変更されません。 Bib ファイルに対するステップ 6(「修正を適用(対話形式)」)はスキップされます。生成されるのは *.tex の修正案のみであり、テキストを編集する前に人間の承認が必要です。
  • 後続の呼び出し元(paper-writing の Phase 6 やラッパーを含む)が --soft-only 指定中に Bib の編集を提案した場合は、拒否します。トレースに 1 行の拒否メッセージを出力し、次の検出結果に進みます。
  • トップレベルの verdict 判定表は変更されません。誤ったコンテキストでの引用は、引き続き reason_code: wrong_context を伴う FAIL となります。Soft-only によって検出結果が抑止されることはなく、制限されるのはアクションレイヤーのみです。
  • --soft-only は --uncited と併用できます。両方のフラグを同時に指定できます。未引用のエントリーは検出のみの対象であり、Soft-only による修正の対象にはなりません(修正する引用文がないためです)。

提出アーティファクトの出力

このスキルは、呼び出し元や検出結果にかかわらず、常に paper/CITATION_AUDIT.json を書き出します。.bib ファイルがない論文、または \cite{...} の使用箇所がない論文では、NOT_APPLICABLE の判定を出力します。無言でスキップすることは禁止されています。 paper-writing の Phase 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 に列挙されます(すべての Bib エントリーが引用されている場合は空になることがあります)。
  • フラグを指定したものの、Bib キーの列挙に失敗した場合(上記「Bib の列挙に失敗した場合のフォールバック」を参照)、uncited_entries_status は "unavailable" となり、uncited_entries は [] になります。後続のコンシューマーは、"unavailable" をフィールドが存在しない場合と同じように扱い、ブロックしてはなりません。
  • 後続のコンシューマーは、いずれかのフィールドが存在しない状態のみを有効なデフォルト状態として扱い、フィールドの欠落によってエラーを発生させてはなりません。
  • suggestion はあくまで参考情報です。検証ツールと paper-writing の Phase 6 は、これを理由に処理をブロックしません。
audited_input_hashes の対象範囲

この監査に実際に渡された宣言済み入力セット、すなわち .bib ファイル、main.tex、および引用コンテキストを提供したすべての sections/*.tex ファイルをハッシュ化します。/tmp やその他の一時的な パスから抽出したコンテキストはハッシュ化しないでください。抽出したコンテキストを 一時保存する必要がある場合は、検証ツールが再現可能な形で再ハッシュできるよう、 paper/.aris/ の下に配置してください。リポジトリ全体のファイルの和集合や、 レビュー担当者が自己申告した閲覧済みファイルのサブセットはハッシュ化しないでください。

パスの規約(verify_paper_audits.sh と一致させる必要があります):キーには paper ディレクトリからの相対パスを指定します(paper/ 接頭辞は付けません。 検証ツールはすでに paper ディレクトリからの相対パスとして解決するため、接頭辞を 付けると paper/paper/... となり、誤って STALE と判定されます)。paper ディレクトリ外のファイルには絶対パスを使用します。

判定表
入力状態判定reason_code の例
.bib ファイルがない、または \cite{...} の使用がないNOT_APPLICABLEno_citations
.bib ファイルが参照されているが、読み取り不能/存在しないBLOCKEDbib_unreadable
すべての項目が KEEP で、3 つの軸すべてがグリーンPASSall_entries_keep
FIX 判定のみ(メタデータのずれがあり、コンテキストのエラーはない)WARNmetadata_drift
REPLACE または REMOVE がある(不適切なコンテキストまたは幻覚による項目)FAILwrong_context
ウェブ検索がタイムアウトした/レビュー担当者の呼び出しに失敗したERRORreviewer_error

--uncited フラグはこの表には記載されていません。未引用の項目は参考情報にすぎず、 最上位の判定や reason_code は決して変更しません。未引用の項目は details.uncited_entries と、任意の MD セクションのみに表示されます。

スレッドの独立性

呼び出しごとに、新しい 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 — モデル間レビューの制約

コメント