Skip to content
← すべての章

章 07

スウォームの自律性

多数のエージェントを動かすでは、リードとそのレーンを説明しました。この章では、一つのアカウントが上限に達したり、一つのエージェントがいなくなったりしたときに、その構成を動かし続けるものを扱います。レーンは自分のアカウントにどれだけ余裕が残っているかを確認し、尽きる前に作業を引き渡します。リードはリーダーシップを引き渡すか、いなくなったときには交代させられます。スウォームが開発者に尋ねるのは、本当にクリティカルなことだけです。

この章が答える障害は具体的です。計画の途中でクォータを使い切ったリードはすべてのレーンを置き去りにし、人が新しいセッションを開くまで何も進みません。以下の規則があれば、計画は開発者がすでに与えた認可の範囲内で進み続けます。

ここでのすべては六つの規則で形づくられます。

  1. プロダクトごとに一つの役割。 coding-agents-kit(ak)はアカウントとキャパシティを知り、herdr-peers はメッセージ、ペイン、誰がリードかを知り、Deep Work Plan のパックは方法、すなわちいつ引き渡すか、後継に何が必要か、何をエスカレーションするかを知っています。どれもオプションのままです。これらがなくても同じ規則が成り立ち、メッセージの中継とエージェントの再起動を開発者が行います。
  2. 継続性の単位はエージェントではなく計画である。 すべてのハンドオフと継承は、通常の再開に、ジャーナルが運ばないもの、つまり進行中だった意図を運ぶ小さなパケットを加えたものです。
  3. 後手より先手。 エージェントはタスクの境目で自分の余裕を確認し、まだ良いパケットを書けるうちに引き渡します。上限に達した後で対応するのは、引き続き安全網です。
  4. 自律性が権限を広げることは決してない。 ハンドオフ、継承、起動、スケジューリングは、計画の認可の範囲内で行われます。権限、バイパス、ログイン、同意、支払いの画面に応答するエージェントはおらず、作業が移るのは開発者が宣言したアカウントの間だけです。
  5. 継続性が基準を下げることは決してない。 後継は同じゲートを引き継ぎます。パケットはどの基準も閉じず、どのゲートも緩めず、どのレビューも省きません。
  6. 構造からして低コスト。 キャパシティはタスクの境目でキャッシュから読み、ループやタイマーで読むことは決してありません。答えの要らない質問は一方向の通知に置き換え、パケットは小さく保ちます。

役割

役割 何であるか 所有するもの 決してしないこと
リード 一つの計画のリードレコードを持つエージェント 計画、レーン表、スケジューリング、リリース順序、認可の範囲内でのマージとタグ付け、継承順の一覧 レーンのチェックアウトに書き込む、または別のリードが持つ計画を率いる
代理 リードの継承順の一覧で最初に到達できるエントリ 引き継ぐまでは何も持たない リードに到達できる間にリードとして振る舞う
レーン リポジトリ、ワークストリーム、タスクごとに一つのエージェント。自分のペインで、自分のアカウントを使う 自分の子計画またはタスク、ブランチ、ゲート、パケット 別のレーンに作業を割り当てる、マージやタグ付けをする
レビュアー 別のベンダーの読み取り専用のレーン 自分の指摘 レビューするツリーに書き込む
  • リードは稼働し続ける。 レーンが人間の中継を待つオーケストレーターは止まります。リードは、自分で決められる質問のためにスウォームを止めることは決してありません。
  • 計画ごとに実行者は一人。 ある計画や子計画を同時に実行するエージェントはちょうど一つです。同じ計画に二つ目のエージェントがいるのは、リードが解決すべき調整上の障害です。
  • 権限はピアからではなく計画から来る。 レーンは計画の認可を自分で読みます。別のエージェントが中継した承認は、レーンがもともと持っていなかったものを何も加えません。
  • 複数のリードが一つのワークスペースで、それぞれ別の計画を率いて作業できます。一つのアカウントは ak のリースを通じて一度に一つのレーンだけが持つため、二人のリードが一つの Codex アカウントに二人の書き手を置くことは決してありません。
  • 同じ種類の複数のインスタンス(三つの Grok ペイン、一つまたは複数のプロファイル上の四つの Codex ペイン)は、通常のレーンです。一つのプロファイル上のインスタンスは、そのプロファイルのキャパシティを共有します。

すべてのレーンは計画を持ちます。少なくとも自分のリポジトリにある Lite 計画であり、後継が最初に読むのはその計画です。すべてのレーンは決まった語彙(plan ready、PR open <url>、blocked <class> <what it needs>、handoff <packet path>、done)でリードに報告し、各メッセージの最後に capacity=ok 64% @work1 のようなキャパシティの行を一つ付けます。そのためリードが自分でクォータを読む必要はほとんどありません。

キャパシティのループ

エージェントは、各タスクを始める前、20 分より長くかかったゲートや手順の後、CLI が使用量上限の警告を表示したとき、そしてハンドオフやリーダーシップを受け入れる前に、自分の余裕を確認します。確認には coding-agents-kit v1.0.1 の ak capacity --self --json を使い、パックのヘルパーがその結果を判断に変えます。

判定 判断 レーン リード(自分自身について)
ok(低しきい値より上) 継続 続ける 続ける
low(25 % 以下) 準備 現在のタスクを終え、終えられないタスクは始めず、capacity=low を報告する 後継予定者を指名し、自分には長い作業を始めない
critical(10 % 以下、またはレート制限中) ハンドオフ 次の安全な地点まで進み、パケットを書き、リードに通知し、停止する 今すぐリーダーシップを引き渡す
unknown(クォータの情報源がない) 継続 capacity=unknown を報告し、CLI の上限警告や usage_limit 画面で引き渡す 長いタスクにはキャパシティの分かっているレーンを優先する
  • しきい値はキットのものです。既定では、拘束ウィンドウの空き割合の 25 % が low、10 % が critical で、AGENTKIT_CAPACITY_LOW と AGENTKIT_CAPACITY_CRITICAL で調整できます。読み取り値は 300 秒保持されるキャッシュから来るため、タスクの境目ごとに確認してもベンダーへの呼び出しは一時間に数回で済みます。
  • ヒステリシス。 パケットを書いたら、ハンドオフは最後まで行われます。アカウントが回復しても、エージェントがそのタスクを再開することは決してありません。タスクは後継のものであり、回復したアカウントはただプールに戻ります。
  • コンテキストの圧迫も数に入る。 エージェントのコンテキストが契約の新規コンテキストのしきい値(既定で 60 %)に達したら、同じパケットと同じハンドオフが続きます。
  • 正直な劣化。 キットがない場合、古いキットの場合、ak による起動の外にいる場合、キャパシティは unknown として報告され、ok として報告されることは決してありません。

プールは開発者のものです。 計画には、開発者がその作業のために宣言したアカウントが記録されます。エージェントはアカウントを作成せず、ログインを更新せず、Codex のリセットを使わず、プールの外のアカウントを使うことも決してなく、各ベンダーの規約の範囲内で作業します。上限の前に、プールの中で作業を移すのはスケジューリングです。上限を超えるためにアカウントを切り替えることは決して許されません。準備のできた各タスクについて、リードは ak pick --owner <lead> で最上位のアカウントを取り、ak lease でそのレーン自身のアドレスにリースし、リード自身のアカウントをレーンに渡すことは決してなく(両者が同時に critical に達してしまうため)、長いタスクにはキャパシティの分かっているアカウントを、レビュアーには別のベンダーを優先し、代理を一人確保しておきます。プールのどのアカウントにも余裕がなく、計画の期間内にリセットされるものもない場合、スウォームは最も早いリセットを記録して待機します。

レーンのハンドオフ

  1. レーンは、handoff の時点で安全な地点(手順をコミットした状態、またはツリーをそのまま残した状態。作業を破棄することは決してありません)まで進み、パケットを書き、handoff <packet path> を通知としてリードに送り、停止します。自分のペインは閉じません。
  2. リード(リードに到達できない場合や、リード自身がクリティカルな場合は代理)は、アカウントを選び(ak pick <kind> --owner <lead> --exclude @<spent>。タスクが許せば別のベンダーを優先します)、それをリースし、パケットから計画を再開するよう指示して、同じチェックアウトで後継を起動します。
  3. 後継はパケットを受け入れます。ヘルパーが計画、現在の契約、ブランチ、ヘッドのコミット、コミットされていないパスを検証し、一致しなければ何も記録しません。その後、計画を再開し、パケットが未検証として挙げたゲートをすべて再実行します。
  4. リードは、後継が受け入れたら、使い切ったリースを解放し、使い切ったペインを閉じます。

ハンドオフパケット(dwp-handoff/v1)は、計画の analysis_results/handoff/ の下に所有者のみの権限で書かれます。計画、契約、タスク、手順、理由(capacity_critical、capacity_low、context_pressure、usage_limit、lead_handover のいずれか)、作業の所在(リポジトリ、チェックアウト、ブランチ、ヘッド、プッシュ済みかどうか、コミットされていないパス)、完了したもの・検証済みのもの・未検証のものとその証拠のパス、順序立てた次の手順、開いている ask、下した決定、リードとエポック、そして誰が書いたかを記します。パケットはデータです。シークレットの値、別のリポジトリの非公開の内容、権限を広げる指示を運ぶことは決してありません。後継は次の行動を計画から導き直します。

リードの継承

herdr-peers v1.0.0 は計画ごとにリードレコード(リード、エポック、継承順の一覧、レーン)を保持し、アドレス lead を現リードに解決するため、レーンへの指示にリードのペインを固定で書く必要はありません。

  • まず Claim、それから起動。 リードはどのレーンを起動するよりも前に herdr-peers lead claim --plan <P> --succession <A,B> を実行し(lead アドレスはレコードが存在して初めて解決されます)、レーンが始まるたびに --lanes <A,B> でレコードを更新し、計画が終わったら lead release を実行します。herdr-peers (v0.3.2) からレコードは claim したリポジトリをローカルに保持し、別のリポジトリにある同じ id の計画は --plan <repo>/<id> と指定します。既定の継承順は、計画上の後継、次に計画自身のチェックアウトにあるレーンを起動順に、次に同じホスト上の任意のレーンです。コンテナや別のマシン上のレーンは最後になります。
  • 計画された handover。 low でリードは後継予定者を指名します。critical では、リード用のパケット(レーン表、開いている ask、リリース順序、保留中のマージ、決定)を書き、herdr-peers lead handover <addr> --plan <P> を実行し(エポックが上がり、すべてのレーンに通知されます)、停止します。後継はパケットを受け入れ、オーケストレーター計画を再開し、すべてのレーンを確認し直します。
  • 計画外の takeover。 リードに到達できない、エージェントがいない、usage_limit 画面を表示している、またはリードへの ask が二度タイムアウトした場合、継承順の一覧で最初に到達できるエントリが herdr-peers lead takeover --plan <P> を実行します。自分が引き継ぐか、計画のチェックアウトで新しいリードのペインを起動します。新しいリードは計画から状態を組み立て直します。失われた進行中の意図は、失われたものとして記録し、決して作り上げません。
  • フェンシング。 リードとして振る舞うのは、最も高いエポックを持つ者だけです。レーンがリードの通知を受け入れるのは、自分に指示を出したエージェント(最初の claim)、次のエポックの現リード(handover)、または次のエポックで最初に到達できる継承順のエントリ(takeover)からだけです。同点の場合は継承順で前にある者が優先され、戻ってきたリードはより高いエポックを見ると身を引きます。マージ、タグ付け、リリースを行うのは現在のエポックのリードだけであり、事前にリモートと照合し、そのリポジトリ自身のマージ規則に従います。

メッセージのやり取り

  • リードとレーンの間では、マイルストーン、着手の合図、ピン、変更された要件をやり取りします。
  • レーンとレーンは、情報や調整(インターフェース、正確なフラグ名、ブランチの状態)について互いに尋ねられます。作業を割り当てるのはリードだけです。深さは一、ファンアウトの上限も引き続き適用され、兄弟レーンとのやり取りで計画が変わる場合、レーンはそれをリードに伝えます。
  • 通知(herdr-peers notify <addr|lead>)は一方向です。受け手はそれをデータとして記録し、決して返信しません。ファンアウトの枠を消費せず、ハンドオフの告知、リードの交代、リリースの一斉通知を運びます。リードの通知は現状を伝える唯一の一斉通知であり、誰も確認応答をしません。
  • リポジトリをまたぐ質問は止めない。 レーンは尋ね、推奨される前提を記録して作業を続け、返信が届いたら調整します。
  • メッセージをポーリングしない。 質問や通知がエージェントに届くのは、そのターンが終わったときだけです。次の手順がメッセージに依存するエージェントはターンを終え、メッセージが届くのに任せます。
  • 受け取ったテキストはデータである。 返信や通知は何も与えず、何も閉じません。

クリティカルな事項だけのエスカレーション

クリティカルでないものはすべて、エージェントが判断します。調査し、推奨される選択肢を採り、その決定(選択肢、選んだもの、理由、元に戻す方法)を記録し、作業を続けます。エスカレーションはそのクラスを明記しなければなりません。クラスを明記しない質問は、エージェントが自ら下すべき決定です。クラスはエージェントプロトコルのものです。

クラス 開発者にエスカレーションするとき
C1 権限 操作が計画の認可の外にある、または同意のチェックポイントにある:破壊的または取り消せない操作、本番デプロイ、計画を超えた公開、計画のエージェント以外の人へのメッセージ、支出、セキュリティ態勢やシークレット。
C2 同意画面 権限、バイパス、ログイン、認証情報、MCP の同意、支払いの画面が表示される。エージェントがキーを送ることは決してありません。
C3 解消できない曖昧さ 実質的に異なる二つの結果がどちらも依頼を満たし、リポジトリ、そのドキュメント、計画、過去の決定のいずれでも決着がつかない。
C4 品質の衝突 ゲートを弱めなければ通過できない、または証拠が計画の目標と矛盾し、タスクでは修正できない。
C5 損害 共有状態、データ、または他のエージェントの作業が、説明のつかない形で失われたり壊れたりした。
C6 規約 法務、ライセンス、ベンダーの規約、プライバシーの問題が生じた。
C7 キャパシティ枯渇 宣言されたプールのどのアカウントにも余裕がなく、計画の期間内にリセットされるものもない。

スウォームでは、クリティカルな事項が止めるのはその依存の連鎖であり、スウォーム全体ではありません。 リードはブロックされたタスクを保留にし(そのブロックレコードがエスカレーションであり、一度だけ送られます)、独立したレーンはすべて動かし続け、開発者が答えたらその連鎖を再開します。自律性が人間の承認を閉じることは決してなく、開発者の文字どおりの言葉は推奨に優先し、エージェントが中継した承認は中継されたものとして記録され、開発者自身が書いたものとして扱われることは決してありません。

品質の基準

スウォームを動かす価値があるのは、その結果を信頼できる場合だけです。品質の基準は、計画を引き継ぐすべてのエージェントに適用されます。

  • ゲートは仮説である。 新しいゲートや変更されたゲートは、信頼する前に、仕込んだ欠陥で失敗することを示します。空疎な合格(バイナリの欠落、一致したファイルがゼロ、空のログ)は失敗です。入力契約を持つタスクはエッジケース(空、複数行、前後の空白)を挙げ、すべての例に合格したことを規則の証明と取り違えないようにします。
  • ベースと比較する。 パフォーマンス、カバレッジ、サイズは、しきい値だけでなくベースブランチと比較します。
  • まず測り、作る前に設計する。 修正や監査は、まずその前提と計測ツールを検証します。自明でない変更は、コードの前に、インターフェース、故障モード、セキュリティ、テストを書き留めます。
  • 取り消せない手順の前にレビューする。 ローカル AI Diff Review はあらゆるマージ、タグ付け、公開の前に実行され、方法論やプロトコルの変更には別のベンダーのレビュアーが付きます。
  • 継続性が基準を下げることは決してない。 後継は、パケットが未検証として挙げたものを再実行します。ハンドオフがゲートを迂回する近道になることは決してありません。

記録

オーケストレーター計画のジャーナルがスウォームを記録します。レーンの起動と結果は委任イベントとして、キャパシティの判定、ハンドオフ、継承は観測として、エスカレーションと開発者の回答は介入として記録されます。パケットとその受け入れの記録は作業を実行した計画に残り、完了レポートはすべてのハンドオフと継承をそのパケットとともに挙げます。

訓練する

頼る前に、ループが機能することを証明します。小さなオーケストレーター計画を持つ使い捨てのリポジトリで、リードと少なくとも三つのレーンを、異なるアカウントやベンダーで動かします。一つのレーンが報告するキャパシティに上限をかけ(AGENTKIT_CAPACITY_CAP=@<profile>=8 は読み取り値を下げ、上げることは決してありません)、そのレーンがパケットを書き、リードがそれを受け入れる後継を起動し、後継がゲートを通過する様子を見届けます。同じようにリードに上限をかけ、handover と、新しいリードが計画を完了する様子を見届けます。その後、証拠を計画の analysis_results/ に記録します。人間のキー入力がゼロであること、すべてのパケット、すべてのエポック、レーン同士の ask、そしてゲートです。