Claude Codeのmath-olympiadプラグインで競技数学を敵対的検証つきで解く
math-olympiadプラグインは、証明の推論過程を伏せた検証者に攻撃させて競技数学を解きます。導入手順、検証フロー、自信がないときの撤退、公式ファイル同士の食い違いまで扱います。
math-olympiadは、IMO・Putnam・USAMOなどの競技数学を「解いた本人とは別の検証者に攻撃させる」ことで誤答を減らすプラグインです。Claude Codeの公式マーケットプレイスに入っており、/plugin install で入れると、問題文を渡すだけで解答、検証、LaTeX整形までを段階的に回します。この記事では、導入手順、検証フローの中身、使うときの注意点を扱います。
math-olympiadプラグインは何を解決するのか
READMEは、課題を一文で書いています。自己検証は騙されます。推論過程を見ながら検証する側は、同意する方向に偏るからです。
READMEは根拠として論文 "Proof or Bluff"(arXiv:2503.21934)を挙げ、「自己検証でIMOを85.7%解けたとされるモデルが、人間の採点では5%未満に落ちた」と説明しています。数値はREADMEが論文から引用したものです。
対策としてREADMEが挙げる柱は4つです。
プラグインの4本柱
文脈を切り離した検証
検証者に渡すのは清書した証明だけです。解いた過程の思考ログは見せません。
パターンを持たせた攻撃
「これは正しいか」と聞かず、「この主張をゼータ関数に当てはめると未解決問題が解けてしまわないか」のように具体的な穴を探させます。
確信がなければ撤退
「確信できる解がない」と答えます。誤答を自信ありげに出すより、撤退を選ぶ設計です。
清書の工程
検証を通った証明だけをLaTeXやPDFに整えます。
評価についてREADMEは、IMOとPutnamの2025年の問題18問のうち17問を解き、誤って正解と判定した例は0件、新しい証明が2件見つかったと書いています。評価データへのリンクはAnthropicのモノレポを指しています。プラグインに同梱されている評価用ファイルは evals/trigger_eval.json だけです。
導入と最初の1問
導入は公式マーケットプレイス経由です。READMEの手順は次の1行です。
/plugin install math-olympiad@claude-plugins-officialClaude Codeのプラグイン導入ドキュメントによると、セッション内でこのコマンドを実行しても、その場ではインストールされません。/plugin パネルがこのプラグインの詳細画面で開き、スコープを選んでから導入する流れです。公式マーケットプレイスは、初めて対話セッションを開いたときにClaude Codeが自動で追加します。入れたあとに有効化が必要と表示されたら /reload-plugins を実行します。
シェルから入れるなら、同じ名前で claude plugin install を使います。
claude plugin install math-olympiad@claude-plugins-official使い方はREADMEのとおり、問題文を渡すだけです。
> Solve this IMO problem: [問題文をここに貼る]スキルは「IMO」「Putnam」「olympiad」「verify this proof」といった語で自動起動します。SKILL.mdの説明文には、USAMO、AIME、「competition math」、「find a counterexample」、「is this proof correct」も起動語として並んでいます。英語の語で書かれているため、日本語の問題文でも、これらの語を1つ添えておくと起動の取りこぼしを避けやすくなります。
検証フロー: 清書と攻撃を分ける5段階
SKILL.mdが定める本流は次の順序です。検証者を何人どう使うかが、この仕組みの肝です。
解答から清書までの流れ
- 1
解釈の確認
問題文の読み方を2〜3通り挙げ、易しすぎる読みは罠とみなして難しい読みを解きます。SKILL.mdは、技術的に正しいとされた63件のうち50件が別の解釈への解答だったという事例を根拠にしています。
- 2
候補の並列生成
異なる切り口を渡した複数のエージェントが、解く、見直す、厳しく採点する、直す、を最大5周回します。
- 3
清書
各解答から「方法」「証明」「答え」だけを抜き出します。「ちょっと待てよ」のような試行錯誤の文章は落とします。
- 4
敵対的な検証
何も知らない新しい文脈の検証者が、問題文と清書済みの証明だけを受け取り、穴を探します。
- 5
多数決と修正
上位の解答を最大5人の検証者にかけ、穴が見つかれば修正担当に戻します。修正は最大3回です。
工程の中で、他の検証と異なるのは次の3点です。
検証者は「思考ログ」も「他の検証者の票」も見ない
SKILL.mdはこれを二重の文脈分離と呼びます。長い推論は、それだけで正しさの証拠のように読めてしまいます。「すでに3人が確認した」という情報も同調を生みます。そこで検証者は、解いた人の思考過程も他の検証者の判定も知らされず、自分が最初の検証者だと思って読みます。解く側の自己検証は検証には数えません。
票の重みは非対称で、決着したら打ち切る
確定は4票のHOLDS(穴なし)、却下は2票のHOLE FOUND(穴あり)です。検証者が1人うっかり見逃しても正しい証明が潰れず、独立した2人の指摘は本物のシグナルとみなす設計です。結果が決まった時点で残りの検証者は起動しません。たとえば最初の3人で2票が穴なし、1票が穴ありなら追加で2人を呼び、3票が穴なしなら1人だけ追加します。
検証者は「具体的な穴」を探す
検証者のプロンプトには、証明が壊れる典型的な形がパターンとして渡されます。SKILL.mdが表にしている代表例は次のとおりです。
| パターン | 検証者への問い |
|---|---|
| #4 | 検証者への問いこの定理をゼータ関数のような有名な対象に当てはめたら、未解決問題が解けてしまわないか。解けるなら証明に穴がある |
| #18 | 検証者への問い証明の途中で示した等式を、最後に残った穴に代入する。元の主張に戻るなら循環論法 |
| #40 | 検証者への問い「一行の補題」を一般形にして、2×2の反例を探す。一般形が偽なら、この場合だけ成り立つ理由を探す |
| #5 | 検証者への問い引用した定理の仮定を最初から確かめ直す。「[0,1]で連続」と「ℝ全体で連続」は別物 |
| #6 | 検証者への問い正則化した値で上から抑えた無限和は、境界に極がないか確かめる |
references/verifier_patterns.md には、これを含めたパターンが定義されています。プロンプト集の adversarial_prompts.md は、証明が否定される理由を7分類にまとめています。
確信がなければ撤退する仕組み
修正を3回重ねても穴が塞がらないとき、スキルは答えをひねり出さず、次の形式で終わります。
- Verdict: no confident solution
- What was tried: 試した方針
- What WAS proven: 検証を生き残った補題・部分結果
- Where it breaks: 残った穴
SKILL.mdは、見るべき指標を条件付き正解率だと書いています。「解けた」と言ったときに本当に合っているか、です。
ただし撤退の前にもう一段あります。検証段階で撤退となったら、書き出す前に深掘りモードのエージェントを1つ必ず起動します。ここでは剰余計算や小さい場合の列挙など、範囲を限った計算のためにBashやPythonが使えます。逆にWebFetchやWebSearchなど、ネットにつながる手段は使えません。ネットで解答を探すことは、競技数学では不正にあたるためです。深掘りモードでも解けなければ、そこで初めて撤退を書き出します。
公式ファイル同士の食い違い
プラグインを調整したり他の用途に写したりするとき、同じリポジトリの中でも数値や名前が揃っていない点に注意が必要です。
モデル別の既定値が2か所で違う
SKILL.mdの表
Haiku: 解く側8、検証3パス、修正2回失敗で撤退。Sonnet: 解く側4、検証5パス、修正3回失敗で撤退。Opus: 解く側3、検証5パスとパターン総当たり、修正4回失敗で撤退。
model_tier_defaults.md
Haiku: 解く側12、検証者7(確定5・却下3)、撤退は3回連続失敗。Sonnet: 解く側6、検証者5(確定4・却下2)、撤退は3回連続失敗。Opus: 解く側4、検証者5と各パターン専用の検証者、撤退は5回連続失敗。
食い違いはほかにもあります。SKILL.mdの手順2は解く側を「8〜12」と書き、検証者の判定語はSKILL.mdがHOLDS / HOLE FOUND / UNCLEAR、プロンプト集がCORRECT / INCORRECT / GAPです。パターン数もSKILL.mdと参照資料の本文が12、verifier_patterns.md の冒頭文は13と書いています(見出しは13個)。
どちらが実行時に効くかは、ファイルから読み取れません。実行するモデルを自分で決めて固定したいなら、プロンプトで解く側の数や票のしきい値を明示すると、結果が再現しやすくなります。SKILL.mdには、モデルが自分を判別できないときの既定はSonnet設定とあります。
使うときの注意点
- 扱う問題の種類: 本流は証明問題向けです。AIMEのような数値解答は、証明の仕組みを省いて5〜7人に解かせ、多数決を取ります。多数決が割れたら上位2候補を代入で確かめます
- 計算の扱い: 本流の解く側と検証者は思考のみで動きます。プロンプトの冒頭2段落は一語も変えないよう書かれています。SKILL.mdは、これを省いて自作したプロンプトだとPythonの計算を何十回も回して自信満々に誤答する、と警告しています
- 問題集全体を解くとき: 1問ずつ別々に解き、検証者もその問題専用に用意します。複数のエージェントを1つのWorkflowで回す場合は、
label: "P3:solver:2"のように問題番号を入れたラベルを付けます。ラベルがないと、結果が問題と結びつきません - LaTeX/PDFの出力:
pdflatexが使えるときに限ってPDFまで作ります。判定は同梱のscripts/check_latex.sh、変換はscripts/compile_pdf.shです - トークン消費: 複数のサブエージェントが走るため、使用量は通常の1回の質問よりずっと大きくなります。入れる前にプラグインが常時足すコンテキストの量を見たい場合は、claude plugin detailsでプラグインのコンテキスト消費を測る方法が使えます。導入後の確認にはclaude plugin list --jsonで導入済みプラグインを棚卸しする手順が向きます
競技数学以外に持ち出す: 検証者を分離する型
このプラグインの核心は数学ではなく、検証者に過程を見せない構造です。コードレビューや設計書チェックにも写せます。次はその一例で、プラグインの機能ではなく、考え方を借りた自作のサブエージェント定義です。
---
name: blind-reviewer
description: 完成した差分だけを渡されて、壊れる点を探す。作業の経緯は知らない。
tools: Read, Grep, Glob
---
あなたはレビュー担当ではなく、攻撃側の検証者です。
渡されるのは仕様と差分だけです。作業過程は知らされません。
「正しいか」ではなく、次を順に探してください。
1. 仕様に書かれていない前提に依存している箇所
2. 小さい入力(空、1件、境界値)で壊れる箇所
3. 「明らかに」「通常は」で済まされている箇所
穴があれば場所・理由・直せるかを返し、なければ最も疑った箇所と成り立つ理由を返してください。Claude Codeのサブエージェントは、独自のコンテキストウィンドウで動き、独自のシステムプロンプトとツール権限を持ちます。親の会話を丸ごと渡さず、仕様と差分だけを依頼文に入れて呼び出せば、math-olympiadの「清書したものだけを渡す」工程と同じ形になります。ここで要になるのは依頼文の書き方で、サブエージェントの定義だけでは分離は完成しません。
まとめ
math-olympiadが他の「解いて見直す」型と分かれる点は、見直す役を別の文脈に置き、判定を非対称な票で決め、確信がなければ撤退するところです。競技数学のために入れるなら導入は1行で済みますが、モデルごとの既定値が2か所で食い違うため、結果を揃えたい場面では回数としきい値を自分で指定する運用が安全です。