從 SDD 到 OpenSpec:讓 AI 開發有規格可循,不再只靠臨場 Prompt

AI Coding Agent 變得越來越好用之後,團隊常遇到一個新問題:需求講得很快,AI 也做得很快,但最後做出來的東西,卻不一定符合原本想要的結果。

例如你只說:「做一個建立購物車模組的功能。」AI 可能真的開始改程式,但它可能會漏掉商品狀態、庫存檢查、金額計算、錯誤處理,或只寫到最順利的測試情境。

這不一定是 AI 不夠聰明,而是因為我們沒有把「系統到底應該怎麼運作」寫成可追蹤、可驗證的規格。這正是 SDD 和 OpenSpec 想解決的問題。

先講結論:SDD 是觀念,OpenSpec 是落地工具

SDD,全名是 Specification-Driven Development,也就是「規格驅動開發」。它的重點不是叫大家多寫文件,而是把規格變成開發流程的 Source of Truth。

OpenSpec 則是把這套概念落地成資料夾結構、artifact 和 AI slash commands,讓人類、AI Agent、程式碼、測試和 review 都能對齊同一份規格。

名詞白話說法解決的問題
SDD先定義規格,再依規格開發避免 AI 憑感覺寫 code
OpenSpec把規格、設計、任務變成固定結構讓規格可追蹤、可 review、可驗證
GitHub Copilot / Agent依規格執行實作的工具提升開發速度,但需要清楚上下文

為什麼 AI 開發更需要 SDD?

傳統寫程式時,需求不清楚已經會造成返工。到了 AI Coding 時,這個問題會被放大,因為 AI 的速度很快,但它不一定每次都讀到完整上下文。

常見流程長這樣:

一句需求 → AI 直接改 code → 測試才發現不符 → 補 prompt 修正 → 規格散落在聊天紀錄裡

這會帶來幾個痛點:

  • 上下文不穩:AI 不一定每次都看到同一份需求。
  • 需求與實作斷裂:需求留在聊天裡,最後 code 反而變成唯一真相。
  • 重工成本高:改一段流程時,常漏掉資料庫、通知、測試或文件。
  • Review 很難判斷:只能問「看起來對不對」,而不是對照規格驗證。

SDD 的價值,就是讓團隊和 AI 都有同一份「應該做什麼」的依據。

什麼是 SDD?

傳統 AI Coding 常見做法是:先丟 prompt,AI 直接改程式,人再慢慢補充。SDD 則反過來:先建立規格,再讓 AI 依規格產生設計、任務和實作。

規格不是最後補的文件,而是啟動 AI 開發與驗證的契約。
方法起點主要產物驗證方式AI 適配性
TDD測試案例Unit testTest pass
BDD使用者行為Scenario / StoryScenario match
SDD正式規格Spec / Design / TasksSpec + Scenario + Test
AI Vibe CodingPromptCode diff人工判斷快,但風險高

SDD 不是要取代 TDD 或 BDD,而是把「AI 要遵守什麼」放到更前面。

SDD 的基本循環

SDD 不是一次把所有文件寫滿,而是從人類意圖開始,逐步收斂成可驗證的實作。

SDD 從 Intent、Spec、Design、Tasks、Build 到 Verify 的循環圖
SDD 的循環:先說清楚問題,再定義規格,最後回到驗證。
  1. Intent:說清楚要解決什麼問題。
  2. Spec:寫成正式行為規格。
  3. Design:決定技術方案、限制與風險。
  4. Tasks:拆成可執行、可驗收的步驟。
  5. Implement:AI 依照任務實作。
  6. Verify:用 scenario、test 和 review 對照規格驗證。

如果驗證不符合,就回到 Spec 或 Design 修正,再重新實作。重點是每次變更都留下可追蹤的差異,而不是只在聊天中補一句「剛剛不是這樣」。

OpenSpec 是什麼?

OpenSpec 可以理解成「讓 SDD 可操作的專案結構」。它把規格、設計、任務與變更記錄放在固定位置,讓 AI Agent 不必每次從零猜上下文。

OpenSpec 資料夾結構圖,包含 specs 與 changes 兩大區塊
OpenSpec 把正式規格和本次變更分開,完成後再同步回正式規格。
openspec/
  config.yaml
  specs/
    payment-callback/spec.md
    seller-order/spec.md
  changes/
    add-seller-order-scheduler/
      proposal.md
      design.md
      tasks.md
      specs/...

這個結構的核心價值是:讓「為什麼改」、「怎麼改」、「要做哪些事」、「驗證什麼」形成同一條可追蹤鏈。

OpenSpec Workflow:選對入口

OpenSpec 的 slash commands 可以視為不同階段的操作入口。需求越模糊,越應該先 explore;需求越明確,才適合 propose 或 apply。

情境建議入口用途
需求還不清楚/opsx-explore先釐清邊界、未知點與風險
需求已經明確/opsx-propose建立 change,產生 proposal、spec、design、tasks
準備開始做/opsx-apply讀取 tasks,開始實作並更新完成狀態
功能完成/opsx-archive封存 change,必要時同步回正式 specs

Delta Specs:描述「這次規格怎麼變」

SDD 最重要的不是寫很多文件,而是清楚描述這次規格變更。OpenSpec 常用三種語意:

  • ADDED:本來沒有,這次新增。
  • MODIFIED:本來有,這次修改規則。
  • REMOVED:本來有,這次刪除。

例如新增「建立購物車模組」時,可以這樣寫:

## ADDED Requirements

### Requirement: 支援購物車模組建立

#### Scenario: 使用者加入商品後可建立購物車項目
- GIVEN 商品可購買且庫存足夠
- WHEN 使用者將商品加入購物車
- THEN 系統建立或更新對應的購物車項目

這樣 AI 在實作時,就不是只看一句「幫我做購物車」,而是有明確規則可以對照。

在 VS Code + GitHub Copilot 怎麼用?

在 VS Code 裡,OpenSpec 的 slash commands 是操作入口,instructions、prompts、skills 則是不同層級的治理方式。

機制用途適合放什麼
Instructions長期影響 Copilot 回應專案規範、路徑規則、測試要求
Prompts可重複使用的任務模板/opsx-* 這類手動呼叫流程
Skills封裝專門工作流程部署、排查、匯入、報告產生

簡單說:OpenSpec 的 /opsx-* 是 prompt file 入口;團隊共通規則放 instructions;高度重複且有 SOP 的任務,才封裝成 skills。

進階指令怎麼記?

如果只記四個核心指令會不夠。OpenSpec 還有一些進階指令,適合大型需求或多人協作。

指令用途
/opsx-new只建立變更資料夾與基本結構,適合大型需求先分段審查。
/opsx-continue每次只產生下一個 artifact,適合高風險需求逐步 review。
/opsx-ff需求已清楚時,一次補齊剩餘 artifacts。
/opsx-verify檢查 code、tasks、scenario、design 是否對齊。
/opsx-sync把 delta specs 合併回正式 specs。
/opsx-bulk-archive批次封存多個 changes,適合 release 前集中整理。
/opsx-onboard讓 Agent 掃描專案,協助團隊導入 OpenSpec。

記憶方式很簡單:new / continue / ff 管「規劃怎麼長出來」;verify / sync / archive 管「完成後如何收斂」。

規範到底要放哪裡?

很多團隊導入 AI 開發時,會把所有規則都塞進同一份文件,最後變得又長又難維護。比較好的做法是依照用途分類。

Specs、Instructions、Skills 三者分工圖
判斷公式:系統行為放 specs,AI 工作方式放 instructions,特定流程封裝成 skills。
  • openspec/specs/正式系統行為規格,例如付款狀態轉移、callback 驗證失敗處理。
  • openspec/config.yamlOpenSpec artifact 生成共識,例如 design 必須包含回滾策略。
  • .github/copilot-instructions.md全專案 AI 開發規則。
  • .github/instructions/*.md依路徑套用的模組規則。
  • skills/特定任務的專門流程。

低 Token 策略:不要讓 Agent 全量讀 specs

規格優先,不代表每次都把所有規格塞進上下文。這樣不只浪費 token,也容易讓 Agent 讀到不相關內容。

  1. 先讀 openspec/specs/README.md 找索引。
  2. 定位相關 capability,例如 payment-callback
  3. 只讀相關 spec.md
  4. 再讀本次 change 的 proposal.mddesign.mdtasks.md 和 delta specs。
  5. 必要時才手動補 #file#folder
低 token 原則:先定位,再讀取;先索引,再展開。

複雜需求怎麼餵給 OpenSpec?

不要把需求貼成一大包流水帳。更好的方式是先整理成四段,讓 AI 先看懂問題邊界。

段落要回答的問題
目標這次要解決什麼問題?
範圍包含哪些流程?不包含什麼?
已知規則哪些業務條件、資料表、限制已確定?
待確認事項哪些風險、未知點或選項還沒定案?

例如建立購物車模組,可以先這樣整理:

目標:使用者將可購買商品加入購物車時,系統自動建立或更新購物車項目,並即時計算金額。
範圍:選擇商品 → 檢查商品狀態與庫存 → 建立或更新購物車項目 → 計算小計與總額 → 回傳購物車狀態。
已知規則:商品已上架、庫存足夠、購買數量合法、會員或訪客識別存在;同一商品重複加入時需合併數量。
待確認:購物車明細是否新增或更新、金額計算是否正確、庫存變動處理、重試與冪等機制、購物車有效期限。

這種需求建議先用 /opsx-explore 釐清未知點,再用 /opsx-propose 建立正式 change。

團隊導入路線圖

階段重點建議做法
第 1 週試點選一個小功能,建立 specs README,跑一次 explore / propose / apply。
第 2–3 週標準化補 copilot instructions、模組 instructions、config rules。
第 4 週擴大使用PR review 對照 scenario,檢查 tasks 完成度。
持續收斂整理 pitfalls,把重複流程沉澱成 skills,定期清理 specs。

參考資源

最後總結

SDD 的重點不是文件變多,而是讓規格成為團隊和 AI 共同遵守的契約。OpenSpec 則把這份契約變成可操作、可追蹤、可驗證的工作流程。

當 AI Coding Agent 越來越快,真正拉開差距的不是誰的 prompt 寫得更長,而是誰能把需求、規格、設計、任務和驗證串成一條穩定的鏈。

Author image
關於 Richard Zheng
About me 喜歡爬山,瑜伽,溜冰,喜歡新奇的事,最喜歡的還是寫程式帶來的成就感,對於資訊會不斷的出現新事物也能抱持好奇與熱忱。近期開始將學習的心得寫在Blog,發現思路更清晰也加深了記憶。 紙上得來終覺淺,絕知此事要躬行