世界を動かす技術を、日本語で。

あらゆることができるハーネスに向けて

概要

  • LLMをチャット画面から解放するための ハーネス設計 への提案
  • 直感的・透明性・柔軟性・堅牢性を重視した 理想的なハーネスの要件 整理
  • UNIX哲学 を応用したエージェント向け環境設計のすすめ
  • すべてを テキストファイル として扱うことでLLMの強みを最大化
  • 実装例として Ambiance の概要と利用方法を紹介

理想的なハーネスの条件

  • エージェント にとって自然で直感的な設計
  • すべての動作が 透明 であり、自己成長や障害時の監査が可能な構造
  • 最小限かつ柔軟 な設計、不要な複雑化の排除
  • エラー耐性、アップデート耐性、長期間の安定動作を保証する堅牢性
  • LLMの知能進化に伴い、ハーネス自体の 信頼性向上 を見据えた設計

基本原則と学び

  • 決定論的 なプロセスを最大限重視
  • LLMが 目標選択、その実行手順は明確に定義
  • コアプロンプト は極力小さく、必要なスキルを都度ロードする方式
  • コンテキスト制限 に近づくとLLMの挙動が不安定化
  • LLMの コーディング知識 や既存スキルを最大限活用
  • ファイル探索や冗長な処理 はハーネス側で効率化し、LLMの負荷を軽減
  • バックグラウンドでの ロギング、サニティチェック、フェイルセーフ、サニタイズ の自動化

監査性・ロギング・自己修復

  • すべてのエージェントは 失敗 する前提
  • 失敗は「 LLMレベル」と「 ハーネスレベル」の2種類
    • LLMレベルの失敗はハーネスでリスク低減
    • ハーネスレベルの失敗は ランタイムで修復可能
  • 詳細なログ明確なエラーメッセージ が自己修復の鍵

UNIX哲学の応用とデータレイヤー

  • UNIX/Linux環境 をエージェント用ハーネスのモチーフに
  • UNIX哲学 :「1つのことをうまくやる」「プログラム同士が連携」「テキストストリームを活用」
  • モジュール化・透明性・ 失敗時は大きくアラート
  • スキル・ツール・コネクタの役割分担
  • テキストファイル を普遍的なインターフェースとして活用

Ambianceによる実装例

  • すべてはファイル という設計思想

  • 外部データは プレーンテキスト として整形し、ディレクトリで分類

  • Filesystem Hierarchy Standard (FHS) を参考にディレクトリ構成を設計

    • /var(ログ)、/etc(設定)、/home(作業領域)、/bin(ツール)など
  • grep, find, rg, fzf などで簡単に監査・検索可能

  • 外部世界のデータを 仮想ファイルシステム(VFS) に整形して配置

    | ハーネス        | UNIX相当     | FHS例         |
    |----------------|-------------|--------------|
    | Agents         | Users       | /home/...    |
    | 外部データ      | Drivers     | /sys/        |
    | ツール          | Binaries    | /bin/        |
    | ログ            | Logs        | /var/        |
    | 自己修復        | System Bin  | /sbin/, /recovery |
    | スキル          | Docs        | /usr/share/doc |
    

カーネルとイベント処理

  • Ambiance Kernel :FSの変化を監視し、イベント駆動でLLMを呼び出し
  • OpenClaw のような定期ハートビート方式の課題を解決
  • ファイルや外部状態の変化を 即時検知 し、LLMに通知
  • 複数の「ユーザー(LLMインスタンス)」がイベントごとに役割分担
  • カーネルはLLMの 安全性・健全性チェック を担う中間層

デフォルトユーザー設計

  • root :システム管理・ドライバやバイナリの実装・修正担当
  • pai :人間との対話や外界インターフェース担当
  • librarian :paiの得意・不得意やシステムの活動記録を管理
  • 全ユーザーは イベントバスメッセージ送信バイナリ で常時連携

Ambianceの利用と今後

  • モデルの既存知識(ファイル・ユーザー・ログ・ドキュメント)を 最大限活用
  • 公式サイト:whitematterlabs.ai
  • インストール例:
    curl -fsSL https://raw.githubusercontent.com/whitematterlabs/ambiance/main/install.sh | sh
    
  • 興味がある場合や同様のプロジェクトに取り組む場合は Recurse Center も要チェック

このように、 LLMの知識と親和性の高いUNIX的設計 を基盤としたハーネスが、今後のエージェント開発の鍵になると考えられる。

Hackerたちの意見

ハーネスを開発する上で最も役立ったことは何ですか?

「疑問があるときは、シンプルにすること。削除、トリム、最小限にする。問題をできるだけ小さなケースで再現し、全体のデザインを完全に理解すること。これには近道はない。」

LLMを使ってると、ハーネスを開発するのが難しいと感じる。中間にLLMがあると、たくさんのターンをテストできないからね。LLMをジャッジとして使うのが、この問題に取り組む一つの方法かもしれない。

このアイデアと、概念をUnixのプリミティブにマッピングした方法がすごく好きです。確かに、LLMはすでに「Unixネイティブ」ですね。私はk8sのプリミティブを使ったイベント駆動型のワークフローを試しているけど、これは一段上のスタックです。共有のメンタルモデルを整理する上で、これはすごく理にかなっていると思います。ぜひチェックしてみます。素晴らしい仕事をありがとう!

ありがとう!どう思ったか教えてね。同じようなことをしている人たちとアイデアを共有したいな!

エージェントについてはちょっと違う考えを持ってるんだ。決定論的なスキャフォールドは完全に信じてるけど、エージェントはできるだけ決定論的であるべきだと思う。コードが多いほど良いよね。今日のClaude Codeに求める典型的なループを考えてみて(TDDを使っていないと仮定して):失敗しやすいモードでテストスイートを実行して、最近の機能変更が原因で失敗したか診断する(バックエンド/フロントエンド、GitHubの問題、PRDなどを参照)。CCに機能変更が原因でテストが失敗したか判断させて、その後テストを更新するように頼む。必要ならCCにサブエージェントを使って調査・修正させるのもあり。各修正をコミットして、次に進む。確かに、これには失敗する方法がたくさんあるけど、ここで話してるのはエージェントのことだから、エラーが多いテストメンテナンスのことじゃない。もし、あなたのコードベースのコンテキストを持ち、決定論的にテストスイートやリンター、フックなどを実行するエージェントがいたらどうなるだろう?「英語」のプロンプトは、テストが機能変更のせいで失敗したかどうかを判断するためにLLMを呼び込むコードループになる。さらに、GitログやJIRAなども抽出できる。ここでの各ツールは実際のコード。エッジケースに出会ったときだけプロンプトを出す実行可能なコードなんだ。エッジケースは定義されているけど、エージェントを使ってこれらのツールのメンテナンスを加速できるようになる。システムは「一つのことをうまくやるプログラム」に基づいていて、特定のエッジケースのためにLLMに連絡する。エージェントは、これらの実行可能なものが互いにどう機能するかを決めるものなんだ。

より決定論的なコードが多いほど良いというのには100%同意するけど、LLMの非決定論的な能力が必要な限界までだね。ACMのブログ記事「Manual Work is a Bug」[0]があって、これは元々人間がコードを使ってプロセスを自動化するのを助けるために書かれたものなんだ。今でも書かれた時と同じくらい適用できると思うよ。君とLLMは何をしなければならないかを見て、それを実現するためのスクリプトやツールを考える。で、それらのツールをシステムに結びつける。これを使えば使うほど、意味が分かってきて、「ただプロンプトをコミットするだけ」という考えがナンセンスに思えてくる。0 - https://queue.acm.org/detail.cfm?id=3197520

ここでは冒涜的な考えかもしれないけど、君が説明するような決定論的なワークフローこそが、langgraphが本当に輝くところだと思う。

私も決定論的なコードの流れに乗ってるよ。長時間実行するタスクで成功したのは、エージェントのハーネス(cc、codex-cliなど)を決定論的なワークフローと決定論的なゲートでラップすることだった。これに名前が必要だね。私の中では、これが本当のハーネスだと思う。なぜなら、エージェントの失敗モードを制約するから。フローエンジニアリングが提案されていると思うけど、もしかしたらエージェント的な外骨格って呼ぶべきかも?

ここで意見が対立してるわけじゃないと思うよ。決定論はできるだけ追求すべきだと思うけど、ソフトウェアエンジニアリングの世界から一歩引くと、自動化がずっと難しくなることが多い気がする。

エージェント的なコーディングのポリシーの一つは、テストをしっかり開発することなんだ。LLMベースの雰囲気じゃなくて、コーディングされたテストね。私のプロジェクトはコードとテストがほぼ1:1のLOC比率になってる。テストは皮膚みたいなもので、皮膚が刺されると痛い。エージェントも痛みを感じる必要がある。OPの「すべてはテキストファイル」というアイデアはいいね、私も使ってるよ。計画はtask.mdファイルに保存して、番号と名前を付けてる。作業項目はファイル内のチェックボックスで、完了した項目にはチェックを入れて、その行に実装についてのフィードバックをコメントとして追加してる。現在の世界の状態を記録したドキュメントも持ってるよ。これはhttps://horiacristescu.github.io/claude-playbook-plugin/docs...になるはず。

エージェントの時代において、BDDはますます重要だと感じる。なぜなら、行動を記述するから。もしそれがうまくできれば、これらのツールが正しい行動を拾いやすくなるよね。Gherkinスタイルのテストも思い浮かぶ。

君が説明しているのは、まさに私のエージェントフレームワークの目標なんだ。設計されたメタプロセスの一つは、自動化されたプロセスをできるだけ下に押し下げることなんだ。「下」というのは、合理的に金属に近いところまでって意味ね。だから、自動化できるものは自動化して、LLMには本当に得意なことをやらせる。例えば「このバグ修正チケットを処理する」っていうのは、バグ修正の多くのアクションが事前に定義されてる。例えば、チケットの最後にgit commitがあるからね。だから、Maelstromはバグ修正のワークフローの最後で、実装を行ったLLMからgit commitを強制するんだ。LLMはgitコマンドを見ずに、コミットの要約をJSONフィールドに入力するだけで、ワークフローがコミットを処理するんだ。

Hacker Newsで議論の続きを見る