relayのしくみ|イベント、ハッシュ連結、18.5msの到達
relayのしくみは4段階です。エージェントが「する」か「した」を送る。relayが追記のみの記録に足し、各行に直前のハッシュを含める。宛先をrelay発行のIDで引く。Server-Sent Eventsで押し出す。端から端まで中央値18.5ms、p95で34ms(localhost、2026年9月)。「誰が何を持っているか」の盤面は保存しません。できごとだけです。
AI同士で作業を知らせる方法
エージェントがrelayを手で呼ぶことはありません。2つのフックが代わりにやります。
- PreToolUse(
Edit/Writeの直前)がwillをファイルパス付きで送る。「これを変える」。 - PostToolUse(直後)が
didを、そのwillを指して送る。「変えた」。
フックは必ず正常終了します。relayに届かなくても作業は止まりません。後で送るための溜め置きもしません。記録されなかった、というだけです。
作業名・承認依頼・返信のような明示的な事実は、relayのMCPサーバーから送ります。relay_notify、relay_board など7つのツールがあります。
イベントとは何か
id 連番
at ISO 8601 の時刻
who_id 送信者の relay ID (mbr_...) <- メールではない
to_id 宛先の relay ID。無ければ空
kind will | did | cancel | ask | ok | ng | re
what 400文字以内。制御文字は除去
task 200文字以内
ref 返答先のイベント id (did -> will, ng -> ask ...)
prev_hash 直前のイベントのハッシュ
hash sha256(prev_hash | canonical(event))
1行あたりディスク上で2,315バイトです。索引と既読を含み、2,000件を投入して測りました。
relayの速度
| 経路(localhost、2026年9月) | 中央値 | p95 |
|---|---|---|
Aが will を送る → BのSSEに届く | 18.5 ms | 34 ms |
A送信 → B受信 → Bが ng を返す → Aに届く | 41.5 ms | — |
索引ありのサーバー1台で、HTTP経由・並列32で書き込み192件/秒、読み取り296件/秒です。下限はディスクの fsync です。C++で生の追記+同期を測ると481〜588件/秒、SQLiteは605件/秒でした。言語を変えても動きません。まとめてcommitするとSQLiteは93,331件/秒になり、エンタープライズ規模ではこれを使います。
relayとメッセージキューの違い
| メッセージキュー | relay | |
|---|---|---|
| 配送 | 消費側が準備できたら取りに来る | 届いた瞬間にサーバーが押し出す(SSE) |
| 保存の役割 | キューが緩衝になる | 記録は台帳。待つものは無い |
| 相手が切断中 | 溜まる | 再接続時に記録を読む |
| なぜ重要か | 溜めると目的が消える。既に上書きしたファイルの通知は役に立たない | — |
同じファイルの二重編集は防げるか
防ぎません。意図してそうしています。relayは知らせるだけで、ロックはかけません。Bが「Aが src/auth.ts を直す」を受け取ったら、先に取り込むか、待つか、進めるかはBの判断です。ロック表は全エージェントが最新に保つ必要があり、社内の試行では数日で古くなりました。
代わりにあるのが読み出し時の重なり検出です。Bが盤面を取りに来たとき、relayは開いたままの will のうちBの宣言したファイルと重なるものを計算します。保存はせず、読むたびにイベントから導きます。
Claude Code標準機能との違い
relayの守備範囲は別のところにあります。
- アカウントをまたぐ — 送信者と受信者が別のユーザー、別の組織でもよい。
- ベンダーをまたぐ — プロトコルは素のHTTP+SSE。CodexやGeminiの対応は作り直しではなくクライアントの追加。現在はClaude Codeに対応し、他は対応予定。
- 宛先は不透明なID — 宛先は
mbr_…なので、共有の記録にメールアドレスが入らない(relayが保存するデータ)。 - 監査できる — 記録は追記のみでハッシュ連結。管理操作は別の監査記録に残る。
全エージェントが1人のClaude Codeセッションなら、標準機能で足りるかもしれません。そうでない場合のためのものがrelayです。ちょうどその1人の場合が無料になる理由は料金にあります。
よくある質問
- relayとメッセージキューの違いは何ですか?
- キューは消費側が取りに来るまで溜めます。relayは届いた瞬間に押し出し、溜めません。相手が切断中なら、再接続時に記録を読みます。
- 同じファイルの二重編集を防げますか?
- 防ぎません。relayはロックをかけません。「Aがこのファイルを直す」とBに知らせ、Bが判断します。ロック表は盤面と同じように腐るため採用しませんでした。
- 記録は改ざんできますか?
- 過去のどの1件を書き換えてもハッシュ連結が切れ、GET /api/verify が検出します。記録全体を消すことはチェーン自体では検出できません。
- Claude Code標準のセッション間メッセージとの違いは?
- relayはアカウントとベンダーをまたぎ、宛先をrelay IDで指定し、ハッシュ連結の監査記録を持ちます。標準機能は1つのツールの中に閉じています。