Home Anthropic Engineering解説: 長時間実行エージェントの効果的なハーネス設計パターン
投稿
キャンセル

✍️ Anthropic Engineering解説: 長時間実行エージェントの効果的なハーネス設計パターン

本記事は Effective harnesses for long-running agents(Anthropic Engineering Blog、2025年11月26日公開) の解説記事です。

ブログ概要(Summary)

Anthropic Engineeringブログで公開されたこの記事は、コンテキストウィンドウを超える長時間実行エージェントを安定して運用するためのハーネス(制御基盤)設計パターンを解説するものである。著者のJustin Youngらは、2エージェントシステム(Initializer Agent + Coding Agent)による段階的進捗パターン、claude-progress.txtによるセッション間状態管理、feature_list.jsonによる200以上の機能のトラッキング、Puppeteer MCPによるE2Eテスト自動化を報告している。ブログでは「これらの実践のインスピレーションは、効果的なソフトウェアエンジニアが毎日行っていることから得た」と述べられている。

この記事は Zenn記事: Bedrock AgentCore Runtimeで8時間連続セッションと状態永続化を実装する の深掘りです。

情報源

技術的背景(Technical Background)

LLMエージェントのコンテキストウィンドウには上限があるため、1つのセッション内で大規模なタスクを完遂できない場合がある。例えば、200機能を持つWebアプリケーションの構築は、単一のコンテキストウィンドウでは処理しきれない。

この課題に対して、ブログでは2つのアプローチが検討されている:

  1. コンテキスト拡張: より長いコンテキストウィンドウを使う(コスト・レイテンシの問題)
  2. セッション分割+状態引き継ぎ: 複数のセッションに分割し、セッション間で状態を引き継ぐ

ブログの著者らは後者のアプローチを採用し、人間のソフトウェアエンジニアの作業パターン——Gitによるバージョン管理、タスクボードによる進捗管理、テストスイートによる品質保証——をエージェントのハーネス設計に応用した。

実装アーキテクチャ(Architecture)

2エージェントシステム

ブログで提案されているアーキテクチャは、2種類のエージェントロールで構成される。

graph TD
    subgraph 初回セッション
        A[Initializer Agent] -->|プロジェクト基盤を構築| B[init.sh生成]
        A -->|要件を構造化| C[feature_list.json生成<br/>200+機能]
        A -->|初回進捗記録| D[claude-progress.txt]
        A -->|コード変更| E[Git Repository]
    end

    subgraph 2回目以降のセッション
        F[Coding Agent] -->|状態読み取り| D
        F -->|次の機能を選択| C
        F -->|コード変更| E
        F -->|テスト実行| G[Puppeteer MCP<br/>E2Eテスト]
        G -->|結果| F
        F -->|進捗更新| D
    end

    B -.->|引き継ぎ| F
    C -.->|引き継ぎ| F
    D -.->|引き継ぎ| F

Initializer Agent: 初回セッションのみで使用され、以下を生成する:

  • init.sh: 開発サーバー起動と基本的なE2Eテストの自動化スクリプト
  • feature_list.json: 200以上の機能定義(各機能にテストステップとpassesブール値を含む)
  • claude-progress.txt: セッション間で引き継がれる進捗ログ

Coding Agent: 2回目以降のセッションで使用され、以下の手順で作業する:

  1. pwdで作業ディレクトリを確認
  2. Gitログとclaude-progress.txtを読み取り
  3. feature_list.jsonから最優先の未完了機能を選択
  4. init.shで開発サーバーを起動
  5. E2Eテストで基本動作を確認
  6. 機能実装を開始

状態永続化の4つの柱

ブログでは、セッション間の状態引き継ぎを4つのアーティファクトで実現している。

アーティファクト役割更新タイミング
init.sh環境セットアップの自動化初回のみ
claude-progress.txtセッション単位の作業ログ各セッション終了時
feature_list.json機能の完了/未完了状態機能完了時
Git Repositoryコード変更の追跡コミット単位

ブログの著者らは「エージェントが作業の状態を素早く理解する方法を見つけることが重要な洞察だった」と述べている。これらのアーティファクトにより、新しいセッションのエージェントは数秒で前回の作業状態を把握できる。

feature_list.jsonの構造

ブログによると、Initializer Agentは200以上の機能を含むJSONファイルを生成する。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
{
  "features": [
    {
      "id": "auth-login",
      "description": "ユーザーがメールアドレスとパスワードでログインできる",
      "priority": 1,
      "test_steps": [
        "ログインページに遷移する",
        "メールアドレスとパスワードを入力する",
        "ログインボタンをクリックする",
        "ダッシュボードにリダイレクトされることを確認する"
      ],
      "passes": false
    },
    {
      "id": "auth-register",
      "description": "新規ユーザーがアカウントを登録できる",
      "priority": 2,
      "test_steps": ["..."],
      "passes": false
    }
  ]
}

ブログでは「テストを削除または編集することは許容されない。これは機能の欠落やバグにつながる可能性がある」と明確に述べられている。この制約により、エージェントが「テストを修正して通す」という近道を防止している。

E2Eテストの自動化

ブログでは、Puppeteer MCPによるブラウザ自動化テストが品質保証の中核として使用されている。エージェントは機能実装後、ユニットテストではなくE2Eテストでユーザーワークフローをシミュレーションして検証する。

既知の制限事項: ブログでは「ClaudeはPuppeteer MCP経由でブラウザネイティブのアラートモーダルを見ることができない」という制限が報告されている。

パフォーマンス最適化(Performance)

セッション起動のオーバーヘッド削減

ブログで紹介されているinit.shスクリプトは、セッション起動時のオーバーヘッドを削減する重要な要素である。

従来のアプローチでは、エージェントが毎回環境セットアップを試みるため、以下の重複作業が発生していた:

\[T_{\text{overhead}} = T_{\text{env\_setup}} + T_{\text{dep\_install}} + T_{\text{server\_start}} + T_{\text{state\_restore}}\]

init.shの導入により:

\[T_{\text{overhead}}' = T_{\text{init.sh}} + T_{\text{state\_read}} \ll T_{\text{overhead}}\]

init.shはべき等に設計されており、依存パッケージが既にインストールされている場合はスキップする。これにより、2回目以降のセッション起動時間が大幅に短縮される。

1機能ずつの段階的進捗

ブログの著者らは、エージェントが「一度に1つの機能のみに取り組む」ことを強調している。これは以下の理由による:

  1. コンテキストの効率利用: 複数機能を並行すると、各機能のコンテキストが競合する
  2. 障害の局所化: 1機能が失敗しても他の機能に影響しない
  3. 進捗の可視化: feature_list.jsonpassesフラグで明確にトラッキングできる
  4. 品質の担保: 各機能完了後にE2Eテストで即座に検証できる

AgentCore Runtimeとの接点

このハーネス設計パターンは、AgentCore Runtimeの以下の機能と組み合わせることでさらに効果を発揮する:

ハーネス要素AgentCore対応機能メリット
init.shSession Storage /mnt/workspaceセットアップ済み環境の永続化
claude-progress.txtSession Storage進捗ファイルのセッション間引き継ぎ
feature_list.jsonSession Storage機能状態のセッション間引き継ぎ
Puppeteer E2EInvokeAgentRuntimeCommandテスト実行の確定的制御
Git操作InvokeAgentRuntimeCommandコミット・プッシュの確定的実行

AgentCore RuntimeのSession Storageを使えば、init.shによる環境構築結果(インストール済みパッケージ、ビルド成果物)がmicroVM停止後も保持されるため、翌日のセッション再開時にinit.shの実行自体が不要になる。

運用での学び(Production Lessons)

ブログでは、長時間実行エージェントの運用で遭遇する典型的な障害モードとその対策が報告されている。

問題対策
エージェントが時期尚早に完了を宣言するfeature_list.jsonpassesフラグによる客観的な完了判定
コードがバグのある状態で放置される各セッション終了時のGitコミット + claude-progress.txt更新
テストなしで機能完了とマークされるPuppeteer MCPによるE2Eテストの明示的な実行要求
セットアップ作業の重複init.shによるべき等な環境セットアップ
ブラウザ自動化の制限ネイティブアラートモーダル等の既知制限をシステムプロンプトに明記

ブログの重要な引用: 「これらの実践のインスピレーションは、効果的なソフトウェアエンジニアが毎日行っていることを知っていたことから得た」

この洞察は、エージェントシステムの設計において、人間のワークフロー(バージョン管理、タスクボード、テストスイート、ペアプログラミング)をそのまま適用することの有効性を示唆している。

学術研究との関連(Academic Connection)

ブログで提案されているハーネス設計パターンは、以下の学術研究と関連している。

  • SWE-bench(Jimenez et al., 2024): ソフトウェアエンジニアリングエージェントの評価ベンチマーク。ブログのハーネスパターンは、SWE-benchの「issue解決」タスクをスケールアップし、複数セッションにまたがるプロジェクト構築タスクに拡張したものと位置づけられる
  • OpenHands(Wang et al., 2024, arXiv:2405.04798): Dockerサンドボックスベースのエージェントプラットフォーム。ブログのハーネスパターンは、OpenHandsの実行環境上に構築可能な設計ガイドラインとして位置づけられる
  • AgentScope(Gao et al., 2023, arXiv:2312.07925): 分散マルチエージェントプラットフォーム。ブログの2エージェントシステム(Initializer + Coding)は、AgentScopeのエージェント間協調パターンの具体的な実装例である

将来の研究方向

ブログの最後で、著者らは以下のオープンクエスチョンを提示している:

  • マルチエージェント特化: テストエージェント、QAエージェント、クリーンアップエージェントなど、役割を分化させた複数エージェント構成は単一汎用エージェントより効果的か
  • ドメイン汎化: Web開発以外の分野(科学研究、金融モデリング)への適用可能性
  • 特化型アーキテクチャ: 専門エージェントアーキテクチャによる性能改善の可能性

まとめと実践への示唆

Anthropic Engineeringブログで解説されたハーネス設計パターンは、長時間実行エージェントの3つの根本課題——コンテキスト制約の克服、セッション間状態の引き継ぎ、品質保証の自動化——に対する実践的な解決策を提示している。

実務への示唆として、以下の3点が重要である:

  1. 状態永続化の明示的設計: claude-progress.txtfeature_list.jsonのような、エージェントが読み書きする明示的な状態ファイルを定義する。暗黙的なコンテキスト依存ではなく、永続化された外部状態に基づく判断を促す設計にする
  2. 確定的操作の分離: エージェントの推論(非確定的)とテスト実行・Git操作(確定的)を分離する。AgentCore RuntimeのInvokeAgentRuntimeCommandはこの分離を支援する
  3. べき等な環境セットアップ: init.shに相当するべき等なセットアップスクリプトを用意し、AgentCore RuntimeのSession Storageと組み合わせてセットアップ時間を最小化する

参考文献

この投稿は CC BY 4.0 でライセンスされています。

ICLR 2025論文解説: Relaxed Recursive Transformers — レイヤー共有とLoRAによるモデル圧縮

論文解説: DeepSeek-V2 — Multi-Head Latent Attentionによる93.3%のKVキャッシュ削減