トレースと監査
ワークスペースが行うすべてのリクエスト — エージェントによる LLM プロバイダーへの呼び出し、パッケージのダウンロード、kubectl と aws のトラフィック、通常の Web フェッチ — は、Bromure Agentic Coding のホスト側 MITM プロキシを通過します。プロキシはすでにそのワイヤ境界に立っているため、そこを横断したものを記録できます。エージェントがどのホストに接続したか、何を送信したか、何が返ってきたか、いずれかの認証情報が入れ替えられたり漏洩したりしなかったか、そして — AI トラフィックについては — モデルが駆動した会話、ツール呼び出し、シェルコマンドの全体を記録します。
その記録がワークスペースのセッショントレースです。これはただ一つの理由のために存在します。それは、事後に「エージェントは実際に何をしたのか」を — 個々のプロンプト、個々の rm -rf、個々の送信リクエストのレベルまで — 答えられるようにするためです。すべては Mac 上に記録され、保存時に暗号化され、(個人ユーザーの場合)決して Mac の外に出ることはありません。
この章ではシステム全体を扱います。トレースが何を捕捉するか、どのように保存され期限切れになるか、トレースインスペクタウィンドウ、bromure-cli trace コマンドライン、データを取り出す方法、そしてローカル監査と、登録済み Mac が組織にストリーミングするテレメトリとの間のプライバシー境界についてです。ペインのフィールドごとの設定リファレンスはトレース設定にあります。
トレースが記録する内容
トレースはワークスペースごとに、ワークスペースを編集ウィンドウのトレースペインにあるセッショントレースピッカーで制御されます。4 つのレベルがあり、それぞれが前のレベルのスーパーセットになっています。
| レベル | 記録される内容 |
|---|---|
| オフ | 何も記録しません。 |
| アクティビティのみ | リクエストごとに 1 件のメタデータレコード — 本文は記録しません。 |
| AI リクエストの詳細(デフォルト) | すべてのリクエストのメタデータに加え、既知の LLM ホストについては完全なリクエストおよびレスポンス本文。 |
| すべて | すべてのリクエストのメタデータに加え、すべてのホストの本文。 |
新しいワークスペースはデフォルトで AI リクエストの詳細になっているため、無関係なトラフィック(パッケージのダウンロード、テレメトリの ping)の本文をディスクに保存することなく、エージェントの会話をそのまま監査できます。
メモ: トレースレベルの列挙型はプロファイル形式ではデフォルトでオフになっているため、この設定より前に保存された JSON を持つワークスペースはオフとしてデコードされます。AI リクエストの詳細のデフォルトは、現在のテンプレートから作成されたワークスペースにのみ適用されます。監査が重要な場合は、レベルを意図的に選択してください。
メタデータレコード
アクティビティのみ以上では、プロキシはリクエストごとに 1 件のトレースレコードを書き込みます。すべてのレコードは — レベルに関係なく — 以下のメタデータを保持します。
- タイムスタンプ、ホスト、ポート、HTTP メソッド、パス。
- ステータスコードとレイテンシ。トンネルを開いた
CONNECTからレスポンスまでを計測します。 - リクエストバイト数(認証情報の入れ替えの前に計測)とレスポンスバイト数。
- トークン入れ替えレポート — プロキシが送信時にどの認証情報を置き換えたか(認証情報の入れ替えと漏洩を参照)。
- 認証情報漏洩の警告 — 送信リクエスト内の、Bromure が発行していない bearer 形式のトークン。
- ローカルまたはハイブリッドのモデルルーティング下では、どのバックエンドがそのターンを処理したか(ローカルモデルを参照)。
これは、プロンプトやレスポンスのテキストを 1 バイトもディスクに残すことなく、エージェントがいつ誰と話したかの全体像を再構築するのに十分です。監査証跡 — 接続したドメイン、認証情報の取り扱い、レイテンシ — は必要だが内容は不要という場合は、アクティビティのみを選ぶべきレベルです。
捕捉された本文と解析済み会話
AI リクエストの詳細では、プロキシは既知の LLM ホスト — Anthropic、OpenAI / ChatGPT、Google、Cohere、Mistral、Perplexity、x.ai / Grok、Groq、Replicate、HuggingFace — に加え、ワークスペースがローカルモデルにルーティングする際のローカル推論ホストについて、完全なリクエストおよびレスポンス本文を追加で保存します。すべてでは、本文はすべてのホストについて保持されます。
捕捉された AI 本文は単に保存されるだけではなく、解析されます。トレースインスペクタはそれを会話ビューとしてレンダリングします。システムプロンプト、各ユーザーターン、アシスタントの応答、そしてモデルが出力した構造化ブロックです。これらのブロックこそが、コーディングエージェントのトレースを有用にするものです。
- ツール呼び出し — モデルが生成したすべての
tool_useブロックとその入力。 - シェルコマンド —
Bash/Shellツール呼び出し、すなわちエージェントが VM 内で実行したコマンド。 - ファイルの読み書き —
Read/ViewおよびWrite/Edit/MultiEditツール呼び出しと、それらが操作したパス。
したがって、1 件の AI リクエストレコードは「モデルがこのターンで何をすることを決めたか」 — このファイルを読む、そのコマンドを実行する、この API を呼び出す — に、生の API 本文から解析して答えます。同じ構造は、リアルタイムイベントタップが登録済み Mac 上で監査イベントに変換するものです。
認証情報の入れ替えと漏洩
2 つの認証情報の取り扱いに関する事実がすべてのリクエストで記録され、セキュリティレビューで重要となるため目立つ形で表示されます。
- トークンの入れ替え。 プロキシが VM の保持するおとり認証情報を、ワイヤ上で本物のものに置き換える際、レコードにそれが記録されます — 偽の値と本物の値の先頭/末尾数文字のプレビュー(
sk-a…f9q3)として記録され、シークレットのバイトそのものは決して記録されません。これは通常の健全なケースであり、入れ替えシステムが役割を果たしていることを確認するものです。 - 漏洩。 送信リクエストが Bromure が発行していない bearer 形式のトークン — 入れ替えシステムを迂回して VM に直接貼り付けられた本物のシークレット — を運んでいる場合、レコードはそれを潜在的な漏洩としてフラグ付けします。これも同じくプレビューのみで、疑いのクラス、すなわち
knownPrefix(Bromure が発行していない、認識されたシークレットのプレフィックス)またはopaqueToken(長い不透明な認証値)が付けられます。漏洩フラグは調査を促すものです。おとり認証情報と侵害検出の完全な仕組みは認証情報にあります。
保存時の暗号化と保持期間
トレースは ~/Library/Application Support/BromureAC/traces/ の下に、日付ごとに整理されて保存されます。
- メタデータは、リクエストごとに 1 行の JSON として
traces/YYYY-MM-DD/<sessionID>.jsonlに追記されます。 - 捕捉された本文は、その隣に
traces/YYYY-MM-DD/<sessionID>/<recordID>.req.encおよび.res.encとして保存されます — SecretsVault マスターキー(ワークスペースのシークレットを暗号化するのと同じ、Keychain に保持されるキー)で AES-GCM 封印されます。ファイルパーミッションは0600です。
何かが書き込まれる前に、レコードはサニタイズされます。
- 機密ヘッダーは秘匿されます。
Authorization、Proxy-Authorization、Cookie、Set-Cookie、x-amz-security-token、api-key、および-api-keyで終わるすべてのヘッダーは<redacted>に書き換えられます。 - シークレットはプレビューのみで保存されます。 トークンの入れ替えと疑わしい漏洩は先頭/末尾数文字のプレビューを保持します — 本物のシークレットのバイトは、暗号化の有無にかかわらず、トレースレコードに入ることは決してありません。
保持は自動で、遅延実行されます(200 回の追記ごとにクリーンアップパスが実行されます)。
| 上限 | 超過時の動作 |
|---|---|
| セッションごとに 100 MB の本文 | そのセッションの最も古い .enc 本文ファイルが削除されます。メタデータの行は残ります — 監査証跡は保持され、失われるのは最も古い捕捉テキストだけです。 |
traces/ ディレクトリ全体で 5 GB | 最も古い日付ディレクトリから先に削除されます。 |
これとは別に、アプリはライブビュー用に最新の 5,000 件のレコードをメモリ内リングに保持します。それより古いレコードは、上記の上限内でディスクに残ります。
警告: AI リクエストの詳細およびすべてでは、AI のやり取りの完全なプロンプトおよびレスポンステキストがディスク上にあります — 暗号化されていますが、存在します。本文は SecretsVault マスターキーで封印されているため、そのキーをローテーションすると、以前に捕捉された本文は復号できなくなります。そうなるとトレースインスペクタは、本文があるはずの場所に
(not captured / decryption failed)を表示します。
トレースインスペクタウィンドウ
トレースインスペクタは、すべてのワークスペースにわたる記録済みのやり取りをすべて閲覧するための、ライブでフィルタ可能なビューアです。CLI と同じレコードを読み取り、新しいリクエストが流れると同時にリアルタイムで更新されます。
ウィンドウを開く
ウィンドウ → トレースインスペクタ…(⇧⌘I)から開きます。また、セッションウィンドウのツールバーから1 つのワークスペースに事前フィルタされた状態でも開くため、実行中のエージェントからそのトラフィックへ直接ジャンプできます。開くと、メモリ内リングはディスクからウォームアップされます — 今日と昨日の日付ディレクトリのみを読み込むため、コールドローンチは高速です。より古いレコードはディスクに残り、それらが範囲内にある間にリロードボタンを押すか、CLI で読み取ることで表示されます。
リクエスト一覧
左ペインは新しい順のレコード一覧です。各行は左から右へ次を表示します。
- レスポンスクラスで色分けされたステータスドット。2xx は緑、3xx は青、4xx はオレンジ、5xx は赤、それ以外はグレー。
- メソッドとホスト(パスはその下に、中央を省略して表示)。
- 該当する場合のバッジ。入れ替えられていない認証情報(潜在的な漏洩)にはオレンジの警告三角形、トークンの入れ替えには青い入れ替え矢印、このレコードで本文が捕捉されている場合はドキュメントアイコン。
- 右側のステータスコードとレイテンシ。
フッターには N records (last M in memory) と表示され、ディスクからリロードボタン(円形矢印アイコン)があります。一覧は完全なキーボードナビゲーションに対応しています — ↑ / ↓ で 1 件移動、PgUp / PgDn で 10 件ジャンプ、Home / End で両端に到達 — 新しく選択された行はビューにスクロールされます。
フィルタリング
一覧の上にフィルタバーがあります。
| コントロール | 効果 |
|---|---|
| ワークスペースピッカー | 1 つのワークスペースに絞り込むか、すべてのワークスペースを表示。 |
| 漏洩のみ | 入れ替えられていない認証情報の警告があるレコードのみを表示。 |
| 会話のみ | プロキシが AI チャットのやり取りとして解析したレコードのみを表示。 |
| ホストフィルタ | ホストに対する部分文字列一致。 |
メモ: 会話のみは、レコードの書き込み時に設定されたフラグに依存します。そのフラグが存在する前に捕捉されたレコードは非会話とみなされ、再記録されるまでこのフィルタで非表示になります。
詳細ペイン
行を選択すると右ペインが埋まります。そのヘッダーにはメソッド、完全な URL、ステータス、そしてメタセルの行 — ワークスペース、レイテンシ、リクエストとレスポンスのサイズ、時刻 — に加え、会話 / 生データのセグメント化トグルが表示されます。
- 会話は解析済みの AI チャットをレンダリングします。システムプロンプト、ターン、ツール呼び出し、結果が読みやすく整形されます。本文が捕捉され、やり取りが AI 会話として解析された場合にのみ利用できます。それ以外の場合、トグルは自動的に生データにフォールバックします。
- 生データはレコードの構成要素をセクションで表示します。入れ替えられていない認証情報(潜在的な漏洩)、トークンの入れ替え(それぞれ
fake → realのプレビューとして)、リクエスト本文、レスポンス本文です。本文はレコードを選択したときにオンデマンドで復号されます。
各本文セクションにはコピーボタンがあり、完全な本文をクリップボードに置きます — 画面上の省略を超えた全文と、バイナリ本文の場合は 16 進文字列です。本文が保存されていない場合、またはマスターキーがそれを復号できなくなった場合、そのセクションには (not captured / decryption failed) と表示されます。
何も選択されていない場合、ペインにはプレースホルダーが表示されます。リクエストを選択 — 左の行を選択して、ヘッダー、入れ替え、(捕捉されていれば)本文を検査します。
WebSocket セッション
プロキシを通る長時間の WebSocket アップグレード — OpenAI Realtime、Codex の responses_websockets など — は、不透明なバイナリとして失われるのではなく、WS セッションごとに 1 件のレコードとしてトレースされます。ワークスペースのトレースレベルがそのホストの本文を捕捉する場合、両方向がフレーム解析(RFC 6455)されます。マスキングが除去され、継続フレームがデフラグメントされ、permessage-deflate ペイロード(RFC 7692)が展開されるため、テキストフレームは圧縮された文字化けではなく読める状態になります。
クローズ時、プロキシはアップストリームのハンドシェイクレスポンスの後に時系列のトランスクリプトを追記し、それをレコードのレスポンス本文として保存します。これによりトレースインスペクタは通常の本文パスを通してそれをレンダリングします — AI のやり取りとして解析される場合は会話ビューも含みます。トランスクリプトのエントリは次のようになります。
--- WebSocket session transcript ---
>>> [2026-07-13T15:30:05Z] TEXT 1234B
<<< [2026-07-13T15:30:06Z] TEXT 5678B (truncated, total 40000 bytes)
おしゃべりなセッションを制限内に保つための上限があります。メッセージごとに 1 MB を保持、セッションごとに 4,096 メッセージ、フレームの最大は 64 MB、展開後メッセージの最大は 32 MB です。上限を超えたものは (truncated, total N bytes) とマークされます。解析の失敗はトランスクリプトだけを劣化させます — ライブトンネルは生バイトを流し、トレースによって停止したり破損したりすることは決してありません。
トレース CLI
bromure-cli trace コマンドグループは、同じトレースデータをターミナルで提供します。これはシンクライアントです。ローカルのコントロールソケット経由で実行中のアプリと通信するため、GUI アプリが実行されている必要があります(リッチクライアントは、リモートインスタンスに到達するために同一のプロトコルを SSH 経由でトンネリングします)。
| コマンド | 動作 |
|---|---|
bromure-cli trace ls [workspace] [--limit N] | 最近のリクエストを新しい順に一覧表示(デフォルト 50 行)。列: TIME、HOST、METHOD、STATUS、REQ、RESP、LAT、FLAGS(swap×N、LEAK×N、conv)。 |
bromure-cli trace summary [workspace] | 集計ビュー: リクエスト数とホスト数、アップ/ダウンのバイト数、ステータスクラスのヒストグラム、入れ替え/漏洩/会話の数、上位 10 ホスト。 |
bromure-cli trace hostnames [workspace] | 接続したすべての異なるホストと、リクエスト数。 |
bromure-cli trace leaks [workspace] | 潜在的な認証情報漏洩があるリクエストのみ — ヘッダー、値のプレビュー、疑いのクラス。問題がなければ No leaks detected. ✓ を表示。 |
bromure-cli trace clear [-f] | すべてのトレース履歴 — メモリ内リングとディスク上のファイル — を、y/N の確認後に消去(-f でスキップ)。消去されたレコード数を報告。 |
オプションの workspace 引数は id または名前でフィルタします。ワークスペースのトレースがオフの場合(またはまだ何も記録されていない場合)、trace ls は No trace records. (Tracing is per-workspace — enable it in the workspace's settings.) を表示します。アプリが実行されていない場合、すべてのサブコマンドは No bromure-cli agent running. を表示します。CLI の全体は自動化と CLIに記載されています。
トレースのエクスポート
単一の「エクスポート」ボタンはありません — トレースデータは、暗号化境界を保ったままのパスを通ってインスペクタから出ていきます。
- トレースインスペクタから。 生データモードで、リクエスト本文またはレスポンス本文のコピーボタンは、完全な復号済み本文を画面上の省略を超えてクリップボードにコピーします。ヘッダー内の URL は選択可能なテキストです。これは、レポートやバグ報告のために 1 件のやり取り — 完全なプロンプト/レスポンスのペア — を取り出す方法です。
- CLI から。 任意の
traceサブコマンドをファイルにリダイレクトします。たとえばbromure-cli trace summary my-workspace > audit.txtやbromure-cli trace ls my-workspace --limit 500 > requests.txtです。これは、多数のリクエストのメタデータ証跡を一度に取り込む方法です。 - ディスクから。
traces/YYYY-MM-DD/の下のメタデータ JSONL はプレーンテキスト(シークレットはすでにプレビューに秘匿済み)で、直接読み取れます。.enc本文ファイルは SecretsVault マスターキーで AES-GCM 封印されており、アプリ内でのみ復号可能です — ディスクから取り出すのではなく、インスペクタからコピーしてください。
Mac の外に決して出ないもの
個人の非管理インストールでは、トレースは完全にローカルです。
- トレースは Mac の Application Support ディレクトリに書き込まれ、ログイン Keychain に保持されるキーで暗号化されます。
- トレースレコード、本文、サマリーがどこかにアップロードされることはありません。プロキシには個人ユーザー向けの分析エンドポイントは一切接続されていません。
- セキュリティログにも供給されるプロンプトインジェクション分類器はデバイス上で実行されます。プロンプトインジェクションの検出とガードレールを参照してください。あなたのトラフィックに関する情報がスキャンのためにクラウドサービスに送信されることはありません。
上記の秘匿とプレビューのルールは、保存時のデータでさえ使用可能なシークレットを一切含まないことを意味します。トレースはプライベートな監査ログであり、フォンホームではありません。
プライベートモードとエンタープライズテレメトリ
トレース由来のデータがマシンの外に出る唯一のケースは、bromure.io ワークスペースに登録された Mac です。登録はローカルの監査ログを組織から見えるものに変え — そして個々のワークスペースを再びオプトアウトするスイッチを与えます。管理者が何を見るか、登録がどのように機能するかはエンタープライズで扱います。このセクションはトレース側からその境界を説明します。
イベントストリーム
登録済み Mac では、セッションは構造化されたクラウドイベントを組織の管理者ワークスペースにストリーミングします。これはトレースが捕捉するのと同じ AI トラフィックから抽出されます。
llm.request— やり取りごと: プロバイダー、ホスト、パス、ステータス、レイテンシ、モデル、入力/出力トークン数、そして Anthropic の両方のキャッシュカウンター(cache_creation_input_tokens、cache_read_input_tokens、SSE ストリームからも解析される。OpenAI のcached_tokensもサポート)。tool.use— すべてのツール呼び出しと、240 文字で上限を設けた入力サマリー。file.read/file.write— 抽出されたパスとツール名。command.run— シェルコマンド、500 文字で上限。credential.token_swap— ワイヤ上の入れ替えごとに 1 件、プレビューのみ。prompt_injection.detection— 検出器が発火したときに転送され、フラグ付けされたスニペット全体(20 KB で上限)を運びます。ローカルのセキュリティログの 160 文字のプレビューとは異なります。
最新のアシスタントターンのみが走査されるため、再送された履歴が二重にカウントされることはなく、生のプロンプトが送出されることは決してありません — テレメトリは「AI が何をしたか」に答えるものであり、「ユーザーが何を尋ねたか」ではありません。
リアルタイムイベントタップ
長時間の WebSocket セッションでは、ソケットが閉じるまでイベントの抽出を待つと、セッション全体にわたって管理者が何も見えなくなってしまいます。代わりに、リアルタイムイベントタップがサーバーフレームを監視し、response.completed ごとに同じ llm.request / tool.use / file.read / file.write / command.run イベントを送出するため、実行中の Realtime セッションは進行に応じて報告します(その後、二重カウントを避けるためクローズ時の抽出はスキップされます)。タップは、ワークスペースのトレースレベルがすでにそのホストの本文を捕捉している場合にのみ接続されます — この章の他のすべてと同じ本文捕捉パスに乗っており、独自のローカル UI は持ちません。
プライベートモード
プライベートモードは、トレースペイン上のワークスペースごとのスイッチで、登録済み Mac にのみ表示されます。有効にすると、そのワークスペースはセッションメタデータと上記のイベントを bromure.io ワークスペースへストリーミングするのを停止します — タイトルバーのインジケーターも管理者のセッション一覧も、そこから何も見えなくなります。ローカルのトレースとトレースインスペクタは影響を受けません。自分のマシン上では完全な暗号化トレースが引き続き得られます。
これはまさに、ローカル監査と組織のテレメトリを分けるべきケースのために存在します — たとえば、個人の API キーを使用し、その活動を組織のダッシュボードに載せたくないワークスペースです。未登録の Mac では何もストリーミングされていないため、スイッチは完全に非表示になります。
メモ: プライベートモードは
prompt_injection.detectionイベントも抑制するため、プライベートなワークスペースでは、インジェクションは引き続きセキュリティログにローカルで記録され(そしてあなたの検出アクションに従って強制され)ますが、組織には転送されません。スイッチ自体についてはトレース設定を、登録が何をストリーミングするかについてはエンタープライズを参照してください。