追蹤與稽核
工作區發出的每一個請求——代理程式對 LLM 供應商的呼叫、套件下載、kubectl 與 aws 流量、一般的網頁擷取——都會通過 Bromure Agentic Coding 主機端的 MITM 代理伺服器。由於代理伺服器本就位於該傳輸邊界上,它可以記錄通過的一切內容:代理程式聯繫了哪些主機、送出了什麼、回傳了什麼、是否有任何憑證被替換或洩漏,以及——對 AI 流量而言——模型所驅動的完整對話、工具呼叫與 shell 命令。
該紀錄就是工作區的工作階段追蹤記錄。它存在的唯一理由是:讓你在事後能夠回答「代理程式究竟做了什麼?」——細至個別的提示、個別的 rm -rf、個別的對外請求。一切都記錄在你的 Mac 上、靜態加密,並且(對個人使用者而言)永不離開它。
本章涵蓋整個系統:追蹤記錄擷取了什麼、如何儲存與汰除、追蹤檢視器視窗、bromure-cli trace 命令列、如何將資料取出,以及本機稽核與已註冊 Mac 串流給組織的遙測資料之間的隱私邊界。此窗格逐欄位的設定參考位於追蹤設定。
追蹤記錄記載了什麼
追蹤是以工作區為單位,由編輯工作區視窗中追蹤窗格的工作階段追蹤選單控制。它有四種層級,每一種都是前一種的超集:
| 層級 | 記錄的內容 |
|---|---|
| 關閉 | 無。 |
| 僅活動 | 每個請求一筆中繼資料紀錄——不含內文。 |
| AI 請求詳情(預設) | 每個請求的中繼資料,加上已知 LLM 主機的完整請求與回應內文。 |
| 全部 | 每個請求的中繼資料,加上每一個主機的內文。 |
新工作區預設為 AI 請求詳情,因此代理程式對話開箱即可稽核,同時不會將無關流量(套件下載、遙測 ping)的內文儲存於磁碟。
附註: 追蹤層級列舉在設定檔格式中預設為關閉,因此若某工作區儲存的 JSON 早於此設定,將解碼為關閉。AI 請求詳情預設僅套用於以目前範本建立的工作區。當稽核很重要時,請刻意選擇層級。
中繼資料紀錄
在僅活動及以上層級,代理伺服器會為每個請求寫入一筆追蹤紀錄。無論層級為何,每筆紀錄都攜帶以下中繼資料:
- 時間戳記、主機、連接埠、HTTP 方法與路徑。
- 狀態碼與延遲,從開啟通道的
CONNECT起算至回應為止。 - 請求位元組數(於任何憑證替換之前測得)與回應位元組數。
- 權杖替換報告——代理伺服器在對外時替換了哪些憑證(見憑證替換與洩漏)。
- 憑證洩漏警告——對外請求中並非由 Bromure 產生的 bearer 樣式權杖。
- 在本機或混合模型路由下,由哪個後端服務此回合(見本機模型)。
這足以重建代理程式在何時與誰交談的完整全貌,而不需在磁碟上保留任何一個位元組的提示或回應文字。當你需要稽核軌跡——聯繫的網域、憑證處理、延遲——但不需要內容時,僅活動便是該選的層級。
已擷取的內文與已解析的對話
在 AI 請求詳情層級,代理伺服器會額外儲存已知 LLM 主機的完整請求與回應內文:Anthropic、OpenAI / ChatGPT、Google、Cohere、Mistral、Perplexity、x.ai / Grok、Groq、Replicate 與 HuggingFace,以及當工作區路由至本機模型時的本機推論主機。在全部層級,則會為每一個主機保留內文。
已擷取的 AI 內文不僅只是被儲存——它會被解析。追蹤檢視器會將其呈現為對話檢視:系統提示、每個使用者回合、助理的回覆,以及模型發出的結構化區塊。這些區塊正是讓編碼代理程式追蹤記錄有用之處:
- 工具呼叫——模型產生的每個
tool_use區塊,連同其輸入。 - Shell 命令——
Bash/Shell工具呼叫,也就是代理程式在 VM 中執行的命令。 - 檔案讀取與寫入——
Read/View與Write/Edit/MultiEdit工具呼叫,連同它們所觸及的路徑。
因此單一筆 AI 請求紀錄便能回答「模型在此回合決定做什麼」——讀取此檔案、執行該命令、呼叫此 API——這些都是從原始 API 內文中解析出來的。同樣的結構也是即時事件擷取在已註冊 Mac 上轉換為稽核事件的依據。
憑證替換與洩漏
每個請求都會記錄兩項憑證處理事實,並予以醒目呈現,因為它們正是安全審查時最重要的兩項:
- 權杖替換。 當代理伺服器將 VM 持有的誘餌憑證於傳輸過程中替換為真正的憑證時,紀錄會予以記載——以偽造值與真實值的首/末字元預覽(
sk-a…f9q3)呈現,絕不含密鑰位元組。這是正常且健康的情況:它確認了替換系統正在發揮作用。 - 洩漏。 當對外請求攜帶了並非由 Bromure 產生的 bearer 樣式權杖——也就是直接貼入 VM、繞過替換系統的真實密鑰——紀錄會將其標記為潛在洩漏,同樣僅以預覽呈現,並附上一個可疑類別的標籤:
knownPrefix(Bromure 未曾核發、但可辨識的密鑰前綴)或opaqueToken(一個很長的不透明驗證值)。洩漏標記是調查的提示;誘餌憑證與遭入侵偵測的完整運作機制詳見憑證。
靜態加密與保留
追蹤記錄存放於 ~/Library/Application Support/BromureAC/traces/,依日期組織:
- 中繼資料以每個請求一行 JSON 的方式附加至
traces/YYYY-MM-DD/<sessionID>.jsonl。 - 已擷取的內文儲存於其旁,路徑為
traces/YYYY-MM-DD/<sessionID>/<recordID>.req.enc與.res.enc——以 SecretsVault 主金鑰進行 AES-GCM 封裝,這正是加密你工作區密鑰、由 Keychain 保管的同一把金鑰。檔案權限為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 相同的紀錄,並在新請求流入時即時更新。
開啟視窗
從 Window → Trace Inspector…(⇧⌘I)開啟。它也可從工作階段視窗的工具列以預先篩選至單一工作區的方式開啟,讓你能直接從執行中的代理程式跳至其自身的流量。開啟時,記憶體環狀緩衝區會從磁碟預熱——僅讀取今日與昨日的日期目錄,因此冷啟動很快。更舊的紀錄留在磁碟上,當它們落在範圍內時,按下重新載入按鈕即可顯示,或以 CLI 讀取它們。
請求清單
左側窗格是以最新為先的紀錄清單。每一列由左至右顯示:
- 一個依回應類別以顏色標示的狀態圓點:2xx 為綠色、3xx 為藍色、4xx 為橘色、5xx 為紅色,其他為灰色。
- 方法與主機(路徑顯示於下方,中間截斷)。
- 適用時的標記:未替換憑證(潛在洩漏)的橘色警告三角形、權杖替換的藍色替換箭頭,以及此紀錄擷取到內文時的文件圖示。
- 右側的狀態碼與延遲。
頁尾顯示 N records (last M in memory),並帶有一個從磁碟重新載入按鈕(環狀箭頭圖示)。此清單具備完整的鍵盤導覽——↑ / ↓ 逐列移動、PgUp / PgDn 跳十列、Home / End 到達兩端——並將新選取的列捲動至可見範圍。
篩選
清單上方有一列篩選列:
| 控制項 | 效果 |
|---|---|
| 工作區選單 | 縮小至單一工作區,或所有工作區。 |
| 僅洩漏 | 僅顯示帶有未替換憑證警告的紀錄。 |
| 僅對話 | 僅顯示代理伺服器解析為 AI 聊天交換的紀錄。 |
| 主機篩選 | 對主機進行子字串比對。 |
附註: 僅對話依賴於紀錄寫入時所設定的旗標。在該旗標存在之前擷取的紀錄會被計為非對話,並會被此篩選隱藏,直到重新記錄為止。
詳情窗格
選取一列會填入右側窗格。其標頭顯示方法、完整 URL、狀態,以及一列中繼資料儲存格——工作區、延遲、請求與回應大小,以及時間——並附上一個對話 / 原始分段切換。
- 對話會呈現已解析的 AI 聊天:系統提示、回合、工具呼叫與結果,格式化以便閱讀。僅在有擷取到內文且該交換解析為 AI 對話時可用;否則此切換會自行退回至原始。
- 原始以區段顯示紀錄的組成元件:未替換憑證(潛在洩漏)、權杖替換(各以
fake → real預覽呈現)、請求內文與回應內文。內文會在你選取紀錄時按需解密。
每個內文區段都有一個複製按鈕,可將完整內文放入剪貼簿——即使超出畫面截斷的完整文字,二進位內文則為十六進位字串。當未儲存內文,或主金鑰已無法解密時,該區段會顯示 (not captured / decryption failed)。
當未選取任何項目時,此窗格顯示一個佔位提示:Pick a request — Choose a row on the left to inspect headers, swaps, and (if captured) bodies.
WebSocket 工作階段
通過代理伺服器的長時間 WebSocket 升級——OpenAI Realtime、Codex 的 responses_websockets 之類——會被追蹤為每個 WS 工作階段一筆紀錄,而非丟失為不透明的二進位。當工作區的追蹤層級為該主機擷取內文時,兩個方向都會進行框架解析(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 是可選取的文字。這是將單一交換——一對完整的提示/回應——取出以供報告或錯誤回報的方式。
- 從 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——shell 命令,上限 500 字元。credential.token_swap——每次傳輸中替換一筆,僅含預覽。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事件,因此在私密工作區中,注入仍會於本機記錄在安全記錄中(並依你的偵測動作強制執行),但不會轉送給你的組織。開關本身見追蹤設定,註冊會串流的內容見企業。