このノートは「Claude Code で自律的な開発ループを設計する」ための合成メモ。 各節末に出典を示す。引用元の全文はリンク先で読むこと(ここには再録しない)。 本文は会話から再構成した私的な解説であり、引用元の文章の複製ではない。
ある機能要求を、計画詰め → 仕様 → タスク分解 → 並列実装 → 検証 → マージ まで流す1本のパイプライン。
/grill-with-docs ○○したい
→ Q/A …(反復)… → PRD → ISSUES
→ (issue ごとに) Worktree #1..#n(並列)
→ テストレビュー(実装前に人間が確認)
→ /goal ループ(完了条件まで自走)
→ PR
→ 人間がチェックして承認・マージ
| 段階 | 使う部品 | 種別 |
|---|---|---|
/grill-with-docs | グリルセッションで計画を既存ドメインモデル(用語集・ADR)と突き合わせ、CONTEXT.md を更新(mattpocock/skills) | 既存スキル |
Q/A → PRD | to-prd:会話を PRD 化。グリル済みならユーザーストーリーへ直行 | 既存スキル |
PRD → ISSUES | to-issues:PRD を独立着手可能な issue へ縦割り分解 | 既存スキル |
Worktree #1..n 並列 | /batch(隔離 worktree に並列エージェント展開)または手動 git worktree | 公式/手動 |
| テストレビュー | ★自作(§4) | 自作 |
/goal ループ | 公式組込み(v2.1.139+)。完了条件を満たすまで自走し、各ターン後に別の軽量モデルが達成を判定する | 公式 |
PR | ★自作 open-pr または素の gh | 自作 |
| 承認・マージ | 人手 + 組込み /review | 人手/公式 |
要点:上半分(grill → PRD → issues)は既に公開スキルとして存在する。再発明せず install してよい。
mattpocock/skills、Claude Code /goal(後掲リンク)
トリガー→実施→判定の二重ループは、より大きな4層スタックの一部にすぎない(LangChain / Sydney Runkle の整理)。
/goal の「別モデルが完了判定」がこれに当たる。含意:よくある図は L1〜L3 で閉じており、L4 が抜けている。L4 を足さないとループは「回るが賢くならない」。価値が複利で効くのは L3・L4。設計に trace ログ + 定期的な改善パスを1本足すべき。
Sydney Runkle, "The Art of Loop Engineering"(LangChain)
「ラップトップを閉じて回す」は /loop を端末で走らせることではない。ループは記憶・検証・境界を持つ反復プロセスで、スケジュール・状態永続化・並列隔離・実ツール接続の「住む場所」が要る。
/loop・スキル・サブエージェント・worktree・MCP を一箇所で提供。多くの場合これで十分。cron の2種(盗む価値あり):
STATE.md に追記」Cobus Greyling, "Loop Engineering Playbook"
ループに必要なのは5つの部品+状態を覚える1か所。
| 部品 | ループでの役割 | Claude Code の具体 | 自作? |
|---|---|---|---|
| オートメーション | 発見・トリアージの心拍 | スケジュール/cron、/loop、/goal、hooks、GitHub Actions | 新規 |
| Worktree | 並列の隔離 | git worktree、--worktree、サブエージェントの isolation: worktree | §4③ |
| スキル | プロジェクト知識の固定化 | .claude/skills/<name>/SKILL.md | 既存+§4 |
| プラグイン/コネクタ | 実ツール接続 | MCP サーバ + プラグイン | §4⑤ |
| サブエージェント | 作る役と検査役の分離 | .claude/agents/、agent teams | §4③ |
| 状態/メモリ | 何が済んで何が次か | ディスク上の markdown(AGENTS.md/進捗ファイル)or MCP 経由 Linear | §4⑥ |
モデルは実行間で全部忘れる。だからメモリはコンテキストではなくディスクに置く。エージェントは忘れるがリポジトリは忘れない。
Addy Osmani, "Loop Engineering"
.claude/ 構成#issue から「自然言語のテスト仕様 + 失敗するテスト(red)」だけを書き、実装せず停止して人間レビューを待つ。図の「実装前にテストをレビュー」の本体。
---
name: test-review
description: issueから失敗テストとテスト仕様を書き、実装せず停止して人間承認を待つ
invocation: user
allowed-tools: Read, Grep, Glob, Write, Bash(npm test:*)
disable-model-invocation: true
---
1. 対象issueと CONTEXT.md / ADR を読む
2. 受け入れ条件を TEST_PLAN.md(自然言語テストケース一覧)に落とす
3. 実装は一切せず failing test だけを書き、red を確認する
4. ここで必ず停止。「TEST_PLAN.md を人間が承認したら /goal を起動」と明示して終了
/goal ループ中、エージェントは「テストを弱めて pass させる」方向へ逃げる。テストファイルへの Edit/Write を PreToolUse フックで拒否し、レビュー済みテストの不変性を強制する。これが無いと「テストが green」は自己採点になる。
// settings.json(実装フェーズのみ有効化)
"hooks": { "PreToolUse": [{
"matcher": "Edit|Write",
"hooks": [{ "type": "command",
"command": "case \"$CLAUDE_TOOL_FILE\" in *.test.*|*_test.*) exit 2;; esac" }]
}]}
.claude/agents/ に役割を分離。verifier は編集権限なし・別モデルで、テスト/スペック照合だけを行う。無人で回るからこそ、信頼できる検証役だけが「歩いて立ち去れる」唯一の根拠になる。
to-issues の出力を読み、衝突しない issue 群に worktree + ブランチを作って test-review → 人間承認 → /goal → open-pr を回す。「衝突しない範囲」は自動判定しきれないので、issue が触るファイル/モジュールの重複チェックを挟むか、共有モジュールを触る issue は直列化する。
push → gh pr create → issue 紐付け。push と PR 作成は不可逆の公開操作なので実行前に必ず停止して確認(自動 push しない)。最終 diff は /review で。
worktree の外に1つ置き、「試したこと/通ったこと/未着手」を記録。毎サイクルここから再開する。これが無いと外側ループは毎回ゼロから再発見して破綻する。
各実行の trace を残し、定期的に分析パスを走らせてスキル本文・プロンプト・採点基準を直す。これが §1 の L4。
Cobus Greyling(コスト/安全デフォルト)、MindStudio(ループの破綻モードと対策)
/goal の判定が真偽を出せるのは機械的条件のみ(tests green && lint clean && build exit 0)。「正しい」「きれい」は判定不能。同じループを2人が組んでも、深く理解している作業を速める人と、理解を避けるために使う人で正反対の結果になる。ループはその違いを知らないが、あなたは知っている。
Addy Osmani(comprehension debt / cognitive surrender)
配色は共通:teal = ループ/自動、amber = 人間/ゲート/警告。角丸の矩形ノード、細い罫線、日本語フォント。
/grill-with-docs → Q/A…→PRD→ISSUES → 横に並ぶ Worktree #1..#n → 各列 テストレビュー(amber) → /goal(teal・循環アイコン) → PR → 最下段に幅いっぱいの 人間が承認・マージ(amber)。テストレビューと最終マージを amber で強調。
/goal ループを teal で強調。中心から外へ L1 エージェント → L2 検証 → L3 オーケストレーション → L4 ヒルクライミング。各層に役割ラベル。L4 から内側へ伸びる「harness を直接書き換える」戻り矢印を1本描く。L1〜L2 を teal、L4 を amber 寄りに。
Tier A 端末 / Tier B プラットフォーム / Tier C エディタ を3カラム。Tier B に「sandbox 隔離・durable execution・cron」を、下部に stateful cron(≈STATE.md 追記)と stateless cron(≈読んで終了)の対比を添える。