ループエンジニアリングの仕組みと構成
はじめに
こんにちは、株式会社メンバーズ デブオプスリードカンパニー所属の谷森です。
今回はループエンジニアリングをどのようにプロジェクトに取り入れるのかをまとめました。
きっかけは社内で AI 駆動開発ハッカソンを実施していた際に、上司から「ループエンジニアリングを取り入れられないか」と声をかけられたことです。
私自身も「1人ユニコーン」などに強い関心があり、AI だけでどこまで開発を進められるのかを検証したいと思い取り組んでみました。
※1人ユニコーン:AI を活用して1人で評価額10億ドル規模の企業をつくるという考え方
AI に実装を任せてもテスト結果を確認して直してもらう往復はまだ人間が担っており、この往復まで AI に任せられれば人間は判断が必要な場面だけに集中できるはずです。
本記事は Anthropic の AI コーディングツール Claude Code を使う前提で説明します。
ループエンジニアリングとは
ループエンジニアリングとは AI に「実装→検証→修正」を完了条件を満たすまで繰り返させる手法で、完了条件・役割分担・状態の記録・止め方をファイルと設定で表すことが導入には必要となります。
テスト自動化との違い
テスト自動化は「コードが正しいか」を判定する仕組みですが、ループエンジニアリングはその判定結果を AI に返して正しくなるまで直させ続ける仕組みです。
ループは判定なしには成立しないため、ループの品質の上限はテストの品質で決まります。
全体像
ループエンジニアリングでは役割の異なる3つの AI を使用します。
- 司令塔役
- 普段話している Claude Code のメインセッションのことで、ゴールをタスクに分解して実装役・検証役に振り分け結果確認後に完了かを判断します。
- 実装役
- 司令塔役から割り振られたタスクのコードを実装して検証役から指摘があれば修正します。
- 検証役
- あらかじめ用意した合格条件をもとにテストを実行して合否と理由を返します。
実装役と検証役は Claude Code のサブエージェント(役割を与えてメインの会話から呼び出す別の AI)として定義します。
司令塔役・実装役・検証役の各エージェントは直接会話はしません。
司令塔役が実装役と検証役を順番に呼び出して結果を状態ファイルに記録して次の周に引き継ぎます。
検証役は実装役の説明を見られないため、コードと実行結果だけで公平に判断できます。
必要なファイル
CLAUDE.md と .claude/ 配下は Claude Code が読み込む場所が決まっているファイルです。
test.sh・ops/agent-state.md・loop-gate.sh は今回自分たちで決めたもので名前や置き場所は自由です。
ファイル | 役割 |
|---|---|
CLAUDE.md | Claude Code が毎回読み込む説明書でビルドやテストのコマンド・設計ルール・ループの進め方を記載する |
test.sh | 完了条件を判定するスクリプトで終了コードが 0 なら合格などで判断する エージェントには編集させない |
.claude/agents/implementer.md | 実装役の定義として使えるツールと作業ルールを記載する |
.claude/agents/verifier.md | 検証役の定義として差分と実行結果だけで PASS/FAIL を返すよう記載する |
.claude/skills/execution-plan/SKILL.md | 司令塔が1周で行う手順を記載する |
.claude/settings.json | Stop フックの登録を記載する |
.claude/hooks/loop-gate.sh | Stop フックで実行するスクリプトで test.sh の結果を見て作業を続けさせるか判定する |
ops/agent-state.md | 状態ファイルで現在の周回数・タスクの状態・検証役の指摘・人間に判断してほしい事項を記載する |
test.sh にはテストだけでなく既存の設計ルールを grep で検査する処理も入れるとドキュメントの約束を機械的に守らせられます。
設定のポイント
役割はツール権限で縛る
プロンプトで「編集しないで」と書くよりツールを渡さない方が確実です。
検証役が自分で直すと検証の独立性が失われます。
.claude/agents/verifier.md の冒頭で検証役が使えるツールを読み取り系(Read・Grep・Glob)とコマンド実行(Bash)に絞ります。
---
name: verifier
description: 実装後の変更を検証する。コードは修正しない。
tools: Read, Grep, Glob, Bash
---ただし Bash からでもファイルは書き換えられるため、本文の指示にも「コードは修正しない」と明記しておきます。
Stop フックで続けさせ上限で止める
Stop フックは Claude が作業を終えて応答を返そうとしたときに自動で実行されるスクリプトです。
フックが終了コード 2 を返すと Claude は止まらずフックが出力したメッセージを受け取って作業を続けます。
この仕組みを使い loop-gate.sh では次のように判定します。
- 状態ファイルが status: running のときだけ test.sh を実行する
- status の書き方は自分たちで決めたルールです
- test.sh が失敗したら終了コード 2 を返して作業を続けさせる
- 暴走を防ぐため反復回数が上限を超えたら止める
.claude/settings.json にはこのスクリプトを Stop フックとして登録します。
{"hooks": {"Stop": [{"hooks": [{"type": "command",
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/loop-gate.sh"}]}]}}判定できないことは人間に返す
仕様の解釈が必要な問題はテストでは判定できません。
状態ファイルに「要判断」欄を設け、そこに書いたら status: blocked で止まるよう手順書に定めておきます。
導入の順番
- test.sh を作り既存のルールを機械チェックにする
- テストが足りなければ最初のループのゴールを「テストの整備」にする
- 最初の1〜2周は手動で回して検証役の指摘の質を確かめる
- 問題がなければ Stop フックで自動化する
テストを AI に書かせる場合は何もアサートしないテストや skip されたテストがないかを検証役のチェック項目に入れておきましょう。
おわりに
ループエンジニアリングと聞くと大がかりに見えますが中身はファイル数個と設定数個です。
いちばん手間がかかるのはエージェントの定義ではなく「何をもって完了とするか」を決めることです。
まずは test.sh を1本書くところから始めてみてください。
この記事が役に立ったと思ったら、
ぜひ「いいね」とシェアをお願いします!




