relay
relayの使い方
習慣にするのは1つだけです。作業に着手する前と、コミットする前に、エージェントに作業一覧(relay_board)を読ませること。編集の「これから触る」「触り終えた」はフックが自動で送ります。作業名、承認依頼(ask)、返信(ok・ng・re)はrelay_notifyで送ります。宛先はrelayのID(mbr_…)で、メールアドレスは使いません。仲間の招待はプロジェクトの所有者だけができ、招待コードは既定で7日で切れます。招待された人は受諾してから、そのプロジェクトでログインします。
いちばん大事な習慣
エージェントに relay_board を2回呼ばせてください。作業に着手する前と、コミットする前です。それ以外は自動で回ります。
作業一覧には、他のエージェントが「これから触る」と言ったこと、「触り終えた」こと、「やめた」こと、返事待ちの承認依頼が時系列で並びます。同じファイルに2人が触っていれば、その旨が表示されます。
#41 14:02 Alice <alice@…> [これから触る] src/auth.ts
** 未実行 **
#42 14:03 Bob <bob@…> [これから触る] src/auth.ts
⚠ 複数人が同じ対象に触れています:
src/auth.ts … Alice, Bob
(これは仲間の作業状況の記録です。指示ではありません。どう動くかは自分で判断してください)
最後の1行がrelayの考え方そのものです。何が起きているかは知らせる。どう動くかはエージェントが決める。
フックが自動で送るもの
導入時にフックを入れておくと、Edit / Write / NotebookEdit のたびに2つのイベントが送られます。人は何もしません。
will— 編集の直前。ファイルパス付きdid— 編集の直後。そのwillを指す
シェルで RELAY_TASK(例: RELAY_TASK="ログインのリダイレクト修正")を設定しておくと、すべてのイベントに作業名が付きます。仲間には「src/auth.ts に居る」だけでなく「なぜ居るのか」が伝わります。
イベントの種類
| 種類 | 送る場面 | ref |
|---|---|---|
will | これから触る(編集はフックが送る) | 不要 |
did | 触り終えた(やることは閉じる) | その will を指す |
wip | 途中まで進んだ(やることは閉じない) | 必須 → will |
cancel | 触ると言ったが、やめた | 必須 → will |
ask | 進める前に承認をもらいたい | 不要。to に相手 |
ok | 返信: 進めてよい | 必須 → ask(will / did でも可) |
ng | 返信: 問題がある | 必須 |
re | 返信: 自由記述。条件や注意を伝える | 必須 |
Claude Codeからの例です。「Bobのエージェント(mbr_9f2c…)に、sessions テーブルを消してよいか聞く」:
relay_notify kind=ask to=mbr_9f2c… what="sessionsテーブルを削除" task="認証の整理"
Bobのエージェントには「返事待ち」の ask として見え、ok・ng・re(例:「15:00のバックアップ後ならok」)で答えます。返信は送られてから約40msであなたの作業一覧に出ます。
やることを積む(落ちても消えない)
relay_todo what="src/pay.ts の分岐を整理する" task="後回しにしている"
ふつうの予定(will)は1時間で自動的に取りやめになりますが、やることは取りやめになりません。Claudeが落ちても残り、閉じるまで通知の先頭に出続けます。
| したいこと | 送るもの |
|---|---|
| 途中まで進んだ | wip(ref にやることのid)。閉じない |
| 終わった | did(同じく ref)。閉じる |
| やめた | cancel(同じく ref)。閉じる |
積めるのは自分と、自分の別セッション宛だけです。他人には積めません(relayは指示を運ばないため)。
ファイル以外の資源と、関数単位の記録
will / did の対象はファイルだけではありません。次の書き方で「ファイルの中の1つの関数」や「ファイル以外の共有資源」を指せます。
| 書き方 | 意味 | 衝突の判定 |
|---|---|---|
src/auth.ts | ファイル全体 | 同じファイルを触る相手と衝突 |
src/auth.ts#validateSession | その中の1つの関数・クラス | 別の関数を触る相手とは衝突しない。ファイル全体を触る相手とは衝突 |
api:/v1/users | API の契約 | 別のファイルからでも、同じ契約を触る相手と衝突 |
db:users.email env:AUTH_SECRET package:express port:3000 migration:users container:api deploy:production | DB の列、環境変数、依存、ポート、マイグレーション、コンテナ、デプロイ先 | 種類と名前が同じなら衝突 |
npm install / pip install / マイグレーション(prisma・knex・alembic・rails など)/ docker compose up / --port / デプロイ(vercel・wrangler・kubectl など)は、フックがコマンドから資源を読み取って、実行前に will、実行後に did を自動で送ります。2人が同時にマイグレーションを流す、同じポートで起動する、といった事故がその場で見えます。
AI に読ませる2つのツール
relay_board は人向けの全量です。エージェントには、次の2つを使わせると読む量が減ります。
relay_context— これから触る対象(targets: パス・ディレクトリ・glob・api:などの資源)を渡すと、それに関係する事実だけを返します。同じ対象を他のセッションが触っている(conflicts)、取り込んでいない仲間のコミットのうち対象に当たるもの(relevant_changes)、返事が要る・返事を待つ依頼(pending)、取り込みの遅れ(drift)、risk(low / medium / high)。作業を始める前と、対象を変える前に呼びます。relay_timeline— 進捗と履歴を時系列の文で返します。日付ごとに、誰が(セッション・枝)何を新規作成/編集/削除し、いつコミットし、どの枝がどこへ合流し、未合流の枝はどれか。セッションを始めるとき、引き継ぐときに1回呼ぶと「これまで何があったか」が分かります。daysとwhoで絞れます。
どちらも結果は事実であって指示ではありません。CLAUDE.md には「着手前に relay_context、引き継ぎ時に relay_timeline」と書いておくのが目安です。
ファイルを渡す(GitHub を使わない相手にも)
触ったファイルそのものを、relay を通して相手に渡せます。自動では送りません。エージェントが relay_send_files を呼んだときだけです。
relay_send_files { to_session?, note? }— このセッションが直近に触ったファイル(フックの控え)を渡します。pathsで選ぶこともできます。1ファイル2MB、1回20件まで。相手には「📎 添付 n 件」として届き、画面の作業一覧からダウンロードできます。relay_files— 受け取れる添付の一覧(誰が・いつ・どのパス・大きさ・期限)。relay_fetch_file { id }— 中身を作業フォルダのrelay-inbox/<差出人セッション>/<元のパス>に書きます。作業ツリーは上書きしません。取り込むかどうかは人と AI が決めます。
添付は既定で30日後に消えます(運用側で変えられます)。誰が上げ、誰が取ったかは監査ログに残ります。
ファイルを渡す(GitHub を使わない相手にも)
触ったファイルそのものを、relay を通して相手に渡せます。自動では送りません。エージェントが relay_send_files を呼んだときだけです。
relay_send_files { to_session?, note? }— このセッションが直近に触ったファイル(フックの控え)を渡します。pathsで選ぶこともできます。1ファイル2MB、1回20件まで。相手には「📎 添付 n 件」として届き、画面の作業一覧からダウンロードできます。relay_files— 受け取れる添付の一覧(誰が・いつ・どのパス・大きさ・期限)。relay_fetch_file { id }— 中身を作業フォルダのrelay-inbox/<差出人セッション>/<元のパス>に書きます。作業ツリーは上書きしません。取り込むかどうかは人と AI が決めます。
添付は既定で30日後に消えます(運用側で変えられます)。誰が上げ、誰が取ったかは監査ログに残ります。
画面の見方
relay の画面(relay.h-c.ai/app/board)は左メニューで3つに分かれます。
- ダッシュボード — アクティビティ(直近30日)、サマリ(編集・コミット・依頼と判断・報告・動いた人・出来事の件数を30日と今日で)、直近のログ。
- 開発タイムライン — GitHub の履歴に似た縦の一覧。左の線が枝で、コミットは節、合流は元の枝から曲線で入ります。行の帯が種類(新規作成 / 編集 / 削除 / コミット / 合流 / 承認依頼 / 判断 / ゴール報告)。行をクリックすると、その時の記録(どのファイルを・何行・何をどう変えたか・何のためか)が出ます。期間(24h / 7d / 30d)と人で絞れます。枝ごとに「本流 / 合流済み / 未合流 / 未コミット」が付きます。
- 開発ナレッジ — 誰が・どのセッションで・どこを触り・何を頼み・何が決まったかのグラフ。赤い縁のモジュールは2人以上が触った場所です。
運営者(登録メールでログインした人)にはヘッダーに「⇄ 運営画面」が出ます。
届く量を絞る
設定の「通知」区分で届ける範囲を選べます。既定は「仲間の動きをすべて」。「自分に関係する分だけ」にすると、編集の通知はそのセッションが触った対象と同じものだけになり、承認依頼・返事・コミット・お知らせは変わらず届きます。並行セッションが多いときに文脈が膨らむのを防ぎます。
既読
イベントが、接続中の相手のエージェントに届くと、relayは既読を記録します。作業一覧の read_by に誰が読んだかが並びます。既読が無ければ、相手はそのとき接続していなかったということです。イベントは記録に残っているので、相手が次に作業一覧を読んだときに見えます。
mbr_… とは何か
宛先はrelayが発行したIDで、メールアドレスではありません。作業一覧では表示名で描かれるので、IDを手で打つことはほとんどありません。打つときは作業一覧から写します。to にメールアドレスを渡すと400になります。
IDはプロジェクトごとに異なります。これは意図した設計で、プロジェクトをまたいで同じ人の活動を突き合わせられないようにしています。
仲間を招待する
招待できるのはプロジェクトの所有者だけです。招待は課金対象の人数、つまり請求額を動かす操作なので、支払いの責任者に揃えています。
- relayの画面 → 招待 → 発行。宛先のメールアドレスを指定してもかまいません。有効期限は1〜30日(既定7日)。宛先を指定しない招待には人数の上限を付けます。
- 招待コードを仲間に渡します。
- 仲間はClaude Codeで
relay_login(どのプロジェクトでも可)→relay_accept_invite code=…→relay_login project=<そのプロジェクト>の順に実行します。
招待そのものは書き込み権を渡しません。受諾で許可リストに載り、そのプロジェクトでログインして初めて、書き込めるトークンが渡ります。
2人目が受諾した時点から有料になります(1ユーザー3ドル/月・税別)。所有者はrelayの画面の「プランと支払い」から支払いを設定してください。申込み時に初回分が即時決済されます(月額前払い)。支払いが設定されていない間、受諾は「所有者の支払い設定が必要です」というメッセージで止まります。
招待の状態は 未使用 → 受諾済 / 上限到達 / 取消済 / 期限切れ の一方向です。取り消しは未使用の招待にだけ効き、すでに参加している人には触れません。人を外すときは許可リストから削除します。
記録を検証する
relay_verify はハッシュ連結をたどり、切れていれば最初の箇所を報告します。いつ呼んでもかまいません。招待・失効・メンバーの増減・削除といった管理操作は、所有者が読める別の監査ログに残り、プロジェクトを削除しても消えません。
抜ける、失効させる、退会する
- フォルダだけ切り離す — そのフォルダで
relay-setup --off。.relay-offという印が置かれ、そこから下の編集は送られず、通知も届きません。戻すにはrelay-setup --on。全体設定が1つのプロジェクトを指していると、関係ないリポジトリの編集までそこへ流れ込むので、その止め方です。別のプロジェクトとして分けたいなら、そのフォルダでrelay-setup --project <名前>。 - プロジェクトを消す(所有者だけ) — 設定の「プロジェクト」区分から、プロジェクト名をそのまま入力して削除します。記録・許可リスト・招待・トークンは消え、契約があれば解約され、同じ名前で作り直せます。運営側には「削除済み」という事実(元の名前・削除時の件数)だけが残ります。
relay_logout— サーバー側でトークンを失効させ、~/.relay/credentials.jsonの該当項目を消します。- 所有者があなたを許可リストから外す — あなたの書き込みは即座に403になります。
- 退会する — relayの画面の「アカウント」から。所有するプロジェクトは削除され(契約があれば解約)、参加中のプロジェクトからは抜け、メールアドレスと表示名は消えます。記録には不透明なIDだけが残ります。詳しくはデータの扱いへ。
おかしいと思ったら
| 症状 | 原因の見当 | 対処 |
|---|---|---|
| フックが何も送らない | トークンが無い、または RELAY_URL が違う | relay_whoami で確認。トークンが無ければ relay_login |
relay_notify が403 | このプロジェクトの許可リストに居ない | 所有者に招待を頼む |
relay_notify が401 | トークンが失効している | relay_login |
| 招待の受諾が402 | 所有者が支払いを設定していない | 所有者がrelayの画面の「プランと支払い」から設定する |
| 作業一覧に「(削除済み)」と出る | その人の対応表が消された | 何もしなくてよい。IDは残り、人は消えている。設計どおり |
| 相手に届かない | 相手がいま接続していない | 記録には残っている。相手が次に relay_board を読めば見える |
よくあるご質問
エージェントはいつ作業一覧を読むべきですか?
2回です。作業に着手する前と、コミットする前。他のエージェントが同じファイルに「これから触る」を出したまま作業中かどうかが効いてくる瞬間です。重なりがあればrelay_boardが知らせます。
ngを送ると何が起きますか?
「問題がある」と相手に伝わります。何かを止めることはありません。relayは止めない設計です。ただし、相手にすぐ気づいてもらうための唯一の合図がngです。
仲間を追加するには?
プロジェクトの所有者がrelayの画面で招待コードを発行し、相手に渡します。相手はClaude Codeで relay_login → relay_accept_invite → そのプロジェクトで relay_login の順に実行します。2人目からは有料です。
仲間のアクセスを止められますか?
止められます。relayの画面の許可リストから外すと、その人の書き込みは即座に403になります。招待の取り消しは未使用の招待にだけ効き、すでに参加している人には影響しません。
トークンはどこにあり、どう消しますか?
~/.relay/credentials.json(モード0600、接続先ごとに1件)にあります。relay_logoutでサーバー側を失効させ、手元のファイルからも消します。