AI 寫的 code 一堆 bug?讓 Claude 跟 Codex 自動互審
by Gary Chen
逐字稿
00:00 寫軟體的成本在過去兩年因為 AI 被不斷壓低
00:03 你不用是工程師,不用懂程式
00:05 一句話就能讓 AI 幫你生出一個網頁,甚至一個 app
00:08 這就是這一兩年大家都在講的 vibe coding
00:11 但只要真的動手做過
00:12 你應該都遇過同一件事
00:14 就是不管你用哪一個 model
00:15 它做出來的東西總有些地方沒想清楚
00:18 可能會漏掉某些 corner cases
00:20 可能某個邊界沒處理,跑起來就是一堆 bug
00:23 然後你就得回頭跟它講這裡不對,那裡要改
00:25 改完後可能又冒出新的問題
00:27 一來一回,其實 vibe coding 的時間
00:29 全部都卡在這上面
00:31 為了解決這個痛點
00:32 這支影片想分享的是我自己一直在用的一套工作流
00:35 cross model review
00:36 講白話就是讓 Claude 跟 Codex 可以彼此自動 review
00:39 找出各自的盲點
00:41 我本來是 Claude 的死忠用戶
00:43 後來有一陣子我覺得它明顯降智了
00:45 於是我就轉去用 Codex
00:47 但用久了我又發現 codex 也有它的缺點
00:50 於是我想通一件事,我幹嘛非得二選一
00:52 這兩個 model 各有各的脾氣,各有各的強項
00:56 那我兩個都要,各取所長,不是更好嗎?
00:59 那我們直接開始
01:00 先講一下兩個模型的分工
01:02 多數時候我的主力是 Claude
01:03 大部分的討論和實作計劃
01:05 都是我跟 Claude 一起弄出來的
01:07 而 Codex 的角色是 reviewer,專門幫我挑錯
01:10 你當然可以反過來
01:11 畢竟 codex 比 Claude 便宜不少
01:13 但我自己使用下來的感覺是
01:15 Claude 很像班上那個第二名的學生
01:17 跟它合作很愉快,討論起來它也很細心
01:19 你丟一個想法給它,它能夠理解你
01:22 有時候還會給你一點驚喜
01:23 但就是偶爾會粗心,有些細節沒顧到
01:26 有些狀況想得不夠周全,所以總是考第二名
01:29 Codex 則是很無聊,跟它對話沒什麼火花
01:32 但它就是穩
01:33 尤其在處理後端比較複雜的邏輯時特別可靠
01:36 該想到的它都幫你想到了
01:38 所以 codex 考試總是可以第一名
01:40 再說一次,兩者的職責沒有對錯,單純靠個人偏好
01:44 你完全可以讓 codex 主導對話
01:46 然後讓 Claude 來 review
01:48 對我來說,reviewer 這個位子
01:50 就是要找那個無聊,但永遠不出錯的人
01:53 來幫你守最後一道關
01:54 至於那個有趣,但偶爾粗心的
01:57 讓它在前面負責互動和創意就好
01:59 把關這種事,要的就是穩,不是有趣
02:02 既然要審
02:03 那我為什麼不乾脆叫 Claude 自己再檢查一遍
02:05 還要多拉一個 Codex 進來?
02:07 因為模型在訓練時,側重點會有點不一樣
02:10 比方說 codex 在做前端的時候
02:12 常常給我一些看了會讓人吐血的設計
02:14 反觀 Gemini 或者是 Claude 在這方面就做得比較好
02:17 你自己寫的東西,自己讀了三遍,還是有錯字
02:21 結果拿給別人,人家一眼就看到了
02:24 AI 也是一樣的道理
02:25 一個 model 寫出來的東西
02:27 它自己讀起來一定都很合理
02:28 因為它就是用同一套腦袋
02:30 還有同一套假設在檢查自己
02:31 而這樣子做總是會有盲點的
02:34 我最早在做這件事的時候,完全是純手工的
02:37 當 Claude 寫完一份 plan
02:39 我把它整份複製起來,貼到 Codex 那邊
02:42 叫它幫我 review
02:43 Codex 給我一串 feedback
02:45 我再把這串 feedback 複製回 Claude 請它修改
02:48 改完我會再貼回去 Codex 給它複查
02:50 就這樣來來回回跑個好幾輪
02:52 直到兩邊達成共識
02:54 雖然我並沒有去做一個很嚴謹的 ab test
02:56 但這樣做下來,我的體感是
02:58 程式碼架構確實變得比較乾淨
03:00 技術債變少了
03:01 後修 bug 的頻率也變得非常低
03:03 不過問題也接踵而來
03:05 就是我成為了生產力的瓶頸
03:06 因為我必須擔任中間那個負責複製貼上的人肉橋樑
03:10 一開始還好,反正一次就處理一條線
03:13 慢就慢一點
03:14 但如果你需要多功能並行開發
03:16 勢必會用到 worktree
03:17 也就是說我手上同時有三條,四條開發線在跑
03:21 那每一條線的 plan
03:23 我都得這樣手動跑好幾輪的 review
03:25 所有東西都卡在我複製貼上的速度上
03:28 光是切換上下文我就快瘋了
03:30 而且有時候我會偷懶
03:31 有些 plan 比較小,看起來比較簡單
03:33 我瞄一眼就會想這個應該沒事吧
03:35 然後就直接跳過 review 了
03:37 結果最後出包的偏偏就是那些我覺得應該沒事的東西
03:40 而且常常跳過 review 省下的那五分鐘
03:42 後面要花我一兩個小時去擦屁股
03:45 這件事就是整套系統的起點
03:47 人的紀律是靠不住的
03:48 所以與其逼自己每次都記得
03:50 不如把這件事直接做成系統
03:52 讓它每一次都自動發生
03:54 不管我當下想不想做,完全不依賴我的紀律
03:57 那要怎麼做成系統?
03:58 我先用一個比喻幫助各位理解
04:00 想像一間出版社在出書之前的流程
04:03 第一個角色是作者,負責寫稿
04:06 第二個角色是門口的守衛
04:07 這個守衛只認一件事
04:09 就是你的稿子上有沒有蓋一個審核通過的章
04:11 如果沒有蓋章,對不起
04:13 你這份稿子就不准送出這道門
04:15 那要怎麼拿到章?
04:17 稿子得先送到第三個角色,也就是審稿人那邊
04:20 作者跟審稿人會來回討論
04:22 審稿人提出問題,作者要嘛把它改掉
04:25 要嘛拿出理由
04:26 反過來說服審稿人這樣沒問題
04:28 然後審稿人再看一輪
04:30 就這樣一直到兩個人都同意了
04:31 審稿人才會蓋上那個審核通過的章
04:34 守衛看到章會放行
04:35 而你身為老闆從頭到尾只會看到最後那份定稿
04:38 中間那些吵架,修改的過程
04:40 你完全不用管,也不用知道
04:42 好,那我們把這個比喻,直接套回我的系統
04:46 那個作者就是 Claude,審稿人就是 Codex
04:48 門口的守衛是一個叫 stop hook 的東西
04:51 而那個審核通過的章
04:52 就是一段寫在檔案結尾的文字,我叫它 marker
04:55 整套系統要跑起來其實非常簡單,分成兩塊
04:58 第一塊是 stop hook,扮演守衛
05:00 它是 Claude Code 裡的一個機制
05:02 每次 Claude 想收工
05:03 要把控制權交還給你之前,它就會被觸發
05:06 被觸發的時候它有兩個選擇
05:08 第一是放行,那這一輪就正常結束
05:10 第二是擋下來,然後塞一段訊息回去
05:13 讓 Claude 不結束
05:14 把那段訊息當成新的指令繼續做事
05:17 這個能擋下結束
05:18 還能塞一段提示詞回去的能力
05:20 就是整套系統能成立的關鍵
05:22 它在我的系統裡做三件事
05:24 第一,掃這一輪有沒有寫出一份 implementation plan
05:28 第二,有的話,翻到那份檔案的結尾
05:30 看有沒有那個審核通過的 marker
05:34 第三,如果沒有 marker,就擋下這次結束
05:36 塞一段話回去
05:37 叫 Claude 去跑 codex review skill
05:40 所以 stop hook 只負責攔,不負責審
05:43 第二塊就是剛剛提到的 skill
05:44 提供 Claude 一套審稿的方法論
05:47 Claude 被 stop hook 攔下來後,會閱讀這份 skill
05:49 而這份 skill 會指示 Claude 調用 Codex CLI tool
05:52 然後請 Codex 幫忙 Review
05:54 直到最後 Codex 放行這個實作計劃後
05:57 再回頭在檔案結尾蓋上那個審核通過的 marker
06:00 這兩塊平常互不相干
06:02 中間就靠 marker 這個暗號接起來
06:05 守衛只認 marker,看到就放行,沒看到就攔
06:08 而這個 marker 只有 skill 審過了才蓋得上去
06:11 你可能會問,幹嘛拆成兩塊?
06:13 其實就是單純的解耦
06:15 把攔截的工作交給 stop hook
06:17 把審核的方法論交給 skill
06:19 如果發現攔截失敗
06:20 或者攔截後 Claude Code 的行為異常,就修 stop hook
06:23 反之,如果發現 review 品質不佳
06:26 就改 skill 裡面的 review 方法論,兩者各司其職
06:30 好,兩塊都講完了
06:32 接著我把整套流程完整跑一遍給你看
06:34 一個完整的循環有五步
06:37 第一步,Claude 寫完一份 plan,想結束對話
06:40 這時會觸發第二步,也就是 stop hook
06:43 stop hook 一掃,發現檔案尾巴沒有 marker 就會擋下
06:47 然後進入第三步
06:48 Claude 收到 stop hook 預先設置好的指令
06:50 去啟動 codex review skill
06:51 呼叫 Codex 並請它 review
06:54 第四步就是兩邊一輪一輪過招
06:56 該修的修,該反駁的反駁
06:58 直到雙方有了共識且 Codex 回覆通過
07:01 最後一步是收到審核通過後
07:03 Claude 會在檔案尾端蓋上審核通過的 marker
07:06 而我的任務就是掛在那邊
07:07 等它們兩個自己討論完畢,然後進入實作
07:10 但在這套流程裡面
07:11 還有一個我自己實驗下來比較重要的事情
07:14 要特別強調
07:15 也就是審核的方式還有通過標準
07:17 這套流程的通過標準
07:19 不是你們來回討論滿三輪就算過
07:22 它的標準是兩個 model 真的達成了共識
07:25 審稿人 Codex 不能為了想趕快結束
07:27 就隨便點個頭放水
07:28 作者 Claude 也不能為了想趕快過關
07:30 就假裝問題不存在
07:32 每一個爭議,Codex 都要明確表態
07:34 要嘛它被說服了,承認你說得對
07:37 要嘛它堅持,那就要講清楚它到底在堅持什麼
07:40 有爭議,就繼續吵
07:41 要嘛你把對方說服,要嘛你被對方說服
07:44 沒有達成共識,就不准收工
07:46 講到這邊
07:47 有試過類似操作的朋友應該也想到一個可能的狀況
07:50 也就是當你丟一份其實已經很好的實作計劃給 AI
07:52 它總是能挑出那一兩個漏洞
07:54 要嘛是它沒有足夠的 context
07:55 認為某些設計決策是 bug
07:57 要嘛就是它過度追求完美導致 over engineering
08:00 底層的原因是大型語言模型有 sycophancy 的傾向
08:03 你給它什麼任務它都會使命必達
08:05 所以你請它 review
08:07 它就會想辦法給你找出幾個問題來
08:10 而這套流程能打到一個甜蜜點
08:11 能收斂而且不會一直無限拖下去
08:13 關鍵就在我從頭到尾只開同一個 Codex 對話
08:16 不是每一輪都重開一個新的 session
08:18 具體怎麼做有點枯燥乏味,你可以直接問你的 AI
08:21 我也會直接把我的 codex review skill 放在 Patreon 文章裡
08:25 這邊就不多贅述
08:26 如果每一輪都重開一個新的 Codex
08:28 它每次都是冷啟動,什麼都不記得
08:31 那它每一輪
08:32 都可能挑出一堆新的,而且不重要的小毛病
08:34 永遠挑不完,你也永遠改不完
08:37 這就變成過度設計了,沒完沒了
08:39 但如果是同一個對話,它記得自己上一輪講過什麼
08:43 所以第一輪
08:44 它就會把主要的問題一次抓出來
08:46 我把這些修掉就好
08:47 下一輪,它是來驗收的,看我改對了沒
08:50 然後往共識收斂
08:52 而不是沒事找事,重新發明一堆新問題
08:55 當然這樣的缺點就在於第一次如果漏看
08:58 可能就會漏掉一些關鍵的 bug
08:59 但其實這樣做已經可以解決 80% 的問題
09:02 省掉我大量的時間
09:04 我要的是 Codex 一次抓出真正重要的問題
09:07 不是陪我玩到天荒地老
09:09 其實我一開始的版本,有設一個最多三輪的上限
09:13 後來我發現這個上限會逼出一個很糟的結果
09:16 就是到了第三輪
09:17 不管問題到底解決了沒
09:19 它都會為了結束,而假裝沒問題
09:21 這完全違背我做這件事的初衷
09:23 所以我把上限拿掉了,只認一個標準,共識
09:27 光這樣講可能有點抽象
09:28 我舉一個比較具體的例子
09:30 假設你叫 Claude 規劃一個電商網站的下單功能
09:33 它給你一份 plan,寫得漂漂亮亮
09:36 其中有一條寫著
09:37 這個功能必須保證不會超賣
09:39 同一件商品不會賣給兩個人
09:41 聽起來很完整對吧
09:42 但你仔細看,整份 plan 從頭到尾
09:45 它都沒寫具體的處理方法
09:46 像是只剩最後一件的時候
09:48 兩個人同時按下下單
09:50 那一瞬間到底要怎麼處理
09:51 誰先搶到,另一個又是怎麼被擋下來的
09:55 Claude session 可能是因為 context 過長導致遺漏細節
09:57 或者是模型在處理這種 corner cases 的時候
10:00 本來就容易粗心大意
10:02 不管是什麼原因
10:03 這時你換 Codex 或者另外一個模型
10:05 它用第三方的角度客觀的去審核這個計劃
10:08 就有更高的機率可以發現這個實作計劃的盲點
10:11 而這就是整套系統真正的價值
10:13 講到這裡,我想把這件事往上拉一層
10:16 我做的其實不只是找第二個 AI 來審稿這麼一件小事
10:19 我是在根據自己的使用習慣替自己建一套 harness
10:22 新來的朋友可能不熟悉
10:24 harness 這個詞你可以把它理解成
10:26 包在 AI 外面的那一整套工作環境
10:28 包含你給它的限制,流程,跟工具
10:31 老闆幫員工搞個舒服的辦公室
10:33 準備零食區,休息區
10:34 目標是提高員工的工作效率
10:36 Harness 就是你幫 AI Agent 準備的辦公室
10:39 回頭看我這套流程
10:40 stop hook 扮演的是強制約束
10:42 它逼著流程一定要走完,不給你偷懶的空間
10:45 skill,扮演的是工作方法
10:47 它定義了審核的流程跟方法,到底要怎麼審
10:51 而 marker 是它們之間的握手暗號
10:54 cross model review 只是我這套 harness 裡的其中一塊而已
10:57 同樣的思路你可以拿去包任何一件
10:58 你本來就會做,但常常會偷懶跳過的事
11:02 Harness 其實不用複雜
11:03 就像一個好的產品不用太花俏
11:05 它可能非常低調,非常簡單
11:07 但只要能解決那個你生活中不起眼的小摩擦
11:09 你都會很爽很爽
11:11 像我自己建置的這個 stop hook
11:13 就是幫我解決了來回複製貼上這麼小的問題
11:15 就足以大幅提高我的工作效率
11:18 講到這裡
11:18 如果你想直接把這整套立刻搬到自己電腦裡
11:21 或者你不知道怎麼設置 stop hook
11:23 我在 Patreon 文章裡有提供完整的教學
11:26 包括我的 stop hook 設定方式
11:28 以及 codex review skill
11:29 不是什麼很複雜的 rocket science
11:31 但這是我用了兩個多月的工作流程
11:33 有需要的朋友可以在影片下方資訊欄找到連結
11:36 那我們繼續
11:37 所以當 AI 一直產出不夠好的東西
11:39 與其每次都自己跳下去手動救
11:41 我更想回頭問一個問題
11:42 我的系統,為什麼會讓這種東西過關?
11:45 然後從系統的層面
11:46 直接把這個漏洞封殺掉,讓它下次不再發生
11:49 如果你是一個 solo developer
11:51 一個人在做開發,這件事對你又特別重要
11:54 因為沒有同事可以幫你 code review
11:56 沒有人幫你把關,所有的洞都得自己扛
11:59 但你可以反過來想,你可以建一套系統
12:01 讓它扮演那個永遠不會累
12:03 永遠不會偷懶的同事
12:05 二十四小時在後面幫你守著,幫你審
12:07 這就是一個 solo developer 自己的 harness
12:10 一個人,也可以有一整個團隊的把關
12:13 與其祈禱 AI 不要出錯,不如動手
12:15 建一個讓它可以出錯
12:17 但這個錯誤會被 Harness 浪漫接住的環境
12:20 那以上就是今天的內容,我是 Gary
12:22 各位喜歡的話記得幫我按讚追蹤加分享
12:25 這是我持續創作下去的動力,我們下次見