# 実験素材：長い作業の状態を「会話の外」に置くと、続きは進むのか

記事: 「AIエージェントに長いプロジェクトを任せるコツ」（2026-10-12 実施、macOS、Claude Code 2.1.291）

## 何をしたか

課題は「CommonMark 0.31.2 準拠の Markdown→HTML 変換 `md2html.py` を、標準ライブラリだけで作る」こと。
規格書の652例を乱数（seed 20261012）で半分に分け、326例を `examples.json`（作業フォルダに渡す）、残り326例を `heldout.json`（採点にだけ使う）にした。

1回の作業は新しい `claude -p`（前の会話の記憶なし）。`--max-turns 15` で打ち切り、「会話が尽きた」状況を作る。これを5セッション続け、毎回の終わりに `check.py` で採点する。

| 条件 | 渡す仕組み |
|---|---|
| A | 仕様書・例・コードだけ。毎回「続きです」と言うだけ |
| B | 機能リスト `feature_list.json`（passesだけ書き換え可）＋ `progress.md` ＋ `init.sh` ＋ git。最初のセッションだけ初期化担当。「セッションの終わりに progress.md を書く」 |
| C | `progress.md` ＋ git。「セッションの終わりに書く」 |
| D | Cと同じ道具。「打ち切りは予告なく来る。1つ進めるたびにその場で書く」 |
| E | Bと同じ道具。Dと同じ「その都度書く」指示 |

プロンプト全文は `run.py` にある。

## ラウンド

| ラウンド | モデル | 条件×試行 | セッション | 備考 |
|---|---|---|---|---|
| haiku-main | Haiku 4.5 | A〜E × 5 | 5 | 自動メモリOFF（`CLAUDE_CODE_DISABLE_AUTO_MEMORY=1`）。記事の本命 |
| haiku-first | Haiku 4.5 | A〜C × 3 | 5 | 自動メモリON。A-h3だけがメモリに書いた。予備 |
| sonnet | Sonnet 5.5 | A〜C × 3 | 3 | 自動メモリON。全9試行が1セッション目で326/326 |

haiku-mainのD・Eは、途中でプロセスがまとめて強制終了（exit 137）された試行があり、該当試行は最初からやり直した。A〜Cの試行は無効にしていない。

## 結果（Haiku、haiku-main、5セッション後の手元にない326例の合格数）

| 条件 | 5試行の最終値 | 平均 |
|---|---|---|
| A | 124, 117, 152, 121, 116 | 126 |
| C | 146, 99, 79, 144, 111 | 116 |
| D | 82, 126, 122, 109, 99 | 108 |
| B | 87, 96, 91, 74, 109 | 91 |
| E | 87, 63, 67, 61, 58 | 67 |

`results.json` に全試行・全セッションの値（合格数、ターン数、換算額、編集回数、progress.md更新の有無、commitの有無）がある。

## 限界

- モデルはHaiku 4.5中心、1課題、条件あたり5試行。順位の入れ替わりがありうる。haiku-firstではCがAを上回った。
- 「会話が尽きる」はターン数の打ち切りで模した。実際のコンテキスト切れ（自動圧縮）とは違う。
- 課題は数時間〜数日の実プロジェクトより小さい。結果は、数時間以上かかる作業には当てはまらないかもしれない。
- 金額はAPI料金への換算額で、実際の請求ではない。
- 作業ログ（stream-json）には個人の環境パスが含まれるため公開していない。

## 追試の実行

Python 3、git、ログイン済みのClaude Codeが必要です。下のリンクから同じフォルダ構成で保存し、`run.py` のある場所で実行します。LLMを呼ぶため、契約・利用枠によって課金が生じることがあります。

```sh
# 本命: A〜E、k1〜k5（5セッション、15ターン、Haiku、メモリOFF）
python3 run.py A k1 5 15 haiku off
# 予備: A〜C、h1〜h3（メモリON）
python3 run.py A h1 5 15 haiku on
# Sonnet: A〜C、s1〜s3（3セッション、メモリON）
python3 run.py A s1 3 15 sonnet on
```

引数は `python3 run.py <cond> <trial> [sessions] [max_turns] [model] [off|on]`。最後のmemoryを省略するとOFFです。OFFは子プロセスに `CLAUDE_CODE_DISABLE_AUTO_MEMORY=1` を設定し、ONは親にその値があっても子から除去します。親環境は変更しません。ONは自動メモリを無効化しない設定であり、書き込みの発生や当時と同じ結果を保証しません。CLI版や既存メモリの状態も結果に影響し得ます。

出力は `/tmp/lrp-exp/<cond>-<trial>/` のwork、logs、summary.jsonです。同じ条件・試行IDで再実行するとそのディレクトリを作り直します。`heldout.json` は採点専用で、エージェントのworkには渡しません。

## ファイル

追試に必須の6ファイル:

- [README.md](/blog/long-running-ai-agent-project-planning/experiment/README.md) この説明
- [SPEC.md](/blog/long-running-ai-agent-project-planning/experiment/SPEC.md) 作業フォルダに渡した仕様
- [examples.json](/blog/long-running-ai-agent-project-planning/experiment/examples.json) 作業用326例
- [heldout.json](/blog/long-running-ai-agent-project-planning/experiment/heldout.json) 採点専用326例
- [run.py](/blog/long-running-ai-agent-project-planning/experiment/run.py) 実験の実行
- [check.py](/blog/long-running-ai-agent-project-planning/experiment/check.py) 採点（標準ライブラリ以外をimportしたら0点）

集計・図とサンプル:

- [results.json](/blog/long-running-ai-agent-project-planning/experiment/results.json) 掲載時の保存結果
- [analyze.py](/blog/long-running-ai-agent-project-planning/experiment/analyze.py) ローカル追試のstream-jsonからresults.jsonを作る。掲載時の非公開ログは付属しないため、公開resultsの独立再構築を保証するものではない
- [gen_concept.py](/blog/long-running-ai-agent-project-planning/experiment/gen_concept.py) / [gen_results.py](/blog/long-running-ai-agent-project-planning/experiment/gen_results.py) 図の生成。後者は公開results.jsonから生成できる（標準ライブラリのみ）
- [B-k1-feature_list.json](/blog/long-running-ai-agent-project-planning/experiment/samples/B-k1-feature_list.json)、[B-k1-progress.md](/blog/long-running-ai-agent-project-planning/experiment/samples/B-k1-progress.md)、[D-k2-progress.md](/blog/long-running-ai-agent-project-planning/experiment/samples/D-k2-progress.md) 実物サンプル
