Skip to content

逆向工程規格萃取

現有程式庫包含隱含在實作中的隱性規格。當 AI 代理在遺留系統上工作時,缺乏關於系統是什麼的結構化脈絡,導致重複的程式碼探索、脈絡窗口浪費,以及跨會話的不一致理解。規格萃取引入從程式碼逆向工程規格的方法論,以建立「既存事實」脈絡。

核心洞察: 從實作萃取的規格作為壓縮的、權威的脈絡。一份良好撰寫的規格比其描述的程式碼小 5-20 倍,大幅減少脈絡窗口使用量,同時保留 AI 代理所需的關鍵知識。

問題陳述

現狀:臨時程式碼探索

缺少規格的痛點

問題對 AI 開發的影響
無正式規格AI 每次會話都重新探索程式碼
部落知識實作決策鎖在開發者腦中
脈絡窗口浪費必須載入整個檔案才能理解行為
理解不一致不同 AI 會話對程式碼有不同詮釋
入職摩擦新的 AI 代理(和人類)從零開始

真實案例

重複發現:

AI 代理需要修改認證流程。每次會話都讀取 15 個檔案來理解流程。因為沒有規格文件化認證架構,相同的約 2000 行被重複載入。

失落的機構知識:

原始開發者離開。程式庫沒有文件。新團隊成員和 AI 代理必須從實作逆向工程意圖,經常猜錯。

脈絡溢出:

功能涉及 8 個模組。載入所有程式碼超過脈絡窗口。沒有規格,AI 無法獲得高層次視圖,做出破壞未文件化不變量的變更。

提案:既存事實規格

目標狀態

什麼是既存事實規格?

既存事實規格文件化從現有程式碼萃取的已驗證、已實作行為。不同於描述應該建構什麼的前瞻性需求,既存事實規格描述已經建構的內容。

關鍵區別:既存事實 vs 需求

面向需求規格既存事實規格
來源業務需求、使用者故事已實作程式碼
目的定義要建構什麼文件化已存在的內容
權威性規範性(應該符合)描述性(確實符合)
建立時機實作之前實作之後
驗證測試驗證實作實作即為真實
使用案例綠地開發遺留系統理解

既存事實規格格式

Frontmatter 模式

yaml
id: ef-auth-oauth-flow
title: OAuth 2.0 認證流程
type: existing-fact
status: verified
version: 1.0.0
created: 2025-12-02
updated: 2025-12-02
extracted_from:
  - src/auth/oauth.ts
  - src/auth/token-manager.ts
  - src/middleware/auth.ts
extraction_method: ai-assisted
confidence: high
verified_by:
  - test-suite
  - human-review
compression_ratio: 12:1
authors:
  - extraction-agent
reviewers:
  - senior-developer@company.com
tags:
  - authentication
  - oauth
  - security
ai_summary: |
  Web 客戶端的 OAuth 2.0 PKCE 流程實作。
  處理授權、token 交換、刷新和登出。
  透過標準端點與身分提供者整合。

內容結構

markdown
# [功能名稱] - 既存事實規格

## 概述
[1-2 段落摘要說明此程式碼做什麼]

## 系統邊界
### 進入點
- [API 端點、函式簽名]

### 外部依賴
- [此程式碼互動的服務、API、資料庫]

### 資料流
[顯示高層次流程的 Mermaid 圖表]

## 行為規格

### 核心行為
#### 行為:[名稱]
- **觸發條件**:[什麼啟動此行為]
- **前置條件**:[必要狀態]
- **流程**:[發生什麼]
- **後置條件**:[結果狀態]
- **萃取自**`file.ts:line`

### 錯誤處理
#### 錯誤:[名稱]
- **條件**:[何時發生此錯誤]
- **回應**:[系統如何回應]
- **恢復**:[如何恢復,如果適用]

## 約束與不變量
- [必須永遠成立的規則]
- [限制與閾值]

## 已知技術債
- [不應複製的已知問題]

## 驗證狀態
| 面向 | 狀態 | 證據 |
|------|------|------|
| 核心流程 | 已驗證 | 單元測試、整合測試 |
| 錯誤處理 | 部分 | 某些邊界案例未測試 |
| 效能 | 未驗證 | 無可用基準 |

分層萃取方法論

四層方法

以遞減粒度的層次萃取規格,每層提供更多細節:

層次詳情

層次萃取內容壓縮目標需要時機
L1:邊界API 契約、介面定義、外部整合點10:1永遠
L2:結構元件職責、模組間依賴、資料流20:1大多數功能
L3:行為演算法模式、狀態機、錯誤處理策略5:1複雜邏輯
L4:邊界案例驗證規則、約束、限制、已知怪異行為3:1關鍵路徑

漸進價值

單獨第 1 層就能提供顯著價值。每個額外層次在需要時增加精確度:

萃取工作流程

三階段流程

階段 1:發現

目標: 理解程式庫結構並識別萃取目標。

AI 任務:

  1. 分析目錄結構和檔案組織
  2. 識別進入點(API、CLI 命令、事件處理器)
  3. 映射模組依賴
  4. 偵測架構模式(MVC、Clean Architecture 等)
  5. 產生發現報告供人類審查

輸出:

markdown
## 發現報告:[程式庫名稱]

### 架構概述
[高層次描述]

### 關鍵模組
| 模組 | 目的 | 依賴 | 優先順序 |
|------|------|------|---------|
| auth | 認證 | db, identity-provider | 高 |
| api | REST 端點 | auth, services | 高 |
| ... | ... | ... | ... |

### 建議萃取順序
1. [模組] - [原因]
2. [模組] - [原因]

### 複雜度評估
- 預估萃取工作量:[小時/天]
- 高複雜度區域:[清單]

階段 2:萃取

目標: 從程式碼產生草稿規格。

AI 任務:

  1. 徹底閱讀模組程式碼
  2. 依循層次方法論產生規格
  3. 與測試交叉參照以驗證行為
  4. 文件化不確定性和假設

人類任務:

  1. 審查產生的規格準確性
  2. 修正誤解
  3. 加入 AI 無法推斷的脈絡(業務理由、歷史決策)
  4. 核准或要求精煉

迭代模式:

階段 3:驗證

目標: 建立規格可信度以供 AI 脈絡消費。

驗證來源:

來源信心提升證據
自動化測試通過+20%測試覆蓋報告
人類審查完成+30%審查者簽核
生產行為匹配+30%監控/日誌比對
原始開發者確認+20%開發者核准

信心等級:

等級標準AI 使用指引
測試驗證 + 人類審查作為權威脈絡使用
人類審查,部分測試覆蓋謹慎使用,驗證關鍵路徑
AI 產生的草稿,等待驗證視為假設,使用前驗證

實施路線圖

階段 1:試點萃取(第 1-2 週)

目標: 為 1-2 個高價值模組萃取規格。

交付物:

  • [ ] 選擇試點模組(高變更頻率、良好測試)
  • [ ] 執行發現階段
  • [ ] 產生第 1 層 + 第 2 層規格
  • [ ] 與模組負責人驗證
  • [ ] 測量壓縮比

成功標準:

  • 壓縮比 >10:1
  • 模組負責人確認準確性
  • AI 代理可使用規格而非閱讀程式碼

階段 2:工具與模板(第 3-4 週)

目標: 建立可重複的萃取流程。

交付物:

  • [ ] 既存事實規格模板
  • [ ] 萃取 prompt 庫
  • [ ] 驗證檢查清單
  • [ ] 規格新鮮度檢查的 CI 整合

階段 3:系統性萃取(第 5-8 週)

目標: 為所有高優先順序模組萃取規格。

交付物:

  • [ ] 優先模組清單
  • [ ] 萃取排程
  • [ ] 進度追蹤儀表板
  • [ ] 規格對程式碼新鮮度監控

階段 4:持續維護(持續進行)

目標: 保持規格與程式碼同步。

交付物:

  • [ ] 變更偵測觸發重新萃取
  • [ ] 程式碼變更時的規格差異
  • [ ] 過期警示
  • [ ] 定期完整刷新排程

CLAUDE.md 整合

加入專案 CLAUDE.md:

markdown
## 既存事實規格

### 目的
既存事實規格文件化已驗證、已實作的行為。
當可用時,使用這些規格而非閱讀原始碼。

### 位置
- `docs/specs/existing-facts/` - 萃取的規格
- 每個規格包含 `extracted_from` 參照原始檔案

### 使用優先順序
1. 先檢查既存事實規格
2. 如果規格存在且信心為高,使用規格作為脈絡
3. 如果規格為中信心,驗證關鍵假設
4. 如果沒有規格或信心為低,閱讀原始碼

### 何時觸發重新萃取
如果你修改既存事實規格涵蓋的程式碼:
1. 註記規格可能已過期
2. 如果變更重大則更新規格
3. 如果不確定則標記規格需要審查

### 規格品質指標
- `confidence: high` - 信任為權威
- `confidence: medium` - 驗證關鍵路徑
- `confidence: low` - 視為假設
- `compression_ratio` - 越高代表越好的脈絡效率

脈絡壓縮分析

各層壓縮目標

層次程式碼範例規格等效比率
L1:邊界500 行 API 處理器50 行端點規格10:1
L2:結構10 個模組共 2000 行100 行架構20:1
L3:行為300 行演算法60 行行為規格5:1
L4:邊界案例200 行驗證70 行約束規格3:1

真實範例

之前:載入原始碼

認證模組的脈絡 tokens:
- oauth.ts: 450 行(~2000 tokens)
- token-manager.ts: 280 行(~1200 tokens)
- auth-middleware.ts: 180 行(~800 tokens)
- auth.test.ts: 520 行(~2300 tokens)
總計:1430 行(~6300 tokens)

之後:載入既存事實規格

認證規格的脈絡 tokens:
- ef-auth-oauth-flow.md: 120 行(~500 tokens)
總計:120 行(~500 tokens)

壓縮:12:1
每次會話節省 tokens:5800 tokens

成功指標

指標目標如何測量
平均壓縮比>10:1程式碼行數 / 規格行數
規格準確性>95%人類審查通過率
脈絡減少>50%Token 使用前/後
AI 任務成功率+20%有/無規格比較
萃取效率<2 小時/模組時間追蹤
規格新鮮度<30 天updated 日期監控

應避免的反模式

1. 萃取所有內容

問題: 嘗試為每行程式碼建立規格。

解決方案: 先專注於高價值、高變更頻率的模組。不是所有程式碼都需要規格。

2. 無驗證的規格

問題: 產生規格並假設它們正確。

解決方案: 每個規格都需要人類審查。信心等級傳達可信度。

3. 過期規格

問題: 規格隨時間與實作偏離。

解決方案: CI 檢查、新鮮度監控、變更觸發的重新萃取。

4. 過度詳細的規格

問題: 規格與其描述的程式碼一樣長。

解決方案: 專注於抽象。如果壓縮比 ❤️:1,規格太詳細。

5. 忽略技術債

問題: 為「不應該這樣」的程式碼萃取規格。

解決方案: 在規格中文件化已知技術債。不要透過規格化來合法化壞模式。

常見問題

何時應該萃取規格 vs 撰寫新規格?

萃取當:

  • 程式碼存在但文件不存在
  • 原始開發者不可用
  • 需要快速理解遺留系統
  • 想要減少脈絡窗口使用量

撰寫新規格當:

  • 建構新功能
  • 重新設計現有功能
  • 程式碼尚不存在

如何處理違反自身模式的程式碼?

在規格中文件化不一致性:

markdown
## 已知不一致
- 模組 A 使用模式 X
- 模組 B 對相同目的使用模式 Y
- **注意**:這是遺留技術債,非刻意設計

既存事實規格應與程式碼放在一起還是分開?

建議: 分開的 docs/specs/existing-facts/ 目錄。

理由:

  • 規格聚合多個檔案
  • 更容易找到並載入為脈絡
  • 可以有不同的審查頻率
  • 與程式碼註釋有明確區分

多久應該重新萃取一次?

程式碼變更類型需要重新萃取
Bug 修復否(除非改變行為)
重構(相同行為)可能(更新檔案參照)
功能新增是(加入規格)
行為變更是(更新規格)
重大改寫是(完整重新萃取)

相關提案

相關: AI 代理友善知識庫 | 返回: 提案概覽

參考資料