# エージェントループの実験（記事 what-is-agent-loop）

2026-10-07に実施。Claude Code 2.1.291 の `claude -p`、モデルは Haiku 4.5（`--model haiku`）。費用は `total_cost_usd`（list価格の換算額で、実請求ではない）。

## 何を測ったか

| 名前 | 課題 | 回数 | 見たもの |
|---|---|---|---|
| lap-1〜5 | `cart.py` の数量の掛け忘れを、失敗するテストを手がかりに直す | 5 | モデル呼び出しの回数、ツールの並び、1周ごとの入力トークン |
| plain-1〜3 | 5つの関数のうち4つが壊れている `funcs.py` を、`check.sh` が ALL OK になるまで直す。「1ターンに直すのは1関数だけにして、直したら報告して手を止めてよい」と頼む | 3 | 止まったときの状態 |
| goal-1〜3 | plain と同じ依頼に `/goal ` を付ける | 3 | 評価役のフィードバック回数、最終状態 |
| outer-1〜3 | plain と同じ依頼を、シェルの `while` が `check.sh` の通るまで新しいセッションで呼び直す（上限8周） | 3 | 周回数、セッション数 |
| max-turns-2 | lap と同じ課題に `--max-turns 2` | 1 | 終了コード、subtype、最終状態 |

plain / goal / outer は、止まりやすくなるよう**わざと「1関数だけ直して止まってよい」と頼んでいる**。ループの仕組みを見るための設計で、ふだんの使い方の再現ではない。

## ファイル

- `tasks/cart/`、`tasks/funcs/`：課題の初期状態
- `run.sh`：`./run.sh lap|plain|goal <n>` で1回実行して `logs/` に保存
- `run-outer.sh`：外側のループ（`./run-outer.sh <n>`）
- `summarize.py`：`logs/*.jsonl` から `summary.json` を作る
- `logs/*.jsonl`：`--output-format stream-json --verbose` のログ。`assistant`・`user`・`result` の行だけを残し、thinking の中身は空にし、ユーザー名は `user` に置き換えている
- `logs/*.final.txt`：実行後に `test_cart.py` または `check.sh` を走らせた結果（採点）
- `summary.json`：集計

## 再現

```sh
cd web/public/blog/what-is-agent-loop/experiment
./run.sh lap 1          # 1周ずつ見る
./run.sh goal 1         # /goal
./run-outer.sh 1        # 外側のループ
python3 summarize.py    # summary.json を更新（logs/ を上書きした場合）
```

作業フォルダは `/tmp/al-art/runs/` に毎回作り直される。`--setting-sources ""` で個人設定は読まない。`/goal` は上限を付けていないので、課題を変えるときは「10ターンで止まる」などを条件に書くこと。

## 限界

- モデルは Haiku 4.5 だけ。回数は lap=5、plain/goal/outer=3。「この課題・この条件でこうなった」まで。
- plain が0/3なのは、止まってよいと頼んだ設計のため。
- `goal` の費用に、評価役（`/goal` が呼ぶ小さなモデル）の呼び出しが含まれているかは確認していない。
- `lap` の入力トークンの大半は Claude Code が最初から入れる指示とツール説明と考えられるが、内訳は測っていない。
