← 所有文章

Codex hooks讓harness成真

出自指南: Codex CLI Comprehensive Guide

截至Codex 0.150.1(2026年8月27日),Codex hooks已註冊十二個生命週期事件,在您審查並信任其確切定義之前,拒絕執行任何非受管理的hook,而且預設啟用。這項在5月14日的發布組合中隨ChatGPT行動應用程式達到正式開放的功能,如今已成熟為一個治理介面:PreToolUse可以在工具呼叫執行前加以阻擋或改寫,PermissionRequest可以直接決定一次核准,PostToolUse可以替換模型看到的結果,Stop則可以拒絕讓回合結束。23

Codex不再像一個守在單一終端機裡等待的程式碼助理。它更像一層作業層,讓工作跨越機器、核准、專案、對話、差異、測試、截圖、外掛、憑證與本地工具。4

Codex hooks讓harness成真。一旦代理能從手機工作、連上遠端開發環境並執行生命週期hooks,團隊就需要在模型外圍建立控制系統:證據、核准、Git保管、來源紀律與品味。

TL;DR

Codex支援代理團隊一直在私下打造的工作流程形態:長時間執行的工作、遠端執行、行動引導、核准、hooks、限定範圍的憑證與稽核訊號。245 0.150.0的hooks引擎註冊十二個事件,每個非受管理的hook在您信任其目前的雜湊之前都保持略過,hooks可從hooks.json檔案或config.toml中的行內[hooks]表格載入。37 實務問題不是「我們該如何提示Codex?」而是「Codex必須先證明什麼,我們才信任結果?」團隊應透過hooks與設定,把審查關卡、安全邊界、公開寫作標準與發布紀律寫進流程。私有機制保持私有,只公開模式、驗收條件與已驗證的成果。

重點整理

對工程團隊: - 把Codex hooks當作流程基礎設施,而非裝飾。信任審查流程是這套基礎設施的一部分,不是可以繞過的摩擦。 - 先建立證據、核准、Git保管與發布檢查,再加入聰明的自動化。

對代理工具建構者: - 圍繞Codex真正的介面來建構:行動控制、Remote SSH主機、沙箱模式、核准政策、專案指示、hooks、遙測與版本控制。 - 移植要完成的任務,不要移植舊式斜線指令的外形。

對公開寫作者: - 以learn.chatgpt.com的官方文件確認Codex目前的行為,文件落後於版本時改查引擎原始碼。 - 把私有實務標示為作者分析,並讓私有提示、hook內容、檔案路徑、來源清單、憑證與評分內部規則留在公開文案之外。

Codex hooks從哪裡來?

OpenAI於2026年5月14日發表「Work with Codex from anywhere」(隨處使用Codex)。1 文件變更日誌在該日期的條目記錄了這次發布組合:Codex可以透過連上一台執行Codex應用程式的Mac,從ChatGPT行動應用程式使用;hooks達到正式開放;供受信任自動化使用的Codex存取權杖也同時登場。2 Codex從連線的主機上執行,因此同樣的專案、檔案、憑證、外掛、技能與設定都能從手機取用。2

遠端連線讓觸角延伸到單一書桌之外。公告中的Remote SSH能力在文件中落地為SSH主機:ChatGPT桌面應用程式可以從SSH主機加入遠端專案,並針對遠端檔案系統與shell執行對話。文件的說法很具體:「Remote access uses the connected host’s projects, chats, files, credentials, permissions, plugins, Computer Use, browser setup, and local tools.」(遠端存取使用連線主機的專案、對話、檔案、憑證、權限、外掛、Computer Use、瀏覽器設定與本地工具。)4

hooks本身在這次發布前就以實驗形式存在,之後又持續成長。文件把它們定義為在代理迴圈中執行指令碼或MCP工具的擴充框架,並直白列出用途:把對話送進記錄引擎、攔下不小心貼上的API金鑰、把對話摘要成持久記憶、在回合停止時執行驗證檢查,以及依目錄客製提示。3 hooks現在預設啟用;config.toml中的features.hooks可作為總開關,features.codex_hooks只以已棄用的別名形式存在。36

這些細節之所以重要,是因為它們讓代理工作從一場聊天交換,變成受治理的營運。

Codex hooks在設定中長什麼樣子?

談hooks的文章應該展示一個hook。Codex會在作用中的設定層旁邊尋找hooks,最實用的位置是~/.codex/hooks.json、<repo>/.codex/hooks.json,或任一層config.toml中的行內表格;當多個來源同時存在時,所有相符的hooks都會載入並執行。3 一個最小的hooks.json,包含一個工具關卡與一個完成關卡:

{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "^Bash$",
        "hooks": [
          {
            "type": "command",
            "command": "python3 ~/.codex/hooks/pre_tool_use_policy.py",
            "timeout": 30,
            "statusMessage": "Checking Bash command"
          }
        ]
      }
    ],
    "Stop": [
      {
        "hooks": [
          {
            "type": "command",
            "command": "python3 ~/.codex/hooks/evidence_gate.py"
          }
        ]
      }
    ]
  }
}

同樣的形狀改寫成config.toml的行內版本:

[[hooks.PreToolUse]]
matcher = "^Bash$"

[[hooks.PreToolUse.hooks]]
type = "command"
command = "python3 ~/.codex/hooks/pre_tool_use_policy.py"
timeout = 30
statusMessage = "Checking Bash command"

每個hook都由三層組成:一個事件、一個決定事件何時適用的matcher群組,以及一個或多個處理器(command或mcp_tool)。3 目前的事件如下,以引擎的十二項清單為準:37

事件 觸發時機 能否阻擋?
SessionStart 工作階段開始:startup、resume、clear或compact;stdout會成為開發者情境 可以:continue: false會停止hook執行,在壓縮後則會結束該回合
UserPromptSubmit 使用者提示送達模型之前 可以:decision: "block"會拒絕該提示
PreToolUse 受支援的工具呼叫執行之前 可以:拒絕該呼叫,或以updatedInput改寫
PermissionRequest Codex即將請求核准時 可以:允許或拒絕;不回應則交回一般的詢問流程
PostToolUse 受支援的工具產生輸出之後,包括失敗的指令 部分:可替換結果,無法復原副作用
PreCompact Codex壓縮對話之前,manual或auto 可以:continue: false會停止壓縮
PostCompact Codex壓縮對話之後 可以:continue: false會在壓縮後停止
SubagentStart 子代理啟動時,以agent_type比對 不行:continue: false會被解析,但不會阻止子代理
SubagentStop 子代理停止時 可以:decision: "block"會把子代理送回去再跑一輪
Stop 回合嘗試結束時 可以:decision: "block"讓Codex繼續工作,您的理由成為接續提示
SessionEnd 主執行緒結束時;子代理永不觸發 不行:僅供參考,預設逾時1秒,上限3秒
Interrupt 進行中的頂層回合被中斷時(0.150.0起);子代理永不觸發 不行:僅供資訊,與SessionEnd相同的1秒預設與3秒上限

線上的hooks文件目前仍只記載其中十一個事件,還沒有Interrupt的章節。0.150.0的變更日誌條目(#40511)與引擎原始碼rust-v0.150.0中的HOOK_EVENT_NAMES: [&str; 12]承載著第十二個。27 當頁面與引擎不一致時,以引擎為準。

hooks實際上看得到哪些工具呼叫?

早期版本的文件警告PreToolUse除了shell與MCP呼叫之外幾乎不涵蓋其他工具。目前的文件把範圍放寬:「PreToolUse and PostToolUse can observe more than shell and MCP calls. Most local function tools use the same hook path,」(PreToolUse與PostToolUse能觀察的不只shell與MCP呼叫。多數本地函式工具走同一條hook路徑),因此matcher可以直接指名update_plan這類工具,spawn_agent也會以Agent比對。3 shell指令以Bash比對,apply_patch檔案編輯以apply_patch、Edit或Write比對,MCP工具則比對像mcp__filesystem__read_file這樣的名稱。3

託管工具仍在範圍之外:WebSearch與同類工具永遠不會經過本地函式工具的hook路徑。3 文件保留了一句值得整段引用的緩和警語:「Some specialized tool paths can opt out of the default hook path. Treat tool hooks as a useful guardrail, not a complete enforcement boundary.」(某些特殊的工具路徑可以退出預設的hook路徑。把工具hooks當作有用的護欄,而不是完整的強制邊界。)3 硬邊界仍由沙箱負責;hooks負責的是邊界之內的審查與引導。

Codex如何決定哪些hooks可以執行?

hooks是會引導代理的程式碼,所以Codex連hooks本身也要治理。環繞模型的控制系統從這裡開始。

任何非受管理的hook執行之前,Codex都要求您先審查並信任其確切定義。信任是針對hook目前的雜湊記錄的,因此新的或被修改過的hook會被標記為待審查,在再次獲得信任之前一律略過。3 CLI中的/hooks指令會開啟審查介面:檢視hook來源、審查新的或變更過的hooks、信任它們,或停用個別項目。啟動時若有hooks需要審查,Codex會印出指向/hooks的警告。3

來自系統、MDM、雲端或requirements.toml來源的受管理hooks位於這套流程之上:它們依政策受信任,且無法從使用者的hook瀏覽器中停用。3 外掛則位於流程之內:安裝或啟用外掛並不會信任其隨附的hooks,這些hooks和其他hooks一樣,在審查之前保持略過。3 專案本機hooks只在專案的.codex/層受信任時載入;不受信任的專案仍會載入您的使用者層與系統層hooks。3

自動化也適用同一條規則。codex exec執行時沒有審查UI,因此未受信任的hook會被靜默略過,直到您先在互動式工作階段中信任它;文件還沒有把這件事寫出來,但引擎的啟動審查介面只存在於互動式TUI中。7 對於已在別處審核hook來源的管線,--dangerously-bypass-hook-trust能讓已啟用的hooks在那一次呼叫中執行,而不寫入持久信任。3 請刻意地完成信任,否則就等著看您的關卡沒有觸發:harness會在任何程式碼執行之前,先決定哪些程式碼可以引導代理。

hook阻擋時會發生什麼?何時已經太遲?

時機決定一個hook還能改變什麼。多數hooks同步執行,預設逾時600秒;SessionEnd與Interrupt預設1秒、上限3秒:SessionEnd在工作階段收尾拆除時觸發,Interrupt則在使用者等待時觸發。37

PreToolUse在任何事情發生之前行動,因此握有最強的牌:拒絕該呼叫,或回傳permissionDecision: "allow"搭配updatedInput加以改寫。拒絕的形狀如下:

{
  "hookSpecificOutput": {
    "hookEventName": "PreToolUse",
    "permissionDecision": "deny",
    "permissionDecisionReason": "Destructive command blocked by hook."
  }
}

以結束代碼2搭配stderr上的理由同樣能阻擋。3

PostToolUse在工具執行之後才行動,因此無法復原副作用。decision: "block"會把工具結果替換成您的回饋,讓模型從那則訊息繼續,既能修正方向,又不假裝指令從未發生。3 Stop把一次拒絕變成一次接續:擋下完成,Codex就繼續工作,您的理由成為新的提示。3

對於永遠不該卡在關鍵路徑上的檢查,在command處理器上設定async = true。背景hooks在Codex繼續工作的同時執行,在下一個安全點交付輸出,並且明確地不能阻擋、核准或改寫任何東西;工具政策、權限決定、提示拒絕與回合接續請保持同步。3

0.149與0.150升級了什麼?

8月下旬的兩個穩定版本收緊了治理故事。

Codex CLI 0.149.0(2026年8月20日)淘汰了untrusted核准政策(#39630);仍寫著這個值的設定現在會失敗,並給出要求移除該設定的可操作錯誤。27 Codex CLI 0.150.0(2026年8月26日)新增了Interrupt hook事件(#40511):「New Interrupt hooks can run commands or MCP handlers when an active top-level turn is interrupted.」(新的Interrupt hooks可以在進行中的頂層回合被中斷時執行指令或MCP處理器。)Interrupt hooks永遠不會為子代理執行。27 同一版本也讓不受信任的專案不再能提供專案層級的AGENTS.md指示(#39837),這與既有規則相互呼應:專案本機hooks只從受信任的.codex/層載入。23

方向是一致的:不受信任的目錄,對走進它的代理擁有越來越少的權限。指示、hooks與核准捷徑,如今全都要經過明確的信任決定。

為什麼hooks比行動存取更重要?

行動存取改變的是人可以介入的地點。hooks改變的是系統可以強制執行的內容。

手機讓操作者在離開書桌時也能回答問題。hook則能在高風險動作之前、檔案編輯之後、完成之前,或發布檢查期間攔住代理。手機解決延遲。hook解決標準。

Codex在沙箱與核准方面已有第一方控制介面。安全文件把沙箱模式與核准政策配成一對:前者定義代理技術上能做什麼,後者定義Codex何時必須停下來先問。5 代理預設在關閉網路存取的狀態下執行,預設的本機workspace-write模式除非使用者啟用,否則保持網路關閉。5 hooks位於這些控制項旁邊,是審查與引導層,不是沙箱的替代品。

hooks能讓本地標準變得可執行:

標準 hook形式的執行方式
不洩漏機密 在高風險動作前掃描提示與工具輸入(UserPromptSubmit、PreToolUse)
不假裝完成 證據缺失時擋下完成(Stop)
不發布過時的文字 發布前要求來源檢查與渲染路由檢查
不留下髒狀態 要求精確路徑的git狀態與提交意圖(PostToolUse、Stop)
不弱化品質 發布前執行聚焦的審查關卡(PermissionRequest、Stop)

模型可能忘記規則。hook能在規則真正要緊的那一刻,把規則再跑一次。

harness擁有什麼是供應商沒有的?

代理harness是環繞模型的作業層:權限、記憶、工具、hooks、來源檢查、發布關卡、審查包與回滾紀律。這個詞聽起來也許私有或華麗,但它的工作很樸素。這一層把意圖變成可問責的工作。

Codex現在公開了足夠的官方介面,讓這一層得以明確化。遠端連線承載主機環境。沙箱模式與核准政策定義行動邊界。設定檔定義模型、專案、權限、MCP伺服器、技能、hooks、遙測與功能。6 OpenTelemetry匯出維持選擇性加入且預設關閉;啟用後,Codex會發出結構化事件,涵蓋對話、API請求、串流活動、使用者提示(預設遮蔽)、工具核准決定與工具結果。58

這組介面創造了一個有用的分工:

供應商介面 團隊擁有的標準
遠端連線 哪些主機與帳號可以承載工作
沙箱與核准 哪些動作值得加上摩擦
hooks 哪些標準在決策點執行
hook信任 哪些程式碼有資格引導代理
遙測 哪些事件成為稽核證據
Git工作流程 哪些變更成為存檔點
專案指示 哪些持久規範引導代理

供應商應持續改進執行環境。判斷仍屬於團隊。

團隊應該先把什麼寫進系統?

從四個關卡開始。它們立刻回本。

證據關卡

Codex最初的發表文章強調可驗證的證據:終端機記錄、測試輸出,以及任務完成過程中可追溯的步驟。9 把這個期待變成不可協商的要求。一次有意義的完成,應指名變更的檔案、執行的指令、觀察到的行為、失敗的檢查與剩餘的缺口。

對公開工作而言,證據包括來源連結,以及主張與來源的對齊。對網頁發布而言,證據包括渲染後的路由、中繼資料、schema、可發現性檔案、部署狀態、快取新鮮度與線上變更標記。對翻譯而言,證據包括語系涵蓋率、品質關卡、儲存列或快取檔案,以及必要時的母語審閱狀態。

核准關卡

不要用同一種核准姿態對待所有動作。核准文件目前的組合表從Auto預設(workspace-write沙箱搭配on-request核准)一路排到安全的唯讀瀏覽、唯讀的非互動式CI、自動審查模式與危險的完全存取。5 其中一列落後於現實:untrusted政策仍出現在頁面上,但0.149.0已將它淘汰,明確寫出的設定現在會報錯。25 想在今天採用永遠詢問的姿態,請把read-only沙箱與on-request核准搭配使用。一套強健的本地政策維持同樣的形狀:低風險讀取安靜通過,有副作用的工作接受審查,破壞性或對外可見的工作需要明確證據。

Git保管關卡

代理工作需要回滾把手。Codex自己的安全文件說Codex在版本控制下運作得最好:委派前保持狀態乾淨、頻繁提交、執行針對性驗證、審查差異,並在提交訊息中記錄決定。5

這些建議應該變成流程。在連貫且驗證過的存檔點之後提交。以精確路徑暫存。依可獨立還原的關注點拆分提交。除非發布流程已授予發布權限,否則推送前先詢問。不要因為代理剛好看到了無關的髒檔案,就把它們掃進提交。

品味關卡

AI寫程式讓實作變便宜。實作越便宜,品味就越值錢。

品味不是裝飾性的偏好。它是指工作讓整個產品變好。它是指代理能拒絕一條技術上可行、卻會削弱成果的路。它是指公開寫作避開私有機制、無憑據的主張與贅語。它是指只要使用者可見的路徑仍然壞著,一個正確的本地修補仍可能不及格。

品味關卡應該問:

問題 目的
真正的使用者是誰? 防止對本地產物的盲目崇拜
什麼能證明成果? 把證據和信心分開
我們移除或拒絕了什麼? 保持一致性
還有什麼未經驗證? 避免虛假的完成
這件工作為什麼值得存在? 不讓數量取代判斷

Mozilla的Firefox工作證明了什麼?

Mozilla在5月7日發表的文章講述以Claude Mythos Preview強化Firefox,從另一個技術棧得出同樣的結論。團隊表示,早期的LLM程式碼稽核嘗試展現了潛力,但誤報太多而無法擴展。代理式harness改變了經濟學,因為它們能建立並執行可重現的測試案例,動態驗證錯誤假設。10

Mozilla最重要的那句話與模型本身無關。團隊說,發現是必要的,但不充分。有用的系統必須整合進完整的安全錯誤生命週期:目標、去重、錯誤追蹤、分級、修復與發布。10 作者們也說,這條管線反映了Firefox程式碼庫的語意、工具與流程。10

這就是給Codex的一課。更好的模型當然重要。但環繞模型的營運系統,決定了工作能否成為受信任的產出。

什麼應該留在公開文案之外?

一篇公開的Codex文章,不該把私有的工作系統傾倒出來。

以下內容請留在公開文案之外:

  • 私有提示與hook內容;
  • 敏感的本地路徑;
  • 精確的來源對照與評分內部規則;
  • 帳號識別碼與憑證處理方式;
  • 私有的工作流程捷徑;
  • 未發布的外掛行為;
  • 任何有助於陌生人重建內部營運的資訊。

改為發表模式:這個關卡保護什麼、要求什麼證據、攔下哪種失敗,以及團隊如何用官方Codex介面實作這個想法。

這條線保護信任。它也讓文字更好。私有機制讀起來通常像鄉野傳說。公開的驗收條件則幫助其他團隊思考自己的系統。

最小的Codex harness地圖長什麼樣子?

建立能證明有用工作的最小控制地圖。

層 第一個有用的版本
專案政策 帶有持久規範與驗證指令的AGENTS.md
權限 預設workspace-write,網路與對外寫入須明確授權
hooks 機密掃描、證據停止關卡、Git保管、公開寫作檢查
hook信任 已審查的雜湊;bypass旗標只用於已在別處審核來源的管線
來源紀律 針對工具目前行為的第一手來源驗證
審查包 目標、變更檔案、指令、結果、來源、缺口
Git保管 驗證過的存檔點之後的精確路徑提交
發布關卡 渲染路由、中繼資料、schema、翻譯、線上標記
遙測 核准、工具與網路事件送往受信任的收集器

從明確開始。跑一個真實任務。記錄關卡在哪裡幫了忙、在哪裡礙了事。只把改善使用者可見成果的部分升級為常設做法。

快速總結

Codex hooks、Remote SSH、行動控制、沙箱、核准、設定、遙測與版本控制指向同一個方向:程式碼代理需要環繞它們的作業系統。2456 代理能寫程式。harness決定什麼算是工作。

最好的團隊不會靠產出最多的代理輸出獲勝。他們會靠讓代理工作可檢視、可回滾、有來源、有品味、值得發布來獲勝。

常見問題

什麼是Codex hooks?

Codex hooks在代理迴圈中執行指令碼或MCP工具,從hooks.json檔案或config.toml中的行內[hooks]表格載入。文件把用途說得直白:把對話送進記錄引擎、攔下不小心貼上的API金鑰、把對話摘要成持久記憶、在回合停止時執行驗證,以及依目錄客製提示。3 0.150.0的引擎註冊十二個事件,從PreToolUse、PermissionRequest、PostToolUse到Stop與新的Interrupt;文件頁面在跟上進度之前仍列出十一個。37

為什麼Codex hooks重要?

hooks讓團隊把標準放在決策點上,而不是只依賴提示。hook可以在代理行動或嘗試結束時,檢查證據、來源品質、git狀態或發布就緒度。

為什麼我的hook沒有執行?

最常見的答案是信任。Codex會略過任何您尚未審查其目前雜湊的非受管理hook,在互動式工作階段印出啟動警告,在codex exec自動化中則靜默略過。7 開啟/hooks審查並信任它,或只在已於別處審核hook來源的管線中傳入--dangerously-bypass-hook-trust。3

Codex行動版會取代本地代理工作流程嗎?

不會。行動控制讓使用者在離開書桌時引導工作,但連線的主機仍然提供專案、對話、檔案、憑證、權限、外掛與本地工具。4 團隊仍需要本地政策、安全的憑證、版本控制與驗證。

Codex harness應該先包含什麼?

從專案指示、沙箱與核准姿態、機密邊界、證據停止關卡、精確路徑的Git保管、公開主張的來源驗證,以及針對使用者可見工作的發布關卡開始。

團隊應該公開自己的Codex hooks嗎?

公開模式與驗收條件,而不是私有的hook內容或敏感的工作流程細節。一篇有用的公開文章可以說明hook的職責,而不暴露私有路徑、來源對照、提示、憑證或評分規則。

參考資料


  1. OpenAI,「Work with Codex from anywhere」,OpenAI,2026年5月14日。 ↩

  2. OpenAI,「ChatGPT & Codex changelog」,ChatGPT Learn,2026年8月28日存取。2026年5月14日條目(行動版發布、hooks正式開放、供受信任自動化使用的Codex存取權杖),以及Codex CLI 0.149.0、0.150.0與0.150.1的版本條目。 ↩↩↩↩↩↩↩↩↩↩

  3. OpenAI,「Hooks」,ChatGPT Learn,2026年8月28日存取。 ↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩

  4. OpenAI,「Remote connections」,ChatGPT Learn,2026年8月28日存取。 ↩↩↩↩↩

  5. OpenAI,「Agent approvals & security」,ChatGPT Learn,2026年8月28日存取。 ↩↩↩↩↩↩↩↩

  6. OpenAI,「Configuration Reference」,ChatGPT Learn,2026年8月28日存取。 ↩↩↩

  7. openai/codex的rust-v0.150.0標籤,GitHub,2026年8月28日存取:codex-rs/hooks/src/lib.rs中的HOOK_EVENT_NAMES;codex-rs/hooks/src/engine/discovery.rs中的逾時正規化;codex-rs/core/src/hook_runtime.rs中Interrupt對子代理的提前返回;啟動時的hook審查介面只存在於tui crate,discovery.rs會在沒有警告的情況下排除未受信任的處理器,而--dangerously-bypass-hook-trust在exec/src/cli.rs中是exec的全域旗標。 ↩↩↩↩↩↩↩↩↩

  8. OpenAI,「Running Codex safely at OpenAI」,OpenAI,2026年5月8日。 ↩

  9. OpenAI,「Introducing Codex」,OpenAI,2025年5月16日。 ↩

  10. Brian Grinstead、Christian Holler與Frederik Braun,「Behind the Scenes Hardening Firefox with Claude Mythos Preview」,Mozilla Hacks,2026年5月7日。 ↩↩↩

相關文章

代理技能需要套件管理器

代理技能、MCP伺服器、提示、掛鉤與命令,如今都像相依套件一樣運作。團隊需要清單、鎖定檔、政策關口、審查與回復機制。

11 分鐘閱讀

安裝與更新 Codex CLI:Mac、Linux、Windows

codex update 可升級以安裝指令碼、npm 與 Homebrew 安裝的版本;以 winget 安裝的則用 winget upgrade OpenAI.Codex 升級。本文說明如何在任何作業系統上安裝、更新、鎖定版本與解除安裝 …

9 分鐘閱讀

兩個MCP伺服器讓Claude Code變成iOS建置系統

XcodeBuildMCP與Apple的Xcode MCP讓Claude Code能以結構化方式存取iOS建置、測試與除錯。設定方法、實際成果與誠實的經驗教訓。

14 分鐘閱讀