TL;DR
- 複数の Kaggle コンペを Claude Code(AnthropicのAIエージェントCLI)と共同で 同じ流儀で回すための運用テンプレートを作って公開しました。
- キモは
CLAUDE.md=AIエージェントへの常時有効な指示書。フォルダ構成・提出手順・鍵管理・知識の残し方を標準化し、AIが毎回それに従って作業します。 - 実際に ジャンルの全く違う2コンペ(LLMセキュリティ系と Pokémon TCG 戦略系)に適用して横展開できることを確認。その過程で見つかった設計上の穴も直しました。
- リポジトリ: https://github.com/togakyo/claude-code-kaggle-template
なぜ作ったか
Claude Code のようなAIエージェントとコンペを進めると、生産性は上がる一方で毎回こういう問題にぶつかります。
- コンペごとに我流のフォルダ構成になり、数週間後の自分(とAI)が迷子になる
-
attack_v1.py … attack_v57.pyのようにルート直下がバージョン別ファイルで散らかる - APIキーや
kaggle.jsonを うっかりコミットしそうになる - 「前回何が効いて何がダメだったか」がAIのセッションをまたいで消える
- 提出手順(kernel push → submit)を毎回思い出す
これらを 1コンペ1フォルダの最小構成+AIへの指示書 に落とし込んで標準化したのがこのテンプレです。
設計の中心:CLAUDE.md は README ではなく「AIへの指示書」
Claude Code は 作業ディレクトリの親をさかのぼって CLAUDE.md を自動で読み込む 仕様があります。
これを利用して、リポジトリのルートに運用標準を置くと、どのコンペフォルダで作業していてもAIが常にそのルールに従います。
<リポジトリのルート>/
├── CLAUDE.md ← 全コンペ共通の運用標準(AIが自動で読む)
├── _template/ ← コンペ雛形(コピー元)
├── _example_competition/ ← 中身を埋めた見本(Titanic 想定)
├── bin/new-comp.sh ← 雛形からコンペ生成
├── bin/setup.sh ← pre-commitフック有効化
├── githooks/pre-commit ← 鍵・.env の誤コミットをブロック
└── NNN_競技名/ ← 各コンペ(下記の最小構成)
各コンペは必ずこの形にします。
NNN_競技名/
├── CLAUDE.md ← このコンペ固有の事実(AIの現状把握の入口)
├── comp.env ← slug/提出方式などの設定(Makefileが読む)
├── Makefile ← 提出・データ取得・LBの標準コマンド
├── src/ ← 現行の解法コード
├── experiments/ ← 実験版(版管理はgit履歴+ここ)
├── notebooks/ ← 提出ノートブック
├── report_record/ ← 知識ベース(*.md が知識の実体)
├── reference/ ← 他参加者ノートの要約
├── data/ ← コンペデータ(gitで除外)
└── outputs/ ← 実行成果物(gitで除外)
ポイントは 知識の実体をAIのメモリに溜めず report_record/*.md に一元化する こと。
セッションが変わっても report_record/knowledge_base.md を読めば文脈が復元でき、AIが毎回ゼロから始めずに済みます。
鍵・トークン管理は3層ガード
コンペ運用で一番怖いのがキーの漏洩です。3層で防ぎます。
-
.gitignore….env/kaggle.json/data//outputs// 他人のreference/*.ipynbを除外 -
githooks/pre-commit… ステージした差分に鍵らしき文字列や.envがあればコミットを止める -
make check-secrets… 手動チェック
Kaggle認証(~/.kaggle/kaggle.json)はHOMEに置きリポジトリには一切入れない。
APIキーは各コンペの .env(git除外)に置き、コミットするのは .env.example(プレースホルダ)だけ。
pre-commitフックは実際にこう動きます。
$ git commit -m "..."
✗ 鍵らしき文字列が差分に含まれます(コミット不可):
2:+key = "sk-ant-api03-ABCDEF..."
→ 修正してから再コミットしてください。
フック有効化のコマンド打ち忘れ対策として、bin/setup.sh(clone後に一度実行) に加え、
bin/new-comp.sh 実行時の自動設定 と CLAUDE.md の「コミット前に必ず有効か確認する」ルール で3重に担保しています。
提出方式はコンペで違う → SUBMIT_KIND で吸収
comp.env に数行書くだけで提出コマンドが全コンペ共通になります。
COMP = titanic
SUBMIT_KIND = csv-kernel # csv-kernel | file | writeup
KERNEL = you/titanic-submission
OUTFILE = submission.csv
make data # データ取得(git除外先へ)
make push && make status # kernelを実行しCOMPLETE待ち
make submit MSG="rf v3" # SUBMIT_KIND に応じて提出方法を切替
SUBMIT_KIND が提出方式を吸収するのがミソで、make submit が
-
csv-kernel… kernel をpushしてその出力CSVを提出 -
file… 手元のsubmission.tar.gzを直接提出(エージェント系) -
writeup… Kaggle Writeup(Web UI提出。手順を表示)
を自動で振り分けます。この設計は次の「横展テスト」で必要になって生まれました。
横展開テスト:ジャンルの違う2コンペで検証
テンプレは「他のコンペでも本当に使えるか」を確かめないと意味がありません。
そこで LLMセキュリティ系コンペ と Pokémon TCG AI Battle(Strategy) という、性質の全く違う2つに適用しました。
その過程で3つの穴が見つかり、修正できました。
-
提出方式が固定だった … 最初はCSV提出前提でしたが、Pokémon Strategyは Kaggle Writeup審査(数値LB無し)、姉妹のSimulationは tar.gzのエージェント束。→
SUBMIT_KINDで一般化。 -
.gitignoreがネストを取りこぼした …reference/**/*.ipynbはリポジトリ直下しか効かず、NNN_*/reference/の他人ノートが追跡対象に。→**/reference/**/*.ipynbに修正。 -
フックが
.env.exampleを誤検知 … プレースホルダのsk-ant-...を本物の鍵と誤判定。→*.exampleをスキャン除外。
「1つ目のコンペでは気づけなかったバグが2つ目で全部出た」 のが、横展開テストの一番の収穫でした。
実際に Pokémon コンペを回してみる
テンプレの改善ワークフロー(reference確認 → 調査 → report_record にまとめ → 実装)に沿って、
配布されたカードデータ(EN_Card_Data.csv)で一次EDAをやってみます。
bin/new-comp.sh 001 pokemon-tcg-battle pokemon-tcg-ai-battle-challenge-strategy
cd 001_pokemon-tcg-battle
make data
python3 experiments/eda_card_data.py # outputs/eda_summary.md を生成
(eda_card_data.py はこのコンペ用に書いたスクリプトで、テンプレ本体には含まれません。)
数分で、戦略に効きそうな事実がこれだけ出ました(1,267枚 / 19拡張)。
- 区分は ポケモン1,056 / トレーナーズ191 / エネルギー20、特殊ルールは Pokémon ex 121 / Mega ex 30 / ACE SPEC 29 → ex中心の環境
- HPは中央値100・最大380(Mega ex)、新セットほど平均HPが高い → パワークリープ
- 弱点は {R}(炎) が220枚で最多
- ワザ効率の外れ値に 1エネで250〜280打点(Cinderace ex / Camerupt ex など)
ここから 「炎アグロ(1エネ大打点で炎弱点を突く)」 という第一仮説が立ちます。
この過程・数字・次アクションは report_record/phase1_card_data_eda.md に残り、次のセッションのAIがそこから続けられます。
テンプレの狙い(AIが文脈を失わずコンペを進める)が実際に機能したわけです。
まとめ
-
CLAUDE.mdを AIへの指示書 として使い、フォルダ・提出・鍵・知識管理を標準化すると、Claude Code とのコンペ運用が安定します。 - 横展開テストは必須。2つ目のコンペで初めて設計の穴が出ます。
- 鍵管理は面倒でも 仕組みで(3層で) 守るのが結局ラク。
テンプレはこちらです。指摘・改善歓迎です → https://github.com/togakyo/claude-code-kaggle-template
この記事とテンプレ自体、Claude Code と共同で作成・検証しました。