specs、changes、artifacts:搞懂 OpenSpec 的三個核心概念

specs、changes、artifacts:搞懂 OpenSpec 的三個核心概念

6 min read

你可以不懂原理就直接用 OpenSpec 的指令,大概也能跑起來——但等你遇到第一個「欸這個指令到底在幹嘛」的時刻,就得回來補這篇。不如現在先把三個核心概念搞清楚,後面每一步都會更好理解。

Specs:你的系統現在長什麼樣

openspec/specs/ 是真相來源——描述你的系統目前如何運作。

不是你想要的未來,是現在。

按 domain 分資料夾:

openspec/specs/
├── auth/
│   └── spec.md       # 登入、驗證、session 怎麼運作
├── payments/
│   └── spec.md       # 付款流程
└── ui/
    └── spec.md       # UI 行為與主題

每個 spec.md 裡面,長這樣:

# Auth Specification
 
## Purpose
應用程式的認證與 session 管理。
 
## Requirements
 
### Requirement: User Authentication
系統 SHALL 在登入成功後發送 JWT token。
 
#### Scenario: Valid credentials
- GIVEN 使用者輸入正確的帳號密碼
- WHEN 提交登入表單
- THEN 回傳 JWT token
- AND 導向 dashboard
 
#### Scenario: Invalid credentials
- GIVEN 使用者輸入錯誤的帳號密碼
- WHEN 提交登入表單
- THEN 顯示錯誤訊息
- AND 不發送 token

幾個重點:

Requirement 寫「系統應該做什麼」,不寫「怎麼實作」——用的是 RFC 2119 的用詞:

  • SHALL / MUST — 絕對要求,沒有例外
  • SHOULD — 建議,但有例外情況可以不做
  • MAY — 可選

Scenario 寫「具體例子」,用 Given/When/Then 結構,每個 scenario 要能被驗證——你能從這個 scenario 寫出一個自動化測試。

Spec 不寫的東西:類別名稱、用哪個 library、資料庫怎麼設計——那些是 design.md 的事。Spec 只管「用戶或下游系統看到的行為」。

Changes:每個修改都有自己的資料夾

openspec/changes/ 放的是進行中的修改——每一個你想新增或修改的功能,都活在這裡,有自己的資料夾,直到完成後 archive 才會合併。

openspec/changes/
└── add-dark-mode/
    ├── proposal.md
    ├── design.md
    ├── tasks.md
    └── specs/
        └── ui/
            └── spec.md   ← 這次修改的 delta spec

多個修改可以同時進行,互不干擾——因為每個都在自己的資料夾裡,不會打架。

Artifacts:每個修改裡的四個文件

一個 change 資料夾裡通常有四個 artifact,各司其職:

Artifact 回答什麼問題
proposal.md 為什麼要做這件事?範圍是什麼?
specs/ 有哪些行為會新增、修改、或移除?
design.md 技術上怎麼做?架構決策是什麼?
tasks.md 具體要做哪些事?(勾選清單)

這四個 artifact 有依賴關係,但不強迫你照順序:

proposal → specs → design → tasks → 實作
   ↑          ↑        ↑              │
   └──────────┴────────┴──────────────┘
           實作過程中發現問題,隨時可以回頭更新

proposal.md 說「為什麼」——這次改動的動機、影響範圍、大致方向。不用很長,能說清楚就好。

specs/(delta spec)說「有哪些行為在變」——用 ADDED/MODIFIED/REMOVED 三個區段標示:

# Delta for UI
 
## ADDED Requirements
 
### Requirement: Theme Selection
系統 SHALL 讓用戶切換 light / dark 主題。
 
#### Scenario: 手動切換
- GIVEN 用戶在任何頁面
- WHEN 點擊主題切換按鈕
- THEN 主題立即切換
- AND 偏好設定保存,重開頁面後仍然生效
 
## MODIFIED Requirements
(略)
 
## REMOVED Requirements
(略)

Archive 的時候,ADDED 的會加進主 spec,MODIFIED 的會覆蓋舊版,REMOVED 的會刪掉。

design.md 說「怎麼做」——技術方案、架構決策、選哪個 library、資料流怎麼設計。這裡才是寫實作細節的地方,spec 不用碰。

tasks.md 是勾選清單——AI 跑 /opsx:apply 的時候,就是按照這份清單一條一條做:

# Tasks
 
## 1. Theme Infrastructure
- [ ] 1.1 建立 ThemeContext 管理 light/dark state
- [ ] 1.2 在 CSS 加入 custom properties
- [ ] 1.3 實作 localStorage 偏好保存
 
## 2. UI Components
- [ ] 2.1 建立 ThemeToggle 元件
- [ ] 2.2 加入設定頁面

三者的關係,一句話版

specs 是現況,changes 是在進行中的修改,artifacts 是每個修改裡用來說清楚「要做什麼、怎麼做、具體任務」的四份文件。

Archive 之後,changes 裡的 delta spec 合併進 specs,changes 資料夾搬到 archive 存檔,循環繼續。


搞清楚這三個概念之後,下一篇帶你跑完 /opsx:propose → apply → archive 這條最核心的流程——每個指令做了什麼、你要確認什麼、什麼時候該繼續往下走。

下一篇:/opsx:propose → apply → archive:跑完一輪完整的 OpenSpec 流程