生活分享
Claude Code|建立可停止的品質檢查 Hook
讓完成檢查能指出失敗並有清楚的退出機制。測試沒有通過時,Claude 應知道工作還有問題;但如果 Hook 每次都阻止結束,又可能陷入不停重試。本篇建立有次數邊界的 Stop 檢查,第一次失敗回報原因,重複觸發時停止遞迴,並把尚未完成的結果清楚交回讀者。
閱讀時間約 6 分鐘

本篇目錄
測試沒有通過時,Claude 應知道工作還有問題;但如果 Hook 每次都阻止結束,又可能陷入不停重試。本篇建立有次數邊界的 Stop 檢查,第一次失敗回報原因,重複觸發時停止遞迴,並把尚未完成的結果清楚交回讀者。
先讀事件輸入與退出碼Claude Code|讀懂 Hook 事件:輸入、輸出與退出碼建立可重播事件的本機測試工具。Hook 教學最容易卡住的地方,常常不是腳本語法,而是沒有分清楚誰送入事件、腳本讀到什麼,以及輸出會由誰解讀。本篇建立一個能重播事件的小實驗室,先用固定 JSON 驗證腳本,再接到 Claude 的實際事件。最後你會有正常、拒絕、輸入錯誤及診斷訊息四種可辨認結果。閱讀全文、格式化 HookClaude Code|只處理變更檔案的格式化 Hook限制格式化範圍並避免事件重複執行。格式化 Hook 如果每次都掃描整個專案,可能改到與任務無關的檔案。本篇只處理 Write 或 Edit 剛完成的 JSON 練習檔,檢查路徑、解析內容,再在有必要時寫回。你會用連續重播確認第二次不再產生變更,也會驗證失敗時原始資料仍保留。閱讀全文及除錯測試Claude Code|除錯與補測試從重現問題走到修正與回歸測試。這篇用一個刻意準備的待辦錯誤,示範如何把症狀轉成重現步驟、定位原因、補測試並驗證修正。材料中的問題是勾選一筆待辦時改到其他項目;你會先看到預期失敗,再確認修正後同一案例通過,避免只憑「看起來正常」就結束除錯。閱讀全文。下載第 75 篇材料,在 starter 操作。需要 Node.js 22 以上,真實事件另需 Claude 登入。閱讀約 20 分鐘,實作約 45 分鐘。
先定義這個檢查能保證什麼
閱讀完整文字說明
建立可停止的品質檢查 Hook,以流程和文件圖形呈現教學重點。
本課在 Stop 事件執行固定的模型測試命令,只檢查這四個測試是否通過。它不是不可繞過的 CI,也不表示網站已通過瀏覽器、手機或部署驗證。把一個小 Hook 說成完整品質保證,會讓讀者誤以為未覆蓋的部分也已檢查。
材料的 hooks/quality.mjs 使用 Node 啟動另一個 Node 程序,傳入參數模型參數(Model Parameters)是什麼模型參數是訓練時調整、用來把輸入轉成輸出的數值,例如權重與偏差。本文用簡單算式示例說明參數如何影響預測,區分模型參數、訓練超參數、提示詞與生成設定,並解釋參數量、數值精度和啟用參數為何是不同指標。讀完能更準確閱讀模型規格,理解參數增加不等於知識逐條增加,也不代表每次聊天都在重新訓練模型。閱讀全文陣列,不從事件拼接命令。工作目錄取自事件 cwd,執行上限十五秒。固定命令能讓結果可比較,也避免一次 Stop 自動安裝依賴、啟動外部服務或跑一整套沒有時間上限的工作。
先手動執行 node --test tests/model.test.mjs,確認四個基準測試基準測試(Benchmark)是什麼基準測試用共同題目、執行設定與評分方法比較系統,是理解 AI 能力的一種參考,不能直接當成所有用途的排名。本文以圖書館資料整理需求為例,說明題型、指標、提示詞、工具與測試汙染如何影響分數,解釋平均值與排名變動的限制。讀完能閱讀基準的適用範圍,判斷不同報告是否真的可比,並把公開成績接到自己的實際任務驗證。閱讀全文正常。若本機 Node 不存在,Hook 自然也不會成功;先處理環境,再談品質判斷。執行失敗、測試斷言失敗和超時都應保留原因,不能全部換成「已檢查」。
看懂停止事件的回應
PreToolUse 使用的拒絕欄位不適用所有事件。Stop 若需要要求繼續處理,可依官方事件格式輸出 decision:block 與 reason;不需要阻止時則正常結束。每個事件的 JSON 契約不同,應先用離線資料確認,再安裝到真實工作階段。
{
"decision": "block",
"reason": "模型測試未通過。請查看實際測試輸出,修正原因或明確回報受阻;不要宣稱完成。"
}
reason 應包含下一個可執行動作,而不只是「失敗」。本課指向固定的核心測試,讓讀者可以在終端機重跑取得完整結果。若你擴充成多套測試,須記錄是哪一套失敗及執行範圍,不要讓模型在沒有依據的情況下重寫程式。
輸出 JSON 不代表 shell 退出碼一定非零。Hook 決定與程序是否正常產生回應是兩層訊號,需要分別檢查。反過來,腳本本身拋錯,也不等於它產生了一個有效的 Stop 阻擋決定,不能把兩者混成同一種失敗。
先以正常事件重播
材料中的 fixtures/stop.json 是手工事件,包含 hook_event_name 和 stop_hook_active。先在正確專案重播,預期核心測試通過,沒有輸出阻擋決定。接著記錄重播命令退出狀態,確認工具沒有一直留在執行中。
node hooks/replay.mjs quality fixtures/stop.json
node --test tests/model.test.mjs
這一輪證明腳本能接受事件並執行測試,不代表 Claude 真正送出過 Stop。把「離線重播」「Claude 事件」「手動測試」分成三種來源,後續報告就不會把同一份假資料重播誤當成完整產品整合驗證。
對於沒有測試需求的簡短對話,無條件在每次 Stop 跑測試可能只是增加等待。本篇先展示固定檢查的機制,真實專案可再加入有根據的變更判斷,例如只在相關檔案改動後執行。不要以猜測模型正在寫程式作為唯一觸發條件。
注入一個確定會失敗的測試
保存 model.js,將 toggleTodo 的相等比較刻意改成不相等,再手動執行模型測試。預期與識別碼相關的案例失敗。這個故障影響小、可重現,適合用來驗證 Hook;不要以破壞套件安裝或刪除大量檔案製造混亂的失敗。
再次重播 Stop,預期得到 block 決定。記錄 reason,再手動重跑測試查看原始斷言。確認是因為功能錯誤被阻擋,而不是命令寫錯或工作目錄不正確。兩種狀況都可能導致非零結果,但需要不同修正。
故障檔案修好後,重新執行測試與 Stop 重播。完成證據應包含失敗前、故障時、修正後三個結果。只把 Hook 停用,測試仍失敗,不能算功能已修復;停用是控制自動化行為,修正程式是另一個工作。
使用 stop_hook_active 避免遞迴
當 Stop Hook 已經促使 Claude 繼續處理,再次收到停止事件時,不能無限重複相同阻擋。材料檢查 stop_hook_active;重複事件只回報仍需明確說明測試狀態,不再輸出 block。這是一個刻意有限的策略,讓失敗能交回讀者。
{
"hook_event_name": "Stop",
"session_id": "lab-75",
"stop_hook_active": true
}
node hooks/replay.mjs quality fixtures/stop-repeated.json
預期不再阻擋,也不再啟動同一套遞迴測試。這不代表測試變成通過,最後回報仍應指出未完成。將「可以結束對話」與「品質已達標」分開,才能避免為了防止遞迴而把錯誤隱藏起來。
若你需要更多重試,可以另外保存有上限的狀態,但必須處理工作階段識別、清理及異常中斷。單靠一句「最多再試一次」的自然語言不等於程式計數器。本篇先採事件旗標與一次阻擋,便於讀者理解和驗證。
安裝到 Claude 並做真實觸發
先備份現有設定,再將 Stop 項目合併到 .claude/settings.json。Hook 外層 timeout 應留足腳本自己的十五秒測試時間;本課設二十秒。外層與內層上限不同,是為了讓腳本有機會整理結果,而不是先被外層直接終止。
{
"hooks": {
"Stop": [
{
"hooks": [{"type": "command", "command": "node hooks/quality.mjs", "timeout": 20}]
}
]
}
}
建立新工作階段,先用正常專案完成一個唯讀任務,再用故障版本完成同樣任務,觀察 Stop 行為。不要在提示詞直接貼預期的 Hook JSON 答案。保存事件紀錄和實際測試結果,才足以確認真實整合。
測試失敗訊息要能導向下一步
品質檢查阻擋結束時,訊息應指出要執行的命令及失敗類型。只有一句「請修正」會讓下一輪再次猜測原因。若完整輸出太長,可保存到本機檔案並在摘要列出檔案位置,讓讀者能看到原始錯誤而不必依賴模型轉述。
反覆失敗時停止自動循環,回到終端機直接執行相同測試。先確認測試本身可運作,再決定是否繼續修正。重新觸發 Stop 並不會自然解決環境缺少工具或測試命令寫錯的問題。
常見失敗與停止方式
| 症狀 | 檢查重點 | 下一步 |
|---|---|---|
| 每次都繼續無法結束 | 重複事件旗標 | 確認 stop_hook_active 分支 |
| 沒有測試就被阻擋 | cwd、命令、Node | 手動重跑同一命令 |
| 超時後仍說成功 | 子程序狀態與錯誤分支 | 非完成結果保留為失敗 |
| Hook 停用後測試仍壞 | 程式故障尚未修復 | 恢復 model.js 並重測 |
若工作階段無法正常結束,先中止本次練習,再恢復自己備份的 Stop 設定,建立新階段確認不再觸發。不要刪除所有 Hook 或終止整台電腦的 Node 程序。只處理本次啟動的程序及設定,保留故障紀錄供排查。
完成判準包含通過、故障、修正、重複停止四種案例;每次都能指出測試結果及是否產生 block。小練習是讓固定測試超過內層時間上限,確認最後仍回報未完成,再恢復正常測試。若要處理更複雜的逾時與跨平台行為,接著閱讀Hook 恢復實驗Claude Code|跨平台 Hooks:中文路徑、逾時與遞迴排錯把 Hook 做成可測試、可停用、可移植的工具。Hook 在作者的資料夾能跑,不代表移到中文路徑、另一個 shell 或不同作業系統也正常。本篇建立一張環境矩陣,檢查路徑、編碼、換行、逾時與重複事件,最後寫出能停止並恢復正常工作的操作手冊。閱讀全文。
回 Claude Code 教學總目錄Claude Code 完整教學目錄:從入門到自動化依平台、程度與功能找到需要的教學,從 96 篇文章與共用練習專案逐步完成操作。這個教學中心把 Claude Code 分成 96 個可以獨立閱讀的小題目,從桌面、CLI、網頁與手機開始,再學 MD 規則、常用指令、Skills、MCP 與自動化。你可以依推薦路線循序學習,也可以直接搜尋正在遇到的功能、命令或檔名。目錄依目前公開狀態顯示可閱讀文章。閱讀全文
同主題延伸閱讀
生活分享
Claude Code|建立第一個 mod:在 Claude Code 行程內數工具呼叫
寫一個三檔案的 mod,用驗證器與測試確認它掛上的事件。文件把 mod 定義成多了入口檔的 plugin:入口檔叫 hooks module,Claude Code 在事件發生時呼叫裡面的函式,函式可以觀察、改寫或接手事件。
生活分享
Claude Code|Git Worktree 平行工作
隔離多個任務的檔案與分支。Git Worktree 讓同一儲存庫擁有多個工作目錄,各自使用分支與檔案。本篇會把待辦篩選與文件整理分開,確認兩個 session 不會直接改到彼此的檔案,再把其中一個成果整合回主分支。你也會知道何時可以安全清理工作目錄。
生活分享
Claude Code|雙 Worktree 實作與衝突整合
隔離兩項功能,最後完成整合與回歸。兩個 Claude 工作階段同時編輯專案,最容易出現的問題是互相改到同一份檔案,或各自測試通過、整合後卻失敗。本篇用兩個 Worktree 分別處理篩選預設值與介面文字,故意製造一次小衝突,再完成整合、驗證與清理。你不需要先啟用 Agent Teams。
生活分享
Claude Code|比較流程品質、用量與執行時間
以同一資料集比較兩種工作方法。比較兩種 Claude 工作方法時,不能只挑成功那一次,也不能只看第一個答案有多快。本篇用固定案例、原始紀錄和一致判準,比較品質、重試、等待與人工整合時間,最後寫出有樣本數與限制的報告,而不是保證某個方法一定省錢。
引用本文的文章
最新旅遊情報攻略

情報
2026 韓國楓葉預測:雪嶽山 10 月 20 日、首爾近郊 10 月底、內藏山與漢拏山 11 月上旬
韓國山林廳 2026 年 9 月 22 日公布的楓紅高峰預測:雪嶽山 10 月 20 日,春川、國立樹木園到首爾植物園落在 10 月 28 日到 11 月 2 日,內藏山 11 月 4 日、漢拏山 11 月 6 日,整體比最近 5 年晚約 0.8 天。整理各地楓樹與銀杏的預測日、首爾出發怎麼排,以及出發前去哪裡看即時楓況。2026 年 10 月查證。
- 季節活動
- 自然
- 觀景

攻略胡志明市
胡志明市到頭頓一日遊:白藤碼頭搭高速船、船票與班次,下船就是胡梅纜車與耶穌基督像
人在胡志明市挪一天去頭頓看海:市中心的白藤高速船碼頭搭船,航程 120 分鐘到頭頓的胡梅碼頭,平日成人 320,000 越南盾、週末 350,000,回程末班平日 15:00。下船就是胡梅纜車站,同一條路上有白宮,小山頂上是耶穌基督像。平日一天只有兩班船,整天要從末班船倒推著排。
- 交通
- 行程範例
- 海灘

攻略沖繩
沖繩不開車攻略:單軌只到浦添,美麗海水族館要坐兩個多小時的巴士,回那霸的最後一班直達車 17:22 就開走
不租車的沖繩怎麼移動:那霸市區靠沖繩都市單軌電車(ゆいレール),那霸機場站到終點てだこ浦西 19 站、17 公里、37 分鐘,一日券 1,000 日圓;美麗海水族館有那霸機場直達的高速巴士,單程 2,000 日圓起、官方時刻表上 2 小時上下,下車後還要走 10 分鐘;古宇利島要在今帰仁村役場轉車,當天來回光坐車就六個半小時;回程的最後一班直達車 17:22 就從記念公園前開走(2026 年 9 月查證)。
- 交通
- 行程範例
- 預算
資料來源
- Hooks reference · 查證日期: