自動化流程裡的安全檢查 Hook 若無法啟動或逾時,後續操作還要不要照常進行?Claude Code 2.1.295 為 command 與 HTTP Hooks 加入 onFailure: "block",讓 Hook 發生特定失敗時阻擋對應動作。這項選擇適不適合,得先看失敗後放行會造成什麼後果。

Hook 失敗後是否放行,先看它保護哪個動作?

先判斷失敗後的動作風險,再決定是否阻擋。 若 Hook 負責權限、安全或部署前檢查,未完成檢查就繼續執行可能留下缺口;若它只負責通知或留存紀錄,阻擋也可能造成不必要的停工。

Hook(事件鉤子)是在 Claude Code 特定事件發生時執行的外部處理程序,例如工具呼叫前的檢查。它通常接收事件資料,再回傳結果或決策。設定檔裡看得到 Hook,只能證明規則存在,不能證明程式真的啟動、回應正確,或檢查完成。

想像一個部署流程:工具準備執行更新前,Hook 會檢查分支、權限或必要條件。若腳本路徑錯誤、執行權限不足,檢查程式便可能沒跑起來。假如流程把「沒有收到拒絕」當成可以繼續,更新仍可能進行。此時風險來自失敗後的放行邏輯,並非單純少一筆錯誤訊息。

反過來看,某個 Hook 若只在任務結束時寄送通知,暫時寄不出去通常不會改變程式碼或部署結果。強制阻擋可能只讓主要工作卡住,卻沒有降低同等程度的風險。判斷時可以問三件事:Hook 在流程中做什麼、失敗時下游還會做什麼、誰能看見並處理錯誤。

平台官方文件把 Hook 放在事件、比對條件與處理程序的設定脈絡中;不同事件對結果有不同處理方式。這表示阻擋範圍要連同觸發事件一起理解,不能只看 onFailure 這個欄位名稱。既有文章 #1078 曾談 Claude Code 規則失效與升級評估;2.1.295 新增的重點是 Hook 本身失敗時如何處置。

從 Hook 用途出發,依失敗後果與中斷成本判斷阻擋或繼續
是否阻擋取決於失敗後放行的風險,以及停下流程所付出的代價。

Claude Code 2.1.295 的 onFailure: block 改變了什麼?

它讓 command 與 HTTP Hook 在無法啟動、逾時或以非預期代碼退出時,阻擋該 Hook 對應的動作。 這是失敗時的處理選項,並不代表所有 Hook 預設都會阻擋,也不會替使用者修好故障來源。

Anthropic 在 Claude Code 2.1.295 官方 release note列出這項新增功能:當 command 或 HTTP Hook 無法啟動、逾時,或以非預期代碼結束,設定阻擋後,動作會被擋下,而不是照常放行。當中的 command Hook 是執行 shell 命令的處理程序;HTTP Hook 則把事件資料以 POST 請求送到指定端點。

onFailure: "block" 描述的是 Hook 發生失敗時的處理方式。它和 Hook 正常執行後回傳「允許」或「拒絕」的決策不同,也和命令本身執行成功、失敗的結果不同。讀設定時要分開看:觸發條件決定何時執行,Hook 的程式決定檢查什麼,失敗處理決定 Hook 沒能正常完成時如何處置。

以下只示意欄位概念,實際設定仍應依安裝版本的官方說明核對,並先在測試環境驗證:

{
  "type": "command",
  "command": "/path/to/check.sh",
  "onFailure": "block"
}

HTTP Hook 的設定以 "type": "http" 和端點 URL 指定處理方式,其失敗策略也可評估使用 onFailure: "block"。在 Claude Code Hooks 官方文件中,Hook 定義於 JSON 設定檔,會綁定事件與比對條件;文件也區分 command、HTTP 等處理程序。版本更新公告確認的是 2.1.295 新增的失敗行為,並未證明每一種作業系統、網路拓樸、啟動器或自訂腳本都已逐一驗證。

「command 或 HTTP Hook 若無法啟動、逾時或以非預期代碼退出,可阻擋對應動作。」— Anthropic,Claude Code 2.1.295 官方 release note(中文意譯)

適用的 command 與 HTTP Hook,以及啟動失敗、逾時、非預期退出

command Hook 可能因可執行檔路徑拼錯、檔案權限不足、直譯器不存在,或執行環境缺少相依套件而無法啟動。程式也可能啟動後卡在外部服務,超過設定時間仍未完成;若結束狀態不符合預期,同樣需要明確處理。onFailure: "block" 將這些失敗視為「不能確認檢查已完成」,於是阻止受它控制的動作。

HTTP Hook 的故障線索則可能在網路、DNS、TLS 憑證、驗證標頭、端點可用性或服務回應時間。即使設定中的 URL 正確,伺服器未啟動、代理設定不同,或憑證剛好過期,也可能使請求無法得到預期回應。故障排查要從實際執行 Hook 的環境出發,開發者筆電能連線,不等於 CI runner 或遠端工作環境也能連線。

HTTP Hook 連線故障的六類檢查項目:端點、DNS、網路代理、TLS 憑證、驗證標頭與逾時
連線失敗可能來自不同環節,應從 Hook 實際執行的環境逐項排查。

必須留意,2.1.295 公告描述的是 command 與 HTTP Hook。不能把它延伸解讀成所有類型的 Hook、所有事件或自訂外掛都套用相同失敗行為。事件本身可能有專屬結果規則,應對照官方文件確認事件、處理程序與新選項的支援範圍。

阻擋的是對應動作,不代表 Hook 故障已經排除

失敗即阻擋把「Hook 無法完成」轉成「被它保護的動作不執行」。它沒有改變檔案權限、補回缺少的程式、修復網路,或讓 HTTP 服務恢復。若同一故障持續存在,符合條件的操作可能反覆被擋下,直到維護者找到原因並修復。

也不能把「動作被阻擋」當成「安全檢查通過」。兩者的狀態完全不同:阻擋表示系統沒有接受該次操作;檢查通過則須有可辨識的成功回應與紀錄。如果錯誤訊息沒有指出 Hook 失敗,操作者可能只看到工具不能用,難以定位該檢查是被拒絕還是根本沒執行。因此,錯誤內容、日誌與告警方式也要列入測試。

Anthropic 文件對 Hook 的描述將輸入、處理程序與決策結果分開;正式部署時也應維持這種區分。安全檢查程式應記錄自己是否成功啟動、檢查到什麼,以及輸出結果。主流程則要能辨識 Hook 發生技術故障的情況,不把未知狀態默認成安全。

哪些自動化流程適合採用失敗即阻擋?

適合用於失敗放行會造成明確安全或作業風險的必要檢查。 若該 Hook 只是提供便利、通知或補充紀錄,阻擋帶來的中斷可能高於風險降低效果,宜先估算失敗後果。

安全檢查、權限判斷與部署前置條件

用於阻止危險命令、確認修改範圍、檢查部署條件,或核對操作是否符合權限政策的 Hook,往往處於關鍵路徑。若檢查程式失敗後仍讓工具照常執行,系統就可能出現「規則已設定,控制卻未生效」的落差。對這類流程,阻擋可作為保護措施之一,但前提是維護者知道故障時如何回復。

例如,部署前檢查需要確認目標環境、版本標記與必要審核。如果檢查端點無法連線,直接阻止部署能避免在未知條件下繼續;接下來仍需檢查端點、網路或授權,而不是不斷重試直到某次偶然成功。涉及權限時,也要確認錯誤訊息不會暴露憑證、敏感路徑或內部資料。

選擇阻擋前,先定義這項 Hook 的責任邊界。若它只檢查某一項條件,就不應宣稱它保證整體作業安全;如果真正的決策還仰賴人工核准或另一個檢查程序,應把各自的結果與責任分清楚。失敗策略只處理執行失敗,不能補足原本沒納入的檢查項目。

通知、紀錄與非關鍵任務的中斷成本

通知和紀錄程序通常提升可觀測性,卻未必決定主要操作能不能安全進行。若通知服務短暫故障就讓編輯、測試或部署全面停擺,團隊可能因過多非必要阻擋而逐漸忽略警示。此類流程可以評估記錄錯誤後繼續、稍後重送,或以其他通知管道備援;具體做法取決於資料是否能補回,以及延遲多久會產生影響。

比較時,可先把「安全控制」與「輔助流程」分開評估:

評估面向安全、權限或部署檢查通知、紀錄或便利功能
失敗後放行的影響可能讓未確認的操作繼續通常是資訊延後或缺漏,仍須確認能否補回
阻擋可能帶來的成本暫停操作,等待修復或人工判斷可能中斷原本可完成的工作
測試重點是否確實阻止動作並呈現原因是否留有錯誤紀錄、重送或替代管道
適用判斷失敗狀態不能被當成通過時,評估阻擋評估中斷成本與資料補救方式後決定

這張表不是固定的設定清單。同一個通知 Hook 若承載法規要求的稽核紀錄,失敗後的影響可能很高;某個安全 Hook 若檢查的只是低風險且可回復的操作,阻擋也可能不划算。應以工作流程的實際責任與後果判斷,而非只按 Hook 名稱分類。

「Hooks are defined in JSON settings files.」— Anthropic,Claude Code Hooks 官方文件(意譯:Hooks 定義於 JSON 設定檔)

怎麼檢查既有 Hook 並降低部署風險?

先盤點版本、設定來源、事件與 Hook 類型,再在可控環境模擬失敗。 只有確認阻擋對象、錯誤訊息與復原程序都符合預期,才將選項用於關鍵流程。

確認版本、設定位置、Hook 類型與觸發事件

第一步是確認執行環境是否已使用 Claude Code 2.1.295 或更新版本,再找出 Hook 設定存在哪一層。官方文件列出使用者、專案、專案本機設定、管理政策及外掛等來源;不同位置的適用範圍不同。專案共同設定、個人本機設定與組織管理設定,不應混為一談。

接著逐項整理事件名稱、比對條件、command 或 HTTP 類型、實際執行路徑、逾時設定與負責維護的人。若設定有多層合併,需確認最後生效的組態,並了解有哪些其他 Hook 同時執行。更新一個檔案後只看檔案內容,未必能代表實際載入結果。

把每個 Hook 對應到受保護的操作,寫下「成功、拒絕、啟動失敗、逾時、服務不可用」時預期發生的結果。若團隊無法回答失敗後動作會不會繼續,代表控制流程還沒盤點清楚。不要直接在正式環境用一次錯誤操作測試,因為真正受保護的動作可能已經造成難以回復的變更。

測試無法啟動、逾時及服務不可用的情境

在測試專案中準備幾種可重現狀況:讓 command 指向不存在的執行檔、移除測試腳本的執行權限、讓腳本刻意超過逾時時間;HTTP Hook 則可暫停測試端點、使用無效測試憑證,或讓服務延遲回覆。測試資料應與正式資料隔離,測試腳本也不要真的執行刪除、部署或權限變更。

每一種情況都要確認四件事:受保護動作是否確實停下、畫面或日誌是否說明是 Hook 故障、重試是否可能重複執行,以及恢復服務後要怎麼安全重跑。若阻擋訊息只顯示通用錯誤,應改善診斷資訊;若重試會重複提交變更,則要先處理重複操作的風險。

最後檢查相依服務與中斷影響。HTTP Hook 可能依賴 DNS、憑證、身分驗證或內部網路;command Hook 也可能依賴 Node、Python、環境變數或外部 CLI。這些依賴若會在維護時更新,應把檢查腳本納入版本管理,並明確指定支援的執行環境。失敗即阻擋能防止未知狀態下繼續執行,卻也會放大相依服務故障帶來的可用性影響。

  1. 盤點會影響安全、權限或部署結果的 Hooks,標記其事件、類型、設定來源與受保護動作。
  2. 在測試環境模擬無法啟動、逾時、非預期退出及 HTTP 服務無法連線,確認動作、錯誤訊息和日誌符合預期。
  3. 估算相依服務故障造成的中斷成本,確認修復、人工介入與安全重跑方式,再決定是否設定 onFailure: "block"。

官方 release note 可以確認 2.1.295 新增了哪些行為,Hooks 文件可以協助理解設定層級與事件機制;兩者都不能單獨證明不同作業系統、部署方式或自訂 Hook 在特定環境下的可靠性。這項主題屬於軟體功能更新,沒有適用的醫學研究證據等級。部署判斷應以自己的環境測試結果為準。

常見問題

它是 command 與 HTTP Hook 的失敗處置選項;採用前應確認版本、觸發事件、失敗情境與流程中斷成本。 阻擋表示動作未執行,不代表檢查成功或故障已排除。

常見問題

Q1:onFailure: block 會自動套用到所有既有 Hook 嗎?

不應假設會自動套用。Claude Code 2.1.295 的公告說明新增了這項設定能力,沒有表示所有既有 Hook 都會自動改成失敗即阻擋。請檢查目前實際載入的設定,並依 command 或 HTTP Hook 的用途逐一評估。

Q2:Hook 被阻擋後,是否代表安全檢查成功?

不是。阻擋代表 Hook 發生指定的失敗狀況時,對應動作被攔下;它不等於檢查執行成功,更不等於系統已確認安全。應從錯誤訊息與日誌辨認 Hook 是通過、拒絕,還是未能完成。

Q3:HTTP endpoint 無法連線時,應先檢查什麼?

先確認 Hook 實際使用的 URL、DNS 解析、網路與代理、TLS 憑證、驗證標頭、服務狀態和逾時設定。從執行 Hook 的環境測試連線,再查看回應與日誌;不要把連線失敗當成檢查通過。