claim-verify について
claim-verifyは、結果の草稿に含まれる主張を元データと照合して敵対的に検証するスキルです。各主張を再計算し、想定される弱点を試したうえで、証拠に応じて維持、限定、修正、撤回します。
主な機能
- 01検証可能な主張を個別に抽出
- 02元データから主張を再計算
- 03交絡要因や外れ値の影響を検査
- 04検証結果に基づいて主張を修正
- 05台帳で検証過程を記録
活用シーン
- 01公開前のデータレポートの点検
- 02サブグループの結果の頑健性を検証
- 03記述的な差と因果主張を区別
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ gaasher/ agent-loop-skills --skill claim-verifyインストール後、Claude Code で/claim-verifyを入力して読み込まれたか確認します。
同梱ファイルexamples/run.example.yaml
詳細
主張検証ループ
結果の草稿を対象に、主張ごとに敵対的に検証するループです。成果物は草稿であり、フィードバックの指標は未検証の主張の数です。つまり、まだ確認されていない主張、または確認済みでもストレステストをまだ通過していない主張です。これをゼロにします。各主張は、検証済み(再現でき、明白な脅威に耐えられる)または適切に限定(理由を添えて、断定を避ける、範囲を限定する、または撤回する)のいずれかになります。
このプロセスで重要なのは、単に再現できる数値は信頼に値しないということです。誤った結果の多くは問題なく再現できます。主張が検証済みとなるのは、さらにその主張を覆す可能性が最も高い脅威に耐えられた場合だけです。たとえば、外れ値、交絡要因、意味のある結論を出すにはサンプル数が少なすぎるサブグループ、層別化によって反転する符号などです。このループは、既存の草稿に対するゲートであり、新しい知見を生み出すものではありません。
使用する場面
データセットから作成した草稿(または主張のリスト)があり、公開前に各主張をレッドチームで検証したい場合に使用します。既定では、草稿に含まれる個別の主張をすべて検証します。ユーザーが重要度の高い主張をいくつか指定した場合は、それらを優先しますが、残りも確認します。新しい知見を自由に探索する場合(その場合は data-analysis ループを使用します)や、既知の異常を1つ診断する場合には使用しません。
セットアップ
バインディングを対話形式で確定します。作業ディレクトリに loop.run.yaml がある場合はそれを読み込み、値を1行で確認してからループに進みます。ない場合は、Claude Code(AskUserQuestion ツールを使用できます)では各バインディングの妥当そうな値を推測し、推奨する選択肢として提示します。それ以外のホストでは、それぞれを引用符付きのプレーンテキストのプロンプトとして質問します。次に loop.run.yaml(形式:examples/run.example.yaml)を書き込み、他のファイルを作成する前に値を確認します。
| binding | 意味 | 既定値 | 推測方法 |
|---|---|---|---|
<draft> | 検証する結果/主張のドキュメント(markdown/text) | — | 作業ディレクトリを検索し、結果やレポートのファイルを探します |
<dataset> | 主張の根拠となったデータ。読み取り専用のグラウンドトゥルースです | — | 作業ディレクトリを検索し、データファイルを探します |
<analysis_cmd> | ユーザー環境でチェック用スニペットを実行するインタープリター | python3 | 作業ディレクトリにある pyproject.toml/.venv/uv を確認します |
<report> | このループで作成する検証済み/修正済みの草稿 | <sandbox_root>/verified.md | — |
<sandbox_root> | チェック用スニペットと台帳を保存する場所 | ./sandbox | — |
<budget> | 最大反復回数 | 10 | — |
チェック用スニペットは、<analysis_cmd> を使ってユーザーの環境で実行されるため、ユーザーがインストールしているものを利用できます。補助コードは標準ライブラリを優先してください(csv、statistics)。スニペットで pandas/numpy が必要な場合は、try/except ImportError で利用可能か確認し、標準ライブラリを使う方法に切り替えるか、同意を得て uv pip install "pandas==<ver>" を提案してください。パッケージがインストール済みだと決めつけてはいけません。
反復
このチェックリストをコピーして、項目にチェックを付けてください。
- 反復 0 —
<draft>から個別に検証可能な主張を抽出します。検証済みとして記録するものはありません。 - 未検証の主張を1つ選びます。
-
<dataset>からその数値を正確に再現します。再現できなければ →refuted。 - その主張を覆す可能性が最も高い脅威を使ってストレステストし、
verified/fragileに分類します。 -
<report>を改訂します。検証済みの主張は維持し、脆弱な主張は留保を付ける、範囲を限定する、または撤回し、誤りが確認された主張は修正します。 - 台帳に1行追加します。その主張は未検証の集合から外れます。未検証の主張がなくなるか、
<budget>に達するまで続けます。
反復 0 — 主張を抽出します。 <draft> を読み、数値またはその効果と、主張の種類(群間差、相関、因果関係/政策に関する主張、サブグループの結果、割合)を示す、個別に検証可能な主張をそれぞれ列挙します。これらが未検証の主張の集合です。草稿が文章形式の場合は、個別の主張に分割することが最初の作業です。
その後、停止条件に達するまで(すべての主張が解決するか、予算に達するまで):
-
未検証の主張を1つ選びます。
-
再現 — 最初の関門です。 主張に示された統計量を
<dataset>から再計算するために、<sandbox_root>/iter<N>/check.pyを作成します。<analysis_cmd>で実行し、出力を<sandbox_root>/iter<N>/out.txtにリダイレクトします(コンテキストに大量の出力を流さないでください)。数値が再現できなければ → refuted(数値が誤っています)。ステップ4に進みます。 -
ストレステスト — 2つ目の関門です。 主張の種類に応じて、覆す可能性が最も高い脅威を1つか2つ使って検証します。
- 外れ値への感度 — 極端な値を除外する、またはロバスト統計量を使って再計算します。効果は維持されますか。それとも、少数の行によって生じたものですか。
- 交絡とシンプソンのパラドックスによる逆転 — 明らかな交絡因子で層別化します。層内でも効果は維持されますか。それとも逆転しますか。サブグループ内で逆転する因果関係/政策に関する主張は、裏付けられていません。
- サブグループの規模と多重比較 — サブグループの規模はどれくらいですか。結果は多数の比較のうちの1つですか。n=5の際立った割合はノイズです。
- 別の仕様 — 妥当性のある別の区切り(異なるビン、共変量の調整)を使います。符号や大きさは維持されますか。
verified(再現され、ストレステストにも耐える)またはfragile(再現されるが、妥当なストレステストで崩れるか逆転する)に分類します。数値は再現されても、そこから導かれる解釈が裏付けられていない主張 — 因果関係のように装った記述的な差(「処置が効果を発揮する」)、大きな優位性として示された極めて小さなnの割合、または「早期警戒シグナル」と呼ばれた1点の相関 — は、verified ではなくfragileです。統計量に問題はありませんが、そこから導かれた結論に問題があります。
-
草稿を改訂します。
<report>を更新します。- verified → 主張を維持し、合格したロバスト性チェックを記します。
- fragile → データが裏付ける範囲に合わせて、主張に留保を付ける、範囲を限定する、または重みを下げる(例:「記述的には高いものの、層内の比較では逆転しており、処置が回復を引き起こす証拠ではありません」)か、撤回します。脆弱な主張を最初に書かれたまま残してはいけません。
- refuted → 正しい数値に修正するか、削除します。 判定と根拠を記録します。
-
記録 — 台帳に1行追加して続けます。その主張は未検証の集合から外れます。
台帳
<sandbox_root>/ledger.tsv はタブ区切りとし、テキスト内にカンマを使わないでください。ヘッダー:
iter claim verdict threat resolution
verdict は {extract, verified, fragile, refuted} のいずれかです。例:
iter claim verdict threat resolution
0 claims extracted extract - 7 claims listed
1 treatment recovery rate > control (70.6 vs 55.0) verified reproduced; holds kept
2 treatment causes higher recovery (+16pp) fragile Simpson: control >= treatment within both age groups rescoped to descriptive; causal claim retracted
3 biomarker correlates with recovery_days (r=0.16) fragile one outlier drives it (r=0.16 -> 0.02 without it) retracted
5 pilot site 100% recovery (superior) fragile n=5 subgroup hedged: too small to conclude
結果を報告します。<report> のパス、主張ごとの判定、要約(検証済み、留保付き、または撤回した主張の数と、最も重要な脆弱性を1つ)を示してください。
制約
- 再現とストレステストの両方を行います。 再現しただけの主張は検証済みではありません。その主張を覆す可能性が最も高い脅威にも耐える必要があります。ストレステストを省略することを防ぐために、このループがあります。
- すべての判定は、
<report>に記録された再実行によって裏付けます。 直感だけで主張を容認したり、否定したりしてはいけません。 - 脆弱な主張は必ず変更し、そのまま残してはいけません。 データが裏付ける範囲まで表現を弱めるか、撤回してください。最初の表現のまま残すことこそ、未検証の草稿がそのまま公開された原因です。
- 記述と因果関係を区別します。 「治療群のほうが回復した」は真でも、「治療によって回復する」は交絡因子によって否定されることがあります。データが裏付ける内容を正確に述べてください。
<dataset>だけを読み取ります。 すべての主張を照合するための真実の基準であるため、決して変更してはいけません。サンドボックスは自己完結型です(../による外部へのアクセスはできません)。- 判定の帰属先を明確にするため、1回の反復で扱う主張は1つだけにします。
- 続行するかどうかを尋ねるためにループを中断してはいけません。すべての主張が解決するまで、または
<budget>に達するまで実行します。
停止条件
- 解決済み — 未検証の主張、または未解決で脆弱な主張が残っていません。
- 予算 —
<budget>回の反復に到達しました。