從 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 管「完成後如何收斂」。

規範到底要放哪裡?

如果把所有規則塞進同一份文件,內容會愈來愈長,也難以維護。可依用途分開存放。

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

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

規格優先不等於每次都把全部規格放進上下文。全量讀取會浪費 token,也可能混入無關內容。

  1. 先讀 openspec/specs/README.md 找索引。
  2. 定位相關 capability,例如 payment-callback。
  3. 只讀相關 spec.md。
  4. 再讀本次 change 的 proposal.md、design.md、tasks.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 的速度愈快,需求、規格、設計、任務與驗證之間的連結就愈重要。

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