verify-refs について
verify-refsは、論文や参考文献の捏造、不一致、重複を監査するスキルです。学術論文を準備・審査する研究者向けで、参考文献ファイルを変更せず、根拠と判定を記録します。
主な機能
- 01索引との照合による文献情報の検証
- 02OK、MISMATCH、FABRICATED、UNVERIFIEDの分類
- 03識別子の重複と監査件数の報告
- 04ローカル全文を用いた引用内容の確認
- 05構造化JSON監査レポートの出力
活用シーン
- 01投稿前の参考文献監査
- 02著者名や識別子の不一致の発見
- 03取得済み論文と引用内容の照合
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ aperivue/ medsci-skills --skill verify-refsインストール後、Claude Code で/verify-refsを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
skill.ymlreferences/claim_evidence_workflow.mdmanual_checkpoint_guide.mdscripts/_claim_evidence.py_quote_match.pycheck_claim_fidelity.pyverify_cli.shverify_refs.pyscripts/claim_fidelity_challenge/verify.shscripts/claim_fidelity_challenge/fixture/manuscript_numbered.mdmanuscript_shortsource.mdmanuscript_supported.mdmanuscript_unsupported.mdrefs.bibscripts/claim_fidelity_challenge/fixture/fulltext/10.1000_synthetic.oversight.md10.1000_synthetic.stub.mdtests/test_audit_source_path.shtest_author_normalization.shtest_bib_entry_headers.shtest_bib_last_field.shtest_bibtex_et_al.shtest_claim_evidence.pytest_corporate_author.shtest_doi_not_registered.shtest_fabricated_author.shtest_identifier_title.shtest_markdown_reference_heading.shtest_openalex_tier.shtests/fixtures/corporate_author.bibpagination_placeholder.bib詳細
参考文献の検証(監査のみ)
既存の原稿または参考文献一覧を監査し、捏造された参考文献や不一致のある参考文献を確認します。
このスキルは references/ や manuscript/_src/refs.bib には書き込みを行いません。修正は
/lit-sync(Zotero → Better BibTeX → refs.bib)を通じて行い、/manage-project の
scripts/validate_project_contract.py は、ここで書き込まれた references/* ファイルを変更として検出します。
文献の検索(/search-lit)は行わず、欠落した引用や不適切な引用を、もっともらしい代替文献に置き換えることもありません。置き換えは /search-lit またはユーザーを通じて行います。
入力
- 原稿または参考文献一覧:
.md、.docx、.bib、.txt、.tsv。 - 任意のプロジェクトルート。デフォルト:現在の作業ディレクトリ。
- 任意のフラグ:
--offline(API 呼び出しを行わずに抽出・分類)、--timeout N(HTTP タイムアウト秒数)、--strict、--no-openalex。
Pandoc の [@bibkey] 形式の引用を含む Markdown 原稿では、先に引用キーを確認してください
(/manage-refs の check_citation_keys.py または使用している参考文献管理ツールを利用します)。
これにより、キーの誤りを検出できます。verify_refs.py はメタデータの捏造を検出します。
決定論的なスクリプト
引用を記憶に頼って検証するのではなく、同梱のスクリプトを実行してください。
python "${CLAUDE_SKILL_DIR}/scripts/verify_refs.py" manuscript/manuscript.md --project-root .
フックまたは手動で素早く実行する場合は、ラッパーを使用してください。
"${CLAUDE_SKILL_DIR}/scripts/verify_cli.sh" manuscript/manuscript.md --offline
投稿前に手動で厳密に実行する場合:
"${CLAUDE_SKILL_DIR}/scripts/verify_cli.sh" manuscript/index.qmd --strict
--strict は --offline を禁止し、UNVERIFIED の行が1つでもある場合はゼロ以外の終了コードを返します。実行するタイミングとステータスごとの対応については、references/manual_checkpoint_guide.md を参照してください。
検索は、PubMed(PMID)→ CrossRef(DOI。CrossRef が 404 を返す場合は doi.org のハンドルレジストリ)→ OpenAlex の順に実行し、最後に PubMed のタイトル検索を行います。
すべての OK 行は、DOI、PMID、CrossRef、または PubMed のタイトルによる証拠に基づいています。検索に失敗した場合は UNVERIFIED として記録され、黙って合格扱いにはなりません。いずれのインデックスでも、タイトル検索が有効なのは、返されたタイトルが引用されたタイトルと一致する場合に限られます(同じトークン類似度チェックを使用します)。そのため、作り上げたタイトルが、検索で何かが返されたというだけで OK になることはありません。
OpenAlex の段階。 PubMed と CrossRef では見つからない、会議論文や DOI のない引用(医療 AI の原稿でよくある NeurIPS/ICLR/ACL など)を検出します。著者リストがまだ取得されていない場合にのみ呼び出されます。DOI で解決し、それ以外の場合はトークン類似度チェックを通したタイトル検索で解決するため、捏造されたタイトルが OK になることはありません。OpenAlex の名前には姓と名の区別がないため、存在確認と、柔軟な筆頭著者の一致確認にのみ使用されます。厳密な著者の順序や著者数に基づく MISMATCH 判定には使用されず、これらの判定は PubMed efetch/CrossRef の情報に基づきます。OpenAlex で見つからない場合は FABRICATED ではなく UNVERIFIED になります。--no-openalex を指定すると、検証対象は PubMed と CrossRef に限定されます。
出力仕様(v1.3.0)
qc/reference_audit.json(schema_version 4)のみが出力されます。このスキルだけがこのファイルを書き込み、
TSV も library.bib も書き込みません。
records[]:参考文献ごとのstatus、note、evidence、cited_authors[]/actual_authors[]、cited_author_count/actual_author_count。statusは次のいずれかです。OK:照合により著作物が確認され(DOI、PMID、または類似度ガードを通過したタイトル検索)、著者も一致しています。MISMATCH:著作物は存在しますが、引用に誤りがあります。著者が異なる(Gate 4)、または 照合で著作物が見つかったにもかかわらず DOI/PMID が存在しない(note = "wrong identifier…")場合です。FABRICATED:引用された識別子が存在せず、ほかにも著作物が見つからない場合です(詳細は以下)。UNVERIFIED:確認も否定もできていない場合です(照合に失敗した、別の登録機関だけが管理する DOI をどの索引も確認できなかった、識別子もタイトル一致もない、著者を比較できないか著者が異なる PubMed のタイトルのみの一致(note = "title_only: …")、または--offlineの場合)。
countsおよびduplicate_findings[](Gate 5)。submission_safe:FABRICATEDとMISMATCHがなく、duplicate_findingsが空であることを示します。fully_verifiedには、さらにUNVERIFIEDがないことも必要です。submission_safeはUNVERIFIEDの行を許容します。オフライン実行では該当行が生じるためです。投稿前に、各行を解決してください(手作業で確認し、その方法を記載するか、引用を削除してください)。確認済みであるかのようにUNVERIFIEDの参考文献を提出してはいけません。source_sha256とaudited_ref_ids:監査対象を示します。後から確認する際は、現在の bib と照合します。bib が変更されていれば、監査結果は古くなっています。
ワークフロー
- 入力ファイルとプロジェクトのルートを特定します。
scripts/verify_refs.pyを実行します。qc/reference_audit.jsonを読みます。判定はすべてこのファイルに基づきます。自分で行にOKを付けてはいけません。- すべての
FABRICATEDとMISMATCHの行を先に報告します(records[]から)。 - すべての
duplicate_findings[]エントリを報告します(PMID/DOI の重複をそのまま記載します。番号の振り直しが必要です)。 UNVERIFIEDの行が残っている場合は、手動確認項目として列挙し、原稿が完全に投稿可能な状態だとは述べないでください。ステータスにかかわらず、すべての行のnoteを確認してください。pagination_placeholder(e000–e000/in press/TBD/ `forthcoming)がある場合は、投稿前に引用を解決する必要があります。/self-review の Phase 2.5c で、P0 ブロッカーに該当するかどうかを判断します。- ユーザーが人間の読みやすい表を必要とする場合は、チャット内で
records[]の内容を要約します。TSV は書き込まないでください。
品質ゲート
- ゲート 1:いずれかの行が
FABRICATEDの場合、提出を中止します。 - ゲート 2:
UNVERIFIEDの参考文献を受け入れる前に、ユーザーの確認を求めます。 - ゲート 3:参考文献を編集した後は、再実行します。
- ゲート 4(全著者の相互確認):PMID がある場合、著者の正規リストは PubMed の
efetch.fcgi(XML)から取得します。CrossRef は名の取得が不安定なため、これを優先し、 CrossRef と PubMed の esummary はフォールバックとして使用します。BibTeX 入力では、引用された各姓を インデックスごとに比較し、引用側とソース側の著者数を比較します。比較前に、大文字・小文字、発音区別符号、 ハイフンとスペースの違い、名前の前置詞("von"、"van"、"de")を正規化します。また、一方の名前が他方の 完全な単語であれば一致とみなします("Garcia" / "Garcia-Lopez")。単なる部分文字列の一致は認めません ("Li" / "Williams")。DOI/PMID の解決には成功しても、著者がいずれかのインデックスまたは人数で異なる行はMISMATCHになります。最初の著者についてはnote = "first-author hallucination suspected"、 2 番目以降の著者または著者数についてはnote = "non-first-author hallucination or count mismatch"とします。 最初の著者が正しいことだけでは、リストの残りの著者が正しいとは確認できません。プレーンテキスト / TSV 入力と、確実に解析できないリストでは、最初の著者の照合に限定します(それすら空の場合はスキップします)。 PubMed のタイトルのみの一致は、一致したレコードの esummary の著者を引用側の著者と比較して一致した場合に限りOKとなります。そうでなければUNVERIFIEDのままです。明示された省略(BibTeX のand others、 または_audit_truncated = <N>フィールド)がある場合、引用側の著者数がソース側より少なくても注記にとどめます。 引用側の著者数がソース側より多い場合は、常にフラグが付けられます。 - ゲート 5:参考文献リスト内の、PMID の完全一致または正規化後の DOI の重複は、
duplicate_findings[]に重大な問題として記録されます。submission_safe == trueにするには、 リストが空である必要があります。 - ゲート 6:生の参考文献エントリに
e000–e000、in press、TBD、forthcomingが残っている場合、note = "pagination_placeholder"としてUNVERIFIEDにします。verify-refs は原稿に依存せず、 フラグを付けるだけです。原稿を確認したうえで、/self-reviewのフェーズ 2.5c が、引用が方法論または見出しを 支える重要なものかどうかを判断し、P0 のブロッカーに該当するかを決定します。
引用メタデータの混乱は捏造ではありません。 DOI の末尾の数字が論文番号に似ていても異なる場合
(記事番号 26068 に対して DOI の末尾が "77196" など)、それは表記上の問題です。識別子が解決され、著者も一致する
場合、その行を捏造として報告しないでください。スクリプトが FABRICATED を返すのは、識別子が存在しない場合に
限られます。具体的には、PubMed に記録のない PMID、または CrossRef が 404 を返し、doi.org のハンドルレジストリ
(CrossRef、DataCite、mEDRA、JaLC などすべての登録機関を網羅)も見つからないと報告する DOI が対象です。
また、別の方法でその文献が見つからなかった場合に限ります。CrossRef が 404 を返した後の DOI 判定は次のとおりです。
| doi.org ハンドルレジストリ | 別の検索で文献が見つかる | ステータス |
|---|---|---|
| 見つからない | いいえ | FABRICATED |
| 見つからない | はい(類似性のガードを通過したタイトル検索) | MISMATCH — 実在する論文が誤った DOI で引用されています |
| 見つかった(別の機関で登録) | いいえ / はい | UNVERIFIED / OK |
| 検索に失敗(ネットワーク、5xx、予期しない応答) | いいえ / はい | UNVERIFIED / OK |
適切な形式の DOI ではない DOI フィールド(n/a などのプレースホルダー)は doi.org に送信されず、
UNVERIFIED のままです。doi.org で見つからない旧式の SICI DOI(10.1002/(SICI)…)も同様です。
抽出時に句読点が容易に切り落とされるためです。著者が異なる実在の識別子は MISMATCH です(ゲート 4)。
主張の忠実性 — 引用元は、主張されている内容を実際に述べていますか?
verify_refs.py が判定するのは、参照先が実在するか、また誰のものかであり、それを引用する文が参照先の内容として正しいかどうかではありません。scripts/check_claim_fidelity.py は、ダウンロードして変換済みの全文(/fulltext-retrieval はまさにこの形式で出力します。このスクリプトが何かを取得することはありません)を使って、確認可能な答えがある主張をチェックします。
python3 "${CLAUDE_SKILL_DIR}/scripts/check_claim_fidelity.py" \
--manuscript manuscript/manuscript.md \
--fulltext-dir fulltext/ --bib manuscript/_src/refs.bib \
--out qc/claim_fidelity.json --strict
| 判定 | 重大度 | 発生条件 |
|---|---|---|
CITED_QUOTE_ABSENT | major | 出典に帰属させた引用文が、どの読み順でも出典内に見つかりません。 |
CITED_QUOTE_UNRESOLVED | prompt | 単語が1、2語抜けた状態で引用文が一致しています。これは捏造ではなく、抽出結果が不完全である兆候です。確認してください。決めつけないでください。 |
ATTRIBUTION_UNSUPPORTED | prompt | 帰属させた主張の内容語が、どの形でも出典に1語も含まれていません。通常、言い換えであっても出典独自の用語が少なくとも1つは残ります。 |
ORDINAL_CLAIM_UNSUPPORTED | prompt | 「reports three strategies [12]」のように、出典ではその名詞について論じているものの、その近くで数を述べていません。 |
--strict で失敗する可能性があるのは引用文の判定だけです。それ以外は出典を確認するためのプロンプトです。言い換えは正当なものだからです。「未チェック」の行を確認してください。ディスク上に全文がない引用は未解決として報告され、抽出テキストが要旨のみの出典は、判定するには短すぎると報告されます。問題が見つからなかったということは、「確認可能な範囲では誤りがなかった」という意味であり、「すべて正しい」という意味ではありません。
既知の制限:引用文の単語がすべて、出典のトークンを間に挟みながら順序どおりに登場する場合(INTERLEAVED)、検証済みとして扱われます。そのため、「not」など出典の単語を省いた引用文では、指摘が出ないことがあります。否定や限定条件を変えている引用文は、すべて読み直してください。
文単位の出典エビデンステーブル
qc/claim_fidelity.json には evidence_rows も含まれます。認識された散文の文と引用の組み合わせごとに1行あり、原稿内の位置、出典テキストとPDFのハッシュ、参考情報としての取得時の識別情報、評価者が記入する比較結果が含まれます。書誌情報のステータスが OK で、プローブが何も検出しなかった場合でも、初期値は not_assessed です。
python3 "${CLAUDE_SKILL_DIR}/scripts/check_claim_fidelity.py" \
--manuscript manuscript/manuscript.md --bib manuscript/_src/refs.bib \
--fulltext-dir fulltext/ --retrieval-report pdfs/retrieval_report.json \
--reference-audit qc/reference_audit.json \
--out qc/claim_fidelity.json --evidence-table qc/claim_fidelity.md
実際の出典を確認してから、ページ、抜粋、指標/単位/分母、対象集団、方向性、評価者名を入力してください。数値が一致することや、単語が一致することだけでは裏付けになりません。評価者が AI による支援を利用したかどうかを記録し、AI が生成した評価を人間による承認として決して記述しないでください。注釈を保持するには、--reviewed-report qc/claim_fidelity.json を指定して再実行してください。入力が変更されると、以前の評価は未解決になります。Markdown の表は派生ビューであり、別の編集可能なエビデンスストアではありません。評価を入力または引き継ぐ前に、references/claim_evidence_workflow.md を読んでください。