OpenSpec + Superpowers TDD v2:4 層防護疊加 26 個原子任務,27 次 subagent 實測 3/4 通過

作者:術哥無界
日期:2026年5月6日 上午12:30
來源:WeChat 原文

整理版優先睇

速讀 5 個重點 高亮

OpenSpec + Superpowers TDD v2:用4層防護強制AI按TDD流程寫代碼,實測3/4通過

整理版摘要

呢篇文章係術哥分享嘅實戰覆盤,基於OpenSpecSuperpowers兩個開源工具,嘗試建立一套可強制AI執行TDD嘅工作流。作者係AI編程同Agent技術嘅實踐者,佢發現v1完全失敗——AI一口氣寫曬所有代碼,跳過RED階段。

為咗解決呢個問題,作者設計咗四層防護模型:原子化任務、subagent隔離、兩階段審查、驗證證據。v2版本將任務拆成26個原子task,每個task只做一個TDD階段,並用superpowers:subagent-driven-development強制每個task由獨立subagent執行。實測dispatch咗27次subagent,3層防護生效,1層(兩階段審查)被AI跳過。

整體結論係:原子化任務同subagent隔離最可靠,係物理約束;審查同驗證證據依賴AI自主決策,仍有漏洞。作者提供咗完整嘅schema.yaml同模板,可以直接複製使用,但強調呢個方案唔係100%可靠。

  • v1失敗根因係任務粒度過大,AI可以一步完成RED+GREEN;v2拆成26個原子task,每個只做一個TDD階段。
  • 四層防護:原子化任務(物理約束)、subagent隔離(上下文隔離)、兩階段審查(spec+code quality reviewer)、驗證證據(真實測試輸出)。
  • 實測24個subagent各自獨立執行,subagent隔離有效;但AI跳過咗後24個task嘅審查,認為太耗時。
  • npm test歷史顯示15次真實REDGREEN過渡,驗證證據層有效,但測試輸出可以偽造(已知侷限)。
  • 可重用嘅schema.yaml同模板文件直接提供;建議在apply.instruction明確要求「每個task都要審查」,但呢個只係prompt約束。
值得記低
流程

tdd-driven-v2 Schema (schema.yaml)

完整嘅OpenSpec Schema,定義咗4層防護:原子化task、subagent隔離、審查、驗證證據。包含artifacts定義(proposal, specs, design, tasks, plans)同apply instruction。

筆記

templates 目錄 (proposal.md, spec.md, design.md, tasks.md, plan.md)

5個模板文件,分別對應Schema嘅artifacts,提供標準化嘅格式(WHEN/THEN, GIVEN/WHEN/THEN, 原子化checkbox等)。

筆記

config.yaml 示例

項目配置,包括tech stack(TypeScript + Jest)、context字段、rules(確保任務原子化、分階段等)。

整理重點

v1點解失敗?任務粒度決定一切

v1嘅Schema instruction寫咗一大段TDD規則,propose階段產出都幾好——proposal有WHEN/THEN格式,specs用GIVEN/WHEN/THEN。但一到apply階段,AI就一口氣寫曬所有代碼,跳過RED階段,測試係事後補嘅。

OpenSpec嘅tracks只認checkbox格式,requires只檢查文件存在唔檢查內容。Superpowers嘅subagent隔離係真實嘅,但兩個倉庫核心代碼互不依賴,集成完全靠instruction文本橋接。

整理重點

四層防護:由內到外強制TDD

修正方案好直接:每層解決一個具體問題。由內到外分別係原子化任務、subagent隔離、兩階段審查、驗證證據。

  1. 1 第一層:原子化任務——每個task只包含REDGREENREFACTOR其中一個階段。用checkbox格式書寫,確保OpenSpec嘅tracks解析到。
  2. 2 第二層:subagent隔離——在apply.instruction寫死MANDATORY用superpowers:subagent-driven-development。每個task由獨立subagent執行,context完全隔離。
  3. 3 第三層:兩階段審查——spec reviewer檢查係咪恰好完成要求內容,code quality reviewer檢查代碼質量。唔通過就打回。
  4. 4 第四層:驗證證據——subagent必須報告測試運行輸出。RED階段要顯示失敗,GREEN要顯示通過,REFACTOR要全量輸出。

特別注意第四層提供咗可檢查嘅硬證據:唔睇AI點講,睇測試輸出點講。呢層喺實戰中最有說服力。

整理重點

Schema實戰:26個原子task點樣強制TDD

全文核心係完整嘅tdd-driven-v2 Schema,可以直接複製。目錄結構包括schemas/tdd-driven-v2/、config.yaml、templates/等。注意schemas/同config.yaml唔會自動生成,要手動創建。

schema.yaml(精簡版) yaml
name: tdd-driven-v2
version: 2
description: Atomic TDD workflow with subagent isolation and evidence verification
artifacts:
 - id: proposal
 generates: proposal.md
 instruction: |
 Create a proposal that explains WHY this change is needed.
 MANDATORY FORMAT for testable behaviors:
 List every testable behavior using WHEN/THEN format.
 requires: []
 - id: tasks
 generates: tasks.md
 instruction: |
 CRITICAL: Break work into ATOMIC TDD tasks.
 Each task is EXACTLY ONE TDD phase (RED, GREEN, or REFACTOR).
 MANDATORY FORMAT — use checkbox syntax for every task:
 - [ ] RED: Write failing test — [具體測試咩行為]
 - [ ] GREEN: Implement — [最小實現描述]
 - [ ] REFACTOR: Cleanup — [清理描述](可選)
 Rules:
 1. NEVER combine RED and GREEN in one task
 2. Tasks alternate: RED → GREEN → (REFACTOR) → RED → GREEN → ...
 requires:
 - specs
 - design
 - id: plans
 instruction: |
 PRECHECK: Verify superpowers:writing-plans skill is available.
 ...
 After plan is created, append this section:
 ---
 ## Execution Mode Selection
 REQUIRED: Use superpowers:subagent-driven-development skill for execution.
 requires:
 - tasks
apply:
 requires: [plans]
 tracks: tasks.md
 instruction: |
 MANDATORY: Use superpowers:subagent-driven-development skill.
 DO NOT use executing-plans or inline execution.
 Evidence requirements per subagent:
 - RED tasks: Subagent MUST include test failure output
 - GREEN tasks: Subagent MUST include test pass output
 ...

實測中tasks.md生成了26個原子task(13 RED + 13 GREEN),每個task只做一個TDD階段。AI dispatch咗24個實現subagent,第一層同第二層有效。但第三層出咗問題——AI跳過咗後續24個task嘅審查。

整理重點

誠實評估:四層防護嘅實測效果同侷限

必須坦誠:呢個方案唔係100%保證TDD執行。以下係基於Mini Markdown轉換器嘅實測數據,逐層分析。

  1. 1 第一層(原子化任務):實測有效。26個原子task冇合併,任務粒度係物理約束,最可靠。
  2. 2 第二層(subagent隔離):實測有效。24個實現subagent各自獨立執行,instruction中嘅MANDATORY被遵守。但其他項目/AI模型可能唔聽話。
  3. 3 第三層(兩階段審查):實測部分有效。前2個task有完整審查,但後24個被跳過。AI有自主裁量權。
  4. 4 第四層(驗證證據):實測有效。npm test歷史顯示15次REDGREEN真實過渡。但測試輸出可能偽造——冇代碼層面嘅防偽機制。

最終產物係src/markdown.ts(71行)、tests/markdown.test.ts(43行、10個test case),npm test 10/10 passed。但測試覆蓋率只達10/15行為,源碼結構偏離design.md規劃。

🚩 2026 年「術哥無界」系列實戰文檔 X 篇原創計劃 第 103 篇,AI 編程最佳實戰「2026」系列第 28

大家好,歡迎嚟到 術哥無界 | ShugeX | 運維有術

我是術哥,一個專注 AI 編程、AI 智能體、Agent Skills、MCP、雲原生、AIOps、Milvus 向量數據庫嘅技術實踐者同開源佈道者

Talk is cheap, let's explore。無界探索,有術而行。

封面圖:四層防護模型信息圖
封面圖:四層防護模型信息圖

用 OpenSpec 自定義 Schema + Superpowers subagent 編排,令 AI 跟 TDD 流程寫代碼。v1 完全失敗——AI 一次過寫曬所有代碼,跳過 RED 階段。v2 做咗 4 層防護修正,拆成 26 個原子任務,實測 dispatch 咗 27 次 subagent,3 層防護通過,1 層被 AI 跳過咗。

失敗根因唔喺 instruction 措辭,而喺任務粒度。呢篇文章覆盤完整過程,俾出可以直接複製嘅 schema.yaml

說明:本文內容基於 OpenSpec(Fission-AI/OpenSpec)同 Superpowers(obra/superpowers)嘅源碼分析及 Mini Markdown 轉換器嘅實際操作驗證。源碼分析基於筆者本地倉庫版本,已喺 Mini Markdown 項目完成主要場景驗證。文中嘅配置模板同參數建議僅供參考,實際效果請以你嘅業務數據同環境測試結果為準。如果有實際使用經驗,歡迎喺評論區分享交流。

第一節:問題覆盤 - v1 點解失敗

v1 做咗啲乜

第一版 Schema 嘅設計思路好直觀:喺 OpenSpec 嘅 instruction 度寫一大段 TDD 規則,要求 AI 按 RED-GREEN-REFACTOR 循環執行。propose 階段嘅產物睇落都唔錯——proposal 裏面有 WHEN/THEN 格式嘅可測試行為,specs 用咗 GIVEN/WHEN/THEN,文檔規範化確實有效。

但去到 apply 階段就冧咗。AI 一次過寫曬所有代碼,跳過 RED 階段,測試係寫完實現之後先補返。TDD 形同虛設。

失敗根因:任務粒度,唔係措辭

一開始好容易歸因為 instruction 唔夠強 或者 AI 唔聽話。但係睇完一輪源碼之後,根因好清楚。

先睇 OpenSpec 嘅真實能力邊界(基於源碼分析):

tracks 係 checkbox 解析器。佢嘅正則 /^[-*]\s*\[([ xX])\]\s*(.+)\s*$/ 只認 - [ ] 格式嘅行(結尾 \s* 會自動刪走行尾空白)。非 checkbox 行會被靜默忽略,唔報錯亦唔警告。如果你嘅 tasks.md 裏面有段落描述、標題說明呢啲非 checkbox 內容,tracks 直接跳過,完全唔理。

requires 係文件存在性檢查。佢檢查文件是否存在,唔存在就標記 state: blocked。但只檢查存在,唔檢查內容resolveArtifactOutputs 只做 glob 匹配,唔讀文件內容)。

留意區分兩個階段:

  • propose 階段(artifact 依賴解析):requires 影響解析順序,屬於 "enabler not gate"——缺失唔會阻止生成
  • apply 階段:缺失 required artifacts 會直接 state: 'blocked',硬阻止執行

instruction 係純文本注入。透過 CLI 輸出到 stdout,AI skill 讀取。注入係確定會發生(代碼保證咗呢一步),但執行完全取決於 AI 嘅自主決策。OpenSpec 源碼裏面搜索唔到任何 hook、callback 或者事件機制——零個運行時回調點。

再睇 v1 嘅 tasks.md 產出:

Task 1: 創建 Todo 接口
  Test description: 驗證 POST /todos 返回 201
  Expected behavior: 接受 title 參數並返回 todo 對象
  Implementation notes: 實現 POST /todos 路由

呢個粒度之下,AI 喺一個任務內部同時寫測試同實現係完全合理。因為任務本身就要求佢同時做呢兩件事。呢個唔係 AI 唔聽話,而係我哋嘅指令有歧義——一步做完同分步做都算 完成任務

Superpowers 幫到啲乜

Superpowers 倉庫(github.com/obra/superpowers)提供咗幾個關鍵能力:

subagent-driven-development 嘅結構隔離係真實嘅。每個 subagent 係 fresh context,只睇到 controller 傳入嘅當前任務文本,睇唔到其他任務。Claude Code 嘅 Agent 工具保證咗 context 隔離——subagent 確實冇辦法存取其他任務嘅上下文,跨任務批量執行被阻止。

兩階段審查可以打回頭。spec reviewer 檢查 有冇做多咗/做少咗,code quality reviewer 檢查代碼質量。審查唔通過會打返俾 implementer 修復。

TDD skill 係 371 行嘅行為塑造文本。包含 Iron Law、反合理化表格、Red Flags 列表。但全部係 prompt,唔係可執行嘅斷言。

但有一個關鍵事實:兩個倉庫嘅核心代碼互不依賴。OpenSpec 核心代碼(src/)裏面 0 個 superpowers 引用,Superpowers 源碼裏面 0 個 openspec 引用。不過 OpenSpec 嘅 docs/customization.md 提到了 superpowers-bridge 社區 schema,說明官方已經注意到集成方案。集成完全依賴社區 schema 嘅 instruction 文本橋接。

配圖 1:v1 失敗路徑 vs v2 修正路徑對比
配圖 1:v1 失敗路徑 vs v2 修正路徑對比

圖 1:v1 失敗路徑 vs v2 修正路徑對比

第二節:修正思路 - 四層防護模型

根因分析清楚咗,修正方案就好自然。四層防護,每層解決一個具體問題。

第一層:原子化任務

解決嘅問題:任務內部混合 RED + GREEN,AI 可以合理地一步完成。

機制:在 tasks artifact 嘅 instruction 裏面強制要求每個 task 淨係包含一個 TDD 階段(RED、GREEN 或 REFACTOR)。用 checkbox 格式 - [ ] 書寫,確保 OpenSpec 嘅 tracks 可以正確解析。

[ ] RED: Write failing test for heading parsing
[ ] GREEN: Implement heading parser
[ ] RED: Write failing test for bold parsing
[ ] GREEN: Implement bold parser

而唔係:

[ ] Implement Markdown parser — support headings, bold, italic

個粒度變咗,AI 嘅操作空間就變咗。一個 subagent 淨係做一個原子任務,想一次過寫曬都冇機會。

第二層:subagent 隔離

解決嘅問題:AI 跨任務批量執行,喺第一個 subagent 就將所有功能寫曬。

機制:在 apply.instruction 裏面強制指定 superpowers:subagent-driven-development。每個 task 分配一個獨立 subagent,subagent 之間 context 完全隔離。第一個 subagent 唔知第二個 subagent 要做啲乜,自然冇得提前寫。

呢一層嘅關鍵係:唔係 建議 用 subagent,而係 instruction 裏面寫死 MANDATORY: Use superpowers:subagent-driven-development skill。當然,AI 仍然可能 ignore 呢條指令——呢個喺第五節嘅誠實評估會詳細講。

第三層:兩階段審查

解決嘅問題:subagent 喺單個任務入面過度執行——例如 RED 任務裏面同時寫咗實現代碼。

機制:spec reviewer 檢查 subagent 係咪恰好完成咗任務要求嘅內容,唔多唔少。code quality reviewer 檢查代碼質量。兩輪審查都唔通過就打回頭重做。

呢一層特別重要。假設 RED 階段嘅 subagent 除咗寫測試仲順手寫咗實現,spec reviewer 就應該捉到:你個任務只係要求寫測試,點解多咗實現代碼?打回頭。

第四層:驗證證據

解決嘅問題:無辦法確認 TDD 順序係咪真係執行咗——RED 一定要先失敗,GREEN 要令佢通過。

機制:subagent 一定要喺報告裏麪包含測試運行輸出。

  • RED 階段:報告一定要顯示測試失敗。如果 subagent 報告 all tests passing,就係 RED FLAG,一定要重新 dispatch。
  • GREEN 階段:報告一定要顯示測試通過。如果仲係 failing,唔標記完成,重新 dispatch。
  • REFACTOR 階段:報告一定要包含全量測試輸出。任何 regression 都唔放過。

呢一層提供咗可檢查嘅硬證據。唔睇 AI 點講,睇測試輸出點講。

配圖 2:四層防護模型架構圖
配圖 2:四層防護模型架構圖

圖 2:四層防護模型架構圖——由內到外:原子化任務、subagent 隔離、兩階段審查、驗證證據

你喺項目入面用過類似嘅 TDD 約束方案未?歡迎喺評論區分享你嘅經驗。

第三節:實戰 - 創建修正版 Schema

跟住落嚟係全文核心:完整嘅 tdd-driven-v2 Schema。你可以直接複製使用。

目錄結構

openspec/
├── schemas/
│   └── tdd-driven-v2/
│       ├── schema.yaml        # 工作流定義
│       └── templates/
│           ├── proposal.md
│           ├── spec.md
│           ├── design.md
│           ├── tasks.md
│           └── plan.md
├── config.yaml                # 項目配置(注意:在 openspec/ 根目錄下)
├── changes/                   # 變更記錄(openspec init 自動創建)
└── specs/                     # 規範目錄(openspec init 自動創建)

注意openspec init 只會自動創建 openspec/changes/openspec/specs/ 同工具適配目錄(.claude/.cursor/ 等)。**schemas/ 目錄和 config.yaml 唔會自動創建**,需要手動操作。

schema.yaml(全文核心)

name: tdd-driven-v2
version:2
description:AtomicTDDworkflowwithsubagentisolationandevidenceverification

artifacts:
-id:proposal
    generates:proposal.md
    description:Initialchangeproposalwithtestablebehaviors
    template:proposal.md
    instruction:|
      Create a proposal that explains WHY this change is needed.

      MANDATORY FORMAT for testable behaviors:
      ListeverytestablebehaviorusingWHEN/THENformat.

      Example:
      -WHENmarkdownToHtml("#Hello")iscalled
        THENresultis"<h1>Hello</h1>"
      -WHENmarkdownToHtml("**bold**")iscalled
        THENresultis"<strong>bold</strong>"
      -WHENmarkdownToHtml("Hello\n\nWorld")iscalled
        THENresultis"<p>Hello</p>\n<p>World</p>"

      DoNOTdescribeimplementationdetails.
      FocusonWHATshouldhappen,notHOW.
    requires:[]

-id:specs
    generates:specs/**/*.md
    description:Behavioralspecifications
    template:spec.md
    instruction:|
      Write behavioral specs using GIVEN/WHEN/THEN scenarios.

      Rules:
      -Eachscenariomustbeindependentlytestable
      -Cover:happypath,edgecases,errorcases
      -Expressexpectedbehavior,notimplementation
      -Referenceexistingpatternsbeforecreatingnewones
    requires:
      -proposal

-id:design
    generates:design.md
    description:Technicaldesignwithteststrategy
    template:design.md
    instruction:|
      Create a technical design explaining HOW to implement.

      MUST include:
      -Testfilestocreate(withexactpaths)
      -Teststrategyperfile(unit/integration)
      -Filestructureshowingtestfilesalongsidesourcefiles
      -Testrunnercommand(e.g.,npmtest)
    requires:
      -proposal

-id:tasks
    generates:tasks.md
    description:AtomicTDDtasklist
    template:tasks.md
    instruction:|
      CRITICAL: Break work into ATOMIC TDD tasks.
      Each task is EXACTLY ONE TDD phase (RED, GREEN, or REFACTOR).

      MANDATORYFORMATuse checkbox syntax for every task:

      ### Feature: [feature name]

      -[]RED:Writefailingtest[具體測試什麼行為]
      -[]GREEN:Implement[最小實現描述,引用對應的RED任務]
      -[]REFACTOR:Cleanup[清理描述](可選,不是每個GREEN都需要)

      Rules:
      1.NEVERcombineREDandGREENinonetask
      2.EveryGREENtaskmustreferenceitscorrespondingREDtest
      3.EverytaskMUSTuse"- [ ]"checkboxformatnootherformatallowed
      4. Tasks alternate:REDGREEN(REFACTOR)REDGREEN...
      5.Notaskshouldtakemorethan2-5minutes
      6.DoNOTgroupbyfeaturegroupbyTDDphaseorder

      Example of correct output:

      -[]RED:Writefailingtestforheadingparsingcreatemarkdown.test.ts,testthatmarkdownToHtml("#Hello")returns"<h1>Hello</h1>"
      -[]GREEN:Implementheadingparserminimalregextoconvert"# text"to"<h1>text</h1>"
      -[]RED:WritefailingtestforboldparsingtestthatmarkdownToHtml("**bold**")returns"<strong>bold</strong>"
      -[]GREEN:Implementboldparserminimalregextoconvert"**text**"to"<strong>text</strong>"
      -[]REFACTOR:Extractinlineparsingmodulemovebold/italicparsingtosharedinline-parser.ts

      ExampleofWRONGoutput(doNOTdothis):

      -[]ImplementMarkdownparsersupportheadings,bold,italic,linkswithtestsWRONG:combineseverything
    requires:
      -specs
      -design

-id:plans
    generates:plan.md
    description:Executionplanwithper-phaseevidencerequirements
    template:plan.md
    instruction:|
      PRECHECK: Verify superpowers:writing-plans skill is available.
      If not available, STOP and report the missing skill.

      Createadetailedexecutionplan.EachplanstepmapstoEXACTLYONEtaskfromtasks.md.

      ForREDtasks,specify:
      -Filetocreate/modify(exactpath)
      -Testassertiontowrite
      -Expectedfailurereason
      -Verify command:npmtest--[test-file]
      -Evidence:"Test MUST fail with [expected reason]"

      ForGREENtasks,specify:
      -Whichfailingtesttopass(referencetheREDtaskbydescription)
      -Minimalcodetowrite
      -Verify command:npmtest--[test-file]
      -Evidence:"Test MUST pass"

      ForREFACTORtasks,specify:
      -Whattocleanup
      -Verify command:npmtest
      -Evidence:"ALL tests MUST still pass"

      Afterplaniscreated,append this section:

      ---
      ## Execution Mode Selection

      REQUIRED:Usesuperpowers:subagent-driven-developmentskillforexecution.

      DONOTuseexecuting-plansorinlineexecution.
      Reason:AtomicTDDtasksrequiresubagentisolation.
      EachtaskisasingleTDDphaseonesubagentperphase.
    requires:
      -tasks

apply:
requires:[plans]
tracks:tasks.md
instruction:|
    MANDATORY: Use superpowers:subagent-driven-development skill.
    DO NOT use executing-plans or inline execution.

    Execution rules:
    1.EachtaskisanatomicTDDphasedispatchONEsubagentpertask
    2.NEVERdispatchmultipleimplementationsubagentsinparallel
    3.TasksMUSTbeexecutedinorderdonotskiporreorder

    Evidence requirements per subagent:
    -RED tasks:SubagentMUSTincludetestfailureoutputinreport
      Ifsubagentreports"all tests passing"onaREDtaskREDFLAGre-dispatch
    -GREEN tasks:SubagentMUSTincludetestpassoutputinreport
      Ifsubagentreports"tests still failing"onaGREENtaskdoNOTmarkcompletere-dispatchwithfix
    -REFACTOR tasks:SubagentMUSTincludefulltestsuiteoutput
      IfanytestfailsafterrefactordoNOTmarkcompletere-dispatchwithfix

    After each task:
    1. Spec reviewer checks:Didsubagentbuildexactlywhatwasrequested?Nothingmore,nothingless?
    2. Code quality reviewer checks:Iscodeclean,tested,maintainable?
    3.OnlyafterBOTHreviewersapprovemarktaskcompleteintasks.md(-[]-[x])
    4.Proceedtonexttask

    After all tasks complete:
    1.Runfulltestsuite
    2.Verifyallspecsaresatisfied
    3.CheckforTODOmarkers

模板文件

templates/proposal.md

# Proposal: {{change_name}}

## Problem
<!-- 描述要解決的問題 -->

## Testable Behaviors
<!-- WHEN/THEN 格式列出每一個可測試行為 -->

## Acceptance Criteria
<!-- 驗收標準 -->

templates/spec.md

# Spec: {{change_name}}

## Scenarios

### Scenario 1: [name]
GIVEN: [前置條件]
WHEN: [操作]
THEN: [期望結果]

<!-- Repeat for each scenario -->

templates/design.md

# Design: {{change_name}}

## File Structure
<!-- 列出要創建的文件,包括測試文件 -->

## Test Strategy
<!-- 每個 test 文件的測試策略 -->

## Implementation Notes
<!-- 實現要點 -->

templates/tasks.md

# Tasks: {{change_name}}

## Atomic TDD Task List

<!-- 每個 task 只能是一個 TDD 階段 -->
<!-- 必須使用 checkbox 格式 -->

### [AI fills feature name]

[ ] RED: ...
[ ] GREEN: ...
[ ] REFACTOR: ...

templates/plan.md

# Execution Plan: {{change_name}}

## Micro-tasks

### Step 1: RED — [description]
Test file: [path]
Assertion: [what to test]
Expected failure: [reason]
Verify: `npm test -- [test-file]`

### Step 2: GREEN — [description]
Pass test from: Step 1
Minimal code: [what to implement]
Verify: `npm test -- [test-file]`

<!-- Repeat for each task -->

項目配置 config.yaml

schema: tdd-driven-v2

context:|
  Tech stack: TypeScript, Node.js, Jest
  Testing framework: Jest
  Test runner: npm test
  Project: Pure function library — no framework, no database, no HTTP
  Core function signature: markdownToHtml(input: string): string
  All production code must have corresponding tests.

rules:
proposal:
    -ListeverytestablebehaviorinWHEN/THENformat
    -Donotdescribeimplementation
specs:
    -UseGIVEN/WHEN/THENformatforeveryscenario
    -Eachscenariomustbeindependentlytestable
design:
    -Mustspecifyexacttestfilepaths
    -Mustspecifyteststrategyperfile
tasks:
    -MUSTusecheckboxformat"- [ ]"foreverytask
    -EachtaskisexactlyONETDDphase(RED,GREEN,orREFACTOR)
    -TasksmustalternateREDGREEN(optionalREFACTOR)
    -GREENtasksmustreferencetheircorrespondingREDtask
plans:
    -Eachplanstepmapstoexactlyonetask
    -Mustspecifyverifycommandandexpectedevidence
配圖 3:Schema 四層防護映射圖
配圖 3:Schema 四層防護映射圖

圖 3:Schema 配置點樣對應四層防護——左:Schema 工作流,右:四層防護映射

第四節:實戰驗證 - 用 Mini Markdown 轉換器行一次

Schema 寫好咗,跟住用一個真實用例行一次驗證。

點解揀 Mini Markdown 轉換器

三個原因:

  1. 零依賴:純 Node.js + Jest,唔需要 Express/數據庫/HTTP
  2. 純函數markdownToHtml(input: string): string,輸入輸出完全確定
  3. 天然適合原子化 TDD:每個 Markdown 語法元素(heading/bold/italic/link)= 一個獨立嘅 RED-GREEN 循環

環境準備

# 0. 初始化 git(後續驗證需要 git log)
git init

# 1. 初始化項目
mkdir mini-markdown && cd mini-markdown
npm init -y
npm install --save-dev jest ts-jest @types/jest typescript

# 2. 初始化 OpenSpec(生成 openspec/changes/、openspec/specs/ 和工具適配目錄)
# 初學者建議用 --tools claude,只安裝 Claude Code 適配,避免生成 29 個不需要的工具目錄
openspec init --tools claude

# 3. 手動創建 Schema 目錄和配置文件
mkdir -p openspec/schemas/tdd-driven-v2/templates
# 將 schema.yaml 放到 openspec/schemas/tdd-driven-v2/
# 將 config.yaml 放到 openspec/(注意:在 openspec/ 根目錄下,不在 schemas/ 裏)
# 將模板文件放到 openspec/schemas/tdd-driven-v2/templates/

驗證步驟

步驟 1:驗證 Schema 語法

openspec schema validate tdd-driven-v2
# 注意:會先顯示 "Note: Schema commands are experimental and may change."
# 這是 CLI 的常規提示,不影響驗證結果

✅ 檢查:冇報錯,YAML 語法通過

步驟 2:創建變更提案

# 在 Claude Code 中執行
/opsx:propose mini-markdown

執行後,AI 會依次調用 openspec instructions <artifact> --change mini-markdown --json 獲取 instruction 文本,按依賴順序生成:proposal → design + specs(並行)→ tasks → plans。

如果 config.yaml 的 context 字段寫得充分(好似呢個項目嘅 TypeScript + Jest 純函數配置),成個 propose 過程唔需要任何人手輸入。 AI 直接從 context 推斷需求,成個過程大概 2-3 分鐘。

重點檢查以下驗證點:

✅ proposal.md 包含 WHEN/THEN 格式嘅可測試行為(實測 15 條) ✅ specs 用 GIVEN/WHEN/THEN(實測 16 個場景,包含 edge cases) ✅ design.md 包含測試文件路徑同測試策略 ✅ tasks.md 每個 task 淨係得一個 TDD 階段(實測 26 個 task:13 RED + 13 GREEN) ← 核心驗證點 ✅ tasks.md 用咗 checkbox 格式 ← 核心驗證點 ⚠️ tasks.md 冇 REFACTOR 任務——AI 認為 REFACTOR 係可選,揀咗跳過 ✅ plans 指定咗驗證命令同期望證據,尾度有 "Execution Mode Selection" 指定 subagent-driven-development

如果 tasks.md 嘅產出類似下面咁,就證明第一層防護生效咗:

### Headings
[ ] RED: Write failing test for heading parsing — create tests/markdown.test.ts, test that markdownToHtml("# Hello") returns "<h1>Hello</h1>"
[ ] GREEN: Implement heading parser — add regex in src/parser.ts to convert "^# (.+)" to "<h1>$1</h1>", export from src/index.ts

### Bold
[ ] RED: Write failing test for bold parsing — test that markdownToHtml("**bold**") returns "<strong>bold</strong>"
[ ] GREEN: Implement bold parser — minimal regex to convert "**text**" to "<strong>text</strong>"

❌ 如果產出係 - [ ] Implement heading and bold parser,就說明原子化冇生效。

步驟 3:確認 instruction 注入

openspec instructions tasks --change mini-markdown --json

✅ 檢查:輸出包含原子化任務嘅 instruction 文本

步驟 4:執行變更

# 在 Claude Code 中執行
/opsx:apply mini-markdown

呢一步係全文最關鍵嘅驗證環節。以下係 Mini Markdown 驗證嘅實測結果,唔再係預期分析。

AI 執行咗 openspec instructions apply --change "mini-markdown" --json 獲取 apply instruction,然後用 Agent 工具 dispatch 咗 27 次 subagent

  • 24 個實現 subagent(每個 task 一個)
  • 1 個 spec 審查 subagent
  • 2 個代碼質量審查 subagent

四層防護實測結果

✅ 第一層生效:tasks.md 嘅 26 個 task 每個淨係包含一個 TDD 階段(RED 或 GREEN)。任務嘅原子化粒度係物理約束,唔依賴 AI 嘅自主決策。

✅ 第二層生效:AI dispatch 咗 24 個實現 subagent,每個 task 確實由獨立 subagent 完成。instruction 裏面嘅 MANDATORY: Use superpowers:subagent-driven-development skill 被 AI 遵守咗。subagent 之間 context 隔離,第一個 subagent 唔知第二個 subagent 要做啲乜。

⚠️ 第三層部分生效:頭 2 個 task(Task 1 RED + Task 2 GREEN)有完整嘅審查流程——spec reviewer 檢查交付物範圍,code quality reviewer 檢查代碼質量。但 AI 驗證完頭幾個 task 之後,認為審查流程太嘥時間,跳過咗後面 24 個 task 嘅審查。subagent 調用詳情:

Agent #1:  Implement Task 1 RED: heading test
Agent #2:  Review spec compliance Task 1 RED        ← spec reviewer
Agent #3:  Review code quality Task 1 RED            ← code quality reviewer
Agent #4:  Implement Task 2 GREEN: heading parser
Agent #5:  Review code quality Task 2 GREEN          ← code quality reviewer
Agent #6:  Implement Task 3 RED: bold test
Agent #7:  Implement Task 4 GREEN: bold parser
...(後續 task 只有實現 subagent,無審查)
Agent #27: Implement Task 26 GREEN: image parser

✅ 第四層生效:npm test 嘅執行歷史(15 次)清楚顯示咗真實嘅 RED → GREEN 過渡:

#4  Tests: 2 failed, 11 passed — RED(bold test 失敗)
#5  Tests: 5 failed, 8 passed  — RED(多個新 test 失敗)
#14 Tests: 1 failed, 10 passed — 最後一個 RED
#15 Tests: 10 passed           — 最終 GREEN

呢啲失敗係真實發生嘅,唔係 AI 作——佢哋嚟自 npm test 嘅真實輸出。

執行完成後檢查最終產物:

# 檢查 tasks.md 的 checkbox 是否被逐步勾選
cat openspec/changes/mini-markdown/tasks.md

# 檢查 git log 是否有交替的 test/feat 提交
git log --oneline

# 運行全量測試
npm test

✅ tasks.md 嘅 26 個 checkbox 全部被勾選 ⚠️ git log 冇 RED-only 提交——RED 同 GREEN 喺同一次提交完成,而且 commit message 格式唔統一 ✅ npm test 通過(10/10 tests passed) ⚠️ 測試覆蓋率 10/15 行為(缺失 h2/h3 多級標題、horizontal rule、mixed inline formatting、code blocks) ⚠️ 源碼結構偏離 design.md 規劃(AI 揀咗單文件 src/markdown.ts 71 行,而唔係 design.md 嘅雙文件方案)

最終產物:src/markdown.ts(71 行)、tests/markdown.test.ts(43 行、10 個 test case),npm test 10/10 passed。

配圖 4:驗證執行時間線
配圖 4:驗證執行時間線

圖 4:Mini Markdown 驗證執行時間線——雙軌展示 27 次 subagent dispatch 同 15 次 npm test 嘅 RED→GREEN 過渡

如果驗證唔通過

幾個常見嘅失敗場景同排查方向:

場景 1:AI 冇用 subagent 模式

如果 apply 階段直接 inline 執行而唔係 dispatch subagent,說明 instruction 裏的 MANDATORY 被 ignore 咗。排查方向:檢查 Superpowers 嘅 subagent-driven-development skill 係咪正確安裝。如果 skill 唔存在,instruction 就係一張廢紙。

場景 2:RED 任務入面同時寫咗實現

如果 spec reviewer 冇捉到呢個問題,就說明審查層失效。排查方向:檢查 spec reviewer 嘅 prompt 係咪明確要求 淨係檢查任務規格入面嘅交付物

場景 3:測試輸出不真實

如果 subagent 報告嘅測試輸出係作嘅(例如報 pass 但實際冇運行),目前冇代碼層面嘅防偽機制。呢個係第四層嘅已知侷限,第五節會詳細討論。

第五節:誠實評估

四層防護模型聽落好完善,但一定要坦白講:佢冇辦法 100% 保證 TDD 執行。以下用 Mini Markdown 嘅實測數據,逐一說明每層嘅實際效果同已知侷限。

每層嘅實測效果

第一層(原子化任務):實測有效。當 tasks.md 嘅每個 task 淨係得一個 TDD 階段時,即使 AI 想一步完成,task 嘅描述本身就限制咗佢嘅操作範圍。實測中 tasks.md 生成了 26 個原子 task(13 RED + 13 GREEN),AI 冇合併任何任務。呢個係四層入面最可靠嘅一層——任務粒度係物理約束,唔依賴 AI 嘅自主決策。

第二層(subagent 隔離):實測有效。Mini Markdown 驗證中,AI dispatch 咗 24 個實現 subagent,每個 task 確實由獨立 subagent 完成。instruction 裏面嘅 MANDATORY: Use superpowers:subagent-driven-development skill 被 AI 遵守咗。subagent 之間 context 隔離,第一個 subagent 唔知第二個 subagent 要做啲乜。

留意:有效唔代表 100% 可靠。其他項目、其他 AI 模型、其他 instruction 上下文,AI 仍然可能選擇 ignore MANDATORY 揀 inline 執行。但係喺呢個驗證場景中,第二層確實生效咗。

第三層(兩階段審查):實測部分有效。頭 2 個 task(Task 1 RED + Task 2 GREEN)有完整嘅審查流程——spec reviewer 檢查交付物範圍,code quality reviewer 檢查代碼質量。但 AI 驗證完頭幾個 task 之後,認為審查流程太嘥時間,跳過咗後面 24 個 task 嘅審查。

呢個結果揭示咗一個微妙嘅問題:審查機制存在而且可以正確運作(頭 2 個 task 嘅審查係真實嘅),但 AI 有自主跳過審查嘅裁量權。instruction 入面冇話 "每個 task 都一定要審查",AI 合理地認為頭幾個驗證過咗就夠。

改進方向:喺 apply.instruction 入面明確寫 "Review EVERY task, not just the first few"。但呢個都只係 prompt 級別嘅約束——AI 仍然可以選擇 ignore。

第四層(驗證證據):實測有效。npm test 嘅執行歷史(15 次)清楚顯示咗 RED → GREEN 嘅過渡:

  • 第 4 次運行:2 failed, 11 passed(bold test 失敗)
  • 第 5 次運行:5 failed, 8 passed(多個新 test 失敗)
  • 第 14 次運行:1 failed, 10 passed(最後一個 RED)
  • 第 15 次運行:10 passed(最終全部通過)

呢啲失敗係真實發生嘅,唔係 AI 作——佢哋嚟自 npm test 嘅真實輸出。第四層提供咗可靠嘅 TDD 順序證據。

但有一個已知侷限:git log 入面冇 RED-only 提交。AI 喺 RED 階段寫咗測試但冇單獨提交,而係同 GREEN 一齊提交。即係話從 git 歷史睇唔到 "先寫測試、測試失敗、再寫實現" 嘅交替模式。測試覆蓋率亦只有 10/15 行為。

實測中發現嘅問題

  • 審查覆蓋唔完整:AI 跳過咗 24/26 個 task 嘅審查(第三層)
  • 測試覆蓋率不足:10/15 行為有測試,缺失 5 個可測試行為(h2/h3、horizontal rule、mixed inline、code blocks)
  • 架構決策偏離:AI 自行由雙文件方案調整為單文件方案,冇打回頭
  • git log 冇 RED-only 提交:無法從版本歷史見到 TDD 交替模式
  • REFACTOR 被跳過:AI 將 REFACTOR 視為 "可選" 而跳過,26 個 task 全部係 RED + GREEN

講到尾,呢啲問題係第三層審查被跳過嘅直接後果。如果有 spec reviewer 檢查 Task 3-26,AI 自行調整文件結構(由雙文件變單文件)同跳過 5 個行為嘅測試覆蓋應該會被打回頭。

如果需要更高保證

如果對 TDD 執行紀律有硬性要求(例如團隊規範或合規需要),可以喺四層防護之外加兩道硬約束:

  • pre-commit hook:檢查測試覆蓋率,拒絕覆蓋率低過門檻嘅提交
  • CI pipeline:拒絕冇對應測試變更嘅 feature 提交

呢兩道約束係代碼層面嘅,唔依賴 AI 嘅自主決策,可靠性遠高於 prompt 級別嘅防護。

同 v1 嘅對比

維度
v1(失敗)
v2(設計)
v2(實測)
任務粒度
一個 task = 完整功能
一個 task = 一個原子 TDD 階段
✅ 生效,26 個原子 task
執行路徑
AI 自選(揀咗 inline)
強制 subagent-driven-development
✅ 生效,24 個 subagent
進度追蹤
冇 checkbox,tracks 解析失敗
強制 checkbox 格式,tracks 可追蹤
✅ 生效,tracks 正確解析
審查機制
spec + quality reviewer
⚠️ 部分生效,僅前 2/26 task
驗證證據
subagent 報告測試輸出
✅ 生效,RED 失敗證據真實

v1 喺 propose 階段嘅文檔規範化係有效嘅——WHEN/THEN、GIVEN/WHEN/THEN 呢啲格式約束確實令產物更規範。但 apply 階段嘅執行紀律完全失敗。v2 透過原子化任務 + subagent 隔離 + 兩階段審查 + 驗證證據,喺 apply 階段實現咗可預期嘅 TDD 執行。

四層防護模型嘅實測結果:三層有效,一層部分有效。第一層(原子化任務)同第二層(subagent 隔離)係最可靠嘅——任務粒度係物理約束,subagent 隔離係工具機制保證。第三層(審查)機制本身正確,但 AI 揀咗加速執行跳過審查,暴露咗 prompt 級約束嘅天花板。第四層(驗證證據)提供咗真實嘅 RED 失敗記錄,係最硬嘅客觀證據。

核心洞察不變:縮細 AI 嘅合理操作空間令 AI 變得更聽話更可靠。當每個任務淨係允許做一件事,subagent 之間互相睇唔到,做完仲有人審查——即使審查被跳過,前兩層已經將 AI 嘅操作空間壓縮到原子級別。

當然,呢個判斷需要更多場景驗證。如果你都試咗呢個 Schema,歡迎將驗證結果反饋俾我——成功咗值得記錄,失敗咗更有分析價值。

配圖 5:實測對比評估圖
配圖 5:實測對比評估圖

圖 5:v1/v2 設計/v2 實測三方對比評估——5 個維度嘅演進同實測效果

好啦,多謝你睇完我篇文章,如果鍾意可以點讚轉發俾有需要嘅朋友,我哋下一期再見!敬請期待!

掃碼關注,獲取更多 AI 工具嘅實戰經驗同最佳實踐。唔好錯過每一篇乾貨!

圖片

🚩 2026 年「術哥無界」系列實戰文檔 X 篇原創計劃 第 103 篇,AI 編程最佳實戰「2026」系列第 28

大家好,歡迎來到 術哥無界 | ShugeX | 運維有術

我是術哥,一名專注於 AI 編程、AI 智能體、Agent Skills、MCP、雲原生、AIOps、Milvus 向量數據庫的技術實踐者與開源佈道者

Talk is cheap, let's explore。無界探索,有術而行。

封面圖:四層防護模型信息圖
封面圖:四層防護模型信息圖

用 OpenSpec 自定義 Schema + Superpowers subagent 編排,讓 AI 按 TDD 流程寫代碼。v1 完全失敗——AI 一口氣寫完所有代碼,跳過 RED 階段。v2 做了 4 層防護修正,拆成 26 個原子任務,實測 dispatch 了 27 次 subagent,3 層防護通過,1 層被 AI 跳過了。

失敗根因不在 instruction 措辭,在任務粒度。這篇文章覆盤完整過程,給出可直接複製的 schema.yaml

說明:本文內容基於 OpenSpec(Fission-AI/OpenSpec)和 Superpowers(obra/superpowers)的源碼分析及 Mini Markdown 轉換器的實際操作驗證。源碼分析基於筆者本地倉庫版本,已在 Mini Markdown 項目中完成主要場景驗證。文中的配置模板和參數建議僅供參考,實際效果請以你的業務數據和環境測試結果為準。如果有實際使用經驗,歡迎在評論區分享交流。

第一節:問題覆盤 - v1 為什麼失敗了

v1 做了什麼

第一版 Schema 的設計思路很直觀:在 OpenSpec 的 instruction 裏寫一大段 TDD 規則,要求 AI 按 RED-GREEN-REFACTOR 循環執行。propose 階段的產物看起來也不錯——proposal 裏有 WHEN/THEN 格式的可測試行為,specs 用了 GIVEN/WHEN/THEN,文檔規範化確實有效。

但到 apply 階段就崩了。AI 一口氣寫完所有代碼,跳過了 RED 階段,測試是寫完實現後補的。TDD 形同虛設。

失敗根因:任務粒度,不是措辭

一開始很容易歸因為 instruction 不夠強 或者 AI 不聽話。但翻了一遍源碼之後,根因很清楚。

先看 OpenSpec 的真實能力邊界(基於源碼分析):

tracks 是 checkbox 解析器。它的正則 /^[-*]\s*\[([ xX])\]\s*(.+)\s*$/ 只認 - [ ] 格式的行(末尾 \s* 會自動去除行尾空白)。非 checkbox 行被靜默忽略,不報錯也不警告。如果你的 tasks.md 裏有段落描述、標題說明這些非 checkbox 內容,tracks 直接跳過,完全不管。

requires 是文件存在性檢查。它檢查文件是否存在,不存在則標記 state: blocked。但只檢查存在,不檢查內容resolveArtifactOutputs 只做 glob 匹配,不讀文件內容)。

注意區分兩個階段:

  • propose 階段(artifact 依賴解析):requires 影響解析順序,屬於 "enabler not gate"——缺失不阻止生成
  • apply 階段:缺失 required artifacts 會直接 state: 'blocked',硬阻止執行

instruction 是純文本注入。通過 CLI 輸出到 stdout,AI skill 讀取。注入是確定發生的(代碼保證了這一步),但執行完全取決於 AI 的自主決策。OpenSpec 源碼裏搜索不到任何 hook、callback 或事件機制——零個運行時回調點。

再看 v1 的 tasks.md 產出:

Task 1: 創建 Todo 接口
  Test description: 驗證 POST /todos 返回 201
  Expected behavior: 接受 title 參數並返回 todo 對象
  Implementation notes: 實現 POST /todos 路由

這個粒度下,AI 在一個任務內部同時寫測試和實現是完全合理的。因為任務本身就要求它同時做這兩件事。這不是 AI 不聽話,是我們的指令有歧義——一步做完和分步做都算 完成任務

Superpowers 能幫什麼忙

Superpowers 倉庫(github.com/obra/superpowers)提供了幾個關鍵能力:

subagent-driven-development 的結構隔離是真實的。每個 subagent 是 fresh context,只看到 controller 傳入的當前任務文本,看不到其他任務。Claude Code 的 Agent 工具保證了 context 隔離——subagent 確實無法訪問其他任務的上下文,跨任務批量執行被阻止。

兩階段審查可以打回。spec reviewer 檢查 是否多做了/少做了,code quality reviewer 檢查代碼質量。審查不通過會打回讓 implementer 修復。

TDD skill 是 371 行的行為塑造文本。包含 Iron Law、反合理化表格、Red Flags 列表。但全是 prompt,不是可執行的斷言。

但有一個關鍵事實:兩個倉庫的核心代碼互不依賴。OpenSpec 核心代碼(src/)裏 0 個 superpowers 引用,Superpowers 源碼裏 0 個 openspec 引用。不過 OpenSpec 的 docs/customization.md 提到了 superpowers-bridge 社區 schema,說明官方已經注意到了集成方案。集成完全依賴社區 schema 的 instruction 文本橋接。

配圖 1:v1 失敗路徑 vs v2 修正路徑對比
配圖 1:v1 失敗路徑 vs v2 修正路徑對比

圖 1:v1 失敗路徑 vs v2 修正路徑對比

第二節:修正思路 - 四層防護模型

根因分析清楚了,修正方案就自然了。四層防護,每層解決一個具體問題。

第一層:原子化任務

解決的問題:任務內部混合 RED + GREEN,AI 可以合理地一步完成。

機制:在 tasks artifact 的 instruction 裏強制要求每個 task 只包含一個 TDD 階段(RED、GREEN 或 REFACTOR)。用 checkbox 格式 - [ ] 書寫,確保 OpenSpec 的 tracks 能正確解析。

[ ] RED: Write failing test for heading parsing
[ ] GREEN: Implement heading parser
[ ] RED: Write failing test for bold parsing
[ ] GREEN: Implement bold parser

而不是:

[ ] Implement Markdown parser — support headings, bold, italic

粒度變了,AI 的操作空間就變了。一個 subagent 只做一個原子任務,想一口氣寫完也沒機會。

第二層:subagent 隔離

解決的問題:AI 跨任務批量執行,在第一個 subagent 裏就把所有功能寫完。

機制:在 apply.instruction 裏強制指定 superpowers:subagent-driven-development。每個 task 分配一個獨立 subagent,subagent 之間 context 完全隔離。第一個 subagent 不知道第二個 subagent 要做什麼,自然沒法提前寫。

這一層的關鍵是:不是 建議 用 subagent,是 instruction 裏寫死 MANDATORY: Use superpowers:subagent-driven-development skill。當然,AI 仍然可能忽略這條指令——這在第五節的誠實評估裏會詳細說。

第三層:兩階段審查

解決的問題:subagent 在單個任務內過度執行——比如 RED 任務裏同時寫了實現代碼。

機制:spec reviewer 檢查 subagent 是否恰好完成了任務要求的內容,不多不少。code quality reviewer 檢查代碼質量。兩輪審查都不通過就打回重做。

這一層特別重要。假設 RED 階段的 subagent 除了寫測試還順手寫了實現,spec reviewer 應該能抓住:你的任務只要求寫測試,為什麼多了實現代碼?打回。

第四層:驗證證據

解決的問題:無法確認 TDD 順序是否真正執行——RED 必須先失敗,GREEN 必須讓它通過。

機制:subagent 必須在報告中包含測試運行輸出。

  • RED 階段:報告必須顯示測試失敗。如果 subagent 報告 all tests passing,那就是 RED FLAG,必須重新 dispatch。
  • GREEN 階段:報告必須顯示測試通過。如果還是 failing,不標記完成,重新 dispatch。
  • REFACTOR 階段:報告必須包含全量測試輸出。任何迴歸都不放過。

這一層提供了可檢查的硬證據。不看 AI 怎麼說,看測試輸出怎麼說。

配圖 2:四層防護模型架構圖
配圖 2:四層防護模型架構圖

圖 2:四層防護模型架構圖——從內到外:原子化任務、subagent 隔離、兩階段審查、驗證證據

你在項目中用過類似的 TDD 約束方案嗎?歡迎在評論區聊聊你的經驗。

第三節:實戰 - 創建修正版 Schema

接下來是全文核心:完整的 tdd-driven-v2 Schema。你可以直接複製使用。

目錄結構

openspec/
├── schemas/
│   └── tdd-driven-v2/
│       ├── schema.yaml        # 工作流定義
│       └── templates/
│           ├── proposal.md
│           ├── spec.md
│           ├── design.md
│           ├── tasks.md
│           └── plan.md
├── config.yaml                # 項目配置(注意:在 openspec/ 根目錄下)
├── changes/                   # 變更記錄(openspec init 自動創建)
└── specs/                     # 規範目錄(openspec init 自動創建)

注意openspec init 只會自動創建 openspec/changes/openspec/specs/ 和工具適配目錄(.claude/.cursor/ 等)。**schemas/ 目錄和 config.yaml 不會自動創建**,需要手動操作。

schema.yaml(全文核心)

name: tdd-driven-v2
version:2
description:AtomicTDDworkflowwithsubagentisolationandevidenceverification

artifacts:
-id:proposal
    generates:proposal.md
    description:Initialchangeproposalwithtestablebehaviors
    template:proposal.md
    instruction:|
      Create a proposal that explains WHY this change is needed.

      MANDATORY FORMAT for testable behaviors:
      ListeverytestablebehaviorusingWHEN/THENformat.

      Example:
      -WHENmarkdownToHtml("#Hello")iscalled
        THENresultis"<h1>Hello</h1>"
      -WHENmarkdownToHtml("**bold**")iscalled
        THENresultis"<strong>bold</strong>"
      -WHENmarkdownToHtml("Hello\n\nWorld")iscalled
        THENresultis"<p>Hello</p>\n<p>World</p>"

      DoNOTdescribeimplementationdetails.
      FocusonWHATshouldhappen,notHOW.
    requires:[]

-id:specs
    generates:specs/**/*.md
    description:Behavioralspecifications
    template:spec.md
    instruction:|
      Write behavioral specs using GIVEN/WHEN/THEN scenarios.

      Rules:
      -Eachscenariomustbeindependentlytestable
      -Cover:happypath,edgecases,errorcases
      -Expressexpectedbehavior,notimplementation
      -Referenceexistingpatternsbeforecreatingnewones
    requires:
      -proposal

-id:design
    generates:design.md
    description:Technicaldesignwithteststrategy
    template:design.md
    instruction:|
      Create a technical design explaining HOW to implement.

      MUST include:
      -Testfilestocreate(withexactpaths)
      -Teststrategyperfile(unit/integration)
      -Filestructureshowingtestfilesalongsidesourcefiles
      -Testrunnercommand(e.g.,npmtest)
    requires:
      -proposal

-id:tasks
    generates:tasks.md
    description:AtomicTDDtasklist
    template:tasks.md
    instruction:|
      CRITICAL: Break work into ATOMIC TDD tasks.
      Each task is EXACTLY ONE TDD phase (RED, GREEN, or REFACTOR).

      MANDATORYFORMATuse checkbox syntax for every task:

      ### Feature: [feature name]

      -[]RED:Writefailingtest[具體測試什麼行為]
      -[]GREEN:Implement[最小實現描述,引用對應的RED任務]
      -[]REFACTOR:Cleanup[清理描述](可選,不是每個GREEN都需要)

      Rules:
      1.NEVERcombineREDandGREENinonetask
      2.EveryGREENtaskmustreferenceitscorrespondingREDtest
      3.EverytaskMUSTuse"- [ ]"checkboxformatnootherformatallowed
      4. Tasks alternate:REDGREEN(REFACTOR)REDGREEN...
      5.Notaskshouldtakemorethan2-5minutes
      6.DoNOTgroupbyfeaturegroupbyTDDphaseorder

      Example of correct output:

      -[]RED:Writefailingtestforheadingparsingcreatemarkdown.test.ts,testthatmarkdownToHtml("#Hello")returns"<h1>Hello</h1>"
      -[]GREEN:Implementheadingparserminimalregextoconvert"# text"to"<h1>text</h1>"
      -[]RED:WritefailingtestforboldparsingtestthatmarkdownToHtml("**bold**")returns"<strong>bold</strong>"
      -[]GREEN:Implementboldparserminimalregextoconvert"**text**"to"<strong>text</strong>"
      -[]REFACTOR:Extractinlineparsingmodulemovebold/italicparsingtosharedinline-parser.ts

      ExampleofWRONGoutput(doNOTdothis):

      -[]ImplementMarkdownparsersupportheadings,bold,italic,linkswithtestsWRONG:combineseverything
    requires:
      -specs
      -design

-id:plans
    generates:plan.md
    description:Executionplanwithper-phaseevidencerequirements
    template:plan.md
    instruction:|
      PRECHECK: Verify superpowers:writing-plans skill is available.
      If not available, STOP and report the missing skill.

      Createadetailedexecutionplan.EachplanstepmapstoEXACTLYONEtaskfromtasks.md.

      ForREDtasks,specify:
      -Filetocreate/modify(exactpath)
      -Testassertiontowrite
      -Expectedfailurereason
      -Verify command:npmtest--[test-file]
      -Evidence:"Test MUST fail with [expected reason]"

      ForGREENtasks,specify:
      -Whichfailingtesttopass(referencetheREDtaskbydescription)
      -Minimalcodetowrite
      -Verify command:npmtest--[test-file]
      -Evidence:"Test MUST pass"

      ForREFACTORtasks,specify:
      -Whattocleanup
      -Verify command:npmtest
      -Evidence:"ALL tests MUST still pass"

      Afterplaniscreated,append this section:

      ---
      ## Execution Mode Selection

      REQUIRED:Usesuperpowers:subagent-driven-developmentskillforexecution.

      DONOTuseexecuting-plansorinlineexecution.
      Reason:AtomicTDDtasksrequiresubagentisolation.
      EachtaskisasingleTDDphaseonesubagentperphase.
    requires:
      -tasks

apply:
requires:[plans]
tracks:tasks.md
instruction:|
    MANDATORY: Use superpowers:subagent-driven-development skill.
    DO NOT use executing-plans or inline execution.

    Execution rules:
    1.EachtaskisanatomicTDDphasedispatchONEsubagentpertask
    2.NEVERdispatchmultipleimplementationsubagentsinparallel
    3.TasksMUSTbeexecutedinorderdonotskiporreorder

    Evidence requirements per subagent:
    -RED tasks:SubagentMUSTincludetestfailureoutputinreport
      Ifsubagentreports"all tests passing"onaREDtaskREDFLAGre-dispatch
    -GREEN tasks:SubagentMUSTincludetestpassoutputinreport
      Ifsubagentreports"tests still failing"onaGREENtaskdoNOTmarkcompletere-dispatchwithfix
    -REFACTOR tasks:SubagentMUSTincludefulltestsuiteoutput
      IfanytestfailsafterrefactordoNOTmarkcompletere-dispatchwithfix

    After each task:
    1. Spec reviewer checks:Didsubagentbuildexactlywhatwasrequested?Nothingmore,nothingless?
    2. Code quality reviewer checks:Iscodeclean,tested,maintainable?
    3.OnlyafterBOTHreviewersapprovemarktaskcompleteintasks.md(-[]-[x])
    4.Proceedtonexttask

    After all tasks complete:
    1.Runfulltestsuite
    2.Verifyallspecsaresatisfied
    3.CheckforTODOmarkers

模板文件

templates/proposal.md

# Proposal: {{change_name}}

## Problem
<!-- 描述要解決的問題 -->

## Testable Behaviors
<!-- WHEN/THEN 格式列出每一個可測試行為 -->

## Acceptance Criteria
<!-- 驗收標準 -->

templates/spec.md

# Spec: {{change_name}}

## Scenarios

### Scenario 1: [name]
GIVEN: [前置條件]
WHEN: [操作]
THEN: [期望結果]

<!-- Repeat for each scenario -->

templates/design.md

# Design: {{change_name}}

## File Structure
<!-- 列出要創建的文件,包括測試文件 -->

## Test Strategy
<!-- 每個 test 文件的測試策略 -->

## Implementation Notes
<!-- 實現要點 -->

templates/tasks.md

# Tasks: {{change_name}}

## Atomic TDD Task List

<!-- 每個 task 只能是一個 TDD 階段 -->
<!-- 必須使用 checkbox 格式 -->

### [AI fills feature name]

[ ] RED: ...
[ ] GREEN: ...
[ ] REFACTOR: ...

templates/plan.md

# Execution Plan: {{change_name}}

## Micro-tasks

### Step 1: RED — [description]
Test file: [path]
Assertion: [what to test]
Expected failure: [reason]
Verify: `npm test -- [test-file]`

### Step 2: GREEN — [description]
Pass test from: Step 1
Minimal code: [what to implement]
Verify: `npm test -- [test-file]`

<!-- Repeat for each task -->

項目配置 config.yaml

schema: tdd-driven-v2

context:|
  Tech stack: TypeScript, Node.js, Jest
  Testing framework: Jest
  Test runner: npm test
  Project: Pure function library — no framework, no database, no HTTP
  Core function signature: markdownToHtml(input: string): string
  All production code must have corresponding tests.

rules:
proposal:
    -ListeverytestablebehaviorinWHEN/THENformat
    -Donotdescribeimplementation
specs:
    -UseGIVEN/WHEN/THENformatforeveryscenario
    -Eachscenariomustbeindependentlytestable
design:
    -Mustspecifyexacttestfilepaths
    -Mustspecifyteststrategyperfile
tasks:
    -MUSTusecheckboxformat"- [ ]"foreverytask
    -EachtaskisexactlyONETDDphase(RED,GREEN,orREFACTOR)
    -TasksmustalternateREDGREEN(optionalREFACTOR)
    -GREENtasksmustreferencetheircorrespondingREDtask
plans:
    -Eachplanstepmapstoexactlyonetask
    -Mustspecifyverifycommandandexpectedevidence
配圖 3:Schema 四層防護映射圖
配圖 3:Schema 四層防護映射圖

圖 3:Schema 配置如何對應四層防護——左:Schema 工作流,右:四層防護映射

第四節:實戰驗證 - 用 Mini Markdown 轉換器跑一遍

Schema 寫好了,接下來用一個真實用例跑一遍驗證。

為什麼選 Mini Markdown 轉換器

三個原因:

  1. 零依賴:純 Node.js + Jest,不需要 Express/數據庫/HTTP
  2. 純函數markdownToHtml(input: string): string,輸入輸出完全確定
  3. 天然適合原子化 TDD:每個 Markdown 語法元素(heading/bold/italic/link)= 一個獨立的 RED-GREEN 循環

環境準備

# 0. 初始化 git(後續驗證需要 git log)
git init

# 1. 初始化項目
mkdir mini-markdown && cd mini-markdown
npm init -y
npm install --save-dev jest ts-jest @types/jest typescript

# 2. 初始化 OpenSpec(生成 openspec/changes/、openspec/specs/ 和工具適配目錄)
# 初學者建議用 --tools claude,只安裝 Claude Code 適配,避免生成 29 個不需要的工具目錄
openspec init --tools claude

# 3. 手動創建 Schema 目錄和配置文件
mkdir -p openspec/schemas/tdd-driven-v2/templates
# 將 schema.yaml 放到 openspec/schemas/tdd-driven-v2/
# 將 config.yaml 放到 openspec/(注意:在 openspec/ 根目錄下,不在 schemas/ 裏)
# 將模板文件放到 openspec/schemas/tdd-driven-v2/templates/

驗證步驟

步驟 1:驗證 Schema 語法

openspec schema validate tdd-driven-v2
# 注意:會先顯示 "Note: Schema commands are experimental and may change."
# 這是 CLI 的常規提示,不影響驗證結果

✅ 檢查:無報錯,YAML 語法通過

步驟 2:創建變更提案

# 在 Claude Code 中執行
/opsx:propose mini-markdown

執行後,AI 會依次調用 openspec instructions <artifact> --change mini-markdown --json 獲取 instruction 文本,按依賴順序生成:proposal → design + specs(並行)→ tasks → plans。

如果 config.yaml 的 context 字段寫得充分(如本項目的 TypeScript + Jest 純函數配置),整個 propose 過程不需要任何人工輸入。 AI 直接從 context 推斷需求,整個過程大約 2-3 分鐘。

重點檢查以下驗證點:

✅ proposal.md 包含 WHEN/THEN 格式的可測試行為(實測 15 條) ✅ specs 使用 GIVEN/WHEN/THEN(實測 16 個場景,含 edge cases) ✅ design.md 包含測試文件路徑和測試策略 ✅ tasks.md 每個 task 只有一個 TDD 階段(實測 26 個 task:13 RED + 13 GREEN) ← 核心驗證點 ✅ tasks.md 使用了 checkbox 格式 ← 核心驗證點 ⚠️ tasks.md 無 REFACTOR 任務——AI 認為 REFACTOR 是可選的,選擇了跳過 ✅ plans 指定了驗證命令和期望證據,末尾包含 "Execution Mode Selection" 指定 subagent-driven-development

如果 tasks.md 的產出類似下面這樣,說明第一層防護生效了:

### Headings
[ ] RED: Write failing test for heading parsing — create tests/markdown.test.ts, test that markdownToHtml("# Hello") returns "<h1>Hello</h1>"
[ ] GREEN: Implement heading parser — add regex in src/parser.ts to convert "^# (.+)" to "<h1>$1</h1>", export from src/index.ts

### Bold
[ ] RED: Write failing test for bold parsing — test that markdownToHtml("**bold**") returns "<strong>bold</strong>"
[ ] GREEN: Implement bold parser — minimal regex to convert "**text**" to "<strong>text</strong>"

❌ 如果產出是 - [ ] Implement heading and bold parser,說明原子化沒有生效。

步驟 3:確認 instruction 注入

openspec instructions tasks --change mini-markdown --json

✅ 檢查:輸出中包含原子化任務的 instruction 文本

步驟 4:執行變更

# 在 Claude Code 中執行
/opsx:apply mini-markdown

這一步是全文最關鍵的驗證環節。以下是 Mini Markdown 驗證的實測結果,不再是預期分析。

AI 執行了 openspec instructions apply --change "mini-markdown" --json 獲取 apply instruction,然後使用 Agent 工具 dispatch 了 27 次 subagent

  • 24 個實現 subagent(每個 task 一個)
  • 1 個 spec 審查 subagent
  • 2 個代碼質量審查 subagent

四層防護實測結果

✅ 第一層生效:tasks.md 的 26 個 task 每個只包含一個 TDD 階段(RED 或 GREEN)。任務的原子化粒度是物理約束,不依賴 AI 的自主決策。

✅ 第二層生效:AI dispatch 了 24 個實現 subagent,每個 task 確實由獨立 subagent 完成。instruction 中的 MANDATORY: Use superpowers:subagent-driven-development skill 被 AI 遵守了。subagent 之間 context 隔離,第一個 subagent 不知道第二個 subagent 要做什麼。

⚠️ 第三層部分生效:前 2 個 task(Task 1 RED + Task 2 GREEN)有完整的審查流程——spec reviewer 檢查交付物範圍,code quality reviewer 檢查代碼質量。但 AI 在驗證完前幾個 task 後,認為審查流程太耗時,跳過了後續 24 個 task 的審查。subagent 調用詳情:

Agent #1:  Implement Task 1 RED: heading test
Agent #2:  Review spec compliance Task 1 RED        ← spec reviewer
Agent #3:  Review code quality Task 1 RED            ← code quality reviewer
Agent #4:  Implement Task 2 GREEN: heading parser
Agent #5:  Review code quality Task 2 GREEN          ← code quality reviewer
Agent #6:  Implement Task 3 RED: bold test
Agent #7:  Implement Task 4 GREEN: bold parser
...(後續 task 只有實現 subagent,無審查)
Agent #27: Implement Task 26 GREEN: image parser

✅ 第四層生效:npm test 的執行歷史(15 次)清楚顯示了真實的 RED → GREEN 過渡:

#4  Tests: 2 failed, 11 passed — RED(bold test 失敗)
#5  Tests: 5 failed, 8 passed  — RED(多個新 test 失敗)
#14 Tests: 1 failed, 10 passed — 最後一個 RED
#15 Tests: 10 passed           — 最終 GREEN

這些失敗是真實發生的,不是 AI 編造的——它們來自 npm test 的真實輸出。

執行完成後檢查最終產物:

# 檢查 tasks.md 的 checkbox 是否被逐步勾選
cat openspec/changes/mini-markdown/tasks.md

# 檢查 git log 是否有交替的 test/feat 提交
git log --oneline

# 運行全量測試
npm test

✅ tasks.md 的 26 個 checkbox 全部被勾選 ⚠️ git log 無 RED-only 提交——RED 和 GREEN 在同一次提交中完成,且 commit message 格式不統一 ✅ npm test 通過(10/10 tests passed) ⚠️ 測試覆蓋率 10/15 行為(缺失 h2/h3 多級標題、horizontal rule、mixed inline formatting、code blocks) ⚠️ 源碼結構偏離 design.md 規劃(AI 選擇了單文件 src/markdown.ts 71 行,而非 design.md 的雙文件方案)

最終產物:src/markdown.ts(71 行)、tests/markdown.test.ts(43 行、10 個 test case),npm test 10/10 passed。

配圖 4:驗證執行時間線
配圖 4:驗證執行時間線

圖 4:Mini Markdown 驗證執行時間線——雙軌展示 27 次 subagent dispatch 和 15 次 npm test 的 RED→GREEN 過渡

如果驗證不通過

幾個常見的失敗場景和排查方向:

場景 1:AI 沒有使用 subagent 模式

如果 apply 階段直接 inline 執行而不是 dispatch subagent,說明 instruction 裏的 MANDATORY 被忽略了。排查方向:檢查 Superpowers 的 subagent-driven-development skill 是否正確安裝。如果 skill 不存在,instruction 就是一紙空文。

場景 2:RED 任務裏同時寫了實現

如果 spec reviewer 沒有抓住這個問題,說明審查層失效。排查方向:檢查 spec reviewer 的 prompt 是否明確要求 只檢查任務規格內的交付物

場景 3:測試輸出不真實

如果 subagent 報告的測試輸出是編造的(比如報了 pass 但實際沒運行),目前沒有代碼層面的防偽機制。這是第四層的已知侷限,第五節會詳細討論。

第五節:誠實評估

四層防護模型聽起來很完善,但必須坦誠:它不能 100% 保證 TDD 執行。以下用 Mini Markdown 的實測數據,逐一說明每層的實際效果和已知侷限。

每層的實測效果

第一層(原子化任務):實測有效。當 tasks.md 的每個 task 只有一個 TDD 階段時,即使 AI 想一步完成,task 的描述本身就限制了它的操作範圍。實測中 tasks.md 生成了 26 個原子 task(13 RED + 13 GREEN),AI 沒有合併任何任務。這是四層裏最可靠的一層——任務粒度是物理約束,不依賴 AI 的自主決策。

第二層(subagent 隔離):實測有效。Mini Markdown 驗證中,AI dispatch 了 24 個實現 subagent,每個 task 確實由獨立 subagent 完成。instruction 中的 MANDATORY: Use superpowers:subagent-driven-development skill 被 AI 遵守了。subagent 之間 context 隔離,第一個 subagent 不知道第二個 subagent 要做什麼。

注意:有效不代表 100% 可靠。其他項目、其他 AI 模型、其他 instruction 上下文中,AI 仍然可能選擇忽略 MANDATORY 選擇 inline 執行。但在本驗證場景中,第二層確實生效了。

第三層(兩階段審查):實測部分有效。前 2 個 task(Task 1 RED + Task 2 GREEN)有完整的審查流程——spec reviewer 檢查交付物範圍,code quality reviewer 檢查代碼質量。但 AI 在驗證完前幾個 task 後,認為審查流程太耗時,跳過了後續 24 個 task 的審查。

這個結果揭示了一個微妙的問題:審查機制存在且能正確工作(前 2 個 task 的審查是真實的),但 AI 有自主跳過審查的裁量權。instruction 裏沒有說"每個 task 都必須審查",AI 合理地認為前幾個驗證過了就夠了。

改進方向:在 apply.instruction 中明確寫 "Review EVERY task, not just the first few"。但這也只是 prompt 級別的約束——AI 仍然可以選擇忽略。

第四層(驗證證據):實測有效。npm test 的執行歷史(15 次)清楚顯示了 RED → GREEN 的過渡:

  • 第 4 次運行:2 failed, 11 passed(bold test 失敗)
  • 第 5 次運行:5 failed, 8 passed(多個新 test 失敗)
  • 第 14 次運行:1 failed, 10 passed(最後一個 RED)
  • 第 15 次運行:10 passed(最終全部通過)

這些失敗是真實發生的,不是 AI 編造的——它們來自 npm test 的真實輸出。第四層提供了可靠的 TDD 順序證據。

但有一個已知侷限:git log 中沒有 RED-only 提交。AI 在 RED 階段寫了測試但沒有單獨提交,而是和 GREEN 一起提交。這意味着從 git 歷史看不到"先寫測試、測試失敗、再寫實現"的交替模式。測試覆蓋率也只有 10/15 行為。

實測中發現的問題

  • 審查覆蓋不完整:AI 跳過了 24/26 個 task 的審查(第三層)
  • 測試覆蓋率不足:10/15 行為有測試,缺失 5 個可測試行為(h2/h3、horizontal rule、mixed inline、code blocks)
  • 架構決策偏離:AI 自行從雙文件方案調整為單文件方案,沒有打回
  • git log 無 RED-only 提交:無法從版本歷史看到 TDD 交替模式
  • REFACTOR 被跳過:AI 將 REFACTOR 視為"可選"而跳過,26 個 task 全是 RED + GREEN

說到底,這些問題是第三層審查被跳過的直接後果。如果有 spec reviewer 檢查 Task 3-26,AI 自行調整文件結構(從雙文件變單文件)和跳過 5 個行為的測試覆蓋應該被打回。

如果需要更高保證

如果對 TDD 執行紀律有硬性要求(比如團隊規範或合規需要),可以在四層防護之外加兩道硬約束:

  • pre-commit hook:檢查測試覆蓋率,拒絕覆蓋率低於閾值的提交
  • CI pipeline:拒絕沒有對應測試變更的 feature 提交

這兩道約束是代碼層面的,不依賴 AI 的自主決策,可靠性遠高於 prompt 級別的防護。

與 v1 的對比

維度
v1(失敗)
v2(設計)
v2(實測)
任務粒度
一個 task = 完整功能
一個 task = 一個原子 TDD 階段
✅ 生效,26 個原子 task
執行路徑
AI 自選(選了 inline)
強制 subagent-driven-development
✅ 生效,24 個 subagent
進度追蹤
無 checkbox,tracks 解析失敗
強制 checkbox 格式,tracks 可追蹤
✅ 生效,tracks 正確解析
審查機制
spec + quality reviewer
⚠️ 部分生效,僅前 2/26 task
驗證證據
subagent 報告測試輸出
✅ 生效,RED 失敗證據真實

v1 在 propose 階段的文檔規範化是有效的——WHEN/THEN、GIVEN/WHEN/THEN 這些格式約束確實讓產物更規範。但 apply 階段的執行紀律完全失敗。v2 通過原子化任務 + subagent 隔離 + 兩階段審查 + 驗證證據,在 apply 階段實現了可預期的 TDD 執行。

四層防護模型的實測結果:三層有效,一層部分有效。第一層(原子化任務)和第二層(subagent 隔離)是最可靠的——任務粒度是物理約束,subagent 隔離是工具機制保證。第三層(審查)機制本身正確,但 AI 選擇了加速執行跳過審查,暴露了 prompt 級約束的天花板。第四層(驗證證據)提供了真實的 RED 失敗記錄,是最硬的客觀證據。

核心洞察不變:縮小 AI 的合理操作空間讓 AI 變得更聽話更可靠。當每個任務只允許做一件事,subagent 之間互相看不見,做完還有人審查——即使審查被跳過了,前兩層已經把 AI 的操作空間壓縮到了原子級別。

當然,這個判斷需要更多場景驗證。如果你也試了這個 Schema,歡迎把驗證結果反饋給我——成功了值得記錄,失敗了更有分析價值。

配圖 5:實測對比評估圖
配圖 5:實測對比評估圖

圖 5:v1/v2 設計/v2 實測三方對比評估——5 個維度的演進與實測效果

好啦,謝謝你觀看我的文章,如果喜歡可以點贊轉發給需要的朋友,我們下一期再見!敬請期待!

掃碼關注,獲取更多 AI 工具的實戰經驗和最佳實踐。不錯過每一篇乾貨!

圖片