「這條規則我已經寫進 CLAUDE.md 了,AI 應該會一直遵守吧?」
如果你也這樣想過,先別急著放心。昨天講到架構規則要盡量寫成可執行的檢查,不能只留在文件裡——今天用一個時間軸案例,具體演示「只寫在文件裡」這件事,實際上撐得住幾輪對話。
專案的 CLAUDE.md 裡寫著一條規則:Controller 不能直接依賴資料庫連線,資料存取一律要經過 Repository。 這條規則寫得清楚,也有理由——之前吃過 Controller 直接查資料庫、換資料庫連線設定時到處漏改的虧。
專案剛開始重構的頭幾天,每次請 AI 新增功能,它都會先讀一次 CLAUDE.md,新寫的 Controller 也確實都乖乖呼叫 Repository,沒有自己組 SQL。這幾輪看起來一切正常,規則彷彿已經內化成 AI 的預設行為。
專案進行到第四天,同一個對話 session 已經處理過好幾個功能、修過幾個 bug,對話歷史累積得很長。當歷史長度接近上限,系統會自動摘要壓縮較舊的內容——CLAUDE.md 曾經被完整讀過的那次動作,可能已經不在最近的摘要裡留下明顯痕跡。
這時候請 AI 加一個新的 API 端點,它讀了現有程式碼的寫法當範本,但這次沒有重新明確讀取 CLAUDE.md。新寫的 Controller 裡出現了一段直接查資料庫的程式碼——不是因為 AI「決定」要違反規則,而是這一輪它的判斷依據裡,那條規則根本沒有被重新啟用。
直到 code review 才被抓到這處違規。回頭去問「你不是知道這條規則嗎」,AI 會誠實地說「讀過,但這一輪沒有重新確認」——這句話講出了問題的核心:AI 對規則的『知道』是有時效性的,取決於這一輪的 context 裡有沒有它,不是一次讀過就永久生效。
用一組對照來看這個差異:
❌ 規則只存在文件裡,靠「應該會記得」:
CLAUDE.md 寫著「Controller 不能直接依賴資料庫連線」
→ 前幾輪對話遵守,第 N 輪 context 被壓縮後,
規則沒有被重新讀到,AI 寫出違規程式碼,
code review 才發現,已經是既成事實
✅ 規則寫成可執行檢查,靠工具強制:
CI 裡跑一條靜態分析規則:Controller 資料夾裡的檔案
不能 import 資料庫連線相關的類別,違反就讓 build 失敗
→ 不管 AI 這一輪的 context 裡有沒有意識到規則,
違規的程式碼在合併前就會被攔下來,不會變成既成事實
這個案例最值得記住的地方,不是 AI 「忘記」了規則,而是「文件裡的規則」跟「這一輪 AI 實際依循的判斷依據」,中間隔著一層「這一輪有沒有被重新讀到」的不確定性——而這個不確定性,跟這個系列從 Day 01 開始講的主題句是同一件事:AI 給出的行為,永遠只反映它這一輪實際查證/讀取過的範圍,不是它「曾經」知道過什麼。
不是每條規則都需要立刻寫成 linter,但這個案例給出一個具體判斷標準:這條規則被違反的代價有多大、靠人工 review 抓到的把握有多低,兩者同時偏高時,這條規則就該優先升級成工具強制,而不是繼續依賴「AI 這一輪記不記得」。「Controller 不能依賴資料庫連線」正好符合這個條件——違反的代價是架構邊界被打穿、之後的重構範圍會擴大;人工 review 抓漏的把握不見得高,因為程式碼表面看起來能動、測試也可能過。
回想你專案裡寫在文件裡、但沒有任何工具強制的架構規則:上一次真的被違反、卻是在 code review 才被抓到,是多久以前的事?如果從來沒發生過,你有把握是因為規則真的被完美遵守,還是只是還沒遇到「context 剛好被壓縮」的那一輪?
明天要把視角拉大:當架構切成微服務或多個獨立模組時,AI 一次協作能安全處理的範圍該怎麼隨著邊界縮小,以及這件事對團隊分工有什麼實際影響。