Claude Codeでループエンジニアリングを試した|AIが自分で直して完成まで回す仕組みを、できるだけかみ砕いて
ループエンジニアリングという言葉、最近ちらほら見かけるようになった。名前はいかついけど、自分で試してみたら拍子抜けするくらい単純だった。後輩に「これ要するにこういうことだよ」と説明するつもりで、セットアップのメモを残しておく。
先に言っておくと、新しいツールのインストールは要らない。Claude Code に最初から付いている機能だけで組める。
書く人と採点する人を分ける
夏休みの宿題を思い出してほしい。
自分で書いて自分で見直すと、ミスを見落とす。自分の答えって、どうしても合ってる気がしてくるから。ところが、書く人(自分)と採点する人(先生)を分けると話が変わる。先生が「ここ間違ってるよ、こう直して」と赤を入れてくれる。直して、また出す。先生がOKを出すまで繰り返す。
ループエンジニアリングはこれだけ。本当にこれだけ。
宿題でいうとAIでいうとやること自分本線エージェント実装する先生検証サブエージェントチェックする100点完了条件合格ラインを決める出す→赤→直すループ合格まで繰り返す
ミソは、書く人と採点する人を別の役にすること。同じAIが書いて同じAIが採点すると、やっぱり甘くなる。自分のコードはかわいいので。別のサブエージェントに「お前のここがダメ」と言わせると、ミスがちゃんと出てくる。
全体の流れ
文字だけだとイメージしづらいので、図にするとこうなる。

赤を入れる、直す、また出す、また赤。これを人間が横についてなくても回す、というのが売りだ。深夜に放っておいたら朝には終わってた、みたいなことが起きる。たまに変な方向に走ってることもあるけど。
Claude Codeで使う3つの部品
組むのに使うのは次の3つ。どれも追加インストールなしで使える。
ひとつ目がサブエージェント。.claude/agents/ にマークダウンを置くだけで、専門の別人格AIを作れる。本線とは別の頭(別のコンテキスト)で動くから、忖度なしで採点してくれる。ここが肝。
ふたつ目が CLAUDE.md。プロジェクトのルートに置く指示書で、「実装したら必ず検証担当を呼べ。合格するまで終わるな」と書いておく場所だ。
みっつ目がフック。.claude/settings.json に設定する仕組みで、AIが「終わります」と言った瞬間に自動でテストを走らせて、落ちてたら「まだ終わるな」と差し戻せる。これが強制ループの正体。
ざっくり、CLAUDE.md だけならソフトループ(AIのお願いベース。手軽だけどサボることもある)。フックまで足すとハードループ(番人が物理的に終わらせない)。最初はソフトループで十分だと思う。
実装手順
Step 0|ゴールを1行で決める
ここが一番大事で、一番サボられがちなところ。何ができたら合格かが曖昧だと、ループは永遠に終わらない。
良い完了条件は、機械が勝手に判定できるもの。「npm test が全部通る」「ビルドがエラー0」「lintの警告0」あたり。逆に「いい感じにする」「きれいなコードにする」は最悪で、採点できないからAIが延々と直し続ける。財布が燃える。
Step 1|検証サブエージェント(採点する人)を作る
.claude/agents/verifier.md を作る。
---
name: verifier
description: 本線の実装結果を完了条件と照らし合わせて検証し、合否と具体的な修正指示を返す
tools: Read, Grep, Glob, Bash
model: sonnet
---
あなたは厳格なQA検証担当です。実装は一切しません。チェックに徹します。
手順:
1. テストを実行する(例: `npm test`)
2. 変更されたコードを読み、完了条件を満たしているか確認する
3. 下のフォーマットで**だけ**回答する
出力フォーマット:
---
判定: PASS または FAIL
理由: (なぜそう判定したか)
修正指示:(FAILのときだけ。ファイル名・行・何をどう直すかを具体的に箇条書き)
---
甘い採点は禁止。少しでも条件を満たさなければ FAIL にすること。tools: に Bash を入れているのは、検証担当が自分でテストを走らせられるようにするため。model: は速くて安い sonnet で足りることが多い。検証くらいなら、わざわざ高いモデルを使わなくていい。
Step 2|本線へのルール(CLAUDE.md)を書く
プロジェクトのルートに CLAUDE.md を作る。
# 開発ルール(ループエンジニアリング)
実装タスクでは、必ず次のループを回すこと:
1. 実装する
2. `verifier` サブエージェントを呼んで検証してもらう
3. 判定が FAIL なら、修正指示どおりに直して 2 に戻る
4. 判定が PASS になったら完了
注意:
- 自分で「たぶん合ってる」と判断して終わらないこと。必ず verifier の PASS を得ること。
- 同じ修正を3回繰り返しても直らない場合は、ループを止めて人間に状況を報告すること。ここまででソフトループは完成。あとは普通にタスクを頼むだけで、本線が自分から検証担当を呼んで回してくれる。
Step 3|(本気の人向け)番人で強制ループにする
AIがサボって途中で終わるのが心配なら、フックで関所を作る。正直、慣れるまではここまでやらなくていいと思う。
まず差し戻し用のスクリプト .claude/check.sh を作る。
#!/usr/bin/env bash
# テストが通らなければ exit 2 で「まだ終わるな」と差し戻す
if ! npm test --silent; then
echo "テストが失敗しています。原因を直してから完了してください。" >&2
exit 2
fi
exit 0次に .claude/settings.json に登録する。
{
"hooks": {
"Stop": [
{
"hooks": [
{ "type": "command", "command": "bash .claude/check.sh" }
]
}
]
}
}これで、AIが終わろうとするたびに番人がテストを実行する。落ちていれば exit 2 で作業を続行させる。
ハマりどころがひとつあって、差し戻しは exit 2 じゃないと効かない。普通の失敗で返ってくる exit 1 だとスルーされる。自分はここで小一時間溶かした。
Step 4|暴走を防ぐ安全装置をつける
ループものの宿命が無限ループと課金爆発。保険は必ずかけておく。
回数の上限を決めておくこと。CLAUDE.md に「同じ修正を3回試してダメなら止めて報告」と書いておく(Step 2 に入れてある)。それと、完了条件を機械判定にすること。「いい感じ」みたいな主観条件にすると終われない。あとは、最初の数回は放置せず人間が横で見ること。これが結局いちばん効く。
Step 5|回す
あとはいつもどおり頼むだけ。
ログイン機能を実装して。完了条件は npm test が全部通ること。本線が実装して、verifier が採点して、直して、を合格まで自動で繰り返す。うまくハマると、ちょっと感動する。
時間で回す /loop
1回完成させて終わり、じゃなくて、5分おきに様子を見て直し続けるような時間ベースのループにしたいときは、Claude Code の /loop が使える。
/loop 5m /code-reviewこんな感じで、コマンドを一定間隔で繰り返せる。PRが来てないか見張る、テストが緑になるまで定期チェックする、みたいな見張り番タイプ向け。
Claude Code のループは結局3種類あって、用途で使い分ける。完成まで自己修正させたいならサブエージェント検証ループ(この記事のやつ)。条件を満たすまで絶対に終わらせたくないなら Stopフックの強制ループ。一定間隔で見張りたいなら /loop の時間ループ。
つまずいたところ
自分や周りがハマったやつを表にしておく。
失敗:原因:対策
ループが永遠に終わらない:完了条件が曖昧:機械が判定できる条件にする
検証が甘くてバグが残る:本線が自分で採点している:サブエージェントに分ける
同じ間違いを延々繰り返す:修正指示が抽象的:ファイル・行・直し方を具体的に出させる
番人で止まらない:exit 1 で返している:差し戻しは exit 2
気づいたら課金がすごい:回数制限なし:上限回数+最初は有人監視
まとめ
ループエンジニアリングは、名前ほど大したことはやってない。要するに、書く人と採点する人を分けて、合格するまで自動で繰り返すだけ。
Claude Code でやるなら、完了条件を機械判定の形で決めて、検証サブエージェント(.claude/agents/verifier.md)を作って、ルール(CLAUDE.md)を書く。本気なら番人(Stopフック)を足して、安全装置をつけてから回す。
おすすめは、いきなり放置せず、小さいタスクで人間が横で見ながら回してみること。赤ペン先生がAIになって、しかも疲れ知らずで何度でも直してくれるのは、まあまあ未来っぽくて悪くない。
