AIに自分でプロンプトを出させる「自走ループ」セットアップ

毎回ゼロからプロンプトを打つのをやめ、次に何をやるかをAI自身に決めさせて回す仕組みを、自分のClaude Codeに入れるためのページです。 下の「貼るだけ」プロンプトをClaude Codeに一度貼れば、Claude自身が必要なファイル一式(記憶・役割・ループ)を作り、最初の1周まで回します。 背景と考え方の解説は自走ループとはを参照してください。

先に、適用範囲をはっきりさせる

この仕組みが効くのは、コーディングのように結果を機械で検証できる作業です。 Anthropic の Claude Code 責任者が「自分はもうプロンプトを打たず、Claudeにプロンプトを出させるループを書く」と語ったのが元になっていますが、これは本人の開発ワークフローの話で、汎用チャットの話ではありません。

成立する条件は三つあります。

「3か月使ってる人の9割が損してる」式の煽りは無視してよいです。 合う作業に絞って入れるのが正解です。

そのままClaudeに貼るだけ(一括セットアップ)

次のプロンプトを丸ごとコピーし、対象プロジェクトで開いた Claude Code に一度貼り付けてください。 Claude が記憶ファイル・役割エージェント・ループ本体を作り、ゴールと検証コマンドを1問だけ確認したうえで、最初の1周を回します。 右上の「コピー」を押せば全文がクリップボードに入ります。

あなたはこのリポジトリに「自走ループ」を構築するセットアップ担当です。
次の4ファイルを作成し、最後に使い方を説明してください。各ファイルの中身は ━━━ で区切ってあります。

最初に私へ1問だけ確認してください(未回答なら例の値のまま進める):
・このループのゴールを1文で
・完了を機械で確かめる検証コマンド(テスト / ビルド / 起動確認)

━━━ ファイル1: CLAUDE.md(プロジェクト直下)━━━
# プロジェクトの前提

## 何を作っているか
(1〜2行。例:FastAPIの社内APIサーバー)

## 守ること
- 既存のコードスタイルに合わせる。勝手なリファクタはしない
- 変更は最小限。関係ないファイルに触れない
- 破壊的操作(削除・DROP・force push)は禁止

## 検証コマンド(ループの合否判定に使う)
- テスト: 例) pytest -q
- 起動確認: 例) uvicorn app.main:app --port 8999 & の後に curl -sf localhost:8999/health

## 触ってはいけない場所
- app/secrets/ 、.env 、本番設定

━━━ ファイル2: .claude/agents/planner.md ━━━
---
name: planner
description: ゴールに対して次にやる小さな独立タスクを決める係
tools: ["Read", "Grep", "Glob", "Bash(git log:*)", "Bash(git diff:*)", "Bash(ls:*)"]
model: opus
---
あなたはプランナーです。コードは書きません。
リポジトリの現状を調べ、ゴールに対して「次に着手すべき、互いに独立した小さなタスク」を最大3件選びます。
各タスクには、完了を機械で確かめる検証コマンドを必ず付けます。
すでにゴールが満たされているなら done を true にします。

━━━ ファイル3: .claude/agents/worker.md ━━━
---
name: worker
description: 1つのタスクを実装し、自分で検証してから終える係
tools: ["Read", "Edit", "Write", "Bash"]
model: sonnet
---
あなたは実装者です。渡された1タスクだけを実装します。
実装後、指定された検証コマンドを必ず実行し、失敗したら直してから終わります。
スコープ外のファイルには触りません。検証が通らないまま完了と言いません。

━━━ ファイル4: loop.sh(リポジトリ直下)━━━
#!/usr/bin/env bash
set -euo pipefail
GOAL="${1:?usage: loop.sh \"<ゴールを1文で>\"}"
MAX_ITERS="${MAX_ITERS:-8}"
BUDGET="${BUDGET:-5}"
SCHEMA='{"type":"object","properties":{"done":{"type":"boolean"},"tasks":{"type":"array","items":{"type":"object","properties":{"title":{"type":"string"},"prompt":{"type":"string"},"verify":{"type":"string"}},"required":["title","prompt","verify"]}}},"required":["done","tasks"]}'
for ((i=1; i<=MAX_ITERS; i++)); do
  echo "---- iteration $i / $MAX_ITERS ----"
  envelope=$(claude -p "ゴール: $GOAL。現状を調べ、次に着手すべき独立タスクを最大3件JSONで出せ。全部終わっていれば done:true。" --agent planner --output-format json --json-schema "$SCHEMA" --max-budget-usd "$BUDGET")
  plan=$(echo "$envelope" | jq -r '.result')
  [ "$(echo "$plan" | jq -r '.done')" = "true" ] && { echo "完了"; break; }
  echo "$plan" | jq -c '.tasks[]' | while read -r t; do
    prompt=$(echo "$t" | jq -r '.prompt'); verify=$(echo "$t" | jq -r '.verify')
    echo "= $(echo "$t" | jq -r '.title')"
    claude -p "次のタスクを実装せよ: $prompt 。完了後、必ずこれを実行して確認し失敗なら直せ: $verify" --agent worker --permission-mode acceptEdits --max-budget-usd "$BUDGET"
  done
done

━━━ 最後に ━━━
作成した4ファイルを一覧で報告し、chmod +x loop.sh を実行してください。
そのうえで最初の1イテレーションだけを私の確認を取ってから回し、結果を見せてください。
いきなり全自動で回し続けないこと。コスト上限(--max-budget-usd)と反復上限(MAX_ITERS)は残したままにすること。

使うのはこの1回の貼り付けだけです。

この一括プロンプトは何をするか

貼り付けると、Claudeはこの文章を「指示+埋め込みファイル本体」として読み、対象プロジェクトに次の3種類を作ります。

作成後、Claudeはゴールと検証コマンドを1問だけ確認し、最初の1周だけをあなたの確認付きで回します。 いきなり全自動では走りません。 本文中の ━━━ はファイルの区切り記号で、Claudeへの指示の一部です。消さずにそのまま貼ってください。

動かすのに必要なもの

1周目のあと、回し続けるには

セットアップが済んだら、あとはあなたが回します。 ./loop.sh "ゴールを1文で" で起動します。 反復上限 MAX_ITERS とコスト上限 BUDGET(1呼び出しのUSD上限)で歯止めをかけられます(例:MAX_ITERS=3 BUDGET=2 ./loop.sh "...")。 止めたいときは Ctrl-C。コスト上限に達した場合も自動で止まります。

仕組みと内訳(手で組む・調整する人向け)

上の一括プロンプトが作る中身を、ファイルごとに説明します。 自分の用途に合わせて手で組みたい・改造したい人はここを読んでください。

手順1:記憶を固定する(CLAUDE.md)

プロジェクト直下に CLAUDE.md を置きます。 ここに書いた前提は毎セッション自動で読まれるので、ループの各エージェントが同じ常識を共有します。

# プロジェクトの前提

## 何を作っているか
(1〜2行。例:FastAPIの社内APIサーバー)

## 守ること
- 既存のコードスタイルに合わせる。勝手なリファクタはしない
- 変更は最小限。関係ないファイルに触れない
- 破壊的操作(削除・DROP・force push)は禁止

## 検証コマンド(重要:ループの合否判定に使う)
- テスト: `pytest -q`
- 型: `mypy app/`
- 起動確認: `uvicorn app.main:app --port 8999 &` の後 `curl -sf localhost:8999/health`

## 触ってはいけない場所
- `app/secrets/`、`.env`、本番設定

「検証コマンド」を具体的に書くのが肝心です。 ここが曖昧だと、AIは「できたつもり」で先に進みます。

手順2:役割を分ける(サブエージェント)

.claude/agents/ に役割ごとのファイルを置きます。 frontmatter の tools で各役に渡す権限を絞ります(plannerは読むだけ、workerだけ書ける)。

.claude/agents/planner.md

---
name: planner
description: ゴールに対して次にやる小さな独立タスクを決める係
tools: ["Read", "Grep", "Glob", "Bash(git log:*)", "Bash(git diff:*)", "Bash(ls:*)"]
model: opus
---
あなたはプランナーです。コードは書きません。
リポジトリの現状を調べ、ゴールに対して「次に着手すべき、互いに独立した小さなタスク」を最大3件選びます。
各タスクには、完了を機械で確かめるための検証コマンドを必ず付けます。
すでにゴールが満たされているなら done を true にします。

.claude/agents/worker.md

---
name: worker
description: 1つのタスクを実装し、自分で検証してから終える係
tools: ["Read", "Edit", "Write", "Bash"]
model: sonnet
---
あなたは実装者です。渡された1タスクだけを実装します。
実装後、指定された検証コマンドを必ず実行し、失敗したら直してから終わります。
スコープ外のファイルには触りません。検証が通らないまま完了と言いません。

手順3:回す(ループ・ランナー)

plannerに次タスク群をJSONで出させ、1件ずつworkerに渡して検証まで回すスクリプトです。 done:true が返るか、上限回数に達したら止まります。 フラグはすべて Claude Code 2.x で動作確認済みのものです。

#!/usr/bin/env bash
set -euo pipefail

GOAL="${1:?usage: loop.sh \"<ゴールを1文で>\"}"
MAX_ITERS="${MAX_ITERS:-8}"      # 反復上限(暴走止め)
BUDGET="${BUDGET:-5}"            # 1呼び出しのコスト上限(USD)

# plannerの出力を縛るJSONスキーマ
SCHEMA='{"type":"object","properties":{
  "done":{"type":"boolean"},
  "tasks":{"type":"array","items":{"type":"object","properties":{
    "title":{"type":"string"},
    "prompt":{"type":"string"},
    "verify":{"type":"string"}
  },"required":["title","prompt","verify"]}}
},"required":["done","tasks"]}'

for ((i=1; i<=MAX_ITERS; i++)); do
  echo "──── iteration $i / $MAX_ITERS ────"

  # 1) 次にやることをAIに決めさせる(読むだけ・構造化出力)
  envelope=$(claude -p "ゴール: $GOAL
現状を調べ、次に着手すべき独立タスクを最大3件、JSONで出せ。全部終わっていれば done:true。" \
    --agent planner \
    --output-format json \
    --json-schema "$SCHEMA" \
    --max-budget-usd "$BUDGET")

  plan=$(echo "$envelope" | jq -r '.result')   # .result に本文が入る
  if [ "$(echo "$plan" | jq -r '.done')" = "true" ]; then
    echo "ゴール達成。終了。"; break
  fi

  # 2) タスクを1件ずつ実装+検証させる
  echo "$plan" | jq -c '.tasks[]' | while read -r t; do
    title=$(echo "$t"  | jq -r '.title')
    prompt=$(echo "$t" | jq -r '.prompt')
    verify=$(echo "$t" | jq -r '.verify')
    echo "▶ $title"
    claude -p "次のタスクを実装せよ:
$prompt

完了後、必ずこれを実行して結果を確認し、失敗なら直してから終えよ:
$verify" \
      --agent worker \
      --permission-mode acceptEdits \
      --max-budget-usd "$BUDGET"
  done
done

使い方は1行です。

chmod +x loop.sh
./loop.sh "認証まわりのテストカバレッジを80%まで上げる"

「何をやるか」を考えているのは、あなたではなくplannerです。 あなたが書くのはゴール1文と、このループだけになります。

手順4:歯止め(暴走とコストを止める)

ループは放っておくと走り続け、課金も伸びます。 三重に止めます。

{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Bash",
        "hooks": [
          { "type": "command",
            "command": "grep -qiE 'rm -rf|git push --force|drop table' <<< \"$CLAUDE_TOOL_INPUT\" && exit 2 || exit 0" }
        ]
      }
    ]
  }
}

worker に渡す権限も、--permission-mode acceptEdits(編集は自動・それ以外は確認)から始め、信頼できてから dontAskbypassPermissions に広げます。 いきなり --dangerously-skip-permissions を使わないことです。

コピペ用:指示プロンプト集

スクリプトを使わず、対話セッションの中で同じ動きを試したいときの指示文です。

プランナーに次を決めさせる

あなたはプランナーです。コードは書かないでください。
ゴール:「__ここにゴール__」
リポジトリの現状を調べ、次に着手すべき独立した小さなタスクを最大3件、
各タスクに「検証コマンド」を付けて挙げてください。
すでにゴールが満たされているなら「完了」とだけ答えてください。

ワーカーに実装+自己検証させる

次のタスクだけを実装してください(スコープ外は触らない):
__タスク__
実装が終わったら、必ず次を実行して結果を貼り、失敗していれば直してから完了と言ってください:
__検証コマンド__

1往復を自走させる(ミニループ)

これから「現状調査 → 次の1タスク決定 → 実装 → 検証」を1サイクル回してください。
検証が通ったら、次のサイクルに進んでよいか私に1行で確認してください。
コストと安全のため、1サイクルにつき変更は1つの論点に絞ってください。

まとめ

自走ループの本体は、賢い1個のプロンプトではなく、「決める・作る・確かめる」を分けて回す仕組みです。 記憶(CLAUDE.md)で前提を固定し、サブエージェントで役割を分け、ランナーで回し、上限とフックで止める。 合う作業に絞って入れれば、あなたの仕事は「ゴールを1文で書くこと」と「ループを直すこと」に変わります。