見出し画像

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になって、しかも疲れ知らずで何度でも直してくれるのは、まあまあ未来っぽくて悪くない。


いいなと思ったら応援しよう!