一つのアイコンが引き起こすボトルネック
激しいコーディングセッション中の画面を想像してみてください。あるターミナルタブでは、Claude CodeがReactコンポーネントのリファクタリングを行っています。別のタブでは、CodexがPythonモジュールを書き換えています。3つ目のエージェントはユニットテストを生成しており、4つ目はAPIキーを待機し、5つ目はバックグラウンドでのリンター実行を終えたばかりです。あなたのメニューバー(あるいは使用しているシステムトレイ)には、ステータスアイコンを表示するスペースが、正確に一つしかありません。たった一つの小さなドットやラベルが、エージェントの群れ全体を代表することになります。問題は、どのセッションがその場所を得る権利があるか、ということです。
安易な答えは、最後に動いたセッションを表示することです。それは合理的に感じられます。何かが起きたのだから、それを上に表示する。しかし、その直感は間違っており、代償を払うことになります。バックグラウンドのファイルウォッチャーがタイムスタンプを更新したとしても、それは助けを求める叫びではありません。一方で、10分前に権限エラーに遭遇したセッションは、あなたが「yes」と入力したりパスを修正したりするのを待ったまま、目に見えない状態で放置されている可能性があります。もし最新性でランク付けしてしまうと、まさにあなたの思考を必要としているものを隠してしまうことになります。必要なのは、アクションの必要性(actionability)によるランク付けです。
なぜ最新性が失敗するのか
開発者がタイムスタンプに頼るのは、それが簡単だからです。あらゆるシステムがタイムスタンプを生成し、あらゆるデータベースがそれをインデックス化しており、ソートはコード一行で済みます。しかし、複数の独立したワーカーをオーケストレーションし始めると、その「簡単さ」は役に立たなくなります。
具体的な失敗例を挙げましょう。セッション5がログの一行を追加しました。これは、その依存関係ウォッチャーが node_modules 内のファイル変更を検知したためです。そのタイムスタンプは「現在」に更新されました。しかし、セッション2は3分前にあなたに質問を投げかけていました。「このパッケージをインストールしますか? (y/n)」。あなたはまだ回答していません。もしメニューバーが最新のセッションを表示する仕様なら、セッション5が緑色の光を放ち、セッション2はリストの奥へと消えてしまいます。何も壊れていないように見えます。しかし、実際には、あなたが自分を必要としないリンターの監視に忙しくしている間、エージェントの一人はあなたの決断待ちで停止しているのです。
最新性は「動き」を測定しますが、緊急性は「意味」を必要とします。ファイルの書き込みは、それがあなたにとってのタスクにならない限り、本質的な意味を持ちません。一方で、待機中のプロンプトは、純粋なアクションの必要性そのものです。バックグラウンドで物事が変わるのを眺めているだけでは、コードをリリースすることはできません。ブロッカーを解消することによって初めて、リリースができるのです。思考の転換はシンプルです。タイムスタンプを、決して主要なシグナルとしてではなく、同点決勝(タイブレーカー)として扱うことです。
まず分類し、次にソートする
より良いアプローチは、2段階のフィルタリングです。第一に、すべてのセッションに対して「あなたから何を必要としているか」に基づいてラベルを付けます。第二に、それらのラベルをランク付けします。2つのセッションが同じラベルを共有している場合にのみ、時計を確認します。
これにより、ワークフロー内における「緊急」の真の意味を定義せざるを得なくなります。レート制限がかかったセッションは緊急ではありません。それは「眠っている」状態です。稼働中のセッションは忙しいですが、意思決定を必要としないのであれば、静かに計算を続けることができます。停止したセッションは緊急です。なぜなら、エラーは放置すれば問題が深刻化するからです。未回答のハンドオフ(引き継ぎ)も緊急です。なぜなら、次のステップの所有権は文字通りあなたにあり、あなたが行動を起こさない限りエージェントは進めないからです。
分類を行うことで、メニューバーはニュースフィードからタスクリストへと変わります。そして、ランク付けのステップは機械的なものになります。あなたはすでに「停止中のワーカーは、稼働中のワーカーよりも優先される」と決めています。また、「見落としている質問は、既知の質問よりも優先される」とも決めています。時間という要素が登場するのは、2つのセッションが同じ優先度で助けを求めている場合に限られます。その時、そしてその時に初めて、古い方のセッションが優先されます。これは「先着順」の公平性を保つための小さな慈悲ですが、決して状態そのものを上書きすべきではありません。
実践的な優先度スケール
Agent Island v1.7.1において、チームはこの考え方を、複数のAIセッションを実行する誰もが利用できる5段階のスケールとして形式化しました。
- 未確認の要対応: 4. セッションが何かをあなたに返したが、あなたはまだそれに気づいていない。次のアクションの所有権はあなたにある。
- 停止中: 3. セッションがエラー、権限エラー、またはその他のブロッカーに遭遇した。自己修復ができないため、あなたの確認が必要。
- 実行中: 2. セッションがアクティブに計算を行っている。あなたを待っているわけではないため、他に緊急の事項がない場合にのみアイコンが表示される。
- 確認済みの要対応: 1. プロンプトや質問にはすでに気づいているが、まだ回答していない。認識はしているため、未確認の割り込みよりも緊急度は一段下がる。
- アイドルまたはレート制限中: 0. セッションは背景音のようなものである。順番を待っているか、単に何もしていない状態。
このスケールは、ユーザーのアクションに明確に対応しています。ハンドオフを完了させると、セッションは「実行中」または「アイドル」に下がります。実行中のセッションがエラーを起こすと、「停止中」へと跳ね上がります。プロンプトを承認するためにクリックしたが、まだ...
