一行要約

harness はモデルが良くなるほど陳腐化する前提が埋め込まれているので、エージェントを「brain(Claude と harness)/ hands(サンドボックスとツール)/ session(イベントログ)」に分離し、それぞれが独立に落ちたり差し替えられたりできるようにする。

要点

動機

Harnesses encode assumptions that go stale as models improve. harness は、モデルの改善とともに陳腐化していく前提を焼き込んでしまう。

harness にはモデルの当時の限界を前提とした仮定が埋め込まれる。モデルが良くなるとその仮定が足枷になる。解は、構成要素を安定したインターフェースへ仮想化し、実装が変わってもインターフェースは残るようにすること。

原典は “Don’t adopt a pet”(ペットを飼うな)という節でこれを表現している — 個体として愛着を持って世話をする対象ではなく、差し替え可能な部品として扱え、という含意。

3層への分離

中身
brainClaude とその harness
handsサンドボックスとツール
sessionイベントログ

それぞれが独立に失敗し、独立に置き換えられる。

具体的な帰結:

  • harness はコンテナの中に住まなくなった。 コンテナは execute(name, input) → string というインターフェース越しに呼ぶ
  • セッションは harness の障害を生き延びるwake(sessionId)getSession(id) で復帰する
  • イベントは emitEvent(id, event)永続的に記録される

「セッションは Claude の context window ではない」

これがタイトルにもなっている節の主張。

セッションは Claude の context window の外にある context オブジェクトであり、getEvents() を通じてアクセスされる。context window はセッションの一部を映す窓に過ぎない。

この分離があるからこそ、context window が溢れても、harness が落ちても、セッションという事実の記録は失われない

セキュリティ

Claude が生成したコードが走るサンドボックスには、セキュリティトークンを一切露出させない。

性能

不要なコンテナのプロビジョニングを排除した結果:

指標改善
TTFT(time-to-first-token)p50約 60% 短縮
TTFT p9590% 以上短縮

p95 の改善幅が p50 より遥かに大きいのは、コンテナ起動待ちが裾を重くしていたことを示している。

そのまま使える具体例

分離のインターフェース(自前の harness を設計するときの雛形):

execute(name, input) → string      hands の呼び出し。harness はコンテナの中に住まない
wake(sessionId)                    harness が落ちてもセッションから復帰する
getSession(id)                     セッションを取得する
emitEvent(id, event)               イベントを永続的に記録する
getEvents()                        context window の外にある context を読む

設計チェックリスト:

□ harness とサンドボックスが同じプロセス/コンテナに同居していないか
    → 同居していると片方の障害がもう片方を巻き込む
□ セッションの記録が context window の中にしかないか
    → 溢れた時点で失われる。外部のイベントログにする
□ サンドボックスに認証情報が入っていないか
    → Claude の生成コードが走る場所にトークンを置かない
□ harness にモデルの現在の限界を前提とした仮定が埋まっていないか
    → モデルが良くなると足枷になる

原典で言及されている関連文書

未取得の派生リンク