Design Note

Claude Code 自律開発ワークフロー × ループエンジニアリング 設計ノート

このノートは「Claude Code で自律的な開発ループを設計する」ための合成メモ。 各節末に出典を示す。引用元の全文はリンク先で読むこと(ここには再録しない)。 本文は会話から再構成した私的な解説であり、引用元の文章の複製ではない。

0.全体像 — 1 issue を回す「内側パイプライン」#

ある機能要求を、計画詰め → 仕様 → タスク分解 → 並列実装 → 検証 → マージ まで流す1本のパイプライン。

/grill-with-docs ○○したい
   → Q/A …(反復)… → PRD → ISSUES
        → (issue ごとに) Worktree #1..#n(並列)
              → テストレビュー(実装前に人間が確認)
              → /goal ループ(完了条件まで自走)
              → PR
   → 人間がチェックして承認・マージ
段階使う部品種別
/grill-with-docsグリルセッションで計画を既存ドメインモデル(用語集・ADR)と突き合わせ、CONTEXT.md を更新(mattpocock/skills)既存スキル
Q/A → PRDto-prd:会話を PRD 化。グリル済みならユーザーストーリーへ直行既存スキル
PRD → ISSUESto-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(後掲リンク)

1.ループは「二重」ではなく「四重」#

トリガー→実施→判定の二重ループは、より大きな4層スタックの一部にすぎない(LangChain / Sydney Runkle の整理)。

含意:よくある図は L1〜L3 で閉じており、L4 が抜けている。L4 を足さないとループは「回るが賢くならない」。価値が複利で効くのは L3・L4。設計に trace ログ + 定期的な改善パスを1本足すべき。

Sydney Runkle, "The Art of Loop Engineering"(LangChain)

2.ループはどこに住むか(3層)#

「ラップトップを閉じて回す」は /loop を端末で走らせることではない。ループは記憶・検証・境界を持つ反復プロセスで、スケジュール・状態永続化・並列隔離・実ツール接続の「住む場所」が要る。

cron の2種(盗む価値あり):

Cobus Greyling, "Loop Engineering Playbook"

3.部品マッピング(Addy Osmani の「5+1」)#

ループに必要なのは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"

4.自作すべき .claude/ 構成#

① test-review スキル(ゲート)

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 を起動」と明示して終了

② freeze-tests フック(最重要)

/goal ループ中、エージェントは「テストを弱めて pass させる」方向へ逃げる。テストファイルへの Edit/WritePreToolUse フックで拒否し、レビュー済みテストの不変性を強制する。これが無いと「テストが green」は自己採点になる。

// settings.json(実装フェーズのみ有効化)
"hooks": { "PreToolUse": [{
  "matcher": "Edit|Write",
  "hooks": [{ "type": "command",
    "command": "case \"$CLAUDE_TOOL_FILE\" in *.test.*|*_test.*) exit 2;; esac" }]
}]}

③ implementer / verifier サブエージェント

.claude/agents/ に役割を分離。verifier編集権限なし・別モデルで、テスト/スペック照合だけを行う。無人で回るからこそ、信頼できる検証役だけが「歩いて立ち去れる」唯一の根拠になる。

④ orchestrator(issue → worktree ファンアウト)

to-issues の出力を読み、衝突しない issue 群に worktree + ブランチを作って test-review → 人間承認 → /goal → open-pr を回す。「衝突しない範囲」は自動判定しきれないので、issue が触るファイル/モジュールの重複チェックを挟むか、共有モジュールを触る issue は直列化する。

⑤ open-pr スキル

push → gh pr create → issue 紐付け。push と PR 作成は不可逆の公開操作なので実行前に必ず停止して確認(自動 push しない)。最終 diff は /review で。

⑥ STATE.md(ループの背骨)

worktree の外に1つ置き、「試したこと/通ったこと/未着手」を記録。毎サイクルここから再開する。これが無いと外側ループは毎回ゼロから再発見して破綻する。

⑦ trace ログ + L4 改善パス

各実行の trace を残し、定期的に分析パスを走らせてスキル本文・プロンプト・採点基準を直す。これが §1 の L4。

5.コスト/安全のデフォルト値#

Cobus Greyling(コスト/安全デフォルト)、MindStudio(ループの破綻モードと対策)

6.容赦ない注意点#

  1. 「auto 承認なし」と人間ゲートは矛盾する。 完全自動+自作テスト+人間ゲート無しは自己採点ループになる。解は「実装の各ターンの承認だけ省き、テスト仕様の確定とマージは人間に残す」。加えて (a) テスト凍結 (b) 編集権限のない verifier (c) マージは人間、の3点を外さない。
  2. /goal の判定が真偽を出せるのは機械的条件のみtests green && lint clean && build exit 0)。「正しい」「きれい」は判定不能。
  3. 「数百〜数千エージェント」は理論値。 worktree は機械的衝突を消すが、上限はツールではなくあなたのレビュー帯域とコスト。
  4. 理解の腐敗。 ループが速くコードを吐くほど、存在するものと自分が把握しているものの差(comprehension debt)が速く広がる。"done" は主張であって証明ではなく、検証は人間に残る。
  5. 弱いテスト基盤では全体が空回りする。 信頼できるテスト/型/ビルドが前提。greenfield では先に基盤整備が要る。

同じループを2人が組んでも、深く理解している作業を速める人と、理解を避けるために使う人で正反対の結果になる。ループはその違いを知らないが、あなたは知っている。

Addy Osmani(comprehension debt / cognitive surrender)

7.図(HTML 化時に SVG で描く 3 枚)#

配色は共通:teal = ループ/自動amber = 人間/ゲート/警告。角丸の矩形ノード、細い罫線、日本語フォント。

図A:内側パイプライン(縦フロー)

/grill-with-docsQ/A…→PRD→ISSUES → 横に並ぶ Worktree #1..#n → 各列 テストレビュー(amber)/goal(teal・循環アイコン)PR → 最下段に幅いっぱいの 人間が承認・マージ(amber)。テストレビューと最終マージを amber で強調。

図A:内側パイプライン grill-with-docs から PRD・ISSUES を経て3本の worktree に分岐し、各列でテストレビュー(amber)→ /goal(teal)→ PR、最後に人間が承認・マージ(amber)で合流する縦フロー。 /grill-with-docs ○○したい Q/A → PRD → ISSUES Worktree #1 Worktree #2 Worktree #n テストレビュー (実装前に人間承認) テストレビュー (実装前に人間承認) テストレビュー (実装前に人間承認) /goal 完了条件まで自走 /goal 完了条件まで自走 /goal 完了条件まで自走 PR PR PR 人間が承認・マージ 最終 diff を /review で確認 teal = ループ / 自動 amber = 人間 / ゲート / 警告
図A:内側パイプライン。テストレビューと最終マージを amber、/goal ループを teal で強調。

図B:4重ループ(同心の入れ子)

中心から外へ L1 エージェント → L2 検証 → L3 オーケストレーション → L4 ヒルクライミング。各層に役割ラベル。L4 から内側へ伸びる「harness を直接書き換える」戻り矢印を1本描く。L1〜L2 を teal、L4 を amber 寄りに。

図B:4重ループ L1 から L4 まで4層の同心円。L4 から内側 L1 へ戻る、harness を書き換える矢印が1本ある。 L1 エージェント ループ L2 検証ループ rubric / judge / 機械チェック L3 オーケストレーション cron / webhook / 配分 L4 ヒルクライミング trace 分析 → harness 書き換え — 完了条件まで内側で回る — harness を直接書き換える L1/L2 (teal) L4 (amber) — 戻り矢印は L1 内側を更新
図B:L1(中心)から L4(最外周)への同心入れ子。L4 から L1 への戻り矢印が harness 自体の書き換えを表す。

図C:3層ランタイム

Tier A 端末 / Tier B プラットフォーム / Tier C エディタ を3カラム。Tier B に「sandbox 隔離・durable execution・cron」を、下部に stateful cron(≈STATE.md 追記)と stateless cron(≈読んで終了)の対比を添える。

図C:3層ランタイム Tier A 端末ハーネス、Tier B プラットフォームランタイム、Tier C エディタ/軽量 の3カラム。下部に stateful cron と stateless cron の対比。 Tier A 端末ハーネス 個人 / 小チーム ・Claude Code 1か所 ・/loop ・スキル ・サブエージェント ・worktree ・MCP 多くの場合これで十分 Tier B プラットフォーム 本番 / マルチテナント ・sandbox 隔離 (microVM) ・durable execution ・エージェントサーバ cron ・人間介入で一時停止/再開 ・数日の承認待ちに耐える GitHub Actions / LangSmith Tier C エディタ / 軽量 既存環境の延長 ・エディタ統合 ・cron / webhook のみ ・full エージェント基盤なし 軽い自動化に stateful cron 毎回同じ thread で「昨日」を覚える 夜間リサーチ / 履歴付き監視 ≈ STATE.md に追記 stateless cron 毎回新規 thread バッチトリアージ / 一回限りの掃引 ≈ リポジトリを読んで終了
図C:3層ランタイム。Tier B が本番運用に必要な耐久性・隔離・スケジューリングを担う。

8.出典(原文はここで読む)#

↑ 先頭に戻る