コンテンツにスキップ

Events

Reyn はすべての状態変化に対して構造化イベントを発行します。完全なイベントログは JSONL で、.reyn/events/<run_id>.jsonl に書き込まれ、reyn events <log_file> でリプレイ可能です。

Kind vocabulary

type フィールドは閉じた集合から取られます。reyn が発行する kind はすべて列挙されており、それ以外は発行しません。したがって購読側は受け取りうる type の全体を列挙でき、リストに無い kind 向けに書いたハンドラは決して発火しません。

SSoT は src/reyn/core/events/event_schema.pyAUDIT_EVENT_KINDS で、発行側コードと英語版ページの双方に対して CI が双方向に一致を検査します。

完全な列挙は 英語版 events リファレンス にあります。 列挙をこのページに複製すると二重管理になり、CI が検査するのは英語版だけなので、この日本語ページの複製だけが静かに古くなります(本 issue #3410 が扱った欠陥そのもの)。列挙は 1 箇所だけに置きます。

この集合が表さないものが 2 つあります:

  • op の値ではありません。 read_file / write_file / grep などは、共有 kind tool_executed の中の op フィールドの値であって、独立した kind ではありません。別の軸であり、この語彙には含まれません。
  • フィールド契約ではありません。 ある kind がどのペイロードフィールドを必須で持つかは別のレジストリ(同モジュールの EVENT_AUDIT_REQUIREMENTS、この語彙の部分集合を対象)で、以下の節が散文で説明しています。

イベントエンベロープ

すべてのイベントは以下を持ちます:

{
  "type": "<event_kind>",
  "timestamp": "2026-04-30T10:00:00.123456+00:00",
  "data": {
    ... // kind 固有のペイロード。発行元の EventLog が設定されていれば
        // agent_id / run_id を含むことがある(下記参照)
  }
}

Agent ID フィールド(全イベント共通)

reyn.yamlagent_id が設定されているセッションから発行されるすべてのイベントのペイロードには、自動的に agent_id フィールドが付与されます。デフォルト値は reyn/<hostname> です。これにより、SOC2 / ISO 27001 / METI v1.1 要件に準拠した RBAC およびマルチエージェント監査証跡が実現されます。

詳細は コンセプト: マルチエージェント の「Agent ID 伝播」を参照してください。

LLM とコンテキスト

種類 主要なペイロード
llm_called phasemodelinput_tokensoutput_tokenslatency_ms

Control IR

各 Control IR op の種類は独自のイベントを発行します:

種類 タイミング
read_filewrite_fileedit_filedelete_fileglob_filesgrepregenerate_index file op のバリアント — すべて tool_executedop=<sub_op>)経由
sandboxed_exec_startedsandboxed_exec_completed sandboxed_exec op — started: argvargv0_resolvedbackend; completed: argvargv0_resolvedbackendreturncodedenial_classargv0_resolved(#2820)は実際に実行された絶対パス: version-manager shim(~/.pyenv/shims/python3)は manager の on-disk layout をデータ読取して実バイナリに解決される(part A — filesystem-only、subprocess なし)ため、sandbox は shim ではなく実バイナリを直接実行する(shim の launch-fork()(deny process-fork) 下で死ぬ)。非 shim コマンドでは PATH 解決結果に等しく、解決不能時は argv[0] のまま(fail-open)。denial_class(deny process-fork) 下で PATH 上の launcher/shim(pyenv/asdf/mise/npx/uvx)の内部 fork がブロックされたとき "fork_denied"、それ以外は null — ツール失敗ではなく環境/設定の問題
mcp_calledmcp_completedmcp_failedmcp_cancelled MCP ツール op — mcp_cancelled(#2813)は Ctrl-C の cancel_event が実行中の呼び出しを完了前に中断したとき、mcp_completed/mcp_failed の代わりに発火
mcp_server_installed mcp_install op — name、キー名のみ(値は含まない)
mcp_install_cancelledmcp_prompt_get_cancelledmcp_resource_read_cancelledmcp_resource_subscribe_cancelledmcp_resource_unsubscribe_cancelled #2813 — Ctrl-C の cancel_event が該当 op(install probe / get-prompt / read-resource / subscribe / unsubscribe)を完了前に中断。op は status:"cancelled" を返し、何もコミットされない
web_search_startedweb_search_completedweb_search_failed web_search op — started: querybackend; completed: result_count を追加; failed: error を追加
web_fetch_startedweb_fetch_completedweb_fetch_failed web_fetch op — started: url; completed: urlstatus_codecontent_lengthextractor; failed: urlstatus"timeout" または "error")、error
semantic_search_embed_failed semantic_search op(FP-0057 Phase 2a; recall から rename)— モデルグループの embed 呼び出しが失敗したとき: querymodelerror
index_dropped index_drop op — sourcechunks_dropped: int
control_ir_skippedcontrol_ir_failed ディスパッチ失敗(control_ir_skipped の理由には handler_not_implemented を含む)
permission_denied op がリゾルバーに拒否されたとき

MCP

上記の Control IR の mcp_* イベント(ツール呼び出し op に紐づく)とは異なり、これらは op ディスパッチとは独立に、MCP 接続 / receive-loop から非同期に発行されます:

種類 トリガー 主要なペイロード
mcp_initialized (再)接続のたびに、サーバーの initialize ハンドシェイクが完了した時点で発行。 servernegotiated_versioncapabilities
mcp_resource_updated 購読中の resource のサーバープッシュ resources/updated 通知、またはトランスポート断からの reconnect 後に再購読された URI ごとに発火する合成 resync。フックディスパッチャーにも外部イベントフックポイントとして配線されています — コンセプト: フック 参照。 serveruriresync(reconnect resync なら true、実際のプッシュなら false
mcp_elicitation_requested サーバーが elicitation/create 構造化入力要求を発行。 serverfield_keys(要求されたスキーマのプロパティのみ — 値は決して含まない)
mcp_elicitation_answered 要求が accept または decline に解決される(人間の選択、または auto_decline 設定による decline)。 serverfield_keysaction"accept" | "decline"
mcp_elicitation_timed_out elicitation_timeout_seconds までに回答が届かなかった。 serverfield_keys
mcp_elicitation_auto_declined プロンプトせずに decline された — reason はサーバーが elicitation: auto_decline を設定している場合とヘッドレスコンテキスト(ライブの介入リスナーが無い)を区別する。 serverfield_keysreason"server_configured" | "headless"

これらのイベントはいずれも、人間が入力した回答やフィールドのを一切含みません — 要求されたスキーマのプロパティ名のみです。コンセプト: MCP § Elicitation で説明されているセンシティブフィールドの扱いと一致します。

クレデンシャルと OAuth

種類 トリガー 主要なペイロード
token_refreshed reyn.secrets.get_valid_token(key) がプロバイダーのトークンエンドポイント(RFC 6749 §6)に対して OAuth リフレッシュに成功した後に発行されます。 key: str — OAuth トークンキー(~/.reyn/oauth_tokens.json エントリと同じ); expires_at: str — 新しいアクセストークンの有効期限の ISO-8601 タイムスタンプ。
token_refresh_failed get_valid_token がトークンエンドポイントから非 2xx レスポンスを受け取るか、レスポンスペイロードが不正な形式の場合に発行されます。OAuthRefreshError を raise します。 key: str; error: str — 短いエラー説明(HTTP ステータス + 利用可能な場合はプロバイダーエラーコード)。

注記: - token_refresh_failedtoken_refreshed とペアになります — ネットワークリフレッシュを実行する get_valid_token 呼び出しごとに、どちらか一方のみ発行されます。

関連情報: コンセプト: シークレット処理 — OAuth ライフサイクルとクレデンシャルスコープ; コンセプト: パーミッションモデル — スキルごとのクレデンシャルスコープ。

アクションカタログルーティング

種類 トリガー 主要なペイロード
routing_decided router の単一ディスパッチ関門(RouterLoop._dispatch_resolved)で、カタログアクションがディスパッチされるたびに発行されます — invoke_action ラッパー経由、ARS-salvage された直接呼び出し、あるいは(#3455)reyn.yaml で tool_use.universal_wrappers_enabled: falseaction_retrieval: から移動、#4552 PR-3+4)を設定した場合のフラットな bare-name ディスパッチパスのいずれでも。 action_name: str; source: str"invoke_action" | "ars_direct"; outcome: str"success" | "error"; chain_id: str — クロスコール相関用リクエストチェーン識別子。

注記: モデルがどの入口を使ったかによらず、カタログアクションのルーティングを監査できます(#3455: 以前は invoke_action ラッパー経由にのみ紐づいており、universal_wrappers_enabled: false の opt-out 構成ではこのイベントが一度も発行されませんでした)。chain_id を使って、アクションのダウンストリームイベントとのクロスコリレーションが行えます。

ユーザーインタラクション

種類 タイミング
user_message_received 新しいユーザーターンがランタイムに入ったとき。chain_idsubmit_user_text がミントし、このターンが生成するすべての agent 間メッセージに伝播される uuid)を持つ
user_intervention_received ask_user op が回答を受け取ったとき
chat_startedchat_stopped chat セッションのライフサイクル

agent 間メッセージング

種類 タイミング 主要なペイロード
agent_message_sent _send_to_agent または _send_agent_response がペイロードを届けたとき kind=agent_request\|agent_responsefrom_agentto_agentdepthchain_id
agent_request_received 受信 agent が受信トレイから agent_request を取り出したとき from_agentdepthchain_id
agent_response_received 発信元 agent が受信トレイから agent_response を取り出したとき from_agentdepthchain_id
agent_message_refused 送信が拒否されたとき(例: safety.loop.max_agent_hops を超えた) reasonto_agentdepthchain_id
chain_timeout 保留中のチェーンが safety.timeout.chain_seconds を超え、上流の合成エラーレスポンスで強制解決されたとき chain_idwaiting_on(返信していなかった agent のソート済みリスト)、timeout_secondsorigin_agent

chain_id は uuid4 hex。トップレベルのユーザー送信ごとに 1 つ、すべてのホップを通じて変更されずに伝播します。クロス agent の再構築は各 agent の events.jsonlhistory.jsonl に対する grep <chain_id> です。

Workspace

種類 タイミング
workspace_updated 任意の artifact が書き込まれたとき
tool_executed 汎用ツールディスパッチ

リプレイ

reyn events .reyn/events/<run_id>.jsonl

保存されたログをライブランと同じフォーマットでコンソールに再レンダリングします。LLM は再呼び出しされません。リプレイは検査のみを目的としています。

すべてがイベントである理由

「すべての状態変化が発行する」から 2 つの帰結が生まれます:

  • 再現性。 保存されたログは実行の完全な記録です。将来のチェックポイント/再開の設計(ロードマップ参照)はこれに基づいて構築されます。
  • ボルトオンなしの Observability。 個別のロガー、トレーサー、テレメトリフックなし。同じチャネルがデバッグ出力、リプレイ、(将来的には)eval アナリティクスを動かします。

関連情報