當每一個小改動都有 blast radius
Vibe coding 的前半段,效率高得離譜。Cursor 和 Claude Code 可以飛快生成 login、dashboard、settings、push notifications,快到一位 solo founder 幾天內就能把 MVP 推上線。
問題通常出在第二輪或第三輪修改。settings 裡一個小 tweak 會把 auth 打壞,一次 profile update 會連帶影響 notifications。bug 看起來彼此無關,但程式碼裡沒有被強制執行的 boundary,所以 app 的任何一部分都可能影響其他部分。
這就是 Vibe coding 的陷阱。Cursor 和 Claude Code 很擅長生成能動的程式碼,但它們並不是為了生成可維護的程式碼而設計的。當你請 Claude 做一個 settings screen,它會給你一個 settings screen。它不會順便幫你生成一個尊重 service boundary、遵守 theme contract、而且會驗證輸入的 settings screen。它只會把 prompt 補滿。缺口要你自己補。
為什麼 Vibe coding 一 scale 就會壞
當你只有 10 個使用者時,一個壞掉的 edge case 只是你可以在 DM 裡道歉的事情。當你有 1,000 個使用者時,那就是 churn event。當你有 10,000 個使用者時,那就是威脅公司存亡的 outage。那個在 MVP 階段看起來像魔法一樣的 codebase,一進入成長期就會變得讓人害怕。
傳統開發會靠 code review、ADR,以及會說「不行」的資深工程師來處理這件事。但當你用 Cursor 和 Claude Code 以 10 倍速度 ship 時,你不可能把人塞進每一次 verification loop。那個瓶頸會直接吃掉速度紅利。你需要的是比人工 review 更快、但同樣可靠的東西。
宣告式約束就是答案
Guardrails,也就是在毫秒級運行、具備確定性的宣告式檢查。它們不會累。不會失去上下文。不會消耗 token。它們就是你這個 Vibe-coded app 的架構免疫系統:
// These aren't suggestions. They're non-negotiable gates.
// They run on every commit. Human or AI code — doesn't matter.
1. TypeScript strict mode catches interface violations
- noUncheckedIndexedAccess
- exactOptionalPropertyTypes
2. ESLint catches architectural violations
- no className outside primitive seam
- import from barrels, not implementations
3. dependency-cruiser catches boundary violations
- Circular dependencies caught at commit time
- Never reach production
4. Pre-commit hooks run ALL checks before code lands
pnpm run verify → lint, typecheck, depcruise, test
If any check fails, the commit is blocked.
跳過護欄的成本
沒有 guardrails,AI 生成程式碼會沿著一條很可預測的死亡螺旋往下掉:生成得快、上線得快、壞得更快、在 production 緊急除錯、流失使用者、睡眠不足、信心崩掉。我看過有團隊花掉整個 sprint,去修一段其實只要一條 ESLint 規則就能預防的 AI 程式碼。你在第一週靠 Vibe coding 省下來的時間,到了第十週往往會十倍奉還。
有了 guardrails,整個生命週期就會變成另一條路:生成得快、驗證得快、安全地 ship。Cursor 和 Claude Code 照樣寫程式碼。護欄負責守住邊界。你得到的是 AI 的速度,加上架構層級的安全性。
production-ready 護欄長什麼樣子
在一套 production-ready 的 React Native 架構裡,guardrails 本來就是地基的一部分:
- TypeScript strict mode 從第一天就開啟,包含
noUncheckedIndexedAccess、exactOptionalPropertyTypes - dependency-cruiser 強制資料夾邊界,並防止 circular dependency
- ESLint 阻止
className穿出 styling primitive seam - Pre-commit hooks 在每次 commit 前跑完整的 verification suite
結果就是:AI 生成的程式碼會被限制在邊界之內。Cursor 可以全速生成 components、screens、hooks。但它不能破壞 service boundary。不能讓 styling engine 洩漏出去。不能製造 circular dependency。護欄決定哪些是允許的,AI 只負責把空缺補上。
平順過渡
Autotomy Expo Starter Pack 正是為了這個轉換點而設計的:
- 已定義好的 service interfaces 與 barrel exports
- 用來管理 dependency 的 composition root
- 帶有 theme contract 的 semantic UI primitives
- Hard 與 optional dependency boundaries
- 集中的 lifecycle management
- route boundary 上的 URL validation
- 具備確定性的 pre-commit guardrails
- 可安全重構的 autotomy pattern
你不是停止 Vibe coding。你是在一個能 scale 的地基上繼續 Vibe coding。 Cursor 會對著你的 theme contract 生成 screen。Claude Code 會對著你的 service interface 生成 feature。pre-commit hooks 會在任何 boundary violation 進到 production 前就先把它擋下來。你的 app 可以從 10 個使用者長到 10,000 個,而不會迎來大多數 AI-coded 專案都撐不過去的架構崩塌。
速度很有價值。結構決定這種速度能不能持久。如果你正在用 Cursor 和 Claude Code ship 一個 React Native app,請在你真的需要它們之前,就先投資 guardrails。它們比重構便宜得多,而且只要有一次在 commit 時抓到 breaking change,而不是等使用者先踩到,它們就已經回本了。