用實例示範簡易的 Loop engineering






Day 183 修完 EZ100PU 讀卡機那個 session,從問題描述到 HiPKI 九項全過,Claude Code 一個 session 搞定——自己在系統 log 裡找根本原因,修了三個卡點,還提前修掉了一個當晚才會出現的問題。
那個 session 的關鍵不是我知道讀卡機怎麼修。它剛好是一個很小、很容易看懂的 Loop Engineering 例子:讓 AI 反覆嘗試、觀察結果、修正做法,直到一個明確終點成立。
Loop Engineering 不是我取的名字,最近很多人在講。它真正複雜的場景,通常是在多人協作、龐大 codebase、長時間任務裡:AI 不是只回你一句答案,而是在一個有目標、有回饋機制、有驗收條件的系統裡反覆修正。
先把實用框架放前面:給清楚的目標 + 收斂條件(convergence condition——Claude 用來判斷「跑到哪裡算完成」的標準),讓 Claude 自己跑完「找出根本原因→修正→驗證」的迴圈,不用你一步一步指定路線。
如果你不是工程師,也可以用這個框架:不用指揮 AI 每一步怎麼做,只要說清楚你要達成什麼,以及什麼狀態才算完成。
這篇先不講那麼複雜的場景,只用這次讀卡機的例子,讓你一窺 loop 到底是什麼概念。
多數人這樣用 AI debug
遇到問題,一步一步問:
「請幫我確認讀卡機驅動版本」 「有了,現在看一下系統 log」 「log 有 error,你覺得是什麼原因?」 「好,那移除舊驅動試試」
這樣問沒有錯,但有一個結構性問題:你在替 AI 決定找什麼。每一步都要你先假設「下一步是 X」,然後 AI 才能動。
如果你本來就知道問題在哪,沒差。但你不知道的時候,你是拿一張自己看不懂的地圖在帶路。
換個框架:目標 + 收斂條件
如果把整個 session 回頭看,真正有用的 prompt 其實只有三個。
其他訊息大多是我在當 Claude 的手:跑 sudo、貼 log、插拔讀卡機、回報「done」。那些必要,但不是真正推動問題解決的 prompt。
第一個 prompt:把問題鎖定在具體硬體和機器上
我一開始下的是:
help me figure out a way to use EZ100PU card reader on this MBA m3
Claude 的回應不是直接給一堆通用建議,而是先把問題定位到 macOS 的讀卡機架構:這不是單純 USB 有沒有接上的問題;讀卡機是 EZ100PU,機器是 M3 MacBook Air,也就是 Apple Silicon;要看的不是「線有沒有插好」,而是 SmartCardServices、PC/SC、driver bundle 有沒有支援這組硬體。
接著它讓我檢查系統有沒有看到讀卡機、macOS 載到哪些 driver、EZ100PU 的 USB VID/PID 有沒有被 Apple 內建 CCID driver 支援。
如果你看不懂 driver、log、VID/PID 這些詞,沒關係。這些技術細節不是要你全部學會,而是證據:Claude 沒有亂猜,它是在跟著系統線索往下查。
這時候我沒有下第二個大 prompt,只是照它要的,把 system_profiler SPSmartCardsDataType、安裝輸出、bundle 狀態貼回去。
第一個 prompt 的作用,是讓 AI 不要在「讀卡機不能用」這種模糊問題裡亂猜,而是直接進到正確的問題範圍。
第二個 prompt:卡在 log 裡時,把 debugging 交出去
中間真正卡住,是 log 開始出現 BTMErrorDomain,而且系統看到的不只我剛裝的 driver,還有一個舊的 ezusb.bundle。
這時我打的是:
help me resolve the issue
這句看起來很普通,但前面已經有足夠的現場資料了。
Claude 的回應是:先不要只看新 driver,因為舊的廠商 driver 也 match 到同一組 USB VID/PID,而且它是 x86_64,在 M 系列 Mac 上會出錯。這代表問題可能不是「新的 driver 不會動」,而是「舊的 driver 搶先配對,讓新的 driver 沒機會接手」。
所以它開始往衝突的舊 driver 的方向查:哪個 bundle 被掃到、哪個 package 裝進來、移除後要不要重插讀卡機、ifdreader 要不要重啟。
這裡的重點不是我問得漂亮。
而是我沒有開始 micromanage:
「你先查 A」 「你再查 B」 「是不是 C?」
我只是在它已經看到 log 的狀態下,讓它自己查根本原因。
第三個 prompt:給它真正的成功標準
最後一個 prompt 才是重點:
I'm using http://localhost:61161/selfTest.htm to test if the reader works. /goal use it to verify until it works.
這句把整件事從 Q&A 變成 loop。localhost/local server 指的是跑在自己電腦上的測試頁,不是公開網站。
Claude 的回應也跟前面不一樣。它不再只是說「driver 看起來載入了」,而是開始把 HiPKI self-test 當成最後驗收:底層 PC/SC 能不能列出 reader、卡片能不能 connect、HiPKI local server 有沒有拿到新的 slot 狀態、頁面上的九項檢測有沒有真的變綠。
也因為這個成功標準夠具體,它才沒有停在「系統看得到讀卡機」那一步。
它一路追到 HiPKI local server 的狀態,要求重新啟動服務、重跑測試,直到 self-test 全部通過。
這就是 loop 裡的收斂條件(convergence condition):不是讓 AI 自己宣布「應該好了」,而是給它一個外部可檢查的終點。
所以框架不是一句咒語
你只需要給兩件事:
目標——要解什麼: 「EZ100PU 插上 M 系列晶片 Mac,HiPKI 讀不到讀卡機,幫我解掉。」
收斂條件——什麼狀態叫完成: 「HiPKI 官方自我檢測頁九項全過才算解決,網址是 http://localhost:61161/selfTest.htm」
中間不是什麼都不用做。你還是要把 AI 要看的輸出貼回去,該插拔硬體就插拔,該授權的指令就授權。
但你不用事先知道問題在哪一層——只需要定義清楚「什麼狀態算成功」。
Day 183 的迴圈實際跑了什麼
給完目標和收斂條件,Claude Code 自己走的路是:
system_profiler SPSmartCardsDataType看驅動載入狀態,發現(null):(null)- 讀
Info.plist,找到 XML parse 失敗的原因:plist 裡有未跳脫的 email 地址(<nicolas@boichat.ch>),角括號在 XML 是非法字元,修掉 - 發現
CFBundleIdentifier跟系統驅動撞名,改掉 - ad-hoc 簽章問題,修掉
- 開系統 log 串流(
log stream --predicate 'processImagePath CONTAINS "ifdreader"'),看到廠商的 x86_64ezusb.bundle搶先配對同一組 USB VID/PID,架構不符拋出 BTM 錯誤,讀卡機從 PC/SC 消失——找到根本原因 - 移除衝突的舊驅動,重插讀卡機,HiPKI 九項全過
沒有一步是我指定的。
它還提前修了一個我還沒遇到的問題
這是讓我覺得「框架給對了」最直接的證明。
Claude 在 debug log 裡看到那個衝突舊驅動的 pkg ID(com.mygreatcompany.pkg.EZ100driver),知道 HiCOS 更新可能會把這個東西塞回來——就算現在修好,下次更新照樣壞。
所以它主動在 install.sh 裡加了「先移除衝突的舊驅動」這個步驟。
當天晚上 HiCOS 更新,讀卡機照樣被搞壞,重跑安裝腳本,問題消失,之後 HiCOS 更新也比較不怕。
它沒有只把目標看成「現在能過一次」,而是繼續想到「之後也要能正常用」——所以自己多想了一步。
這只是最小版本的 loop
這個讀卡機案例很小,只有一個人、一台電腦、一個硬體、一個自我檢測頁。
真正多人協作或龐大 codebase 裡的 Loop Engineering 會複雜很多:要處理任務拆解、上下文同步、權限邊界、測試矩陣、review、rollback,還有多個人和多個 agent 之間的 handoff。
但概念是一樣的。
不是只問 AI 一句話,而是讓 AI 在「目標 → 行動 → 觀察 → 修正 → 驗收」裡反覆跑,直到外部條件真的成立。
這次 EZ100PU 只是最小、看得見概念的例子:你可以很清楚看到,當成功標準從「你覺得好了嗎」變成「HiPKI 九項全過」,AI 的行為就會完全不一樣。
什麼時候適合用這個框架
前提是:你能說清楚「什麼狀態算成功」。
適合:
- 環境或驅動問題(某個指令能跑、某個服務有回應才算完)
- 自動化測試(全部 pass)
- 資料清洗(符合某個 schema)
- 安裝流程(verify 腳本跑完全過)
不太適合:
- 需要主觀判斷的東西(UI 好不好看、文案語氣對不對)
- 需求本身還沒想清楚(目標還在飄,說不出收斂條件是什麼)
- 你已經知道解法(直接給步驟就好,不用開迴圈)
實際互動會比單純一問一答多跑幾次,但拿來解一個不知道根因在哪的問題,划算。
你給步驟,AI 幫你走你規劃的路;你給目標和收斂條件,AI 自己找路走到終點。
最近開始做免費的一對一諮詢,幫你把 AI 接進自己的工作流——有需要的話可以約:https://www.dawsonwang.com/
Day 183 完整修驅動過程和開源 repo → https://github.com/andrew54068/ez100pu-apple-silicon